Skip to content

Commit

Permalink
update and fix for Django 4.1
Browse files Browse the repository at this point in the history
  • Loading branch information
Martin Bähr committed May 24, 2024
1 parent ebf51e0 commit 106db31
Show file tree
Hide file tree
Showing 19 changed files with 73 additions and 58 deletions.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ classifiers = [
"Framework :: Django :: 3.2",
]
dependencies = [
'Django==3.2.*',
'Django==4.1.*',
'djangorestframework==3.14.*',
'python-dateutil==2.8.*',
'isoweek',
Expand Down
6 changes: 5 additions & 1 deletion src/pretix/api/serializers/order.py
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ def to_representation(self, instance: Order):
class OrderFeeSerializer(I18nAwareModelSerializer):
class Meta:
model = OrderFee
fields = ('fee_type', 'value', 'description', 'internal_type', 'tax_rate', 'tax_value', 'tax_rule', 'canceled')
fields = ('id', 'fee_type', 'value', 'description', 'internal_type', 'tax_rate', 'tax_value', 'tax_rule', 'canceled')


class PaymentURLField(serializers.URLField):
Expand Down Expand Up @@ -1280,13 +1280,17 @@ def create(self, validated_data):
fees.append(f)
if not simulate:
f.save()
else:
f.id = 0
else:
f = OrderFee(**fee_data)
f.order = order._wrapped if simulate else order
f._calculate_tax()
fees.append(f)
if not simulate:
f.save()
else:
f.id = 0

order.total += sum([f.value for f in fees])
if simulate:
Expand Down
2 changes: 1 addition & 1 deletion src/pretix/control/forms/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,7 @@ def clean(self):

def _should_delete_form(self, form):
should_delete = super()._should_delete_form(form)
if should_delete and (form.instance.orderposition_set.exists() or form.instance.cartposition_set.exists()):
if should_delete and form.instance.pk and (form.instance.orderposition_set.exists() or form.instance.cartposition_set.exists()):
form._delete_fail = True
return False
return form.cleaned_data.get(DELETION_FIELD_NAME, False)
Expand Down
2 changes: 1 addition & 1 deletion src/pretix/control/forms/organizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ def __init__(self, *args, **kwargs):
mark_safe('{} – <code>{}</code>'.format(a.verbose_name, a.action_type))
) for a in get_all_webhook_events().values()
]
if self.instance:
if self.instance and self.instance.pk:
self.fields['events'].initial = list(self.instance.listeners.values_list('action_type', flat=True))

class Meta:
Expand Down
32 changes: 22 additions & 10 deletions src/pretix/control/views/subevents.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ def cl_formset(self):
form=SimpleCheckinListForm, formset=CheckinListFormSet,
can_order=False, can_delete=True, extra=extra,
)
if self.object:
if self.object and self.object.pk:
kwargs['queryset'] = self.object.checkinlist_set.prefetch_related('limit_products')

return formsetclass(self.request.POST if self.request.method == "POST" else None,
Expand Down Expand Up @@ -247,7 +247,7 @@ def formset(self):
form=QuotaForm, formset=QuotaFormSet, min_num=1, validate_min=True,
can_order=False, can_delete=True, extra=extra,
)
if self.object:
if self.object and self.object.pk:
kwargs['queryset'] = self.object.quotas.prefetch_related('items', 'variations')

