Refactor Database.py to conditionally set the database URI and update metadata for non-draft services

This commit is contained in:
Théophile Diot 2024-09-26 15:34:20 +02:00
parent 33eea02c6e
commit 071bb9e4ac
No known key found for this signature in database
GPG key ID: FA995104A0BA376A
3 changed files with 37 additions and 27 deletions

View file

@ -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)
):

View file

@ -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()

View file

@ -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)