From 3e10a5e645d2a6278d69bde47269b49c04f8e04c Mon Sep 17 00:00:00 2001 From: Tom Bursch Date: Fri, 1 Mar 2024 19:22:35 +0100 Subject: [PATCH] feat: Soft delete households --- .../household/household_controller.py | 9 +++++--- backend/app/jobs/jobs.py | 21 +++++++++++++++++++ backend/app/models/household.py | 17 ++++++++------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/backend/app/controller/household/household_controller.py b/backend/app/controller/household/household_controller.py index 5476d494..1c2e2151 100644 --- a/backend/app/controller/household/household_controller.py +++ b/backend/app/controller/household/household_controller.py @@ -8,7 +8,7 @@ from app.service.import_language import importLanguage from app.service.file_has_access_or_download import file_has_access_or_download from .schemas import AddHousehold, UpdateHousehold, UpdateHouseholdMember -from app import socketio +from app import socketio, db household = Blueprint("household", __name__) @@ -112,8 +112,11 @@ def updateHousehold(args, household_id): @jwt_required() @authorize_household(required=RequiredRights.ADMIN) def deleteHouseholdById(household_id): - if Household.delete_by_id(household_id): - socketio.close_room(household_id) + hms = HouseholdMember.find_by_household(household_id) + for hm in hms: + db.session.delete(hm) + db.session.commit() + socketio.close_room(household_id) return jsonify({"msg": "DONE"}) diff --git a/backend/app/jobs/jobs.py b/backend/app/jobs/jobs.py index 73bf6dc6..7fe66fc4 100644 --- a/backend/app/jobs/jobs.py +++ b/backend/app/jobs/jobs.py @@ -10,6 +10,7 @@ ChallengePasswordReset, OIDCRequest, ) +from app.service.delete_unused import deleteEmptyHouseholds from .item_ordering import findItemOrdering from .item_suggestions import findItemSuggestions from .cluster_shoppings import clusterShoppings @@ -17,6 +18,11 @@ if not MESSAGE_BROKER: + @scheduler.task("cron", id="everyMonth", day="1", hour="0", minute="0") + def setup_daily(): + with app.app_context(): + monthly() + @scheduler.task("cron", id="everyDay", day_of_week="*", hour="3", minute="0") def setup_daily(): with app.app_context(): @@ -28,6 +34,11 @@ def setup_halfHourly(): halfHourly() else: + + @celery_app.task + def monthlyTask(): + monthly() + @celery_app.task def dailyTask(): daily() @@ -48,6 +59,16 @@ def setup_periodic_tasks(sender, **kwargs): name="everyDay", ) + sender.add_periodic_task( + crontab(day_of_month="1", hour=0, minute=0), + monthlyTask, + name="everyMonth", + ) + + +def monthly(): + deleteEmptyHouseholds() + def daily(): app.logger.info("--- daily analysis is starting ---") diff --git a/backend/app/models/household.py b/backend/app/models/household.py index 177dd1a9..72dea035 100644 --- a/backend/app/models/household.py +++ b/backend/app/models/household.py @@ -89,16 +89,15 @@ def obj_to_user_dict(self) -> dict: return res def delete(self): - if len(self.household.member) <= 1: - self.household.delete() - elif self.owner: + if self.owner: newOwner = next( (m for m in self.household.member if m.admin and m != self), - next((m for m in self.household.member if m != self)), + next((m for m in self.household.member if m != self), None), ) - newOwner.admin = True - newOwner.owner = True - newOwner.save() + if newOwner: + newOwner.admin = True + newOwner.owner = True + newOwner.save() super().delete() else: super().delete() @@ -116,3 +115,7 @@ def find_by_household(cls, household_id: int) -> list[Self]: @classmethod def find_by_user(cls, user_id: int) -> list[Self]: return cls.query.filter(cls.user_id == user_id).all() + + @classmethod + def find_by_household(cls, household_id: int) -> list[Self]: + return cls.query.filter(cls.household_id == household_id).all()