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 0000000000000000000000000000000000000000..afde8eefa96be0e208febb077a328ac7033defe9 --- /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')) diff --git a/djangoldp_tzcld/models.py b/djangoldp_tzcld/models.py index c38e1d1fac5bd464f47403f83e9ef364a4055d3a..2ac2dee2ab3f628cc2645d3cfeafd082693dc4b7 100644 --- a/djangoldp_tzcld/models.py +++ b/djangoldp_tzcld/models.py @@ -1,13 +1,16 @@ 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 from djangoldp_tzcld.permissions import RegionalReferentPermissions @@ -456,7 +459,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 +484,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 +509,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 +841,6 @@ class TzcldCommunityFollowedPointPart(Model): class Meta(Model.Meta): verbose_name = _('TZCLD Territory Followed Point Part') verbose_name_plural = _("TZCLD Territories Followed Point Parts") - container_path = "tzcld-followed-point-parts/" serializer_fields = ['@id', 'name', 'title', 'order', 'followed_part_points'] ordering = ['order'] @@ -1042,4 +1044,68 @@ 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 created +@receiver(post_save, sender=Circle) +def assign_community_members_to_circle(sender, instance, created, **kwargs): + if not created or not instance.public or not instance.community: + return + + # 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 + circle_admins = instance.admins.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) + +# 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 not isinstance(instance, User): + return + + if action == 'pre_add': + for pk in pk_set: + group = Group.objects.get(id=pk) + + 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) + + community = Community.objects.filter(admins=group).first() + if community: + community_public_circles = community.circles.filter(public=True) + for circle in community_public_circles: + circle.admins.user_set.add(instance) + + if action == 'pre_remove': + for pk in pk_set: + group = Group.objects.get(id=pk) + + 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) + + community = Community.objects.filter(admins=group).first() + if community: + community_public_circles = community.circles.filter(public=True) + for circle in community_public_circles: + circle.admins.user_set.remove(instance)