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