From 1902d13467567694d2764e189f83056e29868d97 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Fri, 14 May 2021 22:27:17 +0200 Subject: [PATCH] Fix group sync (Django <> AlekSIS) and add test --- aleksis/core/models.py | 6 +- aleksis/core/tests/models/test_group_sync.py | 62 ++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 aleksis/core/tests/models/test_group_sync.py diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 473b4e944..9db006984 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -14,6 +14,7 @@ from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator from django.db import models, transaction from django.db.models import QuerySet +from django.db.models.signals import m2m_changed from django.dispatch import receiver from django.forms.widgets import Media from django.urls import reverse @@ -436,7 +437,7 @@ class Group(SchoolTermRelatedExtensibleModel): else: return f"{self.name} ({self.short_name})" - group_info_tracker = FieldTracker(fields=("name", "short_name", "members", "owners")) + group_info_tracker = FieldTracker(fields=("name", "short_name")) def save(self, force: bool = False, *args, **kwargs): # Determine state of object in relation to database @@ -478,8 +479,9 @@ class PersonGroupThrough(ExtensibleModel): @receiver(models.signals.m2m_changed, sender=PersonGroupThrough) +@receiver(models.signals.m2m_changed, sender=Group.owners.through) def save_group_on_m2m_changed( - sender: PersonGroupThrough, + sender: Union[PersonGroupThrough, Group.owners.through], instance: models.Model, action: str, reverse: bool, diff --git a/aleksis/core/tests/models/test_group_sync.py b/aleksis/core/tests/models/test_group_sync.py new file mode 100644 index 000000000..808f12289 --- /dev/null +++ b/aleksis/core/tests/models/test_group_sync.py @@ -0,0 +1,62 @@ +from django.contrib.auth.models import Group as DjangoGroup +from django.contrib.auth.models import User + +import pytest + +from aleksis.core.models import Group, Person + +pytestmark = pytest.mark.django_db + + +def test_create(): + Group.objects.create(name="Foo") + + assert DjangoGroup.objects.filter(name="Foo").exists() + + +def test_assign_members(): + g = Group.objects.create(name="Foo") + dj_g = DjangoGroup.objects.get(name="Foo") + + u = User.objects.create(username="janedoe") + p = Person.objects.create(first_name="Jane", last_name="Doe", user=u) + + g.members.add(p) + + assert u in dj_g.user_set.all() + + +def test_assign_owners(): + g = Group.objects.create(name="Foo") + dj_g = DjangoGroup.objects.get(name="Foo") + + u = User.objects.create(username="janedoe") + p = Person.objects.create(first_name="Jane", last_name="Doe", user=u) + + g.owners.add(p) + + assert u in dj_g.user_set.all() + + +def test_assign_member_of(): + g = Group.objects.create(name="Foo") + dj_g = DjangoGroup.objects.get(name="Foo") + + u = User.objects.create(username="janedoe") + p = Person.objects.create(first_name="Jane", last_name="Doe", user=u) + + p.member_of.add(g) + + assert u in dj_g.user_set.all() + + +def test_assign_owner_of(): + g = Group.objects.create(name="Foo") + dj_g = DjangoGroup.objects.get(name="Foo") + + u = User.objects.create(username="janedoe") + p = Person.objects.create(first_name="Jane", last_name="Doe", user=u) + + p.owner_of.add(g) + + assert u in dj_g.user_set.all() -- GitLab