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

Merge branch '20-info-mailings-sent_to-works-globally-instead-of-per-event' into 'master'

Resolve "[Info mailings] sent_to works globally instead of per event"

Closes #20

See merge request !10
parents 1d1c56e4 0e2a6b8a
No related branches found
No related tags found
1 merge request!10Resolve "[Info mailings] sent_to works globally instead of per event"
Pipeline #57902 failed
...@@ -6,6 +6,14 @@ All notable changes to this project will be documented in this file. ...@@ -6,6 +6,14 @@ All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog`_, The format is based on `Keep a Changelog`_,
and this project adheres to `Semantic Versioning`_. and this project adheres to `Semantic Versioning`_.
Unreleased
----------
Changed
~~~~~~~
* Allow re-using mailings for multiple events by moving sent_to to the per-event table
`1.3.1`_ `1.3.1`_
-------- --------
......
# Generated by Django 3.2.12 on 2022-03-02 19:50
import django.contrib.sites.managers
from django.db import migrations, models
import django.db.models.deletion
def migrate_to_new_through(apps, schema_editor):
Event = apps.get_model("paweljong", "Event")
EventRegistration = apps.get_model("paweljong", "EventRegistration")
Through = apps.get_model("paweljong", "EventInfoMailingThrough")
db_alias = schema_editor.connection.alias
for through_old in Event.info_mailings.through.objects.all():
event = through_old.event
info_mailing = through_old.infomailing
through = Through.objects.create(event=event, info_mailing=info_mailing)
for person in info_mailing.sent_to.all():
if EventRegistration.objects.filter(person_id=person.id, event_id=event.id).exists():
through.sent_to.add(person)
class Migration(migrations.Migration):
dependencies = [
('core', '0035_preference_model_unique'),
('sites', '0002_alter_domain_unique'),
('paweljong', '0013_info_mailings'),
]
operations = [
migrations.CreateModel(
name='EventInfoMailingThrough',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('extended_data', models.JSONField(default=dict, editable=False)),
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='paweljong.event')),
('info_mailing', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='paweljong.infomailing')),
('sent_to', models.ManyToManyField(blank=True, editable=False, related_name='received_info_mailings', to='core.Person', verbose_name='Sent to persons')),
('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')),
],
options={
'abstract': False,
},
managers=[
('objects', django.contrib.sites.managers.CurrentSiteManager()),
],
),
migrations.AddField(
model_name='event',
name='info_mailings_new',
field=models.ManyToManyField(blank=True, related_name='events', through='paweljong.EventInfoMailingThrough', to='paweljong.InfoMailing', verbose_name='Info mailings'),
),
migrations.RunPython(migrate_to_new_through),
migrations.RemoveField(
model_name='event',
name='info_mailings',
),
migrations.RenameField(
'event',
'info_mailings_new',
'info_mailings',
),
migrations.RemoveField(
model_name='infomailing',
name='sent_to',
),
]
...@@ -35,14 +35,6 @@ class InfoMailing(ExtensibleModel): ...@@ -35,14 +35,6 @@ class InfoMailing(ExtensibleModel):
send_to_person = models.BooleanField(verbose_name=_("Send to registered person"), default=True) send_to_person = models.BooleanField(verbose_name=_("Send to registered person"), default=True)
send_to_guardians = models.BooleanField(verbose_name=_("Send to guardians"), default=False) send_to_guardians = models.BooleanField(verbose_name=_("Send to guardians"), default=False)
sent_to = models.ManyToManyField(
Person,
verbose_name=_("Sent to persons"),
related_name="received_info_mailings",
editable=False,
blank=True,
)
def __str__(self) -> str: def __str__(self) -> str:
return self.subject return self.subject
...@@ -51,9 +43,10 @@ class InfoMailing(ExtensibleModel): ...@@ -51,9 +43,10 @@ class InfoMailing(ExtensibleModel):
return cls.objects.filter(active=True) return cls.objects.filter(active=True)
def send(self): def send(self):
sent_to = self.sent_to.all()
for event in self.events.all(): for event in self.events.all():
through = EventInfoMailingThrough.objects.get(info_mailing=self, event=event)
sent_to = through.sent_to.all()
for registration in event.registrations.all(): for registration in event.registrations.all():
if registration.person in sent_to: if registration.person in sent_to:
continue continue
...@@ -90,7 +83,7 @@ class InfoMailing(ExtensibleModel): ...@@ -90,7 +83,7 @@ class InfoMailing(ExtensibleModel):
}, },
) )
self.sent_to.add(registration.person) through.sent_to.add(registration.person)
class Event(ExtensibleModel): class Event(ExtensibleModel):
...@@ -115,7 +108,7 @@ class Event(ExtensibleModel): ...@@ -115,7 +108,7 @@ class Event(ExtensibleModel):
information = RichTextField(verbose_name=_("Information about the event")) information = RichTextField(verbose_name=_("Information about the event"))
terms = models.ManyToManyField(Terms, verbose_name=_("Terms"), related_name="event", blank=True) terms = models.ManyToManyField(Terms, verbose_name=_("Terms"), related_name="event", blank=True)
info_mailings = models.ManyToManyField( info_mailings = models.ManyToManyField(
InfoMailing, verbose_name=_("Info mailings"), related_name="events", blank=True InfoMailing, verbose_name=_("Info mailings"), related_name="events", through="EventInfoMailingThrough", blank=True
) )
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
...@@ -173,6 +166,19 @@ class Event(ExtensibleModel): ...@@ -173,6 +166,19 @@ class Event(ExtensibleModel):
return Event.objects.filter(published=True, date_event__gte=now()) return Event.objects.filter(published=True, date_event__gte=now())
class EventInfoMailingThrough(ExtensibleModel):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
info_mailing = models.ForeignKey(InfoMailing, on_delete=models.CASCADE)
sent_to = models.ManyToManyField(
Person,
verbose_name=_("Sent to persons"),
related_name="received_info_mailings",
editable=False,
blank=True,
)
class Voucher(ExtensibleModel): class Voucher(ExtensibleModel):
class Meta: class Meta:
verbose_name = _("Vouchers") verbose_name = _("Vouchers")
......
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