diff --git a/lingo/pricing/models.py b/lingo/pricing/models.py index 95dd5aa..b91ed6c 100644 --- a/lingo/pricing/models.py +++ b/lingo/pricing/models.py @@ -415,7 +415,7 @@ class AgendaPricing(models.Model): adult_external_id=adult_external_id, ) pricing, criterias = agenda_pricing.compute_pricing(context=context) - modifier = agenda_pricing.get_booking_modifier(check_status=check_status) + modifier = agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) return agenda_pricing.aggregate_pricing_data( pricing=pricing, criterias=criterias, context=context, modifier=modifier ) @@ -439,7 +439,7 @@ class AgendaPricing(models.Model): def get_agenda_pricing(agenda, event): start_datetime = datetime.datetime.fromisoformat(event['start_datetime']) try: - return agenda.old_agendapricings.get( + return agenda.agendapricings.get( date_start__lte=start_datetime, date_end__gt=start_datetime, ) @@ -516,7 +516,7 @@ class AgendaPricing(models.Model): return pricing, criterias - def get_booking_modifier(self, check_status): + def get_booking_modifier(self, agenda, check_status): status = check_status['status'] if status not in ['error', 'not-booked', 'cancelled', 'presence', 'absence']: raise PricingUnknownCheckStatusError @@ -561,7 +561,7 @@ class AgendaPricing(models.Model): try: check_type = CheckType.objects.get( - group=self.agenda.check_type_group_id, slug=check_status['check_type'] + group=agenda.check_type_group_id, slug=check_status['check_type'] ) except CheckType.DoesNotExist: raise PricingBookingCheckTypeError( diff --git a/tests/pricing/test_models.py b/tests/pricing/test_models.py index 90d4a4b..69eaa5b 100644 --- a/tests/pricing/test_models.py +++ b/tests/pricing/test_models.py @@ -293,20 +293,20 @@ def test_get_agenda_pricing(): # ok agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert AgendaPricing.get_agenda_pricing(agenda=agenda, event=event) == agenda_pricing # more than one matching - AgendaPricing.objects.create( - agenda=agenda, + agenda_pricing = AgendaPricing.objects.create( pricing=pricing, date_start=datetime.date(year=2021, month=9, day=14), date_end=datetime.date(year=2021, month=9, day=16), ) + agenda_pricing.agendas.add(agenda) with pytest.raises(AgendaPricingNotFound): AgendaPricing.get_agenda_pricing(agenda=agenda, event=event) @@ -331,11 +331,11 @@ def test_get_agenda_pricing_event_date(event_date, found): 'start_datetime': make_aware(datetime.datetime(*event_date)).isoformat(), } agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) if found: assert AgendaPricing.get_agenda_pricing(agenda=agenda, event=event) == agenda_pricing else: @@ -348,11 +348,11 @@ def test_get_pricing_context(mock_send, context, nocache): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert ( agenda_pricing.get_pricing_context( request=context['request'], data={}, user_external_id='child:42', adult_external_id='parent:35' @@ -439,11 +439,11 @@ def test_compute_pricing(): pricing = Pricing.objects.create(label='Foo bar') pricing.categories.add(category, through_defaults={'order': 1}) agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) # no criteria defined on agenda_pricing with pytest.raises(CriteriaConditionNotFound) as e: agenda_pricing.compute_pricing(context={'qf': 2}) @@ -597,11 +597,11 @@ def test_format_pricing_data(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert agenda_pricing.format_pricing_data() == {} agenda_pricing.pricing_data = { @@ -653,41 +653,38 @@ def test_get_booking_modifier_unknown_check_status(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) check_status = {'status': 'unknown'} with pytest.raises(PricingUnknownCheckStatusError): - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) def test_get_booking_modifier_event_not_checked(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) check_status = {'status': 'error', 'error_reason': 'event-not-checked'} with pytest.raises(PricingEventNotCheckedError): - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) def test_get_booking_modifier_no_booking(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) check_status = {'status': 'not-booked'} - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'not-booked', 'modifier_type': 'rate', 'modifier_rate': 0, @@ -696,20 +693,19 @@ def test_get_booking_modifier_no_booking(): # more than one booking found ! check_status = {'status': 'error', 'error_reason': 'too-many-bookings-found'} with pytest.raises(PricingMultipleBookingError): - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) def test_get_booking_modifier_booking_cancelled(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) check_status = {'status': 'cancelled'} - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'cancelled', 'modifier_type': 'rate', 'modifier_rate': 0, @@ -720,34 +716,32 @@ def test_get_booking_modifier_booking_not_checked(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) check_status = {'status': 'error', 'error_reason': 'booking-not-checked'} with pytest.raises(PricingBookingNotCheckedError): - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) def test_get_booking_modifier_unknown_check_type(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) check_status = {'status': 'presence', 'check_type': 'unknown'} with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'reason': 'not-found', } check_status = {'status': 'absence', 'check_type': 'unknown'} with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'reason': 'not-found', } @@ -757,7 +751,6 @@ def test_get_booking_modifier_booking_absence(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), @@ -765,7 +758,7 @@ def test_get_booking_modifier_booking_absence(): # no check type check_status = {'status': 'absence', 'check_type': ''} - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'absence', 'check_type_group': None, 'check_type': None, @@ -778,7 +771,7 @@ def test_get_booking_modifier_booking_absence(): check_type = CheckType.objects.create(label='Foo reason', group=group, kind='absence') check_status = {'status': 'absence', 'check_type': check_type.slug} with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'reason': 'not-found', } @@ -786,7 +779,7 @@ def test_get_booking_modifier_booking_absence(): agenda.check_type_group = group agenda.save() with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -795,7 +788,7 @@ def test_get_booking_modifier_booking_absence(): check_type.pricing = 42 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'absence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -805,7 +798,7 @@ def test_get_booking_modifier_booking_absence(): check_type.pricing = 0 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'absence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -816,7 +809,7 @@ def test_get_booking_modifier_booking_absence(): check_type.pricing = None check_type.pricing_rate = 20 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'absence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -826,7 +819,7 @@ def test_get_booking_modifier_booking_absence(): check_type.pricing_rate = 0 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'absence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -838,7 +831,7 @@ def test_get_booking_modifier_booking_absence(): check_type.kind = 'presence' check_type.save() with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -850,7 +843,6 @@ def test_get_booking_modifier_booking_presence(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), @@ -858,7 +850,7 @@ def test_get_booking_modifier_booking_presence(): # no check type check_status = {'status': 'presence', 'check_type': ''} - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'presence', 'check_type_group': None, 'check_type': None, @@ -871,7 +863,7 @@ def test_get_booking_modifier_booking_presence(): check_type = CheckType.objects.create(label='Foo reason', group=group, kind='presence') check_status = {'status': 'presence', 'check_type': check_type.slug} with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'reason': 'not-found', } @@ -879,7 +871,7 @@ def test_get_booking_modifier_booking_presence(): agenda.check_type_group = group agenda.save() with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -888,7 +880,7 @@ def test_get_booking_modifier_booking_presence(): check_type.pricing = 42 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'presence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -898,7 +890,7 @@ def test_get_booking_modifier_booking_presence(): check_type.pricing = 0 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'presence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -909,7 +901,7 @@ def test_get_booking_modifier_booking_presence(): check_type.pricing = None check_type.pricing_rate = 150 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'presence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -919,7 +911,7 @@ def test_get_booking_modifier_booking_presence(): check_type.pricing_rate = 0 check_type.save() - assert agenda_pricing.get_booking_modifier(check_status=check_status) == { + assert agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) == { 'status': 'presence', 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -931,7 +923,7 @@ def test_get_booking_modifier_booking_presence(): check_type.kind = 'absence' check_type.save() with pytest.raises(PricingBookingCheckTypeError) as e: - agenda_pricing.get_booking_modifier(check_status=check_status) + agenda_pricing.get_booking_modifier(agenda=agenda, check_status=check_status) assert e.value.details == { 'check_type_group': 'foo-bar', 'check_type': 'foo-reason', @@ -952,8 +944,7 @@ def test_get_pricing_data(context): ) pricing.criterias.add(criteria) pricing.categories.add(category, through_defaults={'order': 1}) - AgendaPricing.objects.create( - agenda=agenda, + agenda_pricing = AgendaPricing.objects.create( pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), @@ -961,6 +952,7 @@ def test_get_pricing_data(context): 'foo:bar': 42, }, ) + agenda_pricing.agendas.add(agenda) assert AgendaPricing.get_pricing_data( request=context['request'], agenda=agenda, @@ -1114,11 +1106,11 @@ def test_aggregate_pricing_data(modifier, pricing_amount): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert agenda_pricing.aggregate_pricing_data( pricing=42, criterias={'foo': 'bar'}, context={'domicile': 'commune', 'qf': 2}, modifier=modifier @@ -1157,11 +1149,11 @@ def test_agenda_pricing_iter_pricing_matrix_3_categories(): pricing.categories.add(category4, through_defaults={'order': 4}) pricing.criterias.set(Criteria.objects.exclude(pk=not_used.pk)) agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert list(agenda_pricing.iter_pricing_matrix()) == [ PricingMatrix( criteria=criteria11, @@ -1382,11 +1374,11 @@ def test_agenda_pricing_iter_pricing_matrix_2_categories(): pricing.categories.add(category3, through_defaults={'order': 3}) pricing.criterias.set(Criteria.objects.exclude(pk=not_used.pk)) agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert list(agenda_pricing.iter_pricing_matrix()) == [ PricingMatrix( @@ -1494,11 +1486,11 @@ def test_agenda_pricing_iter_pricing_matrix_1_category(): pricing.categories.add(category3, through_defaults={'order': 3}) pricing.criterias.set(Criteria.objects.exclude(pk=not_used.pk)) agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert list(agenda_pricing.iter_pricing_matrix()) == [ PricingMatrix( @@ -1576,10 +1568,10 @@ def test_agenda_pricing_iter_pricing_matrix_empty(): agenda = Agenda.objects.create(label='Foo bar') pricing = Pricing.objects.create(label='Foo bar') agenda_pricing = AgendaPricing.objects.create( - agenda=agenda, pricing=pricing, date_start=datetime.date(year=2021, month=9, day=1), date_end=datetime.date(year=2021, month=10, day=1), ) + agenda_pricing.agendas.add(agenda) assert list(agenda_pricing.iter_pricing_matrix()) == []