1
0
Fork 1
mirror of https://github.com/thatmattlove/hyperglass.git synced 2026-01-17 00:38:06 +00:00

Fix bug: Directives will be error on deserialize rules and field with None type

This commit is contained in:
Chumy 2024-10-28 07:55:57 +08:00 committed by Jason Hall
parent c68b00423a
commit 8f690adb5c
3 changed files with 26 additions and 17 deletions

View file

@ -19,7 +19,7 @@ from .main import MultiModel, HyperglassModel, HyperglassUniqueModel
from .fields import Action
StringOrArray = t.Union[str, t.List[str]]
Condition = t.Union[IPvAnyNetwork, str]
Condition = t.Union[str, None]
RuleValidation = t.Union[t.Literal["ipv4", "ipv6", "pattern"], None]
PassedValidation = t.Union[bool, None]
IPFamily = t.Literal["ipv4", "ipv6"]
@ -264,7 +264,7 @@ class Directive(HyperglassUniqueModel, unique_by=("id", "table_output")):
id: str
name: str
rules: t.List[RuleType] = [RuleWithoutValidation()]
field: t.Union[Text, Select]
field: t.Union[Text, Select, None]
info: t.Optional[FilePath] = None
plugins: t.List[str] = []
table_output: t.Optional[str] = None
@ -282,15 +282,16 @@ class Directive(HyperglassUniqueModel, unique_by=("id", "table_output")):
condition = rule.get("condition")
if condition is None:
out_rules.append(RuleWithoutValidation(**rule))
try:
condition_net = ip_network(condition)
if condition_net.version == 4:
out_rules.append(RuleWithIPv4(**rule))
if condition_net.version == 6:
out_rules.append(RuleWithIPv6(**rule))
except ValueError:
out_rules.append(RuleWithPattern(**rule))
if isinstance(rule, Rule):
else:
try:
condition_net = ip_network(condition)
if condition_net.version == 4:
out_rules.append(RuleWithIPv4(**rule))
if condition_net.version == 6:
out_rules.append(RuleWithIPv6(**rule))
except ValueError:
out_rules.append(RuleWithPattern(**rule))
elif isinstance(rule, Rule):
out_rules.append(rule)
return out_rules
@ -306,7 +307,8 @@ class Directive(HyperglassUniqueModel, unique_by=("id", "table_output")):
@property
def field_type(self) -> t.Literal["text", "select", None]:
"""Get the linked field type."""
if self.field is None:
return None
if self.field.is_select:
return "select"
if self.field.is_text or self.field.is_ip:
@ -337,7 +339,7 @@ class Directive(HyperglassUniqueModel, unique_by=("id", "table_output")):
"name": self.name,
"field_type": self.field_type,
"groups": self.groups,
"description": self.field.description,
"description": self.field.description if self.field is not None else '',
"info": None,
}
@ -345,7 +347,7 @@ class Directive(HyperglassUniqueModel, unique_by=("id", "table_output")):
with self.info.open() as md:
value["info"] = md.read()
if self.field.is_select:
if self.field is not None and self.field.is_select:
value["options"] = [o.export_dict() for o in self.field.options if o is not None]
return value

View file

@ -19,7 +19,7 @@ class UIDirective(HyperglassModel):
id: str
name: str
field_type: str
field_type: t.Union[str, None]
groups: t.List[str]
description: str
info: t.Optional[str] = None

View file

@ -79,7 +79,14 @@ export const LookingGlassForm = (): JSX.Element => {
);
const directive = useMemo<Directive | null>(
() => getDirective(),
() => {
const tmp = getDirective();
if (tmp !== null && tmp.fieldType === null) {
setFormValue('queryTarget', ['null']);
setValue('queryTarget', ['null']);
}
return tmp;
},
[form.queryType, form.queryLocation, getDirective],
);
@ -200,7 +207,7 @@ export const LookingGlassForm = (): JSX.Element => {
<QueryType onChange={handleChange} label={web.text.queryType} />
</FormField>
</SlideFade>
<SlideFade offsetX={100} in={directive !== null} unmountOnExit>
<SlideFade offsetX={100} in={directive !== null && directive.fieldType !== null} unmountOnExit>
{directive !== null && (
<FormField name="queryTarget" label={web.text.queryTarget}>
<QueryTarget