@@ -383,6 +383,40 @@ async def update_marktlokation(
383
383
result = Marktlokation .model_validate (response_json )
384
384
return result
385
385
386
+ async def update_zaehler (
387
+ self ,
388
+ zaehler_id : uuid .UUID ,
389
+ changes : list [Callable [[Zaehler ], None ]] | JsonPatch ,
390
+ keydate : AwareDatetime | None = None ,
391
+ ) -> Zaehler :
392
+ """
393
+ patch the given zaehler using the changes
394
+ """
395
+ session = await self ._get_session ()
396
+ zaehler = await self .get_zaehler (zaehler_id , keydate )
397
+ if zaehler is None :
398
+ raise ValueError (f"Zaehler with id '{ zaehler_id } ' not found" )
399
+ patch_document : jsonpatch .JsonPatch
400
+ if isinstance (changes , list ) and len (changes ) > 0 and not isinstance (changes [0 ], dict ):
401
+ # we assume that "not isinstance(changes[0], dict)" == isinstance(changes[0], Callable)
402
+ patch_document = build_json_patch_document (zaehler , changes ) # type:ignore[arg-type]
403
+ else :
404
+ # assume it's the patch itself
405
+ patch_document = jsonpatch .JsonPatch (changes )
406
+ request_url = self ._config .server_url / "api" / "v2" / "Zaehler" / str (zaehler_id )
407
+ if keydate is not None : # if it's None it defaults to now(UTC) on serverside anyway
408
+ request_url = request_url % {"aenderungsDatum" : keydate .isoformat ()}
409
+ request_uuid = uuid .uuid4 ()
410
+ _logger .debug ("[%s] patching %s with body %s" , str (request_uuid ), request_url , str (patch_document ))
411
+ async with session .patch (
412
+ request_url , json = patch_document .patch , headers = {"Content-Type" : "application/json-patch+json" }
413
+ ) as response :
414
+ response .raise_for_status ()
415
+ _logger .debug ("[%s] response status: %s" , str (request_uuid ), response .status )
416
+ response_json = await response .json ()
417
+ result = Zaehler .model_validate (response_json )
418
+ return result
419
+
386
420
async def get_messlokation (self , messlokation_id : str ) -> Messlokation | None :
387
421
"""
388
422
provide a Messlokation-ID, get the matching MeLo in return (or None, if 404)
@@ -402,12 +436,14 @@ async def get_messlokation(self, messlokation_id: str) -> Messlokation | None:
402
436
result = Messlokation .model_validate (response_json )
403
437
return result
404
438
405
- async def get_zaehler (self , zaehler_id : uuid .UUID ) -> Zaehler | None :
439
+ async def get_zaehler (self , zaehler_id : uuid .UUID , keydate : AwareDatetime | None = None ) -> Zaehler | None :
406
440
"""
407
441
provide a Zaehler-ID, get the matching Zaehler in return (or None, if 404)
408
442
"""
409
443
session = await self ._get_session ()
410
444
request_url = self ._config .server_url / "api" / "Zaehler" / str (zaehler_id )
445
+ if keydate is not None :
446
+ request_url = request_url / keydate .isoformat ()
411
447
request_uuid = uuid .uuid4 ()
412
448
_logger .debug ("[%s] requesting %s" , str (request_uuid ), request_url )
413
449
async with session .get (request_url ) as response :
0 commit comments