Skip to content

Commit

Permalink
Extend announcment to support more filtering event
Browse files Browse the repository at this point in the history
It can now exclude waiting lists from events, and specific meeting
invitation statuses from meetings.
  • Loading branch information
ivarnakken committed Mar 7, 2024
1 parent c48fb05 commit fa474ce
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 4 deletions.
6 changes: 5 additions & 1 deletion lego/apps/events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -776,10 +776,14 @@ def restricted_lookup(self) -> tuple[list[User], list]:
)
return [registration.user for registration in registrations], []

def announcement_lookup(self) -> list[User]:
def announcement_lookup(self, exclude_waiting_list: bool) -> list[User]:
registrations: QuerySet[Registration] = self.registrations.filter(
status=constants.SUCCESS_REGISTER
)

if exclude_waiting_list:
registrations = registrations.exclude(pool=None)

Check warning on line 785 in lego/apps/events/models.py

View check run for this annotation

Codecov / codecov/patch

lego/apps/events/models.py#L784-L785

Added lines #L784 - L785 were not covered by tests

return [registration.user for registration in registrations]

def add_legacy_registration(self) -> None:
Expand Down
13 changes: 11 additions & 2 deletions lego/apps/meetings/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,17 @@ def restricted_lookup(self):
"""
return self.invited_users, []

def announcement_lookup(self):
return self.invited_users
def announcement_lookup(self, meeting_invitation_status) -> list[User]:
meeting_invitations = self.invitations

Check warning on line 109 in lego/apps/meetings/models.py

View check run for this annotation

Codecov / codecov/patch

lego/apps/meetings/models.py#L109

Added line #L109 was not covered by tests

if meeting_invitation_status:
meeting_invitations = meeting_invitations.filter(

Check warning on line 112 in lego/apps/meetings/models.py

View check run for this annotation

Codecov / codecov/patch

lego/apps/meetings/models.py#L111-L112

Added lines #L111 - L112 were not covered by tests
status=meeting_invitation_status
)

return User.objects.filter(

Check warning on line 116 in lego/apps/meetings/models.py

View check run for this annotation

Codecov / codecov/patch

lego/apps/meetings/models.py#L116

Added line #L116 was not covered by tests
id__in=meeting_invitations.values_list("user", flat=True)
)

@property
def content_target(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Generated by Django 4.0.10 on 2024-03-07 14:51

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("notifications", "0014_alter_notificationsetting_notification_type"),
]

operations = [
migrations.AddField(
model_name="announcement",
name="exclude_waiting_list",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="announcement",
name="meeting_invitation_status",
field=models.CharField(
blank=True,
choices=[
("NO_ANSWER", "NO_ANSWER"),
("ATTENDING", "ATTENDING"),
("NOT_ATTENDING", "NOT_ATTENDING"),
],
max_length=50,
),
),
]
13 changes: 12 additions & 1 deletion lego/apps/notifications/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from django.utils import timezone

from lego.apps.action_handlers.events import handle_event
from lego.apps.meetings import constants
from lego.utils.models import BasisModel

from .constants import (
Expand Down Expand Up @@ -76,12 +77,16 @@ class Announcement(BasisModel):
message = models.TextField()
sent = models.DateTimeField(null=True, default=None)

MANY_TO_MANY_RELATIONS = ["users", "groups", "events", "meetings"]
MANY_TO_MANY_RELATIONS = ["users", "groups"]

users = models.ManyToManyField("users.User", blank=True)
groups = models.ManyToManyField("users.AbakusGroup", blank=True)
events = models.ManyToManyField("events.Event", blank=True)
exclude_waiting_list = models.BooleanField(default=False)
meetings = models.ManyToManyField("meetings.Meeting", blank=True)
meeting_invitation_status = models.CharField(
max_length=50, choices=constants.INVITATION_STATUS_TYPES, blank=True
)
from_group = models.ForeignKey(
"users.AbakusGroup",
on_delete=models.PROTECT,
Expand All @@ -104,6 +109,12 @@ def lookup_recipients(self):
users = announcement_lookup()
all_users += list(users)

for event in self.events.all():
all_users += event.announcement_lookup(self.exclude_waiting_list)

Check warning on line 113 in lego/apps/notifications/models.py

View check run for this annotation

Codecov / codecov/patch

lego/apps/notifications/models.py#L112-L113

Added lines #L112 - L113 were not covered by tests

for meeting in self.meetings.all():
all_users += meeting.announcement_lookup(self.meeting_invitation_status)

Check warning on line 116 in lego/apps/notifications/models.py

View check run for this annotation

Codecov / codecov/patch

lego/apps/notifications/models.py#L115-L116

Added lines #L115 - L116 were not covered by tests

return list(set(all_users))

def send(self):
Expand Down
4 changes: 4 additions & 0 deletions lego/apps/notifications/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ class Meta:
"users",
"groups",
"events",
"exclude_waiting_list",
"meetings",
"meeting_invitation_status",
)
read_only_fields = ("sent",)

Expand All @@ -59,6 +61,8 @@ class Meta(AnnouncementListSerializer.Meta):
"users",
"groups",
"events",
"exclude_waiting_list",
"meetings",
"meeting_invitation_status",
)
read_only_fields = ("sent",)

0 comments on commit fa474ce

Please sign in to comment.