From 5ab9ba8c21ef09391106207b1495607fbfd5fd56 Mon Sep 17 00:00:00 2001 From: codeking Date: Sat, 21 Sep 2024 00:02:04 +0200 Subject: [PATCH] Improve application management-related logic --- core/Errors.py | 4 ++++ core/controllers/ApplicationVersionController.py | 15 +++++++++++++-- core/models/session/Application.py | 5 +++++ core/models/session/ApplicationVersion.py | 12 ++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/core/Errors.py b/core/Errors.py index a3cb5cb..3c5b3c4 100644 --- a/core/Errors.py +++ b/core/Errors.py @@ -22,6 +22,10 @@ class UnsupportedApplicationVersionError(Exception): pass +class ApplicationAlreadyInstalledError(Exception): + pass + + class MissingSubscriptionError(Exception): pass diff --git a/core/controllers/ApplicationVersionController.py b/core/controllers/ApplicationVersionController.py index 9acee1b..c5549f2 100644 --- a/core/controllers/ApplicationVersionController.py +++ b/core/controllers/ApplicationVersionController.py @@ -1,5 +1,6 @@ -from core.Errors import FileIntegrityError, UnsupportedApplicationVersionError +from core.Errors import FileIntegrityError, UnsupportedApplicationVersionError, ApplicationAlreadyInstalledError from core.controllers.ApplicationController import ApplicationController +from core.models.session.Application import Application from core.models.session.ApplicationVersion import ApplicationVersion from core.observers.ApplicationVersionObserver import ApplicationVersionObserver from core.observers.ConnectionObserver import ConnectionObserver @@ -19,11 +20,21 @@ class ApplicationVersionController: return ApplicationVersion.find(application_code, version_number) @staticmethod - def install(application_version: ApplicationVersion, application_version_observer: Optional[ApplicationVersionObserver] = None, connection_observer: Optional[ConnectionObserver] = None): + def get_all(application: Optional[Application] = None): + return ApplicationVersion.all(application) + + @staticmethod + def install(application_version: ApplicationVersion, reinstall: bool = False, application_version_observer: Optional[ApplicationVersionObserver] = None, connection_observer: Optional[ConnectionObserver] = None): if not application_version.is_supported(): raise UnsupportedApplicationVersionError('The application version in question is not supported.') + if reinstall is True: + ApplicationVersionController.uninstall(application_version) + + if application_version.is_installed(): + raise ApplicationAlreadyInstalledError('The application in question is already installed.') + from core.controllers.ConnectionController import ConnectionController ConnectionController.with_preferred_connection(application_version, task=ApplicationVersionController.__install, application_version_observer=application_version_observer, connection_observer=connection_observer) diff --git a/core/models/session/Application.py b/core/models/session/Application.py index e00d04c..c064875 100644 --- a/core/models/session/Application.py +++ b/core/models/session/Application.py @@ -39,6 +39,11 @@ class Application(Model): Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition) return Model._query_all('SELECT * FROM applications', Application.factory) + @staticmethod + def exists(code: str): + Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition) + return Model._query_exists('SELECT * FROM applications WHERE code = ?', [code]) + @staticmethod def truncate(): Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition, drop_existing=True) diff --git a/core/models/session/ApplicationVersion.py b/core/models/session/ApplicationVersion.py index 077c5d1..231ee85 100644 --- a/core/models/session/ApplicationVersion.py +++ b/core/models/session/ApplicationVersion.py @@ -1,5 +1,6 @@ from core.Constants import Constants from core.models.Model import Model +from core.models.session.Application import Application from dataclasses import dataclass, field from dataclasses_json import config, Exclude from datetime import datetime @@ -81,6 +82,17 @@ class ApplicationVersion(Model): Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition) return Model._query_one('SELECT * FROM application_versions WHERE application_code = ? AND version_number = ? LIMIT 1', ApplicationVersion.factory, [application_code, version_number]) + @staticmethod + def all(application: Optional[Application] = None): + + Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition) + + if application is None: + return Model._query_all('SELECT * FROM application_versions', ApplicationVersion.factory) + + else: + return Model._query_all('SELECT * FROM application_versions WHERE application_code = ?', ApplicationVersion.factory, [application.code]) + @staticmethod def exists(application_code: str, version_number: str): Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition)