Compare commits

..
Author SHA1 Message Date
Richard Schreiber e0dec71262 add comment why onblur is needed 2025-05-06 13:04:46 +02:00
Richard Schreiber 4950ba8d03 add has-error for coloring error-messages 2025-05-06 13:00:14 +02:00
Richard Schreiber 6aab808b8d add permanent role=alert to label 2025-05-06 12:15:06 +02:00
Richard Schreiber 47bc015d98 draft push for weekend 2025-05-06 09:28:56 +02:00
Richard Schreiber 2605fe93d9 Fix unhandled error when parsing date in calendar-view (#5072) 2025-05-05 15:33:22 +02:00
Richard Schreiber 3dedfd6ee0 [A11y] fix tablist issues (#5060) 2025-05-05 12:16:04 +02:00
Richard Schreiber f71eb195c4 [A11y] Fix service fee HTML-structure (#5046) 2025-05-05 11:59:17 +02:00
Richard Schreiber f09e9590a8 [A11y] make text "required" visible in labels (#5042) 2025-05-05 11:40:35 +02:00
Richard Schreiber c53d44238c [A11y] Improve voice-control access for quantity rocker-buttons 2025-05-05 10:08:17 +02:00
Raphael Michel 3bcc504bd8 Geocoding utils: Support more flexible set of input fields (#5025) 2025-05-02 18:06:13 +02:00
dependabot[bot] d802f747c7 Bump @babel/core from 7.26.10 to 7.27.1 in /src/pretix/static/npm_dir
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.10 to 7.27.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.1/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-version: 7.27.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 11:46:21 +02:00
luelista d926030bf6 Event list: fix parsing of date query parameter (#5047)
Use the same localization formats as used when generating the value
2025-05-02 10:22:04 +02:00
dependabot[bot] 1e4c577b31 Bump qrcode from 8.1 to 8.2
Bumps [qrcode](https://github.com/lincolnloop/python-qrcode) from 8.1 to 8.2.
- [Changelog](https://github.com/lincolnloop/python-qrcode/blob/main/CHANGES.rst)
- [Commits](https://github.com/lincolnloop/python-qrcode/commits/v8.2)

---
updated-dependencies:
- dependency-name: qrcode
  dependency-version: '8.2'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 10:16:18 +02:00
dependabot[bot] 8cae00941a Bump @babel/preset-env in /src/pretix/static/npm_dir
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.26.9 to 7.27.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.1/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-version: 7.27.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 10:16:03 +02:00
dependabot[bot] 602287b3ec Update sentry-sdk requirement from ==2.25.* to ==2.27.*
Updates the requirements on [sentry-sdk](https://github.com/getsentry/sentry-python) to permit the latest version.
- [Release notes](https://github.com/getsentry/sentry-python/releases)
- [Changelog](https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-python/compare/2.25.0...2.27.0)

---
updated-dependencies:
- dependency-name: sentry-sdk
  dependency-version: 2.27.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-30 12:47:59 +02:00
CVZ-es 817f17dac5 Translations: Update Spanish
Currently translated at 100.0% (244 of 244 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/es/

powered by weblate
2025-04-30 12:47:00 +02:00
CVZ-es f33dd84900 Translations: Update Spanish
Currently translated at 100.0% (5869 of 5869 strings)

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

powered by weblate
2025-04-30 12:47:00 +02:00
CVZ-es 99d0ca314d Translations: Update French
Currently translated at 100.0% (244 of 244 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/fr/

powered by weblate
2025-04-30 12:47:00 +02:00
CVZ-es 853749521e Translations: Update French
Currently translated at 100.0% (5869 of 5869 strings)

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

powered by weblate
2025-04-30 12:47:00 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> df5c6bcebf Update reportlab requirement from ==4.3.* to ==4.4.* (#5016)
Updates the requirements on [reportlab](https://www.reportlab.com/) to permit the latest version.

---
updated-dependencies:
- dependency-name: reportlab
  dependency-version: 4.4.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-30 11:46:00 +02:00
dependabot[bot]anddependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 3e6051825e Update pep8-naming requirement from ==0.14.* to ==0.15.* (#5055)
Updates the requirements on [pep8-naming](https://github.com/PyCQA/pep8-naming) to permit the latest version.
- [Release notes](https://github.com/PyCQA/pep8-naming/releases)
- [Changelog](https://github.com/PyCQA/pep8-naming/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/PyCQA/pep8-naming/compare/0.14.0...0.15.0)

---
updated-dependencies:
- dependency-name: pep8-naming
  dependency-version: 0.15.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-30 11:42:42 +02:00
Richard Schreiber f4478da5ce Fix handling of empty giftcard-code 2025-04-30 07:15:18 +02:00
luelista 013a065132 Fix mismatched headline level in fragment_product_list.html (#5048) 2025-04-29 15:25:15 +02:00
Richard Schreiber b3919973f1 Fix order export for empty attendee_name_parts 2025-04-29 13:35:25 +02:00
Raphael Michel e1027e3e8c OrderChangeManager: Re-use same instances of OrderPosition/OrderFee 2025-04-29 12:38:41 +02:00
Richard Schreiber d3792935ae [A11y] add missing sr-only-text for clock-icon 2025-04-29 12:28:46 +02:00
Davide Manzella 1804dbebd0 Translations: Update Italian
Currently translated at 36.1% (2122 of 5869 strings)

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

powered by weblate
2025-04-29 12:00:12 +02:00
Richard SchreiberandRaphael Michel 7ca2f8ec04 [A11y] add min/max as help_text to date/time inputs
* [A11y] add min/max as help_text to date/time inputs

* update text

* Fix help-text (suggestions from code review)

Co-authored-by: Raphael Michel <michel@rami.io>

---------

Co-authored-by: Raphael Michel <michel@rami.io>
2025-04-29 09:10:29 +02:00
Raphael Michel 15eb0f8870 Bump version to 2025.5.0.dev0 2025-04-28 15:58:04 +02:00
35 changed files with 1743 additions and 2757 deletions
-31
View File
@@ -1,31 +0,0 @@
name: Build Deploy email notification tool
run-name: ${{ gitea.actor }} building new version of the email notification tool
on:
push: # Baut bei jedem Push (Branches + Tags)
workflow_dispatch:
jobs:
Apply-Kubernetes-Resources:
runs-on: podman
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Login to Docker Registry
run: podman login -u ${{ secrets.REGISTRY_USERNAME }} -p ${{ secrets.REGISTRY_TOKEN }} cr.ortlerstrasse.de
- name: Set Docker Image Tag
run: |
if [[ "${{ gitea.ref }}" == refs/tags/* ]]; then
echo "TAG_NAME=${{ gitea.ref_name }}" >> $GITHUB_ENV
else
echo "TAG_NAME=latest" >> $GITHUB_ENV
fi
- name: Build Docker image
run: podman build -t cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }} .
- name: Push Docker image
run: |
podman push cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }}
echo "Image pushed successfully: cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }}"
+4 -4
View File
@@ -87,11 +87,11 @@ dependencies = [
"pytz",
"pytz-deprecation-shim==0.1.*",
"pyuca",
"qrcode==8.1",
"qrcode==8.2",
"redis==5.2.*",
"reportlab==4.3.*",
"reportlab==4.4.*",
"requests==2.31.*",
"sentry-sdk==2.25.*",
"sentry-sdk==2.27.*",
"sepaxml==2.6.*",
"stripe==7.9.*",
"text-unidecode==1.*",
@@ -114,7 +114,7 @@ dev = [
"flake8==7.2.*",
"freezegun",
"isort==6.0.*",
"pep8-naming==0.14.*",
"pep8-naming==0.15.*",
"potypo",
"pytest-asyncio>=0.24",
"pytest-cache",
+1 -1
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__ = "2025.4.0"
__version__ = "2025.5.0.dev0"
-1
View File
@@ -28,6 +28,5 @@ from .items import * # noqa
from .json import * # noqa
from .mail import * # noqa
from .orderlist import * # noqa
from .relevant_orderlist import * # noqa
from .reusablemedia import * # noqa
from .waitinglist import * # noqa
+2 -2
View File
@@ -88,7 +88,7 @@ class OrderListExporter(MultiSheetListExporter):
description = gettext_lazy('Download a spreadsheet of all orders. The spreadsheet will include three sheets, one '
'with a line for every order, one with a line for every order position, and one with '
'a line for every additional fee charged in an order.')
featured = False
featured = True
@cached_property
def providers(self):
@@ -712,7 +712,7 @@ class OrderListExporter(MultiSheetListExporter):
if name_scheme and len(name_scheme['fields']) > 1:
for k, label, w in name_scheme['fields']:
row.append(
get_name_parts_localized(op.attendee_name_parts, k)
get_name_parts_localized(op.attendee_name_parts, k) if op.attendee_name_parts else ''
)
row += [
op.attendee_email,
File diff suppressed because it is too large Load Diff
+35
View File
@@ -58,6 +58,7 @@ from django.urls import reverse
from django.utils.formats import date_format
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.text import format_lazy
from django.utils.timezone import get_current_timezone
from django.utils.translation import gettext_lazy as _, pgettext_lazy
from django_countries import countries
@@ -870,6 +871,23 @@ class BaseQuestionsForm(forms.Form):
attrs['data-min'] = q.valid_date_min.isoformat()
if q.valid_date_max:
attrs['data-max'] = q.valid_date_max.isoformat()
if not help_text:
if q.valid_date_min and q.valid_date_max:
help_text = format_lazy(
'Please enter a date between {min} and {max}.',
min=date_format(q.valid_date_min, "SHORT_DATE_FORMAT"),
max=date_format(q.valid_date_max, "SHORT_DATE_FORMAT"),
)
elif q.valid_date_min:
help_text = format_lazy(
'Please enter a date no earlier than {min}.',
min=date_format(q.valid_date_min, "SHORT_DATE_FORMAT"),
)
elif q.valid_date_max:
help_text = format_lazy(
'Please enter a date no later than {max}.',
max=date_format(q.valid_date_max, "SHORT_DATE_FORMAT"),
)
field = forms.DateField(
label=label, required=required,
help_text=help_text,
@@ -888,6 +906,23 @@ class BaseQuestionsForm(forms.Form):
widget=TimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')),
)
elif q.type == Question.TYPE_DATETIME:
if not help_text:
if q.valid_datetime_min and q.valid_datetime_max:
help_text = format_lazy(
'Please enter a date and time between {min} and {max}.',
min=date_format(q.valid_datetime_min, "SHORT_DATETIME_FORMAT"),
max=date_format(q.valid_datetime_max, "SHORT_DATETIME_FORMAT"),
)
elif q.valid_datetime_min:
help_text = format_lazy(
'Please enter a date and time no earlier than {min}.',
min=date_format(q.valid_datetime_min, "SHORT_DATETIME_FORMAT"),
)
elif q.valid_datetime_max:
help_text = format_lazy(
'Please enter a date and time no later than {max}.',
max=date_format(q.valid_datetime_max, "SHORT_DATETIME_FORMAT"),
)
field = SplitDateTimeField(
label=label, required=required,
help_text=help_text,
+4
View File
@@ -1463,6 +1463,10 @@ class GiftCardPayment(BasePaymentProvider):
messages.error(request, _("You cannot pay with gift cards when buying a gift card."))
return
if not request.POST.get("giftcard"):
messages.error(request, _("Please enter the code of your gift card."))
return
try:
gc = self.event.organizer.accepted_gift_cards.get(
secret=request.POST.get("giftcard").strip()
+151 -130
View File
@@ -2221,73 +2221,79 @@ class OrderChangeManager:
nextposid = self.order.all_positions.aggregate(m=Max('positionid'))['m'] + 1
split_positions = []
secret_dirty = set()
position_cache = {}
fee_cache = {}
for op in self._operations:
if isinstance(op, self.ItemOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.item', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'old_item': op.position.item.pk,
'old_variation': op.position.variation.pk if op.position.variation else None,
'position': position.pk,
'positionid': position.positionid,
'old_item': position.item.pk,
'old_variation': position.variation.pk if position.variation else None,
'new_item': op.item.pk,
'new_variation': op.variation.pk if op.variation else None,
'old_price': op.position.price,
'addon_to': op.position.addon_to_id,
'new_price': op.position.price
'old_price': position.price,
'addon_to': position.addon_to_id,
'new_price': position.price
})
op.position.item = op.item
op.position.variation = op.variation
op.position._calculate_tax()
position.item = op.item
position.variation = op.variation
position._calculate_tax()
if op.position.voucher_budget_use is not None and op.position.voucher and not op.position.addon_to_id:
listed_price = get_listed_price(op.position.item, op.position.variation, op.position.subevent)
if not op.position.item.tax_rule or op.position.item.tax_rule.price_includes_tax:
price_after_voucher = max(op.position.price, op.position.voucher.calculate_price(listed_price))
if position.voucher_budget_use is not None and position.voucher and not position.addon_to_id:
listed_price = get_listed_price(position.item, position.variation, position.subevent)
if not position.item.tax_rule or position.item.tax_rule.price_includes_tax:
price_after_voucher = max(position.price, position.voucher.calculate_price(listed_price))
else:
price_after_voucher = max(op.position.price - op.position.tax_value, op.position.voucher.calculate_price(listed_price))
op.position.voucher_budget_use = max(listed_price - price_after_voucher, Decimal('0.00'))
secret_dirty.add(op.position)
op.position.save()
price_after_voucher = max(position.price - position.tax_value, position.voucher.calculate_price(listed_price))
position.voucher_budget_use = max(listed_price - price_after_voucher, Decimal('0.00'))
secret_dirty.add(position)
position.save()
elif isinstance(op, self.MembershipOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.membership', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'old_membership_id': op.position.used_membership_id,
'position': position.pk,
'positionid': position.positionid,
'old_membership_id': position.used_membership_id,
'new_membership_id': op.membership.pk if op.membership else None,
})
op.position.used_membership = op.membership
op.position.save()
position.used_membership = op.membership
position.save()
elif isinstance(op, self.SeatOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.seat', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'old_seat': op.position.seat.name if op.position.seat else "-",
'position': position.pk,
'positionid': position.positionid,
'old_seat': position.seat.name if position.seat else "-",
'new_seat': op.seat.name if op.seat else "-",
'old_seat_id': op.position.seat.pk if op.position.seat else None,
'old_seat_id': position.seat.pk if position.seat else None,
'new_seat_id': op.seat.pk if op.seat else None,
})
op.position.seat = op.seat
secret_dirty.add(op.position)
op.position.save()
position.seat = op.seat
secret_dirty.add(position)
position.save()
elif isinstance(op, self.SubeventOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.subevent', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'old_subevent': op.position.subevent.pk,
'position': position.pk,
'positionid': position.positionid,
'old_subevent': position.subevent.pk,
'new_subevent': op.subevent.pk,
'old_price': op.position.price,
'new_price': op.position.price
'old_price': position.price,
'new_price': position.price
})
op.position.subevent = op.subevent
secret_dirty.add(op.position)
if op.position.voucher_budget_use is not None and op.position.voucher and not op.position.addon_to_id:
listed_price = get_listed_price(op.position.item, op.position.variation, op.position.subevent)
if not op.position.item.tax_rule or op.position.item.tax_rule.price_includes_tax:
price_after_voucher = max(op.position.price, op.position.voucher.calculate_price(listed_price))
position.subevent = op.subevent
secret_dirty.add(position)
if position.voucher_budget_use is not None and position.voucher and not position.addon_to_id:
listed_price = get_listed_price(position.item, position.variation, position.subevent)
if not position.item.tax_rule or position.item.tax_rule.price_includes_tax:
price_after_voucher = max(position.price, position.voucher.calculate_price(listed_price))
else:
price_after_voucher = max(op.position.price - op.position.tax_value, op.position.voucher.calculate_price(listed_price))
op.position.voucher_budget_use = max(listed_price - price_after_voucher, Decimal('0.00'))
op.position.save()
price_after_voucher = max(position.price - position.tax_value, position.voucher.calculate_price(listed_price))
position.voucher_budget_use = max(listed_price - price_after_voucher, Decimal('0.00'))
position.save()
elif isinstance(op, self.AddFeeOperation):
self.order.log_action('pretix.event.order.changed.addfee', user=self.user, auth=self.auth, data={
'fee': op.fee.pk,
@@ -2296,70 +2302,79 @@ class OrderChangeManager:
op.fee._calculate_tax()
op.fee.save()
elif isinstance(op, self.FeeValueOperation):
fee = fee_cache.setdefault(op.fee.pk, op.fee)
self.order.log_action('pretix.event.order.changed.feevalue', user=self.user, auth=self.auth, data={
'fee': op.fee.pk,
'old_price': op.fee.value,
'fee': fee.pk,
'old_price': fee.value,
'new_price': op.value.gross
})
op.fee.value = op.value.gross
op.fee._calculate_tax()
op.fee.save()
fee.value = op.value.gross
fee._calculate_tax()
fee.save()
elif isinstance(op, self.PriceOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.price', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'old_price': op.position.price,
'addon_to': op.position.addon_to_id,
'position': position.pk,
'positionid': position.positionid,
'old_price': position.price,
'addon_to': position.addon_to_id,
'new_price': op.price.gross
})
op.position.price = op.price.gross
op.position.tax_rate = op.price.rate
op.position.tax_value = op.price.tax
op.position.tax_code = op.price.code
op.position.save(update_fields=['price', 'tax_rate', 'tax_value', 'tax_code'])
position.price = op.price.gross
position.tax_rate = op.price.rate
position.tax_value = op.price.tax
position.tax_code = op.price.code
position.save(update_fields=['price', 'tax_rate', 'tax_value', 'tax_code'])
elif isinstance(op, self.TaxRuleOperation):
if isinstance(op.position, OrderPosition):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.tax_rule', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'addon_to': op.position.addon_to_id,
'old_taxrule': op.position.tax_rule.pk if op.position.tax_rule else None,
'position': position.pk,
'positionid': position.positionid,
'addon_to': position.addon_to_id,
'old_taxrule': position.tax_rule.pk if position.tax_rule else None,
'new_taxrule': op.tax_rule.pk
})
position._calculate_tax(op.tax_rule)
position.save()
elif isinstance(op.position, OrderFee):
fee = fee_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.tax_rule', user=self.user, auth=self.auth, data={
'fee': op.position.pk,
'fee_type': op.position.fee_type,
'old_taxrule': op.position.tax_rule.pk if op.position.tax_rule else None,
'fee': fee.pk,
'fee_type': fee.fee_type,
'old_taxrule': fee.tax_rule.pk if fee.tax_rule else None,
'new_taxrule': op.tax_rule.pk
})
op.position._calculate_tax(op.tax_rule)
op.position.save()
fee._calculate_tax(op.tax_rule)
fee.save()
elif isinstance(op, self.CancelFeeOperation):
fee = fee_cache.setdefault(op.fee.pk, op.fee)
self.order.log_action('pretix.event.order.changed.cancelfee', user=self.user, auth=self.auth, data={
'fee': op.fee.pk,
'fee_type': op.fee.fee_type,
'old_price': op.fee.value,
'fee': fee.pk,
'fee_type': fee.fee_type,
'old_price': fee.value,
})
op.fee.canceled = True
op.fee.save(update_fields=['canceled'])
fee.canceled = True
fee.save(update_fields=['canceled'])
elif isinstance(op, self.CancelOperation):
for gc in op.position.issued_gift_cards.all():
position = position_cache.setdefault(op.position.pk, op.position)
for gc in position.issued_gift_cards.all():
gc = GiftCard.objects.select_for_update(of=OF_SELF).get(pk=gc.pk)
if gc.value < op.position.price:
if gc.value < position.price:
raise OrderError(_(
'A position can not be canceled since the gift card {card} purchased in this order has '
'already been redeemed.').format(
card=gc.secret
))
else:
gc.transactions.create(value=-op.position.price, order=self.order, acceptor=self.order.event.organizer)
gc.transactions.create(value=-position.price, order=self.order, acceptor=self.order.event.organizer)
for m in op.position.granted_memberships.with_usages().all():
for m in position.granted_memberships.with_usages().all():
m.canceled = True
m.save()
for opa in op.position.addons.all():
for opa in position.addons.all():
opa = position_cache.setdefault(opa.pk, opa)
for gc in opa.issued_gift_cards.all():
gc = GiftCard.objects.select_for_update(of=OF_SELF).get(pk=gc.pk)
if gc.value < opa.position.price:
@@ -2393,22 +2408,22 @@ class OrderChangeManager:
)
opa.save(update_fields=['canceled', 'secret'])
self.order.log_action('pretix.event.order.changed.cancel', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'old_item': op.position.item.pk,
'old_variation': op.position.variation.pk if op.position.variation else None,
'old_price': op.position.price,
'position': position.pk,
'positionid': position.positionid,
'old_item': position.item.pk,
'old_variation': position.variation.pk if position.variation else None,
'old_price': position.price,
'addon_to': None,
})
op.position.canceled = True
if op.position.voucher:
Voucher.objects.filter(pk=op.position.voucher.pk).update(redeemed=Greatest(0, F('redeemed') - 1))
position.canceled = True
if position.voucher:
Voucher.objects.filter(pk=position.voucher.pk).update(redeemed=Greatest(0, F('redeemed') - 1))
assign_ticket_secret(
event=self.event, position=op.position, force_invalidate_if_revokation_list_used=True, force_invalidate=False, save=False
event=self.event, position=position, force_invalidate_if_revokation_list_used=True, force_invalidate=False, save=False
)
if op.position in secret_dirty:
secret_dirty.remove(op.position)
op.position.save(update_fields=['canceled', 'secret'])
if position in secret_dirty:
secret_dirty.remove(position)
position.save(update_fields=['canceled', 'secret'])
elif isinstance(op, self.AddOperation):
pos = OrderPosition.objects.create(
item=op.item, variation=op.variation, addon_to=op.addon_to,
@@ -2433,20 +2448,22 @@ class OrderChangeManager:
'valid_until': op.valid_until.isoformat() if op.valid_until else None,
})
elif isinstance(op, self.SplitOperation):
split_positions.append(op.position)
position = position_cache.setdefault(op.position.pk, op.position)
split_positions.append(position)
elif isinstance(op, self.RegenerateSecretOperation):
op.position.web_secret = generate_secret()
op.position.save(update_fields=["web_secret"])
position = position_cache.setdefault(op.position.pk, op.position)
position.web_secret = generate_secret()
position.save(update_fields=["web_secret"])
assign_ticket_secret(
event=self.event, position=op.position, force_invalidate=True, save=True
event=self.event, position=position, force_invalidate=True, save=True
)
if op.position in secret_dirty:
secret_dirty.remove(op.position)
if position in secret_dirty:
secret_dirty.remove(position)
tickets.invalidate_cache.apply_async(kwargs={'event': self.event.pk,
'order': self.order.pk})
self.order.log_action('pretix.event.order.changed.secret', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'position': position.pk,
'positionid': position.positionid,
})
elif isinstance(op, self.ChangeSecretOperation):
if OrderPosition.all.filter(order__event=self.event, secret=op.new_secret).exists():
@@ -2462,64 +2479,68 @@ class OrderChangeManager:
'positionid': op.position.positionid,
})
elif isinstance(op, self.ChangeValidFromOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.valid_from', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'position': position.pk,
'positionid': position.positionid,
'new_value': op.valid_from.isoformat() if op.valid_from else None,
'old_value': op.position.valid_from.isoformat() if op.position.valid_from else None,
'old_value': position.valid_from.isoformat() if position.valid_from else None,
})
op.position.valid_from = op.valid_from
op.position.save(update_fields=['valid_from'])
secret_dirty.add(op.position)
position.valid_from = op.valid_from
position.save(update_fields=['valid_from'])
secret_dirty.add(position)
elif isinstance(op, self.ChangeValidUntilOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.valid_until', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'position': position.pk,
'positionid': position.positionid,
'new_value': op.valid_until.isoformat() if op.valid_until else None,
'old_value': op.position.valid_until.isoformat() if op.position.valid_until else None,
'old_value': position.valid_until.isoformat() if position.valid_until else None,
})
op.position.valid_until = op.valid_until
op.position.save(update_fields=['valid_until'])
secret_dirty.add(op.position)
position.valid_until = op.valid_until
position.save(update_fields=['valid_until'])
secret_dirty.add(position)
elif isinstance(op, self.AddBlockOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.add_block', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'position': position.pk,
'positionid': position.positionid,
'block_name': op.block_name,
})
if op.position.blocked:
if op.block_name not in op.position.blocked:
op.position.blocked = op.position.blocked + [op.block_name]
if position.blocked:
if op.block_name not in position.blocked:
position.blocked = position.blocked + [op.block_name]
else:
op.position.blocked = [op.block_name]
position.blocked = [op.block_name]
if op.ignore_from_quota_while_blocked is not None:
op.position.ignore_from_quota_while_blocked = op.ignore_from_quota_while_blocked
op.position.save(update_fields=['blocked', 'ignore_from_quota_while_blocked'])
if op.position.blocked:
op.position.blocked_secrets.update_or_create(
position.ignore_from_quota_while_blocked = op.ignore_from_quota_while_blocked
position.save(update_fields=['blocked', 'ignore_from_quota_while_blocked'])
if position.blocked:
position.blocked_secrets.update_or_create(
event=self.event,
secret=op.position.secret,
secret=position.secret,
defaults={
'blocked': True,
'updated': now(),
}
)
elif isinstance(op, self.RemoveBlockOperation):
position = position_cache.setdefault(op.position.pk, op.position)
self.order.log_action('pretix.event.order.changed.remove_block', user=self.user, auth=self.auth, data={
'position': op.position.pk,
'positionid': op.position.positionid,
'position': position.pk,
'positionid': position.positionid,
'block_name': op.block_name,
})
if op.position.blocked and op.block_name in op.position.blocked:
op.position.blocked = [b for b in op.position.blocked if b != op.block_name]
if not op.position.blocked:
op.position.blocked = None
if position.blocked and op.block_name in position.blocked:
position.blocked = [b for b in position.blocked if b != op.block_name]
if not position.blocked:
position.blocked = None
if op.ignore_from_quota_while_blocked is not None:
op.position.ignore_from_quota_while_blocked = op.ignore_from_quota_while_blocked
op.position.save(update_fields=['blocked', 'ignore_from_quota_while_blocked'])
if not op.position.blocked:
position.ignore_from_quota_while_blocked = op.ignore_from_quota_while_blocked
position.save(update_fields=['blocked', 'ignore_from_quota_while_blocked'])
if not position.blocked:
try:
bs = op.position.blocked_secrets.get(secret=op.position.secret)
bs = position.blocked_secrets.get(secret=position.secret)
bs.blocked = False
bs.save()
except BlockedTicketSecret.DoesNotExist:
+4 -16
View File
@@ -42,7 +42,7 @@ from django.db.models.functions import Coalesce, Greatest
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.utils.formats import date_format, get_format
from django.utils.formats import date_format
from django.utils.timezone import make_aware
from django.utils.translation import gettext as _, pgettext
@@ -56,7 +56,7 @@ from pretix.control.permissions import (
event_permission_required, organizer_permission_required,
)
from pretix.helpers.daterange import daterange
from pretix.helpers.i18n import i18ncomp
from pretix.helpers.i18n import i18ncomp, parse_date_localized
def serialize_user(u):
@@ -408,13 +408,7 @@ def subevent_select2(request, **kwargs):
qf = Q(name__icontains=i18ncomp(query)) | Q(location__icontains=query)
tz = request.event.timezone
dt = None
for f in get_format('DATE_INPUT_FORMATS'):
try:
dt = datetime.strptime(query, f)
break
except (ValueError, TypeError):
continue
dt = parse_date_localized(query)
if dt:
dt_start = make_aware(datetime.combine(dt.date(), time(hour=0, minute=0, second=0)), tz)
@@ -458,13 +452,7 @@ def quotas_select2(request, **kwargs):
qf = Q(name__icontains=query) | Q(subevent__name__icontains=i18ncomp(query))
tz = request.event.timezone
dt = None
for f in get_format('DATE_INPUT_FORMATS'):
try:
dt = datetime.strptime(query, f)
break
except (ValueError, TypeError):
continue
dt = parse_date_localized(query)
if dt and request.event.has_subevents:
dt_start = make_aware(datetime.combine(dt.date(), time(hour=0, minute=0, second=0)), tz)
+14
View File
@@ -23,7 +23,9 @@ import gettext as gettext_module
import json
import os
import re
from datetime import datetime
from functools import lru_cache
from typing import Optional
from django.apps import apps
from django.conf import settings
@@ -222,3 +224,15 @@ def get_language_score(locale):
else:
score = len(list(catalog.items())) or 1
return score
def parse_date_localized(date_str) -> Optional[datetime]:
"""Parses a date according to the localized date input formats. Returns None if invalid."""
dt = None
for f in get_format('DATE_INPUT_FORMATS'):
try:
dt = datetime.strptime(date_str, f)
break
except (ValueError, TypeError):
continue
return dt
+65 -81
View File
@@ -826,7 +826,7 @@ msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"ZIP-Datei mit allen Dateien, die von Kunden im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py:66 pretix/base/models/items.py:1767
@@ -1827,10 +1827,6 @@ msgstr "Ohne gültige Mitgliedschaft verstecken"
msgid "Order data"
msgstr "Bestelldaten"
#: pretix/base/exporters/relevant_orderlist.py:86
msgid "Order data (sorted by relevance)"
msgstr "Bestelldaten (nach Relevanz sortiert)"
#: pretix/base/exporters/json.py:53
msgid ""
"Download a structured JSON representation of all orders. This might be "
@@ -1848,8 +1844,8 @@ msgid ""
"Download a text file with all email addresses collected either from buyers "
"or from ticket holders."
msgstr ""
"Textdatei mit allen E-Mail-Adressen, die von Käufern und "
"Ticketinhaber eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
"Ticketinhaber*innen eingesammelt wurden."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:487
#: pretix/plugins/reports/exporters.py:669
@@ -1867,18 +1863,6 @@ msgstr ""
"Bestellposition und das dritte eine Zeile für jede zusätzlich erhobene "
"Gebühr."
#: pretix/base/exporters/relevant_orderlist.py:88
msgid ""
"Download a spreadsheet of all orders. The spreadsheet will include three "
"sheets, one with a line for every order, one with a line for every order "
"position, and one with a line for every additional fee charged in an "
"order. The most relevant data is in the first columns of the tables."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Bestellungen. Das erste Tabellenblatt "
"enthält eine Zeile für jede Bestellung, das zweite eine Zeile für jede "
"Bestellposition und das dritte eine Zeile für jede zusätzlich erhobene "
"Gebühr. Die relevantesten Daten sind in den ersten Spalten der Tabellen."
#: pretix/base/exporters/orderlist.py:100 pretix/base/models/orders.py:332
#: pretix/control/navigation.py:255 pretix/control/navigation.py:362
#: pretix/control/templates/pretixcontrol/orders/index.html:8
@@ -2225,7 +2209,7 @@ msgstr "Produkt"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:37
msgid "Attendee name"
msgstr "Name Teilnehmer"
msgstr "Name Teilnehmer*in"
#: pretix/base/exporters/orderlist.py:602 pretix/base/forms/questions.py:676
#: pretix/base/models/customers.py:307 pretix/base/models/orders.py:1512
@@ -2235,7 +2219,7 @@ msgstr "Name Teilnehmer"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:171
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:174
msgid "Attendee email"
msgstr "E-Mail Teilnehmer"
msgstr "E-Mail Teilnehmer*in"
#: pretix/base/exporters/orderlist.py:609 pretix/base/models/vouchers.py:312
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5
@@ -3617,7 +3601,7 @@ msgstr "Bitte wählen Sie einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:325 pretix/control/forms/filter.py:652
msgid "Attendee email address"
msgstr "Teilnehmer-E-Mail-Adresse"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:341 pretix/base/modelimport_orders.py:352
#: pretix/base/modelimport_orders.py:363 pretix/base/modelimport_orders.py:374
@@ -3629,7 +3613,7 @@ msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:192
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:195
msgid "Attendee address"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/base/modelimport_orders.py:409
msgid "State"
@@ -7386,7 +7370,7 @@ msgstr "Max Mustermann"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:181
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:184
msgid "Attendee company"
msgstr "Teilnehmer-Firma"
msgstr "Teilnehmer*innen-Firma"
#: pretix/base/pdf.py:178 pretix/base/pdf.py:336
#: pretix/base/services/tickets.py:119 pretix/control/views/pdf.py:110
@@ -7397,7 +7381,7 @@ msgstr "Musterfirma GmbH"
#: pretix/base/pdf.py:182
msgid "Full attendee address"
msgstr "Volle Teilnehmer-Adresse"
msgstr "Volle Teilnehmer*innen-Adresse"
#: pretix/base/pdf.py:183
msgid ""
@@ -7415,23 +7399,23 @@ msgstr ""
#: pretix/base/pdf.py:187
msgid "Attendee street"
msgstr "Teilnehmer-Straße"
msgstr "Teilnehmer*innen-Straße"
#: pretix/base/pdf.py:192
msgid "Attendee ZIP code"
msgstr "Teilnehmer-PLZ"
msgstr "Teilnehmer*innen-PLZ"
#: pretix/base/pdf.py:197
msgid "Attendee city"
msgstr "Teilnehmer-Stadt"
msgstr "Teilnehmer*innen-Stadt"
#: pretix/base/pdf.py:202
msgid "Attendee state"
msgstr "Teilnehmer-Bundesstaat"
msgstr "Teilnehmer*innen-Bundesstaat"
#: pretix/base/pdf.py:207
msgid "Attendee country"
msgstr "Teilnehmer-Land"
msgstr "Teilnehmer*innen-Land"
#: pretix/base/pdf.py:219
msgid "Pseudonymization ID (lead scanning)"
@@ -7714,7 +7698,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmername: {part}"
msgstr "Teilnehmer*innenname: {part}"
#: pretix/base/pdf.py:671
msgid "Invoice address name for salutation"
@@ -8386,7 +8370,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer: {name}"
msgstr "Teilnehmer*in: {name}"
#: pretix/base/services/invoices.py:254 pretix/plugins/reports/exporters.py:298
msgctxt "subevent"
@@ -9185,7 +9169,7 @@ msgstr ""
#: pretix/base/settings.py:338
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
#: pretix/base/settings.py:339
msgid ""
@@ -9195,13 +9179,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py:357
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer erfragen"
msgstr "Namen der Teilnehmer*innen erfragen"
#: pretix/base/settings.py:358
msgid "Ask for a name for all personalized tickets."
@@ -9210,11 +9194,11 @@ msgstr ""
#: pretix/base/settings.py:367
msgid "Require attendee names"
msgstr "Namen der Teilnehmer erfordern"
msgstr "Namen der Teilnehmer*innen erfordern"
#: pretix/base/settings.py:368
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
#: pretix/base/settings.py:378
msgid "Ask for email addresses per ticket"
@@ -9710,8 +9694,8 @@ msgid ""
"but no indication of missing payment will be visible on the ticket pages of "
"attendees who did not buy the ticket themselves."
msgstr ""
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
"aber Teilnehmern, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py:996
@@ -10154,7 +10138,7 @@ msgstr ""
#: pretix/base/settings.py:1512
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
#: pretix/base/settings.py:1513
msgid ""
@@ -10165,12 +10149,12 @@ msgid ""
"failed scans will not be counted, and the user will not see the different "
"check-in lists."
msgstr ""
"Wenn diese Option aktiv ist, können Kunden selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kund*innen selbst sehen, wie oft sie die "
"Veranstaltung betreten haben. Das ist normalerweise nicht nötig, aber kann "
"nützlich sein, wenn es Tickets gibt, die eine bestimmte Anzahl an Eintritten "
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py:1526
msgid "Allow users to download tickets"
@@ -10351,7 +10335,7 @@ msgstr ""
#: pretix/base/settings.py:1689 pretix/base/settings.py:1698
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
#: pretix/base/settings.py:1693
msgid "Allow customers to modify their information"
@@ -10459,7 +10443,7 @@ msgstr ""
#: pretix/base/settings.py:1799
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmern ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
#: pretix/base/settings.py:1800
msgid ""
@@ -10471,7 +10455,7 @@ msgid ""
msgstr ""
"Standardmäßig kann nur die Person, welche die Tickets gekauft hat, "
"Änderungen an der Bestellung vornehmen. Wenn diese Option aktiv ist, können "
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer können "
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen können "
"jedoch immer nur Änderungen vornehmen, welche die Gesamtkosten der "
"Bestellung nicht verändern. Solche Änderungen können nur vom Ticketkäufer "
"vorgenommen werden."
@@ -10737,7 +10721,7 @@ msgid ""
"people."
msgstr ""
"Sie können dieses Feld benutzen, um zusätzliche Informationen mit Ihren "
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"einer digitalen Veranstaltung. Wenn das Feld leer ist, fügen wir automatisch "
"einen Link zum Ticketshop, die Einlass-Uhrzeit und den Veranstalter hier "
"ein. Es sind keine Platzhalter mit sensiblen personenbezogenen Daten "
@@ -10978,8 +10962,8 @@ msgstr ""
"Diese Datei wird an die erste E-Mail angehängt, die wir beim Eingang einer "
"neuen Bestellung verschicken. Sie kann daher mit den Textvorlagen "
"\"Getätigte Bestellung\", \"Kostenlose Bestellung\" oder \"Erhaltene "
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
"öffentlicher Informationen, da die Datei unabhängig davon verschickt wird, "
"ob die Bestellung bezahlt oder freigegeben ist. Um zu vermeiden, dass diese "
"wichtige E-Mail nicht ankommt, können nur PDF-Dateien mit maximal {size} MB "
@@ -14060,7 +14044,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:1886
#: pretix/plugins/checkinlists/exporters.py:107
msgid "All attendees"
msgstr "Alle Teilnehmer"
msgstr "Alle Teilnehmer*innen"
#: pretix/control/forms/filter.py:1887
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -14630,7 +14614,7 @@ msgid ""
"people over 65. This ticket includes access to all parts of the event, "
"except the VIP area."
msgstr ""
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -14898,7 +14882,7 @@ msgstr ""
#: pretix/control/forms/orders.py:167 pretix/control/forms/orders.py:214
#: pretix/control/forms/orders.py:228
msgid "Notify customer by email"
msgstr "Kunde per E-Mail benachrichtigen"
msgstr "Kund*in per E-Mail benachrichtigen"
#: pretix/control/forms/orders.py:174
msgid "Keep a cancellation fee of"
@@ -16246,7 +16230,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:485
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an einen Teilnehmer verschickt."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/control/logdisplay.py:486
msgid ""
@@ -17907,7 +17891,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber"
msgstr "Karteninhaber*in"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -18202,7 +18186,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer gefunden."
msgstr "Keine passenden Teilnehmer*innen gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/orders/index.html:127
@@ -20691,7 +20675,7 @@ msgid ""
"Only purchases of such products will be considered \"attendees\" for most "
"statistical purposes or within some plugins."
msgstr ""
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html:39
@@ -20770,7 +20754,7 @@ msgid ""
"The system will not ask for a name or other attendee details. This only "
"affects system-provided fields, you can still add your own questions."
msgstr ""
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -22912,7 +22896,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:104
#: pretix/control/templates/pretixcontrol/organizers/export.html:104
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer"
msgstr "Empfohlen für neue Benutzer*innen"
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:4
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:6
@@ -23876,7 +23860,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:301
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:302
msgid ""
@@ -26037,7 +26021,7 @@ msgid ""
"customers. This way, customers will not be able to discover the waiting list."
msgstr ""
"Entsprechend Ihrer Veranstaltungseinstellungen werden ausverkaufte Produkte "
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:36
@@ -26361,11 +26345,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py:115
msgid "Attendees (ordered)"
msgstr "Teilnehmer (bestellt)"
msgstr "Teilnehmende (bestellt)"
#: pretix/control/views/dashboards.py:125
msgid "Attendees (paid)"
msgstr "Teilnehmer (bezahlt)"
msgstr "Teilnehmende (bezahlt)"
#: pretix/control/views/dashboards.py:137
#, python-brace-format
@@ -28314,7 +28298,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:423
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py:444
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -28589,7 +28573,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:91
msgid "Name of account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:93
msgid ""
@@ -28782,7 +28766,7 @@ msgstr "Bitte überweisen Sie den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
msgid "Account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:468
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:17
@@ -29479,7 +29463,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py:499
@@ -30669,7 +30653,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:121
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to waiting list entries."
@@ -30697,7 +30681,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:136
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/plugins/sendmail/signals.py:137
msgid "An email rule was deleted"
@@ -30730,7 +30714,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
msgid "Attendee contact addresses"
msgstr "Teilnehmer-E-Mail-Adressen"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
msgid "All contact addresses"
@@ -30893,14 +30877,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer"
msgstr "Bestellungen oder Teilnehmer*innen"
#: pretix/plugins/sendmail/views.py:251
msgid ""
"Send an email to every customer, or to every person a ticket has been "
"purchased for, or a combination of both."
msgstr ""
"Senden Sie eine E-Mail an alle Ticketkäufer, alle Ticketinhaber "
"Senden Sie eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen "
"oder eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py:417
@@ -31423,23 +31407,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1232
msgid "Account Holder Name"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/stripe/payment.py:1237
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber)"
msgstr "Straße (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1249
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber)"
msgstr "PLZ (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1261
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber)"
msgstr "Stadt (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1273
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber)"
msgstr "Land (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1317
msgid "Affirm via Stripe"
@@ -33205,7 +33189,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:165
msgid "No attendee name provided"
msgstr "Name des Teilnehmenrs nicht angegeben"
msgstr "Name der teilnehmenden Person nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:218
msgid "The image you previously uploaded"
@@ -34840,12 +34824,12 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
#: pretix/presale/views/customer.py:378
msgid "Attendee profiles"
msgstr "Teilnehmer-Profile"
msgstr "Teilnehmer*innen-Profile"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
msgid "You dont have any attendee profiles in your account yet."
msgstr ""
"In Ihrem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
"In Ihrem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:6
msgid "Registration"
@@ -35954,7 +35938,7 @@ msgstr "Kosovo"
#~ "This plugin allows you to generate badges or name tags for your attendees."
#~ msgstr ""
#~ "Diese Erweiterung erlaubt, Namensschilder oder Badges für die "
#~ "Teilnehmer zu erstellen."
#~ "Teilnehmer*innen zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
@@ -827,7 +827,7 @@ msgid ""
"Download a ZIP file including all files that have been uploaded by your "
"customers while creating an order."
msgstr ""
"ZIP-Datei mit allen Dateien, die von Kunden im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py:66 pretix/base/models/items.py:1767
@@ -1845,8 +1845,8 @@ msgid ""
"Download a text file with all email addresses collected either from buyers "
"or from ticket holders."
msgstr ""
"Textdatei mit allen E-Mail-Adressen, die von Käufer und "
"Ticketinhaber eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
"Ticketinhaber*innen eingesammelt wurden."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:487
#: pretix/plugins/reports/exporters.py:669
@@ -2210,7 +2210,7 @@ msgstr "Produkt"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:37
msgid "Attendee name"
msgstr "Name Teilnehmer"
msgstr "Name Teilnehmer*in"
#: pretix/base/exporters/orderlist.py:602 pretix/base/forms/questions.py:676
#: pretix/base/models/customers.py:307 pretix/base/models/orders.py:1512
@@ -2220,7 +2220,7 @@ msgstr "Name Teilnehmer"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:171
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:174
msgid "Attendee email"
msgstr "E-Mail Teilnehmer"
msgstr "E-Mail Teilnehmer*in"
#: pretix/base/exporters/orderlist.py:609 pretix/base/models/vouchers.py:312
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5
@@ -3601,7 +3601,7 @@ msgstr "Bitte wähle einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:325 pretix/control/forms/filter.py:652
msgid "Attendee email address"
msgstr "Teilnehmer-E-Mail-Adresse"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:341 pretix/base/modelimport_orders.py:352
#: pretix/base/modelimport_orders.py:363 pretix/base/modelimport_orders.py:374
@@ -3613,7 +3613,7 @@ msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:192
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:195
msgid "Attendee address"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/base/modelimport_orders.py:409
msgid "State"
@@ -7362,7 +7362,7 @@ msgstr "Max Mustermann"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:181
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:184
msgid "Attendee company"
msgstr "Teilnehmer-Firma"
msgstr "Teilnehmer*innen-Firma"
#: pretix/base/pdf.py:178 pretix/base/pdf.py:336
#: pretix/base/services/tickets.py:119 pretix/control/views/pdf.py:110
@@ -7373,7 +7373,7 @@ msgstr "Musterfirma"
#: pretix/base/pdf.py:182
msgid "Full attendee address"
msgstr "Volle Teilnehmer-Adresse"
msgstr "Volle Teilnehmer*innen-Adresse"
#: pretix/base/pdf.py:183
msgid ""
@@ -7391,23 +7391,23 @@ msgstr ""
#: pretix/base/pdf.py:187
msgid "Attendee street"
msgstr "Teilnehmer-Straße"
msgstr "Teilnehmer*innen-Straße"
#: pretix/base/pdf.py:192
msgid "Attendee ZIP code"
msgstr "Teilnehmer-PLZ"
msgstr "Teilnehmer*innen-PLZ"
#: pretix/base/pdf.py:197
msgid "Attendee city"
msgstr "Teilnehmer-Stadt"
msgstr "Teilnehmer*innen-Stadt"
#: pretix/base/pdf.py:202
msgid "Attendee state"
msgstr "Teilnehmer-Bundesstaat"
msgstr "Teilnehmer*innen-Bundesstaat"
#: pretix/base/pdf.py:207
msgid "Attendee country"
msgstr "Teilnehmer-Land"
msgstr "Teilnehmer*innen-Land"
#: pretix/base/pdf.py:219
msgid "Pseudonymization ID (lead scanning)"
@@ -7690,7 +7690,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmer: {part}"
msgstr "Teilnehmer*innenname: {part}"
#: pretix/base/pdf.py:671
msgid "Invoice address name for salutation"
@@ -8359,7 +8359,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer: {name}"
msgstr "Teilnehmer*in: {name}"
#: pretix/base/services/invoices.py:254 pretix/plugins/reports/exporters.py:298
msgctxt "subevent"
@@ -9156,7 +9156,7 @@ msgstr ""
#: pretix/base/settings.py:338
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
#: pretix/base/settings.py:339
msgid ""
@@ -9166,13 +9166,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py:357
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer erfragen"
msgstr "Namen der Teilnehmer*innen erfragen"
#: pretix/base/settings.py:358
msgid "Ask for a name for all personalized tickets."
@@ -9181,11 +9181,11 @@ msgstr ""
#: pretix/base/settings.py:367
msgid "Require attendee names"
msgstr "Namen der Teilnehmer erfordern"
msgstr "Namen der Teilnehmer*innen erfordern"
#: pretix/base/settings.py:368
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
#: pretix/base/settings.py:378
msgid "Ask for email addresses per ticket"
@@ -9207,7 +9207,7 @@ msgstr ""
"aktivierst, fragt das System zusätzlich nach einzelnen E-Mail-Adressen für "
"jedes personalisierte Ticket in der Bestellung. Dies könnte z.B. nützlich "
"sein, wenn du auch im Falle von Gruppenbestellungen individuelle Adressen "
"von jedem Teilnehmer benötigst. pretix sendet die Bestellbestätigung "
"von jeder Teilnehmer*in benötigst. pretix sendet die Bestellbestätigung "
"standardmäßig nach wie vor nur an die primäre Adresse, dies kann jedoch in "
"den E-Mail-Einstellungen angepasst werden."
@@ -9680,8 +9680,8 @@ msgid ""
"but no indication of missing payment will be visible on the ticket pages of "
"attendees who did not buy the ticket themselves."
msgstr ""
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
"aber Teilnehmer, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py:996
@@ -10124,7 +10124,7 @@ msgstr ""
#: pretix/base/settings.py:1512
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
#: pretix/base/settings.py:1513
msgid ""
@@ -10135,12 +10135,12 @@ msgid ""
"failed scans will not be counted, and the user will not see the different "
"check-in lists."
msgstr ""
"Wenn diese Option aktiv ist, können Kunden selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kund*innen selbst sehen, wie oft sie die "
"Veranstaltung betreten haben. Das ist normalerweise nicht nötig, aber kann "
"nützlich sein, wenn es Tickets gibt, die eine bestimmte Anzahl an Eintritten "
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py:1526
msgid "Allow users to download tickets"
@@ -10321,7 +10321,7 @@ msgstr ""
#: pretix/base/settings.py:1689 pretix/base/settings.py:1698
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
#: pretix/base/settings.py:1693
msgid "Allow customers to modify their information"
@@ -10429,7 +10429,7 @@ msgstr ""
#: pretix/base/settings.py:1799
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmer ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
#: pretix/base/settings.py:1800
msgid ""
@@ -10441,7 +10441,7 @@ msgid ""
msgstr ""
"Standardmäßig kann nur die Person, welche die Tickets gekauft hat, "
"Änderungen an der Bestellung vornehmen. Wenn diese Option aktiv ist, können "
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer können "
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen können "
"jedoch immer nur Änderungen vornehmen, welche die Gesamtkosten der "
"Bestellung nicht verändern. Solche Änderungen können nur vom Ticketkäufer "
"vorgenommen werden."
@@ -10625,7 +10625,7 @@ msgstr "Kontakt-E-Mail"
#: pretix/base/settings.py:2035 pretix/control/forms/event.py:1710
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Wir werden diese Adresse veröffentlichen um Teilnehmern zu ermöglichen, "
"Wir werden diese Adresse veröffentlichen um Teilnehmer*innen zu ermöglichen, "
"dich zu kontaktieren."
#: pretix/base/settings.py:2043 pretix/control/forms/event.py:1702
@@ -10707,7 +10707,7 @@ msgid ""
"people."
msgstr ""
"Du kannst dieses Feld benutzen um zusätzliche Informationen mit deinen "
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"einer digitalen Veranstaltung. Wenn das Feld leer ist, fügen wir automatisch "
"einen Link zum Ticketshop, die Einlass-Uhrzeit und den Veranstalter hier "
"ein. Es sind keine Platzhalter mit sensiblen personenbezogenen Daten "
@@ -10947,8 +10947,8 @@ msgstr ""
"Diese Datei wird an die erste E-Mail angehängt, die wir beim Eingang einer "
"neuen Bestellung verschicken. Sie kann daher mit den Textvorlagen "
"\"Getätigte Bestellung\", \"Kostenlose Bestellung\" oder \"Erhaltene "
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
"öffentlicher Informationen, da die Datei unabhängig davon verschickt wird, "
"ob die Bestellung bezahlt oder freigegeben ist. Um zu vermeiden, dass diese "
"wichtige E-Mail nicht ankommt, können nur PDF-Dateien mit maximal {size} MB "
@@ -12160,7 +12160,7 @@ msgstr ""
msgid ""
"You cannot require specifying attendee names if you do not ask for them."
msgstr ""
"Du kannst die Angabe von Teilnehmernamen nur erfordern, wenn auch nach "
"Du kannst die Angabe von Teilnehmer*innennamen nur erfordern, wenn auch nach "
"Namen gefragt wird."
#: pretix/base/settings.py:3820
@@ -13636,11 +13636,11 @@ msgstr "Ticket-Downloads"
#: pretix/control/forms/event.py:1692
msgid "Your customers will be able to download their tickets in PDF format."
msgstr ""
"Die Teilnehmer werden ihre Tickets im PDF-Format herunterladen können."
"Die Teilnehmer*innen werden ihre Tickets im PDF-Format herunterladen können."
#: pretix/control/forms/event.py:1696
msgid "Require all attendees to fill in their names"
msgstr "Erfordere, dass alle Teilnehmer ihre Namen ausfüllen"
msgstr "Erfordere, dass alle Teilnehmer*innen ihre Namen ausfüllen"
#: pretix/control/forms/event.py:1697
msgid ""
@@ -13676,7 +13676,7 @@ msgid ""
"then import your bank statements to process the payments within pretix, or "
"mark them as paid manually."
msgstr ""
"Deine Teilnehmer werden angewiesen, das Geld direkt auf dein Bankkonto "
"Deine Teilnehmer*innen werden angewiesen, das Geld direkt auf dein Bankkonto "
"zu überweisen. Du kannst dann deinen Kontoauszug in pretix importieren, um "
"Zahlungen zuzuweisen, oder die Bestellungen manuell als bezahlt markieren."
@@ -14020,7 +14020,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:1886
#: pretix/plugins/checkinlists/exporters.py:107
msgid "All attendees"
msgstr "Alle Teilnehmer"
msgstr "Alle Teilnehmer*innen"
#: pretix/control/forms/filter.py:1887
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -14590,7 +14590,7 @@ msgid ""
"people over 65. This ticket includes access to all parts of the event, "
"except the VIP area."
msgstr ""
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudenten, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -16205,7 +16205,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:485
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer verschickt."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/control/logdisplay.py:486
msgid ""
@@ -17863,7 +17863,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber"
msgstr "Karteninhaber*in"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -18158,7 +18158,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer gefunden."
msgstr "Keine passenden Teilnehmer*innen gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/orders/index.html:127
@@ -19684,7 +19684,7 @@ msgid ""
"provide ways for your attendees to contact you:"
msgstr ""
"Wenn irgendetwas schiefgeht oder unklar ist, empfehlen wir, dass du deinen "
"Teilnehmer die Möglichkeit gibst, dich zu benachrichtigen:"
"Teilnehmer*innen die Möglichkeit gibst, dich zu benachrichtigen:"
#: pretix/control/templates/pretixcontrol/event/settings.html:7
#: pretix/control/templates/pretixcontrol/event/settings.html:13
@@ -20641,7 +20641,7 @@ msgid ""
"Only purchases of such products will be considered \"attendees\" for most "
"statistical purposes or within some plugins."
msgstr ""
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html:39
@@ -20720,7 +20720,7 @@ msgid ""
"The system will not ask for a name or other attendee details. This only "
"affects system-provided fields, you can still add your own questions."
msgstr ""
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -21390,9 +21390,9 @@ msgid ""
"ticket. If you provide food, one example might be to ask your users about "
"dietary requirements."
msgstr ""
"Fragen erlauben deinen Besucher, zusätzliche Informationen zu ihrem "
"Fragen erlauben deinen Besucher*innen, zusätzliche Informationen zu ihrem "
"Ticket auszufüllen. Wenn deine Veranstaltung Verpflegung beinhaltet, "
"könntest du z.B. nach Allergien deiner Teilnehmer fragen."
"könntest du z.B. nach Allergien deiner Teilnehmer*innen fragen."
#: pretix/control/templates/pretixcontrol/items/questions.html:14
msgid "Create a new question"
@@ -21531,7 +21531,7 @@ msgstr ""
"Um deine Produkte verfügbar zu machen, musst du Kontingente anlegen. "
"Kontingente definieren, wie oft ein Produkt verkauft werden darf. Auf diese "
"Art kannst du konfigurieren, ob deine Veranstaltung unbegrenzt viele "
"Teilnehmer aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
"Teilnehmer*innen aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
"ein Produkt zu mehreren Kontingenten hinzufügen, um komplexere Anforderungen "
"abzubilden, z.B. wenn du die Gesamtzahl der Tickets begrenzen willst, aber "
"einen speziellen Ticket-Typ noch stärker begrenzen willst."
@@ -22859,7 +22859,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:104
#: pretix/control/templates/pretixcontrol/organizers/export.html:104
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer"
msgstr "Empfohlen für neue Benutzer*innen"
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:4
#: pretix/control/templates/pretixcontrol/orders/export_delete.html:6
@@ -23822,7 +23822,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:301
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:302
msgid ""
@@ -25978,7 +25978,7 @@ msgid ""
"customers. This way, customers will not be able to discover the waiting list."
msgstr ""
"Entsprechend deiner Veranstaltungseinstellungen werden ausverkaufte Produkte "
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:36
@@ -28250,7 +28250,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:423
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py:444
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -28524,7 +28524,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:91
msgid "Name of account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:93
msgid ""
@@ -28717,7 +28717,7 @@ msgstr "Bitte überweise den vollen Betrag auf das folgende Bankkonto:"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
msgid "Account holder"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/banktransfer/payment.py:468
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:17
@@ -29415,7 +29415,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py:499
@@ -30602,7 +30602,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:121
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to waiting list entries."
@@ -30630,7 +30630,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:136
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an einen Teilnehmer verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
#: pretix/plugins/sendmail/signals.py:137
msgid "An email rule was deleted"
@@ -30663,7 +30663,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
msgid "Attendee contact addresses"
msgstr "Teilnehmer-E-Mail-Adressen"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
msgid "All contact addresses"
@@ -30827,14 +30827,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer"
msgstr "Bestellungen oder Teilnehmer*innen"
#: pretix/plugins/sendmail/views.py:251
msgid ""
"Send an email to every customer, or to every person a ticket has been "
"purchased for, or a combination of both."
msgstr ""
"Sende eine E-Mail an alle Ticketkäufer, alle Ticketinhaber oder "
"Sende eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen oder "
"eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py:417
@@ -31355,23 +31355,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1232
msgid "Account Holder Name"
msgstr "Kontoinhaber"
msgstr "Kontoinhaber*in"
#: pretix/plugins/stripe/payment.py:1237
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber)"
msgstr "Straße (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1249
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber)"
msgstr "PLZ (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1261
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber)"
msgstr "Stadt (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1273
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber)"
msgstr "Land (Kontoinhaber*in)"
#: pretix/plugins/stripe/payment.py:1317
msgid "Affirm via Stripe"
@@ -33130,7 +33130,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:165
msgid "No attendee name provided"
msgstr "Name des Teilnehmenrs nicht angegeben"
msgstr "Name der teilnehmenden Person nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:218
msgid "The image you previously uploaded"
@@ -34762,12 +34762,12 @@ msgstr "Möchtest das folgende Profil wirklich aus deinem Kundenkonto löschen?"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
#: pretix/presale/views/customer.py:378
msgid "Attendee profiles"
msgstr "Teilnehmer-Adresse"
msgstr "Teilnehmer*innen-Adresse"
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
msgid "You dont have any attendee profiles in your account yet."
msgstr ""
"In deinem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
"In deinem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:6
msgid "Registration"
@@ -35817,7 +35817,7 @@ msgstr "Kosovo"
#~ "This plugin allows you to generate badges or name tags for your attendees."
#~ msgstr ""
#~ "Diese Erweiterung erlaubt, Namensschilder oder Badges für die "
#~ "Teilnehmer zu erstellen."
#~ "Teilnehmer*innen zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
@@ -36398,7 +36398,7 @@ msgstr "Kosovo"
#~ msgstr "Biete Ticket-Download bereits vor Bezahlung einer Bestellung an"
#~ msgid "Attendee names"
#~ msgstr "Teilnehmername"
#~ msgstr "Teilnehmer*innennamen"
#~ msgid "Enable output"
#~ msgstr "Aktivieren"
@@ -36681,7 +36681,7 @@ msgstr "Kosovo"
#~ "If checked, users can cancel orders by themselves as long as they are not "
#~ "yet paid."
#~ msgstr ""
#~ "Wenn diese Option aktiviert ist, können Teilnehmer selbstständig "
#~ "Wenn diese Option aktiviert ist, können Teilnehmer*innen selbstständig "
#~ "Bestellungen stornieren solange sie nicht bezahlt wurden."
#~ msgid "Sales overview"
+32 -62
View File
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
"PO-Revision-Date: 2025-03-27 00:00+0000\n"
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\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 5.10.4\n"
"X-Generator: Weblate 5.11.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -2996,11 +2996,9 @@ msgid "Repeat password"
msgstr "Repetir contraseña"
#: pretix/base/forms/questions.py:134 pretix/base/forms/questions.py:256
#, fuzzy
#| msgid "No country specified."
msgctxt "name_salutation"
msgid "not specified"
msgstr "No se especifica ningún país."
msgstr "sin especificar"
#: pretix/base/forms/questions.py:219
msgid "Please do not use special characters in names."
@@ -4270,20 +4268,14 @@ msgstr ""
"o acceder a una cuota agotada seguirá recibiendo el descuento."
#: pretix/base/models/discount.py:177
#, fuzzy
#| msgctxt "subevent"
#| msgid "All dates starting before"
msgctxt "subevent"
msgid "Available for dates starting from"
msgstr "Todas las fechas empezando antes"
msgstr "Disponible para fechas a partir de"
#: pretix/base/models/discount.py:182
#, fuzzy
#| msgctxt "subevent"
#| msgid "All dates starting before"
msgctxt "subevent"
msgid "Available for dates starting until"
msgstr "Todas las fechas empezando antes"
msgstr "Disponible para fechas hasta el"
#: pretix/base/models/discount.py:214
msgid ""
@@ -5599,19 +5591,12 @@ msgid "Unknown country code."
msgstr "Código de país desconocido."
#: pretix/base/models/items.py:1921 pretix/base/models/items.py:1923
#, fuzzy
#| msgid "The maximum count needs to be greater than the minimum count."
msgid "The maximum date must not be before the minimum value."
msgstr "El conteo máximo debe ser mayor que el conteo mínimo."
msgstr "La fecha máxima no debe ser anterior a la fecha mínima."
#: pretix/base/models/items.py:1925
#, fuzzy
#| msgid ""
#| "The maximum number of usages may not be lower than the minimum number of "
#| "usages."
msgid "The maximum value must not be lower than the minimum value."
msgstr ""
"El número máximo de usos no podrá ser inferior al número mínimo de usos."
msgstr "El valor máximo no debe ser inferior al mínimo."
#: pretix/base/models/items.py:1942
#: pretix/control/templates/pretixcontrol/items/question.html:90
@@ -11699,13 +11684,6 @@ msgid "Header image"
msgstr "Imagen de cabecera"
#: pretix/base/settings.py:2885
#, fuzzy
#| msgid ""
#| "If you provide a logo image, we will by default not show your event name "
#| "and date in the page header. By default, we show your logo with a size of "
#| "up to 1140x120 pixels. You can increase the size with the setting below. "
#| "We recommend not using small details on the picture as it will be resized "
#| "on smaller screens."
msgid ""
"If you provide a logo image, we will by default not show your event name and "
"date in the page header. If you use a white background, we show your logo "
@@ -11713,12 +11691,13 @@ msgid ""
"pixels. You can increase the size with the setting below. We recommend not "
"using small details on the picture as it will be resized on smaller screens."
msgstr ""
"Si proporciona una imagen de logotipo, de forma predeterminada no "
"mostraremos el nombre ni la fecha de su evento en el encabezado de la "
"página. De forma predeterminada, mostramos su logotipo con un tamaño de "
"hasta 1140x120 píxeles. Puede aumentar el tamaño con la configuración "
"siguiente. Recomendamos no utilizar pequeños detalles en la imagen, ya que "
"cambiará de tamaño en pantallas más pequeñas."
"Si proporciona una imagen de logotipo, por defecto no mostraremos el nombre "
"de su evento ni la fecha en la cabecera de la página. Si utiliza un fondo "
"blanco, mostraremos su logotipo con un tamaño máximo de 1140x120 píxeles. En "
"caso contrario, el tamaño máximo es de 1120x120 píxeles. Puede aumentar el "
"tamaño con la configuración que aparece a continuación. Recomendamos no "
"utilizar detalles pequeños en la imagen, ya que se redimensionará en las "
"pantallas más pequeñas."
#: pretix/base/settings.py:2906 pretix/base/settings.py:2949
msgid "Use header image in its full size"
@@ -11745,13 +11724,6 @@ msgstr ""
"título del evento."
#: pretix/base/settings.py:2929 pretix/control/forms/organizer.py:524
#, fuzzy
#| msgid ""
#| "If you provide a logo image, we will by default not show your "
#| "organization name in the page header. By default, we show your logo with "
#| "a size of up to 1140x120 pixels. You can increase the size with the "
#| "setting below. We recommend not using small details on the picture as it "
#| "will be resized on smaller screens."
msgid ""
"If you provide a logo image, we will by default not show your organization "
"name in the page header. If you use a white background, we show your logo "
@@ -11759,12 +11731,13 @@ msgid ""
"pixels. You can increase the size with the setting below. We recommend not "
"using small details on the picture as it will be resized on smaller screens."
msgstr ""
"Si proporciona una imagen de logotipo, de forma predeterminada no "
"mostraremos el nombre de su organización en el encabezado de la página. De "
"forma predeterminada, mostramos su logotipo con un tamaño de hasta 1140x120 "
"píxeles. Puede aumentar el tamaño con la configuración siguiente. "
"Recomendamos no utilizar pequeños detalles en la imagen, ya que cambiará de "
"tamaño en pantallas más pequeñas."
"Si proporciona una imagen de logotipo, por defecto no mostraremos el nombre "
"de su organización en la cabecera de la página. Si utiliza un fondo blanco, "
"mostraremos su logotipo con un tamaño máximo de 1140x120 píxeles. En caso "
"contrario, el tamaño máximo es de 1120x120 píxeles. Puede aumentar el tamaño "
"con la configuración que aparece a continuación. Recomendamos no utilizar "
"detalles pequeños en la imagen, ya que se redimensionará en las pantallas "
"más pequeñas."
#: pretix/base/settings.py:2959
msgid "Use header image also for events without an individually uploaded logo"
@@ -17931,8 +17904,8 @@ msgid_plural ""
"Are you sure you want to permanently delete the check-ins of "
"<strong>%(count)s tickets</strong>?"
msgstr[0] ""
"¿Está seguro de que desea eliminar permanentemente los registros de "
"<strong>check-in</strong>?."
"¿Está seguro de que desea eliminar permanentemente los registros de <strong"
">check-in</strong>?"
msgstr[1] ""
"¿Estás seguro de que deseas eliminar permanentemente los registros de "
"<strong>%(count)s check-in</strong>?"
@@ -24645,32 +24618,32 @@ msgstr "Idioma preferido"
#: pretix/control/templates/pretixcontrol/pdf/index.html:200
#: pretix/control/templates/pretixcontrol/pdf/index.html:210
#, fuzzy
#| msgid "Upload custom background"
msgid "Upload PDF as background"
msgstr "Subir fondo personalizado"
msgstr "Subir PDF como fondo"
#: pretix/control/templates/pretixcontrol/pdf/index.html:202
msgid ""
"You can upload a PDF to use as a custom background. The paper size will "
"match the PDF."
msgstr ""
"Puede cargar un PDF para utilizarlo como fondo personalizado. El tamaño del "
"papel coincidirá con el PDF."
#: pretix/control/templates/pretixcontrol/pdf/index.html:217
msgid "Download current background"
msgstr "Descargar fondo actual"
#: pretix/control/templates/pretixcontrol/pdf/index.html:224
#, fuzzy
#| msgid "Date chosen by customer"
msgid "Or choose custom paper size"
msgstr "Fecha elegida por el cliente"
msgstr "O elija un tamaño de papel personalizado"
#: pretix/control/templates/pretixcontrol/pdf/index.html:226
msgid ""
"To manually change the paper size, you need to create a new, empty "
"background."
msgstr ""
"Para cambiar manualmente el tamaño del papel, debe crear un nuevo fondo "
"vacío."
#: pretix/control/templates/pretixcontrol/pdf/index.html:234
#: pretix/control/templates/pretixcontrol/pdf/index.html:321
@@ -28066,10 +28039,9 @@ msgid "until"
msgstr "hasta"
#: pretix/helpers/daterange.py:106
#, fuzzy, python-brace-format
#| msgid "{date_from} {date_to}"
#, python-brace-format
msgid "{date_from}{until}{date_to}"
msgstr "{date_from} {date_to}"
msgstr "{date_from}{until}{date_to}"
#: pretix/helpers/images.py:61 pretix/helpers/images.py:67
#: pretix/helpers/images.py:85
@@ -31857,10 +31829,8 @@ msgid "Payer name"
msgstr "Nombre del pagador"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:91
#, fuzzy
#| msgid "Payment fee"
msgid "Payment receipt"
msgstr "Tarifa de pago"
msgstr "Recibo de pago"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/oauth_disconnect.html:12
msgid "Do you really want to disconnect your Stripe account?"
+12 -15
View File
@@ -8,16 +8,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
"PO-Revision-Date: 2025-03-27 00:00+0000\n"
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
"js/es/>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/"
"pretix-js/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.4\n"
"X-Generator: Weblate 5.11.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -918,12 +918,9 @@ msgid "Open ticket shop"
msgstr "Abrir tienda de tickets"
#: pretix/static/pretixpresale/js/widget/widget.js:48
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Checkout"
msgstr "Continuar pago"
msgstr "Pasar por caja"
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgctxt "widget"
@@ -1081,31 +1078,31 @@ msgstr "Dom"
#: pretix/static/pretixpresale/js/widget/widget.js:81
msgid "Monday"
msgstr ""
msgstr "Lunes"
#: pretix/static/pretixpresale/js/widget/widget.js:82
msgid "Tuesday"
msgstr ""
msgstr "Martes"
#: pretix/static/pretixpresale/js/widget/widget.js:83
msgid "Wednesday"
msgstr ""
msgstr "Miércoles"
#: pretix/static/pretixpresale/js/widget/widget.js:84
msgid "Thursday"
msgstr ""
msgstr "Jueves"
#: pretix/static/pretixpresale/js/widget/widget.js:85
msgid "Friday"
msgstr ""
msgstr "Viernes"
#: pretix/static/pretixpresale/js/widget/widget.js:86
msgid "Saturday"
msgstr ""
msgstr "Sábado"
#: pretix/static/pretixpresale/js/widget/widget.js:87
msgid "Sunday"
msgstr ""
msgstr "Domingo"
#: pretix/static/pretixpresale/js/widget/widget.js:90
msgid "January"
+31 -62
View File
@@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
"PO-Revision-Date: 2025-04-03 20:00+0000\n"
"Last-Translator: Loïc Alejandro <loic.alejandro@e.email>\n"
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/fr/"
">\n"
"Language: fr\n"
@@ -13,7 +13,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 5.10.4\n"
"X-Generator: Weblate 5.11.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -3000,11 +3000,9 @@ msgid "Repeat password"
msgstr "Répéter le mot de passe"
#: pretix/base/forms/questions.py:134 pretix/base/forms/questions.py:256
#, fuzzy
#| msgid "No country specified."
msgctxt "name_salutation"
msgid "not specified"
msgstr "Aucun pays spécifié."
msgstr "non spécifié"
#: pretix/base/forms/questions.py:219
msgid "Please do not use special characters in names."
@@ -4285,20 +4283,14 @@ msgstr ""
"quota épuisé recevront toujours la réduction."
#: pretix/base/models/discount.py:177
#, fuzzy
#| msgctxt "subevent"
#| msgid "All dates starting before"
msgctxt "subevent"
msgid "Available for dates starting from"
msgstr "Toutes les dates commençant avant"
msgstr "Disponible à partir de"
#: pretix/base/models/discount.py:182
#, fuzzy
#| msgctxt "subevent"
#| msgid "All dates starting before"
msgctxt "subevent"
msgid "Available for dates starting until"
msgstr "Toutes les dates commençant avant"
msgstr "Disponible pour des dates allant jusqu'au"
#: pretix/base/models/discount.py:214
msgid ""
@@ -5629,20 +5621,12 @@ msgid "Unknown country code."
msgstr "Code de pays inconnu."
#: pretix/base/models/items.py:1921 pretix/base/models/items.py:1923
#, fuzzy
#| msgid "The maximum count needs to be greater than the minimum count."
msgid "The maximum date must not be before the minimum value."
msgstr "Le nombre maximal doit être supérieur au nombre minimal."
msgstr "La date limite ne doit pas être antérieure à la date de début."
#: pretix/base/models/items.py:1925
#, fuzzy
#| msgid ""
#| "The maximum number of usages may not be lower than the minimum number of "
#| "usages."
msgid "The maximum value must not be lower than the minimum value."
msgstr ""
"Le nombre maximal dutilisations ne peut être inférieur au nombre minimal "
"dutilisations."
msgstr "La valeur maximale ne doit pas être inférieure à la valeur minimale."
#: pretix/base/models/items.py:1942
#: pretix/control/templates/pretixcontrol/items/question.html:90
@@ -11821,13 +11805,6 @@ msgid "Header image"
msgstr "Image den-tête"
#: pretix/base/settings.py:2885
#, fuzzy
#| msgid ""
#| "If you provide a logo image, we will by default not show your event name "
#| "and date in the page header. By default, we show your logo with a size of "
#| "up to 1140x120 pixels. You can increase the size with the setting below. "
#| "We recommend not using small details on the picture as it will be resized "
#| "on smaller screens."
msgid ""
"If you provide a logo image, we will by default not show your event name and "
"date in the page header. If you use a white background, we show your logo "
@@ -11835,12 +11812,13 @@ msgid ""
"pixels. You can increase the size with the setting below. We recommend not "
"using small details on the picture as it will be resized on smaller screens."
msgstr ""
"Si vous fournissez une image de logo, nous nafficherons pas par défaut le "
"nom et la date de votre événement dans len-tête de la page. Par défaut, "
"nous affichons votre logo avec une taille allant jusqu’à 1140x120 pixels. "
"Vous pouvez augmenter la taille avec le paramètre ci-dessous. Nous vous "
"recommandons de ne pas utiliser de petits détails sur limage car elle sera "
"redimensionnée sur des écrans plus petits."
"Si vous fournissez une image de logo, nous n'afficherons pas, par défaut, le "
"nom et la date de votre événement dans l'en-tête de la page. Si vous "
"utilisez un fond blanc, nous affichons votre logo dans une taille maximale "
"de 1140x120 pixels. Sinon, la taille maximale est de 1120x120 pixels. Vous "
"pouvez augmenter la taille à l'aide du paramètre ci-dessous. Nous vous "
"recommandons de ne pas utiliser de petits détails sur l'image car elle sera "
"redimensionnée sur les petits écrans."
#: pretix/base/settings.py:2906 pretix/base/settings.py:2949
msgid "Use header image in its full size"
@@ -11869,13 +11847,6 @@ msgstr ""
"le titre de l’événement sera toujours affiché."
#: pretix/base/settings.py:2929 pretix/control/forms/organizer.py:524
#, fuzzy
#| msgid ""
#| "If you provide a logo image, we will by default not show your "
#| "organization name in the page header. By default, we show your logo with "
#| "a size of up to 1140x120 pixels. You can increase the size with the "
#| "setting below. We recommend not using small details on the picture as it "
#| "will be resized on smaller screens."
msgid ""
"If you provide a logo image, we will by default not show your organization "
"name in the page header. If you use a white background, we show your logo "
@@ -11883,12 +11854,13 @@ msgid ""
"pixels. You can increase the size with the setting below. We recommend not "
"using small details on the picture as it will be resized on smaller screens."
msgstr ""
"Si vous fournissez une image de logo, nous nafficherons pas par défaut le "
"nom de votre organisation dans len-tête de la page. Par défaut, nous "
"affichons votre logo avec une taille allant jusqu’à 1140x120 pixels. Vous "
"pouvez augmenter la taille avec le paramètre ci-dessous. Nous vous "
"recommandons de ne pas utiliser de petits détails sur limage car elle sera "
"redimensionnée sur des écrans plus petits."
"Si vous fournissez une image de logo, nous n'afficherons pas, par défaut, le "
"nom de votre organisation dans l'en-tête de la page. Si vous utilisez un "
"fond blanc, nous affichons votre logo dans une taille maximale de 1140x120 "
"pixels. Sinon, la taille maximale est de 1120x120 pixels. Vous pouvez "
"augmenter la taille à l'aide du paramètre ci-dessous. Nous vous recommandons "
"de ne pas utiliser de petits détails sur l'image car elle sera "
"redimensionnée sur les petits écrans."
#: pretix/base/settings.py:2959
msgid "Use header image also for events without an individually uploaded logo"
@@ -24833,32 +24805,32 @@ msgstr "Langue préférée"
#: pretix/control/templates/pretixcontrol/pdf/index.html:200
#: pretix/control/templates/pretixcontrol/pdf/index.html:210
#, fuzzy
#| msgid "Upload custom background"
msgid "Upload PDF as background"
msgstr "Télécharger un arrière-plan personnalisé"
msgstr "Télécharger un PDF comme arrière-pla"
#: pretix/control/templates/pretixcontrol/pdf/index.html:202
msgid ""
"You can upload a PDF to use as a custom background. The paper size will "
"match the PDF."
msgstr ""
"Vous pouvez télécharger un PDF à utiliser comme arrière-plan personnalisé. "
"La taille du papier correspondra à celle du PDF."
#: pretix/control/templates/pretixcontrol/pdf/index.html:217
msgid "Download current background"
msgstr "Télécharger l'arrière plan actuel"
#: pretix/control/templates/pretixcontrol/pdf/index.html:224
#, fuzzy
#| msgid "Date chosen by customer"
msgid "Or choose custom paper size"
msgstr "Date choisie par le client"
msgstr "Ou choisir un format de papier personnalisé"
#: pretix/control/templates/pretixcontrol/pdf/index.html:226
msgid ""
"To manually change the paper size, you need to create a new, empty "
"background."
msgstr ""
"Pour modifier manuellement le format du papier, vous devez créer un nouvel "
"arrière-plan vide."
#: pretix/control/templates/pretixcontrol/pdf/index.html:234
#: pretix/control/templates/pretixcontrol/pdf/index.html:321
@@ -28288,10 +28260,9 @@ msgid "until"
msgstr "jusqu’à"
#: pretix/helpers/daterange.py:106
#, fuzzy, python-brace-format
#| msgid "{date_from} {date_to}"
#, python-brace-format
msgid "{date_from}{until}{date_to}"
msgstr "{date_from} {date_to}"
msgstr "{date_from} {until}{date_to}"
#: pretix/helpers/images.py:61 pretix/helpers/images.py:67
#: pretix/helpers/images.py:85
@@ -32115,10 +32086,8 @@ msgid "Payer name"
msgstr "Nom du payeur"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:91
#, fuzzy
#| msgid "Payment fee"
msgid "Payment receipt"
msgstr "Frais de paiement"
msgstr "Reçu de paiement"
#: pretix/plugins/stripe/templates/pretixplugins/stripe/oauth_disconnect.html:12
msgid "Do you really want to disconnect your Stripe account?"
+9 -12
View File
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:08+0000\n"
"PO-Revision-Date: 2025-03-27 00:00+0000\n"
"PO-Revision-Date: 2025-04-29 18:00+0000\n"
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
"fr/>\n"
@@ -16,7 +16,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 5.10.4\n"
"X-Generator: Weblate 5.11.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -918,9 +918,6 @@ msgid "Open ticket shop"
msgstr "Ouvrir la billetterie"
#: pretix/static/pretixpresale/js/widget/widget.js:48
#, fuzzy
#| msgctxt "widget"
#| msgid "Resume checkout"
msgctxt "widget"
msgid "Checkout"
msgstr "Finaliser ma commande"
@@ -1080,31 +1077,31 @@ msgstr "Di"
#: pretix/static/pretixpresale/js/widget/widget.js:81
msgid "Monday"
msgstr ""
msgstr "Lundi"
#: pretix/static/pretixpresale/js/widget/widget.js:82
msgid "Tuesday"
msgstr ""
msgstr "Mardi"
#: pretix/static/pretixpresale/js/widget/widget.js:83
msgid "Wednesday"
msgstr ""
msgstr "Mercredi"
#: pretix/static/pretixpresale/js/widget/widget.js:84
msgid "Thursday"
msgstr ""
msgstr "Jeudi"
#: pretix/static/pretixpresale/js/widget/widget.js:85
msgid "Friday"
msgstr ""
msgstr "Vendredi"
#: pretix/static/pretixpresale/js/widget/widget.js:86
msgid "Saturday"
msgstr ""
msgstr "Samedi"
#: pretix/static/pretixpresale/js/widget/widget.js:87
msgid "Sunday"
msgstr ""
msgstr "Dimanche"
#: pretix/static/pretixpresale/js/widget/widget.js:90
msgid "January"
+8 -8
View File
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-04-28 11:06+0000\n"
"PO-Revision-Date: 2025-03-19 01:00+0000\n"
"Last-Translator: Rosariocastellana <rosariocastellana@gmail.com>\n"
"PO-Revision-Date: 2025-04-29 01:00+0000\n"
"Last-Translator: Davide Manzella <manzella.davide97@gmail.com>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix/"
"it/>\n"
"Language: it\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 5.10.3\n"
"X-Generator: Weblate 5.11.1\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -27013,7 +27013,7 @@ msgstr ""
#: pretix/plugins/banktransfer/payment.py:161
msgid "Do not include hyphens in the payment reference."
msgstr ""
msgstr "Non includere trattini nella referenza di pagamento."
#: pretix/plugins/banktransfer/payment.py:162
msgid "This is required in some countries."
@@ -27025,7 +27025,7 @@ msgstr ""
#: pretix/plugins/banktransfer/payment.py:170
msgid "Prefix for the payment reference"
msgstr ""
msgstr "Prefisso per il riferimento pagamento"
#: pretix/plugins/banktransfer/payment.py:174
msgid "Additional text to show on pending orders"
@@ -27249,7 +27249,7 @@ msgstr "Ti daremo il codice di riferimento dopo aver completato l'ordine."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:26
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:39
msgid "Reference code (important):"
msgstr ""
msgstr "Codice di riferimento personale (importante):"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_confirm.html:31
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:31
@@ -27288,7 +27288,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:38
msgid "Reference code"
msgstr ""
msgstr "Codice di riferimento personale"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:4
msgid ""
@@ -30057,7 +30057,7 @@ msgstr ""
#: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:19
msgid "Enter the entity number, reference number, and amount."
msgstr ""
msgstr "Inserire il Numero dell'entità, il codice riferimento, e la quantità."
#: pretix/plugins/stripe/templates/pretixplugins/stripe/pending.html:25
msgid "Entity number:"
@@ -1,8 +1,7 @@
.banktransfer-swiss-cross-overlay {
position: relative;
width: 150px;
height: 150px;
margin: 0 auto 10px;
margin: 0 auto;
}
.banktransfer-swiss-cross {
position: absolute;
@@ -44,34 +44,28 @@
</p>
</div>
{% if settings.bank_details_type == "sepa" and any_barcodes %}
<div class="col-md-6 col-sm-6 hidden-xs text-center js-only blank-after">
<ul class="nav nav-tabs" id="banktransfer_qrcodes_tabs" role="tablist">
<div class="tabcontainer col-md-6 col-sm-6 hidden-xs text-center js-only blank-after">
<div id="banktransfer_qrcodes_tabs_content" class="tabpanels blank-after">
{% if swiss_qrbill %}
<li class="active"><a href="#banktransfer_qrcodes_qrbill" role="tab" id="banktransfer_qrcodes_qrbill_tab" data-toggle="tab" aria-controls="banktransfer_qrcodes_qrbill" aria-expanded="true">QR-bill</a></li>
{% endif %}
{% if eu_barcodes %}
<li {% if not swiss_qrbill %}class="active"{% endif %}><a href="#banktransfer_qrcodes_girocode" role="tab" id="banktransfer_qrcodes_girocode_tab" data-toggle="tab" aria-controls="banktransfer_qrcodes_girocode" aria-expanded="{% if swiss_qrbill %}false{% else %}true{% endif %}">EPC-QR</a></li>
<li class=""><a href="#banktransfer_qrcodes_bezahlcode" role="tab" id="banktransfer_qrcodes_bezahlcode_tab" data-toggle="tab" aria-controls="banktransfer_qrcodes_bezahlcode" aria-expanded="false">BezahlCode</a></li>
{% endif %}
</ul>
<div class="tab-content" id="banktransfer_qrcodes_tabs_content">
{% if swiss_qrbill %}
<div id="banktransfer_qrcodes_qrbill" class="tab-pane fade active in" role="tabpanel" aria-labelledby="banktransfer_qrcodes_qrbill_tab">
<p class="small">
{% trans "Scan the qr-code with your banking app" %}
</p>
<p class="banktransfer-swiss-cross-overlay">
<div id="banktransfer_qrcodes_qrbill"
role="tabpanel"
tabindex="0"
aria-labelledby="banktransfer_qrcodes_qrbill_tab"
>
<div class="banktransfer-swiss-cross-overlay" role="figure" aria-labelledby="banktransfer_qrcodes_qrbill_tab banktransfer_qrcodes_label">
<svg class="banktransfer-swiss-cross" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.8 19.8"><path stroke="#fff" stroke-width="1.436" d="M.7.7h18.4v18.4H.7z"/><path fill="#fff" d="M8.3 4h3.3v11H8.3z"/><path fill="#fff" d="M4.4 7.9h11v3.3h-11z"/></svg>
<script type="text/plain" data-size="150" data-replace-with-qr data-desc="{% trans 'Scan this image with your banking apps QR-Reader to start the payment process.' %}">{{swiss_qrbill}}</script>
</p>
</div>
</div>
{% endif %}
{% if eu_barcodes %}
<div id="banktransfer_qrcodes_girocode" class="tab-pane fade {% if not swiss_qrbill %}active in{% endif %}" role="tabpanel" aria-labelledby="banktransfer_qrcodes_girocode_tab">
<p class="small">
{% trans "Scan the qr-code with your banking app" %}
</p>
<p>
<div id="banktransfer_qrcodes_girocode"
role="tabpanel"
tabindex="0"
{{ swiss_qrbill|yesno:'hidden,' }}
aria-labelledby="banktransfer_qrcodes_girocode_tab"
>
<div role="figure" aria-labelledby="banktransfer_qrcodes_girocode_tab banktransfer_qrcodes_label">
<script type="text/plain" data-size="150" data-replace-with-qr data-desc="{% trans 'Scan this image with your banking apps QR-Reader to start the payment process.' %}">BCD
002
2
@@ -85,20 +79,55 @@ SCT
{{ code }}
</script>
</p>
</div>
</div>
<div id="banktransfer_qrcodes_bezahlcode" class="tab-pane fade" role="tabpanel" aria-labelledby="banktransfer_qrcodes_bezahlcode_tab">
<p class="small">
{% trans "Scan the qr-code with your banking app" %}
</p>
<p>
<a aria-label="{% trans "Open BezahlCode in your banking app to start the payment process." %}" href="bank://singlepaymentsepa?name={{ settings.bank_details_sepa_name|urlencode }}&iban={{ settings.bank_details_sepa_iban }}&bic={{ settings.bank_details_sepa_bic }}&amount={{ amount|commadecimal }}&reason={{ code }}&currency={{ event.currency }}">
<div id="banktransfer_qrcodes_bezahlcode"
role="tabpanel"
tabindex="0"
hidden
aria-labelledby="banktransfer_qrcodes_bezahlcode_tab"
>
<a aria-label="{% trans "Open BezahlCode in your banking app to start the payment process." %}" href="bank://singlepaymentsepa?name={{ settings.bank_details_sepa_name|urlencode }}&iban={{ settings.bank_details_sepa_iban }}&bic={{ settings.bank_details_sepa_bic }}&amount={{ amount|commadecimal }}&reason={{ code }}&currency={{ event.currency }}">
<div role="figure" aria-labelledby="banktransfer_qrcodes_bezahlcode_tab banktransfer_qrcodes_label">
<script type="text/plain" data-size="150" data-replace-with-qr data-desc="{% trans 'Scan this image with your banking apps QR-Reader to start the payment process.' %}">bank://singlepaymentsepa?name={{ settings.bank_details_sepa_name|urlencode }}&iban={{ settings.bank_details_sepa_iban }}&bic={{ settings.bank_details_sepa_bic }}&amount={{ amount|commadecimal }}&reason={{ code }}&currency={{ event.currency }}</script>
</a>
</p>
</div>
</a>
</div>
{% endif %}
</div>
<div id="banktransfer_qrcodes_tabs" role="tablist" aria-labelledby="banktransfer_qrcodes_label" class="blank-after btn-group">
{% if swiss_qrbill %}
<button
class="btn btn-default"
id="banktransfer_qrcodes_qrbill_tab"
type="button"
role="tab"
aria-controls="banktransfer_qrcodes_qrbill"
aria-selected="true"
tabindex="-1">QR-bill</button>
{% endif %}
{% if eu_barcodes %}
<button
class="btn btn-default"
id="banktransfer_qrcodes_girocode_tab"
type="button"
role="tab"
aria-controls="banktransfer_qrcodes_girocode"
aria-selected="{{ swiss_qrbill|yesno:"false,true" }}"
tabindex="-1">EPC-QR</button>
<button
class="btn btn-default"
id="banktransfer_qrcodes_bezahlcode_tab"
type="button"
role="tab"
aria-controls="banktransfer_qrcodes_bezahlcode"
aria-selected="false"
tabindex="-1">BezahlCode</button>
{% endif %}
</div>
<p class="text-muted" id="banktransfer_qrcodes_label">
{% trans "Scan the QR code with your banking app" %}
</p>
</div>
{% endif %}
</div>
@@ -142,4 +171,4 @@ SCT
</div>
</form>
<hr>
{% endif %}
{% endif %}
+6 -2
View File
@@ -33,6 +33,7 @@ def render_label(content, label_for=None, label_class=None, label_title='', labe
"""
Render a label with content
"""
tag = 'label'
attrs = attrs or {}
if label_for:
attrs['for'] = label_for
@@ -58,15 +59,18 @@ def render_label(content, label_for=None, label_class=None, label_title='', labe
attrs['class'] += ' label-empty'
# usually checkboxes have overall empty labels and special labels per checkbox
# => remove for-attribute as well as "required"-text appended to label
tag = 'div'
if 'for' in attrs:
del attrs['for']
elif not optional:
opt += '<i class="sr-only label-required">, {}</i>'.format(pgettext('form', 'required'))
opt += '<i class="label-required">{}</i>'.format(pgettext('form', 'required'))
opt += '<strong class="label-alert" role="alert"></strong>'
builder = '<{tag}{attrs}>{content}{opt}</{tag}>'
return format_html(
builder,
tag='label',
tag=tag,
attrs=mark_safe(flatatt(attrs)) if attrs else '',
opt=mark_safe(opt),
content=text_value(content),
@@ -205,7 +205,7 @@
{% else %}
<fieldset class="input-item-count-group" aria-describedby="c-{{ form.pos.pk }}-{{ category_idx }}-addon-count-desc cp-{{ form.pos.pk }}-item-{{ item.pk }}-min-order">
<legend class="sr-only">{% blocktrans with item=item.name %}Add {{ item }}, {{ var }} to cart{% endblocktrans %}</legend>
<button type="button" data-step="-1" data-controls="cp_{{ form.pos.pk }}_variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}">-</button>
<button type="button" data-step="-1" data-controls="cp_{{ form.pos.pk }}_variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-dec" aria-label="- {{ item }}, {{ var }}: {% trans "Decrease quantity" %}">-</button>
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
{% if var.initial %}value="{{ var.initial }}"{% endif %}
{% if item.free_price %}
@@ -215,7 +215,7 @@
id="cp_{{ form.pos.pk }}_variation_{{ item.id }}_{{ var.id }}"
name="cp_{{ form.pos.pk }}_variation_{{ item.id }}_{{ var.id }}"
aria-label="{% trans "Quantity" %}">
<button type="button" data-step="1" data-controls="cp_{{ form.pos.pk }}_variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}">+</button>
<button type="button" data-step="1" data-controls="cp_{{ form.pos.pk }}_variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-inc" aria-label="+ {{ item }}, {{ var }}: {% trans "Increase quantity" %}">+</button>
</fieldset>
{% endif %}
</div>
@@ -351,7 +351,7 @@
{% else %}
<fieldset class="input-item-count-group" aria-describedby="c-{{ form.pos.pk }}-{{ category_idx }}-addon-count-desc cp-{{ form.pos.pk }}-item-{{ item.pk }}-min-order">
<legend class="sr-only">{% blocktrans with item=item.name %}Add {{ item }} to cart{% endblocktrans %}</legend>
<button type="button" data-step="-1" data-controls="cp_{{ form.pos.pk }}_item_{{ item.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}">-</button>
<button type="button" data-step="-1" data-controls="cp_{{ form.pos.pk }}_item_{{ item.id }}" class="btn btn-default input-item-count-dec" aria-label="- {{ item }}: {% trans "Decrease quantity" %}">-</button>
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
{% if item.free_price %}
data-checked-onchange="price-item-{{ form.pos.pk }}-{{ item.pk }}"
@@ -361,7 +361,7 @@
name="cp_{{ form.pos.pk }}_item_{{ item.id }}"
id="cp_{{ form.pos.pk }}_item_{{ item.id }}"
aria-label="{% trans "Quantity" %}">
<button type="button" data-step="1" data-controls="cp_{{ form.pos.pk }}_item_{{ item.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}">+</button>
<button type="button" data-step="1" data-controls="cp_{{ form.pos.pk }}_item_{{ item.id }}" class="btn btn-default input-item-count-inc" aria-label="+ {{ item }}: {% trans "Increase quantity" %}">+</button>
</fieldset>
{% endif %}
</div>
@@ -11,8 +11,11 @@
<span role="columnheader" aria-sort="none">{% trans "Product" %}</span>
{% if download %}
<span role="columnheader" aria-sort="none">{% trans "Ticket download" %}</span>
{% elif not hide_prices %}
<span role="columnheader" aria-sort="none">{% trans "Price per item" %}</span>
{% else %}
<span role="columnheader" aria-sort="none">{% trans "Quantity" %}</span>
{% if not hide_prices %}
<span role="columnheader" aria-sort="none">{% trans "Price per item" %}</span>
{% endif %}
{% endif %}
{% if not hide_prices %}
<span role="columnheader" aria-sort="none">{% trans "Price total" %}</span>
@@ -392,12 +395,20 @@
{% endfor %}
{% endfor %}
{% for fee in cart.fees %}
<div class="row cart-row">
<div class="col-md-4 col-xs-6">
<div role="row" class="row cart-row">
<div role="cell" class="col-md-4 col-xs-6">
<strong>{{ fee.get_fee_type_display }}</strong>
</div>
{% if download %}
<div role="cell"></div>
{% else %}
<div role="cell"></div>
{% if not hide_prices %}
<div role="cell"></div>
{% endif %}
{% endif %}
{% if not hide_prices %}
<div class="col-md-3 col-xs-6 col-md-offset-5 price">
<div role="cell" class="col-md-3 col-xs-6 col-md-offset-5 price">
{% if event.settings.display_net_prices %}
<strong>{{ fee.net_value|money:event.currency }}</strong>
{% if fee.tax_rate %}
@@ -221,7 +221,7 @@
{% else %}
<fieldset class="input-item-count-group">
<legend class="sr-only">{% blocktrans with item=item.name %}Add {{ item }}, {{ var }} to cart{% endblocktrans %}</legend>
<button type="button" data-step="-1" data-controls="{{ form_prefix }}variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}"
<button type="button" data-step="-1" data-controls="{{ form_prefix }}variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-dec" aria-label="- {{ item }}, {{ var }}: {% trans "Decrease quantity" %}"
{% if not ev.presale_is_running %}disabled{% endif %}>-</button>
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
{% if not ev.presale_is_running %}disabled{% endif %}
@@ -232,7 +232,7 @@
id="{{ form_prefix }}variation_{{ item.id }}_{{ var.id }}"
name="{{ form_prefix }}variation_{{ item.id }}_{{ var.id }}"
aria-label="{% trans "Quantity" %}">
<button type="button" data-step="1" data-controls="{{ form_prefix }}variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}"
<button type="button" data-step="1" data-controls="{{ form_prefix }}variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-inc" aria-label="+ {{ item }}, {{ var }}: {% trans "Increase quantity" %}"
{% if not ev.presale_is_running %}disabled{% endif %}>+</button>
</fieldset>
{% endif %}
@@ -262,7 +262,7 @@
</a>
{% endif %}
<div class="product-description {% if item.picture %}with-picture{% endif %}">
<h{{ headline_level|default:3|add:1 }} class="h4" id="{{ form_prefix }}item-{{ item.pk }}-legend">{{ item.name }}</h{{ headline_level|default:3 }}>
<h{{ headline_level|default:3|add:1 }} class="h4" id="{{ form_prefix }}item-{{ item.pk }}-legend">{{ item.name }}</h{{ headline_level|default:3|add:1 }}>
{% if item.description %}
<div id="{{ form_prefix }}item-{{ item.pk }}-description" class="product-description">
{{ item.description|localize|rich_text }}
@@ -373,7 +373,7 @@
{% else %}
<fieldset class="input-item-count-group">
<legend class="sr-only">{% blocktrans with item=item.name %}Add {{ item }} to cart{% endblocktrans %}</legend>
<button type="button" data-step="-1" data-controls="{{ form_prefix }}item_{{ item.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}"
<button type="button" data-step="-1" data-controls="{{ form_prefix }}item_{{ item.id }}" class="btn btn-default input-item-count-dec" aria-label="- {{ item }}: {% trans "Decrease quantity" %}"
{% if not ev.presale_is_running %}disabled{% endif %}>-</button>
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
{% if not ev.presale_is_running %}disabled{% endif %}
@@ -385,7 +385,7 @@
name="{{ form_prefix }}item_{{ item.id }}"
id="{{ form_prefix }}item_{{ item.id }}"
aria-label="{% trans "Quantity" %}">
<button type="button" data-step="1" data-controls="{{ form_prefix }}item_{{ item.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}"
<button type="button" data-step="1" data-controls="{{ form_prefix }}item_{{ item.id }}" class="btn btn-default input-item-count-inc" aria-label="+ {{ item }}: {% trans "Increase quantity" %}"
{% if not ev.presale_is_running %}disabled{% endif %}>+</button>
</fieldset>
{% endif %}
@@ -16,6 +16,7 @@
<br>
<span data-time="{{ subev.date_from.isoformat }}" data-timezone="{{ event.timezone }}" data-time-short>
{% icon "clock-o" %}
<span class="sr-only">{% trans "Time of day" %}</span>
<time datetime="{{ subev.date_from.isoformat }}">{{ subev.date_from|date:"TIME_FORMAT" }}</time>
</span>
{% endif %}
@@ -233,14 +233,14 @@
{% else %}
<fieldset class="input-item-count-group">
<legend class="sr-only">{% blocktrans with item=item.name %}Add {{ item }}, {{ var }} to cart{% endblocktrans %}</legend>
<button type="button" data-step="-1" data-controls="variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}">-</button>
<button type="button" data-step="-1" data-controls="variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-dec" aria-label="- {{ item }}, {{ var }}: {% trans "Decrease quantity" %}">-</button>
<input type="number" class="form-control input-item-count" placeholder="0" min="0"
max="{{ var.order_max }}"
id="variation_{{ item.id }}_{{ var.id }}"
name="variation_{{ item.id }}_{{ var.id }}"
{% if options == 1 %}value="1"{% endif %}
aria-label="{% trans "Quantity" %}">
<button type="button" data-step="1" data-controls="variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}">+</button>
<button type="button" data-step="1" data-controls="variation_{{ item.id }}_{{ var.id }}" class="btn btn-default input-item-count-inc" aria-label="+ {{ item }}, {{ var }}: {% trans "Increase quantity" %}">+</button>
</fieldset>
{% endif %}
{% else %}
@@ -388,7 +388,7 @@
{% else %}
<fieldset class="input-item-count-group">
<legend class="sr-only">{% blocktrans with item=item.name %}Add {{ item }} to cart{% endblocktrans %}</legend>
<button type="button" data-step="-1" data-controls="item_{{ item.id }}" class="btn btn-default input-item-count-dec" aria-label="{% trans "Decrease quantity" %}">-</button>
<button type="button" data-step="-1" data-controls="item_{{ item.id }}" class="btn btn-default input-item-count-dec" aria-label="- {{ item }}: {% trans "Decrease quantity" %}">-</button>
<input type="number" class="form-control input-item-count"
placeholder="0" min="0"
max="{{ item.order_max }}"
@@ -396,7 +396,7 @@
name="item_{{ item.id }}"
{% if options == 1 %}value="1"{% endif %}
aria-label="{% trans "Quantity" %}">
<button type="button" data-step="1" data-controls="item_{{ item.id }}" class="btn btn-default input-item-count-inc" aria-label="{% trans "Increase quantity" %}">+</button>
<button type="button" data-step="1" data-controls="item_{{ item.id }}" class="btn btn-default input-item-count-inc" aria-label="+ {{ item }}: {% trans "Increase quantity" %}">+</button>
</fieldset>
{% endif %}
{% else %}
@@ -69,6 +69,7 @@
<br>
<span class="text-muted" data-time="{{ e.date_from.isoformat }}" data-timezone="{{ e.tzname }}">
{% icon "clock-o" %}
<span class="sr-only">{% trans "Time of day" %}</span>
<time datetime="{{ e.date_from|date_fast:"H:i" }}">{{ e.date_from|date:"TIME_FORMAT" }}</time>
{% if e.settings.show_date_to and e.date_to and e.date_to.date == e.date_from.date %}
<span aria-hidden="true"></span><span class="sr-only">{% trans "until" context "timerange" %}</span>
+4 -4
View File
@@ -70,6 +70,7 @@ from pretix.helpers.formats.en.formats import (
SHORT_MONTH_DAY_FORMAT, WEEK_FORMAT,
)
from pretix.helpers.http import redirect_to_url
from pretix.helpers.i18n import parse_date_localized
from pretix.helpers.thumb import get_thumbnail
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.presale.forms.organizer import EventListFilterForm
@@ -927,10 +928,9 @@ class DayCalendarView(OrganizerViewMixin, EventListMixin, TemplateView):
def _set_date(self):
if 'date' in self.request.GET:
self.tz = self.request.organizer.timezone
try:
self.date = dateutil.parser.parse(self.request.GET.get('date')).date()
except ValueError:
self.date = now().astimezone(self.tz).date()
self.date = (
parse_date_localized(self.request.GET.get('date')) or now().astimezone(self.tz)
).date()
else:
self._set_date_to_next_event()
+1016 -990
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -4,8 +4,8 @@
"private": true,
"scripts": {},
"dependencies": {
"@babel/core": "^7.26.10",
"@babel/preset-env": "^7.26.9",
"@babel/core": "^7.27.1",
"@babel/preset-env": "^7.27.1",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^16.0.1",
"vue": "^2.7.16",
+42 -4
View File
@@ -4,6 +4,26 @@ $(document).on("pretix:bind-forms", function () {
function cleanup(l) {
return $.trim(l.replace(/\n/g, ", "));
}
function combine($sel) {
var parts = [
$sel.filter("[name*=street]").val(),
$sel.filter("[name*=zipcode]").val(),
$sel.filter("[name*=city]").val(),
$sel.filter("[name*=state]").val(),
$sel.filter("[name*=country]").find("option:selected").text(),
$sel.filter("[name*=location]").val(),
]
var res = "";
for (var val of parts) {
if (val) {
if (res) {
res += ", "
}
res += val
}
}
return cleanup(res)
}
$(".geodata-section").each(function () {
// Geocoding
// detach notifications and append them to first label (should be from location)
@@ -13,8 +33,26 @@ $(document).on("pretix:bind-forms", function () {
var lat;
var lon;
var $updateButton = $("[data-action=update]", this);
var $location = $("textarea[lang=en], input[lang=en]", this).first();
if (!$location.length) $location = $("textarea, input[type=text]", this).first();
var $location;
// The .geodata-section is expected to include either...
// ... an English "location" field
if ($("textarea[lang=en], input[lang=en]", this).length) {
$location = $("textarea[lang=en], input[lang=en], select", this).not("[name*=geo_]");
}
// ... a "location" field in any other language
if (!$location || !$location.length) {
var lang = $("textarea, input[type=text]", this).not("[name*=geo_]").first().attr("lang");
if (lang) {
$location = $("textarea[lang=" + lang + "], input[lang=" + lang + "], select", this);
}
}
// ... or a set of fields like a full address form
if (!$location || !$location.length) {
$location = $("textarea, input, select", this).not("[name*=geo_]");
}
if (!$lat.length || !$lon.length || !$location.length) {
return;
@@ -23,7 +61,7 @@ $(document).on("pretix:bind-forms", function () {
var debounceLoad, debounceLatLonChange, delayUpdateDismissal;
var touched = $lat.val() !== "";
var xhr;
var lastLocation = cleanup($location.val());
var lastLocation = combine($location);
function load() {
window.clearTimeout(debounceLoad);
@@ -32,7 +70,7 @@ $(document).on("pretix:bind-forms", function () {
xhr = null;
}
var q = cleanup($location.val());
var q = combine($location);
if (q === "" || q === lastLocation) return;
lastLocation = q;
@@ -60,6 +60,7 @@ var form_handlers = function (el) {
locale: $("body").attr("data-datetimelocale"),
useCurrent: false,
showClear: !$(this).prop("required"),
keepInvalid: true,
icons: {
time: 'fa fa-clock-o',
date: 'fa fa-calendar',
@@ -82,6 +83,8 @@ var form_handlers = function (el) {
Math.abs(+new Date(opts.minDate) - new Date()) < Math.abs(+new Date(opts.maxDate) - new Date())
) ? opts.minDate : opts.maxDate;
}
var container = $(this).closest(".form-group");
var alert = $('.label-alert', container);
$(this).datetimepicker(opts).on("dp.hide", function() {
// when min/max is used in datetimepicker, closing and re-opening the picker opens at the wrong date
// therefore keep the current viewDate and re-set it after datetimepicker is done hiding
@@ -90,7 +93,32 @@ var form_handlers = function (el) {
window.setTimeout(function () {
$dtp.viewDate(currentViewDate);
}, 50);
}).on('dp.error', function (e) {
container.addClass("has-error");
if (e.date) {
if (e.date.isBefore(opts["minDate"])) {
alert.text(gettext("The date you entered is too early."));
} else if (e.date.isAfter(opts["maxDate"])) {
alert.text(gettext("The date you entered is too late."));
}
} else {
alert.text(gettext("We could not recognize the date you entered."));
}
var self = this;
window.setTimeout(function () {
self.focus();
}, 50);
}).on('dp.change', function (e) {
container.removeClass("has-error");
alert.text("");
}).on('blur', function (e) {// dp.change does not trigger when changed to empty string - although documentation notes otherwise
if (!this.value) {
container.removeClass("has-error");
alert.text("");
}
});
if ($(this).parent().is('.splitdatetimerow')) {
$(this).on("dp.change", function (ev) {
var $timepicker = $(this).closest(".splitdatetimerow").find(".timepickerfield");
@@ -314,6 +342,49 @@ function setup_basics(el) {
$(this).parent().parent().find('.addon-variation-description').stop().slideDown();
}
});
// tabs - see https://www.w3.org/WAI/ARIA/apg/patterns/tabs/examples/tabs-automatic/ for reference
el.find('.tabcontainer').each(function() {
var currentTab;
function setCurrentTab(tab) {
if (tab == currentTab) return;
if (currentTab) {
currentTab.setAttribute('aria-selected', 'false');
currentTab.tabIndex = -1;
currentTab.classList.remove('active');
document.getElementById(currentTab.getAttribute('aria-controls')).setAttribute('hidden', 'hidden');
}
tab.setAttribute('aria-selected', 'true');
tab.removeAttribute('tabindex');
tab.classList.add('active');
document.getElementById(tab.getAttribute('aria-controls')).removeAttribute('hidden');
currentTab = tab;
}
var tabs = $('button[role=tab]').on('keydown', function(event) {
if (['ArrowLeft', 'ArrowRight', 'Home', 'End'].indexOf(event.key) == -1) {
return;
}
event.stopPropagation();
event.preventDefault();
if (event.key == 'ArrowLeft') {
setCurrentTab(currentTab.previousElementSibling || lastTab);
} else if (event.key == 'ArrowRight') {
setCurrentTab(currentTab.nextElementSibling || firstTab);
} else if (event.key == 'Home') {
setCurrentTab(firstTab);
} else if (event.key == 'End') {
setCurrentTab(lastTab);
}
currentTab.focus();
}).on('click', function (event) {
setCurrentTab(this);
});
var firstTab = tabs.first().get(0);
var lastTab = tabs.last().get(0);
setCurrentTab(tabs.filter('[aria-selected=true]').get(0));
});
}
function setup_week_calendar() {
@@ -145,10 +145,44 @@ output {
color: $brand-primary;
font-weight: bold;
}
.form-group.required .control-label:after {
content: '*';
color: $brand-primary;
.label-required,
.label-alert {
display: inline;
font-weight: normal;
font-style: normal;
font-size: 85%;
color: $text-muted;
}
.has-error .label-required,
.has-error .label-alert {
color: inherit;
}
.label-required {
&:before {
content: " (";
}
&:after {
content: ")";
}
}
.label-alert:not(:empty):before {
content: " ";
}
@media (min-width: $screen-md-min) {
.form-group:not(:has(.checkbox)) {
.label-required,
.label-alert:not(:empty) {
display: block;
}
.label-required:before,
.label-required:after,
.label-alert:before {
content: "";
}
}
}
.form-control-text {
padding-top: 7px;
}
@@ -112,9 +112,10 @@ a, .btn-link {
*/
/* bootstrap sets outline-offset with :active:focus so we need to match specifity of selector */
/* see line 26, pretix/static/bootstrap/scss/bootstrap/_buttons.scss */
button:focus, a:focus, .btn:focus, summary:focus,
button:focus, a:focus, .btn:focus, summary:focus, div:focus,
/*button:active, a:active, .btn:active, summary:active,*/
button:active:focus, a:active:focus, .btn:active:focus, summary:active:focus,
button:active:focus, a:active:focus, .btn:active:focus, summary:active:focus, div:active:focus,
button.active:focus, a.active:focus, .btn.active:focus,
input:focus, .form-control:focus, .btn-checkbox:has(input:focus),
.input-item-count-group:has(input:focus), .input-group-price:has(input:focus) {
outline: 2px solid $link-hover-color;
+23
View File
@@ -1734,6 +1734,29 @@ class OrderChangeManagerTests(TestCase):
with self.assertRaises(OrderError):
self.ocm.change_price(self.op1, 25)
@classscope(attr='o')
def test_cancel_and_change_addon(self):
se1 = self.event.subevents.create(name="Foo", date_from=now())
se2 = self.event.subevents.create(name="Bar", date_from=now())
self.op1.subevent = se1
self.op1.save()
self.op2.subevent = se1
self.op2.save()
self.quota.subevent = se2
self.quota.save()
op3 = OrderPosition.objects.create(
order=self.order, item=self.ticket, variation=None, addon_to=self.op1,
price=Decimal("0.00"), positionid=3, subevent=se1,
)
self.ocm.cancel(self.op1)
self.ocm.change_subevent(op3, se2)
self.ocm.commit()
# Expected: the addon is also canceled
# Bug we had: the addon is not canceled
op3.refresh_from_db()
assert op3.canceled
@classscope(attr='o')
def test_cancel_all_in_order(self):
self.ocm.cancel(self.op1)