From ef140fe11d379a2fa39d6b21b45fc39593f2d119 Mon Sep 17 00:00:00 2001 From: codeking Date: Sat, 22 Feb 2025 22:28:16 +0100 Subject: [PATCH] Improve client version-related logic --- core/Errors.py | 4 ++++ core/controllers/ClientController.py | 23 ++++++++++++++++++++- core/controllers/ClientVersionController.py | 10 +++++++++ core/models/ClientVersion.py | 3 ++- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/core/Errors.py b/core/Errors.py index 2d46fab..d9ea9e7 100644 --- a/core/Errors.py +++ b/core/Errors.py @@ -1,3 +1,7 @@ +class UnknownClientVersionError(Exception): + pass + + class UnknownConnectionTypeError(Exception): pass diff --git a/core/controllers/ClientController.py b/core/controllers/ClientController.py index 91d2b9c..917e499 100644 --- a/core/controllers/ClientController.py +++ b/core/controllers/ClientController.py @@ -1,4 +1,4 @@ -from core.Constants import Constants +from core.Errors import UnknownClientVersionError from core.controllers.ApplicationController import ApplicationController from core.controllers.ApplicationVersionController import ApplicationVersionController from core.controllers.ClientVersionController import ClientVersionController @@ -8,6 +8,7 @@ from core.controllers.SubscriptionPlanController import SubscriptionPlanControll from core.observers import ClientObserver from core.observers.ConnectionObserver import ConnectionObserver from typing import Optional +import os import pathlib @@ -17,6 +18,26 @@ class ClientController: def get_working_directory(): return str(pathlib.Path(__file__).resolve().parent.parent.parent) + @staticmethod + def get_version(): + + version_number = os.environ.get('HV_CLIENT_VERSION') + + if version_number is None: + raise UnknownClientVersionError('The client version could not be determined.') + + return ClientVersionController.get_or_new(version_number) + + @staticmethod + def can_be_updated(): + + try: + version = ClientController.get_version() + except UnknownClientVersionError: + return False + + return not ClientVersionController.is_latest(version) + @staticmethod def sync(client_observer: ClientObserver = None, connection_observer: ConnectionObserver = None): diff --git a/core/controllers/ClientVersionController.py b/core/controllers/ClientVersionController.py index 2b84cb4..12dc266 100644 --- a/core/controllers/ClientVersionController.py +++ b/core/controllers/ClientVersionController.py @@ -17,6 +17,16 @@ class ClientVersionController: def get(version_number: str): return ClientVersion.find(version_number) + @staticmethod + def get_or_new(version_number: str): + + client_version = ClientVersionController.get(version_number) + + if client_version is None: + return ClientVersion(version_number) + + return client_version + @staticmethod def get_all(): return ClientVersion.all() diff --git a/core/models/ClientVersion.py b/core/models/ClientVersion.py index 652a11b..45a206a 100644 --- a/core/models/ClientVersion.py +++ b/core/models/ClientVersion.py @@ -20,7 +20,8 @@ _table_definition: str = """ @dataclass class ClientVersion(Model): version_number: str - released_at: datetime = field( + released_at: Optional[datetime] = field( + default=None, metadata=config( encoder=datetime.isoformat, decoder=datetime.fromisoformat,