diff --git a/hyperglass/models/directive.py b/hyperglass/models/directive.py index 058eaae..c88c2c1 100644 --- a/hyperglass/models/directive.py +++ b/hyperglass/models/directive.py @@ -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 diff --git a/hyperglass/models/ui.py b/hyperglass/models/ui.py index 3e2c106..f8a304c 100644 --- a/hyperglass/models/ui.py +++ b/hyperglass/models/ui.py @@ -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 diff --git a/hyperglass/ui/components/looking-glass-form.tsx b/hyperglass/ui/components/looking-glass-form.tsx index 664f8a8..334795a 100644 --- a/hyperglass/ui/components/looking-glass-form.tsx +++ b/hyperglass/ui/components/looking-glass-form.tsx @@ -79,7 +79,14 @@ export const LookingGlassForm = (): JSX.Element => { ); const directive = useMemo( - () => 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 => { - + {directive !== null && (