Compare commits

..

42 Commits

Author SHA1 Message Date
dfe94e09cc Merge with Master 2026-05-03 21:08:58 +02:00
d87f7b0072 Merge pull request 'upstream/2026.3.1' (#14) from upstream/2026.3.1 into master
Reviewed-on: CGM_Public/pretix_cgo#14
2026-04-13 09:11:15 +00:00
393cd0235e Update Teilnehmer 2026-04-13 11:07:57 +02:00
7fdc7f3405 Merge with master 2026-04-13 11:05:15 +02:00
Raphael Michel
21d62c5078 Bump version to 2026.3.1 2026-04-08 13:58:36 +02:00
Raphael Michel
988dc112ac [SECURITY] API: Add missing event filter for check-ins 2026-04-08 13:58:23 +02:00
2da8d250c8 Merge pull request 'upstream/2026.2.0' (#13) from upstream/2026.2.0 into master
Reviewed-on: CGM_Public/pretix_cgo#13
2026-03-23 20:25:57 +00:00
02e0fed4a0 Merge branch 'master' into upstream/2026.2.0 2026-03-23 21:19:51 +01:00
932b646fcc Merge pull request 'upstream/v2026.1.0' (#12) from upstream/v2026.1.0 into master
Reviewed-on: CGM_Public/pretix_cgo#12
2026-02-03 21:56:31 +00:00
edf1bd08f8 Merge branch 'master' into upstream/v2026.1.0
# Conflicts:
#	src/pretix/__init__.py
2026-02-03 22:56:14 +01:00
09aff627bb Merge pull request 'upstream/2025.10.1' (#11) from upstream/2025.10.1 into master
Reviewed-on: CGM_Public/pretix_cgo#11
2025-12-26 19:38:03 +00:00
da87c64ea0 Merge branch 'master' into upstream/2025.10.1 2025-12-26 20:35:13 +01:00
Raphael Michel
5d87f9a26f Bump to 2025.10.1 2025-12-19 13:06:58 +01:00
Raphael Michel
4b5651862c [SECURITY] Prevent access to arbitrary cached files by UUID (CVE-2025-14881) 2025-12-19 13:06:48 +01:00
26f3a92d09 Merge pull request 'upstream/2025.10.0' (#10) from upstream/2025.10.0 into master
Reviewed-on: CGM_Public/pretix_cgo#10
2025-12-18 22:18:53 +00:00
d468e0a2b3 Merge master 2025-12-18 23:18:30 +01:00
8de80d5867 Merge pull request 'upstream/2025.9.0.1' (#9) from upstream/2025.9.0.1 into master
Reviewed-on: CGM_Public/pretix_cgo#9
2025-11-09 19:16:53 +00:00
ec3272dd7c merge with master 2025-11-09 20:13:46 +01:00
72b14e04c0 Merge with 2025.8.0 2025-10-05 20:58:06 +02:00
93cb51c7de Merge pull request 'upstream/2025.7.1' (#7) from upstream/2025.7.1 into master
Reviewed-on: simon/pretix_cgo#7
2025-09-16 17:03:57 +00:00
64b56afe44 Fix language file bug 2025-09-16 19:00:58 +02:00
8e16c18060 Merge branch 'master' into upstream/2025.7.1 2025-09-16 18:36:21 +02:00
Raphael Michel
2d42c1f166 Bump to 2025.7.1 2025-08-23 10:15:29 +02:00
Raphael Michel
e4b8c5da25 Bump hierarkey to 2.0.1 2025-08-23 09:14:06 +02:00
luelista
c85b496187 Organizer plugins: Do not show plugins as active if they are inactive on org-level (#5396) 2025-08-23 09:13:56 +02:00
b632fa620e Merge pull request 'upstream/2025.6.0' (#6) from upstream/2025.6.0 into master
Reviewed-on: simon/pretix_cgo#6
2025-07-04 20:24:59 +00:00
04684ed93f Merge pull request 'upstream/2025.5.0' (#5) from upstream/2025.5.0 into master
Reviewed-on: simon/pretix_cgo#5
2025-06-03 16:12:49 +00:00
466bf49941 Merge branch 'master' into upstream/2025.5.0 2025-06-03 17:51:30 +02:00
e03ec73490 Merge pull request 'upstream/2025.4.0' (#4) from upstream/2025.4.0 into master
Reviewed-on: simon/pretix_cgo#4
2025-05-08 22:05:43 +00:00
3fda118234 Merge branch 'master' into upstream/2025.4.0 2025-05-08 23:44:59 +02:00
1cb98d0837 Merge pull request 'upstream/2025.3.0' (#3) from upstream/2025.3.0 into master
Reviewed-on: simon/pretix_cgo#3
2025-03-30 20:07:31 +00:00
713e3a40aa Merge pull request 'upstream/2025.2.0' (#2) from upstream/2025.2.0 into master
Reviewed-on: simon/pretix_cgo#2
2025-03-07 22:45:05 +00:00
be234edc0f Merge from master 2025-03-07 23:10:21 +01:00
34efc2d953 Add relevant_orderlist exporter (including bugfixes)
This Exporter has the most useful information in the first rows of the
exported document. Specifically the product and the custom questions.
Other fields are also resorted somewhat to place very useless columns at
the end of the table. See code for details :)
- register relevant_orderlist as separate data_exporter
- sort it with the other order data exporters.
2025-02-12 13:17:21 +01:00
UpdateBot
82366dd6c9 Add debugging Information 2025-02-11 20:48:27 +01:00
UpdateBot
38abad0bf6 Update dockerbuild, use Tag if a tag was pushed, latest otherwise 2025-02-11 20:44:55 +01:00
41817fe080 Merge pull request 'Furhter text udpates' (#1) from release/2025.1.0 into master
Reviewed-on: simon/pretix_cgo#1
2025-02-10 14:49:03 +00:00
6cee467dbd Merge branch 'master' into release/2025.1.0 2025-02-10 14:48:25 +00:00
UpdateBot
931ba73f1d Furhter text udpates 2025-02-10 15:47:21 +01:00
UpdateBot
9179621e72 Use latest tag in master branch 2025-02-05 22:02:20 +01:00
UpdateBot
65c978558e Merge branch 'release/2025.1.0' 2025-02-05 22:01:24 +01:00
UpdateBot
f4f090506b Update Texts 2025-02-04 22:11:52 +01:00
54 changed files with 1835 additions and 1326 deletions

View File

@@ -0,0 +1,31 @@
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 }}"

View File

@@ -31,7 +31,6 @@ RUN apt-get update && \
mkdir /etc/pretix && \
mkdir /data && \
useradd -ms /bin/bash -d /pretix -u 15371 pretixuser && \
chmod 0755 /pretix && \
echo 'pretixuser ALL=(ALL) NOPASSWD:SETENV: /usr/bin/supervisord' >> /etc/sudoers && \
mkdir /static && \
mkdir /etc/supervisord

View File

@@ -16,7 +16,6 @@ Field Type Description
id integer Internal ID of the program time
start datetime The start date time for this program time slot.
end datetime The end date time for this program time slot.
location multi-lingual string The program time slot's location (or ``null``)
===================================== ========================== =======================================================
.. versionchanged:: TODO
@@ -55,20 +54,17 @@ Endpoints
{
"id": 2,
"start": "2025-08-14T22:00:00Z",
"end": "2025-08-15T00:00:00Z",
"location": null
"end": "2025-08-15T00:00:00Z"
},
{
"id": 3,
"start": "2025-08-12T22:00:00Z",
"end": "2025-08-13T22:00:00Z",
"location": null
"end": "2025-08-13T22:00:00Z"
},
{
"id": 14,
"start": "2025-08-15T22:00:00Z",
"end": "2025-08-17T22:00:00Z",
"location": null
"end": "2025-08-17T22:00:00Z"
}
]
}
@@ -103,8 +99,7 @@ Endpoints
{
"id": 1,
"start": "2025-08-15T22:00:00Z",
"end": "2025-10-27T23:00:00Z",
"location": null
"end": "2025-10-27T23:00:00Z"
}
:param organizer: The ``slug`` field of the organizer to fetch
@@ -130,8 +125,7 @@ Endpoints
{
"start": "2025-08-15T10:00:00Z",
"end": "2025-08-15T22:00:00Z",
"location": null
"end": "2025-08-15T22:00:00Z"
}
**Example response**:
@@ -145,8 +139,7 @@ Endpoints
{
"id": 17,
"start": "2025-08-15T10:00:00Z",
"end": "2025-08-15T22:00:00Z",
"location": null
"end": "2025-08-15T22:00:00Z"
}
:param organizer: The ``slug`` field of the organizer of the event/item to create a program time for

View File

@@ -86,7 +86,7 @@ individual commits, we use "Rebase and merge" instead. Merge commits should be a
.. _PEP 8: https://legacy.python.org/dev/peps/pep-0008/
.. _flake8: https://pypi.python.org/pypi/flake8
.. _Django Coding Style: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/
.. _translation: https://docs.djangoproject.com/en/6.0/topics/i18n/translation/
.. _class-based views: https://docs.djangoproject.com/en/6.0/topics/class-based-views/
.. _translation: https://docs.djangoproject.com/en/1.11/topics/i18n/translation/
.. _class-based views: https://docs.djangoproject.com/en/1.11/topics/class-based-views/
.. _pytest-style: https://docs.pytest.org/en/latest/assert.html
.. _fixtures: https://docs.pytest.org/en/latest/fixture.html

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__ = "2026.5.0.dev0"
__version__ = "2026.4.0"

View File

@@ -115,10 +115,10 @@ class PluginsField(serializers.Field):
def to_representation(self, obj):
from pretix.base.plugins import get_all_plugins
active_plugins = set(obj.get_plugins())
return sorted([
p.module for p in get_all_plugins()
if not p.name.startswith('.') and getattr(p, 'visible', True) and p.module in active_plugins
if not p.name.startswith('.') and getattr(p, 'visible', True) and p.module in obj.get_plugins()
])
def to_internal_value(self, data):

View File

@@ -191,7 +191,7 @@ class InlineItemAddOnSerializer(serializers.ModelSerializer):
class InlineItemProgramTimeSerializer(serializers.ModelSerializer):
class Meta:
model = ItemProgramTime
fields = ('start', 'end', 'location')
fields = ('start', 'end')
class ItemBundleSerializer(serializers.ModelSerializer):
@@ -222,7 +222,7 @@ class ItemBundleSerializer(serializers.ModelSerializer):
class ItemProgramTimeSerializer(serializers.ModelSerializer):
class Meta:
model = ItemProgramTime
fields = ('id', 'start', 'end', 'location')
fields = ('id', 'start', 'end')
def validate(self, data):
data = super().validate(data)

View File

@@ -1416,7 +1416,6 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
qa = QuotaAvailability()
qa.queue(*[q for q, d in quota_diff_for_locking.items() if d > 0])
qa.compute()
v_avail = {}
# These are not technically correct as diff use due to the time offset applied above, so let's prevent accidental
# use further down
@@ -1446,13 +1445,11 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
voucher_usage[v] += 1
if voucher_usage[v] > 0:
if v not in v_avail:
v.refresh_from_db(fields=['redeemed'])
redeemed_in_carts = CartPosition.objects.filter(
Q(voucher=v) & Q(event=self.context['event']) & Q(expires__gte=now_dt)
).exclude(pk__in=[cp.pk for cp in delete_cps])
v_avail[v] = v.max_usages - v.redeemed - redeemed_in_carts.count()
if v_avail[v] < voucher_usage[v]:
redeemed_in_carts = CartPosition.objects.filter(
Q(voucher=pos_data['voucher']) & Q(event=self.context['event']) & Q(expires__gte=now_dt)
).exclude(pk__in=[cp.pk for cp in delete_cps])
v_avail = v.max_usages - v.redeemed - redeemed_in_carts.count()
if v_avail < voucher_usage[v]:
errs[i]['voucher'] = [
'The voucher has already been used the maximum number of times.'
]

View File

@@ -28,5 +28,6 @@ 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

View File

@@ -89,7 +89,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 = True
featured = False
repeatable_read = False
@cached_property

File diff suppressed because it is too large Load Diff

View File

@@ -1160,7 +1160,7 @@ class Modern1Renderer(ClassicInvoiceRenderer):
return stylesheet
def _draw_invoice_from(self, canvas):
if not self.invoice.address_invoice_from:
if not self.invoice.invoice_from:
return
c = [
self._clean_text(l)

View File

@@ -1,19 +0,0 @@
# Generated by Django 4.2.27 on 2026-01-21 12:06
import i18nfield.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("pretixbase", "0298_pluggable_permissions"),
]
operations = [
migrations.AddField(
model_name="itemprogramtime",
name="location",
field=i18nfield.fields.I18nTextField(max_length=200, null=True),
)
]

View File

@@ -125,7 +125,7 @@ class LoggingMixin:
elif isinstance(self, Event):
event = self
organizer_id = self.organizer_id
elif hasattr(self, 'event') and self.event:
elif hasattr(self, 'event'):
event = self.event
organizer_id = self.event.organizer_id
elif hasattr(self, 'organizer_id'):

View File

@@ -2306,17 +2306,10 @@ class ItemProgramTime(models.Model):
:type start: datetime
:param end: The date and time this program time ends
:type end: datetime
:param location: venue
:type location: str
"""
item = models.ForeignKey('Item', related_name='program_times', on_delete=models.CASCADE)
start = models.DateTimeField(verbose_name=_("Start"))
end = models.DateTimeField(verbose_name=_("End"))
location = I18nTextField(
null=True, blank=True,
max_length=200,
verbose_name=_("Location"),
)
def clean(self):
if hasattr(self, 'item') and self.item and self.item.event.has_subevents:

View File

@@ -498,9 +498,9 @@ DEFAULT_VARIABLES = OrderedDict((
) if op.valid_until else ""
}),
("program_times", {
"label": _("Program times"),
"label": _("Program times: date and time"),
"editor_sample": _(
"2017-05-31 10:00 12:00, Room 1\n2017-05-31 14:00 16:00, Room 2\n2017-05-31 14:00 2017-06-01 14:00, Building A"),
"2017-05-31 10:00 12:00\n2017-05-31 14:00 16:00\n2017-05-31 14:00 2017-06-01 14:00"),
"evaluate": lambda op, order, ev: get_program_times(op, ev)
}),
("medium_identifier", {
@@ -748,19 +748,13 @@ def get_seat(op: OrderPosition):
def get_program_times(op: OrderPosition, ev: Event):
ptstr = []
for pt in op.item.program_times.all():
ptstr.append([
datetimerange(
pt.start.astimezone(ev.timezone),
pt.end.astimezone(ev.timezone),
as_html=False
),
(', ' + ', '.join(
l.strip() for l in str(pt.location).splitlines() if l.strip())
) if str(pt.location).strip() else ''
])
return '\n'.join(''.join(l) for l in ptstr)
return '\n'.join([
datetimerange(
pt.start.astimezone(ev.timezone),
pt.end.astimezone(ev.timezone),
as_html=False
) for pt in op.item.program_times.all()
])
def generate_compressed_addon_list(op, order, event, only_checked_in=False):

View File

@@ -49,39 +49,14 @@ class PluginType(Enum):
EXPORT = 4
def plugin_is_available(meta, event=None, organizer=None):
if not hasattr(meta.app, 'is_available'):
return True
level = getattr(meta, "level", PLUGIN_LEVEL_EVENT)
if level == PLUGIN_LEVEL_EVENT:
if event:
return meta.app.is_available(event)
elif organizer:
if not hasattr(organizer, '_plugin_availability_fallback_event'):
with scope(organizer=organizer):
setattr(organizer, '_plugin_availability_fallback_event', organizer.events.first())
return (
organizer._plugin_availability_fallback_event
and meta.app.is_available(organizer._plugin_availability_fallback_event)
)
elif level == PLUGIN_LEVEL_ORGANIZER:
if organizer:
return meta.app.is_available(organizer)
elif event:
return meta.app.is_available(event.organizer)
elif level == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID and (event or organizer):
return meta.app.is_available(event or organizer)
return True
def get_all_plugins(*, event=None, organizer=None) -> List[type]:
"""
Returns the PretixPluginMeta classes of all plugins found in the installed Django apps.
"""
assert not event or not organizer
plugins = []
event_fallback = None
event_fallback_used = False
for app in apps.get_app_configs():
if hasattr(app, 'PretixPluginMeta'):
meta = app.PretixPluginMeta
@@ -90,8 +65,28 @@ def get_all_plugins(*, event=None, organizer=None) -> List[type]:
if app.name in settings.PRETIX_PLUGINS_EXCLUDE:
continue
if not plugin_is_available(meta, event, organizer):
continue
level = getattr(meta, "level", PLUGIN_LEVEL_EVENT)
if level == PLUGIN_LEVEL_EVENT:
if event and hasattr(app, 'is_available'):
if not app.is_available(event):
continue
elif organizer and hasattr(app, 'is_available'):
if not event_fallback_used:
with scope(organizer=organizer):
event_fallback = organizer.events.first()
event_fallback_used = True
if not event_fallback or not app.is_available(event_fallback):
continue
elif level == PLUGIN_LEVEL_ORGANIZER:
if organizer and hasattr(app, 'is_available'):
if not app.is_available(organizer):
continue
elif event and hasattr(app, 'is_available'):
if not app.is_available(event.organizer):
continue
elif level == PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID and (event or organizer) and hasattr(app, 'is_available'):
if not app.is_available(event or organizer):
continue
plugins.append(meta)
return sorted(

View File

@@ -162,12 +162,12 @@ error_messages = {
'price_too_high': gettext_lazy('The entered price is to high.'),
'voucher_invalid': gettext_lazy('This voucher code is not known in our database.'),
'voucher_min_usages': ngettext_lazy(
'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching product.',
'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products.',
'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products.',
'number'
),
'voucher_min_usages_removed': ngettext_lazy(
'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching product. '
'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products. '
'We have therefore removed some positions from your cart that can no longer be purchased like this.',
'The voucher code "%(voucher)s" can only be used if you select at least %(number)s matching products. '
'We have therefore removed some positions from your cart that can no longer be purchased like this.',

View File

@@ -727,6 +727,8 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti
_check_date(event, time_machine_now_dt)
products_seen = Counter()
q_avail = Counter()
v_avail = Counter()
v_usages = Counter()
v_budget = {}
deleted_positions = set()
@@ -791,9 +793,6 @@ def _check_positions(event: Event, now_dt: datetime, time_machine_now_dt: dateti
shared_lock_objects=[event]
)
q_avail = Counter()
v_avail = Counter()
# Check maximum order size
limit = min(int(event.settings.max_items_per_order), settings.PRETIX_MAX_ORDER_SIZE)
if sum(1 for cp in sorted_positions if not cp.addon_to) > limit:

View File

@@ -1528,133 +1528,6 @@ class SubEventFilterForm(FilterForm):
return self.event.organizer.meta_properties.filter(filter_allowed=True)
class QuotaFilterForm(FilterForm):
orders = {
'-date': ('-subevent__date_from', 'name', 'pk'),
'date': ('subevent__date_from', '-name', '-pk'),
'size': ('size', 'name', 'pk'),
'-size': ('-size', '-name', '-pk'),
'name': ('name', 'pk'),
'-name': ('-name', '-pk'),
}
subevent = forms.ModelChoiceField(
label=pgettext_lazy('subevent', 'Date'),
queryset=SubEvent.objects.none(),
required=False,
empty_label=pgettext_lazy('subevent', 'All dates')
)
date_from = forms.DateField(
label=_('Date from'),
required=False,
widget=DatePickerWidget({
'placeholder': _('Date from'),
}),
)
date_until = forms.DateField(
label=_('Date until'),
required=False,
widget=DatePickerWidget({
'placeholder': _('Date until'),
}),
)
time_from = forms.TimeField(
label=_('Start time from'),
required=False,
widget=TimePickerWidget({}),
)
time_until = forms.TimeField(
label=_('Start time until'),
required=False,
widget=TimePickerWidget({}),
)
weekday = forms.MultipleChoiceField(
label=_('Weekday'),
choices=(
('2', _('Monday')),
('3', _('Tuesday')),
('4', _('Wednesday')),
('5', _('Thursday')),
('6', _('Friday')),
('7', _('Saturday')),
('1', _('Sunday')),
),
widget=forms.CheckboxSelectMultiple,
required=False
)
query = forms.CharField(
label=_('Quota name'),
widget=forms.TextInput(),
required=False
)
def __init__(self, *args, **kwargs):
self.event = kwargs.pop('event')
super().__init__(*args, **kwargs)
if self.event.has_subevents:
self.fields['date_from'].widget = DatePickerWidget()
self.fields['date_until'].widget = DatePickerWidget()
self.fields['subevent'].queryset = self.event.subevents.all()
self.fields['subevent'].widget = Select2(
attrs={
'data-model-select2': 'event',
'data-select2-url': reverse('control:event.subevents.select2', kwargs={
'event': self.event.slug,
'organizer': self.event.organizer.slug,
}),
'data-placeholder': pgettext_lazy('subevent', 'All dates')
}
)
self.fields['subevent'].widget.choices = self.fields['subevent'].choices
else:
del self.fields['subevent']
del self.fields['date_from']
del self.fields['date_until']
del self.fields['time_from']
del self.fields['time_until']
del self.fields['weekday']
def filter_qs(self, qs):
fdata = self.cleaned_data
if fdata.get('weekday'):
qs = qs.annotate(wday=ExtractWeekDay('subevent__date_from')).filter(wday__in=fdata.get('weekday'))
if fdata.get('subevent'):
qs = qs.filter(subevent=fdata["subevent"])
if fdata.get('query'):
query = fdata.get('query')
qs = qs.filter(name__icontains=query)
if fdata.get('date_until'):
date_end = make_aware(datetime.combine(
fdata.get('date_until') + timedelta(days=1),
time(hour=0, minute=0, second=0, microsecond=0)
), get_current_timezone())
qs = qs.filter(
Q(subevent__date_to__isnull=True, subevent__date_from__lt=date_end) |
Q(subevent__date_to__isnull=False, subevent__date_to__lt=date_end)
)
if fdata.get('date_from'):
date_start = make_aware(datetime.combine(
fdata.get('date_from'),
time(hour=0, minute=0, second=0, microsecond=0)
), get_current_timezone())
qs = qs.filter(subevent__date_from__gte=date_start)
if fdata.get('time_until'):
qs = qs.filter(subevent__date_from__time__lte=fdata.get('time_until'))
if fdata.get('time_from'):
qs = qs.filter(subevent__date_from__time__gte=fdata.get('time_from'))
if fdata.get('ordering'):
qs = qs.order_by(*get_deterministic_ordering(Quota, self.get_order_by()))
else:
qs = qs.order_by('-subevent__date_from', 'name', 'pk')
return qs
class OrganizerFilterForm(FilterForm):
orders = {
'slug': 'slug',

View File

@@ -43,7 +43,6 @@ from django.core.exceptions import ValidationError
from django.db.models import Max, Q
from django.forms import ChoiceField, RadioSelect
from django.forms.formsets import DELETION_FIELD_NAME
from django.forms.utils import ErrorDict
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.html import escape, format_html
@@ -376,60 +375,6 @@ class QuotaForm(I18nModelForm):
return inst
class QuotaBulkEditForm(QuotaForm):
def __init__(self, *args, **kwargs):
self.mixed_values = kwargs.pop('mixed_values')
self.queryset = kwargs.pop('queryset')
super().__init__(**kwargs)
self.fields.pop("subevent", None) # Would add extra complexity and it's hard to imagine a use case for that
self.fields["name"].required = False
self.fields["itemvars"].required = False
def clean(self):
d = super().clean()
if self.prefix + "name" in self.data.getlist('_bulk') and not d.get("name"):
raise ValidationError({"name": _("This field is required.")})
if self.prefix + "itemvars" in self.data.getlist('_bulk') and not d.get("itemvars"):
raise ValidationError({"itemvars": _("This field is required.")})
return d
def save(self, commit=True):
objs = list(self.queryset)
fields = set()
for k in self.fields:
cb_val = self.prefix + k
if cb_val not in self.data.getlist('_bulk'):
continue
fields.add(k)
if k == 'itemvars':
selected_items = set(list(self.event.items.filter(id__in=[
i.split('-')[0] for i in self.cleaned_data['itemvars']
])))
selected_variations = list(ItemVariation.objects.filter(item__event=self.event, id__in=[
i.split('-')[1] for i in self.cleaned_data['itemvars'] if '-' in i
]))
for obj in objs:
obj.items.set(selected_items)
obj.variations.set(selected_variations)
else:
for obj in objs:
setattr(obj, k, self.cleaned_data[k])
fields = [f for f in fields if f != 'itemvars']
if fields:
Quota.objects.bulk_update(objs, fields, 200)
def full_clean(self):
if len(self.data) == 0:
# form wasn't submitted
self._errors = ErrorDict()
return
super().full_clean()
class ItemCreateForm(I18nModelForm):
NONE = 'none'
EXISTING = 'existing'
@@ -629,7 +574,7 @@ class ItemCreateForm(I18nModelForm):
instance.bundles.create(bundled_item=b.bundled_item, bundled_variation=b.bundled_variation,
count=b.count, designated_price=b.designated_price)
for pt in self.cleaned_data['copy_from'].program_times.all():
instance.program_times.create(start=pt.start, end=pt.end, location=pt.location)
instance.program_times.create(start=pt.start, end=pt.end)
item_copy_data.send(sender=self.event, source=self.cleaned_data['copy_from'], target=instance)
@@ -1409,10 +1354,6 @@ class ItemProgramTimeForm(I18nModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['end'].widget.attrs['data-date-after'] = '#id_{prefix}-start_0'.format(prefix=self.prefix)
self.fields['location'].widget.attrs['rows'] = '3'
self.fields['location'].widget.attrs['placeholder'] = _(
'Sample Conference Center, Heidelberg, Germany'
)
class Meta:
model = ItemProgramTime
@@ -1420,7 +1361,6 @@ class ItemProgramTimeForm(I18nModelForm):
fields = [
'start',
'end',
'location'
]
field_classes = {
'start': forms.SplitDateTimeField,

View File

@@ -34,7 +34,6 @@
{% bootstrap_form_errors form %}
{% bootstrap_field form.start layout="control" %}
{% bootstrap_field form.end layout="control" %}
{% bootstrap_field form.location layout="control" %}
</div>
</div>
{% endfor %}
@@ -60,7 +59,6 @@
<div class="panel-body form-horizontal">
{% bootstrap_field formset.empty_form.start layout="control" %}
{% bootstrap_field formset.empty_form.end layout="control" %}
{% bootstrap_field formset.empty_form.location layout="control" %}
</div>
</div>
{% endescapescript %}

View File

@@ -1,49 +0,0 @@
{% extends "pretixcontrol/event/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block content %}
<h1>
{% trans "Change multiple quotas" %}
<small>
{% blocktrans trimmed with number=quotas.count %}
{{ number }} selected
{% endblocktrans %}
</small>
</h1>
<form class="form-horizontal" action="" method="post">
{% csrf_token %}
{% bootstrap_form_errors form %}
<div class="hidden">
{% for d in quotas %}
<input type="hidden" name="quota" value="{{ d.pk }}">
{% endfor %}
</div>
<fieldset>
<legend>{% trans "General information" %}</legend>
{% bootstrap_field form.name layout="bulkedit" %}
{% bootstrap_field form.size layout="bulkedit" %}
</fieldset>
<fieldset>
<legend>{% trans "Items" %}</legend>
<p>
{% blocktrans trimmed %}
Please select the products or product variations this quota should be applied to. If you apply two
quotas to the same product, it will only be available if <strong>both</strong> quotas have capacity
left.
{% endblocktrans %}
</p>
{% bootstrap_field form.itemvars layout="bulkedit" %}
</fieldset>
<fieldset>
<legend>{% trans "Advanced options" %}</legend>
{% bootstrap_field form.close_when_sold_out layout="bulkedit" %}
{% bootstrap_field form.release_after_exit layout="bulkedit" %}
{% bootstrap_field form.ignore_for_event_availability layout="bulkedit" %}
</fieldset>
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form>
{% endblock %}

View File

@@ -1,34 +0,0 @@
{% extends "pretixcontrol/event/base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block title %}{% trans "Delete quotas" %}{% endblock %}
{% block content %}
<h1>{% trans "Delete quotas" %}</h1>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
{% if allowed %}
<p>{% blocktrans trimmed count num=allowed|length %}
Are you sure you want to delete the following quota?
{% plural %}
Are you sure you want to delete the following {{ num }} quotas?
{% endblocktrans %}</p>
<ul>
{% for q in allowed %}
<li>
{{ q }} {% if q.subevent %}({{ q.subevent }}){% endif %}
<input type="hidden" name="quota" value="{{ q.pk }}">
</li>
{% endfor %}
</ul>
{% endif %}
<div class="form-group submit-group">
<a href="{% url "control:event.items.quotas" organizer=request.event.organizer.slug event=request.event.slug %}"
class="btn btn-default btn-cancel">
{% trans "Cancel" %}
</a>
<button type="submit" class="btn btn-danger btn-save" value="delete_confirm" name="action">
{% trans "Delete" %}
</button>
</div>
</form>
{% endblock %}

View File

@@ -1,7 +1,6 @@
{% extends "pretixcontrol/items/base.html" %}
{% load i18n %}
{% load urlreplace %}
{% load bootstrap3 %}
{% block title %}{% trans "Quotas" %}{% endblock %}
{% block inside %}
<h1>{% trans "Quotas" %}</h1>
@@ -14,12 +13,21 @@
number of a specific ticket type at the same time.
{% endblocktrans %}
</p>
{% if quotas|length == 0 and not filter_form.filtered %}
{% if request.event.has_subevents %}
<form class="form-inline helper-display-inline" action="" method="get">
{% include "pretixcontrol/event/fragment_subevent_choice_simple.html" %}
</form>
{% endif %}
{% if quotas|length == 0 %}
<div class="empty-collection">
<p>
{% blocktrans trimmed %}
You haven't created any quotas yet.
{% endblocktrans %}
{% if request.GET.subevent %}
{% trans "Your search did not match any quotas." %}
{% else %}
{% blocktrans trimmed %}
You haven't created any quotas yet.
{% endblocktrans %}
{% endif %}
</p>
{% if 'event.items:write' in request.eventpermset %}
@@ -28,160 +36,79 @@
{% endif %}
</div>
{% else %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{% trans "Filter" %}
</h3>
</div>
<form class="panel-body filter-form" action="" method="get">
<div class="row">
<div class="{% if not filter_form.subevent %}col-lg-6{% else %}col-lg-2{% endif %} col-md-6 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.query %}
</div>
{% if filter_form.subevent %}
<div class="col-lg-2 col-md-6 col-md-2 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.subevent %}
</div>
<div class="col-lg-2 col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.date_from %}
</div>
<div class="col-lg-2 col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.date_until %}
</div>
<div class="col-lg-2 col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.time_from %}
</div>
<div class="col-lg-2 col-md-3 col-sm-6 col-xs-12">
{% bootstrap_field filter_form.time_until %}
</div>
<div class="col-xs-12 one-line-checkboxes">
{% bootstrap_field filter_form.weekday %}
</div>
{% endif %}
</div>
<div class="text-right flip">
<button class="btn btn-primary btn-lg" type="submit">
<span class="fa fa-filter"></span>
{% trans "Filter" %}
</button>
</div>
</form>
</div>
{% if 'event.items:write' in request.eventpermset %}
<p>
<a href="{% url "control:event.items.quotas.add" organizer=request.event.organizer.slug event=request.event.slug %}" class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new quota" %}
</a>
</p>
{% endif %}
<form action="{% url "control:event.items.quotas.bulkaction" organizer=request.event.organizer.slug event=request.event.slug %}" method="post">
{% csrf_token %}
{% for field in filter_form %}
{{ field.as_hidden }}
{% endfor %}
<div class="table-responsive">
<table class="table table-hover table-quotas">
<thead>
<tr>
{% if "event.items:write" in request.eventpermset %}
<th>
<label aria-label="{% trans "select all rows for batch-operation" %}" class="batch-select-label"><input type="checkbox" data-toggle-table/></label>
</th>
{% endif %}
<th>{% trans "Quota name" %}
<a href="?{% url_replace request 'filter-ordering' '-name' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'filter-ordering' 'name' %}"><i class="fa fa-caret-up"></i></a>
<div class="table-responsive">
<table class="table table-hover table-quotas">
<thead>
<tr>
<th>{% trans "Quota name" %}
<a href="?{% url_replace request 'ordering' '-name' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'name' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th>{% trans "Products" %}</th>
{% if request.event.has_subevents %}
<th>{% trans "Date" context "subevent" %}
<a href="?{% url_replace request 'ordering' '-date' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'date' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th>{% trans "Products" %}</th>
{% if request.event.has_subevents %}
<th>{% trans "Date" context "subevent" %}
<a href="?{% url_replace request 'filter-ordering' '-date' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'filter-ordering' 'date' %}"><i class="fa fa-caret-up"></i></a>
</th>
{% endif %}
<th>{% trans "Total capacity" %}
<a href="?{% url_replace request 'filter-ordering' '-size' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'filter-ordering' 'size' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th>{% trans "Capacity left" %}</th>
<th class="action-col-2"></th>
</tr>
{% if "event.items:write" in request.eventpermset and page_obj.paginator.num_pages > 1 %}
<tr class="table-select-all warning hidden">
<td>
<input type="checkbox" name="__ALL" id="__all" data-results-total="{{ page_obj.paginator.count }}">
</td>
<td colspan="6">
<label for="__all">
{% trans "Select all results on other pages as well" %}
</label>
</td>
</tr>
{% endif %}
</thead>
<tbody>
{% for q in quotas %}
<tr>
{% if "event.items:write" in request.eventpermset %}
<td>
<label aria-label="{% trans "select row for batch-operation" %}" class="batch-select-label"><input type="checkbox" name="quota" class="batch-select-checkbox" value="{{ q.pk }}"/></label>
</td>
<th>{% trans "Total capacity" %}
<a href="?{% url_replace request 'ordering' '-size' %}"><i class="fa fa-caret-down"></i></a>
<a href="?{% url_replace request 'ordering' 'size' %}"><i class="fa fa-caret-up"></i></a>
</th>
<th>{% trans "Capacity left" %}</th>
<th class="action-col-2"></th>
</tr>
</thead>
<tbody>
{% for q in quotas %}
<tr>
<td>
<strong><a href="{% url "control:event.items.quotas.show" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}">{{ q.name }}</a></strong>
{% if q.ignore_for_event_availability %}
<span class="fa fa-eye-slash text-muted" data-toggle="tooltip" title="{% trans "Ignore this quota when determining event availability" %}"></span>
{% endif %}
</td>
<td>
<ul>
{% for item in q.cached_items %}
{% if not item.has_variations %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.id %}">{{ item }}</a></li>
{% endif %}
{% endfor %}
{% for v in q.variations.all %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=v.item.id %}#tab-0-3-open">
{{ v.item }} {{ v }}</a></li>
{% endfor %}
</ul>
</td>
{% if request.event.has_subevents %}
<td>
<strong><a href="{% url "control:event.items.quotas.show" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}">{{ q.name }}</a></strong>
{% if q.ignore_for_event_availability %}
<span class="fa fa-eye-slash text-muted" data-toggle="tooltip" title="{% trans "Ignore this quota when determining event availability" %}"></span>
{% endif %}
{{ q.subevent.name }} {{ q.subevent.get_date_range_display_with_times }}
</td>
<td>
<ul>
{% for item in q.cached_items %}
{% if not item.has_variations %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=item.id %}">{{ item }}</a></li>
{% endif %}
{% endfor %}
{% for v in q.variations.all %}
<li><a href="{% url "control:event.item" organizer=request.event.organizer.slug event=request.event.slug item=v.item.id %}#tab-0-3-open">
{{ v.item }} {{ v }}</a></li>
{% endfor %}
</ul>
</td>
{% if request.event.has_subevents %}
<td>
{{ q.subevent.name }} {{ q.subevent.get_date_range_display_with_times }}
</td>
{% endif %}
<td>{% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %}</td>
<td>{% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.cached_avail closed=q.closed %}</td>
<td class="text-right flip">
{% if 'event.items:write' in request.eventpermset %}
<a href="{% url "control:event.items.quotas.edit" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.quotas.add" organizer=request.event.organizer.slug event=request.event.slug %}?copy_from={{ q.id }}"
class="btn btn-sm btn-default" title="{% trans "Clone" %}" data-toggle="tooltip">
<span class="fa fa-copy"></span>
</a>
<a href="{% url "control:event.items.quotas.delete" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
{% endif %}
<td>{% if q.size == None %}Unlimited{% else %}{{ q.size }}{% endif %}</td>
<td>{% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.cached_avail closed=q.closed %}</td>
<td class="text-right flip">
{% if 'event.items:write' in request.eventpermset %}
<a href="{% url "control:event.items.quotas.edit" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>
<a href="{% url "control:event.items.quotas.add" organizer=request.event.organizer.slug event=request.event.slug %}?copy_from={{ q.id }}"
class="btn btn-sm btn-default" title="{% trans "Clone" %}" data-toggle="tooltip">
<span class="fa fa-copy"></span>
</a>
<a href="{% url "control:event.items.quotas.delete" organizer=request.event.organizer.slug event=request.event.slug quota=q.id %}" class="btn btn-danger btn-sm"><i class="fa fa-trash"></i></a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if "event.items:write" in request.eventpermset %}
<div class="batch-select-actions">
<button type="submit" class="btn btn-danger btn-save" name="action" value="delete">
<i class="fa fa-trash"></i>{% trans "Delete selected" %}
</button>
<button type="submit" class="btn btn-primary btn-save" name="action" value="edit"
formaction="{% url "control:event.items.quotas.bulkedit" organizer=request.event.organizer.slug event=request.event.slug %}">
<i class="fa fa-edit"></i>{% trans "Edit selected" %}
</button>
</div>
{% endif %}
</form>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
{% include "pretixcontrol/pagination.html" %}
{% endblock %}

View File

@@ -471,9 +471,7 @@
{% endif %}
{% if line.subevent %}
<br/>
<span class="fa fa-calendar fa-fw"></span>
<a href="{% url "control:event.subevent" organizer=request.event.organizer.slug event=request.event.slug subevent=line.subevent_id %}">{{ line.subevent.name }}</a>
&middot; {{ line.subevent.get_date_range_display_with_times }}
<span class="fa fa-calendar fa-fw"></span> {{ line.subevent.name }} &middot; {{ line.subevent.get_date_range_display_with_times }}
{% endif %}
{% if line.used_membership %}
<br /><span class="fa fa-id-card fa-fw" aria-hidden="true"></span>

View File

@@ -349,8 +349,6 @@ urlpatterns = [
name='event.items.questions.edit'),
re_path(r'^questions/add$', item.QuestionCreate.as_view(), name='event.items.questions.add'),
re_path(r'^quotas/$', item.QuotaList.as_view(), name='event.items.quotas'),
re_path(r'^quotas/bulk_action$', item.QuotaBulkAction.as_view(), name='event.items.quotas.bulkaction'),
re_path(r'^quotas/bulk_edit$', item.QuotaBulkUpdateView.as_view(), name='event.items.quotas.bulkedit'),
re_path(r'^quotas/(?P<quota>\d+)/$', item.QuotaView.as_view(), name='event.items.quotas.show'),
re_path(r'^quotas/select$', typeahead.quotas_select2, name='event.items.quotas.select2'),
re_path(r'^quotas/(?P<quota>\d+)/change$', item.QuotaUpdate.as_view(), name='event.items.quotas.edit'),

View File

@@ -41,22 +41,21 @@ from json.decoder import JSONDecodeError
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.core.files import File
from django.db import models, transaction
from django.db import transaction
from django.db.models import (
Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q, Subquery, Value,
Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q,
)
from django.db.models.functions import Cast, Concat
from django.forms.models import inlineformset_factory
from django.http import (
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect,
)
from django.shortcuts import redirect, render
from django.shortcuts import redirect
from django.urls import resolve, reverse
from django.utils.functional import cached_property
from django.utils.timezone import now
from django.utils.translation import gettext, gettext_lazy as _
from django.views.decorators.http import require_http_methods
from django.views.generic import FormView, ListView, View
from django.views.generic import ListView
from django.views.generic.detail import DetailView, SingleObjectMixin
from django_countries.fields import Country
@@ -66,7 +65,7 @@ from pretix.api.serializers.item import (
)
from pretix.base.forms import I18nFormSet
from pretix.base.models import (
CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation, LogEntry,
CartPosition, Item, ItemCategory, ItemProgramTime, ItemVariation,
OrderPosition, Question, QuestionAnswer, QuestionOption, Quota,
SeatCategoryMapping, Voucher,
)
@@ -75,15 +74,12 @@ from pretix.base.models.items import ItemAddOn, ItemBundle, ItemMetaValue
from pretix.base.services.quotas import QuotaAvailability
from pretix.base.services.tickets import invalidate_cache
from pretix.base.signals import quota_availability
from pretix.control.forms.filter import (
QuestionAnswerFilterForm, QuotaFilterForm,
)
from pretix.control.forms.filter import QuestionAnswerFilterForm
from pretix.control.forms.item import (
CategoryForm, ItemAddOnForm, ItemAddOnsFormSet, ItemBundleForm,
ItemBundleFormSet, ItemCreateForm, ItemMetaValueForm, ItemProgramTimeForm,
ItemProgramTimeFormSet, ItemUpdateForm, ItemVariationForm,
ItemVariationsFormSet, QuestionForm, QuestionOptionForm, QuotaBulkEditForm,
QuotaForm,
ItemVariationsFormSet, QuestionForm, QuestionOptionForm, QuotaForm,
)
from pretix.control.permissions import (
EventPermissionRequiredMixin, event_permission_required,
@@ -91,7 +87,6 @@ from pretix.control.permissions import (
from pretix.control.signals import item_forms, item_formsets
from pretix.helpers.models import modelcopy
from ...helpers import GroupConcat
from ...helpers.compat import CompatDeleteView
from . import ChartContainingView, CreateView, PaginationMixin, UpdateView
@@ -836,38 +831,13 @@ class QuestionCreate(EventPermissionRequiredMixin, QuestionMixin, CreateView):
return ret
class QuotaQueryMixin:
@cached_property
def request_data(self):
if self.request.method == "POST":
return self.request.POST
return self.request.GET
def get_queryset(self):
qs = self.request.event.quotas
if self.filter_form.is_valid():
qs = self.filter_form.filter_qs(qs)
if 'quota' in self.request_data and '__ALL' not in self.request_data:
qs = qs.filter(
id__in=self.request_data.getlist('quota')
)
return qs
@cached_property
def filter_form(self):
return QuotaFilterForm(data=self.request_data, prefix='filter', event=self.request.event)
class QuotaList(PaginationMixin, QuotaQueryMixin, ListView):
class QuotaList(PaginationMixin, ListView):
model = Quota
context_object_name = 'quotas'
template_name = 'pretixcontrol/items/quotas.html'
def get_queryset(self):
return super().get_queryset().prefetch_related(
qs = self.request.event.quotas.prefetch_related(
Prefetch(
"items",
queryset=Item.objects.annotate(
@@ -882,10 +852,28 @@ class QuotaList(PaginationMixin, QuotaQueryMixin, ListView):
queryset=self.request.event.subevents.all()
)
)
if self.request.GET.get("subevent", "") != "":
s = self.request.GET.get("subevent", "")
qs = qs.filter(subevent_id=s)
valid_orders = {
'-date': ('-subevent__date_from', 'name', 'pk'),
'date': ('subevent__date_from', '-name', '-pk'),
'size': ('size', 'name', 'pk'),
'-size': ('-size', '-name', '-pk'),
'name': ('name', 'pk'),
'-name': ('-name', '-pk'),
}
if self.request.GET.get("ordering", "-date") in valid_orders:
qs = qs.order_by(*valid_orders[self.request.GET.get("ordering", "-date")])
else:
qs = qs.order_by('name', 'subevent__date_from', 'pk')
return qs
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
ctx['filter_form'] = self.filter_form
qa = QuotaAvailability()
qa.queue(*ctx['quotas'])
@@ -896,165 +884,6 @@ class QuotaList(PaginationMixin, QuotaQueryMixin, ListView):
return ctx
class QuotaBulkAction(QuotaQueryMixin, EventPermissionRequiredMixin, View):
permission = 'event.items:write'
@transaction.atomic
def post(self, request, *args, **kwargs):
if request.POST.get('action') == 'delete':
return render(request, 'pretixcontrol/items/quota_delete_bulk.html', {
'allowed': self.get_queryset().select_related("subevent"),
})
elif request.POST.get('action') == 'delete_confirm':
log_entries = []
to_delete = []
for obj in self.get_queryset():
log_entries.append(obj.log_action('pretix.event.quota.deleted', user=self.request.user, save=False))
to_delete.append(obj.pk)
if to_delete:
LogEntry.bulk_create_and_postprocess(log_entries)
Quota.objects.filter(pk__in=to_delete).delete()
messages.success(request, _('The selected quotas have been deleted or disabled.'))
return redirect(self.get_success_url())
def get_success_url(self) -> str:
return reverse('control:event.items.quotas', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
})
class QuotaBulkUpdateView(QuotaQueryMixin, EventPermissionRequiredMixin, FormView):
template_name = 'pretixcontrol/items/quota_bulk_edit.html'
permission = 'event.items:write'
context_object_name = 'quota'
form_class = QuotaBulkEditForm
def get_queryset(self):
return super().get_queryset().prefetch_related(None).order_by()
def get(self, request, *args, **kwargs):
return HttpResponse(status=405)
@cached_property
def is_submitted(self):
# Usually, django considers a form "bound" / "submitted" on every POST request. However, this view is always
# called with POST method, even if just to pass the selection of objects to work on, so we want to modify
# that behaviour
return '_bulk' in self.request.POST
def get_form_kwargs(self):
initial = {}
mixed_values = set()
qs = self.get_queryset().annotate(
items_list=Subquery(
Quota.items.through.objects.filter(
quota_id=OuterRef('pk'),
item__variations__isnull=True,
).order_by().values('quota_id').annotate(
g=GroupConcat('item_id', separator=',', ordered=True)
).values('g')
),
vars_list=Subquery(
Quota.variations.through.objects.filter(
quota_id=OuterRef('pk')
).order_by().values('quota_id').annotate(
g=GroupConcat(
Concat(
Cast(F('itemvariation__item_id'), output_field=models.TextField()),
Value('-', output_field=models.TextField()),
Cast(F('itemvariation_id'), output_field=models.TextField()),
),
separator=',',
ordered=True
)
).values('g')
),
)
fields = {
'name': 'name',
'size': 'size',
'subevent': 'subevent',
'close_when_sold_out': 'close_when_sold_out',
'release_after_exit': 'release_after_exit',
'ignore_for_event_availability': 'ignore_for_event_availability',
}
for k, f in fields.items():
existing_values = list(qs.order_by(f).values(f).annotate(c=Count('*')))
if len(existing_values) == 1:
initial[k] = existing_values[0][f]
elif len(existing_values) > 1:
mixed_values.add(k)
initial[k] = None
item_values = list(qs.order_by("items_list").values("items_list").annotate(c=Count('*')))
var_values = list(qs.order_by("vars_list").values("vars_list").annotate(c=Count('*')))
if len(item_values) > 1 or len(var_values) > 1:
mixed_values.add("itemvars")
else:
initial["itemvars"] = [iv for iv in (item_values[0]["items_list"] or "").split(",") + (var_values[0]["vars_list"] or "").split(",") if iv]
kwargs = super().get_form_kwargs()
kwargs['event'] = self.request.event
kwargs['prefix'] = 'bulkedit'
kwargs['initial'] = initial
kwargs['queryset'] = self.get_queryset()
kwargs['mixed_values'] = mixed_values
if not self.is_submitted:
kwargs['data'] = None
kwargs['files'] = None
return kwargs
def get_success_url(self):
return reverse('control:event.items.quotas', kwargs={
'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug,
})
@transaction.atomic()
def form_valid(self, form):
log_entries = []
# Main form
form.save()
data = {
k: v
for k, v in form.cleaned_data.items()
if k in form.changed_data
}
data['_raw_bulk_data'] = self.request.POST.dict()
for obj in self.get_queryset():
log_entries.append(
obj.log_action('pretix.event.quota.changed', data=data, user=self.request.user, save=False)
)
LogEntry.bulk_create_and_postprocess(log_entries)
messages.success(self.request, _('Your changes have been saved.'))
return super().form_valid(form)
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['quotas'] = self.get_queryset()
ctx['bulk_selected'] = self.request.POST.getlist("_bulk")
return ctx
def post(self, request, *args, **kwargs):
form = self.get_form()
is_valid = (
self.is_submitted and
form.is_valid()
)
if is_valid:
return self.form_valid(form)
else:
if self.is_submitted:
messages.error(self.request, _('We could not save your changes. See below for details.'))
return self.form_invalid(form)
class QuotaCreate(EventPermissionRequiredMixin, CreateView):
model = Quota
form_class = QuotaForm

View File

@@ -102,7 +102,7 @@ from pretix.base.models.organizer import (
from pretix.base.payment import PaymentException
from pretix.base.plugins import (
PLUGIN_LEVEL_EVENT, PLUGIN_LEVEL_EVENT_ORGANIZER_HYBRID,
PLUGIN_LEVEL_ORGANIZER, plugin_is_available,
PLUGIN_LEVEL_ORGANIZER,
)
from pretix.base.services.export import (
init_organizer_exporters, multiexport, scheduled_organizer_export,
@@ -597,13 +597,6 @@ class OrganizerCreate(CreateView):
})
def available_plugins(organizer):
from pretix.base.plugins import get_all_plugins
return (p for p in get_all_plugins(organizer=organizer) if not p.name.startswith('.')
and getattr(p, 'visible', True))
class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, TemplateView, SingleObjectMixin):
model = Organizer
context_object_name = 'organizer'
@@ -613,6 +606,12 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
def get_object(self, queryset=None) -> Organizer:
return self.request.organizer
def available_plugins(self, organizer):
from pretix.base.plugins import get_all_plugins
return (p for p in get_all_plugins(organizer=organizer) if not p.name.startswith('.')
and getattr(p, 'visible', True))
def prepare_links(self, pluginmeta, key):
links = getattr(pluginmeta, key, [])
try:
@@ -638,7 +637,7 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
from pretix.base.plugins import CATEGORY_LABELS, CATEGORY_ORDER
context = super().get_context_data(*args, **kwargs)
plugins = list(available_plugins(self.object))
plugins = list(self.available_plugins(self.object))
active_counter = Counter()
events_total = 0
@@ -686,7 +685,7 @@ class OrganizerPlugins(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
self.object = self.get_object()
plugins_available = {
p.module: p for p in available_plugins(self.object)
p.module: p for p in self.available_plugins(self.object)
}
choose_events_next = False
with transaction.atomic():
@@ -787,6 +786,12 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire
}
return kwargs
def available_plugins(self, organizer):
from pretix.base.plugins import get_all_plugins
return (p for p in get_all_plugins(organizer=organizer) if not p.name.startswith('.')
and getattr(p, 'visible', True))
def get_context_data(self, **kwargs):
return super().get_context_data(
plugin=self.plugin,
@@ -794,10 +799,12 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire
)
def dispatch(self, request, *args, **kwargs):
try:
self.plugin = next(p for p in available_plugins(self.request.organizer) if p.module == kwargs["plugin"])
except StopIteration:
plugins_available = {
p.module: p for p in self.available_plugins(self.request.organizer)
}
if kwargs["plugin"] not in plugins_available:
raise Http404(_("Unknown plugin."))
self.plugin = plugins_available[kwargs["plugin"]]
level = getattr(self.plugin, "level", PLUGIN_LEVEL_EVENT)
if level == PLUGIN_LEVEL_ORGANIZER:
raise Http404(_("This plugin can only be enabled for the entire organizer account."))
@@ -828,9 +835,6 @@ class OrganizerPluginEvents(OrganizerDetailViewMixin, OrganizerPermissionRequire
logentries_to_save = []
for e in self.request.organizer.events.filter(pk__in=events_to_enable):
if not plugin_is_available(self.plugin, organizer=self.request.organizer, event=e):
messages.warning(self.request, _("This plugin cannot be activated for event {}.").format(e.name))
continue
logentries_to_save.append(
e.log_action('pretix.event.plugins.enabled', user=self.request.user, data={'plugin': self.plugin.module}, save=False)
)

View File

@@ -117,17 +117,12 @@ class GroupConcat(Aggregate):
template = "%(function)s(%(distinct)s%(field)s::text, '%(separator)s' ORDER BY %(field)s::text ASC)"
else:
template = "%(function)s(%(distinct)s%(field)s::text, '%(separator)s')"
template, params = super().as_sql(
return super().as_sql(
compiler, connection,
function='string_agg',
template=template,
**extra_context,
)
if self.ordered:
# ordered statement requires field parameters twice
params = params + params
return template, params
class ReplicaRouter:

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-04-30 18:00+0000\n"
"Last-Translator: Paul Berschick <paul@plainschwarz.com>\n"
"PO-Revision-Date: 2025-09-29 07:39+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: Catalan <https://translate.pretix.eu/projects/pretix/pretix/"
"ca/>\n"
"Language: ca\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.17\n"
"X-Generator: Weblate 5.13.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -14132,13 +14132,13 @@ msgid "Contact:"
msgstr "Adreça de contacte"
#: pretix/base/templates/pretixbase/email/order_details.html:54
#, python-format
#, fuzzy, python-format
#| msgid ""
#| "You are receiving this email because you placed an order for {event}."
msgid ""
"You are receiving this email because you placed an order for "
"<strong>%(event)s</strong>."
msgstr ""
"Has rebut aquest correu perquè has fet una inscripció a <strong>%(event)s</"
"strong>."
msgstr "Heu rebut aquest correu perquè heu fet una comanda per {event}."
#: pretix/base/templates/pretixbase/email/order_details.html:93
#: pretix/control/templates/pretixcontrol/organizers/customer.html:23
@@ -24790,7 +24790,7 @@ msgstr "Data d'inici de l'esdeveniment"
#: pretix/control/templates/pretixcontrol/order/index.html:465
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:55
msgid "Voucher code used:"
msgstr "Codi de descompte utilitzat:"
msgstr ""
#: pretix/control/templates/pretixcontrol/order/index.html:467
#, fuzzy, python-format
@@ -35206,9 +35206,11 @@ msgstr ""
#: pretix/presale/forms/renderers.py:66
#: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:14
#, fuzzy
#| msgid "expired"
msgctxt "form"
msgid "required"
msgstr "obligatori"
msgstr "expirat"
#: pretix/presale/ical.py:87 pretix/presale/ical.py:146
#: pretix/presale/ical.py:182
@@ -35397,8 +35399,10 @@ msgid "We're now trying to book these add-ons for you!"
msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_addons.html:28
#, fuzzy
#| msgid "Meta information"
msgid "Additional options for"
msgstr "Opcions addicionals per a"
msgstr "Informació meta"
#: pretix/presale/templates/pretixpresale/event/checkout_addons.html:60
#, fuzzy
@@ -35750,11 +35754,12 @@ msgstr[0] "Heu de triar només una opció d'aquesta categoria."
msgstr[1] "Heu de triar %(min_count)s d'aquesta categoria."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:26
#, python-format
#, fuzzy, python-format
#| msgid "You can choose up to %(max_count)s options from this category."
msgid "You can choose one option from this category."
msgid_plural "You can choose up to %(max_count)s options from this category."
msgstr[0] "Pots triar una opció d'aquesta categoria."
msgstr[1] "Pots escollir fins a %(max_count)s opcions daquesta categoria."
msgstr[0] "Podeu triar fins a %(max_count)s opcions d'aquesta categoria."
msgstr[1] "Podeu triar fins a %(max_count)s opcions d'aquesta categoria."
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:34
#, python-format

View File

@@ -4,10 +4,10 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-04 14:19+0000\n"
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/"
"da/>\n"
"PO-Revision-Date: 2026-04-23 17:00+0000\n"
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
">\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -36278,8 +36278,9 @@ msgstr "Fortsæt"
#: pretix/presale/templates/pretixpresale/fragment_event_list_status.html:14
#: pretix/presale/templates/pretixpresale/fragment_week_calendar.html:58
#: pretix/presale/views/widget.py:441
#, fuzzy
msgid "Few tickets left"
msgstr "billetter tilbage"
msgstr "PDF-billet"
#: pretix/presale/templates/pretixpresale/fragment_calendar.html:92
#: pretix/presale/templates/pretixpresale/fragment_day_calendar.html:97

View File

@@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-06 00:00+0000\n"
"Last-Translator: Daniel Musketa <daniel@musketa.de>\n"
"PO-Revision-Date: 2026-04-28 09:22+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix/"
"de/>\n"
"Language: de\n"
@@ -14,7 +14,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.17.1\n"
"X-Generator: Weblate 5.17\n"
"X-Poedit-Bookmarks: -1,-1,904,-1,-1,-1,-1,-1,-1,-1\n"
#: pretix/_base_settings.py:87
@@ -846,7 +846,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py:129
msgid "Attendee details"
msgstr "Details Teilnehmer*in"
msgstr "Details Teilnehmer"
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
#: pretix/base/models/items.py:1767 pretix/control/navigation.py:185
@@ -908,13 +908,13 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:36
msgid "Attendee name"
msgstr "Name Teilnehmer*in"
msgstr "Name Teilnehmer"
#: pretix/base/datasync/sourcefields.py:187
#: pretix/base/datasync/sourcefields.py:604
#: pretix/base/datasync/sourcefields.py:628
msgid "Attendee"
msgstr "Teilnehmer*in"
msgstr "Teilnehmer"
#: pretix/base/datasync/sourcefields.py:207
#: pretix/base/exporters/orderlist.py:647 pretix/base/forms/questions.py:699
@@ -925,11 +925,11 @@ msgstr "Teilnehmer*in"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175
msgid "Attendee email"
msgstr "E-Mail Teilnehmer*in"
msgstr "E-Mail Teilnehmer"
#: pretix/base/datasync/sourcefields.py:219
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/base/datasync/sourcefields.py:232
#: pretix/base/exporters/orderlist.py:648 pretix/base/pdf.py:188
@@ -939,23 +939,23 @@ msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185
msgid "Attendee company"
msgstr "Teilnehmer*innen-Firma"
msgstr "Teilnehmer-Firma"
#: pretix/base/datasync/sourcefields.py:241
msgid "Attendee address street"
msgstr "Teilnehmer*innen-Adresse: Straße"
msgstr "Teilnehmer-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py:250
msgid "Attendee address ZIP code"
msgstr "Teilnehmer*innen-Adresse: PLZ"
msgstr "Teilnehmer-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py:259
msgid "Attendee address city"
msgstr "Teilnehmer*innen-Adresse: Stadt"
msgstr "Teilnehmer-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py:268
msgid "Attendee address country"
msgstr "Teilnehmer*innen-Adresse: Land"
msgstr "Teilnehmer-Adresse: Land"
#: pretix/base/datasync/sourcefields.py:279
#: pretix/base/exporters/orderlist.py:690 pretix/base/pdf.py:346
@@ -1233,7 +1233,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 Kund*innen im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kunden im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:628
@@ -2191,6 +2191,10 @@ 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 "
@@ -2208,8 +2212,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*innen und "
"Ticketinhaber*innen eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufern und "
"Ticketinhaber eingesammelt wurden."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:502
#: pretix/plugins/reports/exporters.py:685
@@ -2227,6 +2231,18 @@ 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:102 pretix/base/models/orders.py:336
#: pretix/base/permissions.py:228 pretix/control/navigation.py:267
#: pretix/control/navigation.py:387
@@ -3072,7 +3088,7 @@ msgstr "Wertgutscheine"
#: pretix/base/exporters/orderlist.py:1367
msgid "Download a spreadsheet of all gift cards including their current value."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Wertgutscheinen und deren aktuellem Wert."
"Tabelle (Excel oder CSV) mit allen Wertgutscheinen und deren aktuellen Wert."
#: pretix/base/exporters/orderlist.py:1378
msgid "Show value at"
@@ -4181,7 +4197,7 @@ msgstr "Bitte wählen Sie einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:359 pretix/control/forms/filter.py:688
msgid "Attendee email address"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:375 pretix/base/modelimport_orders.py:386
#: pretix/base/modelimport_orders.py:397 pretix/base/modelimport_orders.py:408
@@ -4193,7 +4209,7 @@ msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196
msgid "Attendee address"
msgstr "Teilnehmer*innen-Adresse"
msgstr "Teilnehmer-Adresse"
#: pretix/base/modelimport_orders.py:445
msgid "State"
@@ -4971,7 +4987,7 @@ msgstr ""
"Sollte kurz sein und darf nur Kleinbuchstaben, Zahlen, Bindestriche und "
"Punkte enthalten. Muss unter Ihren Veranstaltungen einmalig sein. Wir "
"empfehlen eine Abkürzung oder ein Datum mit unter 10 Zeichen, das man sich "
"gut merken kann. Sie können jedoch auch einen zufälligen Wert verwenden. "
"gut merken kann. Sie können jedoch auch einen zufälligen Wert verwendet. "
"Dies wird z.B. in Links, Bestellnummern, Rechnungsnummern und "
"Verwendungszwecken für Banküberweisungen benutzt."
@@ -7515,7 +7531,7 @@ msgid ""
"You are already on this waiting list! We will notify you as soon as we have "
"a ticket available for you."
msgstr ""
"Sie sind bereits auf der Warteliste! Wir benachrichtigen Sie, sobald wir ein "
"Sie sind bereits auf der Warteliste! Wir benachrichtigen Sie sobald wir ein "
"verfügbares Ticket für Sie haben."
#: pretix/base/notifications.py:192 pretix/control/navigation.py:205
@@ -8056,7 +8072,7 @@ msgstr "Musterfirma GmbH"
#: pretix/base/pdf.py:193
msgid "Full attendee address"
msgstr "Volle Teilnehmer*innen-Adresse"
msgstr "Volle Teilnehmer-Adresse"
#: pretix/base/pdf.py:194
msgid ""
@@ -8074,23 +8090,23 @@ msgstr ""
#: pretix/base/pdf.py:198
msgid "Attendee street"
msgstr "Teilnehmer*innen-Straße"
msgstr "Teilnehmer-Straße"
#: pretix/base/pdf.py:203
msgid "Attendee ZIP code"
msgstr "Teilnehmer*innen-PLZ"
msgstr "Teilnehmer-PLZ"
#: pretix/base/pdf.py:208
msgid "Attendee city"
msgstr "Teilnehmer*innen-Stadt"
msgstr "Teilnehmer-Stadt"
#: pretix/base/pdf.py:213
msgid "Attendee state"
msgstr "Teilnehmer*innen-Bundesstaat"
msgstr "Teilnehmer-Bundesstaat"
#: pretix/base/pdf.py:218
msgid "Attendee country"
msgstr "Teilnehmer*innen-Land"
msgstr "Teilnehmer-Land"
#: pretix/base/pdf.py:230
msgid "Pseudonymization ID (lead scanning)"
@@ -8387,7 +8403,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmer*innenname: {part}"
msgstr "Teilnehmername: {part}"
#: pretix/base/pdf.py:695
msgid "Invoice address name for salutation"
@@ -8671,8 +8687,8 @@ msgid ""
"offline scanning please refer to documentation or support for details)"
msgstr ""
"pretix Signaturverfahren 1 (für sehr große Veranstaltungen, ändert die "
"Funktionsweise des Offline-Modus, bitte informieren Sie sich in der "
"Dokumentation oder beim Support)"
"Funktionsweise des Offline-Modus, bitte informiere dich in der Dokumentation "
"oder beim Support)"
#: pretix/base/services/cancelevent.py:265
#: pretix/base/services/cancelevent.py:351
@@ -9295,7 +9311,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer*in: {name}"
msgstr "Teilnehmer: {name}"
#: pretix/base/services/invoices.py:293 pretix/plugins/reports/exporters.py:308
#, python-brace-format
@@ -9579,8 +9595,8 @@ msgid ""
"changes are still accurate and try again."
msgstr ""
"Diese Bestellung wurde zeitgleich von einem anderen Benutzer bearbeitet. "
"Bitte prüfen Sie, ob Ihre Änderungen immer noch zutreffend sind und "
"probieren Sie es erneut."
"Bitte prüfe, ob deine Änderungen immer noch zutreffend sind und probiere es "
"erneut."
#: pretix/base/services/orders.py:150
msgid "Your cart is empty."
@@ -10151,7 +10167,7 @@ msgstr ""
#: pretix/base/settings.py:362
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
#: pretix/base/settings.py:363
msgid ""
@@ -10161,13 +10177,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py:381
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer*innen erfragen"
msgstr "Namen der Teilnehmer erfragen"
#: pretix/base/settings.py:382
msgid "Ask for a name for all personalized tickets."
@@ -10176,11 +10192,11 @@ msgstr ""
#: pretix/base/settings.py:391
msgid "Require attendee names"
msgstr "Namen der Teilnehmer*innen erfordern"
msgstr "Namen der Teilnehmer erfordern"
#: pretix/base/settings.py:392
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
#: pretix/base/settings.py:402
msgid "Ask for email addresses per ticket"
@@ -10711,8 +10727,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äufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
"aber Teilnehmern, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py:1107
@@ -11210,7 +11226,7 @@ msgstr ""
#: pretix/base/settings.py:1750
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
#: pretix/base/settings.py:1751
msgid ""
@@ -11221,12 +11237,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 Kund*innen selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kunden 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 Kund*innen die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py:1764
msgid "Allow users to download tickets"
@@ -11363,7 +11379,7 @@ msgid ""
"If your event series has more than 50 dates in the future, only the month or "
"week calendar can be used."
msgstr ""
"Wenn Ihre Veranstaltungsreihe mehr als 50 zukünftige Termine hat, kann nur "
"Wenn deine Veranstaltungsreihe mehr als 50 zukünftige Termine hat, kann nur "
"der Monats- oder Wochenkalender verwendet werden."
#: pretix/base/settings.py:1892
@@ -11407,7 +11423,7 @@ msgstr ""
#: pretix/base/settings.py:1927 pretix/base/settings.py:1936
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
#: pretix/base/settings.py:1931
msgid "Allow customers to modify their information"
@@ -11515,7 +11531,7 @@ msgstr ""
#: pretix/base/settings.py:2037
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmern ihr Ticket zu ändern"
#: pretix/base/settings.py:2038
msgid ""
@@ -11527,7 +11543,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*innen Änderungen vornehmen. Teilnehmer*innen können "
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer 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."
@@ -11636,9 +11652,8 @@ msgid ""
"set this to e.g. 10, they will only be able to choose values in increments "
"of 10."
msgstr ""
"Standardmäßig können Kunden auf einen beliebigen Betrag verzichten. Wenn Sie "
"diesen Wert z.B. auf 10 setzen, sind nur noch Werte im Abstand von 10 "
"erlaubt."
"Standardmäßig können Kunden auf einen beliebigen Betrag verzichten. Wenn du "
"diesen Wert z.B. auf 10 setzt, sind nur noch Werte im Abstand von 10 erlaubt."
#: pretix/base/settings.py:2193
msgid ""
@@ -11824,7 +11839,7 @@ msgid ""
"people."
msgstr ""
"Sie können dieses Feld benutzen, um zusätzliche Informationen mit Ihren "
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer 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 "
@@ -12065,8 +12080,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*innen als "
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
"auch Teilnehmer 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 "
@@ -15404,7 +15419,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:2041
#: pretix/plugins/checkinlists/exporters.py:108
msgid "All attendees"
msgstr "Alle Teilnehmer*innen"
msgstr "Alle Teilnehmer"
#: pretix/control/forms/filter.py:2042
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -15988,7 +16003,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*innen, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -16302,7 +16317,7 @@ msgstr ""
#: pretix/control/forms/orders.py:167 pretix/control/forms/orders.py:226
#: pretix/control/forms/orders.py:240
msgid "Notify customer by email"
msgstr "Kund*in per E-Mail benachrichtigen"
msgstr "Kunde per E-Mail benachrichtigen"
#: pretix/control/forms/orders.py:174
msgid "Keep a cancellation fee of"
@@ -17305,7 +17320,7 @@ msgstr ""
#: pretix/control/forms/vouchers.py:448
msgid "You need to specify as many seats as voucher codes."
msgstr "Sie müssen genau so viele Sitze angeben, wie Sie Gutscheine erzeugen."
msgstr "Sie müssen genau so viele Sitze angeben, wie du Gutscheine erzeugst."
#: pretix/control/forms/waitinglist.py:39
msgid "Select a valid choice."
@@ -17861,7 +17876,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:554
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine individuelle E-Mail wurde an einen Teilnehmer verschickt."
#: pretix/control/logdisplay.py:555
msgid ""
@@ -19578,7 +19593,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber*in"
msgstr "Karteninhaber"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -19883,7 +19898,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer*innen gefunden."
msgstr "Keine passenden Teilnehmer gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
@@ -20820,7 +20835,7 @@ msgid ""
"event and only retain the financial information such as the number and type "
"of tickets sold."
msgstr ""
"Sie können personenbezogene Daten wie Namen und E-Mail-Adressen aus Ihrer "
"Sie können personenbezogene Daten wie Namen und E-Mail-Adressen aus deiner "
"Veranstaltung entfernen und nur finanzielle Infos wie die Anzahl und Art der "
"verkauften Tickets aufbewahren."
@@ -22705,7 +22720,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*innen\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html:39
@@ -22784,7 +22799,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*innen-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -23020,7 +23035,7 @@ msgstr ""
"Wenn Sie eine Gültigkeit in Tagen, Monaten oder Jahren angeben, endet die "
"Gültigkeit immer am Ende eines vollen Tages (Mitternacht), plus der "
"ausgewählten Anzahl an Minuten und Stunden. Der Starttermin wird in die "
"Berechnung eingeschlossen, d.h. wenn Sie \"1 Tag\" auswählen, ist das Ticket "
"Berechnung eingeschlossen, d.h. wenn Sie \"1 Tag\" auswählen ist das Ticket "
"gültig bis zum Ende des Tages, an dem die Gültigkeit beginnt."
#: pretix/control/templates/pretixcontrol/item/index.html:254
@@ -23453,7 +23468,7 @@ msgid ""
"statistical data on customers who previously selected this option, and when "
"such customers edit their answers, they need to select a different option."
msgstr ""
"Wenn Sie eine Antwortoption löschen, können Sie anschließend keine "
"Wenn du eine Antwortoption löschst, kannst du anschließend keine "
"statistischen Daten mehr zur Verwendung dieser Option abrufen und wenn "
"Kunden, die diese Option gewählt haben, ihre Daten bearbeiten möchten, muss "
"eine andere Option gewählt werden."
@@ -25057,7 +25072,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:107
#: pretix/control/templates/pretixcontrol/organizers/export.html:107
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer*innen"
msgstr "Empfohlen für neue Benutzer"
#: pretix/control/templates/pretixcontrol/orders/export.html:120
#: pretix/control/templates/pretixcontrol/organizers/export.html:120
@@ -25962,8 +25977,8 @@ msgid ""
"Instead of an URL, you can also configure a text that will be shown within "
"pretix. This will be ignored if a URL is configured."
msgstr ""
"Statt einer URL können Sie auch einen Text eingeben, der von pretix "
"angezeigt wird. Dies wird ignoriert, wenn eine URL konfiguriert wurde."
"Statt einer URL kannst du auch einen Text eingeben, der von pretix angezeigt "
"wird. Dies wird ignoriert, wenn eine URL konfiguriert wurde."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:229
msgid "Barcode media"
@@ -26035,7 +26050,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:320
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:321
msgid ""
@@ -26129,7 +26144,7 @@ msgid ""
"This feature allows you to configure acceptance of gift cards across "
"multiple organizer accounts."
msgstr ""
"Diese Funktion erlaubt Ihnen, die Akzeptanz von Wertgutscheinen über mehrere "
"Diese Funktion erlaubt dir, die Akzeptanz von Wertgutscheinen über mehrere "
"Veranstalterkonten hinweg zu konfigurieren."
#: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:18
@@ -26169,7 +26184,7 @@ msgstr "Ablehnen"
#: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:84
msgid "Other organizers accepting gift cards from you"
msgstr "Andere Veranstalter, die Ihre Wertgutscheine akzeptieren"
msgstr "Andere Veranstalter, die deine Wertgutscheine akzeptieren"
#: pretix/control/templates/pretixcontrol/organizers/giftcard_acceptance_list.html:87
msgid ""
@@ -27157,9 +27172,9 @@ msgid ""
"use pretixPRINT version %(print_version)s (or newer) or pretixSCAN Desktop "
"version %(scan_version)s (or newer)."
msgstr ""
"Dieses Layout verwendet neue Funktionen. Wenn Sie mit einem Gerät drucken, "
"stellen Sie sicher, dass pretixPRINT-Version %(print_version)s (oder neuer) "
"oder pretixSCAN Desktop Version %(scan_version)s (oder neuer) im Einsatz ist."
"Dieses Layout verwendet neue Funktionen. Wenn du mit einem Gerät druckst, "
"stelle sicher, dass pretixPRINT-Version %(print_version)s (oder neuer) oder "
"pretixSCAN Desktop Version %(scan_version)s (oder neuer) im Einsatz ist."
#: pretix/control/templates/pretixcontrol/pdf/placeholders.html:16
msgid "Available placeholders"
@@ -27235,8 +27250,8 @@ msgid ""
"might be required to keep some of this data on file. You can therefore "
"download the following file and store it in a safe place:"
msgstr ""
"Sie sind dabei, Daten unwiderruflich vom Server zu löschen, auch wenn Sie "
"manche dieser Daten ggf. aus gesetzlichen Gründen noch aufheben müssen. Wir "
"Sie sind dabei, Daten unwiderruflich vom Server zu löschen, auch wenn du "
"manche dieser Daten ggf. aus gesetzlichen Gründen noch aufheben musst. Wir "
"empfehlen daher, die folgende Datei herunterzuladen und sie sicher "
"aufzubewahren:"
@@ -27285,7 +27300,7 @@ msgid ""
"while to complete. We will inform you via email once it has been completed."
msgstr ""
"Abhängig von der Datenmenge in der Veranstaltung kann der folgende Schritt "
"eine Weile dauern. Wir informieren Sie per E-Mail, sobald er abgeschlossen "
"eine Weile dauern. Wir informieren dich per E-Mail, sobald er abgeschlossen "
"ist."
#: pretix/control/templates/pretixcontrol/shredder/index.html:11
@@ -28440,7 +28455,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 Kund*innen die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:38
@@ -28750,11 +28765,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py:115
msgid "Attendees (ordered)"
msgstr "Teilnehmende (bestellt)"
msgstr "Teilnehmer (bestellt)"
#: pretix/control/views/dashboards.py:125
msgid "Attendees (paid)"
msgstr "Teilnehmende (bezahlt)"
msgstr "Teilnehmer (bezahlt)"
#: pretix/control/views/dashboards.py:137
#, python-brace-format
@@ -30823,7 +30838,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:423
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py:444
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -31098,7 +31113,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:85
msgid "Name of account holder"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:87
msgid ""
@@ -31240,7 +31255,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*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:304
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
@@ -31835,7 +31850,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py:501
@@ -32189,8 +32204,8 @@ msgid ""
msgstr ""
"Während die meisten Zahlungsmethoden keinen grundlosen Widerruf vorsehen, "
"können SEPA-Lastschriften per Mausklick zurückgerufen werden. Aus diesem "
"Grund und abhängig von der Art Ihrer Veranstaltung kann es notwendig "
"sein, SEPA-Lastschriften nicht anzubieten und damit das Risiko von "
"Grund - und abhängig von der Art Ihrer Veranstaltung - kann es notwendig "
"sein SEPA-Lastschriften nicht anzubieten und damit das Risiko von "
"kostspieligen Rücklastschriften zu vermeiden."
#: pretix/plugins/paypal2/payment.py:182
@@ -33014,7 +33029,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:123
msgid "Mass email was sent to waiting list entries."
@@ -33046,7 +33061,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:142
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:143
msgid "An email rule was deleted"
@@ -33079,7 +33094,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
msgid "Attendee contact addresses"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
msgstr "Teilnehmer-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
msgid "All contact addresses"
@@ -33238,14 +33253,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer*innen"
msgstr "Bestellungen oder Teilnehmer"
#: 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*innen, alle Ticketinhaber*innen "
"Senden Sie eine E-Mail an alle Ticketkäufer, alle Ticketinhaber "
"oder eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py:417
@@ -33625,8 +33640,8 @@ msgid ""
"Some payment methods might need to be enabled in the settings of your Stripe "
"account before they work properly."
msgstr ""
"Manche Zahlungsmethoden müssen in den Einstellungen Ihres Stripe-Kontos "
"aktiviert werden, bevor sie funktionieren."
"Manche Zahlungsmethoden müssen in den Einstellungen deines Stripe-Kontos "
"aktiviert werden bevor sie funktionieren."
#: pretix/plugins/stripe/payment.py:369 pretix/plugins/stripe/payment.py:1597
msgid "Alipay"
@@ -33645,8 +33660,8 @@ msgid ""
"Some payment methods might need to be enabled in the settings of your Stripe "
"account before work properly."
msgstr ""
"Manche Zahlungsmethoden müssen in den Einstellungen Ihres Stripe-Kontos "
"aktiviert werden, bevor sie funktionieren."
"Manche Zahlungsmethoden müssen in den Einstellungen deines Stripe-Kontos "
"aktiviert werden bevor sie funktionieren."
#: pretix/plugins/stripe/payment.py:391
msgid ""
@@ -33827,23 +33842,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1277
msgid "Account Holder Name"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/stripe/payment.py:1282
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber*in)"
msgstr "Straße (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1294
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber*in)"
msgstr "PLZ (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1306
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber*in)"
msgstr "Stadt (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1318
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber*in)"
msgstr "Land (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1362
msgid "Affirm via Stripe"
@@ -35339,7 +35354,7 @@ msgstr "Diese Zahlungsmethode unterstützt den Testmodus nicht."
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:113
msgid "If you continue, actual money might be transferred."
msgstr "Wenn Sie fortfahren, wird möglicherweise echtes Geld transferiert."
msgstr "Wenn du fortfährst, wird möglicherweise echtes Geld transferiert."
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:124
msgid "There are no payment providers enabled."
@@ -35687,7 +35702,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:166
msgid "No attendee name provided"
msgstr "Name der teilnehmenden Person nicht angegeben"
msgstr "Name des Teilnehmenrs nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
msgid "The image you previously uploaded"
@@ -35791,7 +35806,7 @@ msgid ""
msgstr ""
"Da Sie eine Firmenadresse eingegeben haben, wurde Ihr Preis aus dem Preis "
"ohne Umsatzsteuer neu berechnet. Durch geänderte Rundung hat sich der "
"Endpreis Ihrer Buchung minimal verändert."
"Endpreis deiner Buchung minimal verändert."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:516
#, python-format
@@ -36026,7 +36041,7 @@ msgid ""
"the order clicked the link in the email they received to confirm the email "
"address is valid."
msgstr ""
"Sie können Ihre Tickets hier herunterladen, sobald die Person, die die "
"Sie können Ihre Tickets hier herunterladen sobald die Person, die die "
"Bestellung aufgegeben hat, einen Link in der an sie geschickten E-Mail "
"geklickt hat."
@@ -37012,10 +37027,10 @@ msgid ""
"need the ticket any more, please be so kind and remove your ticket from the "
"list so we can pass it on to the next person waiting as quickly as possible!"
msgstr ""
"Sie wurden von unserer Warteliste ausgewählt, um ein Ticket zu erhalten. "
"Wenn Sie das Ticket nicht mehr brauchen, helfen Sie uns, indem Sie sich von "
"der Warteliste entfernen, sodass wir das Ticket schnellstmöglich an die "
"nächste wartende Person weitergeben können."
"Sie wurden von unserer Warteliste ausgewählt um ein Ticket zu erhalten. Wenn "
"Sie das Ticket nicht mehr brauchen, helfen Sie uns indem Sie sich von der "
"Warteliste entfernen, sodass wir das Ticket schnellstmöglich an die nächste "
"wartende Person weitergeben können."
#: pretix/presale/templates/pretixpresale/event/waitinglist_remove.html:16
msgctxt "waitinglist"
@@ -37449,12 +37464,12 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
#: pretix/presale/views/customer.py:386
msgid "Attendee profiles"
msgstr "Teilnehmer*innen-Profile"
msgstr "Teilnehmer-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*innen-Profile gespeichert."
"In Ihrem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
msgid "Registration"
@@ -37755,8 +37770,8 @@ msgstr ""
#: pretix/presale/views/order.py:1198
msgid "Please click the link we sent you via email to download your tickets."
msgstr ""
"Bitte klicken Sie den Link, den wir Ihnen per E-Mail geschickt haben, um "
"Ihre Tickets herunterzuladen."
"Bitte klicke den Link, den wir dir per E-Mail geschickt haben, um deine "
"Tickets herunterzuladen."
#: pretix/presale/views/order.py:1689
#, python-brace-format
@@ -39042,7 +39057,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*innen zu erstellen."
#~ "Teilnehmer zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-04 10:44+0000\n"
"Last-Translator: Daniel Musketa <daniel@musketa.de>\n"
"PO-Revision-Date: 2026-04-28 09:22+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix/de_Informal/>\n"
"Language: de_Informal\n"
@@ -829,7 +829,7 @@ msgid ""
"Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings."
msgstr ""
"Feld \"{field_name}\" erfordert {required_input}, aber nur "
"Feld \"{field_name}\" erfordert {required_input}, aber hat nur "
"{available_inputs} sind verfügbar. Bitte prüfe die Einstellungen für "
"{provider_name}."
@@ -848,7 +848,7 @@ msgstr "Details der Bestellposition"
#: pretix/base/datasync/sourcefields.py:129
msgid "Attendee details"
msgstr "Details Teilnehmer*in"
msgstr "Details Teilnehmer"
#: pretix/base/datasync/sourcefields.py:130 pretix/base/exporters/answers.py:66
#: pretix/base/models/items.py:1767 pretix/control/navigation.py:185
@@ -910,13 +910,13 @@ msgstr "Veranstaltungs- oder Termininformationen"
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:50
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:36
msgid "Attendee name"
msgstr "Name Teilnehmer*in"
msgstr "Name Teilnehmer"
#: pretix/base/datasync/sourcefields.py:187
#: pretix/base/datasync/sourcefields.py:604
#: pretix/base/datasync/sourcefields.py:628
msgid "Attendee"
msgstr "Teilnehmer*in"
msgstr "Teilnehmer"
#: pretix/base/datasync/sourcefields.py:207
#: pretix/base/exporters/orderlist.py:647 pretix/base/forms/questions.py:699
@@ -927,11 +927,11 @@ msgstr "Teilnehmer*in"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:172
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:175
msgid "Attendee email"
msgstr "E-Mail Teilnehmer*in"
msgstr "E-Mail Teilnehmer"
#: pretix/base/datasync/sourcefields.py:219
msgid "Attendee or order email"
msgstr "E-Mail Teilnehmer*in oder Bestellung"
msgstr "E-Mail Teilnehmer oder Bestellung"
#: pretix/base/datasync/sourcefields.py:232
#: pretix/base/exporters/orderlist.py:648 pretix/base/pdf.py:188
@@ -941,23 +941,23 @@ msgstr "E-Mail Teilnehmer*in oder Bestellung"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:182
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:185
msgid "Attendee company"
msgstr "Teilnehmer*innen-Firma"
msgstr "Teilnehmer-Firma"
#: pretix/base/datasync/sourcefields.py:241
msgid "Attendee address street"
msgstr "Teilnehmer*innen-Adresse: Straße"
msgstr "Teilnehmer-Adresse: Straße"
#: pretix/base/datasync/sourcefields.py:250
msgid "Attendee address ZIP code"
msgstr "Teilnehmer*innen-Adresse: PLZ"
msgstr "Teilnehmer-Adresse: PLZ"
#: pretix/base/datasync/sourcefields.py:259
msgid "Attendee address city"
msgstr "Teilnehmer*innen-Adresse: Stadt"
msgstr "Teilnehmer-Adresse: Stadt"
#: pretix/base/datasync/sourcefields.py:268
msgid "Attendee address country"
msgstr "Teilnehmer*innen-Adresse: Land"
msgstr "Teilnehmer-Adresse: Land"
#: pretix/base/datasync/sourcefields.py:279
#: pretix/base/exporters/orderlist.py:690 pretix/base/pdf.py:346
@@ -1235,7 +1235,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 Kund*innen im Bestellprozess als "
"ZIP-Datei mit allen Dateien, die von Kunden im Bestellprozess als "
"Antwort auf eine Frage hochgeladen wurden."
#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:628
@@ -1529,8 +1529,8 @@ msgid ""
"Only include invoices issued in this time frame. Note that the invoice date "
"does not always correspond to the order or payment date."
msgstr ""
"Nur Rechnungen, die in diesem Zeitraum ausgestellt wurden. Achtung: Das "
"Rechnungsdatum korrespondiert nicht zwingend zum Bestell- oder Zahlungsdatum."
"Nur Rechnungen, die in diesem Zeitraum wurden. Achtung: Das Rechnungsdatum "
"korrespondiert nicht zwingend zum Bestell- oder Zahlungsdatum."
#: pretix/base/exporters/events.py:47
msgid "Event data"
@@ -2210,8 +2210,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*innen und "
"Ticketinhaber*innen eingesammelt wurden."
"Textdatei mit allen E-Mail-Adressen, die von Käufer und "
"Ticketinhaber eingesammelt wurden."
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:502
#: pretix/plugins/reports/exporters.py:685
@@ -3540,7 +3540,7 @@ msgstr "Das eingegebene aktuelle Passwort war nicht korrekt."
#: pretix/base/forms/user.py:95
msgid "Please choose a password different to your current one."
msgstr "Bitte wähle ein anderes Passwort als das derzeitige."
msgstr "Bitte wählen ein anderes Passwort als das derzeitige."
#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:399
#: pretix/presale/forms/customer.py:475
@@ -3579,7 +3579,7 @@ msgid ""
"up. Please note: to use literal \"{\" or \"}\", you need to double them as "
"\"{{\" and \"}}\"."
msgstr ""
"Es ist ein Fehler in deiner Platzhalter-Syntax. Bitte prüfe, dass die "
"Es ist ein Fehler in deine Platzhalter-Syntax. Bitte prüfe, dass die "
"öffnenden \"{\" und schließenden \"}\" geschweiften Klammern zusammenpassen. "
"Um die geschweiften Klammern \"{\" und \"}\" im erzeugten Text zu verwenden, "
"müssen sie doppelt gesetzt werden als \"{{\" und \"}}\"."
@@ -4183,7 +4183,7 @@ msgstr "Bitte wähle einen gültigen Staat aus."
#: pretix/base/modelimport_orders.py:359 pretix/control/forms/filter.py:688
msgid "Attendee email address"
msgstr "Teilnehmer*innen-E-Mail-Adresse"
msgstr "Teilnehmer-E-Mail-Adresse"
#: pretix/base/modelimport_orders.py:375 pretix/base/modelimport_orders.py:386
#: pretix/base/modelimport_orders.py:397 pretix/base/modelimport_orders.py:408
@@ -4195,7 +4195,7 @@ msgstr "Teilnehmer*innen-E-Mail-Adresse"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:193
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:196
msgid "Attendee address"
msgstr "Teilnehmer*innen-Adresse"
msgstr "Teilnehmer-Adresse"
#: pretix/base/modelimport_orders.py:445
msgid "State"
@@ -4217,7 +4217,7 @@ msgstr "Automatisch generieren"
#: pretix/base/modelimport_orders.py:496
msgid "You cannot assign a position secret that already exists."
msgstr "Du kannst keinen Ticketcode verwenden, der bereits existiert."
msgstr "Sie können keinen Ticketcode verwenden, der bereits existiert."
#: pretix/base/modelimport_orders.py:528
msgid "Please enter a valid language code."
@@ -4971,7 +4971,7 @@ msgstr ""
"Sollte kurz sein und darf nur Kleinbuchstaben, Zahlen, Bindestriche und "
"Punkte enthalten. Muss unter deinen Veranstaltungen einmalig sein. Wir "
"empfehlen eine Abkürzung oder ein Datum mit unter 10 Zeichen, das man sich "
"gut merken kann. Du kannst jedoch auch einen zufälligen Wert verwenden. Dies "
"gut merken kann. Du kannst jedoch auch einen zufälligen Wert verwendet. Dies "
"wird z.B. in Links, Bestellnummern, Rechnungsnummern und Verwendungszwecken "
"für Banküberweisungen benutzt."
@@ -6186,7 +6186,7 @@ msgstr "Minimaler Wert"
#: pretix/base/models/items.py:1747 pretix/base/models/items.py:1750
#: pretix/base/models/items.py:1754
msgid "Currently not supported in our apps and during check-in"
msgstr "Derzeit nicht von unseren Apps und beim Check-In unterstützt"
msgstr "Derzeit nicht von unseren Apps und während dem Check-In unterstützt"
#: pretix/base/models/items.py:1737 pretix/base/models/items.py:1743
#: pretix/base/models/items.py:1749
@@ -6231,7 +6231,7 @@ msgstr "Ungültige Nummerneingabe."
#: pretix/base/models/items.py:1870 pretix/base/models/items.py:1894
msgid "Please choose a later date."
msgstr "Bitte wähle ein späteres Datum."
msgstr "Bitte wählen Sie ein späteres Datum."
#: pretix/base/models/items.py:1872 pretix/base/models/items.py:1896
msgid "Please choose an earlier date."
@@ -6880,7 +6880,7 @@ msgid ""
msgstr ""
"Wenn du dies anschaltest, müssen alle Mitglieder entweder Zwei-Faktor-"
"Authentifizierung einrichten oder das Team verlassen. Die Einstellung kann "
"ein paar Minuten benötigen, um für alle Benutzer aktiv zu werden."
"ein paar Minuten benötigen um für alle Benutzer aktiv zu werden."
#: pretix/base/models/organizer.py:384
msgid "All event permissions"
@@ -8049,7 +8049,7 @@ msgstr "Musterfirma"
#: pretix/base/pdf.py:193
msgid "Full attendee address"
msgstr "Volle Teilnehmer*innen-Adresse"
msgstr "Volle Teilnehmer-Adresse"
#: pretix/base/pdf.py:194
msgid ""
@@ -8067,23 +8067,23 @@ msgstr ""
#: pretix/base/pdf.py:198
msgid "Attendee street"
msgstr "Teilnehmer*innen-Straße"
msgstr "Teilnehmer-Straße"
#: pretix/base/pdf.py:203
msgid "Attendee ZIP code"
msgstr "Teilnehmer*innen-PLZ"
msgstr "Teilnehmer-PLZ"
#: pretix/base/pdf.py:208
msgid "Attendee city"
msgstr "Teilnehmer*innen-Stadt"
msgstr "Teilnehmer-Stadt"
#: pretix/base/pdf.py:213
msgid "Attendee state"
msgstr "Teilnehmer*innen-Bundesstaat"
msgstr "Teilnehmer-Bundesstaat"
#: pretix/base/pdf.py:218
msgid "Attendee country"
msgstr "Teilnehmer*innen-Land"
msgstr "Teilnehmer-Land"
#: pretix/base/pdf.py:230
msgid "Pseudonymization ID (lead scanning)"
@@ -8380,7 +8380,7 @@ msgstr "Herr Mustermann"
#: pretix/plugins/ticketoutputpdf/exporters.py:99
#, python-brace-format
msgid "Attendee name: {part}"
msgstr "Teilnehmer*innenname: {part}"
msgstr "Teilnehmer: {part}"
#: pretix/base/pdf.py:695
msgid "Invoice address name for salutation"
@@ -9015,7 +9015,7 @@ msgstr ""
msgid "One of the products you selected can only be bought part of a bundle."
msgstr ""
"Eins der ausgewählten Produkte wird nicht einzeln verkauft, sondern nur als "
"Teil fester Produktpakete."
"Teil fester Produktpaketen."
#: pretix/base/services/cart.py:218
msgid "Please select a valid seat."
@@ -9285,7 +9285,7 @@ msgstr "Veranstaltungsort: {location}"
#, python-brace-format
msgctxt "invoice"
msgid "Attendee: {name}"
msgstr "Teilnehmer*in: {name}"
msgstr "Teilnehmer: {name}"
#: pretix/base/services/invoices.py:293 pretix/plugins/reports/exporters.py:308
#, python-brace-format
@@ -9912,7 +9912,7 @@ msgid ""
"country is currently not available. We will therefore need to charge you the "
"same tax rate as if you did not enter a VAT ID."
msgstr ""
"Die USt-ID-Nr. konnte nicht geprüft werden, da der Prüfdienst deines Landes "
"Die USt-ID-Nr. konnte nicht geprüft werden, da der Prüfdienst Ihres Landes "
"im Moment nicht verfügbar ist. Wir müssen daher den selben Steuersatz "
"berechnen, wie wenn keine USt-ID-Nr. eingegeben worden wäre."
@@ -10139,7 +10139,7 @@ msgstr ""
#: pretix/base/settings.py:362
msgid "Hide prices on attendee ticket page"
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
#: pretix/base/settings.py:363
msgid ""
@@ -10149,13 +10149,13 @@ msgid ""
"price."
msgstr ""
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
"Person, welche die Tickets kauft, sieht den Preis."
#: pretix/base/settings.py:381
msgid "Ask for attendee names"
msgstr "Namen der Teilnehmer*innen erfragen"
msgstr "Namen der Teilnehmer erfragen"
#: pretix/base/settings.py:382
msgid "Ask for a name for all personalized tickets."
@@ -10164,11 +10164,11 @@ msgstr ""
#: pretix/base/settings.py:391
msgid "Require attendee names"
msgstr "Namen der Teilnehmer*innen erfordern"
msgstr "Namen der Teilnehmer erfordern"
#: pretix/base/settings.py:392
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
#: pretix/base/settings.py:402
msgid "Ask for email addresses per ticket"
@@ -10190,7 +10190,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 jeder Teilnehmer*in benötigst. pretix sendet die Bestellbestätigung "
"von jedem Teilnehmer 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."
@@ -10698,8 +10698,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äufer*innen weiter angezeigt, "
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
"aber Teilnehmer, die ihr Ticket nicht selbst gekauft haben, werden "
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
#: pretix/base/settings.py:1107
@@ -11197,7 +11197,7 @@ msgstr ""
#: pretix/base/settings.py:1750
msgid "Show number of check-ins to customer"
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
msgstr "Zeige Anzahl der Check-ins für Kunden an"
#: pretix/base/settings.py:1751
msgid ""
@@ -11208,12 +11208,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 Kund*innen selbst sehen, wie oft sie die "
"Wenn diese Option aktiv ist, können Kunden 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 Kund*innen die bisherige Nutzung des Tickets einsehen "
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
#: pretix/base/settings.py:1764
msgid "Allow users to download tickets"
@@ -11394,7 +11394,7 @@ msgstr ""
#: pretix/base/settings.py:1927 pretix/base/settings.py:1936
msgid "Both the attendee and the person who ordered can make changes"
msgstr ""
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
#: pretix/base/settings.py:1931
msgid "Allow customers to modify their information"
@@ -11502,7 +11502,7 @@ msgstr ""
#: pretix/base/settings.py:2037
msgid "Allow individual attendees to change their ticket"
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
msgstr "Erlaubt einzelnen Teilnehmer ihr Ticket zu ändern"
#: pretix/base/settings.py:2038
msgid ""
@@ -11514,7 +11514,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*innen Änderungen vornehmen. Teilnehmer*innen können "
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer 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."
@@ -11535,8 +11535,8 @@ msgid ""
"cancellation fee from the user."
msgstr ""
"Betrifft nur ausstehende Zahlungen, für kostenlose Bestellungen wird nie "
"eine Stornogebühr erhoben. Bitte beachte, dass du für das Eintreiben der "
"Stornogebühr selbst verantwortlich bist."
"eine Stornogebühr erhoben. Bitte beachten Sie, dass Sie für das Eintreiben "
"der Stornogebühr selbst verantwortlich sind."
#: pretix/base/settings.py:2073
msgid "Charge payment, shipping and service fees"
@@ -11698,7 +11698,7 @@ msgstr "Kontakt-E-Mail"
#: pretix/base/settings.py:2273 pretix/control/forms/event.py:1900
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Wir werden diese Adresse veröffentlichen um Teilnehmer*innen zu ermöglichen, "
"Wir werden diese Adresse veröffentlichen um Teilnehmern zu ermöglichen, "
"dich zu kontaktieren."
#: pretix/base/settings.py:2281 pretix/control/forms/event.py:1892
@@ -11810,7 +11810,7 @@ msgid ""
"people."
msgstr ""
"Du kannst dieses Feld benutzen um zusätzliche Informationen mit deinen "
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
"Teilnehmer 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 "
@@ -12050,8 +12050,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*innen als "
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
"auch Teilnehmer 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 "
@@ -13314,7 +13314,7 @@ msgstr ""
msgid ""
"You cannot require specifying attendee names if you do not ask for them."
msgstr ""
"Du kannst die Angabe von Teilnehmer*innennamen nur erfordern, wenn auch nach "
"Du kannst die Angabe von Teilnehmernamen nur erfordern, wenn auch nach "
"Namen gefragt wird."
#: pretix/base/settings.py:4129
@@ -14979,11 +14979,11 @@ msgstr "Ticket-Downloads"
#: pretix/control/forms/event.py:1882
msgid "Your customers will be able to download their tickets in PDF format."
msgstr ""
"Die Teilnehmer*innen werden ihre Tickets im PDF-Format herunterladen können."
"Die Teilnehmer werden ihre Tickets im PDF-Format herunterladen können."
#: pretix/control/forms/event.py:1886
msgid "Require all attendees to fill in their names"
msgstr "Erfordere, dass alle Teilnehmer*innen ihre Namen ausfüllen"
msgstr "Erfordere, dass alle Teilnehmer ihre Namen ausfüllen"
#: pretix/control/forms/event.py:1887
msgid ""
@@ -15019,7 +15019,7 @@ msgid ""
"then import your bank statements to process the payments within pretix, or "
"mark them as paid manually."
msgstr ""
"Deine Teilnehmer*innen werden angewiesen, das Geld direkt auf dein Bankkonto "
"Deine Teilnehmer 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."
@@ -15380,7 +15380,7 @@ msgstr "Check-in-Status"
#: pretix/control/forms/filter.py:2041
#: pretix/plugins/checkinlists/exporters.py:108
msgid "All attendees"
msgstr "Alle Teilnehmer*innen"
msgstr "Alle Teilnehmer"
#: pretix/control/forms/filter.py:2042
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
@@ -15964,7 +15964,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*innen, "
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudenten, "
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
"der Veranstaltung außer des VIP-Bereiches."
@@ -17837,7 +17837,7 @@ msgstr "Eine individuelle E-Mail wurde verschickt."
#: pretix/control/logdisplay.py:554
msgid "A custom email has been sent to an attendee."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer verschickt."
#: pretix/control/logdisplay.py:555
msgid ""
@@ -19340,8 +19340,8 @@ msgstr ""
msgid ""
"Please leave a short comment on what you did in the following admin sessions:"
msgstr ""
"Bitte hinterlasse einen kurzen Kommentar, was du in diesen Admin-Sitzungen "
"gemacht hast:"
"Bitte hinterlassen Sie einen kurzen Kommentar, was Sie in diesen Admin-"
"Sitzungen gemacht haben:"
#: pretix/control/templates/pretixcontrol/base.html:376
msgid "Read more"
@@ -19427,7 +19427,8 @@ msgstr "im Entwicklermodus"
#: pretix/presale/templates/pretixpresale/postmessage.html:27
#: pretix/presale/templates/pretixpresale/waiting.html:42
msgid "If this takes longer than a few minutes, please contact us."
msgstr "Wenn dies länger als einige Minuten dauert, kontaktiere uns bitte."
msgstr ""
"Wenn dies länger als einige Minuten dauert, kontaktieren Sie uns bitte."
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
#: pretix/control/templates/pretixcontrol/organizers/devices.html:75
@@ -19552,7 +19553,7 @@ msgstr "Terminal-ID"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
msgid "Card holder"
msgstr "Karteninhaber*in"
msgstr "Karteninhaber"
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
msgid "Card expiration"
@@ -19857,7 +19858,7 @@ msgstr "CSV"
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
msgid "No attendee record was found."
msgstr "Keine passenden Teilnehmer*innen gefunden."
msgstr "Keine passenden Teilnehmer gefunden."
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
@@ -21684,7 +21685,7 @@ msgid ""
"provide ways for your attendees to contact you:"
msgstr ""
"Wenn irgendetwas schiefgeht oder unklar ist, empfehlen wir, dass du deinen "
"Teilnehmer*innen die Möglichkeit gibst, dich zu benachrichtigen:"
"Teilnehmer die Möglichkeit gibst, dich zu benachrichtigen:"
#: pretix/control/templates/pretixcontrol/event/settings.html:21
msgid "Basics"
@@ -22672,7 +22673,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*innen\" gewertet, "
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
#: pretix/control/templates/pretixcontrol/item/create.html:39
@@ -22751,7 +22752,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*innen-Daten "
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
"können trotzdem hinzugefügt werden."
@@ -22987,7 +22988,7 @@ msgstr ""
"Wenn du eine Gültigkeit in Tagen, Monaten oder Jahren angibst, endet die "
"Gültigkeit immer am Ende eines vollen Tages (Mitternacht), plus der "
"ausgewählten Anzahl an Minuten und Stunden. Der Starttermin wird in die "
"Berechnung eingeschlossen, d.h. wenn du \"1 Tag\" auswählst, ist das Ticket "
"Berechnung eingeschlossen, d.h. wenn Sie \"1 Tag\" auswählen ist das Ticket "
"gültig bis zum Ende des Tages, an dem die Gültigkeit beginnt."
#: pretix/control/templates/pretixcontrol/item/index.html:254
@@ -23448,9 +23449,9 @@ msgid ""
"ticket. If you provide food, one example might be to ask your users about "
"dietary requirements."
msgstr ""
"Fragen erlauben deinen Besucher*innen, zusätzliche Informationen zu ihrem "
"Fragen erlauben deinen Besucher, zusätzliche Informationen zu ihrem "
"Ticket auszufüllen. Wenn deine Veranstaltung Verpflegung beinhaltet, "
"könntest du z.B. nach Allergien deiner Teilnehmer*innen fragen."
"könntest du z.B. nach Allergien deiner Teilnehmer fragen."
#: pretix/control/templates/pretixcontrol/items/questions.html:15
msgid "Create a new question"
@@ -23589,7 +23590,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*innen aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
"Teilnehmer 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."
@@ -23661,8 +23662,8 @@ msgid ""
"Are you sure you want to generate a new client secret for the application "
"<strong>%(application)s</strong>?"
msgstr ""
"Möchtest du wirklich einen neuen Schlüssel für die App <strong>%(application)"
"s</strong> generieren?"
"Möchten Sie wirklich einen neuen Schlüssel für die App "
"<strong>%(application)s</strong> generieren?"
#: pretix/control/templates/pretixcontrol/oauth/app_rollkeys.html:15
msgid "Roll secret"
@@ -23719,7 +23720,7 @@ msgstr "Bestellung freigeben"
#: pretix/control/templates/pretixcontrol/order/approve.html:10
msgid "Do you really want to approve this order?"
msgstr "Möchtest du diese Bestellung wirklich freigeben?"
msgstr "Möchten Sie diese Bestellung wirklich freigeben?"
#: pretix/control/templates/pretixcontrol/order/approve.html:20
#: pretix/control/templates/pretixcontrol/order/cancel.html:46
@@ -25021,7 +25022,7 @@ msgstr "Sonstige Datenexporte"
#: pretix/control/templates/pretixcontrol/orders/export.html:107
#: pretix/control/templates/pretixcontrol/organizers/export.html:107
msgid "Recommended for new users"
msgstr "Empfohlen für neue Benutzer*innen"
msgstr "Empfohlen für neue Benutzer"
#: pretix/control/templates/pretixcontrol/orders/export.html:120
#: pretix/control/templates/pretixcontrol/organizers/export.html:120
@@ -25688,8 +25689,8 @@ msgid ""
"Download an app that is compatible with pretix. For example, our check-in "
"app <strong>pretixSCAN</strong> is available on all major platforms."
msgstr ""
"Lade eine App herunter, die mit pretix kompatibel ist, wie z.B. unsere Check-"
"in-App <strong>pretixSCAN</strong>."
"Laden Sie eine App herunter, die mit pretix kompatibel ist, wie z.B. unsere "
"Check-in-App <strong>pretixSCAN</strong>."
#: pretix/control/templates/pretixcontrol/organizers/device_connect.html:14
msgid "Download pretixSCAN"
@@ -25916,7 +25917,7 @@ msgid ""
"target=\"_blank\">our documentation</a>."
msgstr ""
"In einigen Regionen, einschließlich der Europäischen Union, bist du "
"verpflichtet, Informationen über die Barrierefreiheit deines Ticketshops zu "
"verpflichtet, Informationen über die Barrierefreiheit Ihres Ticketshops zu "
"veröffentlichen. Du findest eine Vorlage in <a href=\"https://docs.pretix.eu/"
"de/trust/accessibility/\" target=\"_blank\">unserer Dokumentation</a>."
@@ -25998,7 +25999,7 @@ msgstr "Domains"
#: pretix/control/templates/pretixcontrol/organizers/edit.html:320
msgid "This dialog is intended for advanced users."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
msgstr "Dieser Dialog ist für fortgeschrittene Anwender gedacht."
#: pretix/control/templates/pretixcontrol/organizers/edit.html:321
msgid ""
@@ -26022,7 +26023,7 @@ msgstr "Station löschen:"
#: pretix/control/templates/pretixcontrol/organizers/gate_delete.html:8
msgid "Are you sure you want to delete the gate?"
msgstr "Möchtest du die Station wirklich löschen?"
msgstr "Möchten Sie die Station wirklich löschen?"
#: pretix/control/templates/pretixcontrol/organizers/gate_edit.html:6
msgid "Gate:"
@@ -26388,7 +26389,7 @@ msgid ""
"The plugin \"%(name)s\" is enabled for your organizer account, but also "
"needs to be enabled for the specific events you want to use it with."
msgstr ""
"Die Erweiterung \"%(name)s\" ist für dein Veranstalterkonto aktiv, muss "
"Die Erweiterung \"%(name)s\" ist für Ihr Veranstalterkonto aktiv, muss "
"jedoch auch für die einzelnen Veranstaltungen aktiviert werden, für die sie "
"benutzt werden soll."
@@ -26935,7 +26936,7 @@ msgid ""
msgstr ""
"Dieser Editor wurde mit aktuellen Versionen von Google Chrome, Mozilla "
"Firefox und Opera getestet. Andere Browser, besonders Internet Explorer oder "
"Microsoft Edge, haben möglicherweise Probleme, dein Hintergrund-PDF korrekt "
"Microsoft Edge, haben möglicherweise Probleme Ihr Hintergrund-PDF korrekt "
"darzustellen oder die richtigen Schriftarten zu laden."
#: pretix/control/templates/pretixcontrol/pdf/index.html:207
@@ -27120,9 +27121,9 @@ msgid ""
"use pretixPRINT version %(print_version)s (or newer) or pretixSCAN Desktop "
"version %(scan_version)s (or newer)."
msgstr ""
"Dieses Layout verwendet neue Funktionen. Wenn du mit einem Gerät druckst, "
"stell sicher, dass pretixPRINT-Version %(print_version)s (oder neuer) oder "
"pretixSCAN Desktop Version %(scan_version)s (oder neuer) im Einsatz ist."
"Dieses Layout verwendet neue Funktionen. Wenn Sie mit einem Gerät drucken, "
"stellen Sie sicher, dass pretixPRINT-Version %(print_version)s (oder neuer) "
"oder pretixSCAN Desktop Version %(scan_version)s (oder neuer) im Einsatz ist."
#: pretix/control/templates/pretixcontrol/pdf/placeholders.html:16
msgid "Available placeholders"
@@ -27396,7 +27397,7 @@ msgid ""
msgstr ""
"Du kannst entweder eine oder mehrere Check-in-Listen für jeden Termin deiner "
"Veranstaltungsreihe einzeln anlegen oder nur eine Check-in-Liste für alle "
"deine Termine verwenden und den Einlass über Check-in-Regeln limitieren. "
"Ihre Termine verwenden und den Einlass über Check-in-Regeln limitieren. "
"Welcher Ansatz besser geeignet ist, hängt von mehreren Faktoren ab, wie z.B. "
"der Menge an Terminen in deiner Veranstaltungsreihe. Für Reihen mit weniger "
"als einem Termin pro Tag sind einzelne Check-in-Listen in der Regel "
@@ -28398,7 +28399,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 Kund*innen die Warteliste nicht "
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
"finden können."
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:38
@@ -28707,11 +28708,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
#: pretix/control/views/dashboards.py:115
msgid "Attendees (ordered)"
msgstr "Teilnehmende (bestellt)"
msgstr "Teilnehmer (bestellt)"
#: pretix/control/views/dashboards.py:125
msgid "Attendees (paid)"
msgstr "Teilnehmende (bezahlt)"
msgstr "Teilnehmer (bezahlt)"
#: pretix/control/views/dashboards.py:137
#, python-brace-format
@@ -29232,7 +29233,7 @@ msgid ""
"participants won't be able to buy the bundle unless you remove this item "
"from it."
msgstr ""
"Du hast dieses Produkt deaktiviert, obwohl es Teil eines Paketes ist. "
"Sie haben dieses Produkt deaktiviert, obwohl es Teil eines Paketes ist. "
"Solange dies so ist, kann auch das Paket nicht mehr gekauft werden."
#: pretix/control/views/item.py:1622
@@ -30395,7 +30396,7 @@ msgid ""
"and requested a reset of the credentials."
msgstr ""
"Ein Zwei-Faktor-Notfall-Token wurde von einem Systemadministrator generiert. "
"Dies passiert üblicherweise, wenn du den Zugriff auf deinen zweiten Faktor "
"Dies passiert üblicherweise, wenn du den Zugriff auf Ihren zweiten Faktor "
"verloren und ein Zurücksetzen der Zugangsdaten angefordert hast."
#: pretix/control/views/users.py:169
@@ -30776,7 +30777,7 @@ msgstr "PDF-Sammlungen"
#: pretix/plugins/badges/exporters.py:423
msgid "Download all attendee badges as one large PDF for printing."
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
#: pretix/plugins/badges/exporters.py:444
#: pretix/plugins/ticketoutputpdf/exporters.py:80
@@ -31050,7 +31051,7 @@ msgstr "Anderes Bankkonto"
#: pretix/plugins/banktransfer/payment.py:85
msgid "Name of account holder"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:87
msgid ""
@@ -31192,7 +31193,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*in"
msgstr "Kontoinhaber"
#: pretix/plugins/banktransfer/payment.py:304
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
@@ -31788,7 +31789,7 @@ msgid ""
"Download a spreadsheet with all attendees that are included in a check-in "
"list."
msgstr ""
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
"Liste zutrittsberechtigt sind."
#: pretix/plugins/checkinlists/exporters.py:501
@@ -32142,8 +32143,8 @@ msgid ""
msgstr ""
"Während die meisten Zahlungsmethoden keinen grundlosen Widerruf vorsehen, "
"können SEPA-Lastschriften per Mausklick zurückgerufen werden. Aus diesem "
"Grund und abhängig von der Art deiner Veranstaltung kann es notwendig "
"sein, SEPA-Lastschriften nicht anzubieten und damit das Risiko von "
"Grund - und abhängig von der Art Ihrer Veranstaltung - kann es notwendig "
"sein SEPA-Lastschriften nicht anzubieten und damit das Risiko von "
"kostspieligen Rücklastschriften zu vermeiden."
#: pretix/plugins/paypal2/payment.py:182
@@ -32473,7 +32474,7 @@ msgid ""
"Your PayPal account is now connected to pretix. You can change the settings "
"in detail below."
msgstr ""
"Dein PayPal-Konto ist nun mit pretix verbunden. Auf dieser Seite kannst du "
"Ihr PayPal-Konto ist nun mit pretix verbunden. Auf dieser Seite können Sie "
"die Einstellungen im Detail anpassen."
#: pretix/plugins/pretixdroid/apps.py:30 pretix/plugins/pretixdroid/apps.py:33
@@ -32964,7 +32965,7 @@ msgstr "Geplante E-Mails"
#: pretix/plugins/sendmail/signals.py:122
msgid "Mass email was sent to customers or attendees."
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
msgstr "Rundmail wurde an Kunden oder Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:123
msgid "Mass email was sent to waiting list entries."
@@ -32996,7 +32997,7 @@ msgstr "Eine automatisierte E-Mail wurde an den Besteller verschickt"
#: pretix/plugins/sendmail/signals.py:142
msgid "A scheduled email was sent to a ticket holder"
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
msgstr "Eine automatisierte E-Mail wurde an einen Teilnehmer verschickt."
#: pretix/plugins/sendmail/signals.py:143
msgid "An email rule was deleted"
@@ -33029,7 +33030,7 @@ msgstr "Alle nicht eingecheckten Kunden"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
msgid "Attendee contact addresses"
msgstr "Teilnehmer*innen-E-Mail-Adressen"
msgstr "Teilnehmer-E-Mail-Adressen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
msgid "All contact addresses"
@@ -33050,8 +33051,7 @@ msgstr "Neue Regel erstellen"
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:10
msgid "Scheduled emails are not sent as long as your ticket shop is offline."
msgstr ""
"Geplante E-Mails werden nicht verschickt, solange dein Ticketshop offline "
"ist."
"Geplante E-Mails werden nicht verschickt, solange Ihr Ticketshop offline ist."
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:49
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:63
@@ -33190,14 +33190,14 @@ msgstr ""
#: pretix/plugins/sendmail/views.py:250
msgid "Orders or attendees"
msgstr "Bestellungen oder Teilnehmer*innen"
msgstr "Bestellungen oder Teilnehmer"
#: 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*innen, alle Ticketinhaber*innen oder "
"Sende eine E-Mail an alle Ticketkäufer, alle Ticketinhaber oder "
"eine Kombination aus beiden Gruppen."
#: pretix/plugins/sendmail/views.py:417
@@ -33383,7 +33383,7 @@ msgid ""
"methods such as iDEAL, Alipay,and many more."
msgstr ""
"Akzeptiere Zahlungen über Stripe, einen weltweit beliebten "
"Zahlungsdienstleister. Stripe unterstützt Zahlungen per Kreditkarte sowie "
"Zahlungsdienstleister. PayPal unterstützt Zahlungen per Kreditkarte sowie "
"viele lokale Zahlungsarten wie z.B. iDEAL, Alipay, und viele mehr."
#: pretix/plugins/stripe/forms.py:40
@@ -33777,23 +33777,23 @@ msgstr "SEPA-Lastschrift"
#: pretix/plugins/stripe/payment.py:1277
msgid "Account Holder Name"
msgstr "Kontoinhaber*in"
msgstr "Kontoinhaber"
#: pretix/plugins/stripe/payment.py:1282
msgid "Account Holder Street"
msgstr "Straße (Kontoinhaber*in)"
msgstr "Straße (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1294
msgid "Account Holder Postal Code"
msgstr "PLZ (Kontoinhaber*in)"
msgstr "PLZ (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1306
msgid "Account Holder City"
msgstr "Stadt (Kontoinhaber*in)"
msgstr "Stadt (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1318
msgid "Account Holder Country"
msgstr "Land (Kontoinhaber*in)"
msgstr "Land (Kontoinhaber)"
#: pretix/plugins/stripe/payment.py:1362
msgid "Affirm via Stripe"
@@ -33968,8 +33968,8 @@ msgid ""
"Pay by bank allows you to authorize a secure Open Banking payment from your "
"banking app. Currently available only with a UK bank account."
msgstr ""
"Zahlung per Onlinebanking erlaubt die sichere Zahlung über deine Banking-"
"App. Derzeit nur für britische Bankkonten verfügbar."
"Zahlung per Onlinebanking erlaubt die sichere Zahlung über Ihre Banking-App. "
"Derzeit nur für britische Bankkonten verfügbar."
#: pretix/plugins/stripe/payment.py:1886
msgid "PayPal via Stripe"
@@ -34356,7 +34356,7 @@ msgid ""
"Your Stripe account is now connected to pretix. You can change the settings "
"in detail below."
msgstr ""
"Dein Stripe-Konto ist nun mit pretix verbunden. Auf dieser Seite kannst du "
"Ihr Stripe-Konto ist nun mit pretix verbunden. Auf dieser Seite können Sie "
"die Einstellungen im Detail anpassen."
#: pretix/plugins/stripe/views.py:488
@@ -35630,7 +35630,7 @@ msgstr[1] "Das Ticket wurde %(count)s-mal eingelöst."
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:166
msgid "No attendee name provided"
msgstr "Name der teilnehmenden Person nicht angegeben"
msgstr "Name des Teilnehmenrs nicht angegeben"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
msgid "The image you previously uploaded"
@@ -37390,12 +37390,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:386
msgid "Attendee profiles"
msgstr "Teilnehmer*innen-Adresse"
msgstr "Teilnehmer-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*innen-Profile gespeichert."
"In deinem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
msgid "Registration"
@@ -38928,7 +38928,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*innen zu erstellen."
#~ "Teilnehmer zu erstellen."
#~ msgid "This plugin allows you to receive payments via PayPal"
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
@@ -39506,7 +39506,7 @@ msgstr "Kosovo"
#~ msgstr "Biete Ticket-Download bereits vor Bezahlung einer Bestellung an"
#~ msgid "Attendee names"
#~ msgstr "Teilnehmer*innennamen"
#~ msgstr "Teilnehmername"
#~ msgid "Enable output"
#~ msgstr "Aktivieren"
@@ -39783,7 +39783,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*innen selbstständig "
#~ "Wenn diese Option aktiviert ist, können Teilnehmer selbstständig "
#~ "Bestellungen stornieren solange sie nicht bezahlt wurden."
#~ msgid "Sales overview"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:04+0000\n"
"PO-Revision-Date: 2026-05-04 07:42+0000\n"
"Last-Translator: Martin Gross <gross@rami.io>\n"
"PO-Revision-Date: 2026-03-17 14:30+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/de_Informal/>\n"
"Language: de_Informal\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.17\n"
"X-Generator: Weblate 5.16.2\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -428,7 +428,8 @@ msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:276
msgid "If this takes longer than a few minutes, please contact us."
msgstr "Wenn dies länger als einige Minuten dauert, kontaktiere uns bitte."
msgstr ""
"Wenn dies länger als einige Minuten dauert, kontaktieren Sie uns bitte."
#: pretix/static/pretixbase/js/asynctask.js:331
msgid "Close message"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-01 21:00+0000\n"
"Last-Translator: Paul Berschick <paul@plainschwarz.com>\n"
"PO-Revision-Date: 2026-04-17 03:00+0000\n"
"Last-Translator: Tim <plicnetwork@gmail.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
"es/>\n"
"Language: es\n"
@@ -8231,8 +8231,10 @@ msgstr ""
"2x complemento 2"
#: pretix/base/pdf.py:383
#, fuzzy
#| msgid "List of Add-Ons"
msgid "List of Checked-In Add-Ons"
msgstr "Lista de complementos registrados"
msgstr "Lista de add-ons"
#: pretix/base/pdf.py:390 pretix/control/forms/filter.py:1537
#: pretix/control/forms/filter.py:1539
@@ -9235,8 +9237,10 @@ msgid "Czech National Bank"
msgstr "Banco Nacional Checo"
#: pretix/base/services/currencies.py:41
#, fuzzy
#| msgid "Czech National Bank"
msgid "National Bank of Poland"
msgstr "Banco Nacional de Polonia"
msgstr "Banco Nacional Checo"
#: pretix/base/services/export.py:95 pretix/base/services/export.py:155
msgid ""
@@ -10332,12 +10336,16 @@ msgstr ""
"importe de la factura no esté en CZK."
#: pretix/base/settings.py:577 pretix/base/settings.py:586
#, fuzzy
#| msgid ""
#| "Based on Czech National Bank daily rates, whenever the invoice amount is "
#| "not in CZK."
msgid ""
"Based on National Bank of Poland daily rates, whenever the invoice amount is "
"not in PLN."
msgstr ""
"Según los tipos de cambio diarios del Banco Nacional de Polonia, siempre que "
"el importe de la factura no esté en PLN."
"Basado en las tarifas diarias del Banco Nacional Checo, siempre que el "
"importe de la factura no esté en CZK."
#: pretix/base/settings.py:597
msgid "Require invoice address"
@@ -16422,8 +16430,10 @@ msgid "Allow to overbook quotas when performing this operation"
msgstr "Permitir sobrevender cupos cuando se realice esta operación"
#: pretix/control/forms/orders.py:335
#, fuzzy
#| msgid "Number of orders"
msgid "Number of products to add"
msgstr "Número de productos que se van a añadir"
msgstr "Número de pedidos"
#: pretix/control/forms/orders.py:344
msgid "Add-on to"
@@ -16455,8 +16465,10 @@ msgstr ""
"defecto del producto"
#: pretix/control/forms/orders.py:441
#, fuzzy
#| msgid "You can not select the same seat multiple times."
msgid "You can not choose a seat when adding multiple products at once."
msgstr "No es posible elegir un asiento al añadir varios productos a la vez."
msgstr "No se puede seleccionar la misma butaca varias veces."
#: pretix/control/forms/orders.py:478 pretix/control/forms/orders.py:482
#: pretix/control/forms/orders.py:510 pretix/control/forms/orders.py:552
@@ -17064,7 +17076,7 @@ msgstr "Día de fin de semana"
#: pretix/control/forms/subevents.py:106
msgctxt "subevent"
msgid "Skip dates that overlap with any existing date"
msgstr "Omite las fechas que coincidan con alguna fecha ya existente"
msgstr ""
#: pretix/control/forms/subevents.py:109
msgctxt "subevent"
@@ -17074,11 +17086,6 @@ msgid ""
"This respects even inactive dates and works best if all dates have both a "
"start and end time."
msgstr ""
"Esto puede resultar útil si todas tus citas tienen lugar en el mismo lugar y "
"no se deben crear citas repetidas que entren en conflicto con eventos "
"especiales ya existentes. Esta función tiene en cuenta incluso las citas "
"inactivas y funciona mejor si todas las citas tienen una hora de inicio y "
"una hora de finalización."
#: pretix/control/forms/subevents.py:128
msgid "Keep the current values"
@@ -24357,7 +24364,7 @@ msgstr "Escaneo de entrada: %(date)s"
#: pretix/control/templates/pretixcontrol/order/index.html:465
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:55
msgid "Voucher code used:"
msgstr "Código de descuento utilizado:"
msgstr "Código de vale de compra utilizado:"
#: pretix/control/templates/pretixcontrol/order/index.html:467
#, python-format
@@ -30273,8 +30280,6 @@ msgstr "No cree más de 100.000 fechas a la vez."
#: pretix/control/views/subevents.py:966
msgid "All dates would be skipped because they conflict with existing dates."
msgstr ""
"Se omitirían todas las fechas, ya que entran en conflicto con las ya "
"existentes."
#: pretix/control/views/subevents.py:1102
#, python-brace-format
@@ -34922,7 +34927,7 @@ msgstr "tiene errores"
#: pretix/presale/templates/pretixpresale/event/fragment_voucher_form.html:14
msgctxt "form"
msgid "required"
msgstr "obligatorio"
msgstr "requerido"
#: pretix/presale/ical.py:87 pretix/presale/ical.py:146
#: pretix/presale/ical.py:182

View File

@@ -4,16 +4,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-08 04:00+0000\n"
"Last-Translator: corentin-spec <corentin@spectentaculaire.fr>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix/"
"fr/>\n"
"PO-Revision-Date: 2026-03-31 17: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"
"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.17.1\n"
"X-Generator: Weblate 5.16.2\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -8279,8 +8279,10 @@ msgstr ""
"2x Add-on 2"
#: pretix/base/pdf.py:383
#, fuzzy
#| msgid "List of Add-Ons"
msgid "List of Checked-In Add-Ons"
msgstr "Liste des modules complémentaires enregistrés"
msgstr "Liste des Addons"
#: pretix/base/pdf.py:390 pretix/control/forms/filter.py:1537
#: pretix/control/forms/filter.py:1539
@@ -9294,8 +9296,10 @@ msgid "Czech National Bank"
msgstr "Banque nationale tchèque"
#: pretix/base/services/currencies.py:41
#, fuzzy
#| msgid "Czech National Bank"
msgid "National Bank of Poland"
msgstr "Banque nationale de Pologne"
msgstr "Banque nationale tchèque"
#: pretix/base/services/export.py:95 pretix/base/services/export.py:155
msgid ""
@@ -10392,12 +10396,16 @@ msgstr ""
"que le montant de la facture nest pas en CZK."
#: pretix/base/settings.py:577 pretix/base/settings.py:586
#, fuzzy
#| msgid ""
#| "Based on Czech National Bank daily rates, whenever the invoice amount is "
#| "not in CZK."
msgid ""
"Based on National Bank of Poland daily rates, whenever the invoice amount is "
"not in PLN."
msgstr ""
"Sur la base des taux quotidiens de la Banque nationale de Pologne, lorsque "
"le montant de la facture n'est pas libellé en PLN."
"Sur la base des taux journaliers de la Banque nationale tchèque, chaque fois "
"que le montant de la facture nest pas en CZK."
#: pretix/base/settings.py:597
msgid "Require invoice address"
@@ -16561,8 +16569,10 @@ msgstr ""
"Autoriser à surbooker les quotas lors de lexécution de cette opération"
#: pretix/control/forms/orders.py:335
#, fuzzy
#| msgid "Number of orders"
msgid "Number of products to add"
msgstr "Nombre d'articles à ajouter"
msgstr "Nombre de commandes"
#: pretix/control/forms/orders.py:344
msgid "Add-on to"
@@ -16594,10 +16604,10 @@ msgstr ""
"produit"
#: pretix/control/forms/orders.py:441
#, fuzzy
#| msgid "You can not select the same seat multiple times."
msgid "You can not choose a seat when adding multiple products at once."
msgstr ""
"Vous ne pouvez pas choisir de siège lorsque vous ajoutez plusieurs produits "
"à la fois."
msgstr "Vous ne pouvez pas sélectionner le même siège plusieurs fois."
#: pretix/control/forms/orders.py:478 pretix/control/forms/orders.py:482
#: pretix/control/forms/orders.py:510 pretix/control/forms/orders.py:552
@@ -17220,7 +17230,7 @@ msgstr "Jour de fin de semaine"
#: pretix/control/forms/subevents.py:106
msgctxt "subevent"
msgid "Skip dates that overlap with any existing date"
msgstr "Ignorer les dates qui coïncident avec une date existante"
msgstr ""
#: pretix/control/forms/subevents.py:109
msgctxt "subevent"
@@ -17230,11 +17240,6 @@ msgid ""
"This respects even inactive dates and works best if all dates have both a "
"start and end time."
msgstr ""
"Cette option peut s'avérer utile si toutes vos dates se déroulent au même "
"endroit et qu'aucune date ne doit être créée en double et entrer en conflit "
"avec des événements spéciaux existants. Elle prend en compte même les dates "
"inactives et fonctionne mieux si toutes les dates comportent à la fois une "
"heure de début et une heure de fin."
#: pretix/control/forms/subevents.py:128
msgid "Keep the current values"
@@ -30507,8 +30512,6 @@ msgstr "Veuillez ne pas créer plus de 100.000 dates à la fois."
#: pretix/control/views/subevents.py:966
msgid "All dates would be skipped because they conflict with existing dates."
msgstr ""
"Toutes ces dates seraient ignorées car elles entrent en conflit avec des "
"dates déjà existantes."
#: pretix/control/views/subevents.py:1102
#, python-brace-format
@@ -37884,7 +37887,7 @@ msgstr "Votre panier a été mis à jour."
#: pretix/presale/views/cart.py:525 pretix/presale/views/cart.py:551
msgid "Your cart is now empty."
msgstr "Votre panier a été vidé."
msgstr "Votre panier à été vidé."
#: pretix/presale/views/cart.py:584
msgid ""

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-02 23:00+0000\n"
"Last-Translator: Daniel Musketa <daniel@musketa.de>\n"
"PO-Revision-Date: 2024-05-10 15:47+0000\n"
"Last-Translator: Martin Gross <gross@rami.io>\n"
"Language-Team: Norwegian Bokmål <https://translate.pretix.eu/projects/pretix/"
"pretix/nb_NO/>\n"
"Language: nb_NO\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.17\n"
"X-Generator: Weblate 5.4.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -37,11 +37,11 @@ msgstr "Arabisk"
#: pretix/_base_settings.py:91
msgid "Basque"
msgstr "Baskisk"
msgstr ""
#: pretix/_base_settings.py:92
msgid "Catalan"
msgstr "Katalansk"
msgstr ""
#: pretix/_base_settings.py:93
msgid "Chinese (simplified)"
@@ -57,7 +57,7 @@ msgstr "Tsjekkisk"
#: pretix/_base_settings.py:96
msgid "Croatian"
msgstr "Kroatisk"
msgstr ""
#: pretix/_base_settings.py:97
msgid "Danish"
@@ -89,7 +89,7 @@ msgstr "Gresk"
#: pretix/_base_settings.py:104
msgid "Hebrew"
msgstr "Hebraisk"
msgstr ""
#: pretix/_base_settings.py:105
msgid "Indonesian"
@@ -101,7 +101,7 @@ msgstr "Italiensk"
#: pretix/_base_settings.py:107
msgid "Japanese"
msgstr "Japansk"
msgstr ""
#: pretix/_base_settings.py:108
msgid "Latvian"
@@ -133,11 +133,11 @@ msgstr "Russisk"
#: pretix/_base_settings.py:115
msgid "Slovak"
msgstr "Slovakisk"
msgstr ""
#: pretix/_base_settings.py:116
msgid "Swedish"
msgstr "Svensk"
msgstr ""
#: pretix/_base_settings.py:117
msgid "Spanish"
@@ -145,7 +145,7 @@ msgstr "Spansk"
#: pretix/_base_settings.py:118
msgid "Spanish (Latin America)"
msgstr "Spansk (Latin-Amerika)"
msgstr ""
#: pretix/_base_settings.py:119
msgid "Turkish"

View File

@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-05 13:26+0000\n"
"PO-Revision-Date: 2026-03-31 17:00+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
"\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
">\n"
"Language: nl\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.17.1\n"
"X-Generator: Weblate 5.16.2\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -8209,8 +8209,10 @@ msgstr ""
"2x Add-on 2"
#: pretix/base/pdf.py:383
#, fuzzy
#| msgid "List of Add-Ons"
msgid "List of Checked-In Add-Ons"
msgstr "Lijst met ingecheckte add-ons"
msgstr "Lijst met add-ons"
#: pretix/base/pdf.py:390 pretix/control/forms/filter.py:1537
#: pretix/control/forms/filter.py:1539
@@ -9204,8 +9206,10 @@ msgid "Czech National Bank"
msgstr "Tsjechische Nationale Bank"
#: pretix/base/services/currencies.py:41
#, fuzzy
#| msgid "Czech National Bank"
msgid "National Bank of Poland"
msgstr "Nationale Bank van Polen"
msgstr "Tsjechische Nationale Bank"
#: pretix/base/services/export.py:95 pretix/base/services/export.py:155
msgid ""
@@ -10292,12 +10296,16 @@ msgstr ""
"wanneer het factuurbedrag niet in CZK is."
#: pretix/base/settings.py:577 pretix/base/settings.py:586
#, fuzzy
#| msgid ""
#| "Based on Czech National Bank daily rates, whenever the invoice amount is "
#| "not in CZK."
msgid ""
"Based on National Bank of Poland daily rates, whenever the invoice amount is "
"not in PLN."
msgstr ""
"Op basis van de dagkoersen van de Nationale Bank van Polen, wanneer het "
"factuurbedrag niet in PLN is uitgedrukt."
"Gebaseerd op de dagelijkse tarieven van de Tsjechische Nationale Bank, "
"wanneer het factuurbedrag niet in CZK is."
#: pretix/base/settings.py:597
msgid "Require invoice address"
@@ -16367,8 +16375,10 @@ msgid "Allow to overbook quotas when performing this operation"
msgstr "Quota overboeken bij deze handeling toestaan"
#: pretix/control/forms/orders.py:335
#, fuzzy
#| msgid "Number of orders"
msgid "Number of products to add"
msgstr "Aantal producten dat moet worden toegevoegd"
msgstr "Aantal bestellingen"
#: pretix/control/forms/orders.py:344
msgid "Add-on to"
@@ -16400,9 +16410,10 @@ msgstr ""
"standaardprijs van het product"
#: pretix/control/forms/orders.py:441
#, fuzzy
#| msgid "You can not select the same seat multiple times."
msgid "You can not choose a seat when adding multiple products at once."
msgstr ""
"U kunt geen zitplaats kiezen wanneer u meerdere producten tegelijk toevoegt."
msgstr "U kunt dezelfde stoel niet meerdere keren kiezen."
#: pretix/control/forms/orders.py:478 pretix/control/forms/orders.py:482
#: pretix/control/forms/orders.py:510 pretix/control/forms/orders.py:552
@@ -17016,7 +17027,7 @@ msgstr "Weekenddag"
#: pretix/control/forms/subevents.py:106
msgctxt "subevent"
msgid "Skip dates that overlap with any existing date"
msgstr "Sla data over die samenvallen met bestaande data"
msgstr ""
#: pretix/control/forms/subevents.py:109
msgctxt "subevent"
@@ -17026,11 +17037,6 @@ msgid ""
"This respects even inactive dates and works best if all dates have both a "
"start and end time."
msgstr ""
"Dit kan handig zijn als alle afspraken op dezelfde locatie plaatsvinden en "
"je wilt voorkomen dat terugkerende afspraken in conflict komen met bestaande "
"speciale afspraken. Hierbij wordt ook rekening gehouden met inactieve "
"afspraken en het werkt het beste als alle afspraken een begin- en eindtijd "
"hebben."
#: pretix/control/forms/subevents.py:128
msgid "Keep the current values"
@@ -30162,8 +30168,6 @@ msgstr "U kunt maximaal 100.000 datums tegelijk aanmaken."
#: pretix/control/views/subevents.py:966
msgid "All dates would be skipped because they conflict with existing dates."
msgstr ""
"Alle afspraken zouden worden overgeslagen omdat ze samenvallen met bestaande "
"afspraken."
#: pretix/control/views/subevents.py:1102
#, python-brace-format

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-28 09:03+0000\n"
"PO-Revision-Date: 2026-05-05 13:26+0000\n"
"PO-Revision-Date: 2026-04-08 18:00+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch (Belgium) <https://translate.pretix.eu/projects/pretix/"
"pretix/nl_BE/>\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.17.1\n"
"X-Generator: Weblate 5.16.2\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -8204,8 +8204,10 @@ msgstr ""
"2x Add-on 2"
#: pretix/base/pdf.py:383
#, fuzzy
#| msgid "List of Add-Ons"
msgid "List of Checked-In Add-Ons"
msgstr "Lijst met ingecheckte add-ons"
msgstr "Lijst met add-ons"
#: pretix/base/pdf.py:390 pretix/control/forms/filter.py:1537
#: pretix/control/forms/filter.py:1539
@@ -9200,8 +9202,10 @@ msgid "Czech National Bank"
msgstr "Tsjechische Nationale Bank"
#: pretix/base/services/currencies.py:41
#, fuzzy
#| msgid "Czech National Bank"
msgid "National Bank of Poland"
msgstr "Nationale Bank van Polen"
msgstr "Tsjechische Nationale Bank"
#: pretix/base/services/export.py:95 pretix/base/services/export.py:155
msgid ""
@@ -10289,12 +10293,16 @@ msgstr ""
"wanneer het factuurbedrag niet in CZK is."
#: pretix/base/settings.py:577 pretix/base/settings.py:586
#, fuzzy
#| msgid ""
#| "Based on Czech National Bank daily rates, whenever the invoice amount is "
#| "not in CZK."
msgid ""
"Based on National Bank of Poland daily rates, whenever the invoice amount is "
"not in PLN."
msgstr ""
"Op basis van de dagkoersen van de Nationale Bank van Polen, wanneer het "
"factuurbedrag niet in PLN is uitgedrukt."
"Gebaseerd op de dagelijkse tarieven van de Tsjechische Nationale Bank, "
"wanneer het factuurbedrag niet in CZK is."
#: pretix/base/settings.py:597
msgid "Require invoice address"
@@ -16361,8 +16369,10 @@ msgid "Allow to overbook quotas when performing this operation"
msgstr "Quota overboeken bij deze handeling toestaan"
#: pretix/control/forms/orders.py:335
#, fuzzy
#| msgid "Number of orders"
msgid "Number of products to add"
msgstr "Aantal producten dat moet worden toegevoegd"
msgstr "Aantal bestellingen"
#: pretix/control/forms/orders.py:344
msgid "Add-on to"
@@ -16394,9 +16404,10 @@ msgstr ""
"standaardprijs van het product"
#: pretix/control/forms/orders.py:441
#, fuzzy
#| msgid "You can not select the same seat multiple times."
msgid "You can not choose a seat when adding multiple products at once."
msgstr ""
"U kunt geen zitplaats kiezen wanneer u meerdere producten tegelijk toevoegt."
msgstr "U kunt dezelfde stoel niet meerdere keren kiezen."
#: pretix/control/forms/orders.py:478 pretix/control/forms/orders.py:482
#: pretix/control/forms/orders.py:510 pretix/control/forms/orders.py:552
@@ -17009,7 +17020,7 @@ msgstr "Weekenddag"
#: pretix/control/forms/subevents.py:106
msgctxt "subevent"
msgid "Skip dates that overlap with any existing date"
msgstr "Sla data over die samenvallen met bestaande data"
msgstr ""
#: pretix/control/forms/subevents.py:109
msgctxt "subevent"
@@ -17019,11 +17030,6 @@ msgid ""
"This respects even inactive dates and works best if all dates have both a "
"start and end time."
msgstr ""
"Dit kan handig zijn als alle afspraken op dezelfde locatie plaatsvinden en "
"je wilt voorkomen dat terugkerende afspraken in conflict komen met bestaande "
"speciale afspraken. Hierbij wordt ook rekening gehouden met inactieve "
"afspraken en het werkt het beste als alle afspraken een begin- en eindtijd "
"hebben."
#: pretix/control/forms/subevents.py:128
msgid "Keep the current values"
@@ -30139,8 +30145,6 @@ msgstr "U kunt maximaal 100.000 datums tegelijk aanmaken."
#: pretix/control/views/subevents.py:966
msgid "All dates would be skipped because they conflict with existing dates."
msgstr ""
"Alle afspraken zouden worden overgeslagen omdat ze samenvallen met bestaande "
"afspraken."
#: pretix/control/views/subevents.py:1102
#, python-brace-format
@@ -31443,16 +31447,10 @@ msgid ""
"refunds.\n"
" "
msgstr ""
"\n"
" Let op: terugbetalingen zullen als uitgevoerd worden "
"gemarkeerd zodra er een exportbestand wordt aangemaakt.\n"
" Zorg ervoor dat u het exportbestand downloadt en de "
"terugbetalingen daadwerkelijk uitvoert.\n"
" "
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:50
msgid "Exported files"
msgstr "Geëxporteerde bestanden"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:55
msgid "Export date"
@@ -31464,17 +31462,17 @@ msgstr "Aantal bestellingen"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:80
msgid "not downloaded"
msgstr "niet gedownload"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:85
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:96
msgid "Download CSV"
msgstr "CSV downloaden"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:90
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:101
msgid "SEPA XML"
msgstr "SEPA-XML"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:110
msgid "No exports have been created yet."
@@ -31482,7 +31480,7 @@ msgstr "Er zijn nog geen exports aangemaakt."
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/sepa_export.html:10
msgid "Export SEPA xml"
msgstr "Exporteer SEPA-XML"
msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/sepa_export.html:13
#, python-format

View File

@@ -57,7 +57,7 @@ from django.utils.translation import gettext as _, gettext_lazy, pgettext_lazy
from pypdf import PageObject, PdfReader, PdfWriter, Transformation
from pypdf.generic import RectangleObject
from reportlab.lib import pagesizes
from reportlab.lib.units import inch, mm
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from pretix.base.exporter import BaseExporter
@@ -133,14 +133,6 @@ OPTIONS = OrderedDict([
'offsets': [66.1 * mm, 29.6 * mm],
'pagesize': pagesizes.A4,
}),
('avery_4inx3in', {
'name': 'Avery 4" x 3" (74459)',
'cols': 2,
'rows': 3,
'margins': [1 * inch, .25 * inch, 1 * inch, .25 * inch],
'offsets': [4 * inch, 3 * inch],
'pagesize': pagesizes.LETTER,
}),
('avery_80x50', {
'name': 'Avery Zweckform 80 x 50 mm (L4785)',
'cols': 2,

View File

@@ -22,7 +22,7 @@
from django.utils.text import format_lazy
from django.utils.translation import gettext_lazy as _
from reportlab.lib import pagesizes
from reportlab.lib.units import inch, mm
from reportlab.lib.units import mm
def _simple_template(w, h):
@@ -261,9 +261,4 @@ TEMPLATES = {
"pagesize": (88.9 * mm, 33.87 * mm),
"layout": _simple_template(88.9 * mm, 33.87 * mm),
},
"4inx3in": {
"label": format_lazy(_("{width} x {height} inch label"), width=4, height=3),
"pagesize": (4 * inch, 3 * inch),
"layout": _simple_template(4 * inch, 3 * inch),
},
}

View File

@@ -1,19 +0,0 @@
from django.db import migrations
from django.db.models import F
def remove_cross_event_scheduled_mails(apps, schema_editor):
Rule = apps.get_model("sendmail", "Rule")
ScheduledMail = apps.get_model("sendmail", "ScheduledMail")
ScheduledMail.objects.filter(rule__subevent__isnull=False).exclude(rule__subevent__event=F('rule__event')).delete()
Rule.objects.filter(subevent__isnull=False).exclude(subevent__event=F('event')).delete()
class Migration(migrations.Migration):
dependencies = [
("sendmail", "0010_auto_20250801_1342"),
]
operations = [
migrations.RunPython(remove_cross_event_scheduled_mails),
]

View File

@@ -232,7 +232,7 @@ def sendmail_copy_data_receiver(sender, other, item_map, **kwargs):
if sender.sendmail_rules.exists(): # idempotency
return
for r in other.sendmail_rules.filter(subevent__isnull=True).prefetch_related('limit_products'):
for r in other.sendmail_rules.prefetch_related('limit_products'):
limit_products = list(r.limit_products.all())
r = copy.copy(r)
r.pk = None

View File

@@ -386,7 +386,7 @@ class StripeSettingsHolder(BasePaymentProvider):
disabled=self.event.currency != 'EUR',
help_text=(
_('Some payment methods might need to be enabled in the settings of your Stripe account '
'before they work properly.') +
'before work properly.') +
'<div class="alert alert-warning">%s</div>' % _(
'SEPA Direct Debit payments via Stripe are <strong>not</strong> processed '
'instantly but might take up to <strong>14 days</strong> to be confirmed in some cases. '

View File

@@ -153,7 +153,7 @@ def get_private_icals(event, positions):
# Actual ical organizer field is not useful since it will cause "your invitation was accepted" emails to the organizer
descr.append(_('Organizer: {organizer}').format(organizer=event.organizer.name))
description = '\n'.join(descr)
location = ", ".join(l.strip() for l in str(pt.location).splitlines() if l.strip())
location = None
dtstart = pt.start.astimezone(tz)
dtend = pt.end.astimezone(tz)
uid = 'pretix-{}-{}-{}-{}@{}'.format(

View File

@@ -34,7 +34,6 @@ from compressor.filters.jsmin import rJSMinFilter
from django.conf import settings
from django.contrib.staticfiles import finders
from django.core.cache import cache
from django.core.exceptions import BadRequest
from django.core.files.base import ContentFile, File
from django.core.files.storage import default_storage
from django.db.models import Q
@@ -677,10 +676,7 @@ class WidgetAPIProductList(EventListMixin, View):
for d in data['days']:
d['events'] = self._serialize_events(d['events'] or [])
else:
try:
offset = int(self.request.GET.get("offset", 0))
except ValueError:
raise BadRequest('GET parameter "offset" must be an integer.')
offset = int(self.request.GET.get("offset", 0))
limit = 50
if hasattr(self.request, 'event'):
evs = filter_qs_by_attr(

View File

@@ -265,7 +265,7 @@ EMAIL_USE_TLS = config.getboolean('mail', 'tls', fallback=False)
EMAIL_USE_SSL = config.getboolean('mail', 'ssl', fallback=False)
EMAIL_SUBJECT_PREFIX = '[pretix] '
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_CUSTOM_SMTP_BACKEND = 'pretix.base.email.CheckPrivateNetworkSmtpBackend'
EMAIL_CUSTOM_SMTP_BACKEND = 'pretixbase.email.CheckPrivateNetworkSmtpBackend'
EMAIL_TIMEOUT = 60
ADMINS = [('Admin', n) for n in config.get('mail', 'admins', fallback='').split(",") if n]

View File

@@ -9,7 +9,7 @@
"version": "0.0.0",
"dependencies": {
"@babel/core": "^7.28.5",
"@babel/preset-env": "^7.29.3",
"@babel/preset-env": "^7.29.0",
"@rollup/plugin-babel": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.3",
"rollup": "^2.79.1",
@@ -32,9 +32,9 @@
}
},
"node_modules/@babel/compat-data": {
"version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz",
"integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==",
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
"integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
"engines": {
"node": ">=6.9.0"
}
@@ -439,21 +439,6 @@
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
"version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz",
"integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
@@ -1316,18 +1301,17 @@
}
},
"node_modules/@babel/preset-env": {
"version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.3.tgz",
"integrity": "sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==",
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz",
"integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==",
"dependencies": {
"@babel/compat-data": "^7.29.3",
"@babel/compat-data": "^7.29.0",
"@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-validator-option": "^7.27.1",
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5",
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
@@ -3767,9 +3751,9 @@
}
},
"@babel/compat-data": {
"version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz",
"integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg=="
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
"integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="
},
"@babel/core": {
"version": "7.28.5",
@@ -4049,15 +4033,6 @@
"@babel/helper-plugin-utils": "^7.27.1"
}
},
"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
"version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz",
"integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==",
"requires": {
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
}
},
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
@@ -4557,18 +4532,17 @@
}
},
"@babel/preset-env": {
"version": "7.29.3",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.3.tgz",
"integrity": "sha512-ySZypNLAIH1ClygLDQzVMoGQRViATnkHkYYV6TcNDz+8+jwZCdsguGvsb3EY5d9wyWyhmF1iSuFM0Yh5XPnqSA==",
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.0.tgz",
"integrity": "sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==",
"requires": {
"@babel/compat-data": "^7.29.3",
"@babel/compat-data": "^7.29.0",
"@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-validator-option": "^7.27.1",
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5",
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",

View File

@@ -5,7 +5,7 @@
"scripts": {},
"dependencies": {
"@babel/core": "^7.28.5",
"@babel/preset-env": "^7.29.3",
"@babel/preset-env": "^7.29.0",
"@rollup/plugin-babel": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.3",
"vue": "^2.7.16",

View File

@@ -530,7 +530,6 @@ def test_item_detail_program_times(token_client, organizer, event, team, item, c
res["program_times"] = [{
"start": "2017-12-27T00:00:00Z",
"end": "2017-12-28T00:00:00Z",
"location": None
}]
resp = token_client.get('/api/v1/organizers/{}/events/{}/items/{}/'.format(organizer.slug, event.slug,
item.pk))
@@ -1973,54 +1972,32 @@ def program_time2(item, category):
end=datetime(2017, 12, 30, 0, 0, 0, tzinfo=timezone.utc))
@pytest.fixture
def program_time3(item, category):
return item.program_times.create(start=datetime(2017, 12, 30, 0, 0, 0, tzinfo=timezone.utc),
end=datetime(2017, 12, 31, 0, 0, 0, tzinfo=timezone.utc),
location='Testlocation')
TEST_PROGRAM_TIMES_RES = {
0: {
"start": "2017-12-27T00:00:00Z",
"end": "2017-12-28T00:00:00Z",
"location": None,
},
1: {
"start": "2017-12-29T00:00:00Z",
"end": "2017-12-30T00:00:00Z",
"location": None,
},
2: {
"start": "2017-12-30T00:00:00Z",
"end": "2017-12-31T00:00:00Z",
"location": {"en": "Testlocation"},
}
}
@pytest.mark.django_db
def test_program_times_list(token_client, organizer, event, item, program_time, program_time2, program_time3):
def test_program_times_list(token_client, organizer, event, item, program_time, program_time2):
res = dict(TEST_PROGRAM_TIMES_RES)
res[0]["id"] = program_time.pk
res[1]["id"] = program_time2.pk
res[2]["id"] = program_time3.pk
resp = token_client.get('/api/v1/organizers/{}/events/{}/items/{}/program_times/'.format(organizer.slug, event.slug,
item.pk))
assert resp.status_code == 200
assert res[0]['start'] == resp.data['results'][0]['start']
assert res[0]['end'] == resp.data['results'][0]['end']
assert res[0]['id'] == resp.data['results'][0]['id']
assert res[0] == resp.data['results'][0]
assert res[1]['start'] == resp.data['results'][1]['start']
assert res[1]['end'] == resp.data['results'][1]['end']
assert res[1]['id'] == resp.data['results'][1]['id']
assert res[1] == resp.data['results'][1]
assert res[2]['start'] == resp.data['results'][2]['start']
assert res[2]['end'] == resp.data['results'][2]['end']
assert res[2]['location'] == resp.data['results'][2]['location']
assert res[2]['id'] == resp.data['results'][2]['id']
assert res[2] == resp.data['results'][2]
@pytest.mark.django_db
@@ -2062,59 +2039,6 @@ def test_program_times_create(token_client, organizer, event, item):
assert resp.content.decode() == '{"non_field_errors":["The program end must not be before the program start."]}'
@pytest.mark.django_db
def test_program_times_create_location(token_client, organizer, event, item):
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/{}/program_times/'.format(organizer.slug, event.slug, item.pk),
{
"start": "2017-12-27T00:00:00Z",
"end": "2017-12-28T00:00:00Z",
"location": {
"en": "Testlocation",
"de": "Testort"
}
},
format='json'
)
assert resp.status_code == 201
with scopes_disabled():
program_time = ItemProgramTime.objects.get(pk=resp.data['id'])
assert "Testlocation" == program_time.location.localize("en")
assert "Testort" == program_time.location.localize("de")
@pytest.mark.django_db
def test_program_times_create_without_location(token_client, organizer, event, item):
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/{}/program_times/'.format(organizer.slug, event.slug, item.pk),
{
"start": "2017-12-27T00:00:00Z",
"end": "2017-12-28T00:00:00Z"
},
format='json'
)
assert resp.status_code == 201
assert resp.data['location'] is None
with scopes_disabled():
program_time = ItemProgramTime.objects.get(pk=resp.data['id'])
assert str(program_time.location) == ""
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/items/{}/program_times/'.format(organizer.slug, event.slug, item.pk),
{
"start": "2017-12-27T00:00:00Z",
"end": "2017-12-28T00:00:00Z",
"location": None
},
format='json'
)
assert resp.status_code == 201
assert resp.data['location'] is None
with scopes_disabled():
program_time = ItemProgramTime.objects.get(pk=resp.data['id'])
assert str(program_time.location) == ""
@pytest.mark.django_db
def test_program_times_update(token_client, organizer, event, item, program_time):
resp = token_client.patch(

View File

@@ -82,11 +82,7 @@ def test_full_clone_same_organizer():
assert item1.meta_data
ItemProgramTime.objects.create(item=item1,
start=datetime.datetime(2017, 12, 27, 0, 0, 0, tzinfo=datetime.timezone.utc),
end=datetime.datetime(2017, 12, 28, 0, 0, 0, tzinfo=datetime.timezone.utc),
location={
"en": "Testlocation",
"de": "Testort"
})
end=datetime.datetime(2017, 12, 28, 0, 0, 0, tzinfo=datetime.timezone.utc))
assert item1.program_times
item2 = event.items.create(category=category, tax_rule=tax_rule, name="T-shirt", default_price=15,
hidden_if_item_available=item1)
@@ -173,7 +169,6 @@ def test_full_clone_same_organizer():
assert copied_item1.meta_data == item1.meta_data
assert copied_item1.program_times.first().start == item1.program_times.first().start
assert copied_item1.program_times.first().end == item1.program_times.first().end
assert copied_item1.program_times.first().location == item1.program_times.first().location
assert copied_item2.variations.get().meta_data == item2v.meta_data
assert copied_item1.hidden_if_available == copied_q2
assert copied_item1.grant_membership_type == membership_type

View File

@@ -692,8 +692,7 @@ class ItemsTest(ItemFormTest):
self.item2.program_times.create(start=datetime.datetime(2017, 12, 27, 0, 0, 0,
tzinfo=datetime.timezone.utc),
end=datetime.datetime(2017, 12, 28, 0, 0, 0,
tzinfo=datetime.timezone.utc),
location={"en": "Testlocation", "de": "Testort"})
tzinfo=datetime.timezone.utc))
doc = self.get_doc('/control/event/%s/%s/items/add?copy_from=%d' % (self.orga1.slug, self.event1.slug, self.item2.pk))
data = extract_form_fields(doc.select("form")[0])
@@ -724,7 +723,6 @@ class ItemsTest(ItemFormTest):
assert set([str(v.value) for v in i_new.variations.all()]) == set([str(v.value) for v in i_old.variations.all()])
assert i_old.program_times.first().start == i_new.program_times.first().start
assert i_old.program_times.first().end == i_new.program_times.first().end
assert i_old.program_times.first().location == i_new.program_times.first().location
def test_add_to_existing_quota(self):
with scopes_disabled():

View File

@@ -25,11 +25,10 @@ from zoneinfo import ZoneInfo
import pytest
from django.core import mail as djmail
from django.db.models import F
from django.utils.timezone import now
from django_scopes import scopes_disabled
from pretix.base.models import Event, InvoiceAddress, Order
from pretix.base.models import InvoiceAddress, Order
from pretix.base.services.checkin import perform_checkin
from pretix.plugins.sendmail.models import Rule, ScheduledMail
from pretix.plugins.sendmail.signals import sendmail_run_rules
@@ -688,41 +687,3 @@ def test_sendmail_context_localization(event, order, pos):
sendmail_run_rules(None)
assert "Hallo Herr Mustermann" in djmail.outbox[0].body
@pytest.mark.django_db
@scopes_disabled()
def test_event_clone_ignores_rules_with_subevent(event, order, pos):
event.has_subevents = True
event.save()
se1 = event.subevents.create(name="subevent 1", date_from=dt_now)
event.sendmail_rules.create(date_is_absolute=False, send_offset_days=1, send_offset_time=datetime.time(hour=12),
subject='Mail To Subevent', template='TestBody', subevent=se1)
event.sendmail_rules.create(date_is_absolute=False, send_offset_days=1, send_offset_time=datetime.time(hour=12),
subject='Mail To All', template='TestBody')
assert event.sendmail_rules.count() == 2
assert event.scheduledmail_set.count() == 2
for rule in event.sendmail_rules.all():
assert rule.scheduledmail_set.count() == 1
copied_event = Event.objects.create(
organizer=event.organizer, name='Dummy2', slug='dummy2',
date_from=datetime.datetime(2022, 4, 15, 9, 0, 0, tzinfo=datetime.timezone.utc),
has_subevents=True
)
copied_event.copy_data_from(event)
copied_event.refresh_from_db()
event.refresh_from_db()
assert copied_event.sendmail_rules.count() == 1
assert copied_event.sendmail_rules.first().scheduledmail_set.count() == 0
assert str(copied_event.sendmail_rules.first().subject) == "Mail To All"
copied_event.subevents.create(name="subevent 1 in copied", date_from=dt_now)
assert copied_event.sendmail_rules.first().scheduledmail_set.count() == 1
# Double-Check: no scheduled mails and rules exist where subevent.event and event do not align
assert ScheduledMail.objects.filter(rule__subevent__isnull=False).exclude(rule__subevent__event=F('rule__event')).count() == 0
assert Rule.objects.filter(subevent__isnull=False).exclude(subevent__event=F('event')).count() == 0