diff --git a/aleksis/apps/paweljong/data_checks.py b/aleksis/apps/paweljong/data_checks.py new file mode 100644 index 0000000000000000000000000000000000000000..09b3ed25a5d6a04aee4e2586b8652bc90b8745f1 --- /dev/null +++ b/aleksis/apps/paweljong/data_checks.py @@ -0,0 +1,37 @@ +from django.utils.translation import ugettext_lazy as _ + +from aleksis.core.data_checks import DataCheck, IgnoreSolveOption, SolveOption + +class SyncEventMembers(SolveOption): + name = "sync_event_members" + verbose_name = _("Sync members") + + @classmethod + def solve(cls, check_result: "DataCheckResult"): + event = check_result.related_object + event.sync_group_members() + check_result.delete() + + +class EventMembersSyncDataCheck(DataCheck): + name = "event_members_sync" + verbose_name = _("Ensure that all registered persons are member of the linked group") + problem_name = _("Event members are out of sync with registrations!") + solve_options = { + IgnoreSolveOption.name: IgnoreSolveOption, + SyncEventMembers.name: SyncEventMembers, + } + + @classmethod + def check_data(cls): + from .models import Event + + async_events = [] + for event in Event.objects.all(): + if not set(event.linked_group.members.values_list("id", flat=True)) == set(event.registrations.values_list( + "person", flat=True + )): + async_events.append(event) + + for event in async_events: + cls.register_result(event) diff --git a/aleksis/apps/paweljong/models.py b/aleksis/apps/paweljong/models.py index 5d12ea6188d749e89fa847633268c28e41bbdd52..b80441699c88bda607547de732318a959fbc37ca 100644 --- a/aleksis/apps/paweljong/models.py +++ b/aleksis/apps/paweljong/models.py @@ -1,8 +1,10 @@ from datetime import datetime from decimal import Decimal +from typing import Optional from django.contrib.contenttypes.models import ContentType from django.db import models +from django.dispatch import receiver from django.urls import reverse from django.utils.text import slugify from django.utils.timezone import now @@ -19,6 +21,7 @@ from aleksis.core.models import Group, Person from aleksis.core.util.core_helpers import generate_random_code, get_site_preferences from aleksis.core.util.email import send_email +from .data_checks import EventMembersSyncDataCheck class RegistrationState(ExtensibleModel): @@ -101,6 +104,9 @@ class InfoMailing(ExtensibleModel): class Event(ExtensibleModel): + + data_checks = [EventMembersSyncDataCheck] + # Event details display_name = models.CharField(verbose_name=_("Display name"), max_length=255) linked_group = models.OneToOneField( @@ -136,11 +142,17 @@ class Event(ExtensibleModel): else: self.slug = slugify(self.display_name) - return super().save(*args, **kwargs) + super().save(*args, **kwargs) + self.sync_group_members() def __str__(self) -> str: return self.display_name + def sync_group_members(self): + self.linked_group.members.set( + self.registrations.values_list("person", flat=True) + ) + def can_register(self, request=None): now = datetime.today().date() @@ -355,6 +367,14 @@ class EventRegistration(ExtensibleModel): def __str__(self) -> str: return f"{self.event}, {self.person.first_name} {self.person.last_name}" + def save(self, *args, **kwargs): + self.event.sync_group_members() + super().save(*args, **kwargs) + + def delete(self, *args, **kwargs): + self.event.sync_group_members() + super().delete(*args, **kwargs) + class Meta: verbose_name = _("Event registration") verbose_name_plural = _("Event registrations") diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py index daa4a7c6b127b80880ecb028f8071a007ee39904..a16c8f8f8ab446cadd4d5e4d3172900ac0a0a86f 100644 --- a/aleksis/apps/paweljong/views.py +++ b/aleksis/apps/paweljong/views.py @@ -609,9 +609,6 @@ class RegisterEventWizardView(SessionWizardView): _email.person = person _email.save() - # Add the current person to the event - event.linked_group.members.add(person) - registration = EventRegistration.objects.create( event=event, person=person,