From 606ffb32e7fe8e308d24e36f59dca9a663c67070 Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Tue, 28 May 2024 14:08:58 +0200 Subject: [PATCH 01/10] minor: assign community members to public circle --- djangoldp_tzcld/models.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index afd6b40..ef61bfe 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -8,6 +8,8 @@ from django.utils.translation import gettext_lazy as _ from djangoldp.models import Model from djangoldp_conversation.models import Conversation, Message from djangoldp_community.models import Community, CommunityMember +from djangoldp_circle.models import Circle +from django.contrib.auth.models import Group from djangoldp.permissions import LDPBasePermission, AnonymousReadOnly, ReadOnly, ReadAndCreate, ACLPermissions, OwnerPermissions, InheritPermissions from djangoldp_tzcld.permissions import RegionalReferentPermissions @@ -456,7 +458,7 @@ class TzcldTerritoryProjectTeamMember(Model): community_path = 'community_identity.community' ############################# -# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Député-e +# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Député-e ############################# class TzcldTerritoryPoliticalLandscapeDeputy(Model): deputy = models.CharField(max_length=254, blank=True, null=True, default='') @@ -481,7 +483,7 @@ class TzcldTerritoryPoliticalLandscapeDeputy(Model): inherit_permissions = ['community_identity'] ############################# -# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Sénateur-ice +# Page Etat d'avancement => Carte d’identité du territoire => Paysage politique / institutionnel : Sénateur-ice ############################# class TzcldTerritoryPoliticalLandscapeSenator(Model): senator = models.CharField(max_length=254, blank=True, null=True, default='') @@ -506,7 +508,7 @@ class TzcldTerritoryPoliticalLandscapeSenator(Model): inherit_permissions = ['community_identity'] ############################# -# Page Etat d'avancement => Carte d’identité du territoire => Participation aux formations TZCLD +# Page Etat d'avancement => Carte d’identité du territoire => Participation aux formations TZCLD ############################# class TzcldTerritoryTraining(Model): training_course = models.ForeignKey(TzcldTerritoriesTrainingCourse, on_delete=models.DO_NOTHING,related_name='territory_training_course', blank=True, null=True) @@ -838,7 +840,7 @@ class TzcldCommunityFollowedPointPart(Model): class Meta(Model.Meta): verbose_name = _('TZCLD Territory Followed Point Part') verbose_name_plural = _("TZCLD Territories Followed Point Parts") - + # authenticated_perms = ['view', 'add'] # owner_perms = ['inherit', 'change', 'delete'] # superuser_perms = ['inherit'] @@ -1045,4 +1047,31 @@ def create_followed_point_answers(sender, instance, created, **kwargs): followed_point_answer = TzcldCommunityFollowedPointAnswer.objects.create( community=community, followed_point=instance - ) \ No newline at end of file + ) + +# Assign all the community members to the circle when a public circle is updated +@receiver(post_save, sender=Circle) +def assign_community_members_to_public_circles(sender, instance, created, **kwargs): + community = instance.community + + if not instance.public or not community: + return + + # Get all the users for this community + community_members = Group.objects.get(name=f'LDP_community_members_{community.id}').user_set + community_admins = Group.objects.get(name=f'LDP_community_admins_{community.id}').user_set + + # Get all the users for this circle + circle_members = Group.objects.get(name=f'LDP_circle_members_{instance.id}').user_set + circle_admins = Group.objects.get(name=f'LDP_circle_admins_{instance.id}').user_set + + for community_member in community_members.all(): + if community_member not in circle_members.all(): + circle_members.add(community_member) + + for community_admin in community_admins.all(): + if community_admin not in circle_members.all(): + circle_members.add(community_admin) + + if community_admin not in circle_admins.all(): + circle_admins.add(community_admin) -- GitLab From 199ad4aa1462606bfbd890e8afb1425bc518dffe Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 11:50:33 +0200 Subject: [PATCH 02/10] minor: assign user to its community public circles on save --- djangoldp_tzcld/models.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index ef61bfe..3ca3e75 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1051,19 +1051,19 @@ def create_followed_point_answers(sender, instance, created, **kwargs): # Assign all the community members to the circle when a public circle is updated @receiver(post_save, sender=Circle) -def assign_community_members_to_public_circles(sender, instance, created, **kwargs): +def assign_community_members_to_circle(sender, instance, created, **kwargs): community = instance.community if not instance.public or not community: return # Get all the users for this community - community_members = Group.objects.get(name=f'LDP_community_members_{community.id}').user_set - community_admins = Group.objects.get(name=f'LDP_community_admins_{community.id}').user_set + community_members = community.members.user_set + community_admins = community.admins.user_set # Get all the users for this circle - circle_members = Group.objects.get(name=f'LDP_circle_members_{instance.id}').user_set - circle_admins = Group.objects.get(name=f'LDP_circle_admins_{instance.id}').user_set + circle_members = instance.members.user_set + circle_admins = instance.admins.user_set for community_member in community_members.all(): if community_member not in circle_members.all(): @@ -1075,3 +1075,20 @@ def assign_community_members_to_public_circles(sender, instance, created, **kwar if community_admin not in circle_admins.all(): circle_admins.add(community_admin) + +# Assign the user to the community public circles when the user is created/updated +@receiver(post_save, sender=settings.AUTH_USER_MODEL) +def assign_user_to_community_public_circles(sender, instance, created, **kwargs): + for community in instance.communities(): + community_members = community.members.user_set + community_admins = community.admins.user_set + community_public_circles = community.circles.filter(public=True) + + if instance in community_members.all(): + for circle in community_public_circles: + circle.members.user_set.add(instance) + + if instance in community_admins.all(): + for circle in community_public_circles: + circle.members.user_set.add(instance) + circle.admins.user_set.add(instance) -- GitLab From 5b44e0f30c1b85414cf14ed1d1d09e7b32e1ab02 Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 11:50:59 +0200 Subject: [PATCH 03/10] minor: assign all community users to public circles on community save --- djangoldp_tzcld/models.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index 3ca3e75..24738fb 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1092,3 +1092,19 @@ def assign_user_to_community_public_circles(sender, instance, created, **kwargs) for circle in community_public_circles: circle.members.user_set.add(instance) circle.admins.user_set.add(instance) + +# Assign all the community members/admins to public circles when a community is updated +@receiver(post_save, sender=Community) +def assign_community_members_to_public_circles(sender, instance, created, **kwargs): + community_members = instance.members.user_set + community_admins = instance.admins.user_set + community_public_circles = instance.circles.filter(public=True) + + for community_member in community_members.all(): + for circle in community_public_circles: + circle.members.user_set.add(community_member) + + for community_admin in community_admins.all(): + for circle in community_public_circles: + circle.members.user_set.add(community_admin) + circle.admins.user_set.add(community_admin) -- GitLab From 1932269449f8deb5cbdcae451268eeecab64b54f Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 12:12:17 +0200 Subject: [PATCH 04/10] bugfix: apply signals on model creation --- djangoldp_tzcld/models.py | 56 +++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index 24738fb..aa5e34a 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1049,17 +1049,15 @@ def create_followed_point_answers(sender, instance, created, **kwargs): followed_point=instance ) -# Assign all the community members to the circle when a public circle is updated +# Assign all the community members to the circle when a public circle is created @receiver(post_save, sender=Circle) def assign_community_members_to_circle(sender, instance, created, **kwargs): - community = instance.community - - if not instance.public or not community: + if not created or not instance.public or not instance.community: return - # Get all the users for this community - community_members = community.members.user_set - community_admins = community.admins.user_set + # Get all the users for its community + community_members = instance.community.members.user_set + community_admins = instance.community.admins.user_set # Get all the users for this circle circle_members = instance.members.user_set @@ -1079,32 +1077,34 @@ def assign_community_members_to_circle(sender, instance, created, **kwargs): # Assign the user to the community public circles when the user is created/updated @receiver(post_save, sender=settings.AUTH_USER_MODEL) def assign_user_to_community_public_circles(sender, instance, created, **kwargs): - for community in instance.communities(): - community_members = community.members.user_set - community_admins = community.admins.user_set - community_public_circles = community.circles.filter(public=True) + if created: + for community in instance.communities(): + community_members = community.members.user_set + community_admins = community.admins.user_set + community_public_circles = community.circles.filter(public=True) - if instance in community_members.all(): - for circle in community_public_circles: - circle.members.user_set.add(instance) + if instance in community_members.all(): + for circle in community_public_circles: + circle.members.user_set.add(instance) - if instance in community_admins.all(): - for circle in community_public_circles: - circle.members.user_set.add(instance) - circle.admins.user_set.add(instance) + if instance in community_admins.all(): + for circle in community_public_circles: + circle.members.user_set.add(instance) + circle.admins.user_set.add(instance) # Assign all the community members/admins to public circles when a community is updated @receiver(post_save, sender=Community) def assign_community_members_to_public_circles(sender, instance, created, **kwargs): - community_members = instance.members.user_set - community_admins = instance.admins.user_set - community_public_circles = instance.circles.filter(public=True) + if created: + community_members = instance.members.user_set + community_admins = instance.admins.user_set + community_public_circles = instance.circles.filter(public=True) - for community_member in community_members.all(): - for circle in community_public_circles: - circle.members.user_set.add(community_member) + for community_member in community_members.all(): + for circle in community_public_circles: + circle.members.user_set.add(community_member) - for community_admin in community_admins.all(): - for circle in community_public_circles: - circle.members.user_set.add(community_admin) - circle.admins.user_set.add(community_admin) + for community_admin in community_admins.all(): + for circle in community_public_circles: + circle.members.user_set.add(community_admin) + circle.admins.user_set.add(community_admin) -- GitLab From 5ccab2c02b08360bb7b3f0b399ddfb81e9ea93bb Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 12:12:53 +0200 Subject: [PATCH 05/10] minor: add command to update all the communities --- ...ign_community_members_to_public_circles.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 djangoldp_tzcld/management/commands/assign_community_members_to_public_circles.py diff --git a/djangoldp_tzcld/management/commands/assign_community_members_to_public_circles.py b/djangoldp_tzcld/management/commands/assign_community_members_to_public_circles.py new file mode 100644 index 0000000..afde8ee --- /dev/null +++ b/djangoldp_tzcld/management/commands/assign_community_members_to_public_circles.py @@ -0,0 +1,26 @@ +from django.core.management.base import BaseCommand +from djangoldp_community.models import Community +from djangoldp_circle.models import Circle +from django.conf import settings + +class Command(BaseCommand): + help = 'Assign all the members/admins to the public circles of the communities they are part of' + + def handle(self, *args, **options): + communities = Community.objects.all() + + for community in communities: + community_members = community.members.user_set + community_admins = community.admins.user_set + community_public_circles = Circle.objects.filter(community=community, public=True) + + for member in community_members.all(): + for circle in community_public_circles: + circle.members.user_set.add(member) + + for admin in community_admins.all(): + for circle in community_public_circles: + circle.members.user_set.add(admin) + circle.admins.user_set.add(admin) + + self.stdout.write(self.style.SUCCESS(f'Community {community.id}: Assigned {community_members.count()} members and {community_admins.count()} admins to {community_public_circles.count()} public circles')) -- GitLab From ce667cade80b40a245ab26c8a2f68a9dfda0eb2a Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 15:40:56 +0200 Subject: [PATCH 06/10] bugfix: update assignment when user groups changes --- djangoldp_tzcld/models.py | 63 +++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index aa5e34a..88d0382 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1,13 +1,14 @@ from django.conf import settings from django.contrib.auth import get_user_model from django.db import models -from django.db.models.signals import post_save +from django.db.models.signals import post_save, m2m_changed from django.dispatch import receiver from django.utils.translation import gettext_lazy as _ from djangoldp.models import Model from djangoldp_conversation.models import Conversation, Message from djangoldp_community.models import Community, CommunityMember +from djangoldp_account.models import LDPUser as User from djangoldp_circle.models import Circle from django.contrib.auth.models import Group from djangoldp.permissions import LDPBasePermission, AnonymousReadOnly, ReadOnly, ReadAndCreate, ACLPermissions, OwnerPermissions, InheritPermissions @@ -1074,24 +1075,6 @@ def assign_community_members_to_circle(sender, instance, created, **kwargs): if community_admin not in circle_admins.all(): circle_admins.add(community_admin) -# Assign the user to the community public circles when the user is created/updated -@receiver(post_save, sender=settings.AUTH_USER_MODEL) -def assign_user_to_community_public_circles(sender, instance, created, **kwargs): - if created: - for community in instance.communities(): - community_members = community.members.user_set - community_admins = community.admins.user_set - community_public_circles = community.circles.filter(public=True) - - if instance in community_members.all(): - for circle in community_public_circles: - circle.members.user_set.add(instance) - - if instance in community_admins.all(): - for circle in community_public_circles: - circle.members.user_set.add(instance) - circle.admins.user_set.add(instance) - # Assign all the community members/admins to public circles when a community is updated @receiver(post_save, sender=Community) def assign_community_members_to_public_circles(sender, instance, created, **kwargs): @@ -1108,3 +1091,45 @@ def assign_community_members_to_public_circles(sender, instance, created, **kwar for circle in community_public_circles: circle.members.user_set.add(community_admin) circle.admins.user_set.add(community_admin) + +# If a community is added to a user, add the user to the public circles of the community +# If a community is removed from a user, remove the user from the public circles of the community +@receiver(m2m_changed, sender=User.groups.through) +def assign_user_to_community_public_circles(sender, instance, action, pk_set, **kwargs): + if action == 'pre_add': + for pk in pk_set: + group = Group.objects.get(id=pk) + + if group.name.startswith('LDP_community_members_'): + id = group.name.split('_')[-1] + community = Community.objects.get(id=id) + community_public_circles = community.circles.filter(public=True) + for circle in community_public_circles: + circle.members.user_set.add(instance) + + if group.name.startswith('LDP_community_admins_'): + id = group.name.split('_')[-1] + community = Community.objects.get(id=id) + community_public_circles = community.circles.filter(public=True) + for circle in community_public_circles: + circle.members.user_set.add(instance) + circle.admins.user_set.add(instance) + + if action == 'pre_remove': + for pk in pk_set: + group = Group.objects.get(id=pk) + + if group.name.startswith('LDP_community_members_'): + id = group.name.split('_')[-1] + community = Community.objects.get(pk=id) + community_public_circles = community.circles.filter(public=True) + for circle in community_public_circles: + circle.members.user_set.remove(instance) + + if group.name.startswith('LDP_community_admins_'): + id = group.name.split('_')[-1] + community = Community.objects.get(pk=id) + community_public_circles = community.circles.filter(public=True) + for circle in community_public_circles: + circle.members.user_set.remove(instance) + circle.admins.user_set.remove(instance) -- GitLab From cd84358c71cf385c10b9c0ab052133dd7f6d8775 Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 15:42:40 +0200 Subject: [PATCH 07/10] bugfix: remove the post create community signal --- djangoldp_tzcld/models.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index 88d0382..dd7ccb4 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1075,23 +1075,6 @@ def assign_community_members_to_circle(sender, instance, created, **kwargs): if community_admin not in circle_admins.all(): circle_admins.add(community_admin) -# Assign all the community members/admins to public circles when a community is updated -@receiver(post_save, sender=Community) -def assign_community_members_to_public_circles(sender, instance, created, **kwargs): - if created: - community_members = instance.members.user_set - community_admins = instance.admins.user_set - community_public_circles = instance.circles.filter(public=True) - - for community_member in community_members.all(): - for circle in community_public_circles: - circle.members.user_set.add(community_member) - - for community_admin in community_admins.all(): - for circle in community_public_circles: - circle.members.user_set.add(community_admin) - circle.admins.user_set.add(community_admin) - # If a community is added to a user, add the user to the public circles of the community # If a community is removed from a user, remove the user from the public circles of the community @receiver(m2m_changed, sender=User.groups.through) -- GitLab From 05d8a246a4f6dba92528a5222e2b7126a4c668ad Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 15:49:57 +0200 Subject: [PATCH 08/10] bugfix: find community by field rather than group name --- djangoldp_tzcld/models.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index dd7ccb4..6790f9a 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1083,16 +1083,14 @@ def assign_user_to_community_public_circles(sender, instance, action, pk_set, ** for pk in pk_set: group = Group.objects.get(id=pk) - if group.name.startswith('LDP_community_members_'): - id = group.name.split('_')[-1] - community = Community.objects.get(id=id) + community = Community.objects.filter(members=group).first() + if community: community_public_circles = community.circles.filter(public=True) for circle in community_public_circles: circle.members.user_set.add(instance) - if group.name.startswith('LDP_community_admins_'): - id = group.name.split('_')[-1] - community = Community.objects.get(id=id) + community = Community.objects.filter(admins=group).first() + if community: community_public_circles = community.circles.filter(public=True) for circle in community_public_circles: circle.members.user_set.add(instance) @@ -1102,16 +1100,14 @@ def assign_user_to_community_public_circles(sender, instance, action, pk_set, ** for pk in pk_set: group = Group.objects.get(id=pk) - if group.name.startswith('LDP_community_members_'): - id = group.name.split('_')[-1] - community = Community.objects.get(pk=id) + community = Community.objects.filter(members=group).first() + if community: community_public_circles = community.circles.filter(public=True) for circle in community_public_circles: circle.members.user_set.remove(instance) - if group.name.startswith('LDP_community_admins_'): - id = group.name.split('_')[-1] - community = Community.objects.get(pk=id) + community = Community.objects.filter(admins=group).first() + if community: community_public_circles = community.circles.filter(public=True) for circle in community_public_circles: circle.members.user_set.remove(instance) -- GitLab From 815f41a969137e78675ecb98d3bfffb5a35e3dce Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 15:55:20 +0200 Subject: [PATCH 09/10] bugfix: only add/remove admin perms --- djangoldp_tzcld/models.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index 6790f9a..da89d71 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1093,7 +1093,6 @@ def assign_user_to_community_public_circles(sender, instance, action, pk_set, ** if community: community_public_circles = community.circles.filter(public=True) for circle in community_public_circles: - circle.members.user_set.add(instance) circle.admins.user_set.add(instance) if action == 'pre_remove': @@ -1110,5 +1109,4 @@ def assign_user_to_community_public_circles(sender, instance, action, pk_set, ** if community: community_public_circles = community.circles.filter(public=True) for circle in community_public_circles: - circle.members.user_set.remove(instance) circle.admins.user_set.remove(instance) -- GitLab From 8cf0f8f1261ae51e37edd1e4d0eb944049245ea1 Mon Sep 17 00:00:00 2001 From: ubermanu <manu@paca.happy-dev.fr> Date: Wed, 29 May 2024 15:59:31 +0200 Subject: [PATCH 10/10] bugfix: assert instance is a user --- djangoldp_tzcld/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index da89d71..257dc7b 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1079,6 +1079,9 @@ def assign_community_members_to_circle(sender, instance, created, **kwargs): # If a community is removed from a user, remove the user from the public circles of the community @receiver(m2m_changed, sender=User.groups.through) def assign_user_to_community_public_circles(sender, instance, action, pk_set, **kwargs): + if not isinstance(instance, User): + return + if action == 'pre_add': for pk in pk_set: group = Group.objects.get(id=pk) -- GitLab