1111from datetime import datetime
1212from typing import Dict , List , Optional , Sequence , Union
1313
14- from pydantic import root_validator
14+ from pydantic import model_validator
1515from pydicom import Dataset
1616from requests import Response
1717
@@ -39,11 +39,11 @@ class QidoRSQueryBase(Query):
3939 limit : int = 0 # How many results to return. 0 = all
4040 offset : int = 0 # Number of skipped results
4141
42- @root_validator () # type: ignore
43- def min_max_study_date_xor (cls , values ): # noqa: B902, N805
42+ @model_validator ( mode = "after" )
43+ def min_max_study_date_xor (self ): # noqa: B902, N805
4444 """Min and max should both be given or both be empty"""
45- min_date = values . get ( " min_study_date" )
46- max_date = values . get ( " max_study_date" )
45+ min_date = self . min_study_date
46+ max_date = self . max_study_date
4747 if min_date and not max_date :
4848 raise ValueError (
4949 f"min_study_date parameter was passed"
@@ -55,7 +55,7 @@ def min_max_study_date_xor(cls, values): # noqa: B902, N805
5555 f"max_study_date parameter was passed ({ max_date } ), "
5656 f"but min_study_date was not. Both need to be given"
5757 )
58- return values
58+ return self
5959
6060 @staticmethod
6161 def date_to_str (date_in : Optional [datetime ]) -> str :
@@ -158,8 +158,8 @@ class HierarchicalQuery(QidoRSQueryBase):
158158 Faster than relationalQuery, but requires more information
159159 """
160160
161- @root_validator () # type: ignore
162- def uids_should_be_hierarchical (cls , values ): # noqa: B902, N805
161+ @model_validator ( mode = "after" )
162+ def uids_should_be_hierarchical (self ):
163163 """Any object uids passed should conform to study->series->instance"""
164164 order = ["StudyInstanceUID" , "SeriesInstanceUID" , "SOPInstanceUID" ]
165165
@@ -182,14 +182,13 @@ def assert_parents_filled(a_hierarchy, value_dict):
182182 else :
183183 return assert_parents_filled (a_hierarchy , value_dict )
184184
185- assert_parents_filled (order , values )
185+ assert_parents_filled (order , self .dict ())
186+ return self
186187
187- return values
188-
189- @root_validator () # type: ignore
190- def uids_should_match_query_level (cls , values ): # noqa: B902, N805
188+ @model_validator (mode = "after" )
189+ def uids_should_match_query_level (self ):
191190 """If a query is for instance level, there should be study and series UIDs"""
192- query_level = values [ " query_level" ]
191+ query_level = self . query_level
193192
194193 def assert_key_exists (values_in , query_level_in , missing_key_in ):
195194 if not values_in .get (missing_key_in ):
@@ -199,6 +198,7 @@ def assert_key_exists(values_in, query_level_in, missing_key_in):
199198 f"a QIDO-RS relational query"
200199 )
201200
201+ values = self .dict ()
202202 if query_level == QueryLevels .STUDY :
203203 pass # Fine. you can always look for some studies
204204 elif query_level == QueryLevels .SERIES :
@@ -207,7 +207,7 @@ def assert_key_exists(values_in, query_level_in, missing_key_in):
207207 assert_key_exists (values , query_level , "SeriesInstanceUID" )
208208 assert_key_exists (values , query_level , "StudyInstanceUID" )
209209
210- return values
210+ return self
211211
212212 def uri_base (self ) -> str :
213213 """WADO-RS url to call when performing this query. Full URI also needs
@@ -294,17 +294,15 @@ class RelationalQuery(QidoRSQueryBase):
294294 Allows broader searches than HierarchicalQuery, but can be slower
295295 """
296296
297- @root_validator () # type: ignore
298- def query_level_should_be_series_or_instance (
299- cls , values # noqa: B902, N805
300- ):
297+ @model_validator (mode = "after" )
298+ def query_level_should_be_series_or_instance (self ):
301299 """A relational query only makes sense for the instance and series levels.
302300 If you want to look for studies, us a hierarchical query
303301 """
304- if values . get ( " query_level" ) == QueryLevels .STUDY :
302+ if self . query_level == QueryLevels .STUDY :
305303 raise ValueError (STUDY_VALUE_ERROR_TEXT )
306304
307- return values
305+ return self
308306
309307 def uri_base (self ) -> str :
310308 """WADO-RS url to call when performing this query. Full URI also needs
0 commit comments