pricing: use M2M in pricing_data methods (#67196)

This commit is contained in:
Lauréline Guérin 2022-07-21 15:54:00 +02:00
parent 3f9e689e1c
commit 886ea62b72
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 42 additions and 50 deletions

View File

@ -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(

View File

@ -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()) == []