return formsetclass(
Expand Down Expand Up @@ -348,12 +348,16 @@ def copy_from(self):

@cached_property
def itemvar_forms(self):
se_item_instances = {
sei.item_id: sei for sei in SubEventItem.objects.filter(subevent=self.object)
}
se_var_instances = {
sei.variation_id: sei for sei in SubEventItemVariation.objects.filter(subevent=self.object)
}
if self.object and self.object.pk:
se_item_instances = {
sei.item_id: sei for sei in SubEventItem.objects.filter(subevent=self.object)
}
se_var_instances = {
sei.variation_id: sei for sei in SubEventItemVariation.objects.filter(subevent=self.object)
}
else:
se_item_instances = {}
se_var_instances = {}

if self.copy_from:
se_item_instances = {
Expand Down Expand Up @@ -1042,6 +1046,7 @@ def save_list_formset(self, log_entries):
subevents = list(self.get_queryset().prefetch_related('checkinlist_set'))
to_save_products = []
to_save_gates = []
to_delete_list_ids = []

for f in self.list_formset.forms:
if self.list_formset._should_delete_form(f) and f in self.list_formset.extra_forms:
Expand All @@ -1053,7 +1058,7 @@ def save_list_formset(self, log_entries):
log_entries += [
q.log_action(action='pretix.event.checkinlist.deleted', user=self.request.user, save=False),
]
q.delete()
to_delete_list_ids.append(q.pk)
elif f in self.list_formset.extra_forms:
change_data = {k: f.cleaned_data.get(k) for k in f.changed_data}
for se in subevents:
Expand Down Expand Up @@ -1092,6 +1097,9 @@ def save_list_formset(self, log_entries):
CheckinList.limit_products.through.objects.bulk_create(to_save_products)
if to_save_gates:
CheckinList.gates.through.objects.bulk_create(to_save_gates)
if to_delete_list_ids:
CheckinList.objects.filter(id__in=to_delete_list_ids).delete()


def save_quota_formset(self, log_entries):
if not self.quota_formset.has_changed():
Expand All @@ -1118,6 +1126,7 @@ def save_quota_formset(self, log_entries):

if to_delete_quota_ids:
Quota.objects.filter(id__in=to_delete_quota_ids).delete()
to_delete_quota_ids = []

for f in self.quota_formset.forms:
if self.quota_formset._should_delete_form(f) and f in self.quota_formset.extra_forms:
Expand All @@ -1139,7 +1148,7 @@ def save_quota_formset(self, log_entries):
'id': q.pk
}, save=False)
]
q.delete()
to_delete_quota_ids.append(q.pk)
elif f in self.quota_formset.extra_forms:
change_data = {k: f.cleaned_data.get(k) for k in f.changed_data}
for se in subevents:
Expand Down Expand Up @@ -1182,6 +1191,9 @@ def save_quota_formset(self, log_entries):
Quota.items.through.objects.bulk_create(to_save_items)
if to_save_variations:
Quota.variations.through.objects.bulk_create(to_save_variations)
if to_delete_quota_ids:
Quota.objects.filter(id__in=to_delete_quota_ids).delete()


def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
Expand Down
2 changes: 1 addition & 1 deletion src/pretix/presale/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def _detect_event(request, require_live=True, require_plugin=None):

if hasattr(request, 'event'):
# Restrict locales to the ones available for this event
LocaleMiddleware().process_request(request)
LocaleMiddleware(NotImplementedError).process_request(request)

