mirror of
https://github.com/pretix/pretix.git
synced 2026-08-07 10:17:49 +00:00
more stuff
This commit is contained in:
@@ -266,8 +266,7 @@ multiple events. Receivers should return a subclass of pretix.base.exporter.Base
|
||||
The ``sender`` keyword argument will contain an organizer.
|
||||
"""
|
||||
|
||||
validate_order = EventPluginSignal(
|
||||
)
|
||||
validate_order = EventPluginSignal()
|
||||
"""
|
||||
Arguments: ``payment_provider``, ``positions``, ``email``, ``locale``, ``invoice_address``, ``meta_info``
|
||||
|
||||
@@ -413,10 +412,10 @@ the deletion of the order.
|
||||
As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
|
||||
"""
|
||||
|
||||
checkin_created = EventPluginSignal(
|
||||
providing_args=["checkin"],
|
||||
)
|
||||
checkin_created = EventPluginSignal()
|
||||
"""
|
||||
Arguments: ``checkin``
|
||||
|
||||
This signal is sent out every time a check-in is created (i.e. an order position is marked as
|
||||
checked in). It is not send if the position was already checked in and is force-checked-in a second time.
|
||||
The check-in object is given as the first argument
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import collections
|
||||
import collections.abc
|
||||
import warnings
|
||||
|
||||
from django.core.paginator import (
|
||||
@@ -65,7 +65,7 @@ class PaginationMixin:
|
||||
return ctx
|
||||
|
||||
|
||||
class LargeResultSetPage(collections.Sequence):
|
||||
class LargeResultSetPage(collections.abc.Sequence):
|
||||
|
||||
def __init__(self, object_list, number, paginator):
|
||||
self.object_list = object_list
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import copy
|
||||
|
||||
from django.core.files import File
|
||||
from django.db import models
|
||||
|
||||
|
||||
@@ -16,7 +17,8 @@ def modelcopy(obj: models.Model):
|
||||
n = obj.__class__()
|
||||
for f in obj._meta.fields:
|
||||
val = getattr(obj, f.name)
|
||||
if isinstance(val, models.Model):
|
||||
print(f, f.name, val)
|
||||
if isinstance(val, (models.Model, File)):
|
||||
setattr(n, f.name, copy.copy(val))
|
||||
else:
|
||||
setattr(n, f.name, copy.deepcopy(val))
|
||||
|
||||
@@ -274,7 +274,7 @@ class BadgeExporter(BaseExporter):
|
||||
resolved_name=Coalesce('attendee_name_parts', 'addon_to__attendee_name_parts',
|
||||
'order__invoice_address__name_parts')
|
||||
).order_by(
|
||||
f'resolved_name_part__{part}'
|
||||
f'resolved_name__{part}'
|
||||
)
|
||||
|
||||
outbuffer = render_pdf(self.event, qs, OPTIONS[form_data.get('rendering', 'one')])
|
||||
|
||||
@@ -4,7 +4,7 @@ from datetime import datetime, time, timedelta
|
||||
import dateutil.parser
|
||||
from django import forms
|
||||
from django.db.models import (
|
||||
Case, Exists, Max, OuterRef, Q, Subquery, Value, When,
|
||||
Case, Exists, Max, OuterRef, Q, Subquery, Value, When, F,
|
||||
)
|
||||
from django.db.models.functions import Coalesce, NullIf
|
||||
from django.urls import reverse
|
||||
@@ -178,13 +178,17 @@ class CheckInListMixin(BaseExporter):
|
||||
part = sort[5:]
|
||||
qs = qs.annotate(
|
||||
resolved_name=Case(
|
||||
When(attendee_name_cached__ne='', then='attendee_name_parts'),
|
||||
When(addon_to__attendee_name_cached__isnull=False, addon_to__attendee_name_cached__ne='', then='addon_to__attendee_name_parts'),
|
||||
default='order__invoice_address__name_parts',
|
||||
)
|
||||
When(attendee_name_cached__isnull=False, attendee_name_cached__ne='',
|
||||
then='attendee_name_parts'),
|
||||
When(addon_to__attendee_name_cached__isnull=False, addon_to__attendee_name_cached__ne='',
|
||||
then='addon_to__attendee_name_parts'),
|
||||
default='order__invoice_address__name_parts',
|
||||
),
|
||||
).annotate(
|
||||
resolved_name_part=F(f'resolved_name__{part}')
|
||||
).order_by(
|
||||
*o,
|
||||
f'resolved_name_part__{part}'
|
||||
f'resolved_name__{part}'
|
||||
)
|
||||
|
||||
if form_data.get('attention_only'):
|
||||
|
||||
@@ -36,10 +36,10 @@ class AllTicketsPDF(BaseExporter):
|
||||
choices=[
|
||||
('name', _('Attendee name')),
|
||||
('code', _('Order code')),
|
||||
] + [
|
||||
] + ([
|
||||
('name:{}'.format(k), _('Attendee name: {part}').format(part=label))
|
||||
for k, label, w in name_scheme['fields']
|
||||
],
|
||||
] if name_scheme else [])
|
||||
)),
|
||||
]
|
||||
)
|
||||
@@ -67,7 +67,7 @@ class AllTicketsPDF(BaseExporter):
|
||||
qs = qs.annotate(
|
||||
resolved_name=Coalesce('attendee_name_parts', 'addon_to__attendee_name_parts', 'order__invoice_address__name_parts')
|
||||
).order_by(
|
||||
f'resolved_name_part__{part}'
|
||||
f'resolved_name__{part}'
|
||||
)
|
||||
|
||||
o = PdfTicketOutput(Event.objects.none())
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import time
|
||||
from datetime import date, timedelta
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import pytest
|
||||
from django.conf import settings
|
||||
@@ -314,7 +314,7 @@ class Login2FAFormTest(TestCase):
|
||||
d = TOTPDevice.objects.create(user=self.user, name='test')
|
||||
totp = TOTP(d.bin_key, d.step, d.t0, d.digits, d.drift)
|
||||
totp.time = time.time()
|
||||
response = self.client.post('/control/login/2fa'.format(d.pk), {
|
||||
response = self.client.post('/control/login/2fa', {
|
||||
'token': str(totp.token() + 2)
|
||||
})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
@@ -326,7 +326,7 @@ class Login2FAFormTest(TestCase):
|
||||
d = TOTPDevice.objects.create(user=self.user, name='test')
|
||||
totp = TOTP(d.bin_key, d.step, d.t0, d.digits, d.drift)
|
||||
totp.time = time.time()
|
||||
response = self.client.post('/control/login/2fa?next=/control/events/'.format(d.pk), {
|
||||
response = self.client.post('/control/login/2fa?next=/control/events/', {
|
||||
'token': str(totp.token())
|
||||
})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
@@ -350,7 +350,7 @@ class Login2FAFormTest(TestCase):
|
||||
|
||||
response = self.client.get('/control/login/2fa')
|
||||
assert 'token' in response.content.decode()
|
||||
response = self.client.post('/control/login/2fa'.format(d.pk), {
|
||||
response = self.client.post('/control/login/2fa', {
|
||||
'token': '{"response": "true"}'
|
||||
})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
@@ -372,7 +372,7 @@ class Login2FAFormTest(TestCase):
|
||||
|
||||
response = self.client.get('/control/login/2fa')
|
||||
assert 'token' in response.content.decode()
|
||||
response = self.client.post('/control/login/2fa'.format(d.pk), {
|
||||
response = self.client.post('/control/login/2fa', {
|
||||
'token': '{"response": "true"}'
|
||||
})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
@@ -493,8 +493,8 @@ class PasswordRecoveryFormTest(TestCase):
|
||||
|
||||
def test_recovery_expired_token(self):
|
||||
class Mocked(PasswordResetTokenGenerator):
|
||||
def _today(self):
|
||||
return date.today() - timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS + 1)
|
||||
def _now(self):
|
||||
return datetime.now() - timedelta(seconds=settings.PASSWORD_RESET_TIMEOUT + 3600)
|
||||
|
||||
generator = Mocked()
|
||||
token = generator.make_token(self.user)
|
||||
|
||||
@@ -119,8 +119,6 @@ def test_csv_order_by_name_parts(event): # noqa
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_csv_order_by_inherited_name_parts(event): # noqa
|
||||
from django.conf import settings
|
||||
|
||||
with scope(organizer=event.organizer):
|
||||
OrderPosition.objects.filter(attendee_name_cached__icontains="Andrea").delete()
|
||||
op = OrderPosition.objects.get()
|
||||
|
||||
Reference in New Issue
Block a user