Improve application management-related logic

This commit is contained in:
codeking 2024-09-21 00:02:04 +02:00
parent 7235438a4a
commit 5ab9ba8c21
4 changed files with 34 additions and 2 deletions

View file

@ -22,6 +22,10 @@ class UnsupportedApplicationVersionError(Exception):
pass pass
class ApplicationAlreadyInstalledError(Exception):
pass
class MissingSubscriptionError(Exception): class MissingSubscriptionError(Exception):
pass pass

View file

@ -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.controllers.ApplicationController import ApplicationController
from core.models.session.Application import Application
from core.models.session.ApplicationVersion import ApplicationVersion from core.models.session.ApplicationVersion import ApplicationVersion
from core.observers.ApplicationVersionObserver import ApplicationVersionObserver from core.observers.ApplicationVersionObserver import ApplicationVersionObserver
from core.observers.ConnectionObserver import ConnectionObserver from core.observers.ConnectionObserver import ConnectionObserver
@ -19,11 +20,21 @@ class ApplicationVersionController:
return ApplicationVersion.find(application_code, version_number) return ApplicationVersion.find(application_code, version_number)
@staticmethod @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(): if not application_version.is_supported():
raise UnsupportedApplicationVersionError('The application version in question is not 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 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) ConnectionController.with_preferred_connection(application_version, task=ApplicationVersionController.__install, application_version_observer=application_version_observer, connection_observer=connection_observer)

View file

@ -39,6 +39,11 @@ class Application(Model):
Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition) Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition)
return Model._query_all('SELECT * FROM applications', Application.factory) 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 @staticmethod
def truncate(): def truncate():
Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition, drop_existing=True) Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition, drop_existing=True)

View file

@ -1,5 +1,6 @@
from core.Constants import Constants from core.Constants import Constants
from core.models.Model import Model from core.models.Model import Model
from core.models.session.Application import Application
from dataclasses import dataclass, field from dataclasses import dataclass, field
from dataclasses_json import config, Exclude from dataclasses_json import config, Exclude
from datetime import datetime 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) 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]) 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 @staticmethod
def exists(application_code: str, version_number: str): def exists(application_code: str, version_number: str):
Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition) Model._create_table_if_not_exists(table_name=_table_name, table_definition=_table_definition)