@@ -14,6 +14,7 @@ def get_attribute_parameters_class_for_kind(kind: str) -> type[AttributeParamete
1414 "NumberPool" : NumberPoolParameters ,
1515 "Text" : TextAttributeParameters ,
1616 "TextArea" : TextAttributeParameters ,
17+ "Number" : NumberAttributeParameters ,
1718 }
1819 return param_classes .get (kind , AttributeParameters )
1920
@@ -23,6 +24,88 @@ class Config:
2324 extra = "forbid"
2425
2526
27+ class TextAttributeParameters (AttributeParameters ):
28+ regex : str | None = Field (
29+ default = None ,
30+ description = "Regular expression that attribute value must match if defined" ,
31+ json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
32+ )
33+ min_length : int | None = Field (
34+ default = None ,
35+ description = "Set a minimum number of characters allowed." ,
36+ json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
37+ )
38+ max_length : int | None = Field (
39+ default = None ,
40+ description = "Set a maximum number of characters allowed." ,
41+ json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
42+ )
43+
44+
45+ class NumberAttributeParameters (AttributeParameters ):
46+ min_value : int | None = Field (
47+ default = None ,
48+ description = "Set a minimum value allowed." ,
49+ json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
50+ )
51+ max_value : int | None = Field (
52+ default = None ,
53+ description = "Set a maximum value allowed." ,
54+ json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
55+ )
56+ excluded_values : str | None = Field (
57+ default = None ,
58+ description = "List of values or range of values not allowed for the attribute, format is: '100,150-200,280,300-400'" ,
59+ pattern = r"^(\d+(?:-\d+)?)(?:,\d+(?:-\d+)?)*$" ,
60+ json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
61+ )
62+
63+ @model_validator (mode = "after" )
64+ def validate_ranges (self ) -> Self :
65+ ranges = self .get_excluded_ranges ()
66+ for i , (start_range_1 , end_range_1 ) in enumerate (ranges ):
67+ if start_range_1 > end_range_1 :
68+ raise ValueError ("`start_range` can't be less than `end_range`" )
69+
70+ # Check for overlapping ranges
71+ for start_range_2 , end_range_2 in ranges [i + 1 :]:
72+ if not (end_range_1 < start_range_2 or start_range_1 > end_range_2 ):
73+ raise ValueError ("Excluded ranges cannot overlap" )
74+
75+ return self
76+
77+ def get_excluded_single_values (self ) -> list [int ]:
78+ if not self .excluded_values :
79+ return []
80+
81+ results = [int (value ) for value in self .excluded_values .split ("," ) if "-" not in value ]
82+ return results
83+
84+ def get_excluded_ranges (self ) -> list [tuple [int , int ]]:
85+ if not self .excluded_values :
86+ return []
87+
88+ ranges = []
89+ for value in self .excluded_values .split ("," ):
90+ if "-" in value :
91+ start , end = map (int , value .split ("-" ))
92+ ranges .append ((start , end ))
93+
94+ return ranges
95+
96+ def is_valid_value (self , value : int ) -> bool :
97+ if self .min_value is not None and value < self .min_value :
98+ return False
99+ if self .max_value is not None and value > self .max_value :
100+ return False
101+ if value in self .get_excluded_single_values ():
102+ return False
103+ for start , end in self .get_excluded_ranges ():
104+ if start <= value <= end :
105+ return False
106+ return True
107+
108+
26109class NumberPoolParameters (AttributeParameters ):
27110 end_range : int = Field (
28111 default = sys .maxsize ,
@@ -43,23 +126,5 @@ class NumberPoolParameters(AttributeParameters):
43126 @model_validator (mode = "after" )
44127 def validate_ranges (self ) -> Self :
45128 if self .start_range > self .end_range :
46- raise ValueError ("start_range can't be less than end_range" )
129+ raise ValueError ("` start_range` can't be less than ` end_range` " )
47130 return self
48-
49-
50- class TextAttributeParameters (AttributeParameters ):
51- regex : str | None = Field (
52- default = None ,
53- description = "Regular expression that attribute value must match if defined" ,
54- json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
55- )
56- min_length : int | None = Field (
57- default = None ,
58- description = "Set a minimum number of characters allowed." ,
59- json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
60- )
61- max_length : int | None = Field (
62- default = None ,
63- description = "Set a maximum number of characters allowed." ,
64- json_schema_extra = {"update" : UpdateSupport .VALIDATE_CONSTRAINT .value },
65- )
0 commit comments