Scheduled emails: Extend filter by subevents (Z#23122902) (#3551)

To create automated mail rules for specific subevents only, this adds a selection widget to choose which, only appearing if there are any subevents to select.
This commit is contained in:
Phin Wolkwitz
2023-09-06 12:05:37 +02:00
committed by GitHub
parent 8913d35838
commit 991f245dce
7 changed files with 127 additions and 10 deletions

View File

@@ -227,6 +227,7 @@ class Rule(models.Model, LoggingMixin):
id = models.BigAutoField(primary_key=True)
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='sendmail_rules')
subevent = models.ForeignKey(SubEvent, null=True, on_delete=models.PROTECT)
subject = I18nCharField(max_length=255, verbose_name=_('Subject'))
template = I18nTextField(verbose_name=_('Message'))
@@ -278,16 +279,27 @@ class Rule(models.Model, LoggingMixin):
create_sms = []
if self.event.has_subevents:
for se in self.event.subevents.annotate(has_sm=Exists(ScheduledMail.objects.filter(
subevent=OuterRef('pk'), rule=self))).filter(has_sm=False):
sm = ScheduledMail(rule=self, subevent=se, event=self.event)
sm.recompute()
create_sms.append(sm)
if self.subevent:
ScheduledMail.objects.get_or_create(rule=self, subevent=self.subevent, event=self.event)
else:
for se in self.event.subevents.annotate(has_sm=Exists(ScheduledMail.objects.filter(
subevent=OuterRef('pk'), rule=self))).filter(has_sm=False):
sm = ScheduledMail(rule=self, subevent=se, event=self.event)
sm.recompute()
create_sms.append(sm)
ScheduledMail.objects.bulk_create(create_sms)
else:
ScheduledMail.objects.get_or_create(rule=self, event=self.event)
if not is_creation:
if self.subevent:
keep_states = [ScheduledMail.STATE_COMPLETED] # we keep rules where mails have already been sent
ScheduledMail.objects.filter(
Q(rule=self),
~Q(subevent=self.subevent),
~Q(state__in=keep_states)
).delete()
update_sms = []
for sm in self.scheduledmail_set.prefetch_related('event').select_related('subevent'):
if sm in create_sms: