diff --git a/club/apps.py b/club/apps.py new file mode 100644 index 00000000..18557ebe --- /dev/null +++ b/club/apps.py @@ -0,0 +1,33 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Maréchal +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.apps import AppConfig + + +class ClubConfig(AppConfig): + name = "club" + verbose_name = "Management of the clubs and of the memberships in these clubs" + + def ready(self): + import club.signals diff --git a/club/signals.py b/club/signals.py new file mode 100644 index 00000000..27a6cbdd --- /dev/null +++ b/club/signals.py @@ -0,0 +1,52 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Maréchal +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.core.cache import cache +from django.db.models.signals import pre_delete, post_init, pre_save +from django.dispatch import receiver + +from club.models import Club, Membership + + +@receiver(pre_delete, sender=Club, dispatch_uid="clear_cached_club") +def clear_cached_club(sender, instance: Club, **_kwargs): + """ + When a club is deleted, clear the cache of the memberships + associated with this club + """ + for membership in instance.members.ongoing().select_related("user"): + cache.delete(f"membership_{instance.id}_{membership.user.id}") + cache.delete(f"sith_club_{instance.unix_name}") + + +@receiver( + [pre_save, pre_delete], + sender=Membership, + dispatch_uid="clear_cached_membership", +) +def clear_cached_membership(sender, instance: Membership, **_kwargs): + """ + When the membership of a user is deleted or edited, clear the associated cache + """ + cache.delete(f"membership_{instance.id}_{instance.user.id}") diff --git a/core/apps.py b/core/apps.py index 0e92db2e..55513298 100644 --- a/core/apps.py +++ b/core/apps.py @@ -34,6 +34,7 @@ class SithConfig(AppConfig): def ready(self): from forum.models import Forum + import core.signals def clear_cached_memberships(**kwargs): Forum._club_memberships = {} @@ -44,4 +45,3 @@ class SithConfig(AppConfig): weak=False, dispatch_uid="clear_cached_memberships", ) - # TODO: there may be a need to add more cache clearing diff --git a/core/signals.py b/core/signals.py new file mode 100644 index 00000000..87abce3b --- /dev/null +++ b/core/signals.py @@ -0,0 +1,54 @@ +# -*- coding:utf-8 -* +# +# Copyright 2023 +# - Maréchal +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + + +from django.core.cache import cache +from django.db.models.signals import pre_delete, pre_save +from django.dispatch import receiver + +from club.models import Club, Membership +from core.models import Group + + +@receiver(pre_delete, sender=Club, dispatch_uid="clear_cached_memberships") +def clear_cached_memberships(sender, instance: Club, **_kwargs): + """ + When a club is deleted, clear the cache of the memberships + associated with this club + """ + for membership in instance.members.ongoing(): + cache.delete(f"membership_{membership.club.id}_{membership.user.id}") + + +@receiver( + pre_delete, + sender=Group, + dispatch_uid="clear_cached_user_groups", +) +def clear_cached_user_groups(sender, instance: Group, **_kwargs): + """ + When the membership of a user is deleted or edited, clear the associated cache + """ + cache.delete(f"sith_group_{instance.id}") + cache.delete(f"sith_group_{instance.name.replace(' ', '_')}")