diff --git a/lingo/agendas/models.py b/lingo/agendas/models.py index 98b03c9..b095f07 100644 --- a/lingo/agendas/models.py +++ b/lingo/agendas/models.py @@ -52,7 +52,7 @@ class Agenda(models.Model): def export_json(self): return { 'slug': self.slug, - 'pricings': [x.export_json() for x in self.agendapricing_set.all()], + 'pricings': [x.export_json() for x in self.old_agendapricings.all()], 'check_type_group': self.check_type_group.slug if self.check_type_group else None, } diff --git a/lingo/pricing/migrations/0005_agenda_pricing_m2m.py b/lingo/pricing/migrations/0005_agenda_pricing_m2m.py new file mode 100644 index 0000000..0db877e --- /dev/null +++ b/lingo/pricing/migrations/0005_agenda_pricing_m2m.py @@ -0,0 +1,28 @@ +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('agendas', '0003_check_type_group'), + ('pricing', '0004_criteria_default'), + ] + + operations = [ + migrations.AddField( + model_name='agendapricing', + name='agendas', + field=models.ManyToManyField(to='agendas.Agenda', related_name='agendapricings'), + ), + migrations.AlterField( + model_name='agendapricing', + name='agenda', + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='old_agendapricings', + to='agendas.Agenda', + ), + ), + ] diff --git a/lingo/pricing/migrations/0006_agenda_pricing_m2m.py b/lingo/pricing/migrations/0006_agenda_pricing_m2m.py new file mode 100644 index 0000000..85e5113 --- /dev/null +++ b/lingo/pricing/migrations/0006_agenda_pricing_m2m.py @@ -0,0 +1,37 @@ +import copy + +from django.db import migrations + + +def forwards(apps, schema_editor): + AgendaPricing = apps.get_model('pricing', 'AgendaPricing') + for agenda_pricing in AgendaPricing.objects.all(): + agenda_pricing.agendas.set([agenda_pricing.agenda]) + + +def backwards(apps, schema_editor): + AgendaPricing = apps.get_model('pricing', 'AgendaPricing') + for agenda_pricing in AgendaPricing.objects.all(): + if agenda_pricing.agendas.count() == 0: + agenda_pricing.delete() + if agenda_pricing.agendas.count() == 1: + agenda_pricing.agenda = agenda_pricing.agendas.first() + agenda_pricing.save() + else: + for agenda in agenda_pricing.agendas.all(): + new_agenda_pricing = copy.deepcopy(agenda_pricing) + new_agenda_pricing.pk = None + new_agenda_pricing.agenda_id = agenda.pk + new_agenda_pricing.save() + agenda_pricing.delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('pricing', '0005_agenda_pricing_m2m'), + ] + + operations = [ + migrations.RunPython(forwards, reverse_code=backwards), + ] diff --git a/lingo/pricing/models.py b/lingo/pricing/models.py index fb7ca70..a4aaa45 100644 --- a/lingo/pricing/models.py +++ b/lingo/pricing/models.py @@ -336,7 +336,8 @@ class PricingMatrix: class AgendaPricing(models.Model): - agenda = models.ForeignKey(Agenda, on_delete=models.CASCADE) + agenda = models.ForeignKey(Agenda, on_delete=models.CASCADE, null=True, related_name='old_agendapricings') + agendas = models.ManyToManyField(Agenda, related_name='agendapricings') pricing = models.ForeignKey(Pricing, on_delete=models.CASCADE) date_start = models.DateField() date_end = models.DateField() @@ -410,7 +411,7 @@ class AgendaPricing(models.Model): def get_agenda_pricing(agenda, event): start_datetime = datetime.datetime.fromisoformat(event['start_datetime']) try: - return agenda.agendapricing_set.get( + return agenda.old_agendapricings.get( date_start__lte=start_datetime, date_end__gt=start_datetime, ) diff --git a/tests/pricing/test_import_export.py b/tests/pricing/test_import_export.py index 8ba2341..de8700e 100644 --- a/tests/pricing/test_import_export.py +++ b/tests/pricing/test_import_export.py @@ -128,8 +128,8 @@ def test_import_export_agenda_with_pricing(app): agenda = Agenda.objects.create(label='Foo Bar') import_site(data, overwrite=True) - assert agenda.agendapricing_set.count() == 1 - agenda_pricing = agenda.agendapricing_set.get() + assert agenda.old_agendapricings.count() == 1 + agenda_pricing = agenda.old_agendapricings.get() assert agenda_pricing.agenda == agenda assert agenda_pricing.pricing == pricing assert agenda_pricing.date_start == datetime.date(year=2021, month=9, day=1) @@ -137,7 +137,7 @@ def test_import_export_agenda_with_pricing(app): # again import_site(data) - assert agenda.agendapricing_set.count() == 1 + assert agenda.old_agendapricings.count() == 1 agenda_pricing = AgendaPricing.objects.get(pk=agenda_pricing.pk) assert agenda_pricing.agenda == agenda assert agenda_pricing.pricing == pricing @@ -151,7 +151,7 @@ def test_import_export_agenda_with_pricing(app): } ) import_site(data) - assert agenda.agendapricing_set.count() == 2 + assert agenda.old_agendapricings.count() == 2 agenda_pricing = AgendaPricing.objects.latest('pk') assert agenda_pricing.agenda == agenda assert agenda_pricing.pricing == pricing