Refactored pydantic implementation, cleaner with nested validation
This commit is contained in:
@@ -4,9 +4,15 @@ import urllib3
|
||||
urllib3.disable_warnings(category=urllib3.exceptions.InsecureRequestWarning)
|
||||
import xmltodict
|
||||
from requests.auth import HTTPBasicAuth
|
||||
from datetime import datetime
|
||||
from os import getcwd
|
||||
import json
|
||||
|
||||
from typing import Dict, List, Any
|
||||
from commands import SMSMessage
|
||||
|
||||
from typing import Dict, List, Any, Type, TypeVar
|
||||
T = TypeVar("T", bound=SMSMessage)
|
||||
|
||||
TEST = True
|
||||
|
||||
class ProjectorConnection():
|
||||
ip: str
|
||||
@@ -33,13 +39,24 @@ class ProjectorConnection():
|
||||
timeout=4,
|
||||
verify=False
|
||||
)
|
||||
response.raise_for_status()
|
||||
if response.status_code == 200: # HTTP ok response
|
||||
rv: dict = {}
|
||||
content: dict = xmltodict.parse(response.text)["SMSMessage"] # Common containert for all messages
|
||||
header: dict = content["MessageHeader"]
|
||||
body: dict = content["MessageBody"]
|
||||
rv['type'] = header.get("Type", None)
|
||||
rv['timestamp'] = int(header.get("Timestamp", datetime.now()))
|
||||
rv['body'] = body[rv["type"]]
|
||||
return rv
|
||||
return xmltodict.parse(response.text.replace("%2F", "/").replace("%3A", ":")) # Common containert for all messages
|
||||
return None
|
||||
|
||||
def request(self, cls: Type[T]) -> T | None:
|
||||
rv: dict | None
|
||||
if TEST:
|
||||
with open(f'{getcwd()}/projmon/xmlresponses/showstatus.xml', 'r') as fd:
|
||||
rv = xmltodict.parse(fd.read().replace("%2F", "/").replace("%3A", ":"))
|
||||
else:
|
||||
rv = self.get(cls.path, cls.params)
|
||||
if isinstance(rv, dict):
|
||||
rv = rv['SMSMessage']
|
||||
type: str = rv['MessageHeader']['Type']
|
||||
rv.update(**rv['MessageBody'][type])
|
||||
del rv['MessageBody']
|
||||
del rv['@xmlns']
|
||||
print(json.dumps(rv, indent = 2))
|
||||
return cls.model_validate(rv)
|
||||
return None
|
||||
|
||||
Reference in New Issue
Block a user