From 071bb9e4ac97d17bd7384cbff118ea5149d9713f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Diot?= Date: Thu, 26 Sep 2024 15:34:20 +0200 Subject: [PATCH] Refactor Database.py to conditionally set the database URI and update metadata for non-draft services --- .../core/pro/jobs/download-pro-plugins.py | 6 +- src/common/db/Database.py | 57 ++++++++++--------- src/common/db/model.py | 1 + 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/common/core/pro/jobs/download-pro-plugins.py b/src/common/core/pro/jobs/download-pro-plugins.py index b93bb464b..560d69445 100644 --- a/src/common/core/pro/jobs/download-pro-plugins.py +++ b/src/common/core/pro/jobs/download-pro-plugins.py @@ -114,8 +114,11 @@ try: "pro_status": "invalid", "pro_overlapped": False, "pro_services": 0, + "non_draft_services": 0, + } + metadata = { + "non_draft_services": int(data["service_number"]), } - metadata = {} error = False temp_dir = TMP_DIR.joinpath(str(uuid4())) @@ -159,6 +162,7 @@ try: if ( pro_license_key == db_metadata.get("pro_license", "") and metadata.get("is_pro", False) == db_metadata["is_pro"] + and (not metadata.get("pro_overlapped", False) or metadata.get("non_draft_services", 0) == db_metadata.get("non_draft_services", 0)) and db_metadata["last_pro_check"] and current_date.replace(hour=0, minute=0, second=0, microsecond=0) == db_metadata["last_pro_check"].replace(hour=0, minute=0, second=0, microsecond=0) ): diff --git a/src/common/db/Database.py b/src/common/db/Database.py index f41d4289c..33bfe9a23 100644 --- a/src/common/db/Database.py +++ b/src/common/db/Database.py @@ -389,6 +389,7 @@ class Database: "pro_expire": None, "pro_status": "invalid", "pro_services": 0, + "non_draft_services": 0, "pro_overlapped": False, "last_pro_check": None, "failover": False, @@ -2870,7 +2871,7 @@ class Database: if page: path_ui = plugin_path.joinpath("ui") - if not path_ui.is_dir(): + if path_ui.is_dir(): with BytesIO() as plugin_page_content: with tar_open(fileobj=plugin_page_content, mode="w:gz", compresslevel=9) as tar: tar.add(path_ui, arcname=path_ui.name, recursive=True) @@ -3042,7 +3043,7 @@ class Database: return "" - def delete_plugin(self, plugin_id: str, method: str) -> str: + def delete_plugin(self, plugin_id: str, method: str, *, changes: bool = True) -> str: """Delete a plugin from the database.""" with self._db_session() as session: plugin = session.query(Plugins).filter_by(id=plugin_id, method=method).first() @@ -3050,33 +3051,37 @@ class Database: return f"Plugin with id {plugin_id} and method {method} not found" session.query(Plugins).filter_by(id=plugin_id, method=method).delete() - session.query(Settings).filter_by(plugin_id=plugin_id).delete() - session.query(Selects).filter(Selects.setting_id.in_(session.query(Settings).filter_by(plugin_id=plugin_id).with_entities(Settings.id))).delete() - session.query(Jobs).filter_by(plugin_id=plugin_id).delete() - session.query(Jobs_cache).filter_by(plugin_id=plugin_id).delete() - session.query(Jobs_runs).filter_by(plugin_id=plugin_id).delete() + for db_setting in session.query(Settings).filter_by(plugin_id=plugin_id).all(): + session.query(Selects).filter_by(setting_id=db_setting.id).delete() + session.query(Services_settings).filter_by(setting_id=db_setting.id).delete() + session.query(Global_values).filter_by(setting_id=db_setting.id).delete() + session.query(Template_settings).filter_by(setting_id=db_setting.id).delete() + session.query(Settings).filter_by(id=db_setting.id).delete() + + for db_job in session.query(Jobs).filter_by(plugin_id=plugin_id).all(): + session.query(Jobs_cache).filter_by(job_name=db_job.name).delete() + session.query(Jobs_runs).filter_by(job_name=db_job.name).delete() + session.query(Jobs).filter_by(name=db_job.name).delete() + session.query(Plugin_pages).filter_by(plugin_id=plugin_id).delete() session.query(Bw_cli_commands).filter_by(plugin_id=plugin_id).delete() - session.query(Templates).filter_by(plugin_id=plugin_id).delete() - session.query(Template_steps).filter( - Template_steps.template_id.in_(session.query(Templates).filter_by(plugin_id=plugin_id).with_entities(Templates.id)) - ).delete() - session.query(Template_settings).filter( - Template_settings.template_id.in_(session.query(Templates).filter_by(plugin_id=plugin_id).with_entities(Templates.id)) - ).delete() - session.query(Template_custom_configs).filter( - Template_custom_configs.template_id.in_(session.query(Templates).filter_by(plugin_id=plugin_id).with_entities(Templates.id)) - ).delete() - with suppress(ProgrammingError, OperationalError): - metadata = session.query(Metadata).get(1) - if metadata is not None: - if method in ("external", "ui"): - metadata.external_plugins_changed = True - metadata.last_external_plugins_change = datetime.now().astimezone() - elif method == "pro": - metadata.pro_plugins_changed = True - metadata.last_pro_plugins_change = datetime.now().astimezone() + for db_template in session.query(Templates).filter_by(plugin_id=plugin_id).all(): + session.query(Template_steps).filter_by(template_id=db_template.id).delete() + session.query(Template_settings).filter_by(template_id=db_template.id).delete() + session.query(Template_custom_configs).filter_by(template_id=db_template.id).delete() + session.query(Templates).filter_by(id=db_template.id).delete() + + if changes: + with suppress(ProgrammingError, OperationalError): + metadata = session.query(Metadata).get(1) + if metadata is not None: + if method in ("external", "ui"): + metadata.external_plugins_changed = True + metadata.last_external_plugins_change = datetime.now().astimezone() + elif method == "pro": + metadata.pro_plugins_changed = True + metadata.last_pro_plugins_change = datetime.now().astimezone() try: session.commit() diff --git a/src/common/db/model.py b/src/common/db/model.py index c0d9f187d..96711a6d9 100644 --- a/src/common/db/model.py +++ b/src/common/db/model.py @@ -287,6 +287,7 @@ class Metadata(Base): pro_expire = Column(DateTime(timezone=True), nullable=True) pro_status = Column(PRO_STATUS_ENUM, default="invalid", nullable=False) pro_services = Column(Integer, default=0, nullable=False) + non_draft_services = Column(Integer, default=0, nullable=False) pro_overlapped = Column(Boolean, default=False, nullable=False) last_pro_check = Column(DateTime(timezone=True), nullable=True) first_config_saved = Column(Boolean, nullable=False)