From 2967e64e6913fcb6d8ca630351c67c3afc0aa1d2 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 13 Oct 2014 20:17:57 +0200 Subject: [PATCH] Bind restrictions to only one item for reduced complexibility --- doc/development/api/restriction.rst | 2 +- src/tixlbase/models.py | 5 +- .../migrations/0002_auto_20141013_1811.py | 30 +++++++++++ .../migrations/0003_auto_20141013_1811.py | 19 +++++++ src/tixlplugins/timerestriction/signals.py | 2 +- src/tixlplugins/timerestriction/tests.py | 54 ++++++++++++------- 6 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 src/tixlplugins/timerestriction/migrations/0002_auto_20141013_1811.py create mode 100644 src/tixlplugins/timerestriction/migrations/0003_auto_20141013_1811.py diff --git a/doc/development/api/restriction.rst b/doc/development/api/restriction.rst index 30409cbbd7..b34d115f54 100644 --- a/doc/development/api/restriction.rst +++ b/doc/development/api/restriction.rst @@ -118,7 +118,7 @@ In our example, the implementation could look like this:: # Fetch all restriction objects applied to this item restrictions = list(TimeRestriction.objects.filter( - items__in=(item,), + item=item, ).prefetch_related('variations')) # If we do not know anything about this item, we are done here. diff --git a/src/tixlbase/models.py b/src/tixlbase/models.py index 8cb83f1a66..8bba4a65ed 100644 --- a/src/tixlbase/models.py +++ b/src/tixlbase/models.py @@ -677,12 +677,15 @@ class BaseRestriction(models.Model): related_name="restrictions_%(app_label)s_%(class)s", verbose_name=_("Event"), ) - items = models.ManyToManyField( + item = models.ForeignKey( Item, + blank=True, + null=True, related_name="restrictions_%(app_label)s_%(class)s", ) variations = models.ManyToManyField( ItemVariation, + blank=True, related_name="restrictions_%(app_label)s_%(class)s", ) diff --git a/src/tixlplugins/timerestriction/migrations/0002_auto_20141013_1811.py b/src/tixlplugins/timerestriction/migrations/0002_auto_20141013_1811.py new file mode 100644 index 0000000000..fea843bfcd --- /dev/null +++ b/src/tixlplugins/timerestriction/migrations/0002_auto_20141013_1811.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tixlbase', '0016_event_plugins'), + ('timerestriction', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='timerestriction', + name='items', + ), + migrations.AddField( + model_name='timerestriction', + name='i', + field=models.ForeignKey(null=True, blank=True, related_name='restrictions_timerestriction_timerestriction', to='tixlbase.Item'), + preserve_default=True, + ), + migrations.AlterField( + model_name='timerestriction', + name='variations', + field=models.ManyToManyField(blank=True, related_name='restrictions_timerestriction_timerestriction', to='tixlbase.ItemVariation'), + ), + ] diff --git a/src/tixlplugins/timerestriction/migrations/0003_auto_20141013_1811.py b/src/tixlplugins/timerestriction/migrations/0003_auto_20141013_1811.py new file mode 100644 index 0000000000..fbdaeaad88 --- /dev/null +++ b/src/tixlplugins/timerestriction/migrations/0003_auto_20141013_1811.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('timerestriction', '0002_auto_20141013_1811'), + ] + + operations = [ + migrations.RenameField( + model_name='timerestriction', + old_name='i', + new_name='item', + ), + ] diff --git a/src/tixlplugins/timerestriction/signals.py b/src/tixlplugins/timerestriction/signals.py index 2a77f087bd..7d6a09bb5a 100644 --- a/src/tixlplugins/timerestriction/signals.py +++ b/src/tixlplugins/timerestriction/signals.py @@ -16,7 +16,7 @@ def availability_handler(sender, **kwargs): # Fetch all restriction objects applied to this item restrictions = list(TimeRestriction.objects.filter( - items__in=(item,), + item=item, ).prefetch_related('variations')) # If we do not know anything about this item, we are done here. diff --git a/src/tixlplugins/timerestriction/tests.py b/src/tixlplugins/timerestriction/tests.py index 98b5e90742..6bb4f76cdc 100644 --- a/src/tixlplugins/timerestriction/tests.py +++ b/src/tixlplugins/timerestriction/tests.py @@ -46,7 +46,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r.items.add(self.item) + r.item = self.item + r.save() result = signals.availability_handler( self.event, item=self.item, variations=self.item.get_all_variations(), @@ -64,7 +65,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r.items.add(self.item) + r.item = self.item + r.save() result = signals.availability_handler( self.event, item=self.item, variations=self.item.get_all_variations(), @@ -91,7 +93,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r.items.add(self.item) + r.item = self.item + r.save() result = signals.availability_handler( self.event, item=self.item, variations=self.item.get_all_variations(), @@ -108,14 +111,16 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r1.items.add(self.item) + r1.item = self.item + r1.save() r2 = TimeRestriction.objects.create( timeframe_from=now() - timedelta(days=3), timeframe_to=now() + timedelta(days=5), event=self.event, price=8 ) - r2.items.add(self.item) + r2.item = self.item + r2.save() result = signals.availability_handler( self.event, item=self.item, variations=self.item.get_all_variations(), @@ -133,14 +138,16 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r1.items.add(self.item) + r1.item = self.item + r1.save() r2 = TimeRestriction.objects.create( timeframe_from=now() + timedelta(days=1), timeframe_to=now() + timedelta(days=7), event=self.event, price=8 ) - r2.items.add(self.item) + r2.item = self.item + r2.save() result = signals.availability_handler( self.event, item=self.item, variations=self.item.get_all_variations(), @@ -158,14 +165,16 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r1.items.add(self.item) + r1.item = self.item + r1.save() r2 = TimeRestriction.objects.create( timeframe_from=now() + timedelta(days=4), timeframe_to=now() + timedelta(days=7), event=self.event, price=8 ) - r2.items.add(self.item) + r2.item = self.item + r2.save() result = signals.availability_handler( self.event, item=self.item, variations=self.item.get_all_variations(), @@ -183,14 +192,16 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r1.items.add(self.item) + r1.item = self.item + r1.save() r2 = TimeRestriction.objects.create( timeframe_from=now() + timedelta(days=4), timeframe_to=now() + timedelta(days=7), event=self.event, price=8 ) - r2.items.add(self.item) + r2.item = self.item + r2.save() result = signals.availability_handler( self.event, item=self.item, variations=self.item.get_all_variations(), @@ -213,7 +224,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r1.items.add(self.item) + r1.item = self.item + r1.save() r1.variations.add(v1) result = signals.availability_handler( self.event, item=self.item, @@ -241,14 +253,16 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r1.items.add(self.item) + r1.item = self.item + r1.save() r2 = TimeRestriction.objects.create( timeframe_from=now() - timedelta(days=5), timeframe_to=now() + timedelta(days=1), event=self.event, price=8 ) - r2.items.add(self.item) + r2.item = self.item + r2.save() r2.variations.add(v1) r3 = TimeRestriction.objects.create( timeframe_from=now() - timedelta(days=5), @@ -256,7 +270,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=10 ) - r3.items.add(self.item) + r3.item = self.item + r3.save() r3.variations.add(v2) result = signals.availability_handler( self.event, item=self.item, @@ -285,7 +300,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=12 ) - r1.items.add(self.item) + r1.item = self.item + r1.save() r1.variations.add(v1) r2 = TimeRestriction.objects.create( timeframe_from=now() - timedelta(days=5), @@ -293,7 +309,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=8 ) - r2.items.add(self.item) + r2.item = self.item + r2.save() r2.variations.add(v1) r3 = TimeRestriction.objects.create( timeframe_from=now() - timedelta(days=5), @@ -301,7 +318,8 @@ class TimeRestrictionTest(TestCase): event=self.event, price=8 ) - r3.items.add(self.item) + r3.item = self.item + r3.save() r3.variations.add(v2) result = signals.availability_handler( self.event, item=self.item,