sp-hydra-veil-core/core/models/Configuration.py
2024-09-11 19:39:33 +02:00

77 lines
2.4 KiB
Python

from core.Constants import Constants
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, config
from datetime import datetime
from json import JSONDecodeError
from marshmallow import fields
from typing import Optional
from zoneinfo import ZoneInfo
import dataclasses_json
import json
import os
@dataclass_json
@dataclass
class Configuration:
connection: Optional[str] = field(
default=None,
metadata=config(
undefined=dataclasses_json.Undefined.EXCLUDE,
exclude=lambda value: value is None
)
)
auto_sync_enabled: Optional[bool] = field(
default=None,
metadata=config(
undefined=dataclasses_json.Undefined.EXCLUDE,
exclude=lambda value: value is None
)
)
last_synced_at: Optional[datetime] = field(
default=None,
metadata=config(
encoder=lambda datetime_instance: Configuration._iso_format(datetime_instance),
decoder=lambda datetime_string: Configuration._from_iso_format(datetime_string),
mm_field=fields.DateTime(format='iso'),
undefined=dataclasses_json.Undefined.EXCLUDE,
exclude=lambda value: value is None
)
)
@staticmethod
def get():
try:
config_file_contents = open(Constants.SP_CONFIG_HOME + '/config.json', 'r').read()
except FileNotFoundError:
return None
try:
configuration = json.loads(config_file_contents)
except JSONDecodeError:
exit(1)
# noinspection PyUnresolvedReferences
configuration = Configuration.from_dict(configuration)
return configuration
@staticmethod
def save(configuration):
config_file_contents = configuration.to_json(indent=4) + '\n'
os.makedirs(Constants.SP_CONFIG_HOME, exist_ok=True)
text_io_wrapper = open(Constants.SP_CONFIG_HOME + '/config.json', 'w')
text_io_wrapper.write(config_file_contents)
@staticmethod
def _iso_format(datetime_instance: datetime):
datetime_instance = datetime_instance.replace(tzinfo=ZoneInfo('UTC'))
return datetime.isoformat(datetime_instance).replace('+00:00', 'Z')
@staticmethod
def _from_iso_format(datetime_string: str):
date_string = datetime_string.replace('Z', '+00:00')
return datetime.fromisoformat(date_string)