if require_live and not request.event.live:
can_access = (
Expand Down
1 change: 0 additions & 1 deletion src/pretix/static/colorpicker/bootstrap-colorpicker.scss
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,3 @@
.colorpicker-inline.colorpicker-visible {
display: inline-block;
}
/*# sourceMappingURL=bootstrap-colorpicker.css.map */
1 change: 0 additions & 1 deletion src/pretix/static/rrule/rrule.js
Original file line number Diff line number Diff line change
Expand Up @@ -3800,4 +3800,3 @@ var isFullyConvertible = totext.isFullyConvertible;
/***/ })
/******/ ]);
});
//# sourceMappingURL=rrule.js.map
3 changes: 3 additions & 0 deletions src/tests/api/test_orders.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,13 @@ def test_order_list_filter_subevent_date(token_client, organizer, event, order,
p = order.positions.first()
p.subevent = subevent
p.save()
fee = order.fees.first()
res["positions"][0]["item"] = item.pk
res["positions"][0]["subevent"] = subevent.pk
res["positions"][0]["answers"][0]["question"] = question.pk
res["last_modified"] = order.last_modified.isoformat().replace('+00:00', 'Z')
res["fees"][0]["tax_rule"] = taxrule.pk
res["fees"][0]["id"] = fee.pk

resp = token_client.get('/api/v1/organizers/{}/events/{}/orders/?subevent_after={}'.format(
organizer.slug, event.slug,
Expand Down Expand Up @@ -304,6 +306,7 @@ def test_order_list(token_client, organizer, event, order, item, taxrule, questi
res = dict(TEST_ORDER_RES)
with scopes_disabled():
res["positions"][0]["id"] = order.positions.first().pk
res["fees"][0]["id"] = order.fees.first().pk
res["positions"][0]["item"] = item.pk
res["positions"][0]["answers"][0]["question"] = question.pk
res["last_modified"] = order.last_modified.isoformat().replace('+00:00', 'Z')
Expand Down
7 changes: 2 additions & 5 deletions src/tests/base/test_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,12 @@ class CacheTest(TestCase):
This test case tests the invalidation of the event related
cache.
"""
@classmethod
def setUpTestData(cls):
def setUp(self):
o = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
self.event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=now(),
)

def setUp(self):
self.cache = self.event.get_cache()
randint = random.random()
self.testkey = "test" + str(randint)
Expand Down
5 changes: 2 additions & 3 deletions src/tests/base/test_i18n.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,9 @@ class I18nFieldTest(TestCase):
"""
This test case tests the I18n*Field classes
"""
@classmethod
def setUpTestData(cls):
def setUp(self):
o = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
self.event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=now(),
)
Expand Down
11 changes: 5 additions & 6 deletions src/tests/base/test_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,15 @@ class LocaleDeterminationTest(TestCase):
This test case tests various methods around the properties /
variations concept.
"""
@classmethod
def setUpTestData(cls):
def setUp(self):
o = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
self.event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=now(), live=True
)
cls.TEST_LOCALE = 'de' if settings.LANGUAGE_CODE == 'en' else 'en'
cls.TEST_LOCALE_LONG = 'de-AT' if settings.LANGUAGE_CODE == 'en' else 'en-NZ'
cls.user = User.objects.create_user('[email protected]', 'dummy')
self.TEST_LOCALE = 'de' if settings.LANGUAGE_CODE == 'en' else 'en'
self.TEST_LOCALE_LONG = 'de-AT' if settings.LANGUAGE_CODE == 'en' else 'en-NZ'
self.user = User.objects.create_user('[email protected]', 'dummy')

def test_global_default(self):
c = Client()
Expand Down
17 changes: 6 additions & 11 deletions src/tests/base/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1741,8 +1741,7 @@ class ItemCategoryTest(TestCase):
This test case tests various methods around the category model.
"""

@classmethod
def setUpTestData(cls):
def setUp(cls):
cls.o = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
organizer=cls.o, name='Dummy', slug='dummy',
Expand Down Expand Up @@ -1770,8 +1769,7 @@ class ItemTest(TestCase):
This test case tests various methods around the item model.
"""

@classmethod
def setUpTestData(cls):
def setUp(cls):
cls.o = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
organizer=cls.o, name='Dummy', slug='dummy',
Expand Down Expand Up @@ -1847,8 +1845,7 @@ def test_availability_filter(self):


class EventTest(TestCase):
@classmethod
def setUpTestData(cls):
def setUp(cls):
cls.organizer = Organizer.objects.create(name='Dummy', slug='dummy')

@classscope(attr='organizer')
Expand Down Expand Up @@ -1961,7 +1958,7 @@ def test_copy(self):

@classscope(attr='organizer')
def test_presale_has_ended(self):
event = Event(
event = Event.objects.create(
organizer=self.organizer, name='Download', slug='download',
date_from=now()
)
Expand Down Expand Up @@ -2094,8 +2091,7 @@ def test_active_quotas_annotation_variation(self):


class SubEventTest(TestCase):
@classmethod
def setUpTestData(cls):
def setUp(cls):
cls.organizer = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
organizer=cls.organizer, name='Dummy', slug='dummy',
Expand Down Expand Up @@ -2189,8 +2185,7 @@ def test_file_handling(self):


class CheckinListTestCase(TestCase):
@classmethod
def setUpTestData(cls):
def setUp(cls):
cls.organizer = Organizer.objects.create(name='Dummy', slug='dummy')
with scope(organizer=cls.organizer):
cls.event = Event.objects.create(
Expand Down
12 changes: 12 additions & 0 deletions src/tests/base/test_orders.py
Original file line number Diff line number Diff line change
Expand Up @@ -2556,6 +2556,9 @@ def test_autocheckin(clist_autocheckin, event):
clist_autocheckin.auto_checkin_sales_channels = []
clist_autocheckin.save()

cp1 = CartPosition.objects.create(
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
order = _create_order(event, email='[email protected]', positions=[cp1],
now_dt=today, payment_provider=FreeOrderProvider(event),
locale='de')[0]
Expand All @@ -2578,17 +2581,26 @@ def test_saleschannel_testmode_restriction(event):
locale='de', sales_channel='web')[0]
assert not order.testmode

cp1 = CartPosition.objects.create(
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
order = _create_order(event, email='[email protected]', positions=[cp1],
now_dt=today, payment_provider=FreeOrderProvider(event),
locale='de', sales_channel=FoobazSalesChannel.identifier)[0]
assert not order.testmode

event.testmode = True
cp1 = CartPosition.objects.create(
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
order = _create_order(event, email='[email protected]', positions=[cp1],
now_dt=today, payment_provider=FreeOrderProvider(event),
locale='de', sales_channel='web')[0]
assert order.testmode

cp1 = CartPosition.objects.create(
item=ticket, price=23, expires=now() + timedelta(days=1), event=event, cart_id="123"
)
order = _create_order(event, email='[email protected]', positions=[cp1],
now_dt=today, payment_provider=FreeOrderProvider(event),
locale='de', sales_channel=FoobazSalesChannel.identifier)[0]
Expand Down
2 changes: 1 addition & 1 deletion src/tests/base/test_permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def admin():
def admin_request(admin, client):
factory = RequestFactory()
r = factory.get('/')
SessionMiddleware().process_request(r)
SessionMiddleware(NotImplementedError).process_request(r)
r.session.save()
admin.staffsession_set.create(date_start=now(), session_key=r.session.session_key)
admin.staffsession_set.create(date_start=now(), session_key=client.session.session_key)
Expand Down
5 changes: 2 additions & 3 deletions src/tests/base/test_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,9 @@ class PluginSignalTest(TestCase):
"""
This test case tests the EventPluginSignal handler
"""
@classmethod
def setUpTestData(cls):
def setUp(self):
o = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
self.event = Event.objects.create(
organizer=o, name='Dummy', slug='dummy',
date_from=now(),
)
Expand Down
11 changes: 4 additions & 7 deletions src/tests/base/test_waitinglist.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,12 @@


class WaitingListTestCase(TestCase):
@classmethod
def setUpTestData(cls):
cls.o = Organizer.objects.create(name='Dummy', slug='dummy')
cls.event = Event.objects.create(
organizer=cls.o, name='Dummy', slug='dummy',
def setUp(self):
self.o = Organizer.objects.create(name='Dummy', slug='dummy')
self.event = Event.objects.create(
organizer=self.o, name='Dummy', slug='dummy',
date_from=now(), live=True
)

def setUp(self):
djmail.outbox = []
with scope(organizer=self.o):
self.quota = Quota.objects.create(name="Test", size=2, event=self.event)
Expand Down
Loading

0 comments on commit 106db31

Please sign in to comment.