forked from CGM_Public/pretix_original
Compare commits
20
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0614a9ebc3 | ||
|
|
f637e1fcdd | ||
|
|
c64553ad69 | ||
|
|
b6518449d6 | ||
|
|
50c99e1239 | ||
|
|
e70452ee47 | ||
|
|
666b496ab4 | ||
|
|
8bd0665f37 | ||
|
|
ed1459b1dd | ||
|
|
8c251029b9 | ||
|
|
531f697b9a | ||
|
|
719ad7104d | ||
|
|
dcb0eb765f | ||
|
|
86b5191e8b | ||
|
|
b0714886bc | ||
|
|
438f70c730 | ||
|
|
608b150bf8 | ||
|
|
c0df7c6142 | ||
|
|
b2ea172a60 | ||
|
|
a2cef22ea8 |
@@ -1,31 +0,0 @@
|
||||
name: Build Deploy email notification tool
|
||||
run-name: ${{ gitea.actor }} building new version of the email notification tool
|
||||
on:
|
||||
push: # Baut bei jedem Push (Branches + Tags)
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
Apply-Kubernetes-Resources:
|
||||
runs-on: podman
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Login to Docker Registry
|
||||
run: podman login -u ${{ secrets.REGISTRY_USERNAME }} -p ${{ secrets.REGISTRY_TOKEN }} cr.ortlerstrasse.de
|
||||
|
||||
- name: Set Docker Image Tag
|
||||
run: |
|
||||
if [[ "${{ gitea.ref }}" == refs/tags/* ]]; then
|
||||
echo "TAG_NAME=${{ gitea.ref_name }}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "TAG_NAME=latest" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Build Docker image
|
||||
run: podman build -t cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }} .
|
||||
|
||||
- name: Push Docker image
|
||||
run: |
|
||||
podman push cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }}
|
||||
echo "Image pushed successfully: cr.ortlerstrasse.de/cgo/pretix:${{ env.TAG_NAME }}"
|
||||
+3
-3
@@ -76,7 +76,7 @@ dependencies = [
|
||||
"paypal-checkout-serversdk==1.0.*",
|
||||
"PyJWT==2.12.*",
|
||||
"phonenumberslite==9.0.*",
|
||||
"Pillow==12.1.*",
|
||||
"Pillow==12.2.*",
|
||||
"pretix-plugin-build",
|
||||
"protobuf==7.34.*",
|
||||
"psycopg2-binary",
|
||||
@@ -90,10 +90,10 @@ dependencies = [
|
||||
"pytz-deprecation-shim==0.1.*",
|
||||
"pyuca",
|
||||
"qrcode==8.2",
|
||||
"redis==7.1.*",
|
||||
"redis==7.4.*",
|
||||
"reportlab==4.4.*",
|
||||
"requests==2.32.*",
|
||||
"sentry-sdk==2.56.*",
|
||||
"sentry-sdk==2.57.*",
|
||||
"sepaxml==2.7.*",
|
||||
"stripe==7.9.*",
|
||||
"text-unidecode==1.*",
|
||||
|
||||
@@ -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.3.1"
|
||||
__version__ = "2026.4.0.dev0"
|
||||
|
||||
@@ -1122,7 +1122,7 @@ class CheckinViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
permission = 'event.orders:read'
|
||||
|
||||
def get_queryset(self):
|
||||
qs = Checkin.all.filter(list__event=self.request.event).select_related(
|
||||
qs = Checkin.all.filter().select_related(
|
||||
"position",
|
||||
"device",
|
||||
)
|
||||
|
||||
@@ -47,6 +47,7 @@ from django.utils.formats import localize
|
||||
from django.utils.translation import gettext, gettext_lazy as _
|
||||
|
||||
from pretix.base.models import Event
|
||||
from pretix.base.models.auth import PermissionHolder
|
||||
from pretix.helpers.safe_openpyxl import ( # NOQA: backwards compatibility for plugins using excel_safe
|
||||
SafeWorkbook, remove_invalid_excel_chars as excel_safe,
|
||||
)
|
||||
@@ -59,11 +60,20 @@ class BaseExporter:
|
||||
This is the base class for all data exporters
|
||||
"""
|
||||
|
||||
def __init__(self, event, organizer, progress_callback=lambda v: None):
|
||||
def __init__(self, event, organizer, permission_holder: PermissionHolder=None, progress_callback=lambda v: None):
|
||||
"""
|
||||
:param event: Event context, can also be a queryset of events for multi-event exports
|
||||
:param organizer: Organizer context
|
||||
:param user: The user who triggered the export (or None).
|
||||
:param token: The API token that triggered the export (or None).
|
||||
:param device: The device that triggered the export (or None)
|
||||
:param progress_callback: Callback function with progress
|
||||
"""
|
||||
self.event = event
|
||||
self.organizer = organizer
|
||||
self.progress_callback = progress_callback
|
||||
self.is_multievent = isinstance(event, QuerySet)
|
||||
self.permission_holder = permission_holder
|
||||
if isinstance(event, QuerySet):
|
||||
self.events = event
|
||||
self.event = None
|
||||
@@ -180,7 +190,7 @@ class BaseExporter:
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def get_required_event_permission(cls) -> str:
|
||||
def get_required_event_permission(cls) -> Optional[str]:
|
||||
"""
|
||||
The permission level required to use this exporter for events. For multi-event-exports, this will be used
|
||||
to limit the selection of events. Will be ignored if the ``OrganizerLevelExportMixin`` mixin is used.
|
||||
@@ -195,7 +205,7 @@ class OrganizerLevelExportMixin:
|
||||
raise TypeError("required_event_permission may not be called on OrganizerLevelExportMixin")
|
||||
|
||||
@classmethod
|
||||
def get_required_organizer_permission(cls) -> str:
|
||||
def get_required_organizer_permission(cls) -> Optional[str]:
|
||||
"""
|
||||
The permission level required to use this exporter. Must be set for organizer-level exports. Set to `None` to
|
||||
allow everyone with any access to the organizer.
|
||||
|
||||
@@ -28,6 +28,5 @@ from .items import * # noqa
|
||||
from .json import * # noqa
|
||||
from .mail import * # noqa
|
||||
from .orderlist import * # noqa
|
||||
from .relevant_orderlist import * # noqa
|
||||
from .reusablemedia import * # noqa
|
||||
from .waitinglist import * # noqa
|
||||
|
||||
@@ -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 = False
|
||||
featured = True
|
||||
repeatable_read = False
|
||||
|
||||
@cached_property
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -38,6 +38,7 @@ import operator
|
||||
import secrets
|
||||
from datetime import timedelta
|
||||
from functools import reduce
|
||||
from typing import Protocol
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import (
|
||||
@@ -67,6 +68,14 @@ class EmailAddressTakenError(IntegrityError):
|
||||
pass
|
||||
|
||||
|
||||
class PermissionHolder(Protocol):
|
||||
def has_event_permission(self, organizer, event, perm_name=None, request=None, session_key=None) -> bool:
|
||||
...
|
||||
|
||||
def has_organizer_permission(self, organizer, perm_name=None, request=None):
|
||||
...
|
||||
|
||||
|
||||
class UserManager(BaseUserManager):
|
||||
"""
|
||||
This is the user manager for our custom user model. See the User
|
||||
|
||||
@@ -229,7 +229,7 @@ class Device(LoggedModel):
|
||||
"""
|
||||
return self._organizer_permission_set() if self.organizer == organizer else set()
|
||||
|
||||
def has_event_permission(self, organizer, event, perm_name=None, request=None) -> bool:
|
||||
def has_event_permission(self, organizer, event, perm_name=None, request=None, session_key=None) -> bool:
|
||||
"""
|
||||
Checks if this token is part of a team that grants access of type ``perm_name``
|
||||
to the event ``event``.
|
||||
@@ -238,6 +238,7 @@ class Device(LoggedModel):
|
||||
:param event: The event to check
|
||||
:param perm_name: The permission, e.g. ``event.orders:read``
|
||||
:param request: This parameter is ignored and only defined for compatibility reasons.
|
||||
:param session_key: This parameter is ignored and only defined for compatibility reasons.
|
||||
:return: bool
|
||||
"""
|
||||
has_event_access = (self.all_events and organizer == self.organizer) or (
|
||||
|
||||
@@ -319,6 +319,9 @@ class TeamQuerySet(models.QuerySet):
|
||||
def event_permission_q(cls, perm_name):
|
||||
from ..permissions import assert_valid_event_permission
|
||||
|
||||
if perm_name is None:
|
||||
return Q()
|
||||
|
||||
if perm_name.startswith('can_') and perm_name in OLD_TO_NEW_EVENT_COMPAT: # legacy
|
||||
return reduce(operator.and_, [cls.event_permission_q(p) for p in OLD_TO_NEW_EVENT_COMPAT[perm_name]])
|
||||
assert_valid_event_permission(perm_name, allow_legacy=False)
|
||||
@@ -331,6 +334,9 @@ class TeamQuerySet(models.QuerySet):
|
||||
def organizer_permission_q(cls, perm_name):
|
||||
from ..permissions import assert_valid_organizer_permission
|
||||
|
||||
if perm_name is None:
|
||||
return Q()
|
||||
|
||||
if perm_name.startswith('can_') and perm_name in OLD_TO_NEW_ORGANIZER_COMPAT: # legacy
|
||||
return reduce(operator.and_, [cls.organizer_permission_q(p) for p in OLD_TO_NEW_ORGANIZER_COMPAT[perm_name]])
|
||||
assert_valid_organizer_permission(perm_name, allow_legacy=False)
|
||||
@@ -550,7 +556,7 @@ class TeamAPIToken(models.Model):
|
||||
"""
|
||||
return self.team.organizer_permission_set() if self.team.organizer == organizer else set()
|
||||
|
||||
def has_event_permission(self, organizer, event, perm_name=None, request=None) -> bool:
|
||||
def has_event_permission(self, organizer, event, perm_name=None, request=None, session_key=None) -> bool:
|
||||
"""
|
||||
Checks if this token is part of a team that grants access of type ``perm_name``
|
||||
to the event ``event``.
|
||||
@@ -559,6 +565,7 @@ class TeamAPIToken(models.Model):
|
||||
:param event: The event to check
|
||||
:param perm_name: The permission, e.g. ``event.orders:read``
|
||||
:param request: This parameter is ignored and only defined for compatibility reasons.
|
||||
:param session_key: This parameter is ignored and only defined for compatibility reasons.
|
||||
:return: bool
|
||||
"""
|
||||
has_event_access = (self.team.all_events and organizer == self.team.organizer) or (
|
||||
|
||||
+16
-5
@@ -54,7 +54,7 @@ from bidi import get_display
|
||||
from django.conf import settings
|
||||
from django.contrib.staticfiles import finders
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db.models import Max, Min
|
||||
from django.db.models import Exists, Max, Min, OuterRef
|
||||
from django.db.models.fields.files import FieldFile
|
||||
from django.dispatch import receiver
|
||||
from django.utils.deconstruct import deconstructible
|
||||
@@ -76,7 +76,7 @@ from reportlab.pdfgen.canvas import Canvas
|
||||
from reportlab.platypus import Paragraph
|
||||
|
||||
from pretix.base.i18n import language
|
||||
from pretix.base.models import Event, Order, OrderPosition, Question
|
||||
from pretix.base.models import Checkin, Event, Order, OrderPosition, Question
|
||||
from pretix.base.settings import PERSON_NAME_SCHEMES
|
||||
from pretix.base.signals import layout_image_variables, layout_text_variables
|
||||
from pretix.base.templatetags.money import money_filter
|
||||
@@ -379,6 +379,13 @@ DEFAULT_VARIABLES = OrderedDict((
|
||||
str(p) for p in generate_compressed_addon_list(op, order, ev)
|
||||
])
|
||||
}),
|
||||
("checked_in_addons", {
|
||||
"label": _("List of Checked-In Add-Ons"),
|
||||
"editor_sample": _("Add-on 1\n2x Add-on 2"),
|
||||
"evaluate": lambda op, order, ev: "\n".join([
|
||||
str(p) for p in generate_compressed_addon_list(op, order, ev, only_checked_in=True)
|
||||
])
|
||||
}),
|
||||
("organizer", {
|
||||
"label": _("Organizer name"),
|
||||
"editor_sample": _("Event organizer company"),
|
||||
@@ -750,12 +757,16 @@ def get_program_times(op: OrderPosition, ev: Event):
|
||||
])
|
||||
|
||||
|
||||
def generate_compressed_addon_list(op, order, event):
|
||||
def generate_compressed_addon_list(op, order, event, only_checked_in=False):
|
||||
itemcount = defaultdict(int)
|
||||
addons = [p for p in (
|
||||
addon_qs = (
|
||||
op.addons.all() if 'addons' in getattr(op, '_prefetched_objects_cache', {})
|
||||
else op.addons.select_related('item', 'variation')
|
||||
) if not p.canceled]
|
||||
)
|
||||
if only_checked_in:
|
||||
addon_qs = addon_qs.filter(Exists(Checkin.objects.filter(position=OuterRef('pk'))), canceled=False)
|
||||
addons = [p for p in addon_qs if not p.canceled]
|
||||
|
||||
for pos in addons:
|
||||
itemcount[pos.item, pos.variation] += 1
|
||||
|
||||
|
||||
@@ -211,7 +211,12 @@ def init_event_exporters(event, user=None, token=None, device=None, request=None
|
||||
if not perm_holder.has_event_permission(event.organizer, event, permission_name, request) and not staff_session:
|
||||
continue
|
||||
|
||||
exporter: BaseExporter = response(event=event, organizer=event.organizer, **kwargs)
|
||||
exporter: BaseExporter = response(
|
||||
event=event,
|
||||
organizer=event.organizer,
|
||||
permission_holder=token or device or user,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
if not exporter.available_for_user(user if user and user.is_authenticated else None):
|
||||
continue
|
||||
@@ -243,7 +248,12 @@ def init_organizer_exporters(
|
||||
continue
|
||||
|
||||
if issubclass(response, OrganizerLevelExportMixin):
|
||||
exporter: BaseExporter = response(event=Event.objects.none(), organizer=organizer, **kwargs)
|
||||
exporter: BaseExporter = response(
|
||||
event=Event.objects.none(),
|
||||
organizer=organizer,
|
||||
permission_holder=token or device or user,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
try:
|
||||
if not perm_holder.has_organizer_permission(organizer, response.get_required_organizer_permission(), request) and not staff_session:
|
||||
@@ -295,7 +305,12 @@ def init_organizer_exporters(
|
||||
if not _has_permission_on_any_team_cache[permission_name] and not staff_session:
|
||||
continue
|
||||
|
||||
exporter: BaseExporter = response(event=_event_list_cache[permission_name], organizer=organizer, **kwargs)
|
||||
exporter: BaseExporter = response(
|
||||
event=_event_list_cache[permission_name],
|
||||
organizer=organizer,
|
||||
permission_holder=token or device or user,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
if not exporter.available_for_user(user if user and user.is_authenticated else None):
|
||||
continue
|
||||
|
||||
@@ -67,9 +67,9 @@ from pretix.base.email import get_email_context
|
||||
from pretix.base.i18n import get_language_without_region, language
|
||||
from pretix.base.media import MEDIA_TYPES
|
||||
from pretix.base.models import (
|
||||
CartPosition, Device, Event, GiftCard, Item, ItemVariation, Membership,
|
||||
Order, OrderPayment, OrderPosition, Quota, Seat, SeatCategoryMapping, User,
|
||||
Voucher,
|
||||
CartPosition, Device, Event, GiftCard, Item, ItemVariation, LogEntry,
|
||||
Membership, Order, OrderPayment, OrderPosition, Quota, Seat,
|
||||
SeatCategoryMapping, User, Voucher,
|
||||
)
|
||||
from pretix.base.models.event import SubEvent
|
||||
from pretix.base.models.orders import (
|
||||
@@ -1618,7 +1618,7 @@ class OrderChangeManager:
|
||||
MembershipOperation = namedtuple('MembershipOperation', ('position', 'membership'))
|
||||
CancelOperation = namedtuple('CancelOperation', ('position', 'price_diff'))
|
||||
AddOperation = namedtuple('AddOperation', ('item', 'variation', 'price', 'addon_to', 'subevent', 'seat', 'membership',
|
||||
'valid_from', 'valid_until', 'is_bundled', 'result'))
|
||||
'valid_from', 'valid_until', 'is_bundled', 'result', 'count'))
|
||||
SplitOperation = namedtuple('SplitOperation', ('position',))
|
||||
FeeValueOperation = namedtuple('FeeValueOperation', ('fee', 'value', 'price_diff'))
|
||||
AddFeeOperation = namedtuple('AddFeeOperation', ('fee', 'price_diff'))
|
||||
@@ -1632,16 +1632,24 @@ class OrderChangeManager:
|
||||
ForceRecomputeOperation = namedtuple('ForceRecomputeOperation', tuple())
|
||||
|
||||
class AddPositionResult:
|
||||
_position: Optional[OrderPosition]
|
||||
_positions: Optional[List[OrderPosition]]
|
||||
|
||||
def __init__(self):
|
||||
self._position = None
|
||||
self._positions = None
|
||||
|
||||
@property
|
||||
def position(self) -> OrderPosition:
|
||||
if self._position is None:
|
||||
if self._positions is None:
|
||||
raise RuntimeError("Order position has not been created yet. Call commit() first on OrderChangeManager.")
|
||||
return self._position
|
||||
if len(self._positions) != 1:
|
||||
raise RuntimeError("More than one position created.")
|
||||
return self._positions[0]
|
||||
|
||||
@property
|
||||
def positions(self) -> List[OrderPosition]:
|
||||
if self._positions is None:
|
||||
raise RuntimeError("Order position has not been created yet. Call commit() first on OrderChangeManager.")
|
||||
return self._positions
|
||||
|
||||
def __init__(self, order: Order, user=None, auth=None, notify=True, reissue_invoice=True, allow_blocked_seats=False):
|
||||
self.order = order
|
||||
@@ -1848,8 +1856,12 @@ class OrderChangeManager:
|
||||
|
||||
def add_position(self, item: Item, variation: ItemVariation, price: Decimal, addon_to: OrderPosition = None,
|
||||
subevent: SubEvent = None, seat: Seat = None, membership: Membership = None,
|
||||
valid_from: datetime = None, valid_until: datetime = None) -> 'OrderChangeManager.AddPositionResult':
|
||||
valid_from: datetime = None, valid_until: datetime = None, count: int = 1) -> 'OrderChangeManager.AddPositionResult':
|
||||
if count < 1:
|
||||
raise ValueError("Count must be positive")
|
||||
if isinstance(seat, str):
|
||||
if count > 1:
|
||||
raise ValueError("Cannot combine count > 1 with seat")
|
||||
if not seat:
|
||||
seat = None
|
||||
else:
|
||||
@@ -1903,14 +1915,14 @@ class OrderChangeManager:
|
||||
if self.order.event.settings.invoice_include_free or price.gross != Decimal('0.00'):
|
||||
self._invoice_dirty = True
|
||||
|
||||
self._totaldiff_guesstimate += price.gross
|
||||
self._quotadiff.update(new_quotas)
|
||||
self._totaldiff_guesstimate += price.gross * count
|
||||
self._quotadiff.update({q: count for q in new_quotas})
|
||||
if seat:
|
||||
self._seatdiff.update([seat])
|
||||
|
||||
result = self.AddPositionResult()
|
||||
self._operations.append(self.AddOperation(item, variation, price, addon_to, subevent, seat, membership,
|
||||
valid_from, valid_until, is_bundled, result))
|
||||
valid_from, valid_until, is_bundled, result, count))
|
||||
return result
|
||||
|
||||
def split(self, position: OrderPosition):
|
||||
@@ -2530,29 +2542,35 @@ class OrderChangeManager:
|
||||
secret_dirty.remove(position)
|
||||
position.save(update_fields=['canceled', 'secret'])
|
||||
elif isinstance(op, self.AddOperation):
|
||||
pos = OrderPosition.objects.create(
|
||||
item=op.item, variation=op.variation, addon_to=op.addon_to,
|
||||
price=op.price.gross, order=self.order, tax_rate=op.price.rate, tax_code=op.price.code,
|
||||
tax_value=op.price.tax, tax_rule=op.item.tax_rule,
|
||||
positionid=nextposid, subevent=op.subevent, seat=op.seat,
|
||||
used_membership=op.membership, valid_from=op.valid_from, valid_until=op.valid_until,
|
||||
is_bundled=op.is_bundled,
|
||||
)
|
||||
nextposid += 1
|
||||
self.order.log_action('pretix.event.order.changed.add', user=self.user, auth=self.auth, data={
|
||||
'position': pos.pk,
|
||||
'item': op.item.pk,
|
||||
'variation': op.variation.pk if op.variation else None,
|
||||
'addon_to': op.addon_to.pk if op.addon_to else None,
|
||||
'price': op.price.gross,
|
||||
'positionid': pos.positionid,
|
||||
'membership': pos.used_membership_id,
|
||||
'subevent': op.subevent.pk if op.subevent else None,
|
||||
'seat': op.seat.pk if op.seat else None,
|
||||
'valid_from': op.valid_from.isoformat() if op.valid_from else None,
|
||||
'valid_until': op.valid_until.isoformat() if op.valid_until else None,
|
||||
})
|
||||
op.result._position = pos
|
||||
new_pos = []
|
||||
new_logs = []
|
||||
for i in range(op.count):
|
||||
pos = OrderPosition.objects.create(
|
||||
item=op.item, variation=op.variation, addon_to=op.addon_to,
|
||||
price=op.price.gross, order=self.order, tax_rate=op.price.rate, tax_code=op.price.code,
|
||||
tax_value=op.price.tax, tax_rule=op.item.tax_rule,
|
||||
positionid=nextposid, subevent=op.subevent, seat=op.seat,
|
||||
used_membership=op.membership, valid_from=op.valid_from, valid_until=op.valid_until,
|
||||
is_bundled=op.is_bundled,
|
||||
)
|
||||
nextposid += 1
|
||||
new_pos.append(pos)
|
||||
new_logs.append(self.order.log_action('pretix.event.order.changed.add', user=self.user, auth=self.auth, data={
|
||||
'position': pos.pk,
|
||||
'item': op.item.pk,
|
||||
'variation': op.variation.pk if op.variation else None,
|
||||
'addon_to': op.addon_to.pk if op.addon_to else None,
|
||||
'price': op.price.gross,
|
||||
'positionid': pos.positionid,
|
||||
'membership': pos.used_membership_id,
|
||||
'subevent': op.subevent.pk if op.subevent else None,
|
||||
'seat': op.seat.pk if op.seat else None,
|
||||
'valid_from': op.valid_from.isoformat() if op.valid_from else None,
|
||||
'valid_until': op.valid_until.isoformat() if op.valid_until else None,
|
||||
}, save=False))
|
||||
|
||||
op.result._positions = new_pos
|
||||
LogEntry.bulk_create_and_postprocess(new_logs)
|
||||
elif isinstance(op, self.SplitOperation):
|
||||
position = position_cache.setdefault(op.position.pk, op.position)
|
||||
split_positions.append(position)
|
||||
@@ -2877,7 +2895,7 @@ class OrderChangeManager:
|
||||
return total
|
||||
|
||||
def _check_order_size(self):
|
||||
if (len(self.order.positions.all()) + len([op for op in self._operations if isinstance(op, self.AddOperation)])) > settings.PRETIX_MAX_ORDER_SIZE:
|
||||
if (len(self.order.positions.all()) + sum([op.count for op in self._operations if isinstance(op, self.AddOperation)])) > settings.PRETIX_MAX_ORDER_SIZE:
|
||||
raise OrderError(
|
||||
self.error_messages['max_order_size'] % {
|
||||
'max': settings.PRETIX_MAX_ORDER_SIZE,
|
||||
@@ -2938,7 +2956,7 @@ class OrderChangeManager:
|
||||
]) + len([
|
||||
o for o in self._operations if isinstance(o, self.SplitOperation)
|
||||
])
|
||||
adds = len([o for o in self._operations if isinstance(o, self.AddOperation)])
|
||||
adds = sum([o.count for o in self._operations if isinstance(o, self.AddOperation)])
|
||||
if current > 0 and current - cancels + adds < 1:
|
||||
raise OrderError(self.error_messages['complete_cancel'])
|
||||
|
||||
@@ -2985,17 +3003,18 @@ class OrderChangeManager:
|
||||
elif isinstance(op, self.CancelOperation) and op.position in positions_to_fake_cart:
|
||||
fake_cart.remove(positions_to_fake_cart[op.position])
|
||||
elif isinstance(op, self.AddOperation):
|
||||
cp = CartPosition(
|
||||
event=self.event,
|
||||
item=op.item,
|
||||
variation=op.variation,
|
||||
used_membership=op.membership,
|
||||
subevent=op.subevent,
|
||||
seat=op.seat,
|
||||
)
|
||||
cp.override_valid_from = op.valid_from
|
||||
cp.override_valid_until = op.valid_until
|
||||
fake_cart.append(cp)
|
||||
for i in range(op.count):
|
||||
cp = CartPosition(
|
||||
event=self.event,
|
||||
item=op.item,
|
||||
variation=op.variation,
|
||||
used_membership=op.membership,
|
||||
subevent=op.subevent,
|
||||
seat=op.seat,
|
||||
)
|
||||
cp.override_valid_from = op.valid_from
|
||||
cp.override_valid_until = op.valid_until
|
||||
fake_cart.append(cp)
|
||||
try:
|
||||
validate_memberships_in_order(self.order.customer, fake_cart, self.event, lock=True, ignored_order=self.order, testmode=self.order.testmode)
|
||||
except ValidationError as e:
|
||||
|
||||
@@ -331,6 +331,10 @@ class OtherOperationsForm(forms.Form):
|
||||
|
||||
|
||||
class OrderPositionAddForm(forms.Form):
|
||||
count = forms.IntegerField(
|
||||
label=_('Number of products to add'),
|
||||
initial=1,
|
||||
)
|
||||
itemvar = forms.ChoiceField(
|
||||
label=_('Product')
|
||||
)
|
||||
@@ -432,6 +436,10 @@ class OrderPositionAddForm(forms.Form):
|
||||
d['used_membership'] = [m for m in self.memberships if str(m.pk) == d['used_membership']][0]
|
||||
else:
|
||||
d['used_membership'] = None
|
||||
if d.get("count", 1) and d.get("seat"):
|
||||
raise ValidationError({
|
||||
"seat": _("You can not choose a seat when adding multiple products at once.")
|
||||
})
|
||||
return d
|
||||
|
||||
|
||||
|
||||
@@ -329,6 +329,7 @@
|
||||
{{ add_form.custom_error }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% bootstrap_field add_form.count layout="control" %}
|
||||
{% bootstrap_field add_form.itemvar layout="control" %}
|
||||
{% bootstrap_field add_form.price addon_after=request.event.currency layout="control" %}
|
||||
{% if add_form.addon_to %}
|
||||
@@ -364,6 +365,7 @@
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="form-horizontal">
|
||||
{% bootstrap_field add_position_formset.empty_form.count layout="control" %}
|
||||
{% bootstrap_field add_position_formset.empty_form.itemvar layout="control" %}
|
||||
{% bootstrap_field add_position_formset.empty_form.price addon_after=request.event.currency layout="control" %}
|
||||
{% if add_position_formset.empty_form.addon_to %}
|
||||
|
||||
@@ -2059,12 +2059,13 @@ class OrderChange(OrderView):
|
||||
else:
|
||||
variation = None
|
||||
try:
|
||||
ocm.add_position(item, variation,
|
||||
f.cleaned_data['price'],
|
||||
f.cleaned_data.get('addon_to'),
|
||||
f.cleaned_data.get('subevent'),
|
||||
f.cleaned_data.get('seat'),
|
||||
f.cleaned_data.get('used_membership'))
|
||||
for i in range(f.cleaned_data.get("count", 1)):
|
||||
ocm.add_position(item, variation,
|
||||
f.cleaned_data['price'],
|
||||
f.cleaned_data.get('addon_to'),
|
||||
f.cleaned_data.get('subevent'),
|
||||
f.cleaned_data.get('seat'),
|
||||
f.cleaned_data.get('used_membership'))
|
||||
except OrderError as e:
|
||||
f.custom_error = str(e)
|
||||
return False
|
||||
|
||||
@@ -846,7 +846,7 @@ msgstr "Details der Bestellposition"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:129
|
||||
msgid "Attendee details"
|
||||
msgstr "Details Teilnehmer"
|
||||
msgstr "Details Teilnehmer*in"
|
||||
|
||||
#: 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"
|
||||
msgstr "Name Teilnehmer*in"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:187
|
||||
#: pretix/base/datasync/sourcefields.py:604
|
||||
#: pretix/base/datasync/sourcefields.py:628
|
||||
msgid "Attendee"
|
||||
msgstr "Teilnehmer"
|
||||
msgstr "Teilnehmer*in"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:207
|
||||
#: pretix/base/exporters/orderlist.py:647 pretix/base/forms/questions.py:693
|
||||
@@ -925,11 +925,11 @@ msgstr "Teilnehmer"
|
||||
#: 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"
|
||||
msgstr "E-Mail Teilnehmer*in"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:219
|
||||
msgid "Attendee or order email"
|
||||
msgstr "E-Mail Teilnehmer oder Bestellung"
|
||||
msgstr "E-Mail Teilnehmer*in 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 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-Firma"
|
||||
msgstr "Teilnehmer*innen-Firma"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:241
|
||||
msgid "Attendee address street"
|
||||
msgstr "Teilnehmer-Adresse: Straße"
|
||||
msgstr "Teilnehmer*innen-Adresse: Straße"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:250
|
||||
msgid "Attendee address ZIP code"
|
||||
msgstr "Teilnehmer-Adresse: PLZ"
|
||||
msgstr "Teilnehmer*innen-Adresse: PLZ"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:259
|
||||
msgid "Attendee address city"
|
||||
msgstr "Teilnehmer-Adresse: Stadt"
|
||||
msgstr "Teilnehmer*innen-Adresse: Stadt"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:268
|
||||
msgid "Attendee address country"
|
||||
msgstr "Teilnehmer-Adresse: Land"
|
||||
msgstr "Teilnehmer*innen-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 Kunden im Bestellprozess als "
|
||||
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
|
||||
"Antwort auf eine Frage hochgeladen wurden."
|
||||
|
||||
#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:628
|
||||
@@ -2191,10 +2191,6 @@ msgstr "Ohne gültige Mitgliedschaft verstecken"
|
||||
msgid "Order data"
|
||||
msgstr "Bestelldaten"
|
||||
|
||||
#: pretix/base/exporters/relevant_orderlist.py:86
|
||||
msgid "Order data (sorted by relevance)"
|
||||
msgstr "Bestelldaten (nach Relevanz sortiert)"
|
||||
|
||||
#: pretix/base/exporters/json.py:53
|
||||
msgid ""
|
||||
"Download a structured JSON representation of all orders. This might be "
|
||||
@@ -2212,8 +2208,8 @@ msgid ""
|
||||
"Download a text file with all email addresses collected either from buyers "
|
||||
"or from ticket holders."
|
||||
msgstr ""
|
||||
"Textdatei mit allen E-Mail-Adressen, die von Käufern und "
|
||||
"Ticketinhaber eingesammelt wurden."
|
||||
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
|
||||
"Ticketinhaber*innen eingesammelt wurden."
|
||||
|
||||
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:502
|
||||
#: pretix/plugins/reports/exporters.py:685
|
||||
@@ -2231,18 +2227,6 @@ msgstr ""
|
||||
"Bestellposition und das dritte eine Zeile für jede zusätzlich erhobene "
|
||||
"Gebühr."
|
||||
|
||||
#: pretix/base/exporters/relevant_orderlist.py:88
|
||||
msgid ""
|
||||
"Download a spreadsheet of all orders. The spreadsheet will include three "
|
||||
"sheets, one with a line for every order, one with a line for every order "
|
||||
"position, and one with a line for every additional fee charged in an "
|
||||
"order. The most relevant data is in the first columns of the tables."
|
||||
msgstr ""
|
||||
"Tabelle (Excel oder CSV) mit allen Bestellungen. Das erste Tabellenblatt "
|
||||
"enthält eine Zeile für jede Bestellung, das zweite eine Zeile für jede "
|
||||
"Bestellposition und das dritte eine Zeile für jede zusätzlich erhobene "
|
||||
"Gebühr. Die relevantesten Daten sind in den ersten Spalten der Tabellen."
|
||||
|
||||
#: pretix/base/exporters/orderlist.py:102 pretix/base/models/orders.py:336
|
||||
#: pretix/base/permissions.py:228 pretix/control/navigation.py:267
|
||||
#: pretix/control/navigation.py:387
|
||||
@@ -4196,7 +4180,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-E-Mail-Adresse"
|
||||
msgstr "Teilnehmer*innen-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
|
||||
@@ -4208,7 +4192,7 @@ msgstr "Teilnehmer-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-Adresse"
|
||||
msgstr "Teilnehmer*innen-Adresse"
|
||||
|
||||
#: pretix/base/modelimport_orders.py:445
|
||||
msgid "State"
|
||||
@@ -8071,7 +8055,7 @@ msgstr "Musterfirma GmbH"
|
||||
|
||||
#: pretix/base/pdf.py:193
|
||||
msgid "Full attendee address"
|
||||
msgstr "Volle Teilnehmer-Adresse"
|
||||
msgstr "Volle Teilnehmer*innen-Adresse"
|
||||
|
||||
#: pretix/base/pdf.py:194
|
||||
msgid ""
|
||||
@@ -8089,23 +8073,23 @@ msgstr ""
|
||||
|
||||
#: pretix/base/pdf.py:198
|
||||
msgid "Attendee street"
|
||||
msgstr "Teilnehmer-Straße"
|
||||
msgstr "Teilnehmer*innen-Straße"
|
||||
|
||||
#: pretix/base/pdf.py:203
|
||||
msgid "Attendee ZIP code"
|
||||
msgstr "Teilnehmer-PLZ"
|
||||
msgstr "Teilnehmer*innen-PLZ"
|
||||
|
||||
#: pretix/base/pdf.py:208
|
||||
msgid "Attendee city"
|
||||
msgstr "Teilnehmer-Stadt"
|
||||
msgstr "Teilnehmer*innen-Stadt"
|
||||
|
||||
#: pretix/base/pdf.py:213
|
||||
msgid "Attendee state"
|
||||
msgstr "Teilnehmer-Bundesstaat"
|
||||
msgstr "Teilnehmer*innen-Bundesstaat"
|
||||
|
||||
#: pretix/base/pdf.py:218
|
||||
msgid "Attendee country"
|
||||
msgstr "Teilnehmer-Land"
|
||||
msgstr "Teilnehmer*innen-Land"
|
||||
|
||||
#: pretix/base/pdf.py:230
|
||||
msgid "Pseudonymization ID (lead scanning)"
|
||||
@@ -8398,7 +8382,7 @@ msgstr "Herr Mustermann"
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:99
|
||||
#, python-brace-format
|
||||
msgid "Attendee name: {part}"
|
||||
msgstr "Teilnehmername: {part}"
|
||||
msgstr "Teilnehmer*innenname: {part}"
|
||||
|
||||
#: pretix/base/pdf.py:688
|
||||
msgid "Invoice address name for salutation"
|
||||
@@ -9302,7 +9286,7 @@ msgstr "Veranstaltungsort: {location}"
|
||||
#, python-brace-format
|
||||
msgctxt "invoice"
|
||||
msgid "Attendee: {name}"
|
||||
msgstr "Teilnehmer: {name}"
|
||||
msgstr "Teilnehmer*in: {name}"
|
||||
|
||||
#: pretix/base/services/invoices.py:279 pretix/plugins/reports/exporters.py:308
|
||||
#, python-brace-format
|
||||
@@ -10158,7 +10142,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:362
|
||||
msgid "Hide prices on attendee ticket page"
|
||||
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
|
||||
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
|
||||
|
||||
#: pretix/base/settings.py:363
|
||||
msgid ""
|
||||
@@ -10168,13 +10152,13 @@ msgid ""
|
||||
"price."
|
||||
msgstr ""
|
||||
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
|
||||
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
|
||||
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
|
||||
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
|
||||
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
|
||||
"Person, welche die Tickets kauft, sieht den Preis."
|
||||
|
||||
#: pretix/base/settings.py:381
|
||||
msgid "Ask for attendee names"
|
||||
msgstr "Namen der Teilnehmer erfragen"
|
||||
msgstr "Namen der Teilnehmer*innen erfragen"
|
||||
|
||||
#: pretix/base/settings.py:382
|
||||
msgid "Ask for a name for all personalized tickets."
|
||||
@@ -10183,11 +10167,11 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:391
|
||||
msgid "Require attendee names"
|
||||
msgstr "Namen der Teilnehmer erfordern"
|
||||
msgstr "Namen der Teilnehmer*innen erfordern"
|
||||
|
||||
#: pretix/base/settings.py:392
|
||||
msgid "Require customers to fill in the names of all attendees."
|
||||
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
|
||||
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
|
||||
|
||||
#: pretix/base/settings.py:402
|
||||
msgid "Ask for email addresses per ticket"
|
||||
@@ -10710,8 +10694,8 @@ msgid ""
|
||||
"but no indication of missing payment will be visible on the ticket pages of "
|
||||
"attendees who did not buy the ticket themselves."
|
||||
msgstr ""
|
||||
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
|
||||
"aber Teilnehmern, die ihr Ticket nicht selbst gekauft haben, werden "
|
||||
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
|
||||
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
|
||||
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
|
||||
|
||||
#: pretix/base/settings.py:1105
|
||||
@@ -11209,7 +11193,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:1748
|
||||
msgid "Show number of check-ins to customer"
|
||||
msgstr "Zeige Anzahl der Check-ins für Kunden an"
|
||||
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
|
||||
|
||||
#: pretix/base/settings.py:1749
|
||||
msgid ""
|
||||
@@ -11220,12 +11204,12 @@ msgid ""
|
||||
"failed scans will not be counted, and the user will not see the different "
|
||||
"check-in lists."
|
||||
msgstr ""
|
||||
"Wenn diese Option aktiv ist, können Kunden selbst sehen, wie oft sie die "
|
||||
"Wenn diese Option aktiv ist, können Kund*innen selbst sehen, wie oft sie die "
|
||||
"Veranstaltung betreten haben. Das ist normalerweise nicht nötig, aber kann "
|
||||
"nützlich sein, wenn es Tickets gibt, die eine bestimmte Anzahl an Eintritten "
|
||||
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
|
||||
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
|
||||
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
|
||||
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
|
||||
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
|
||||
|
||||
#: pretix/base/settings.py:1762
|
||||
msgid "Allow users to download tickets"
|
||||
@@ -11406,7 +11390,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:1925 pretix/base/settings.py:1934
|
||||
msgid "Both the attendee and the person who ordered can make changes"
|
||||
msgstr ""
|
||||
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
|
||||
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
|
||||
|
||||
#: pretix/base/settings.py:1929
|
||||
msgid "Allow customers to modify their information"
|
||||
@@ -11514,7 +11498,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:2035
|
||||
msgid "Allow individual attendees to change their ticket"
|
||||
msgstr "Erlaubt einzelnen Teilnehmern ihr Ticket zu ändern"
|
||||
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
|
||||
|
||||
#: pretix/base/settings.py:2036
|
||||
msgid ""
|
||||
@@ -11526,7 +11510,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Standardmäßig kann nur die Person, welche die Tickets gekauft hat, "
|
||||
"Änderungen an der Bestellung vornehmen. Wenn diese Option aktiv ist, können "
|
||||
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer können "
|
||||
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen können "
|
||||
"jedoch immer nur Änderungen vornehmen, welche die Gesamtkosten der "
|
||||
"Bestellung nicht verändern. Solche Änderungen können nur vom Ticketkäufer "
|
||||
"vorgenommen werden."
|
||||
@@ -11822,7 +11806,7 @@ msgid ""
|
||||
"people."
|
||||
msgstr ""
|
||||
"Sie können dieses Feld benutzen, um zusätzliche Informationen mit Ihren "
|
||||
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
|
||||
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
|
||||
"einer digitalen Veranstaltung. Wenn das Feld leer ist, fügen wir automatisch "
|
||||
"einen Link zum Ticketshop, die Einlass-Uhrzeit und den Veranstalter hier "
|
||||
"ein. Es sind keine Platzhalter mit sensiblen personenbezogenen Daten "
|
||||
@@ -12063,8 +12047,8 @@ msgstr ""
|
||||
"Diese Datei wird an die erste E-Mail angehängt, die wir beim Eingang einer "
|
||||
"neuen Bestellung verschicken. Sie kann daher mit den Textvorlagen "
|
||||
"\"Getätigte Bestellung\", \"Kostenlose Bestellung\" oder \"Erhaltene "
|
||||
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
|
||||
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
|
||||
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
|
||||
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
|
||||
"öffentlicher Informationen, da die Datei unabhängig davon verschickt wird, "
|
||||
"ob die Bestellung bezahlt oder freigegeben ist. Um zu vermeiden, dass diese "
|
||||
"wichtige E-Mail nicht ankommt, können nur PDF-Dateien mit maximal {size} MB "
|
||||
@@ -15402,7 +15386,7 @@ msgstr "Check-in-Status"
|
||||
#: pretix/control/forms/filter.py:2041
|
||||
#: pretix/plugins/checkinlists/exporters.py:108
|
||||
msgid "All attendees"
|
||||
msgstr "Alle Teilnehmer"
|
||||
msgstr "Alle Teilnehmer*innen"
|
||||
|
||||
#: pretix/control/forms/filter.py:2042
|
||||
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
|
||||
@@ -15986,7 +15970,7 @@ msgid ""
|
||||
"people over 65. This ticket includes access to all parts of the event, "
|
||||
"except the VIP area."
|
||||
msgstr ""
|
||||
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent, "
|
||||
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
|
||||
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
|
||||
"der Veranstaltung außer des VIP-Bereiches."
|
||||
|
||||
@@ -16300,7 +16284,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 "Kunde per E-Mail benachrichtigen"
|
||||
msgstr "Kund*in per E-Mail benachrichtigen"
|
||||
|
||||
#: pretix/control/forms/orders.py:174
|
||||
msgid "Keep a cancellation fee of"
|
||||
@@ -17831,7 +17815,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 einen Teilnehmer verschickt."
|
||||
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
|
||||
|
||||
#: pretix/control/logdisplay.py:555
|
||||
msgid ""
|
||||
@@ -19548,7 +19532,7 @@ msgstr "Terminal-ID"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
|
||||
msgid "Card holder"
|
||||
msgstr "Karteninhaber"
|
||||
msgstr "Karteninhaber*in"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
|
||||
msgid "Card expiration"
|
||||
@@ -19853,7 +19837,7 @@ msgstr "CSV"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
|
||||
msgid "No attendee record was found."
|
||||
msgstr "Keine passenden Teilnehmer gefunden."
|
||||
msgstr "Keine passenden Teilnehmer*innen gefunden."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
|
||||
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
|
||||
@@ -22675,7 +22659,7 @@ msgid ""
|
||||
"Only purchases of such products will be considered \"attendees\" for most "
|
||||
"statistical purposes or within some plugins."
|
||||
msgstr ""
|
||||
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
|
||||
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
|
||||
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/item/create.html:39
|
||||
@@ -22754,7 +22738,7 @@ msgid ""
|
||||
"The system will not ask for a name or other attendee details. This only "
|
||||
"affects system-provided fields, you can still add your own questions."
|
||||
msgstr ""
|
||||
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
|
||||
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
|
||||
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
|
||||
"können trotzdem hinzugefügt werden."
|
||||
|
||||
@@ -25027,7 +25011,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"
|
||||
msgstr "Empfohlen für neue Benutzer*innen"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/orders/export.html:120
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export.html:120
|
||||
@@ -26005,7 +25989,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 gedacht."
|
||||
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:321
|
||||
msgid ""
|
||||
@@ -28410,7 +28394,7 @@ msgid ""
|
||||
"customers. This way, customers will not be able to discover the waiting list."
|
||||
msgstr ""
|
||||
"Entsprechend Ihrer Veranstaltungseinstellungen werden ausverkaufte Produkte "
|
||||
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
|
||||
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
|
||||
"finden können."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:38
|
||||
@@ -28720,11 +28704,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
|
||||
|
||||
#: pretix/control/views/dashboards.py:115
|
||||
msgid "Attendees (ordered)"
|
||||
msgstr "Teilnehmer (bestellt)"
|
||||
msgstr "Teilnehmende (bestellt)"
|
||||
|
||||
#: pretix/control/views/dashboards.py:125
|
||||
msgid "Attendees (paid)"
|
||||
msgstr "Teilnehmer (bezahlt)"
|
||||
msgstr "Teilnehmende (bezahlt)"
|
||||
|
||||
#: pretix/control/views/dashboards.py:137
|
||||
#, python-brace-format
|
||||
@@ -30787,7 +30771,7 @@ msgstr "PDF-Sammlungen"
|
||||
|
||||
#: pretix/plugins/badges/exporters.py:423
|
||||
msgid "Download all attendee badges as one large PDF for printing."
|
||||
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
|
||||
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
|
||||
|
||||
#: pretix/plugins/badges/exporters.py:444
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:80
|
||||
@@ -31062,7 +31046,7 @@ msgstr "Anderes Bankkonto"
|
||||
|
||||
#: pretix/plugins/banktransfer/payment.py:85
|
||||
msgid "Name of account holder"
|
||||
msgstr "Kontoinhaber"
|
||||
msgstr "Kontoinhaber*in"
|
||||
|
||||
#: pretix/plugins/banktransfer/payment.py:87
|
||||
msgid ""
|
||||
@@ -31204,7 +31188,7 @@ msgstr "Bitte überweisen Sie den vollen Betrag auf das folgende Bankkonto:"
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
|
||||
msgid "Account holder"
|
||||
msgstr "Kontoinhaber"
|
||||
msgstr "Kontoinhaber*in"
|
||||
|
||||
#: pretix/plugins/banktransfer/payment.py:304
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
|
||||
@@ -31799,7 +31783,7 @@ msgid ""
|
||||
"Download a spreadsheet with all attendees that are included in a check-in "
|
||||
"list."
|
||||
msgstr ""
|
||||
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
|
||||
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
|
||||
"Liste zutrittsberechtigt sind."
|
||||
|
||||
#: pretix/plugins/checkinlists/exporters.py:501
|
||||
@@ -32978,7 +32962,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 verschickt."
|
||||
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:123
|
||||
msgid "Mass email was sent to waiting list entries."
|
||||
@@ -33010,7 +32994,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 verschickt."
|
||||
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:143
|
||||
msgid "An email rule was deleted"
|
||||
@@ -33043,7 +33027,7 @@ msgstr "Alle nicht eingecheckten Kunden"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
|
||||
msgid "Attendee contact addresses"
|
||||
msgstr "Teilnehmer-E-Mail-Adressen"
|
||||
msgstr "Teilnehmer*innen-E-Mail-Adressen"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
|
||||
msgid "All contact addresses"
|
||||
@@ -33202,14 +33186,14 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/views.py:250
|
||||
msgid "Orders or attendees"
|
||||
msgstr "Bestellungen oder Teilnehmer"
|
||||
msgstr "Bestellungen oder Teilnehmer*innen"
|
||||
|
||||
#: pretix/plugins/sendmail/views.py:251
|
||||
msgid ""
|
||||
"Send an email to every customer, or to every person a ticket has been "
|
||||
"purchased for, or a combination of both."
|
||||
msgstr ""
|
||||
"Senden Sie eine E-Mail an alle Ticketkäufer, alle Ticketinhaber "
|
||||
"Senden Sie eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen "
|
||||
"oder eine Kombination aus beiden Gruppen."
|
||||
|
||||
#: pretix/plugins/sendmail/views.py:417
|
||||
@@ -33791,23 +33775,23 @@ msgstr "SEPA-Lastschrift"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1277
|
||||
msgid "Account Holder Name"
|
||||
msgstr "Kontoinhaber"
|
||||
msgstr "Kontoinhaber*in"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1282
|
||||
msgid "Account Holder Street"
|
||||
msgstr "Straße (Kontoinhaber)"
|
||||
msgstr "Straße (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1294
|
||||
msgid "Account Holder Postal Code"
|
||||
msgstr "PLZ (Kontoinhaber)"
|
||||
msgstr "PLZ (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1306
|
||||
msgid "Account Holder City"
|
||||
msgstr "Stadt (Kontoinhaber)"
|
||||
msgstr "Stadt (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1318
|
||||
msgid "Account Holder Country"
|
||||
msgstr "Land (Kontoinhaber)"
|
||||
msgstr "Land (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1362
|
||||
msgid "Affirm via Stripe"
|
||||
@@ -35651,7 +35635,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 des Teilnehmenrs nicht angegeben"
|
||||
msgstr "Name der teilnehmenden Person nicht angegeben"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
|
||||
msgid "The image you previously uploaded"
|
||||
@@ -37413,12 +37397,12 @@ msgstr ""
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:11
|
||||
#: pretix/presale/views/customer.py:386
|
||||
msgid "Attendee profiles"
|
||||
msgstr "Teilnehmer-Profile"
|
||||
msgstr "Teilnehmer*innen-Profile"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
|
||||
msgid "You don’t have any attendee profiles in your account yet."
|
||||
msgstr ""
|
||||
"In Ihrem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
|
||||
"In Ihrem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
|
||||
msgid "Registration"
|
||||
@@ -39006,7 +38990,7 @@ msgstr "Kosovo"
|
||||
#~ "This plugin allows you to generate badges or name tags for your attendees."
|
||||
#~ msgstr ""
|
||||
#~ "Diese Erweiterung erlaubt, Namensschilder oder Badges für die "
|
||||
#~ "Teilnehmer zu erstellen."
|
||||
#~ "Teilnehmer*innen zu erstellen."
|
||||
|
||||
#~ msgid "This plugin allows you to receive payments via PayPal"
|
||||
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
|
||||
|
||||
@@ -848,7 +848,7 @@ msgstr "Details der Bestellposition"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:129
|
||||
msgid "Attendee details"
|
||||
msgstr "Details Teilnehmer"
|
||||
msgstr "Details Teilnehmer*in"
|
||||
|
||||
#: 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"
|
||||
msgstr "Name Teilnehmer*in"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:187
|
||||
#: pretix/base/datasync/sourcefields.py:604
|
||||
#: pretix/base/datasync/sourcefields.py:628
|
||||
msgid "Attendee"
|
||||
msgstr "Teilnehmer"
|
||||
msgstr "Teilnehmer*in"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:207
|
||||
#: pretix/base/exporters/orderlist.py:647 pretix/base/forms/questions.py:693
|
||||
@@ -927,11 +927,11 @@ msgstr "Teilnehmer"
|
||||
#: 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"
|
||||
msgstr "E-Mail Teilnehmer*in"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:219
|
||||
msgid "Attendee or order email"
|
||||
msgstr "E-Mail Teilnehmer oder Bestellung"
|
||||
msgstr "E-Mail Teilnehmer*in 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 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-Firma"
|
||||
msgstr "Teilnehmer*innen-Firma"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:241
|
||||
msgid "Attendee address street"
|
||||
msgstr "Teilnehmer-Adresse: Straße"
|
||||
msgstr "Teilnehmer*innen-Adresse: Straße"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:250
|
||||
msgid "Attendee address ZIP code"
|
||||
msgstr "Teilnehmer-Adresse: PLZ"
|
||||
msgstr "Teilnehmer*innen-Adresse: PLZ"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:259
|
||||
msgid "Attendee address city"
|
||||
msgstr "Teilnehmer-Adresse: Stadt"
|
||||
msgstr "Teilnehmer*innen-Adresse: Stadt"
|
||||
|
||||
#: pretix/base/datasync/sourcefields.py:268
|
||||
msgid "Attendee address country"
|
||||
msgstr "Teilnehmer-Adresse: Land"
|
||||
msgstr "Teilnehmer*innen-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 Kunden im Bestellprozess als "
|
||||
"ZIP-Datei mit allen Dateien, die von Kund*innen im Bestellprozess als "
|
||||
"Antwort auf eine Frage hochgeladen wurden."
|
||||
|
||||
#: pretix/base/exporters/answers.py:76 pretix/base/exporters/orderlist.py:628
|
||||
@@ -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 und "
|
||||
"Ticketinhaber eingesammelt wurden."
|
||||
"Textdatei mit allen E-Mail-Adressen, die von Käufer*innen und "
|
||||
"Ticketinhaber*innen eingesammelt wurden."
|
||||
|
||||
#: pretix/base/exporters/mail.py:76 pretix/plugins/reports/exporters.py:502
|
||||
#: pretix/plugins/reports/exporters.py:685
|
||||
@@ -4182,7 +4182,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-E-Mail-Adresse"
|
||||
msgstr "Teilnehmer*innen-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
|
||||
@@ -4194,7 +4194,7 @@ msgstr "Teilnehmer-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-Adresse"
|
||||
msgstr "Teilnehmer*innen-Adresse"
|
||||
|
||||
#: pretix/base/modelimport_orders.py:445
|
||||
msgid "State"
|
||||
@@ -8048,7 +8048,7 @@ msgstr "Musterfirma"
|
||||
|
||||
#: pretix/base/pdf.py:193
|
||||
msgid "Full attendee address"
|
||||
msgstr "Volle Teilnehmer-Adresse"
|
||||
msgstr "Volle Teilnehmer*innen-Adresse"
|
||||
|
||||
#: pretix/base/pdf.py:194
|
||||
msgid ""
|
||||
@@ -8066,23 +8066,23 @@ msgstr ""
|
||||
|
||||
#: pretix/base/pdf.py:198
|
||||
msgid "Attendee street"
|
||||
msgstr "Teilnehmer-Straße"
|
||||
msgstr "Teilnehmer*innen-Straße"
|
||||
|
||||
#: pretix/base/pdf.py:203
|
||||
msgid "Attendee ZIP code"
|
||||
msgstr "Teilnehmer-PLZ"
|
||||
msgstr "Teilnehmer*innen-PLZ"
|
||||
|
||||
#: pretix/base/pdf.py:208
|
||||
msgid "Attendee city"
|
||||
msgstr "Teilnehmer-Stadt"
|
||||
msgstr "Teilnehmer*innen-Stadt"
|
||||
|
||||
#: pretix/base/pdf.py:213
|
||||
msgid "Attendee state"
|
||||
msgstr "Teilnehmer-Bundesstaat"
|
||||
msgstr "Teilnehmer*innen-Bundesstaat"
|
||||
|
||||
#: pretix/base/pdf.py:218
|
||||
msgid "Attendee country"
|
||||
msgstr "Teilnehmer-Land"
|
||||
msgstr "Teilnehmer*innen-Land"
|
||||
|
||||
#: pretix/base/pdf.py:230
|
||||
msgid "Pseudonymization ID (lead scanning)"
|
||||
@@ -8375,7 +8375,7 @@ msgstr "Herr Mustermann"
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:99
|
||||
#, python-brace-format
|
||||
msgid "Attendee name: {part}"
|
||||
msgstr "Teilnehmer: {part}"
|
||||
msgstr "Teilnehmer*innenname: {part}"
|
||||
|
||||
#: pretix/base/pdf.py:688
|
||||
msgid "Invoice address name for salutation"
|
||||
@@ -9276,7 +9276,7 @@ msgstr "Veranstaltungsort: {location}"
|
||||
#, python-brace-format
|
||||
msgctxt "invoice"
|
||||
msgid "Attendee: {name}"
|
||||
msgstr "Teilnehmer: {name}"
|
||||
msgstr "Teilnehmer*in: {name}"
|
||||
|
||||
#: pretix/base/services/invoices.py:279 pretix/plugins/reports/exporters.py:308
|
||||
#, python-brace-format
|
||||
@@ -10130,7 +10130,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:362
|
||||
msgid "Hide prices on attendee ticket page"
|
||||
msgstr "Preise auf Teilnehmer-Ticket-Seite verstecken"
|
||||
msgstr "Preise auf Teilnehmer*innen-Ticket-Seite verstecken"
|
||||
|
||||
#: pretix/base/settings.py:363
|
||||
msgid ""
|
||||
@@ -10140,13 +10140,13 @@ msgid ""
|
||||
"price."
|
||||
msgstr ""
|
||||
"Wenn eine Person mehrere Tickets erwirbt und E-Mails an alle "
|
||||
"Teilnehmer verschickt werden, wird mit dieser Option der Ticketpreis "
|
||||
"auf der Ticket-Seite der einzelnen Teilnehmer versteckt. Nur die "
|
||||
"Teilnehmer*innen verschickt werden, wird mit dieser Option der Ticketpreis "
|
||||
"auf der Ticket-Seite der einzelnen Teilnehmer*innen versteckt. Nur die "
|
||||
"Person, welche die Tickets kauft, sieht den Preis."
|
||||
|
||||
#: pretix/base/settings.py:381
|
||||
msgid "Ask for attendee names"
|
||||
msgstr "Namen der Teilnehmer erfragen"
|
||||
msgstr "Namen der Teilnehmer*innen erfragen"
|
||||
|
||||
#: pretix/base/settings.py:382
|
||||
msgid "Ask for a name for all personalized tickets."
|
||||
@@ -10155,11 +10155,11 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:391
|
||||
msgid "Require attendee names"
|
||||
msgstr "Namen der Teilnehmer erfordern"
|
||||
msgstr "Namen der Teilnehmer*innen erfordern"
|
||||
|
||||
#: pretix/base/settings.py:392
|
||||
msgid "Require customers to fill in the names of all attendees."
|
||||
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
|
||||
msgstr "Erfordere die Eingabe aller Teilnehmer*innen-Namen."
|
||||
|
||||
#: pretix/base/settings.py:402
|
||||
msgid "Ask for email addresses per ticket"
|
||||
@@ -10181,7 +10181,7 @@ msgstr ""
|
||||
"aktivierst, fragt das System zusätzlich nach einzelnen E-Mail-Adressen für "
|
||||
"jedes personalisierte Ticket in der Bestellung. Dies könnte z.B. nützlich "
|
||||
"sein, wenn du auch im Falle von Gruppenbestellungen individuelle Adressen "
|
||||
"von jedem Teilnehmer benötigst. pretix sendet die Bestellbestätigung "
|
||||
"von jeder Teilnehmer*in benötigst. pretix sendet die Bestellbestätigung "
|
||||
"standardmäßig nach wie vor nur an die primäre Adresse, dies kann jedoch in "
|
||||
"den E-Mail-Einstellungen angepasst werden."
|
||||
|
||||
@@ -10681,8 +10681,8 @@ msgid ""
|
||||
"but no indication of missing payment will be visible on the ticket pages of "
|
||||
"attendees who did not buy the ticket themselves."
|
||||
msgstr ""
|
||||
"Die Box mit Zahlungsinstruktionen wird Ticketkäufern weiter angezeigt, "
|
||||
"aber Teilnehmer, die ihr Ticket nicht selbst gekauft haben, werden "
|
||||
"Die Box mit Zahlungsinstruktionen wird Ticketkäufer*innen weiter angezeigt, "
|
||||
"aber Teilnehmer*innen, die ihr Ticket nicht selbst gekauft haben, werden "
|
||||
"keine Anzeichen des fehlenden Zahlungseingangs sehen."
|
||||
|
||||
#: pretix/base/settings.py:1105
|
||||
@@ -11180,7 +11180,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:1748
|
||||
msgid "Show number of check-ins to customer"
|
||||
msgstr "Zeige Anzahl der Check-ins für Kunden an"
|
||||
msgstr "Zeige Anzahl der Check-ins für Kund*innen an"
|
||||
|
||||
#: pretix/base/settings.py:1749
|
||||
msgid ""
|
||||
@@ -11191,12 +11191,12 @@ msgid ""
|
||||
"failed scans will not be counted, and the user will not see the different "
|
||||
"check-in lists."
|
||||
msgstr ""
|
||||
"Wenn diese Option aktiv ist, können Kunden selbst sehen, wie oft sie die "
|
||||
"Wenn diese Option aktiv ist, können Kund*innen selbst sehen, wie oft sie die "
|
||||
"Veranstaltung betreten haben. Das ist normalerweise nicht nötig, aber kann "
|
||||
"nützlich sein, wenn es Tickets gibt, die eine bestimmte Anzahl an Eintritten "
|
||||
"erlauben, sodass Kunden die bisherige Nutzung des Tickets einsehen "
|
||||
"erlauben, sodass Kund*innen die bisherige Nutzung des Tickets einsehen "
|
||||
"können. Ausgänge oder fehlgeschlagene Scans werden nicht angezeigt und die "
|
||||
"Kunden sehen keine Aufschlüsselung verschiedener Check-in-Listen."
|
||||
"Kund*innen sehen keine Aufschlüsselung verschiedener Check-in-Listen."
|
||||
|
||||
#: pretix/base/settings.py:1762
|
||||
msgid "Allow users to download tickets"
|
||||
@@ -11377,7 +11377,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:1925 pretix/base/settings.py:1934
|
||||
msgid "Both the attendee and the person who ordered can make changes"
|
||||
msgstr ""
|
||||
"Sowohl Besteller als auch Teilnehmer können Änderungen vornehmen"
|
||||
"Sowohl Besteller*in als auch Teilnehmer*innen können Änderungen vornehmen"
|
||||
|
||||
#: pretix/base/settings.py:1929
|
||||
msgid "Allow customers to modify their information"
|
||||
@@ -11485,7 +11485,7 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py:2035
|
||||
msgid "Allow individual attendees to change their ticket"
|
||||
msgstr "Erlaubt einzelnen Teilnehmer ihr Ticket zu ändern"
|
||||
msgstr "Erlaubt einzelnen Teilnehmer*innen ihr Ticket zu ändern"
|
||||
|
||||
#: pretix/base/settings.py:2036
|
||||
msgid ""
|
||||
@@ -11497,7 +11497,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Standardmäßig kann nur die Person, welche die Tickets gekauft hat, "
|
||||
"Änderungen an der Bestellung vornehmen. Wenn diese Option aktiv ist, können "
|
||||
"auch einzelne Teilnehmer Änderungen vornehmen. Teilnehmer können "
|
||||
"auch einzelne Teilnehmer*innen Änderungen vornehmen. Teilnehmer*innen können "
|
||||
"jedoch immer nur Änderungen vornehmen, welche die Gesamtkosten der "
|
||||
"Bestellung nicht verändern. Solche Änderungen können nur vom Ticketkäufer "
|
||||
"vorgenommen werden."
|
||||
@@ -11681,7 +11681,7 @@ msgstr "Kontakt-E-Mail"
|
||||
#: pretix/base/settings.py:2271 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 Teilnehmern zu ermöglichen, "
|
||||
"Wir werden diese Adresse veröffentlichen um Teilnehmer*innen zu ermöglichen, "
|
||||
"dich zu kontaktieren."
|
||||
|
||||
#: pretix/base/settings.py:2279 pretix/control/forms/event.py:1892
|
||||
@@ -11793,7 +11793,7 @@ msgid ""
|
||||
"people."
|
||||
msgstr ""
|
||||
"Du kannst dieses Feld benutzen um zusätzliche Informationen mit deinen "
|
||||
"Teilnehmer zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
|
||||
"Teilnehmer*innen zu teilen, wie z.B. Anreise-Informationen oder den Link zu "
|
||||
"einer digitalen Veranstaltung. Wenn das Feld leer ist, fügen wir automatisch "
|
||||
"einen Link zum Ticketshop, die Einlass-Uhrzeit und den Veranstalter hier "
|
||||
"ein. Es sind keine Platzhalter mit sensiblen personenbezogenen Daten "
|
||||
@@ -12033,8 +12033,8 @@ msgstr ""
|
||||
"Diese Datei wird an die erste E-Mail angehängt, die wir beim Eingang einer "
|
||||
"neuen Bestellung verschicken. Sie kann daher mit den Textvorlagen "
|
||||
"\"Getätigte Bestellung\", \"Kostenlose Bestellung\" oder \"Erhaltene "
|
||||
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller als "
|
||||
"auch Teilnehmer verschickt. Nicht geeignet zum Versand nicht-"
|
||||
"Bestellung\" von oben auftreten. Sie wird ggf. sowohl an Besteller*innen als "
|
||||
"auch Teilnehmer*innen verschickt. Nicht geeignet zum Versand nicht-"
|
||||
"öffentlicher Informationen, da die Datei unabhängig davon verschickt wird, "
|
||||
"ob die Bestellung bezahlt oder freigegeben ist. Um zu vermeiden, dass diese "
|
||||
"wichtige E-Mail nicht ankommt, können nur PDF-Dateien mit maximal {size} MB "
|
||||
@@ -13297,7 +13297,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"You cannot require specifying attendee names if you do not ask for them."
|
||||
msgstr ""
|
||||
"Du kannst die Angabe von Teilnehmernamen nur erfordern, wenn auch nach "
|
||||
"Du kannst die Angabe von Teilnehmer*innennamen nur erfordern, wenn auch nach "
|
||||
"Namen gefragt wird."
|
||||
|
||||
#: pretix/base/settings.py:4127
|
||||
@@ -14962,11 +14962,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 werden ihre Tickets im PDF-Format herunterladen können."
|
||||
"Die Teilnehmer*innen werden ihre Tickets im PDF-Format herunterladen können."
|
||||
|
||||
#: pretix/control/forms/event.py:1886
|
||||
msgid "Require all attendees to fill in their names"
|
||||
msgstr "Erfordere, dass alle Teilnehmer ihre Namen ausfüllen"
|
||||
msgstr "Erfordere, dass alle Teilnehmer*innen ihre Namen ausfüllen"
|
||||
|
||||
#: pretix/control/forms/event.py:1887
|
||||
msgid ""
|
||||
@@ -15002,7 +15002,7 @@ msgid ""
|
||||
"then import your bank statements to process the payments within pretix, or "
|
||||
"mark them as paid manually."
|
||||
msgstr ""
|
||||
"Deine Teilnehmer werden angewiesen, das Geld direkt auf dein Bankkonto "
|
||||
"Deine Teilnehmer*innen werden angewiesen, das Geld direkt auf dein Bankkonto "
|
||||
"zu überweisen. Du kannst dann deinen Kontoauszug in pretix importieren, um "
|
||||
"Zahlungen zuzuweisen, oder die Bestellungen manuell als bezahlt markieren."
|
||||
|
||||
@@ -15363,7 +15363,7 @@ msgstr "Check-in-Status"
|
||||
#: pretix/control/forms/filter.py:2041
|
||||
#: pretix/plugins/checkinlists/exporters.py:108
|
||||
msgid "All attendees"
|
||||
msgstr "Alle Teilnehmer"
|
||||
msgstr "Alle Teilnehmer*innen"
|
||||
|
||||
#: pretix/control/forms/filter.py:2042
|
||||
#: pretix/control/templates/pretixcontrol/checkin/index.html:183
|
||||
@@ -15947,7 +15947,7 @@ msgid ""
|
||||
"people over 65. This ticket includes access to all parts of the event, "
|
||||
"except the VIP area."
|
||||
msgstr ""
|
||||
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudenten, "
|
||||
"z.B. Dieses reduzierte Ticket ist erhältlich für Vollzeitstudent*innen, "
|
||||
"Arbeitslose und Menschen über 65. Das Ticket enthält Zugang zu allen Teilen "
|
||||
"der Veranstaltung außer des VIP-Bereiches."
|
||||
|
||||
@@ -17792,7 +17792,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 verschickt."
|
||||
msgstr "Eine individuelle E-Mail wurde an eine Teilnehmer*in verschickt."
|
||||
|
||||
#: pretix/control/logdisplay.py:555
|
||||
msgid ""
|
||||
@@ -19508,7 +19508,7 @@ msgstr "Terminal-ID"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:104
|
||||
msgid "Card holder"
|
||||
msgstr "Karteninhaber"
|
||||
msgstr "Karteninhaber*in"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:108
|
||||
msgid "Card expiration"
|
||||
@@ -19813,7 +19813,7 @@ msgstr "CSV"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/index.html:73
|
||||
msgid "No attendee record was found."
|
||||
msgstr "Keine passenden Teilnehmer gefunden."
|
||||
msgstr "Keine passenden Teilnehmer*innen gefunden."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/index.html:91
|
||||
#: pretix/control/templates/pretixcontrol/datasync/failed_jobs.html:19
|
||||
@@ -21640,7 +21640,7 @@ msgid ""
|
||||
"provide ways for your attendees to contact you:"
|
||||
msgstr ""
|
||||
"Wenn irgendetwas schiefgeht oder unklar ist, empfehlen wir, dass du deinen "
|
||||
"Teilnehmer die Möglichkeit gibst, dich zu benachrichtigen:"
|
||||
"Teilnehmer*innen die Möglichkeit gibst, dich zu benachrichtigen:"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/settings.html:21
|
||||
msgid "Basics"
|
||||
@@ -22628,7 +22628,7 @@ msgid ""
|
||||
"Only purchases of such products will be considered \"attendees\" for most "
|
||||
"statistical purposes or within some plugins."
|
||||
msgstr ""
|
||||
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer\" gewertet, "
|
||||
"Nur Käufe eines solchen Produkts werden als \"Teilnehmer*innen\" gewertet, "
|
||||
"z.B. in Statistiken oder in Funktionen von Erweiterungen."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/item/create.html:39
|
||||
@@ -22707,7 +22707,7 @@ msgid ""
|
||||
"The system will not ask for a name or other attendee details. This only "
|
||||
"affects system-provided fields, you can still add your own questions."
|
||||
msgstr ""
|
||||
"Das System wird nicht nach einem Namen oder anderen Teilnehmer-Daten "
|
||||
"Das System wird nicht nach einem Namen oder anderen Teilnehmer*innen-Daten "
|
||||
"fragen. Dies betrifft nur vom System bereitgestellte Felder, eigene Fragen "
|
||||
"können trotzdem hinzugefügt werden."
|
||||
|
||||
@@ -23404,9 +23404,9 @@ msgid ""
|
||||
"ticket. If you provide food, one example might be to ask your users about "
|
||||
"dietary requirements."
|
||||
msgstr ""
|
||||
"Fragen erlauben deinen Besucher, zusätzliche Informationen zu ihrem "
|
||||
"Fragen erlauben deinen Besucher*innen, zusätzliche Informationen zu ihrem "
|
||||
"Ticket auszufüllen. Wenn deine Veranstaltung Verpflegung beinhaltet, "
|
||||
"könntest du z.B. nach Allergien deiner Teilnehmer fragen."
|
||||
"könntest du z.B. nach Allergien deiner Teilnehmer*innen fragen."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/items/questions.html:15
|
||||
msgid "Create a new question"
|
||||
@@ -23545,7 +23545,7 @@ msgstr ""
|
||||
"Um deine Produkte verfügbar zu machen, musst du Kontingente anlegen. "
|
||||
"Kontingente definieren, wie oft ein Produkt verkauft werden darf. Auf diese "
|
||||
"Art kannst du konfigurieren, ob deine Veranstaltung unbegrenzt viele "
|
||||
"Teilnehmer aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
|
||||
"Teilnehmer*innen aufnehmen kann oder ob die Anzahl begrenzt ist. Du kannst "
|
||||
"ein Produkt zu mehreren Kontingenten hinzufügen, um komplexere Anforderungen "
|
||||
"abzubilden, z.B. wenn du die Gesamtzahl der Tickets begrenzen willst, aber "
|
||||
"einen speziellen Ticket-Typ noch stärker begrenzen willst."
|
||||
@@ -24977,7 +24977,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"
|
||||
msgstr "Empfohlen für neue Benutzer*innen"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/orders/export.html:120
|
||||
#: pretix/control/templates/pretixcontrol/organizers/export.html:120
|
||||
@@ -25954,7 +25954,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 gedacht."
|
||||
msgstr "Dieser Dialog ist für fortgeschrittene Anwender*innen gedacht."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/organizers/edit.html:321
|
||||
msgid ""
|
||||
@@ -28354,7 +28354,7 @@ msgid ""
|
||||
"customers. This way, customers will not be able to discover the waiting list."
|
||||
msgstr ""
|
||||
"Entsprechend deiner Veranstaltungseinstellungen werden ausverkaufte Produkte "
|
||||
"nicht angezeigt. Dies führt dazu, dass Kunden die Warteliste nicht "
|
||||
"nicht angezeigt. Dies führt dazu, dass Kund*innen die Warteliste nicht "
|
||||
"finden können."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:38
|
||||
@@ -28663,11 +28663,11 @@ msgstr "Das ausgewählte List wurde gelöscht."
|
||||
|
||||
#: pretix/control/views/dashboards.py:115
|
||||
msgid "Attendees (ordered)"
|
||||
msgstr "Teilnehmer (bestellt)"
|
||||
msgstr "Teilnehmende (bestellt)"
|
||||
|
||||
#: pretix/control/views/dashboards.py:125
|
||||
msgid "Attendees (paid)"
|
||||
msgstr "Teilnehmer (bezahlt)"
|
||||
msgstr "Teilnehmende (bezahlt)"
|
||||
|
||||
#: pretix/control/views/dashboards.py:137
|
||||
#, python-brace-format
|
||||
@@ -30726,7 +30726,7 @@ msgstr "PDF-Sammlungen"
|
||||
|
||||
#: pretix/plugins/badges/exporters.py:423
|
||||
msgid "Download all attendee badges as one large PDF for printing."
|
||||
msgstr "Alle Teilnehmer-Badges in einer großen PDF-Datei für den Druck."
|
||||
msgstr "Alle Teilnehmer*innen-Badges in einer großen PDF-Datei für den Druck."
|
||||
|
||||
#: pretix/plugins/badges/exporters.py:444
|
||||
#: pretix/plugins/ticketoutputpdf/exporters.py:80
|
||||
@@ -31000,7 +31000,7 @@ msgstr "Anderes Bankkonto"
|
||||
|
||||
#: pretix/plugins/banktransfer/payment.py:85
|
||||
msgid "Name of account holder"
|
||||
msgstr "Kontoinhaber"
|
||||
msgstr "Kontoinhaber*in"
|
||||
|
||||
#: pretix/plugins/banktransfer/payment.py:87
|
||||
msgid ""
|
||||
@@ -31142,7 +31142,7 @@ msgstr "Bitte überweise den vollen Betrag auf das folgende Bankkonto:"
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:32
|
||||
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_confirm.html:35
|
||||
msgid "Account holder"
|
||||
msgstr "Kontoinhaber"
|
||||
msgstr "Kontoinhaber*in"
|
||||
|
||||
#: pretix/plugins/banktransfer/payment.py:304
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/checkout_payment_form.html:20
|
||||
@@ -31738,7 +31738,7 @@ msgid ""
|
||||
"Download a spreadsheet with all attendees that are included in a check-in "
|
||||
"list."
|
||||
msgstr ""
|
||||
"Tabelle (Excel oder CSV) mit allen Teilnehmer, die in einer Check-in-"
|
||||
"Tabelle (Excel oder CSV) mit allen Teilnehmer*innen, die in einer Check-in-"
|
||||
"Liste zutrittsberechtigt sind."
|
||||
|
||||
#: pretix/plugins/checkinlists/exporters.py:501
|
||||
@@ -32914,7 +32914,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 verschickt."
|
||||
msgstr "Rundmail wurde an Kunden oder Teilnehmer*innen verschickt."
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:123
|
||||
msgid "Mass email was sent to waiting list entries."
|
||||
@@ -32946,7 +32946,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 einen Teilnehmer verschickt."
|
||||
msgstr "Eine automatisierte E-Mail wurde an eine Teilnehmer*in verschickt."
|
||||
|
||||
#: pretix/plugins/sendmail/signals.py:143
|
||||
msgid "An email rule was deleted"
|
||||
@@ -32979,7 +32979,7 @@ msgstr "Alle nicht eingecheckten Kunden"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:23
|
||||
msgid "Attendee contact addresses"
|
||||
msgstr "Teilnehmer-E-Mail-Adressen"
|
||||
msgstr "Teilnehmer*innen-E-Mail-Adressen"
|
||||
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/history_fragment_orders.html:25
|
||||
msgid "All contact addresses"
|
||||
@@ -33139,14 +33139,14 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/sendmail/views.py:250
|
||||
msgid "Orders or attendees"
|
||||
msgstr "Bestellungen oder Teilnehmer"
|
||||
msgstr "Bestellungen oder Teilnehmer*innen"
|
||||
|
||||
#: pretix/plugins/sendmail/views.py:251
|
||||
msgid ""
|
||||
"Send an email to every customer, or to every person a ticket has been "
|
||||
"purchased for, or a combination of both."
|
||||
msgstr ""
|
||||
"Sende eine E-Mail an alle Ticketkäufer, alle Ticketinhaber oder "
|
||||
"Sende eine E-Mail an alle Ticketkäufer*innen, alle Ticketinhaber*innen oder "
|
||||
"eine Kombination aus beiden Gruppen."
|
||||
|
||||
#: pretix/plugins/sendmail/views.py:417
|
||||
@@ -33726,23 +33726,23 @@ msgstr "SEPA-Lastschrift"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1277
|
||||
msgid "Account Holder Name"
|
||||
msgstr "Kontoinhaber"
|
||||
msgstr "Kontoinhaber*in"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1282
|
||||
msgid "Account Holder Street"
|
||||
msgstr "Straße (Kontoinhaber)"
|
||||
msgstr "Straße (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1294
|
||||
msgid "Account Holder Postal Code"
|
||||
msgstr "PLZ (Kontoinhaber)"
|
||||
msgstr "PLZ (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1306
|
||||
msgid "Account Holder City"
|
||||
msgstr "Stadt (Kontoinhaber)"
|
||||
msgstr "Stadt (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1318
|
||||
msgid "Account Holder Country"
|
||||
msgstr "Land (Kontoinhaber)"
|
||||
msgstr "Land (Kontoinhaber*in)"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py:1362
|
||||
msgid "Affirm via Stripe"
|
||||
@@ -35579,7 +35579,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 des Teilnehmenrs nicht angegeben"
|
||||
msgstr "Name der teilnehmenden Person nicht angegeben"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:219
|
||||
msgid "The image you previously uploaded"
|
||||
@@ -37339,12 +37339,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-Adresse"
|
||||
msgstr "Teilnehmer*innen-Adresse"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_profiles.html:37
|
||||
msgid "You don’t have any attendee profiles in your account yet."
|
||||
msgstr ""
|
||||
"In deinem Kundenkonto sind noch keine Teilnehmer-Profile gespeichert."
|
||||
"In deinem Kundenkonto sind noch keine Teilnehmer*innen-Profile gespeichert."
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_registration.html:7
|
||||
msgid "Registration"
|
||||
@@ -38877,7 +38877,7 @@ msgstr "Kosovo"
|
||||
#~ "This plugin allows you to generate badges or name tags for your attendees."
|
||||
#~ msgstr ""
|
||||
#~ "Diese Erweiterung erlaubt, Namensschilder oder Badges für die "
|
||||
#~ "Teilnehmer zu erstellen."
|
||||
#~ "Teilnehmer*innen zu erstellen."
|
||||
|
||||
#~ msgid "This plugin allows you to receive payments via PayPal"
|
||||
#~ msgstr "Dieses Plugin erlaubt, Zahlungen über PayPal anzunehmen"
|
||||
@@ -39455,7 +39455,7 @@ msgstr "Kosovo"
|
||||
#~ msgstr "Biete Ticket-Download bereits vor Bezahlung einer Bestellung an"
|
||||
|
||||
#~ msgid "Attendee names"
|
||||
#~ msgstr "Teilnehmername"
|
||||
#~ msgstr "Teilnehmer*innennamen"
|
||||
|
||||
#~ msgid "Enable output"
|
||||
#~ msgstr "Aktivieren"
|
||||
@@ -39732,7 +39732,7 @@ msgstr "Kosovo"
|
||||
#~ "If checked, users can cancel orders by themselves as long as they are not "
|
||||
#~ "yet paid."
|
||||
#~ msgstr ""
|
||||
#~ "Wenn diese Option aktiviert ist, können Teilnehmer selbstständig "
|
||||
#~ "Wenn diese Option aktiviert ist, können Teilnehmer*innen selbstständig "
|
||||
#~ "Bestellungen stornieren solange sie nicht bezahlt wurden."
|
||||
|
||||
#~ msgid "Sales overview"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-03-30 11:22+0000\n"
|
||||
"PO-Revision-Date: 2026-03-18 12:23+0000\n"
|
||||
"PO-Revision-Date: 2026-03-31 17:00+0000\n"
|
||||
"Last-Translator: CVZ-es <damien.bremont@casadevelazquez.org>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"es/>\n"
|
||||
@@ -13331,7 +13331,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:4157
|
||||
#, python-brace-format
|
||||
msgid "VAT-ID is not supported for \"{}\"."
|
||||
msgstr ""
|
||||
msgstr "El NIF no es compatible con «{}»."
|
||||
|
||||
#: pretix/base/settings.py:4164
|
||||
msgid "The last payment date cannot be before the end of presale."
|
||||
@@ -27567,28 +27567,30 @@ msgid "Add a two-factor authentication device"
|
||||
msgstr "Añadir un dispositivo de autenticación de dos factores"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:19
|
||||
#, fuzzy
|
||||
#| msgid "Smartphone with the Authenticator application"
|
||||
msgid "Smartphone with Authenticator app"
|
||||
msgstr "Celular con aplicación de autenticación"
|
||||
msgstr "Smartphone con la aplicación Authenticator"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:21
|
||||
msgid ""
|
||||
"Use your smartphone with any Time-based One-Time-Password app like freeOTP, "
|
||||
"Google Authenticator or Proton Authenticator."
|
||||
msgstr ""
|
||||
"Use su smartphone con cualquier aplicación de contraseñas de un solo uso "
|
||||
"basadas en el tiempo, como freeOTP, Google Authenticator o Proton "
|
||||
"Authenticator."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:30
|
||||
#, fuzzy
|
||||
#| msgid "WebAuthn-compatible hardware token (e.g. Yubikey)"
|
||||
msgid "WebAuthn-compatible hardware token"
|
||||
msgstr "Hardware compatible con token WebAuthn (p. ej. Yubikey)"
|
||||
msgstr "Token físico compatible con WebAuthn"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:32
|
||||
msgid ""
|
||||
"Use a hardware token like the Yubikey, or other biometric authentication "
|
||||
"like fingerprint or face recognition."
|
||||
msgstr ""
|
||||
"Utiliza un dispositivo de seguridad físico, como el Yubikey, u otro método "
|
||||
"de autenticación biométrica, como el reconocimiento de huellas dactilares o "
|
||||
"facial."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:8
|
||||
msgid "To set up this device, please follow the following steps:"
|
||||
|
||||
@@ -4,10 +4,10 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-03-30 11:22+0000\n"
|
||||
"PO-Revision-Date: 2026-03-18 12:23+0000\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-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"
|
||||
@@ -13454,7 +13454,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:4157
|
||||
#, python-brace-format
|
||||
msgid "VAT-ID is not supported for \"{}\"."
|
||||
msgstr ""
|
||||
msgstr "Le numéro de TVA n'est pas pris en charge pour « {} »."
|
||||
|
||||
#: pretix/base/settings.py:4164
|
||||
msgid "The last payment date cannot be before the end of presale."
|
||||
@@ -27774,28 +27774,30 @@ msgid "Add a two-factor authentication device"
|
||||
msgstr "Ajouter un dispositif d'authentification à deux facteurs"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:19
|
||||
#, fuzzy
|
||||
#| msgid "Smartphone with the Authenticator application"
|
||||
msgid "Smartphone with Authenticator app"
|
||||
msgstr "Smartphone avec l'application Authenticator"
|
||||
msgstr "Smartphone équipé de l'application Authenticator"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:21
|
||||
msgid ""
|
||||
"Use your smartphone with any Time-based One-Time-Password app like freeOTP, "
|
||||
"Google Authenticator or Proton Authenticator."
|
||||
msgstr ""
|
||||
"Utilisez votre smartphone avec n'importe quelle application de mots de passe "
|
||||
"à usage unique générés en temps réel, comme freeOTP, Google Authenticator ou "
|
||||
"Proton Authenticator."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:30
|
||||
#, fuzzy
|
||||
#| msgid "WebAuthn-compatible hardware token (e.g. Yubikey)"
|
||||
msgid "WebAuthn-compatible hardware token"
|
||||
msgstr "Token matériel compatible WebAuthn (par ex. Yubikey)"
|
||||
msgstr "Token matériel compatible WebAuthn"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:32
|
||||
msgid ""
|
||||
"Use a hardware token like the Yubikey, or other biometric authentication "
|
||||
"like fingerprint or face recognition."
|
||||
msgstr ""
|
||||
"Utilisez une clé matérielle telle que la Yubikey, ou un autre moyen "
|
||||
"d'authentification biométrique, comme la reconnaissance d'empreintes "
|
||||
"digitales ou faciale."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:8
|
||||
msgid "To set up this device, please follow the following steps:"
|
||||
|
||||
@@ -7,10 +7,10 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-03-30 11:22+0000\n"
|
||||
"PO-Revision-Date: 2026-03-18 12:23+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"
|
||||
@@ -13283,7 +13283,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:4157
|
||||
#, python-brace-format
|
||||
msgid "VAT-ID is not supported for \"{}\"."
|
||||
msgstr ""
|
||||
msgstr "Btw-nummer wordt niet ondersteund voor \"{}\"."
|
||||
|
||||
#: pretix/base/settings.py:4164
|
||||
msgid "The last payment date cannot be before the end of presale."
|
||||
@@ -27461,28 +27461,28 @@ msgid "Add a two-factor authentication device"
|
||||
msgstr "Twee-factor-authenticatieapparaat toevoegen"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:19
|
||||
#, fuzzy
|
||||
#| msgid "Smartphone with the Authenticator application"
|
||||
msgid "Smartphone with Authenticator app"
|
||||
msgstr "Smartphone met de Authenticator-applicatie"
|
||||
msgstr "Smartphone met Authenticator-app"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:21
|
||||
msgid ""
|
||||
"Use your smartphone with any Time-based One-Time-Password app like freeOTP, "
|
||||
"Google Authenticator or Proton Authenticator."
|
||||
msgstr ""
|
||||
"Gebruik uw smartphone met een willekeurige app voor tijdgebonden eenmalige "
|
||||
"wachtwoorden, zoals freeOTP, Google Authenticator of Proton Authenticator."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:30
|
||||
#, fuzzy
|
||||
#| msgid "WebAuthn-compatible hardware token (e.g. Yubikey)"
|
||||
msgid "WebAuthn-compatible hardware token"
|
||||
msgstr "WebAuthn-compatibel hardware-token (bijvoorbeeld Yubikey)"
|
||||
msgstr "WebAuthn-compatibel hardwaretoken"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:32
|
||||
msgid ""
|
||||
"Use a hardware token like the Yubikey, or other biometric authentication "
|
||||
"like fingerprint or face recognition."
|
||||
msgstr ""
|
||||
"Gebruik een hardwaretoken zoals de Yubikey, of een andere vorm van "
|
||||
"biometrische authenticatie, zoals vingerafdruk- of gezichtsherkenning."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:8
|
||||
msgid "To set up this device, please follow the following steps:"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-03-30 11:22+0000\n"
|
||||
"PO-Revision-Date: 2026-03-18 14:50+0000\n"
|
||||
"PO-Revision-Date: 2026-03-31 17:00+0000\n"
|
||||
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
|
||||
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
|
||||
"pretix/nl_Informal/>\n"
|
||||
@@ -13314,7 +13314,7 @@ msgstr ""
|
||||
#: pretix/base/settings.py:4157
|
||||
#, python-brace-format
|
||||
msgid "VAT-ID is not supported for \"{}\"."
|
||||
msgstr ""
|
||||
msgstr "Btw-nummer wordt niet ondersteund voor \"{}\"."
|
||||
|
||||
#: pretix/base/settings.py:4164
|
||||
msgid "The last payment date cannot be before the end of presale."
|
||||
@@ -27518,28 +27518,28 @@ msgid "Add a two-factor authentication device"
|
||||
msgstr "Twee-factor-authenticatieapparaat toevoegen"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:19
|
||||
#, fuzzy
|
||||
#| msgid "Smartphone with the Authenticator application"
|
||||
msgid "Smartphone with Authenticator app"
|
||||
msgstr "Smartphone met de Authenticator-applicatie"
|
||||
msgstr "Smartphone met Authenticator-app"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:21
|
||||
msgid ""
|
||||
"Use your smartphone with any Time-based One-Time-Password app like freeOTP, "
|
||||
"Google Authenticator or Proton Authenticator."
|
||||
msgstr ""
|
||||
"Gebruik je smartphone met een willekeurige app voor tijdgebonden eenmalige "
|
||||
"wachtwoorden, zoals freeOTP, Google Authenticator of Proton Authenticator."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:30
|
||||
#, fuzzy
|
||||
#| msgid "WebAuthn-compatible hardware token (e.g. Yubikey)"
|
||||
msgid "WebAuthn-compatible hardware token"
|
||||
msgstr "WebAuthn-compatibel hardware-token (bijvoorbeeld Yubikey)"
|
||||
msgstr "WebAuthn-compatibel hardwaretoken"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_add.html:32
|
||||
msgid ""
|
||||
"Use a hardware token like the Yubikey, or other biometric authentication "
|
||||
"like fingerprint or face recognition."
|
||||
msgstr ""
|
||||
"Gebruik een hardwaretoken zoals de Yubikey, of een andere vorm van "
|
||||
"biometrische authenticatie, zoals vingerafdruk- of gezichtsherkenning."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:8
|
||||
msgid "To set up this device, please follow the following steps:"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-03-30 11:22+0000\n"
|
||||
"PO-Revision-Date: 2026-03-25 08:00+0000\n"
|
||||
"PO-Revision-Date: 2026-03-30 21:00+0000\n"
|
||||
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
|
||||
"pretix/pretix/pt_BR/>\n"
|
||||
@@ -19613,7 +19613,7 @@ msgstr "Excluir"
|
||||
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_form.html:91
|
||||
#: pretix/presale/templates/pretixpresale/fragment_event_list_filter.html:22
|
||||
msgid "Filter"
|
||||
msgstr "Filtro"
|
||||
msgstr "Filtrar"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:50
|
||||
msgid "Your search did not match any check-ins."
|
||||
@@ -28003,6 +28003,9 @@ msgid ""
|
||||
"According to your event settings, sold out products are hidden from "
|
||||
"customers. This way, customers will not be able to discover the waiting list."
|
||||
msgstr ""
|
||||
"De acordo com as configurações do seu evento, os produtos esgotados ficam "
|
||||
"ocultos para os clientes. Dessa forma, os clientes não poderão descobrir a "
|
||||
"lista de espera."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:38
|
||||
msgid "Send vouchers"
|
||||
@@ -28049,6 +28052,9 @@ msgid ""
|
||||
"waiting list in, you could sell tickets worth an additional "
|
||||
"<strong>%(amount)s</strong>."
|
||||
msgstr ""
|
||||
"Se você conseguir criar espaço suficiente em seu evento para acomodar todas "
|
||||
"as pessoas na lista de espera, poderá vender ingressos no valor de um "
|
||||
"adicional de <strong>%(amount)s</strong>."
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/waitinglist/index.html:115
|
||||
msgid "Successfully redeemed"
|
||||
|
||||
@@ -296,7 +296,8 @@ class SetPasswordForm(forms.Form):
|
||||
}
|
||||
email = forms.EmailField(
|
||||
label=_('Email'),
|
||||
disabled=True
|
||||
widget=forms.EmailInput(attrs={'autocomplete': 'username', 'readonly': 'readonly'}),
|
||||
required=False,
|
||||
)
|
||||
password = forms.CharField(
|
||||
label=_('Password'),
|
||||
|
||||
@@ -70,18 +70,21 @@ def cached_invoice_address(request):
|
||||
# do not create a session, if we don't have a session we also don't have an invoice address ;)
|
||||
request._checkout_flow_invoice_address = InvoiceAddress()
|
||||
return request._checkout_flow_invoice_address
|
||||
cs = cart_session(request)
|
||||
iapk = cs.get('invoice_address')
|
||||
if not iapk:
|
||||
cs = cart_session(request, create=False)
|
||||
if cs is None:
|
||||
request._checkout_flow_invoice_address = InvoiceAddress()
|
||||
else:
|
||||
try:
|
||||
with scopes_disabled():
|
||||
request._checkout_flow_invoice_address = InvoiceAddress.objects.get(
|
||||
pk=iapk, order__isnull=True
|
||||
)
|
||||
except InvoiceAddress.DoesNotExist:
|
||||
iapk = cs.get('invoice_address')
|
||||
if not iapk:
|
||||
request._checkout_flow_invoice_address = InvoiceAddress()
|
||||
else:
|
||||
try:
|
||||
with scopes_disabled():
|
||||
request._checkout_flow_invoice_address = InvoiceAddress.objects.get(
|
||||
pk=iapk, order__isnull=True
|
||||
)
|
||||
except InvoiceAddress.DoesNotExist:
|
||||
request._checkout_flow_invoice_address = InvoiceAddress()
|
||||
return request._checkout_flow_invoice_address
|
||||
|
||||
|
||||
@@ -111,6 +114,12 @@ class CartMixin:
|
||||
return cached_invoice_address(self.request)
|
||||
|
||||
def get_cart(self, answers=False, queryset=None, order=None, downloads=False, payments=None):
|
||||
if not self.request.session.session_key and not order:
|
||||
# The user has not even a session ID yet, so they can't have a cart and we can save a lot of work
|
||||
return {
|
||||
'positions': [],
|
||||
# Other keys are not used on non-checkout pages
|
||||
}
|
||||
if queryset is not None:
|
||||
prefetch = []
|
||||
if answers:
|
||||
@@ -166,7 +175,8 @@ class CartMixin:
|
||||
else:
|
||||
fees = []
|
||||
|
||||
if not order:
|
||||
if not order and lcp:
|
||||
# Do not re-round for empty cart (useless) or confirmed order (incorrect)
|
||||
apply_rounding(self.request.event.settings.tax_rounding, self.invoice_address, self.request.event.currency, [*lcp, *fees])
|
||||
|
||||
total = sum([c.price for c in lcp]) + sum([f.value for f in fees])
|
||||
@@ -277,6 +287,12 @@ class CartMixin:
|
||||
}
|
||||
|
||||
def current_selected_payments(self, positions, fees, invoice_address, *, warn=False):
|
||||
from pretix.presale.views.cart import get_or_create_cart_id
|
||||
|
||||
if not get_or_create_cart_id(self.request, create=False):
|
||||
# No active cart ID, no payments there
|
||||
return []
|
||||
|
||||
raw_payments = copy.deepcopy(self.cart_session.get('payments', []))
|
||||
fees = [f for f in fees if f.fee_type != OrderFee.FEE_TYPE_PAYMENT] # we re-compute these here
|
||||
|
||||
|
||||
@@ -417,7 +417,7 @@ def get_or_create_cart_id(request, create=True):
|
||||
return new_id
|
||||
|
||||
|
||||
def cart_session(request):
|
||||
def cart_session(request, create=True):
|
||||
"""
|
||||
Before pretix 1.8.0, all checkout-related information (like the entered email address) was stored
|
||||
in the user's regular session dictionary. This led to data interference and leaks for example if a
|
||||
@@ -428,7 +428,9 @@ def cart_session(request):
|
||||
active cart session sub-dictionary for read and write access.
|
||||
"""
|
||||
request.session.modified = True
|
||||
cart_id = get_or_create_cart_id(request)
|
||||
cart_id = get_or_create_cart_id(request, create=create)
|
||||
if not cart_id and not create:
|
||||
return None
|
||||
return request.session['carts'][cart_id]
|
||||
|
||||
|
||||
|
||||
+16
-1
@@ -157,7 +157,7 @@ DATABASES = {
|
||||
'HOST': config.get('database', 'host', fallback=''),
|
||||
'PORT': config.get('database', 'port', fallback=''),
|
||||
'CONN_MAX_AGE': 0 if db_backend == 'sqlite3' else 120,
|
||||
'CONN_HEALTH_CHECKS': db_backend != 'sqlite3', # Will only be used from Django 4.1 onwards
|
||||
'CONN_HEALTH_CHECKS': db_backend != 'sqlite3',
|
||||
'DISABLE_SERVER_SIDE_CURSORS': db_disable_server_side_cursors,
|
||||
'OPTIONS': db_options,
|
||||
'TEST': {}
|
||||
@@ -179,6 +179,21 @@ if config.has_section('replica'):
|
||||
}
|
||||
DATABASE_ROUTERS = ['pretix.helpers.database.ReplicaRouter']
|
||||
|
||||
if config.has_section('dbreadonly'):
|
||||
DATABASES['readonly'] = {
|
||||
'ENGINE': 'django.db.backends.' + db_backend,
|
||||
'NAME': config.get('dbreadonly', 'name', fallback=DATABASES['default']['NAME']),
|
||||
'USER': config.get('dbreadonly', 'user', fallback=DATABASES['default']['USER']),
|
||||
'PASSWORD': config.get('dbreadonly', 'password', fallback=DATABASES['default']['PASSWORD']),
|
||||
'HOST': config.get('dbreadonly', 'host', fallback=DATABASES['default']['HOST']),
|
||||
'PORT': config.get('dbreadonly', 'port', fallback=DATABASES['default']['PORT']),
|
||||
'CONN_MAX_AGE': 0, # do not spam primary with open connections as long as readonly is only used occasionally
|
||||
'CONN_HEALTH_CHECKS': db_backend != 'sqlite3',
|
||||
'DISABLE_SERVER_SIDE_CURSORS': db_disable_server_side_cursors,
|
||||
'OPTIONS': db_options,
|
||||
'TEST': {}
|
||||
}
|
||||
|
||||
STATIC_URL = config.get('urls', 'static', fallback='/static/')
|
||||
|
||||
MEDIA_URL = config.get('urls', 'media', fallback='/media/')
|
||||
|
||||
@@ -2053,7 +2053,7 @@ def test_pdf_data(token_client, organizer, event, order, django_assert_max_num_q
|
||||
assert not resp.data['positions'][0].get('pdf_data')
|
||||
|
||||
# order list
|
||||
with django_assert_max_num_queries(33):
|
||||
with django_assert_max_num_queries(34):
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/orders/?pdf_data=true'.format(
|
||||
organizer.slug, event.slug
|
||||
))
|
||||
@@ -2068,7 +2068,7 @@ def test_pdf_data(token_client, organizer, event, order, django_assert_max_num_q
|
||||
assert not resp.data['results'][0]['positions'][0].get('pdf_data')
|
||||
|
||||
# position list
|
||||
with django_assert_max_num_queries(35):
|
||||
with django_assert_max_num_queries(36):
|
||||
resp = token_client.get('/api/v1/organizers/{}/events/{}/orderpositions/?pdf_data=true'.format(
|
||||
organizer.slug, event.slug
|
||||
))
|
||||
|
||||
@@ -2406,6 +2406,15 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.ocm.commit()
|
||||
assert self.order.positions.count() == 2
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_quota_partial(self):
|
||||
q1 = self.event.quotas.create(name='Test', size=1)
|
||||
q1.items.add(self.shirt)
|
||||
self.ocm.add_position(self.shirt, None, None, None, count=2)
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.commit()
|
||||
assert self.order.positions.count() == 2
|
||||
|
||||
@classscope(attr='o')
|
||||
def test_add_item_addon(self):
|
||||
self.shirt.category = self.event.categories.create(name='Add-ons', is_addon=True)
|
||||
|
||||
@@ -1584,10 +1584,11 @@ class OrderChangeTests(SoupTest):
|
||||
'add_position-MAX_NUM_FORMS': '100',
|
||||
'add_position-0-itemvar': str(self.shirt.pk),
|
||||
'add_position-0-do': 'on',
|
||||
'add_position-0-count': '2',
|
||||
'add_position-0-price': '14.00',
|
||||
})
|
||||
with scopes_disabled():
|
||||
assert self.order.positions.count() == 3
|
||||
assert self.order.positions.count() == 4
|
||||
assert self.order.positions.last().item == self.shirt
|
||||
assert self.order.positions.last().price == 14
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
import datetime
|
||||
import re
|
||||
from decimal import Decimal
|
||||
from importlib import import_module
|
||||
from json import loads
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
@@ -80,6 +81,34 @@ class EventMiddlewareTest(EventTestMixin, SoupTest):
|
||||
doc = self.get_doc('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertIn(str(self.event.name), doc.find("h1").text)
|
||||
|
||||
def test_no_session_cookie_set_on_event_index_view(self):
|
||||
resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert settings.SESSION_COOKIE_NAME not in self.client.cookies
|
||||
|
||||
def test_no_cart_session_added_on_event_index_view(self):
|
||||
# Make sure a session is present by doing a cart op on another event
|
||||
event2 = Event.objects.create(
|
||||
organizer=self.orga, name='30C3b', slug='30c3b',
|
||||
date_from=datetime.datetime(now().year + 1, 12, 26, 14, 0, tzinfo=datetime.timezone.utc),
|
||||
live=True,
|
||||
)
|
||||
self.client.post('/%s/%s/cart/add' % (self.orga.slug, event2.slug), {
|
||||
'item_%d' % 1337: '1', # item does not need to exist
|
||||
'ajax': 1
|
||||
})
|
||||
assert settings.SESSION_COOKIE_NAME in self.client.cookies
|
||||
|
||||
# Visit shop, make sure no session is created
|
||||
resp = self.client.get('/%s/%s/' % (self.orga.slug, self.event.slug))
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
|
||||
session = SessionStore(self.client.cookies[settings.SESSION_COOKIE_NAME].value).load()
|
||||
assert set(session.keys()) == {
|
||||
f"current_cart_event_{event2.pk}", "carts"
|
||||
}
|
||||
|
||||
def test_not_found(self):
|
||||
resp = self.client.get('/%s/%s/' % ('foo', 'bar'))
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
|
||||
Reference in New Issue
Block a user