Skip to content
Snippets Groups Projects
Commit cc35fca1 authored by Tom Teichler's avatar Tom Teichler :beers:
Browse files

Ensure participants are in sync

parent e3abb0b5
No related branches found
No related tags found
1 merge request!20Resolve "Synchronise/check synchronisation between event registrations and linked group"
Pipeline #61158 failed
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)
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")
......
......@@ -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,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment