Compare commits

...

23 Commits

Author SHA1 Message Date
Richard Schreiber
17715ff5a5 Control: fix yes/no-question not being optional in order edit form 2023-03-06 09:08:20 +01:00
Raphael Michel
9bed40fa09 Add name of waiting list entry to voucher 2023-03-03 14:42:32 +01:00
Raphael Michel
ed1dae5fde API: Fix duplicate results when filtering orders 2023-03-03 14:36:40 +01:00
Richard Schreiber
c7060d188f Product list: Indent variations, improve alignment of price and quantity (#3135) 2023-03-03 14:26:11 +01:00
Raphael Michel
9a53dc9c5e Move from PyPDF2 to pypdf again 2023-03-03 14:06:01 +01:00
dependabot[bot]
d1e0a7293b Bump @babel/core from 7.20.12 to 7.21.0 in /src/pretix/static/npm_dir (#3140)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-02 14:06:59 +01:00
Raphael Michel
7d5b1eebcb Fix type error in SafeWorksheet 2023-03-02 11:54:49 +01:00
Raphael Michel
e4a02c494e Event settings: Clarify low_availability_percentage is a percentage 2023-03-02 10:56:24 +01:00
Raphael Michel
6ecac70727 shred_log_fields: Only mark shredded if something happened 2023-03-02 10:56:14 +01:00
Raphael Michel
8a1554323e Mail settings: Fix preview for mail_text_order_pending_warning 2023-03-01 16:31:52 +01:00
Raphael Michel
cfc22c806a Fix possible crash in OrderChangeManager (PRETIXEU-7ZY) 2023-03-01 13:55:07 +01:00
Raphael Michel
f70d6877dc Limit maximum value of transaction at gift card creation (PRETIXEU-870) 2023-03-01 13:32:03 +01:00
Raphael Michel
4dfad2ef42 Translations: Update Portuguese (Portugal)
Currently translated at 93.8% (4860 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2023-03-01 10:51:56 +01:00
Raphael Michel
dc1d35cb1f Translations: Update Portuguese (Portugal)
Currently translated at 93.8% (4861 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2023-03-01 10:51:56 +01:00
Raphael Michel
6e657db882 Translations: Update Portuguese (Portugal)
Currently translated at 93.8% (4861 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2023-03-01 10:51:56 +01:00
Raphael Michel
91d3aaf20b Translations: Update Italian
Currently translated at 18.1% (938 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/it/

powered by weblate
2023-03-01 10:51:56 +01:00
Raphael Michel
2f1318e2b9 Translations: Update Portuguese (Portugal)
Currently translated at 93.8% (4861 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2023-03-01 10:51:56 +01:00
Daniel Lopez
844a74d33f Translations: Update Finnish
Currently translated at 17.0% (885 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fi/

powered by weblate
2023-03-01 10:51:56 +01:00
Vasco Baleia
76788a874a Translations: Update Portuguese (Portugal)
Currently translated at 93.9% (4862 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2023-03-01 10:51:56 +01:00
Michele Pagnozzi
e29d5c37cd Translations: Update Italian
Currently translated at 18.1% (938 of 5177 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/it/

powered by weblate
2023-03-01 10:51:56 +01:00
Raphael Michel
258e66587e Address form: Fix state selection for Mexico to include Mexico City 2023-03-01 09:57:12 +01:00
Raphael Michel
d13af2eeab Translations: Use more neutral term for taxes in German due to different terminology in Switzerland 2023-02-27 12:13:06 +01:00
Raphael Michel
14b9afcc40 Bump version to 4.18.0.dev0 2023-02-27 09:27:42 +01:00
31 changed files with 871 additions and 1537 deletions

View File

@@ -19,4 +19,4 @@
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
__version__ = "4.17.0"
__version__ = "4.18.0.dev0"

View File

@@ -105,9 +105,9 @@ with scopes_disabled():
subevent_after = django_filters.IsoDateTimeFilter(method='subevent_after_qs')
subevent_before = django_filters.IsoDateTimeFilter(method='subevent_before_qs')
search = django_filters.CharFilter(method='search_qs')
item = django_filters.CharFilter(field_name='all_positions', lookup_expr='item_id')
variation = django_filters.CharFilter(field_name='all_positions', lookup_expr='variation_id')
subevent = django_filters.CharFilter(field_name='all_positions', lookup_expr='subevent_id')
item = django_filters.CharFilter(field_name='all_positions', lookup_expr='item_id', distinct=True)
variation = django_filters.CharFilter(field_name='all_positions', lookup_expr='variation_id', distinct=True)
subevent = django_filters.CharFilter(field_name='all_positions', lookup_expr='subevent_id', distinct=True)
class Meta:
model = Order

View File

@@ -719,7 +719,7 @@ class BaseQuestionsForm(forms.Form):
label = escape(q.question) # django-bootstrap3 calls mark_safe
required = q.required and not self.all_optional
if q.type == Question.TYPE_BOOLEAN:
if q.required:
if required:
# For some reason, django-bootstrap3 does not set the required attribute
# itself.
widget = forms.CheckboxInput(attrs={'required': 'required'})

View File

@@ -188,6 +188,9 @@ class WaitingListEntry(LoggedModel):
raise WaitingListException(_('This entry is anonymized and can no longer be used.'))
with transaction.atomic():
e = self.email
if self.name:
e += ' / ' + self.name
v = Voucher.objects.create(
event=self.event,
max_usages=1,
@@ -196,7 +199,7 @@ class WaitingListEntry(LoggedModel):
variation=self.variation,
tag='waiting-list',
comment=_('Automatically created from waiting list entry for {email}').format(
email=self.email
email=e
),
block_quota=True,
subevent=self.subevent,

View File

@@ -2516,7 +2516,7 @@ class OrderChangeManager:
positions_to_fake_cart[op.position].seat = op.seat
elif isinstance(op, self.MembershipOperation):
positions_to_fake_cart[op.position].used_membership = op.membership
elif isinstance(op, self.CancelOperation):
elif isinstance(op, self.CancelOperation) and op.position in positions_to_fake_cart:
fake_cart.remove(positions_to_fake_cart[op.position])
elif isinstance(op, self.AddOperation):
cp = CartPosition(

View File

@@ -3243,7 +3243,7 @@ COUNTRIES_WITH_STATE_IN_ADDRESS = {
'CA': (['Province', 'Territory'], 'short'),
# 'CN': (['Province', 'Autonomous region', 'Munincipality'], 'long'),
'MY': (['State'], 'long'),
'MX': (['State', 'Federal District'], 'short'),
'MX': (['State', 'Federal district'], 'short'),
'US': (['State', 'Outlying area', 'District'], 'short'),
}

View File

@@ -151,16 +151,19 @@ class BaseDataShredder:
def shred_log_fields(logentry, banlist=None, whitelist=None):
d = logentry.parsed_data
shredded = False
if whitelist:
for k, v in d.items():
if k not in whitelist:
d[k] = ''
shredded = True
elif banlist:
for f in banlist:
if f in d:
d[f] = ''
shredded = True
logentry.data = json.dumps(d)
logentry.shredded = True
logentry.shredded = logentry.shredded or shredded
logentry.save(update_fields=['data', 'shredded'])

View File

@@ -1213,6 +1213,7 @@ class MailSettingsForm(SettingsForm):
'mail_subject_order_canceled': ['event', 'order', 'comment'],
'mail_text_order_expire_warning': ['event', 'order'],
'mail_subject_order_expire_warning': ['event', 'order'],
'mail_text_order_pending_warning': ['event', 'order'],
'mail_subject_order_pending_warning': ['event', 'order'],
'mail_text_order_incomplete_payment': ['event', 'order', 'pending_sum'],
'mail_subject_order_incomplete_payment': ['event', 'order'],

View File

@@ -578,7 +578,8 @@ class WebHookForm(forms.ModelForm):
class GiftCardCreateForm(forms.ModelForm):
value = forms.DecimalField(
label=_('Gift card value'),
min_value=Decimal('0.00')
min_value=Decimal('0.00'),
max_value=Decimal('99999999.99'),
)
def __init__(self, *args, **kwargs):

View File

@@ -315,7 +315,7 @@
{% if sform.event_list_available_only %}
{% bootstrap_field sform.event_list_available_only layout="control" %}
{% endif %}
{% bootstrap_field sform.low_availability_percentage layout="control" %}
{% bootstrap_field sform.low_availability_percentage layout="control" addon_after="%" %}
{% url "control:organizer.edit" organizer=request.organizer.slug as org_url %}
{% propagated request.event org_url "meta_noindex" %}

View File

@@ -20,6 +20,7 @@
# <https://www.gnu.org/licenses/>.
#
import re
import types
from inspect import isgenerator
from openpyxl import Workbook
@@ -140,9 +141,9 @@ class SafeWorkbook(Workbook):
# monkeypatch existing sheets
for s in self._sheets:
if self.write_only:
s.append = SafeWriteOnlyWorksheet.append
s.append = types.MethodType(SafeWriteOnlyWorksheet.append, s)
else:
s.append = SafeWorksheet.append
s.append = types.MethodType(SafeWorksheet.append, s)
def create_sheet(self, title=None, index=None):
if self.read_only:

View File

@@ -2925,7 +2925,7 @@ msgstr "Steuer"
#: pretix/base/invoice.py:749
msgctxt "invoice"
msgid "Included taxes"
msgstr "Enthaltene Umsatzsteuer"
msgstr "Enthaltene Steuern"
#: pretix/base/invoice.py:777
#, python-brace-format

View File

@@ -2925,7 +2925,7 @@ msgstr "Steuer"
#: pretix/base/invoice.py:749
msgctxt "invoice"
msgid "Included taxes"
msgstr "Enthaltene Umsatzsteuer"
msgstr "Enthaltene Steuern"
#: pretix/base/invoice.py:777
#, python-brace-format

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-27 08:00+0000\n"
"PO-Revision-Date: 2022-09-08 20:00+0000\n"
"Last-Translator: Mika Lammi <mika.lammi@gmail.com>\n"
"PO-Revision-Date: 2023-03-01 08:57+0000\n"
"Last-Translator: Daniel Lopez <daniellopez2000@outlook.com>\n"
"Language-Team: Finnish <https://translate.pretix.eu/projects/pretix/pretix/"
"fi/>\n"
"Language: fi\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.14\n"
"X-Generator: Weblate 4.15.2\n"
#: htmlcov/pretix_control_views_dashboards_py.html:963
#: pretix/control/templates/pretixcontrol/events/index.html:140
@@ -55,6 +55,8 @@ msgid ""
"Full device access (reading and changing orders and gift cards, reading of "
"products and settings)"
msgstr ""
"Täysi käyttöoikeus laitteeseen (tilausten ja lahjakorttien lukeminen ja "
"muuttaminen, tuotteiden ja asetusten lukeminen)"
#: pretix/api/auth/devicesecurity.py:53
msgid "pretixSCAN"
@@ -186,6 +188,8 @@ msgid ""
"Updating add-ons, bundles, or variations via PATCH/PUT is not supported. "
"Please use the dedicated nested endpoint."
msgstr ""
"Lisäosien, pakettien tai muunnelmien päivittäminen PATCH/PUTin kautta ei ole "
"tuettu. Ole hyvä ja käytä siihen varattua sisäkkäistä päätepistettä."
#: pretix/api/serializers/item.py:268
msgid "Only admission products can currently be personalized."
@@ -224,7 +228,7 @@ msgstr "Tämän tyyppistä kysymystä ei voi kysyä ilmoittautuessa."
#: pretix/api/serializers/order.py:75
#, python-brace-format
msgid "\"{input}\" is not a valid choice."
msgstr ""
msgstr "\"{input}\" ei ole pätevä valinta."
#: pretix/api/serializers/order.py:1177 pretix/api/views/cart.py:210
#: pretix/base/services/orders.py:1415
@@ -247,6 +251,8 @@ msgid ""
"A gift card with the same secret already exists in your or an affiliated "
"organizer account."
msgstr ""
"Lahjakortti, jolla on sama salaisuus, on jo olemassa sinun tai siihen "
"liittyvän järjestäjän tilillä."
#: pretix/api/serializers/organizer.py:230
#: pretix/control/views/organizer.py:723
@@ -264,11 +270,9 @@ msgid "This user already has permissions for this team."
msgstr "Tällä käyttäjällä on jo oikeudet tähän tiimiin."
#: pretix/api/views/cart.py:199
#, fuzzy
#| msgid "A voucher has already been sent to this person."
msgid ""
"The specified voucher has already been used the maximum number of times."
msgstr "Tälle henkilölle on jo lähetetty kuponki."
msgstr "Kyseistä kuponkia on jo käytetty enimmäismäärä kertoja."
#: pretix/api/views/oauth.py:106 pretix/control/logdisplay.py:457
#, python-brace-format
@@ -416,6 +420,8 @@ msgid ""
"Product changed (including product added or deleted and including changes to "
"nested objects like variations or bundles)"
msgstr ""
"Tuote muuttunut (mukaan lukien lisätty tai poistettu tuote tai muutoksia "
"sisäkkäisiin objekteihin, kuten variaatioihin tai niputuksiin)"
#: pretix/api/webhooks.py:306
msgid "Shop taken live"
@@ -443,15 +449,15 @@ msgstr "Kaupan testikäyttö on otettu pois päältä"
#: pretix/plugins/banktransfer/payment.py:631
#: pretix/presale/forms/customer.py:139
msgid "This field is required."
msgstr ""
msgstr "Tämä kenttä on pakollinen."
#: pretix/base/addressvalidation.py:213
msgid "Enter a postal code in the format XXX."
msgstr ""
msgstr "Syötä postinumero muodossa XXX."
#: pretix/base/addressvalidation.py:222 pretix/base/addressvalidation.py:224
msgid "Enter a postal code in the format XXXX."
msgstr ""
msgstr "Syötä postinumero muodossa XXX."
#: pretix/base/auth.py:143
#, python-brace-format
@@ -503,25 +509,27 @@ msgstr "lähdekoodi"
#: pretix/base/customersso/oidc.py:59
#, python-brace-format
msgid "Configuration option \"{name}\" is missing."
msgstr ""
msgstr "Määritysvaihtoehto \"{name}\" puuttuu."
#: pretix/base/customersso/oidc.py:67 pretix/base/customersso/oidc.py:72
#, python-brace-format
msgid ""
"Unable to retrieve configuration from \"{url}\". Error message: \"{error}\"."
msgstr ""
"Konfiguraatiota ei pystytä hakemaan osoitteesta \"{url}\". Virheilmoitus: \""
"{error}\"."
#: pretix/base/customersso/oidc.py:78 pretix/base/customersso/oidc.py:83
#: pretix/base/customersso/oidc.py:88 pretix/base/customersso/oidc.py:93
#: pretix/base/customersso/oidc.py:98 pretix/base/customersso/oidc.py:103
#, python-brace-format
msgid "Incompatible SSO provider: \"{error}\"."
msgstr ""
msgstr "Yhteensopimaton SSO-palveluntarjoaja: \"{error}\"."
#: pretix/base/customersso/oidc.py:109
#, python-brace-format
msgid "You are not requesting \"{scope}\"."
msgstr ""
msgstr "Et pyydä \"{scope}\"."
#: pretix/base/customersso/oidc.py:115
#, python-brace-format
@@ -529,6 +537,8 @@ msgid ""
"You are requesting scope \"{scope}\" but provider only supports these: "
"{scopes}."
msgstr ""
"Pyydät laajuutta \"{scope}\", mutta palveluntarjoaja tukee vain näitä: "
"{scopes}."
#: pretix/base/customersso/oidc.py:123
#, python-brace-format
@@ -536,6 +546,8 @@ msgid ""
"You are requesting field \"{field}\" but provider only supports these: "
"{fields}."
msgstr ""
"Pyydät kenttää \"{field}\", mutta palveluntarjoaja tukee vain näitä: "
"{fields}."
#: pretix/base/customersso/oidc.py:169 pretix/base/customersso/oidc.py:176
#: pretix/base/customersso/oidc.py:195 pretix/base/customersso/oidc.py:212
@@ -544,13 +556,15 @@ msgstr ""
#: pretix/presale/views/customer.py:792
#, python-brace-format
msgid "Login was not successful. Error message: \"{error}\"."
msgstr ""
msgstr "Sisäänkirjautuminen ei onnistunut. Virheilmoitus: \"{error}\"."
#: pretix/base/customersso/oidc.py:202
msgid ""
"The email address on this account is not yet verified. Please first confirm "
"the email address in your customer account."
msgstr ""
"Tämän tilin sähköpostiosoitetta ei ole vielä vahvistettu. Vahvista ensin "
"sähköpostiosoite asiakastililläsi."
#: pretix/base/email.py:200 pretix/base/exporters/items.py:151
#: pretix/base/exporters/items.py:195 pretix/control/views/main.py:310
@@ -583,7 +597,7 @@ msgstr "Esimerkkipääsylippu"
#: pretix/base/email.py:635
msgid "An individual text with a reason can be inserted here."
msgstr ""
msgstr "Tähän voidaan lisätä yksittäinen teksti perusteluineen."
#: pretix/base/email.py:639
msgid "The amount has been charged to your card."
@@ -596,7 +610,7 @@ msgstr "Ole hyvä ja siirrä raha tälle tilille: 9999-9999-9999-9999"
#: pretix/base/email.py:665 pretix/base/pdf.py:619 pretix/base/pdf.py:642
#: pretix/control/forms/organizer.py:520
msgid "Mr Doe"
msgstr ""
msgstr "hra Meikäläinen"
#: pretix/base/exporter.py:180 pretix/base/exporter.py:310
msgid "Export format"
@@ -620,7 +634,7 @@ msgstr "CSV (puolipisteillä erotettu)"
#: pretix/base/exporter.py:298
msgid "Combined Excel (.xlsx)"
msgstr ""
msgstr "Yhdistetty Excel (.xlsx)"
#: pretix/base/exporters/answers.py:52
msgid "Question answer file uploads"
@@ -643,6 +657,8 @@ msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"Lataa ZIP-tiedosto, joka sisältää kaikki tiedostot, jotka asiakkaasi ovat "
"ladanneet tilausta luodessaan."
#: pretix/base/exporters/answers.py:64 pretix/base/models/items.py:1502
#: pretix/control/navigation.py:182
@@ -666,6 +682,7 @@ msgstr "Asiakastilit"
#: pretix/base/exporters/customers.py:52
msgid "Download a spreadsheet of all currently registered customer accounts."
msgstr ""
"Lataa taulukko kaikista tällä hetkellä rekisteröidyistä asiakastileistä."
#: pretix/base/exporters/customers.py:64 pretix/base/models/customers.py:81
#: pretix/control/templates/pretixcontrol/organizers/customer.html:28
@@ -677,17 +694,15 @@ msgstr "Asiakastunnus"
#: pretix/base/exporters/customers.py:65
#: pretix/control/templates/pretixcontrol/organizers/customer.html:31
#, fuzzy
#| msgid "Payment provider"
msgid "SSO provider"
msgstr "Maksunvälittäjä"
msgstr "SSO-palveluntarjoaja"
#: pretix/base/exporters/customers.py:66 pretix/base/models/customers.py:107
#: pretix/control/templates/pretixcontrol/organizers/customer.html:35
#: pretix/control/templates/pretixcontrol/organizers/customers.html:65
#: pretix/control/templates/pretixcontrol/users/form.html:43
msgid "External identifier"
msgstr ""
msgstr "Ulkoinen tunniste"
#: pretix/base/exporters/customers.py:68 pretix/base/exporters/orderlist.py:250
#: pretix/base/exporters/orderlist.py:426
@@ -704,14 +719,14 @@ msgstr ""
#: pretix/presale/forms/waitinglist.py:101
#: pretix/presale/templates/pretixpresale/event/order.html:302
msgid "Phone number"
msgstr ""
msgstr "Puhelinnumero"
#: pretix/base/exporters/customers.py:69 pretix/base/models/auth.py:248
#: pretix/base/models/customers.py:96 pretix/base/models/orders.py:2884
#: pretix/base/settings.py:3150 pretix/base/settings.py:3161
#: pretix/control/templates/pretixcontrol/users/index.html:47
msgid "Full name"
msgstr ""
msgstr "Koko nimi"
#: pretix/base/exporters/customers.py:74 pretix/base/exporters/invoices.py:203
#: pretix/base/exporters/invoices.py:211 pretix/base/exporters/invoices.py:329

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-27 08:00+0000\n"
"PO-Revision-Date: 2023-01-31 23:00+0000\n"
"Last-Translator: Mauro Amico <mauro.amico@gmail.com>\n"
"PO-Revision-Date: 2023-03-01 09:12+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix/"
"it/>\n"
"Language: it\n"
@@ -197,6 +197,7 @@ msgstr ""
#: pretix/api/serializers/item.py:268
msgid "Only admission products can currently be personalized."
msgstr ""
"Solo i prodotti di tipo Admission possono al momento essere personalizzati."
#: pretix/api/serializers/item.py:279
msgid ""
@@ -235,7 +236,7 @@ msgstr "Questo tipo di domanda non può essere fatta durante il check-in."
#: pretix/api/serializers/order.py:75
#, python-brace-format
msgid "\"{input}\" is not a valid choice."
msgstr ""
msgstr "\"{input}\" non è una scelta valida."
#: pretix/api/serializers/order.py:1177 pretix/api/views/cart.py:210
#: pretix/base/services/orders.py:1415
@@ -281,6 +282,7 @@ msgstr "Questo utente è già stato inviatato a questo team."
msgid ""
"The specified voucher has already been used the maximum number of times."
msgstr ""
"Il voucher specificato è già stato utilizzato il numero massimo di volte."
#: pretix/api/views/oauth.py:106 pretix/control/logdisplay.py:457
#, python-brace-format
@@ -428,6 +430,8 @@ msgid ""
"Product changed (including product added or deleted and including changes to "
"nested objects like variations or bundles)"
msgstr ""
"Prodotto modificato (compresi i prodotti aggiunti od eliminati e comprese le "
"modifiche agli oggetti nidificati come varianti o pacchetti)"
#: pretix/api/webhooks.py:306
msgid "Shop taken live"
@@ -459,11 +463,11 @@ msgstr "Questo campo è obbligatorio."
#: pretix/base/addressvalidation.py:213
msgid "Enter a postal code in the format XXX."
msgstr ""
msgstr "Inserire un codice di avviamento postale nel formato XXX."
#: pretix/base/addressvalidation.py:222 pretix/base/addressvalidation.py:224
msgid "Enter a postal code in the format XXXX."
msgstr ""
msgstr "Inserire un codice di avviamento postale nel formato XXX."
#: pretix/base/auth.py:143
#, python-brace-format
@@ -543,6 +547,8 @@ msgid ""
"You are requesting scope \"{scope}\" but provider only supports these: "
"{scopes}."
msgstr ""
"Si richiede l'ambito \"{scope}\" ma il provider supporta solo questi: "
"{scopes}."
#: pretix/base/customersso/oidc.py:123
#, python-brace-format
@@ -550,6 +556,8 @@ msgid ""
"You are requesting field \"{field}\" but provider only supports these: "
"{fields}."
msgstr ""
"Si richiede il campo \"{field}\" ma il provider supporta solo questi: "
"{fields}."
#: pretix/base/customersso/oidc.py:169 pretix/base/customersso/oidc.py:176
#: pretix/base/customersso/oidc.py:195 pretix/base/customersso/oidc.py:212
@@ -558,13 +566,15 @@ msgstr ""
#: pretix/presale/views/customer.py:792
#, python-brace-format
msgid "Login was not successful. Error message: \"{error}\"."
msgstr ""
msgstr "L'accesso non è riuscito. Messaggio di errore: \"{error}\"."
#: pretix/base/customersso/oidc.py:202
msgid ""
"The email address on this account is not yet verified. Please first confirm "
"the email address in your customer account."
msgstr ""
"L'indirizzo e-mail di questo account non è ancora stato verificato. "
"Confermare prima l'indirizzo e-mail nel proprio account cliente."
#: pretix/base/email.py:200 pretix/base/exporters/items.py:151
#: pretix/base/exporters/items.py:195 pretix/control/views/main.py:310
@@ -648,17 +658,17 @@ msgstr "Risposte alle domande di invio file"
#: pretix/base/exporters/orderlist.py:1002
#: pretix/plugins/reports/exporters.py:405
#: pretix/plugins/reports/exporters.py:578
#, fuzzy
#| msgid "Order data"
msgctxt "export_category"
msgid "Order data"
msgstr "Data dell'ordine"
msgstr "Dati dell'ordine"
#: pretix/base/exporters/answers.py:54
msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"Scarica un file ZIP contenente tutti i file caricati dai clienti durante la "
"creazione di un ordine."
#: pretix/base/exporters/answers.py:64 pretix/base/models/items.py:1502
#: pretix/control/navigation.py:182

File diff suppressed because it is too large Load Diff

View File

@@ -51,8 +51,8 @@ from django.db.models import Exists, OuterRef, Q, Subquery
from django.db.models.functions import Cast, Coalesce
from django.utils.timezone import make_aware
from django.utils.translation import gettext as _, gettext_lazy, pgettext_lazy
from PyPDF2 import PdfMerger, PdfReader, PdfWriter, Transformation
from PyPDF2.generic import RectangleObject
from pypdf import PdfMerger, PdfReader, PdfWriter, Transformation
from pypdf.generic import RectangleObject
from reportlab.lib import pagesizes
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas

View File

@@ -40,7 +40,7 @@
{% if item.has_variations %}
<article aria-labelledby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-description"{% endif %} class="item-with-variations{% if event.settings.show_variations_expanded %} details-open{% endif %}" id="item-{{ item.pk }}">
<div class="row-fluid product-row headline">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
data-title="{{ item.name|force_escape|force_escape }}"
@@ -68,7 +68,7 @@
{% endif %}
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
<p>
{% if c.price_included %}
<span class="sr-only">{% trans "free" context "price" %}</span>
@@ -89,13 +89,14 @@
{% endif %}
</p>
</div>
<div class="col-md-2 col-xs-6 availability-box">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box">
{% if not event.settings.show_variations_expanded %}
<button type="button" data-toggle="variations" class="btn btn-default btn-block js-only"
data-label-alt="{% trans "Hide variants" %}"
aria-expanded="false"
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{item}}{% endblocktrans %}">
{% trans "Show variants" %}
<span>{% trans "Show variants" %}</span>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</button>
{% endif %}
</div>
@@ -104,7 +105,7 @@
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
{% for var in item.available_variations %}
<article aria-labelledby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row-fluid product-row variation">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
<h5 id="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-legend">{{ var }}</h5>
{% if var.description %}
<div id="cp-{{ form.pos.pk }}-item-{{ item.pk }}-{{ var.pk }}-description" class="variation-description">
@@ -115,7 +116,7 @@
{% include "pretixpresale/event/fragment_quota_left.html" with avail=var.cached_availability %}
{% endif %}
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
{% if not c.price_included %}
{% if var.original_price %}
<del><span class="sr-only">{% trans "Original price:" %}</span>
@@ -170,7 +171,7 @@
{% endif %}
</div>
{% if var.cached_availability.0 == 100 or var.initial %}
<div class="col-md-2 col-xs-6 availability-box available">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
{% if c.max_count == 1 or not c.multi_allowed %}
<label class="item-checkbox-label">
<input type="checkbox" value="1"
@@ -206,7 +207,7 @@
</article>
{% else %}
<article aria-labelledby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="cp-{{ form.pos.pk }}-item-{{ item.pk }}-description"{% endif %} class="row-fluid product-row simple">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
data-title="{{ item.name|force_escape|force_escape }}"
@@ -237,7 +238,7 @@
{% endif %}
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
<p>
{% if not c.price_included %}
{% if item.original_price %}
@@ -292,7 +293,7 @@
</p>
</div>
{% if item.cached_availability.0 == 100 or item.initial %}
<div class="col-md-2 col-xs-6 availability-box available">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
{% if c.max_count == 1 or not c.multi_allowed %}
<label class="item-checkbox-label">
<input type="checkbox" value="1"

View File

@@ -1,7 +1,7 @@
{% load i18n %}
{% load eventurl %}
{% if avail <= 10 %}
<div class="col-md-2 col-xs-6 availability-box gone">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box gone">
{% if price != None and not price %}
<strong>{% trans "FULLY BOOKED" %}</strong>
{% else %}
@@ -16,7 +16,7 @@
{% endif %}
</div>
{% elif avail < 100 %}
<div class="col-md-2 col-xs-6 availability-box unavailable">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
<strong>{% trans "Reserved" %}</strong>
<br/>
{% trans "All remaining products are reserved but might become available again." %}

View File

@@ -17,7 +17,7 @@
{% if item.has_variations %}
<article aria-labelledby="item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="item-{{ item.pk }}-description"{% endif %} class="item-with-variations{% if event.settings.show_variations_expanded %} details-open{% endif %}" id="item-{{ item.pk }}">
<div class="row product-row headline">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
data-title="{{ item.name|force_escape|force_escape }}"
@@ -46,7 +46,7 @@
{% endif %}
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
{% if item.free_price %}
{% blocktrans trimmed with price=item.min_price|money:event.currency %}
from {{ price }}
@@ -64,7 +64,7 @@
{{ item.min_price|money:event.currency }}
{% endif %}
</div>
<div class="col-md-2 col-xs-6 availability-box">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box">
{% if not event.settings.show_variations_expanded %}
{% if item.best_variation_availability <= 10 %}
{% if not item.min_price %}
@@ -89,7 +89,8 @@
data-label-alt="{% trans "Hide variants" %}"
aria-expanded="false"
aria-label="{% blocktrans trimmed with item=item.name count=item.available_variations|length %}Show {{count}} variants of {{ item }}{% endblocktrans %}">
{% trans "Show variants" %}
<span>{% trans "Show variants" %}</span>
<i class="fa fa-angle-down collapse-indicator" aria-hidden="true"></i>
</button>
{% endif %}
</div>
@@ -98,7 +99,7 @@
<div class="variations {% if not event.settings.show_variations_expanded %}variations-collapsed{% endif %}">
{% for var in item.available_variations %}
<article aria-labelledby="item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row product-row variation" id="item-{{ item.pk }}-{{ var.pk }}">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
<h5 id="item-{{ item.pk }}-{{ var.pk }}-legend">{{ var }}</h5>
{% if var.description %}
<div id="item-{{ item.pk }}-{{ var.pk }}-description" class="variation-description">
@@ -109,7 +110,7 @@
{% include "pretixpresale/event/fragment_quota_left.html" with avail=var.cached_availability %}
{% endif %}
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
{% if var.original_price %}
<p>
<del><span class="sr-only">{% trans "Original price:" %}</span>
@@ -173,11 +174,11 @@
</p>
</div>
{% if item.require_voucher %}
<div class="col-md-2 col-xs-6 availability-box unavailable">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
<p><small><a href="#voucher">{% trans "Enter a voucher code below to buy this ticket." %}</a></small></p>
</div>
{% elif var.cached_availability.0 == 100 %}
<div class="col-md-2 col-xs-6 availability-box available">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
{% if var.order_max == 1 %}
<label class="item-checkbox-label">
<input type="checkbox" value="1"
@@ -213,7 +214,7 @@
</article>
{% else %}
<article aria-labelledby="item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="item-{{ item.pk }}-description"{% endif %} class="row product-row simple" id="item-{{ item.pk }}">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
data-title="{{ item.name|force_escape|force_escape }}"
@@ -245,7 +246,7 @@
{% endif %}
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
{% if item.original_price %}
<p>
<del><span class="sr-only">{% trans "Original price:" %}</span>
@@ -307,11 +308,11 @@
</p>
</div>
{% if item.require_voucher %}
<div class="col-md-2 col-xs-6 availability-box unavailable">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box unavailable">
<p><small><a href="#voucher">{% trans "Enter a voucher code below to buy this ticket." %}</a></small></p>
</div>
{% elif item.cached_availability.0 == 100 %}
<div class="col-md-2 col-xs-6 availability-box available">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available">
{% if item.order_max == 1 %}
<label class="item-checkbox-label">
<input type="checkbox" value="1" {% if itemnum == 1 %}checked{% endif %}

View File

@@ -121,7 +121,7 @@
{% if item.has_variations %}
<article aria-labelledby="item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="item-{{ item.pk }}-description"{% endif %} class="item-with-variations" id="item-{{ item.pk }}">
<div class="row product-row headline">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
data-title="{{ item.name|force_escape|force_escape }}"
@@ -143,7 +143,7 @@
{% endif %}
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
{% if item.min_price != item.max_price or item.free_price %}
{% blocktrans trimmed with minprice=item.min_price|money:event.currency %}
from {{ minprice }}
@@ -156,14 +156,14 @@
{{ item.min_price|money:event.currency }}
{% endif %}
</div>
<div class="col-md-2 col-xs-6 availability-box">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box">
</div>
<div class="clearfix"></div>
</div>
<div class="variations">
{% for var in item.available_variations %}
<article aria-labelledby="item-{{ item.pk }}-{{ var.pk }}-legend"{% if var.description %} aria-describedby="item-{{ item.pk }}-{{ var.pk }}-description"{% endif %} class="row product-row variation" id="item-{{ item.pk }}-{{ var.pk }}">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
<h5 id="item-{{ item.pk }}-{{ var.pk }}-legend">{{ var }}</h5>
{% if var.description %}
<div id="item-{{ item.pk }}-{{ var.pk }}-description" class="variation-description">
@@ -174,7 +174,7 @@
{% include "pretixpresale/event/fragment_quota_left.html" with avail=var.cached_availability %}
{% endif %}
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
{% if var.original_price %}
<p>
<del><span class="sr-only">{% trans "Original price:" %}</span>
@@ -236,7 +236,7 @@
</p>
</div>
{% if var.cached_availability.0 == 100 %}
<div class="col-md-2 col-xs-6 availability-box available radio-box">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available radio-box">
{% if max_times > 1 %}
{% if var.order_max == 1 %}
<label class="item-checkbox-label">
@@ -278,7 +278,7 @@
</article>
{% else %}
<article aria-labelledby="item-{{ item.pk }}-legend"{% if item.description %} aria-describedby="item-{{ item.pk }}-description"{% endif %} class="row product-row simple" id="item-{{ item.pk }}">
<div class="col-md-8 col-xs-12">
<div class="col-md-8 col-sm-6 col-xs-12">
{% if item.picture %}
<a href="{{ item.picture.url }}" class="productpicture"
data-title="{{ item.name|force_escape|force_escape }}"
@@ -310,7 +310,7 @@
{% endif %}
</div>
</div>
<div class="col-md-2 col-xs-6 price">
<div class="col-md-2 col-sm-3 col-xs-6 price">
{% if item.original_price %}
<p>
<del><span class="sr-only">{% trans "Original price:" %}</span>
@@ -370,7 +370,7 @@
</p>
</div>
{% if item.cached_availability.0 == 100 %}
<div class="col-md-2 col-xs-6 availability-box available radio-box">
<div class="col-md-2 col-sm-3 col-xs-6 availability-box available radio-box">
{% if max_times > 1 %}
{% if item.order_max == 1 %}
<label class="item-checkbox-label">

View File

@@ -8,7 +8,7 @@
"name": "pretix",
"version": "0.0.0",
"dependencies": {
"@babel/core": "^7.20.12",
"@babel/core": "^7.21.0",
"@babel/preset-env": "^7.20.2",
"@rollup/plugin-babel": "^6.0.3",
"@rollup/plugin-node-resolve": "^15.0.1",
@@ -50,20 +50,20 @@
}
},
"node_modules/@babel/core": {
"version": "7.20.12",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
"integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
"integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.20.7",
"@babel/generator": "^7.21.0",
"@babel/helper-compilation-targets": "^7.20.7",
"@babel/helper-module-transforms": "^7.20.11",
"@babel/helpers": "^7.20.7",
"@babel/parser": "^7.20.7",
"@babel/helper-module-transforms": "^7.21.0",
"@babel/helpers": "^7.21.0",
"@babel/parser": "^7.21.0",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.12",
"@babel/types": "^7.20.7",
"@babel/traverse": "^7.21.0",
"@babel/types": "^7.21.0",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -98,12 +98,13 @@
}
},
"node_modules/@babel/generator": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
"integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
"version": "7.21.1",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
"integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
"dependencies": {
"@babel/types": "^7.20.7",
"@babel/types": "^7.21.0",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
},
"engines": {
@@ -264,12 +265,12 @@
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
"integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"dependencies": {
"@babel/template": "^7.18.10",
"@babel/types": "^7.19.0"
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
},
"engines": {
"node": ">=6.9.0"
@@ -309,9 +310,9 @@
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.20.11",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
"integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
"integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
"dependencies": {
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-module-imports": "^7.18.6",
@@ -319,8 +320,8 @@
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.10",
"@babel/types": "^7.20.7"
"@babel/traverse": "^7.21.2",
"@babel/types": "^7.21.2"
},
"engines": {
"node": ">=6.9.0"
@@ -449,13 +450,13 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
"integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
"integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
"dependencies": {
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/traverse": "^7.21.0",
"@babel/types": "^7.21.0"
},
"engines": {
"node": ">=6.9.0"
@@ -475,9 +476,9 @@
}
},
"node_modules/@babel/parser": {
"version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
"integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
"integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -1541,18 +1542,18 @@
}
},
"node_modules/@babel/traverse": {
"version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
"integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz",
"integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
"dependencies": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.20.7",
"@babel/generator": "^7.21.1",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.20.13",
"@babel/types": "^7.20.7",
"@babel/parser": "^7.21.2",
"@babel/types": "^7.21.2",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -1561,9 +1562,9 @@
}
},
"node_modules/@babel/types": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
"integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
"integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
"dependencies": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
@@ -1594,9 +1595,9 @@
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
"integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
"engines": {
"node": ">=6.0.0"
}
@@ -1610,17 +1611,17 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.11",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
"integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg=="
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
"integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
"version": "0.3.17",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
"integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
"@jridgewell/resolve-uri": "3.1.0",
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"node_modules/@rollup/plugin-babel": {
@@ -4063,20 +4064,20 @@
"integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg=="
},
"@babel/core": {
"version": "7.20.12",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
"integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
"integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
"requires": {
"@ampproject/remapping": "^2.1.0",
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.20.7",
"@babel/generator": "^7.21.0",
"@babel/helper-compilation-targets": "^7.20.7",
"@babel/helper-module-transforms": "^7.20.11",
"@babel/helpers": "^7.20.7",
"@babel/parser": "^7.20.7",
"@babel/helper-module-transforms": "^7.21.0",
"@babel/helpers": "^7.21.0",
"@babel/parser": "^7.21.0",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.12",
"@babel/types": "^7.20.7",
"@babel/traverse": "^7.21.0",
"@babel/types": "^7.21.0",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -4097,12 +4098,13 @@
}
},
"@babel/generator": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz",
"integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==",
"version": "7.21.1",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
"integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
"requires": {
"@babel/types": "^7.20.7",
"@babel/types": "^7.21.0",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
},
"dependencies": {
@@ -4224,12 +4226,12 @@
}
},
"@babel/helper-function-name": {
"version": "7.19.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
"integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
"integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
"requires": {
"@babel/template": "^7.18.10",
"@babel/types": "^7.19.0"
"@babel/template": "^7.20.7",
"@babel/types": "^7.21.0"
}
},
"@babel/helper-hoist-variables": {
@@ -4257,9 +4259,9 @@
}
},
"@babel/helper-module-transforms": {
"version": "7.20.11",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
"integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
"integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
"requires": {
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-module-imports": "^7.18.6",
@@ -4267,8 +4269,8 @@
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/helper-validator-identifier": "^7.19.1",
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.10",
"@babel/types": "^7.20.7"
"@babel/traverse": "^7.21.2",
"@babel/types": "^7.21.2"
}
},
"@babel/helper-optimise-call-expression": {
@@ -4358,13 +4360,13 @@
}
},
"@babel/helpers": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz",
"integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==",
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
"integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
"requires": {
"@babel/template": "^7.20.7",
"@babel/traverse": "^7.20.7",
"@babel/types": "^7.20.7"
"@babel/traverse": "^7.21.0",
"@babel/types": "^7.21.0"
}
},
"@babel/highlight": {
@@ -4378,9 +4380,9 @@
}
},
"@babel/parser": {
"version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
"integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw=="
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
"integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ=="
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.18.6",
@@ -5073,26 +5075,26 @@
}
},
"@babel/traverse": {
"version": "7.20.13",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
"integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz",
"integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
"requires": {
"@babel/code-frame": "^7.18.6",
"@babel/generator": "^7.20.7",
"@babel/generator": "^7.21.1",
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-function-name": "^7.19.0",
"@babel/helper-function-name": "^7.21.0",
"@babel/helper-hoist-variables": "^7.18.6",
"@babel/helper-split-export-declaration": "^7.18.6",
"@babel/parser": "^7.20.13",
"@babel/types": "^7.20.7",
"@babel/parser": "^7.21.2",
"@babel/types": "^7.21.2",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
"integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
"version": "7.21.2",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
"integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
"requires": {
"@babel/helper-string-parser": "^7.19.4",
"@babel/helper-validator-identifier": "^7.19.1",
@@ -5116,9 +5118,9 @@
}
},
"@jridgewell/resolve-uri": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
"integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA=="
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w=="
},
"@jridgewell/set-array": {
"version": "1.1.0",
@@ -5126,17 +5128,17 @@
"integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg=="
},
"@jridgewell/sourcemap-codec": {
"version": "1.4.11",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
"integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg=="
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw=="
},
"@jridgewell/trace-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
"integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
"version": "0.3.17",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
"integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
"requires": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
"@jridgewell/resolve-uri": "3.1.0",
"@jridgewell/sourcemap-codec": "1.4.14"
}
},
"@rollup/plugin-babel": {

View File

@@ -4,7 +4,7 @@
"private": true,
"scripts": {},
"dependencies": {
"@babel/core": "^7.20.12",
"@babel/core": "^7.21.0",
"@babel/preset-env": "^7.20.2",
"@rollup/plugin-babel": "^6.0.3",
"@rollup/plugin-node-resolve": "^15.0.1",

View File

@@ -70,7 +70,7 @@ setup_collapsible_details = function (el) {
var altLabel = $button.attr("data-label-alt");
$button.attr("data-label-alt", $button.text());
$button.text(altLabel);
$button.find("span").text(altLabel);
$button.attr("aria-expanded", !isOpen);
if (isOpen) {

View File

@@ -146,7 +146,7 @@ article.item-with-variations .product-row:last-child:after {
}
.product-row {
padding: 0.75*$line-height-computed 0;
padding: 1.25*$line-height-computed 0;
.count form {
display: inline;
@@ -163,6 +163,21 @@ article.item-with-variations .product-row:last-child:after {
&.total {
border-top: 1px solid $table-border-color;
}
&.variation>div:first-child {
position: relative;
padding-inline-start: calc(15px + 1.3em);
}
&.variation h5:before {
content: "";
display: block;
width: .65em;
height: 6px;
position: absolute;
left: 16px;
top: 0.35em;
border-width: 0 0 1px 1px;
border-style: solid;
}
}
.panel-contact dl {
margin-bottom: 0;
@@ -200,6 +215,25 @@ div.front-page {
margin-bottom: 15px;
}
}
@media (min-width: $screen-sm-min) {
.col-xs-6.availability-box,
.col-xs-6.price:has(.input-group-price) {
margin-top: -6px;
margin-bottom: -6px;
}
}
@media (max-width: $screen-xs-max) {
.product-description p:last-child {
margin-bottom: 15px;
}
.product-row .price {
text-align: left;
}
.product-row.variation .price {
padding-inline-start: calc(1.3em + 15px);
}
}
.subevent-list {
background-color: white;

View File

@@ -13,6 +13,11 @@ html.rtl {
margin-right: 0;
margin-left: 10px;
}
.product-row.variation h5:before {
left: auto;
right: 1px;
border-width: 0 1px 1px 0;
}
.cart-row > div {
float: right;
}

View File

@@ -389,7 +389,9 @@ details summary {
-webkit-user-select: none;
user-select: none;
}
.nojs details[open] .collapse-indicator, details.details-open .collapse-indicator {
.nojs details[open] .panel-heading .collapse-indicator,
details.details-open .panel-heading .collapse-indicator,
[aria-expanded=true]>.collapse-indicator {
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
-moz-transform: rotate(180deg);

View File

@@ -28,7 +28,6 @@ filterwarnings =
ignore::DeprecationWarning:kombu
ignore::DeprecationWarning:django
ignore::DeprecationWarning:cgi
ignore:PyPDF2 is deprecated:DeprecationWarning
ignore:the load_module.* method is deprecated:DeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning

View File

@@ -212,8 +212,7 @@ setup(
'pycountry',
'pycparser==2.21',
'pycryptodome==3.17.*',
'PyPDF2==2.12.*', # until https://github.com/py-pdf/pypdf/issues/1640 is fixed
'pypdf==3.4.*',
'pypdf==3.5.*',
'python-bidi==0.4.*', # Support for Arabic in reportlab
'python-dateutil==2.8.*',
'python-u2flib-server==4.*',

View File

@@ -324,6 +324,21 @@ def test_order_list_filter_subevent_date(token_client, organizer, event, order,
assert resp.status_code == 200
assert [res] == resp.data['results']
# Test distinct-ness of results
with scopes_disabled():
OrderPosition.objects.create(
order=order,
item=item,
variation=None,
price=Decimal("23"),
canceled=False,
positionid=3,
subevent=subevent,
)
resp = token_client.get(
'/api/v1/organizers/{}/events/{}/orders/?subevent={}'.format(organizer.slug, event.slug, subevent.pk))
assert len(resp.data['results']) == 1
@pytest.mark.django_db
def test_order_list(token_client, organizer, event, order, item, taxrule, question):

View File

@@ -120,13 +120,17 @@ class WaitingListTestCase(TestCase):
def test_send_custom_validity(self):
self.event.settings.set('waiting_list_hours', 24)
wle = WaitingListEntry.objects.create(
event=self.event, item=self.item2, variation=self.var1, email='foo@bar.com'
event=self.event, item=self.item2, variation=self.var1, email='foo@bar.com',
name_parts={'_legacy': 'Max'}
)
wle.send_voucher()
wle.refresh_from_db()
assert 3600 * 23 < (wle.voucher.valid_until - now()).seconds < 3600 * 24
assert 'foo@bar.com' in wle.voucher.comment
assert 'Max' in wle.voucher.comment
def test_send_auto(self):
with scope(organizer=self.o):
self.quota.variations.add(self.var1)