Added valid_comparisons field for Attribute classes

This commit is contained in:
Candifloss 2025-03-13 11:14:22 +05:30
parent 71a3d957b1
commit 2e0e02bf40
2 changed files with 9 additions and 12 deletions

View File

@ -1,6 +1,6 @@
from datetime import datetime from datetime import datetime
import re import re
from typing import List, Optional, Tuple from typing import List, Optional, Tuple, Set
from dataclasses import dataclass, field from dataclasses import dataclass, field
ALLOWED_INPUT_TYPES = {"text", "number", "date", "select"} ALLOWED_INPUT_TYPES = {"text", "number", "date", "select"}
@ -16,6 +16,7 @@ class Attribute:
primary: bool = False primary: bool = False
default_val: Optional[str] = None default_val: Optional[str] = None
compareto: Optional[List[Tuple[str, str]]] = None compareto: Optional[List[Tuple[str, str]]] = None
valid_comparisons: Optional[Set[str]] = None
def validate(self) -> Optional[str]: def validate(self) -> Optional[str]:
"""Validate common attributes. Returns an error message if invalid, otherwise None.""" """Validate common attributes. Returns an error message if invalid, otherwise None."""
@ -40,6 +41,7 @@ class textAttribute(Attribute):
def __post_init__(self): def __post_init__(self):
"""Post-initialization to set the HTML input type.""" """Post-initialization to set the HTML input type."""
self.html_input_type = "text" self.html_input_type = "text"
self.valid_comparisons = {"lt", "st", "eq", "ne"}, # longer than, shorter than, eq, or not eq, to the ref attrib
def validate(self) -> Optional[str]: def validate(self) -> Optional[str]:
"""Validate text-specific attributes.""" """Validate text-specific attributes."""
@ -78,6 +80,7 @@ class intAttribute(Attribute):
def __post_init__(self): def __post_init__(self):
"""Post-initialization to set the HTML input type.""" """Post-initialization to set the HTML input type."""
self.html_input_type = "number" self.html_input_type = "number"
self.valid_comparisons = {"lt", "gt", "le", "ge", "eq", "ne"}, # <, >, <=, >=, ==, !=
def validate(self) -> Optional[str]: def validate(self) -> Optional[str]:
"""Validate integer-specific attributes.""" """Validate integer-specific attributes."""
@ -118,6 +121,7 @@ class floatAttribute(Attribute):
def __post_init__(self): def __post_init__(self):
"""Post-initialization to set the HTML input type.""" """Post-initialization to set the HTML input type."""
self.html_input_type = "number" self.html_input_type = "number"
self.valid_comparisons = {"lt", "gt", "le", "ge", "eq", "ne"}, # <, >, <=, >=, ==, !=
def validate(self) -> Optional[str]: def validate(self) -> Optional[str]:
"""Validate float-specific attributes.""" """Validate float-specific attributes."""
@ -157,6 +161,7 @@ class dateAttribute(Attribute):
def __post_init__(self): def __post_init__(self):
"""Post-initialization to set the HTML input type.""" """Post-initialization to set the HTML input type."""
self.html_input_type = "date" self.html_input_type = "date"
self.valid_comparisons = {"lt", "gt", "le", "ge", "eq", "ne"}, # <, >, <=, >=, ==, !=
def _is_date(self, value: str) -> bool: def _is_date(self, value: str) -> bool:
"""Check if a value is a valid date in YYYY-MM-DD format.""" """Check if a value is a valid date in YYYY-MM-DD format."""
@ -202,6 +207,7 @@ class selectAttribute(Attribute):
def __post_init__(self): def __post_init__(self):
"""Post-initialization to set the HTML input type.""" """Post-initialization to set the HTML input type."""
self.html_input_type = "select" self.html_input_type = "select"
self.valid_comparisons = {"eq", "ne"} # eq, or not eq, to the ref attrib
def validate(self) -> Optional[str]: def validate(self) -> Optional[str]:
"""Validate select-specific attributes.""" """Validate select-specific attributes."""

View File

@ -1,15 +1,6 @@
from typing import List from typing import List
from definitions.attribute import Attribute from definitions.attribute import Attribute
#VALID_OPERATORS = {"lt", "gt", "le", "ge", "eq", "ne"} # <, >, <=, >=, ==, !=
VALID_COMPARISONS = {
"number": {"lt", "gt", "le", "ge", "eq", "ne"}, # <, >, <=, >=, ==, !=
"text": {"lt", "st", "eq", "ne"}, # longer than, shorter than, eq, or not eq, to the ref attrib
"date": {"lt", "gt", "le", "ge", "eq", "ne"}, # <, >, <=, >=, ==, !=
"select": {"eq", "ne"} # eq, or not eq, to the ref attrib
}
def validate_config(item_attributes: List[Attribute]) -> str: def validate_config(item_attributes: List[Attribute]) -> str:
""" """
Validate the configuration file to ensure all attributes are properly defined. Validate the configuration file to ensure all attributes are properly defined.
@ -38,8 +29,8 @@ def validate_config(item_attributes: List[Attribute]) -> str:
): ):
return f"Invalid comparison format for attribute '{attrib.attrib_name}'. Expected a list of tuples." return f"Invalid comparison format for attribute '{attrib.attrib_name}'. Expected a list of tuples."
for cmp, ref_attr in attrib.compareto: for cmp, ref_attr in attrib.compareto:
if cmp not in VALID_COMPARISONS[attrib.html_input_type]: if cmp not in attrib.valid_comparisons:
return f"Invalid comparison '{cmp}' for attribute '{attrib.attrib_name}'. Allowed operators are: {VALID_COMPARISONS[attrib.html_input_type]}" return f"Invalid comparison '{cmp}' for attribute '{attrib.attrib_name}'. Allowed operators are: {attrib.valid_comparisons}"
if ref_attr not in attrib_name_set: if ref_attr not in attrib_name_set:
return f"Invalid reference attribute '{ref_attr}' for comparison in attribute '{attrib.attrib_name}'." return f"Invalid reference attribute '{ref_attr}' for comparison in attribute '{attrib.attrib_name}'."
if ref_attr.html_input_type != attrib.html_input_type: if ref_attr.html_input_type != attrib.html_input_type: