from datetime import datetime from typing import Optional from dataclasses import dataclass, field from .Attribute import Attribute @dataclass class dateAttribute(Attribute): """Class for date attributes.""" min_val: Optional[str] = None max_val: Optional[str] = None def __post_init__(self): """Post-initialization to set the HTML input type.""" self.html_input_type = "date" def _is_date(self, value: str) -> bool: """Check if a value is a valid date in YYYY-MM-DD format.""" try: datetime.strptime(value, "%Y-%m-%d") return True except ValueError: return False def validate(self) -> Optional[str]: """Validate date-specific attributes.""" error = super().validate() if error: return error if self.min_val is not None and not self._is_date(self.min_val): return f"min_val must be a valid date (YYYY-MM-DD) for attribute '{self.attrib_name}'." if self.max_val is not None and not self._is_date(self.max_val): return f"max_val must be a valid date (YYYY-MM-DD) for attribute '{self.attrib_name}'." if self.min_val is not None and self.max_val is not None: min_date = datetime.strptime(self.min_val, "%Y-%m-%d") max_date = datetime.strptime(self.max_val, "%Y-%m-%d") if max_date < min_date: return f"max_val cannot be earlier than min_val for attribute '{self.attrib_name}'." if self.default_val is not None and not self._is_date(self.default_val): return f"default_val must be a valid date (YYYY-MM-DD) for attribute '{self.attrib_name}'." if self.default_val is not None: default_date = datetime.strptime(self.default_val, "%Y-%m-%d") if self.min_val is not None: min_date = datetime.strptime(self.min_val, "%Y-%m-%d") if default_date < min_date: return f"default_val cannot be earlier than min_val for attribute '{self.attrib_name}'." if self.max_val is not None: max_date = datetime.strptime(self.max_val, "%Y-%m-%d") if default_date > max_date: return f"default_val cannot be later than max_val for attribute '{self.attrib_name}'." return None