mirror of
https://github.com/pretix/pretix.git
synced 2026-08-07 10:17:49 +00:00
Compare commits
25
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81f58456e5 | ||
|
|
4d9dfa88fe | ||
|
|
ea792e76b2 | ||
|
|
5c448279f0 | ||
|
|
e3fa1aed7f | ||
|
|
b164cf44c0 | ||
|
|
7bc79337c3 | ||
|
|
5d8ba189fa | ||
|
|
1ea1c1789c | ||
|
|
1a6edae769 | ||
|
|
c4950e714d | ||
|
|
407728cc55 | ||
|
|
9fe25544c1 | ||
|
|
8133061fe1 | ||
|
|
288ac50600 | ||
|
|
e7657a3dd3 | ||
|
|
b659534772 | ||
|
|
c11ebb1391 | ||
|
|
b20557a996 | ||
|
|
e4a0bba3bc | ||
|
|
c369ba5f60 | ||
|
|
2c876057bf | ||
|
|
b70c1b02c2 | ||
|
|
01d736361d | ||
|
|
7627e4b548 |
@@ -2038,7 +2038,7 @@ Manipulating individual positions
|
||||
|
||||
* ``order`` (mandatory, specified as a string mapping to a ``code``)
|
||||
|
||||
* ``addon_to`` (optional, specified as an integer mapping to the ``positionid`` of the parent position)
|
||||
* ``addon_to`` (optional, specified as an integer mapping to ``positionid`` - the number of the position within the order, see :ref:`_order-position-resource` - of the parent position)
|
||||
|
||||
* ``item`` (mandatory)
|
||||
|
||||
@@ -2348,7 +2348,7 @@ otherwise, such as splitting an order or changing fees.
|
||||
"subevent": 562,
|
||||
"seat": "seat-guid-2",
|
||||
"price": "99.99",
|
||||
"addon_to": 12374,
|
||||
"addon_to": 1,
|
||||
"attendee_name": "Peter",
|
||||
}
|
||||
],
|
||||
|
||||
+4
-4
@@ -33,12 +33,12 @@ dependencies = [
|
||||
"bleach==6.4.*",
|
||||
"celery==5.6.*",
|
||||
"chardet==5.2.*",
|
||||
"cryptography>=49.0.0",
|
||||
"cryptography>=50.0.0",
|
||||
"css-inline==0.21.*",
|
||||
"defusedcsv>=3.0.0",
|
||||
"dnspython==2.*",
|
||||
"Django[argon2]==5.2.*",
|
||||
"django-bootstrap3==26.1",
|
||||
"django-bootstrap3==26.2",
|
||||
"django-compressor==4.6.0",
|
||||
"django-countries==9.0.*",
|
||||
"django-filter==26.1",
|
||||
@@ -48,7 +48,7 @@ dependencies = [
|
||||
"django-hijack==3.7.*",
|
||||
"django-i18nfield==1.11.*",
|
||||
"django-libsass==0.9",
|
||||
"django-localflavor==5.0",
|
||||
"django-localflavor==5.1",
|
||||
"django-markup",
|
||||
"django-oauth-toolkit==2.3.*",
|
||||
"django-otp==1.7.*",
|
||||
@@ -67,7 +67,7 @@ dependencies = [
|
||||
"kombu==5.6.*",
|
||||
"libsass==0.23.*",
|
||||
"lxml",
|
||||
"markdown==3.10.2", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
|
||||
"markdown==3.10.3", # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3.
|
||||
# We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7
|
||||
"mt-940==4.30.*",
|
||||
"oauthlib==3.3.*",
|
||||
|
||||
@@ -104,6 +104,7 @@ ALL_LANGUAGES = [
|
||||
('gl', _('Galician')),
|
||||
('el', _('Greek')),
|
||||
('he', _('Hebrew')),
|
||||
('hu', _('Hungarian')),
|
||||
('id', _('Indonesian')),
|
||||
('it', _('Italian')),
|
||||
('ja', _('Japanese')),
|
||||
|
||||
@@ -20,8 +20,11 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import logging
|
||||
from datetime import timedelta
|
||||
|
||||
from django.contrib.auth.models import AnonymousUser
|
||||
from django.db import DatabaseError
|
||||
from django.utils.timezone import now
|
||||
from django_scopes import scopes_disabled
|
||||
from rest_framework import exceptions
|
||||
from rest_framework.authentication import TokenAuthentication
|
||||
@@ -30,6 +33,7 @@ from pretix.api.auth.devicesecurity import (
|
||||
FullAccessSecurityProfile, get_all_security_profiles,
|
||||
)
|
||||
from pretix.base.models import Device
|
||||
from pretix.base.models.devices import DeviceLastSeen
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -42,7 +46,7 @@ class DeviceTokenAuthentication(TokenAuthentication):
|
||||
model = self.get_model()
|
||||
try:
|
||||
with scopes_disabled():
|
||||
device = model.objects.select_related('organizer').get(api_token=key)
|
||||
device = model.objects.select_related('organizer', 'last_seen').get(api_token=key)
|
||||
except model.DoesNotExist:
|
||||
raise exceptions.AuthenticationFailed('Invalid token.')
|
||||
|
||||
@@ -53,6 +57,7 @@ class DeviceTokenAuthentication(TokenAuthentication):
|
||||
logging.warning(f'Connection attempt of revoked device {device.pk}.')
|
||||
raise exceptions.AuthenticationFailed('Device access has been revoked.')
|
||||
|
||||
self._update_last_seen(device)
|
||||
return AnonymousUser(), device
|
||||
|
||||
def authenticate(self, request):
|
||||
@@ -63,3 +68,22 @@ class DeviceTokenAuthentication(TokenAuthentication):
|
||||
if not profile.is_allowed(request):
|
||||
raise exceptions.PermissionDenied('Request denied by device security profile.')
|
||||
return r
|
||||
|
||||
def _update_last_seen(self, device: Device):
|
||||
try:
|
||||
try:
|
||||
last_seen_obj = device.last_seen
|
||||
except DeviceLastSeen.DoesNotExist:
|
||||
# First request from device, create model, ignore result. Use get_or_create to be safe
|
||||
# against concurrent create requests
|
||||
DeviceLastSeen.objects.get_or_create(device=device, last_seen=now())
|
||||
else:
|
||||
if now() - last_seen_obj.last_seen < timedelta(seconds=10):
|
||||
# We don't need to know the last seen info of a device to more precision than this,
|
||||
# so we can avoid some database writes if the device is bursting a lot of requests.
|
||||
return
|
||||
last_seen_obj.last_seen = now()
|
||||
last_seen_obj.save(update_fields=["last_seen"])
|
||||
except DatabaseError:
|
||||
# Do not stop the request from happening
|
||||
logger.exception("Database error while updating last_seen")
|
||||
|
||||
@@ -139,6 +139,7 @@ class CheckinListViewSet(viewsets.ModelViewSet):
|
||||
)
|
||||
return qs
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -153,6 +154,7 @@ class CheckinListViewSet(viewsets.ModelViewSet):
|
||||
ctx['event'] = self.request.event
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations under the License.
|
||||
|
||||
from django.db import transaction
|
||||
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
|
||||
from django_scopes import scopes_disabled
|
||||
from rest_framework import viewsets
|
||||
@@ -64,6 +65,7 @@ class DiscountViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
'limit_sales_channels',
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -78,6 +80,7 @@ class DiscountViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
ctx['event'] = self.request.event
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -87,6 +90,7 @@ class DiscountViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied('You cannot delete this discount because it already has '
|
||||
|
||||
@@ -257,6 +257,7 @@ class EventViewSet(viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
copy_from = None
|
||||
if 'clone_from' in self.request.GET:
|
||||
@@ -320,6 +321,7 @@ class EventViewSet(viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied('The event can not be deleted as it already contains orders. Please set \'live\''
|
||||
@@ -355,6 +357,7 @@ class CloneEventViewSet(viewsets.ModelViewSet):
|
||||
ctx['organizer'] = self.request.organizer
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
# Weird edge case: Requires settings permission on the event (to read) but also on the organizer (two write)
|
||||
perm_holder = (self.request.auth if isinstance(self.request.auth, (Device, TeamAPIToken))
|
||||
@@ -513,6 +516,7 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
resp['X-Page-Generated'] = date
|
||||
return resp
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
original_data = self.get_serializer(instance=serializer.instance).data
|
||||
super().perform_update(serializer)
|
||||
@@ -529,6 +533,7 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -538,6 +543,7 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied('The sub-event can not be deleted as it has already been used in orders. Please set'
|
||||
@@ -566,6 +572,7 @@ class TaxRuleViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
def get_queryset(self):
|
||||
return self.request.event.tax_rules.all()
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
super().perform_update(serializer)
|
||||
serializer.instance.log_action(
|
||||
@@ -575,6 +582,7 @@ class TaxRuleViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -584,6 +592,7 @@ class TaxRuleViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied('This tax rule can not be deleted as it is currently in use.')
|
||||
@@ -757,6 +766,7 @@ class SeatViewSet(ConditionalListView, UpdateModelMixin, viewsets.ReadOnlyModelV
|
||||
}
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
super().perform_update(serializer)
|
||||
serializer.instance.event.log_action(
|
||||
@@ -766,6 +776,7 @@ class SeatViewSet(ConditionalListView, UpdateModelMixin, viewsets.ReadOnlyModelV
|
||||
data={"seats": [serializer.instance.pk]},
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def bulk_change_blocked(self, blocked):
|
||||
s = SeatBulkBlockInputSerializer(
|
||||
data=self.request.data,
|
||||
|
||||
@@ -23,6 +23,7 @@ from datetime import timedelta
|
||||
|
||||
from celery.result import AsyncResult
|
||||
from django.conf import settings
|
||||
from django.db import transaction
|
||||
from django.http import Http404
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.utils.functional import cached_property
|
||||
@@ -45,7 +46,8 @@ from pretix.base.models import (
|
||||
)
|
||||
from pretix.base.models.organizer import TeamQuerySet
|
||||
from pretix.base.services.export import (
|
||||
export, init_event_exporters, init_organizer_exporters, multiexport,
|
||||
ExportError, export, init_event_exporters, init_organizer_exporters,
|
||||
multiexport,
|
||||
)
|
||||
from pretix.helpers.http import ChunkBasedFileResponse
|
||||
|
||||
@@ -149,8 +151,11 @@ class EventExportersViewSet(ExportersMixin, viewsets.ViewSet):
|
||||
))
|
||||
exporters = []
|
||||
for ex in sorted(raw_exporters, key=lambda ex: str(ex.verbose_name)):
|
||||
ex._serializer = JobRunSerializer(exporter=ex)
|
||||
exporters.append(ex)
|
||||
try:
|
||||
ex._serializer = JobRunSerializer(exporter=ex)
|
||||
exporters.append(ex)
|
||||
except ExportError:
|
||||
pass
|
||||
return exporters
|
||||
|
||||
def do_export(self, cf, instance, data):
|
||||
@@ -180,8 +185,11 @@ class OrganizerExportersViewSet(ExportersMixin, viewsets.ViewSet):
|
||||
))
|
||||
exporters = []
|
||||
for ex in sorted(raw_exporters, key=lambda ex: str(ex.verbose_name)):
|
||||
ex._serializer = JobRunSerializer(exporter=ex)
|
||||
exporters.append(ex)
|
||||
try:
|
||||
ex._serializer = JobRunSerializer(exporter=ex)
|
||||
exporters.append(ex)
|
||||
except ExportError:
|
||||
pass
|
||||
return exporters
|
||||
|
||||
def do_export(self, cf, instance, data):
|
||||
@@ -220,6 +228,7 @@ class ScheduledEventExportViewSet(ScheduledExportersViewSet):
|
||||
qs = self.request.event.scheduled_exports
|
||||
return qs.select_related("owner")
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
if not self.request.user.is_authenticated:
|
||||
raise PermissionDenied('Creation of exports requires user-specific API access.')
|
||||
@@ -250,6 +259,7 @@ class ScheduledEventExportViewSet(ScheduledExportersViewSet):
|
||||
))
|
||||
return {e.identifier: e for e in exporters}
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
if not self.request.user.is_authenticated or self.request.user != serializer.instance.owner:
|
||||
# This is to prevent a possible privilege escalation where user A creates a scheduled export and
|
||||
@@ -275,6 +285,7 @@ class ScheduledEventExportViewSet(ScheduledExportersViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
self.request.event.log_action(
|
||||
'pretix.event.export.schedule.deleted',
|
||||
@@ -302,6 +313,7 @@ class ScheduledOrganizerExportViewSet(ScheduledExportersViewSet):
|
||||
qs = self.request.organizer.scheduled_exports
|
||||
return qs.select_related("owner")
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
if not self.request.user.is_authenticated:
|
||||
raise PermissionDenied('Creation of exports requires user-specific API access.')
|
||||
@@ -332,6 +344,7 @@ class ScheduledOrganizerExportViewSet(ScheduledExportersViewSet):
|
||||
))
|
||||
return {e.identifier: e for e in exporters}
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
if not self.request.user.is_authenticated or self.request.user != serializer.instance.owner:
|
||||
# This is to prevent a possible privilege escalation where user A creates a scheduled export and
|
||||
@@ -382,6 +395,7 @@ class ScheduledOrganizerExportViewSet(ScheduledExportersViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
self.request.organizer.log_action(
|
||||
'pretix.organizer.export.schedule.deleted',
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
# License for the specific language governing permissions and limitations under the License.
|
||||
|
||||
import django_filters
|
||||
from django.db import transaction
|
||||
from django.db.models import Q
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.utils.functional import cached_property
|
||||
@@ -109,6 +110,7 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
'limit_sales_channels', 'variations__limit_sales_channels', 'program_times'
|
||||
).all()
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -123,6 +125,7 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
ctx['event'] = self.request.event
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
original_data = self.get_serializer(instance=serializer.instance).data
|
||||
|
||||
@@ -139,6 +142,7 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied('This item cannot be deleted because it has already been ordered '
|
||||
@@ -183,6 +187,7 @@ class ItemVariationViewSet(viewsets.ModelViewSet):
|
||||
ctx['event'] = self.request.event
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
item = self.item
|
||||
if not item.has_variations:
|
||||
@@ -197,6 +202,7 @@ class ItemVariationViewSet(viewsets.ModelViewSet):
|
||||
{'value': serializer.instance.value})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.item.log_action(
|
||||
@@ -207,6 +213,7 @@ class ItemVariationViewSet(viewsets.ModelViewSet):
|
||||
{'value': serializer.instance.value})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied('This variation cannot be deleted because it has already been ordered '
|
||||
@@ -249,6 +256,7 @@ class ItemBundleViewSet(viewsets.ModelViewSet):
|
||||
ctx['item'] = self.item
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
item = get_object_or_404(Item, pk=self.kwargs['item'], event=self.request.event)
|
||||
serializer.save(base_item=item)
|
||||
@@ -259,6 +267,7 @@ class ItemBundleViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.base_item.log_action(
|
||||
@@ -268,6 +277,7 @@ class ItemBundleViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
super().perform_destroy(instance)
|
||||
instance.base_item.log_action(
|
||||
@@ -303,6 +313,7 @@ class ItemProgramTimeViewSet(viewsets.ModelViewSet):
|
||||
ctx['item'] = self.item
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
item = get_object_or_404(Item, pk=self.kwargs['item'], event=self.request.event)
|
||||
serializer.save(item=item)
|
||||
@@ -313,6 +324,7 @@ class ItemProgramTimeViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.item.log_action(
|
||||
@@ -322,6 +334,7 @@ class ItemProgramTimeViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
super().perform_destroy(instance)
|
||||
instance.item.log_action(
|
||||
@@ -354,6 +367,7 @@ class ItemAddOnViewSet(viewsets.ModelViewSet):
|
||||
ctx['item'] = self.item
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
item = self.item
|
||||
category = get_object_or_404(ItemCategory, pk=self.request.data['addon_category'])
|
||||
@@ -365,6 +379,7 @@ class ItemAddOnViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'ORDER': serializer.instance.position}, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.base_item.log_action(
|
||||
@@ -374,6 +389,7 @@ class ItemAddOnViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'ORDER': serializer.instance.position}, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
super().perform_destroy(instance)
|
||||
instance.base_item.log_action(
|
||||
@@ -403,6 +419,7 @@ class ItemCategoryViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
def get_queryset(self):
|
||||
return self.request.event.categories.all()
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -417,6 +434,7 @@ class ItemCategoryViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
ctx['event'] = self.request.event
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -426,6 +444,7 @@ class ItemCategoryViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
for item in instance.items.all():
|
||||
item.category = None
|
||||
@@ -458,6 +477,7 @@ class QuestionViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
def get_queryset(self):
|
||||
return self.request.event.questions.prefetch_related('options').all()
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -472,6 +492,7 @@ class QuestionViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
ctx['event'] = self.request.event
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -481,6 +502,7 @@ class QuestionViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
instance.log_action(
|
||||
'pretix.event.question.deleted',
|
||||
@@ -509,6 +531,7 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
|
||||
ctx['question'] = get_object_or_404(Question, pk=self.kwargs['question'], event=self.request.event)
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
q = get_object_or_404(Question, pk=self.kwargs['question'], event=self.request.event)
|
||||
serializer.save(question=q)
|
||||
@@ -519,6 +542,7 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'ORDER': serializer.instance.position}, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.question.log_action(
|
||||
@@ -528,6 +552,7 @@ class QuestionOptionViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'ORDER': serializer.instance.position}, {'id': serializer.instance.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
instance.question.log_action(
|
||||
'pretix.event.question.option.deleted',
|
||||
@@ -586,6 +611,7 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
serializer = self.get_serializer(page, many=True)
|
||||
return self.get_paginated_response(serializer.data)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -608,6 +634,7 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
ctx['request'] = self.request
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
original_data = self.get_serializer(instance=serializer.instance).data
|
||||
|
||||
@@ -663,6 +690,7 @@ class QuotaViewSet(ConditionalListView, viewsets.ModelViewSet):
|
||||
)
|
||||
serializer.instance.rebuild_cache()
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
instance.log_action(
|
||||
'pretix.event.quota.deleted',
|
||||
|
||||
@@ -394,6 +394,7 @@ class TeamViewSet(viewsets.ModelViewSet):
|
||||
)
|
||||
return inst
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
instance.log_action('pretix.team.deleted', user=self.request.user, auth=self.request.auth)
|
||||
instance.delete()
|
||||
@@ -693,6 +694,7 @@ class MembershipTypeViewSet(viewsets.ModelViewSet):
|
||||
ctx['organizer'] = self.request.organizer
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied("Can only be deleted if unused.")
|
||||
@@ -833,6 +835,7 @@ class SalesChannelViewSet(viewsets.ModelViewSet):
|
||||
)
|
||||
return inst
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if not instance.allow_delete():
|
||||
raise PermissionDenied("Can only be deleted if unused.")
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import django_filters
|
||||
from django.db import transaction
|
||||
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
|
||||
from django_scopes import scopes_disabled
|
||||
from rest_framework import viewsets
|
||||
@@ -62,6 +63,7 @@ class WaitingListViewSet(viewsets.ModelViewSet):
|
||||
ctx['event'] = self.request.event
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(event=self.request.event)
|
||||
serializer.instance.log_action(
|
||||
@@ -70,6 +72,7 @@ class WaitingListViewSet(viewsets.ModelViewSet):
|
||||
auth=self.request.auth,
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
if serializer.instance.voucher:
|
||||
raise PermissionDenied('This entry can not be changed as it has already been assigned a voucher.')
|
||||
@@ -80,6 +83,7 @@ class WaitingListViewSet(viewsets.ModelViewSet):
|
||||
auth=self.request.auth,
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
if instance.voucher:
|
||||
raise PermissionDenied('This entry can not be deleted as it has already been assigned a voucher.')
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import django_filters
|
||||
from django.db import transaction
|
||||
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
|
||||
from rest_framework import viewsets
|
||||
|
||||
@@ -48,6 +49,7 @@ class WebHookViewSet(viewsets.ModelViewSet):
|
||||
ctx['organizer'] = self.request.organizer
|
||||
return ctx
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
inst = serializer.save(organizer=self.request.organizer)
|
||||
self.request.organizer.log_action(
|
||||
@@ -57,6 +59,7 @@ class WebHookViewSet(viewsets.ModelViewSet):
|
||||
data=merge_dicts(self.request.data, {'id': inst.pk})
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
inst = serializer.save(organizer=self.request.organizer)
|
||||
self.request.organizer.log_action(
|
||||
@@ -67,6 +70,7 @@ class WebHookViewSet(viewsets.ModelViewSet):
|
||||
)
|
||||
return inst
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
self.request.organizer.log_action(
|
||||
'pretix.webhook.changed',
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
# Generated by Django 5.2.16 on 2026-08-05 08:00
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
import pretix.helpers.database
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("pretixbase", "0306_alter_eventmetaproperty_unique_together"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="DeviceLastSeen",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True, primary_key=True, serialize=False
|
||||
),
|
||||
),
|
||||
("last_seen", models.DateTimeField(auto_now=True)),
|
||||
(
|
||||
"device",
|
||||
models.OneToOneField(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="pretixbase.device",
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name="devicelastseen",
|
||||
index=pretix.helpers.database.BrinIndexIgnoredOnSQLite(
|
||||
models.F("last_seen"),
|
||||
autosummarize=True,
|
||||
name="pretixbase_device_last_seen",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -20,11 +20,13 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import string
|
||||
from datetime import timedelta
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import models
|
||||
from django.db.models import Max
|
||||
from django.utils.crypto import get_random_string
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django_scopes import ScopedManager, scopes_disabled
|
||||
|
||||
@@ -32,6 +34,7 @@ from pretix.base.models import LoggedModel
|
||||
from pretix.base.permissions import (
|
||||
AnyPermissionOf, assert_valid_event_permission,
|
||||
)
|
||||
from pretix.helpers import BrinIndexIgnoredOnSQLite
|
||||
|
||||
|
||||
@scopes_disabled()
|
||||
@@ -287,3 +290,27 @@ class Device(LoggedModel):
|
||||
return self.get_events_with_any_permission()
|
||||
else:
|
||||
return self.organizer.events.none()
|
||||
|
||||
|
||||
class DeviceLastSeen(models.Model):
|
||||
# This is a separate model since we expect it to get A LOT of writes and PostgreSQL always
|
||||
# writes full rows and then needs to update all indexes on the row, so this is going to save a
|
||||
# lot of write traffic on the databse
|
||||
device = models.OneToOneField("Device", on_delete=models.CASCADE, related_name="last_seen")
|
||||
last_seen = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
indexes = [
|
||||
BrinIndexIgnoredOnSQLite(
|
||||
# BRIN indexes are highly efficient on lots of updates, especially of chronological data
|
||||
# and especially if we later want to query them by range, as we likely want to.
|
||||
"last_seen",
|
||||
name="pretixbase_device_last_seen",
|
||||
autosummarize=True
|
||||
)
|
||||
]
|
||||
|
||||
@property
|
||||
def is_recent(self):
|
||||
# pretixSCAN/pretixPOS sync every 5 minutes, so 7 minutes can be considered "offline"
|
||||
return now() - self.last_seen < timedelta(minutes=7)
|
||||
|
||||
@@ -53,6 +53,7 @@ from django.utils.translation import (
|
||||
)
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
from pretix.base.decimal import round_decimal
|
||||
from pretix.base.i18n import language
|
||||
from pretix.base.media import MEDIA_TYPES
|
||||
from pretix.base.models import (
|
||||
@@ -916,6 +917,8 @@ class CartManager:
|
||||
if custom_price > 99_999_999_999:
|
||||
raise CartError(error_messages['price_too_high'])
|
||||
|
||||
custom_price = round_decimal(custom_price, currency=self.event.currency)
|
||||
|
||||
op = self.AddOperation(
|
||||
count=i['count'],
|
||||
item=item,
|
||||
@@ -1038,6 +1041,8 @@ class CartManager:
|
||||
if custom_price > 99_999_999_999:
|
||||
raise CartError(error_messages['price_too_high'])
|
||||
|
||||
custom_price = round_decimal(custom_price, currency=self.event.currency)
|
||||
|
||||
# Fix positions with wrong price (TODO: happens out-of-cartmanager-transaction and therefore a little hacky)
|
||||
for ca in current_addons[cp][a['item'], a['variation']]:
|
||||
if ca.listed_price != listed_price:
|
||||
|
||||
@@ -801,11 +801,10 @@ def get_available_placeholders(event, base_parameters, rich=False):
|
||||
return params
|
||||
|
||||
|
||||
def get_sample_context(event, context_parameters, rich=True):
|
||||
def prepare_sample_context_for_preview(placeholder_to_sample):
|
||||
context_dict = {}
|
||||
lbl = _('This value will be replaced based on dynamic parameters.')
|
||||
for k, v in get_available_placeholders(event, context_parameters, rich=rich).items():
|
||||
sample = v.render_sample(event)
|
||||
for k, sample in placeholder_to_sample.items():
|
||||
if isinstance(sample, PlainHtmlAlternativeString):
|
||||
context_dict[k] = PlainHtmlAlternativeString(
|
||||
'<{el} class="placeholder" title="{title}">{plain}</{el}>'.format(
|
||||
@@ -830,3 +829,12 @@ def get_sample_context(event, context_parameters, rich=True):
|
||||
escape(sample)
|
||||
))
|
||||
return context_dict
|
||||
|
||||
|
||||
def get_sample_context(event, context_parameters, rich=True):
|
||||
return prepare_sample_context_for_preview(
|
||||
{
|
||||
k: v.render_sample(event)
|
||||
for k, v in get_available_placeholders(event, context_parameters, rich=rich).items()
|
||||
}
|
||||
)
|
||||
|
||||
@@ -118,6 +118,10 @@
|
||||
</td>
|
||||
{% endif %}
|
||||
<td>
|
||||
<span class="fa fa-fw {% if d.last_seen and d.last_seen.is_recent %}fa-check-circle text-success{% else %}fa-circle text-danger{% endif %}"
|
||||
data-toggle="tooltip"
|
||||
title="{% if d.last_seen %}{% blocktrans with time=d.last_seen.last_seen|date:"SHORT_DATETIME_FORMAT" %}Last seen: {{ time }}{% endblocktrans %}{% else %}{% trans "No recent contact" %}{% endif %}"
|
||||
></span>
|
||||
{{ d.device_id }}
|
||||
</td>
|
||||
<td>
|
||||
@@ -125,6 +129,7 @@
|
||||
<del>{% endif %}
|
||||
{{ d.name }}
|
||||
{% if d.revoked %}</del>{% endif %}
|
||||
|
||||
{% if d.gate %}
|
||||
<br>
|
||||
<small class="text-muted">{{ d.gate.name }}</small>
|
||||
|
||||
@@ -269,8 +269,8 @@ class MailSettingsSetupView(TemplateView):
|
||||
if settings.MAIL_CUSTOM_SENDER_DMARC_REQUIRED:
|
||||
dmarc_record = get_dmarc_record(hostname)
|
||||
if not dmarc_record:
|
||||
spf_warning = _(
|
||||
'We did not find DMARC record for your domain. This means that there is a very high chance '
|
||||
dmarc_warning = _(
|
||||
'We did not find a DMARC record for your domain. This means that there is a very high chance '
|
||||
'most of the emails will be rejected or marked as spam. You should update the DNS settings '
|
||||
'of your domain.'
|
||||
)
|
||||
|
||||
@@ -382,7 +382,7 @@ class OrderOverpaidRefundBulkActionView(BaseOrderBulkActionView):
|
||||
'provider': refund.provider,
|
||||
}, user=self.request.user)
|
||||
payment.payment_provider.execute_refund(refund)
|
||||
return True
|
||||
return bool(proposals)
|
||||
except (ValueError, PaymentException):
|
||||
return False
|
||||
|
||||
|
||||
@@ -108,6 +108,9 @@ from pretix.base.services.export import (
|
||||
init_organizer_exporters, multiexport, scheduled_organizer_export,
|
||||
)
|
||||
from pretix.base.services.mail import mail, prefix_subject
|
||||
from pretix.base.services.placeholders import (
|
||||
prepare_sample_context_for_preview,
|
||||
)
|
||||
from pretix.base.templatetags.rich_text import markdown_compile_email
|
||||
from pretix.base.views.tasks import AsyncAction
|
||||
from pretix.control.forms.exports import ScheduledOrganizerExportForm
|
||||
@@ -345,16 +348,11 @@ class MailSettingsPreview(OrganizerPermissionRequiredMixin, View):
|
||||
|
||||
# get all supported placeholders with dummy values
|
||||
def placeholders(self, item):
|
||||
ctx = {}
|
||||
for p, s in MailSettingsForm(obj=self.request.organizer)._get_sample_context(
|
||||
MailSettingsForm.base_context[item]).items():
|
||||
if s.strip().startswith('*'):
|
||||
ctx[p] = s
|
||||
else:
|
||||
ctx[p] = '<span class="placeholder" title="{}">{}</span>'.format(
|
||||
_('This value will be replaced based on dynamic parameters.'),
|
||||
s
|
||||
)
|
||||
ctx = prepare_sample_context_for_preview(
|
||||
MailSettingsForm(obj=self.request.organizer)._get_sample_context(
|
||||
MailSettingsForm.base_context[item]
|
||||
)
|
||||
)
|
||||
return self.SafeDict(ctx)
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
@@ -1210,7 +1208,7 @@ class DeviceQueryMixin:
|
||||
def get_queryset(self):
|
||||
qs = self.request.organizer.devices.prefetch_related(
|
||||
'limit_events', 'gate',
|
||||
).order_by('revoked', '-device_id')
|
||||
).select_related('last_seen').order_by('revoked', '-device_id')
|
||||
|
||||
if 'device' in self.request_data and '__ALL' not in self.request_data:
|
||||
qs = qs.filter(
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
import contextlib
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.postgres.indexes import BrinIndex
|
||||
from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured
|
||||
from django.db import connection, transaction
|
||||
from django.db.models import (
|
||||
@@ -285,3 +286,21 @@ def get_deterministic_ordering(model, ordering):
|
||||
# on the primary key to provide total ordering.
|
||||
ordering.append("-pk")
|
||||
return ordering
|
||||
|
||||
|
||||
class IgnoreOnSQLiteMixin:
|
||||
# Mixin to allow defining PostgreSQL-specific indexes that will just not be created
|
||||
# on SQLite. SQLite is supported for testing only anyways!
|
||||
def create_sql(self, model, schema_editor, *args, **kwargs):
|
||||
if "sqlite" in settings.DATABASES["default"]["ENGINE"]:
|
||||
return ""
|
||||
return super().create_sql(model, schema_editor, *args, **kwargs)
|
||||
|
||||
def remove_sql(self, model, schema_editor, **kwargs):
|
||||
if "sqlite" in settings.DATABASES["default"]["ENGINE"]:
|
||||
return ""
|
||||
return super().remove_sql(model, schema_editor, **kwargs)
|
||||
|
||||
|
||||
class BrinIndexIgnoredOnSQLite(IgnoreOnSQLiteMixin, BrinIndex):
|
||||
pass
|
||||
|
||||
@@ -4,10 +4,10 @@ msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||
"PO-Revision-Date: 2026-07-27 17:00+0000\n"
|
||||
"PO-Revision-Date: 2026-07-31 18:00+0000\n"
|
||||
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
|
||||
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/da/"
|
||||
">\n"
|
||||
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"da/>\n"
|
||||
"Language: da\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1381,10 +1381,8 @@ msgid "Membership type"
|
||||
msgstr "Medlemskabstype"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "Purchase time"
|
||||
msgid "Purchase ticket"
|
||||
msgstr "Købsdato"
|
||||
msgstr "Køb billet"
|
||||
|
||||
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||
@@ -1401,10 +1399,8 @@ msgid "Start date"
|
||||
msgstr "Starttidspunkt"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "Start time from"
|
||||
msgid "Start time"
|
||||
msgstr "Starttidspunkt fra"
|
||||
msgstr "Starttidspunkt"
|
||||
|
||||
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||
#: pretix/base/exporters/waitinglist.py pretix/base/models/memberships.py
|
||||
@@ -1417,10 +1413,8 @@ msgid "End date"
|
||||
msgstr "Sluttidspunkt"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "End: %(time)s"
|
||||
msgid "End time"
|
||||
msgstr "Slut: %(time)s"
|
||||
msgstr "Sluttidspunkt"
|
||||
|
||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||
msgctxt "export_category"
|
||||
@@ -4641,16 +4635,12 @@ msgid "This event is remote or partially remote."
|
||||
msgstr "Dette arrangement afholdes online eller delvist online."
|
||||
|
||||
#: pretix/base/models/event.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This will be used to let users know if the event is in a different "
|
||||
#| "timezone and let’s us calculate users’ local times."
|
||||
msgid ""
|
||||
"This will be used to let users know if the event is in a different timezone, "
|
||||
"and to let us calculate the local time of a user."
|
||||
msgstr ""
|
||||
"Dette vil blive brugt til at informere brugerne om, hvorvidt begivenheden "
|
||||
"finder sted i en anden tidszone, og til at beregne brugernes lokale tid."
|
||||
"finder sted i en anden tidszone, og til at beregne brugerens lokale tid."
|
||||
|
||||
#: pretix/base/models/event.py pretix/base/models/organizer.py
|
||||
#: pretix/control/navigation.py
|
||||
@@ -5472,14 +5462,6 @@ msgid "Reusable media policy"
|
||||
msgstr "Politik for genanvendelige medier"
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "If this product should be stored on a re-usable physical medium, you can "
|
||||
#| "attach a physical media policy. This is not required for regular tickets, "
|
||||
#| "which just use a one-time barcode, but only for products like renewable "
|
||||
#| "season tickets or re-chargeable gift card wristbands. This is an advanced "
|
||||
#| "feature that also requires specific configuration of ticketing and "
|
||||
#| "printing settings."
|
||||
msgid ""
|
||||
"If this product should be stored on a reusable physical medium, you can "
|
||||
"attach a physical media policy. This is not required for regular tickets, "
|
||||
@@ -5488,12 +5470,12 @@ msgid ""
|
||||
"feature that also requires specific configuration of ticketing and printing "
|
||||
"settings."
|
||||
msgstr ""
|
||||
"Hvis dette produkt skal opbevares på et genanvendeligt fysisk medie, kan du "
|
||||
"vedhæfte en politik for fysiske medier. Dette er ikke nødvendigt for "
|
||||
"almindelige billetter, som bare bruger en engangs-stregkode, men kun for "
|
||||
"produkter som f.eks. fornyelige sæsonkort eller genopladelige gavekort-"
|
||||
"armbånd. Dette er en avanceret funktion, som også kræver en specifik "
|
||||
"konfiguration af billet- og printindstillinger."
|
||||
"Hvis dette produkt skal opbevares på et genanvendeligt fysisk medium, kan du "
|
||||
"knytte en politik for fysiske medier til det. Dette er ikke påkrævet for "
|
||||
"almindelige billetter, som blot bruger en engangsstregkode, men gælder kun "
|
||||
"for produkter som sæsonkort, der kan fornyes, eller gavekortarmbånd, som kan "
|
||||
"blive genopladet. Dette er en avanceret funktion, der også kræver en "
|
||||
"specifik konfiguration af billet- og udskrivningsindstillingerne."
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid "Reusable media type"
|
||||
@@ -5537,6 +5519,9 @@ msgid ""
|
||||
"prior to their usage. Therefore, the selected media policy does not make "
|
||||
"sense for this media type."
|
||||
msgstr ""
|
||||
"Den valgte medietype kræver, at alle medier registreres i systemet, inden de "
|
||||
"tages i brug. Derfor giver den valgte mediepolitik ikke mening for denne "
|
||||
"medietype."
|
||||
|
||||
#: pretix/base/models/items.py
|
||||
msgid ""
|
||||
@@ -6090,18 +6075,16 @@ msgstr "afvist"
|
||||
#: pretix/base/models/media.py
|
||||
msgctxt "reusable_medium"
|
||||
msgid "Claim token"
|
||||
msgstr ""
|
||||
msgstr "Hent token"
|
||||
|
||||
#: pretix/base/models/media.py
|
||||
msgctxt "reusable_medium"
|
||||
msgid "Label"
|
||||
msgstr ""
|
||||
msgstr "Etiket"
|
||||
|
||||
#: pretix/base/models/media.py
|
||||
#, fuzzy
|
||||
#| msgid "Linked ticket"
|
||||
msgid "Linked tickets"
|
||||
msgstr "Forbundet billet"
|
||||
msgstr "Sammenkædede billetter"
|
||||
|
||||
#: pretix/base/models/media.py
|
||||
msgid ""
|
||||
@@ -6109,6 +6092,9 @@ msgid ""
|
||||
"validity. If multiple tickets are valid at once, this will lead to failed "
|
||||
"check-ins."
|
||||
msgstr ""
|
||||
"Hvis du linker til mere end én billet, skal du sikre dig, at der ikke er "
|
||||
"nogen overlapning i gyldighedsperioden. Hvis flere billetter er gyldige på "
|
||||
"samme tid, vil det medføre, at check-in mislykkes."
|
||||
|
||||
#: pretix/base/models/memberships.py
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||
@@ -7568,6 +7554,8 @@ msgid ""
|
||||
"This payment provider exists for historical purposes only and is no longer "
|
||||
"usable."
|
||||
msgstr ""
|
||||
"Denne betalingsudbyder findes udelukkende af historiske årsager og kan ikke "
|
||||
"længere benyttes."
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
msgid "Ticket code (barcode content)"
|
||||
@@ -7802,15 +7790,12 @@ msgid "Atlantis"
|
||||
msgstr "Eksempelland"
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
#, fuzzy
|
||||
msgid "Invoice custom recipient field"
|
||||
msgstr "Fakturamodtager:"
|
||||
msgstr "Brugerdefineret modtagerfelt på fakturaen"
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
#, fuzzy
|
||||
#| msgid "Custom recipient field label"
|
||||
msgid "Custom recipient field"
|
||||
msgstr "Brugerdefineret etiket til modtagerfelt"
|
||||
msgstr "Brugerdefineret modtagerfelt"
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
msgid "List of Add-Ons"
|
||||
@@ -8252,7 +8237,7 @@ msgstr "Arrangement aflyst"
|
||||
|
||||
#: pretix/base/services/cancelevent.py
|
||||
msgid "Confirm event cancellation and bulk refund"
|
||||
msgstr ""
|
||||
msgstr "Bekræft aflysning af begivenhed og samlet refusion"
|
||||
|
||||
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
|
||||
#: pretix/base/services/orders.py
|
||||
@@ -8781,13 +8766,15 @@ msgstr "Du skal svare på spørgsmål for at gennemføre dette tjek-ind."
|
||||
|
||||
#: pretix/base/services/checkin.py
|
||||
msgid "Ticket needs to be exchanged to a suitable medium."
|
||||
msgstr ""
|
||||
msgstr "Billetten skal ombyttes til et passende medium."
|
||||
|
||||
#: pretix/base/services/checkin.py
|
||||
msgid ""
|
||||
"This ticket has already been exchanged for a reusable medium that now needs "
|
||||
"to be used instead."
|
||||
msgstr ""
|
||||
"Denne billet er allerede blevet ombyttet til et genanvendeligt medium, som "
|
||||
"nu skal bruges i stedet."
|
||||
|
||||
#: pretix/base/services/checkin.py
|
||||
msgid "This ticket has already been redeemed."
|
||||
@@ -8818,9 +8805,8 @@ msgid "Your export did not contain any data."
|
||||
msgstr "Din eksport indeholdt ingen data."
|
||||
|
||||
#: pretix/base/services/export.py
|
||||
#, fuzzy
|
||||
msgid "Scheduled export failed"
|
||||
msgstr "Start eksport"
|
||||
msgstr "Den planlagte eksport mislykkedes"
|
||||
|
||||
#: pretix/base/services/export.py
|
||||
msgid "Permission denied."
|
||||
@@ -8947,60 +8933,44 @@ msgid "You are receiving this email because you placed an order for {event}."
|
||||
msgstr "Du modtager denne e-mail, fordi du har afgivet en ordre til {event}."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "Invalid input type."
|
||||
msgid "Invalid medium type."
|
||||
msgstr "Ugyldig indtastning."
|
||||
msgstr "Ugyldig medietype."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "The selected media type is not enabled in your organizer settings."
|
||||
msgid "Medium type is not enabled for organizer."
|
||||
msgstr "Den valgte medietype er ikke aktiveret i dine arrangør-indstillinger."
|
||||
msgstr "Medie-typen er ikke aktiveret for arrangøren."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
msgid "Incorrect medium type for product."
|
||||
msgstr ""
|
||||
msgstr "Forkert medietype for produktet."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "This ticket has already been redeemed."
|
||||
msgid "Ticket is already exchanged for reusable medium."
|
||||
msgstr "Denne billet er allerede blevet indløst."
|
||||
msgstr "Billetten er allerede ombyttet til et genanvendeligt medium."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "Reusable Medium ID"
|
||||
msgid "Reusable medium not found."
|
||||
msgstr "ID for genanvendeligt medie"
|
||||
msgstr "Genanvendeligt medie blev ikke fundet."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "The reusable medium has been created."
|
||||
msgid "Reusable medium is inactive or expired."
|
||||
msgstr "Det genanvendelige medie er blevet oprettet."
|
||||
msgstr "Det genanvendelige medium er inaktivt eller udløbet."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "The reusable medium has been created."
|
||||
msgid "Reusable medium not found and could not be created."
|
||||
msgstr "Det genanvendelige medie er blevet oprettet."
|
||||
msgstr "Genanvendeligt medie blev ikke fundet og kunne ikke oprettes."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "Reusable media type"
|
||||
msgid "Reusable medium already exists."
|
||||
msgstr "Genanvendelig medietype"
|
||||
msgstr "Det genanvendelige medie findes allerede."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
#, fuzzy
|
||||
#| msgid "The reusable medium has been created."
|
||||
msgid "Reusable medium could not be created."
|
||||
msgstr "Det genanvendelige medie er blevet oprettet."
|
||||
msgstr "Det var ikke muligt at oprette det genanvendelige medie."
|
||||
|
||||
#: pretix/base/services/media.py
|
||||
msgid "Product does not support medium exchange."
|
||||
msgstr ""
|
||||
msgstr "Produktet understøtter ikke udskiftning af medier."
|
||||
|
||||
#: pretix/base/services/memberships.py
|
||||
#, python-brace-format
|
||||
@@ -9164,6 +9134,7 @@ msgstr "En voucher kan ikke oprettes uden kode."
|
||||
msgid ""
|
||||
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
|
||||
msgstr ""
|
||||
"Kuponkoder skal være unikke. Koden \"{code}\" findes allerede i denne import."
|
||||
|
||||
#: pretix/base/services/modelimport.py
|
||||
#, python-brace-format
|
||||
@@ -9172,13 +9143,19 @@ msgid ""
|
||||
msgid_plural ""
|
||||
"Voucher codes must be unique. Import contains existing voucher codes {code}."
|
||||
msgstr[0] ""
|
||||
"Rabatkoder skal være unikke. Importen indeholder den eksisterende rabatkode "
|
||||
"{code}."
|
||||
msgstr[1] ""
|
||||
"Rabatkoder skal være unikke. Importen indeholder de eksisterende rabatkoder "
|
||||
"{code}."
|
||||
|
||||
#: pretix/base/services/modelimport.py
|
||||
msgid ""
|
||||
"Vouchers could not be imported, probably due to a voucher code already being "
|
||||
"in use."
|
||||
msgstr ""
|
||||
"Rabatkoder kunne ikke importeres, sandsynligvis fordi en kuponkode allerede "
|
||||
"var i brug."
|
||||
|
||||
#: pretix/base/services/orders.py
|
||||
msgid ""
|
||||
@@ -9462,16 +9439,12 @@ msgstr ""
|
||||
"gavekort."
|
||||
|
||||
#: pretix/base/services/orders.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "You cannot change the price of a position that has been used to issue a "
|
||||
#| "gift card."
|
||||
msgid ""
|
||||
"You cannot change the ticket secret of a position that has been used to "
|
||||
"issue a gift card."
|
||||
msgstr ""
|
||||
"Du kan ikke ændre prisen af en post, som er blevet brugt til at udstede et "
|
||||
"gavekort."
|
||||
"Du kan ikke ændre billetkoden for en position, der er blevet brugt til at "
|
||||
"udstede et gavekort."
|
||||
|
||||
#: pretix/base/services/orders.py
|
||||
#, python-brace-format
|
||||
@@ -9558,10 +9531,9 @@ msgid "Something happened in your event after the export, please try again."
|
||||
msgstr "Der skete noget i din begivenhed efter eksporten, prøv venligst igen."
|
||||
|
||||
#: pretix/base/services/shredder.py
|
||||
#, fuzzy, python-format
|
||||
#| msgid "Data shredding completed"
|
||||
#, python-format
|
||||
msgid "Data shredding completed for %(event)s"
|
||||
msgstr "Makulering af data afsluttet"
|
||||
msgstr "Datadestruktion for %(event)s er afsluttet"
|
||||
|
||||
#: pretix/base/services/stats.py
|
||||
msgid "Uncategorized"
|
||||
@@ -9738,29 +9710,24 @@ msgstr ""
|
||||
"ind under købet."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
#, fuzzy
|
||||
#| msgid "Activate re-usable media"
|
||||
msgid "Activate reusable media"
|
||||
msgstr "Aktiver genanvendelige medier"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The re-usable media feature allows you to connect tickets and gift cards "
|
||||
#| "with physical media such as wristbands or chip cards that may be re-used "
|
||||
#| "for different tickets or gift cards later."
|
||||
msgid ""
|
||||
"The reusable media feature allows you to connect tickets and gift cards with "
|
||||
"physical media such as wristbands or chip cards that may be reused for "
|
||||
"different tickets or gift cards later."
|
||||
msgstr ""
|
||||
"Funktionen \"Genanvendelige medier\" gør det muligt at forbinde billetter og "
|
||||
"voucher med fysiske medier som armbånd eller chipkort, der kan genbruges til "
|
||||
"andre billetter eller voucher senere."
|
||||
"Med funktionen \"Genanvendelige medier\" kan du knytte billetter og gavekort "
|
||||
"til fysiske medier såsom armbånd eller chipkort, som senere kan genbruges "
|
||||
"til andre billetter eller gavekort."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Enforce the usage of issued reusable media for check-in"
|
||||
msgstr ""
|
||||
"Gennemtving, at der udelukkende anvendes de udleverede genanvendelige medier "
|
||||
"ved check-in"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
@@ -9768,6 +9735,10 @@ msgid ""
|
||||
"medium has been created and linked to a ticket. Keeping this option turned "
|
||||
"off will treat the reusable medium and ticket as equals."
|
||||
msgstr ""
|
||||
"Hvis denne indstilling er aktiveret, accepteres en billetstregkode ikke "
|
||||
"længere, hvis der er oprettet et genanvendeligt medie, som er knyttet til en "
|
||||
"billet. Hvis denne indstilling forbliver deaktiveret, behandles det "
|
||||
"genanvendelige medie og billetten på samme måde."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Length of barcodes"
|
||||
@@ -11336,10 +11307,8 @@ msgid "We'll show this publicly to allow attendees to contact you."
|
||||
msgstr "Vi vil vise dette offentligt, så deltagerne kan kontakte dig."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
#, fuzzy
|
||||
#| msgid "Contact"
|
||||
msgid "Contact URL"
|
||||
msgstr "Kontakt"
|
||||
msgstr "Kontakt-URL"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
@@ -11347,6 +11316,9 @@ msgid ""
|
||||
"the email address above. Please note that you still need to add a contact "
|
||||
"email address that will be shared with all emails you send."
|
||||
msgstr ""
|
||||
"Hvis du indstiller dette, vil kontaktlinket i sidefoden pege hertil i stedet "
|
||||
"for at bruge ovenstående e-mailadresse. Bemærk, at du stadig skal tilføje en "
|
||||
"kontakt-e-mailadresse, som vil blive angivet i alle de e-mails, du sender."
|
||||
|
||||
#: pretix/base/settings.py pretix/control/forms/event.py
|
||||
msgid "Imprint URL"
|
||||
@@ -13213,30 +13185,19 @@ msgstr ""
|
||||
"os."
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "You have requested us to cancel an event which includes a larger bulk-"
|
||||
#| "refund:"
|
||||
msgid "You requested to cancel an event that involves a large bulk refund:"
|
||||
msgstr ""
|
||||
"Du har bedt os om at aflyse et arrangement, der indebærer en større samlet "
|
||||
"Du har anmodet om at annullere en begivenhed, der medfører en stor samlet "
|
||||
"refusion:"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
|
||||
#, fuzzy
|
||||
#| msgid "Estimated refund amount"
|
||||
msgid "Estimated refund"
|
||||
msgstr "Anslået refusionsbeløb"
|
||||
msgstr "Anslået tilbagebetaling"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Please confirm that you want to proceed by coping the following "
|
||||
#| "confirmation code into the cancellation form:"
|
||||
msgid "To confirm, paste the following code into the cancellation form:"
|
||||
msgstr ""
|
||||
"Bekræft venligst, at du ønsker at fortsætte ved at indsætte følgende "
|
||||
"bekræftelseskode i afmeldingsformularen:"
|
||||
"For at bekræfte skal du indsætte følgende kode i afbestillingsformularen:"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
|
||||
#, python-format
|
||||
@@ -13244,6 +13205,8 @@ msgid ""
|
||||
"Don't share this code with anyone. The %(instance)s team will never ask you "
|
||||
"for it."
|
||||
msgstr ""
|
||||
"Del ikke denne kode med nogen. %(instance)s-teamet vil aldrig bede dig om "
|
||||
"den."
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/cancel_confirm.txt
|
||||
#: pretix/base/templates/pretixbase/email/export_failed.txt
|
||||
@@ -13252,6 +13215,8 @@ msgid ""
|
||||
"Thanks, \n"
|
||||
"The %(instance)s Team"
|
||||
msgstr ""
|
||||
"Tak, \n"
|
||||
"%(instance)s-teamet"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/email_footer.html
|
||||
#, python-format
|
||||
@@ -13259,51 +13224,38 @@ msgid "powered by <a %(a_attr)s>pretix</a>"
|
||||
msgstr "drevet af <a %(a_attr)s>pretix</a>"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/export_failed.txt
|
||||
#, fuzzy
|
||||
#| msgid "Your export failed."
|
||||
msgid "Your scheduled export failed."
|
||||
msgstr "Din eksport mislykkedes."
|
||||
msgstr "Din planlagte eksport mislykkedes."
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/export_failed.txt
|
||||
#: pretix/control/templates/pretixcontrol/event/tax_edit.html
|
||||
#, fuzzy
|
||||
msgid "Reason"
|
||||
msgstr "Tilbagebetal bestilling"
|
||||
msgstr "Begrundelse"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/export_failed.txt
|
||||
#, fuzzy
|
||||
#| msgid "If your export fails five times in a row, it will no longer be sent."
|
||||
msgid "If an export fails five times in a row, we'll stop sending it."
|
||||
msgstr ""
|
||||
"Hvis din eksport mislykkes fem gange i træk, vil den ikke længere blive "
|
||||
"sendt."
|
||||
"Hvis en eksport mislykkes fem gange i træk, vil vi stoppe med at sende den."
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/export_failed.txt
|
||||
#, fuzzy
|
||||
#| msgid "You can request to cancel this order."
|
||||
msgid "You can adjust or remove this export here:"
|
||||
msgstr "Du kan anmode om at annullere denne bestilling."
|
||||
msgstr "Du kan ændre eller fjerne denne eksport her:"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/notification.html
|
||||
#: pretix/base/templates/pretixbase/email/notification.txt
|
||||
#, fuzzy
|
||||
#| msgid "You receive these emails based on your notification settings."
|
||||
msgid "You're receiving this email based on your notification settings."
|
||||
msgstr ""
|
||||
"Du modtager disse e-mails i henhold til dine indstillinger for "
|
||||
"notifikationer."
|
||||
"Du modtager denne e-mail i henhold til dine indstillinger for meddelelser."
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/notification.html
|
||||
#: pretix/base/templates/pretixbase/email/notification.txt
|
||||
#, fuzzy
|
||||
msgid "Manage settings"
|
||||
msgstr "Basisindstillinger"
|
||||
msgstr "Administrer indstillinger"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/notification.html
|
||||
#: pretix/base/templates/pretixbase/email/notification.txt
|
||||
#, fuzzy
|
||||
msgid "Disable all notifications"
|
||||
msgstr "E-mailnotifikationer"
|
||||
msgstr "Deaktiver alle notifikationer"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/order_details.html
|
||||
msgid ""
|
||||
@@ -13362,25 +13314,7 @@ msgid "Contact"
|
||||
msgstr "Kontakt"
|
||||
|
||||
#: pretix/base/templates/pretixbase/email/shred_completed.txt
|
||||
#, fuzzy, python-format
|
||||
#| msgid ""
|
||||
#| "Hello,\n"
|
||||
#| "\n"
|
||||
#| "we hereby confirm that the following data shredding job has been "
|
||||
#| "completed:\n"
|
||||
#| "\n"
|
||||
#| "Organizer: %(organizer)s\n"
|
||||
#| "\n"
|
||||
#| "Event: %(event)s\n"
|
||||
#| "\n"
|
||||
#| "Data selection: %(shredders)s\n"
|
||||
#| "\n"
|
||||
#| "Start time: %(start_time)s (new data added after this time might not have "
|
||||
#| "been deleted)\n"
|
||||
#| "\n"
|
||||
#| "Best regards,\n"
|
||||
#| "\n"
|
||||
#| "Your %(instance)s team\n"
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Hello,\n"
|
||||
"\n"
|
||||
@@ -13398,20 +13332,19 @@ msgid ""
|
||||
msgstr ""
|
||||
"Hej,\n"
|
||||
"\n"
|
||||
"vi bekræfter hermed, at følgende datadestruktionsopgave er afsluttet:\n"
|
||||
"Følgende datadestruktionsopgave er afsluttet:\n"
|
||||
"\n"
|
||||
"Arrangør: %(organizer)s\n"
|
||||
"- Arrangør: %(organizer)s\n"
|
||||
"- Begivenhed: %(event)s\n"
|
||||
"- Dataudvælgelse: %(shredders)s\n"
|
||||
"- Starttidspunkt: %(start_time)s\n"
|
||||
"\n"
|
||||
"Begivenhed: %(event)s\n"
|
||||
"Data, der er tilføjet til begivenheden efter starttidspunktet, er muligvis "
|
||||
"ikke blevet slettet.\n"
|
||||
"\n"
|
||||
"Dataudvælgelse: %(shredders)s\n"
|
||||
"Med venlig hilsen, \n"
|
||||
"\n"
|
||||
"Starttidspunkt: %(start_time)s (nye data tilføjet efter dette tidspunkt er "
|
||||
"muligvis ikke blevet slettet)\n"
|
||||
"\n"
|
||||
"Med venlig hilsen,\n"
|
||||
"\n"
|
||||
"Dit %(instance)s-team\n"
|
||||
"%(instance)s-teamet\n"
|
||||
|
||||
#: pretix/base/templates/pretixbase/forms/widgets/checkbox_sales_channel_option.html
|
||||
msgid ""
|
||||
@@ -13443,22 +13376,23 @@ msgstr "%(number)s dage %(relation)s %(relation_to)s på %(time_of_day)s"
|
||||
#: pretix/base/templates/pretixbase/framebreak.html
|
||||
#: pretix/presale/templates/pretixpresale/event/cookies.html
|
||||
msgid "Please continue in a new tab"
|
||||
msgstr ""
|
||||
msgstr "Fortsæt venligst i en ny fane"
|
||||
|
||||
#: pretix/base/templates/pretixbase/framebreak.html
|
||||
msgid "For security reasons, the following step is only possible in a new tab."
|
||||
msgstr ""
|
||||
"Af sikkerhedsmæssige årsager kan det følgende trin kun udføres i en ny fane."
|
||||
|
||||
#: pretix/base/templates/pretixbase/framebreak.html
|
||||
msgid ""
|
||||
"If the new tab did not open automatically, please click the following button:"
|
||||
msgstr ""
|
||||
"Hvis den nye fane ikke åbnede automatisk, skal du klikke på følgende knap:"
|
||||
|
||||
#: pretix/base/templates/pretixbase/framebreak.html
|
||||
#: pretix/presale/templates/pretixpresale/event/cookies.html
|
||||
#, fuzzy
|
||||
msgid "Continue in new tab"
|
||||
msgstr "Opret gruppe"
|
||||
msgstr "Fortsæt i en ny fane"
|
||||
|
||||
#: pretix/base/templates/pretixbase/redirect.html
|
||||
msgid "Redirect"
|
||||
@@ -15184,13 +15118,11 @@ msgstr "Søg efter e-mailadresse eller emne"
|
||||
#: pretix/control/templates/pretixcontrol/order/index.html
|
||||
#: pretix/control/templates/pretixcontrol/orders/refunds.html
|
||||
msgid "Source"
|
||||
msgstr ""
|
||||
msgstr "Kilde"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
#, fuzzy
|
||||
#| msgid "All vouchers"
|
||||
msgid "All sources"
|
||||
msgstr "Alle vouchere"
|
||||
msgstr "Alle kilder"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
msgid "Team actions"
|
||||
@@ -15201,21 +15133,16 @@ msgid "Customer actions"
|
||||
msgstr "Kundehandlinger"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
#, fuzzy
|
||||
#| msgid "Device status"
|
||||
msgid "Device actions"
|
||||
msgstr "Enhedsstatus"
|
||||
msgstr "Enhedshandlinger"
|
||||
|
||||
#: pretix/control/forms/filter.py
|
||||
#, fuzzy
|
||||
#| msgid "Order email"
|
||||
msgid "User email"
|
||||
msgstr "Bestillings-e-mail"
|
||||
msgstr "Brugerens e-mailadresse"
|
||||
|
||||
#: pretix/control/forms/filter.py pretix/control/navigation.py
|
||||
#, fuzzy
|
||||
msgid "All users"
|
||||
msgstr "Alle vouchere"
|
||||
msgstr "Alle brugere"
|
||||
|
||||
#: pretix/control/forms/global_settings.py
|
||||
msgid "Additional footer text"
|
||||
@@ -16724,40 +16651,34 @@ msgid ""
|
||||
"because at least one of the selected vouchers has already been redeemed "
|
||||
"%(max_redeemed)s times."
|
||||
msgstr ""
|
||||
"Du kan ikke reducere det maksimale antal indløsninger til %(max_usages)s, da "
|
||||
"mindst én af de valgte kuponer allerede er blevet indløst %(max_redeemed)s "
|
||||
"gange."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "You cannot create a voucher that blocks quota as the selected product or "
|
||||
#| "quota is currently sold out or completely reserved."
|
||||
msgid ""
|
||||
"You cannot create a voucher that allows selection of a quota but has no date "
|
||||
"selected."
|
||||
msgstr ""
|
||||
"Du kan ikke oprette en rabatkode der blokerer en kvote idet det valgte "
|
||||
"produkt eller kvote pt. er udsolgt eller fuldt reserveret."
|
||||
"Du kan ikke oprette en kupon, hvor det er muligt at vælge en kvote, men hvor "
|
||||
"der ikke er valgt nogen dato."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
#, fuzzy
|
||||
#| msgid "The selected product does not allow to select a seat."
|
||||
msgid "The selected quota does not match the selected subevent."
|
||||
msgstr "Det valgte produkt tillader ikke, at du vælger en plads."
|
||||
msgstr "Den valgte kvote stemmer ikke overens med den valgte underbegivenhed."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "There is not enough quota available on quota \"{}\" to perform the "
|
||||
#| "operation."
|
||||
msgid "There is no sufficient quota available to perform this change."
|
||||
msgstr ""
|
||||
"Der er ikke enheder nok tilbage på kvoten \"{}\" til at udføre denne "
|
||||
"operation."
|
||||
"Der er ikke tilstrækkelig kvote til rådighed til at gennemføre denne ændring."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid ""
|
||||
"Changing the maximum number of usages in bulk is not supported if any of the "
|
||||
"selected vouchers is assigned a seat."
|
||||
msgstr ""
|
||||
"Det er ikke muligt at ændre det maksimale antal anvendelser samlet, hvis en "
|
||||
"af de valgte kuponer er tildelt en plads."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgctxt "subevent"
|
||||
@@ -16765,18 +16686,24 @@ msgid ""
|
||||
"Changing the date in bulk is not supported if any of the selected vouchers "
|
||||
"is assigned a seat."
|
||||
msgstr ""
|
||||
"Det er ikke muligt at ændre datoen for flere billetter på én gang, hvis en "
|
||||
"af de valgte billetter er tildelt en plads."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid ""
|
||||
"Changing the product to a quota is not supported if any of the selected "
|
||||
"vouchers is assigned a seat."
|
||||
msgstr ""
|
||||
"Det er ikke muligt at ændre produktet til en kvote, hvis en af de valgte "
|
||||
"kuponer er tildelt en plads."
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid ""
|
||||
"This change cannot be completed because not all assigned seats of the "
|
||||
"vouchers are still available"
|
||||
msgstr ""
|
||||
"Denne ændring kan ikke gennemføres, da ikke alle de tildelte pladser på "
|
||||
"billetterne stadig er ledige"
|
||||
|
||||
#: pretix/control/forms/vouchers.py
|
||||
msgid "Codes"
|
||||
@@ -17897,16 +17824,12 @@ msgid "The reusable medium has been changed."
|
||||
msgstr "Det genanvendelige medie er blevet udskiftet."
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, fuzzy
|
||||
#| msgid "The new member has been added to the team."
|
||||
msgid "A new ticket has been added to the medium."
|
||||
msgstr "Det nye medlem er blevet føjet til gruppen."
|
||||
msgstr "Der er blevet tilføjet en ny billet til mediet."
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, fuzzy
|
||||
#| msgid "{user} has been removed from the team."
|
||||
msgid "A ticket has been removed from the medium."
|
||||
msgstr "{user} er fjernet fra gruppen."
|
||||
msgstr "En billet er blevet fjernet fra mediet."
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "The medium has been connected to a new ticket."
|
||||
@@ -17918,6 +17841,8 @@ msgid ""
|
||||
"The ticket #{positionid} was exchanged for reusable medium "
|
||||
"{medium_identifier}."
|
||||
msgstr ""
|
||||
"Billetten #{positionid} blev ombyttet til et genanvendeligt medie "
|
||||
"{medium_identifier}."
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
msgid "The medium has been connected to a new gift card."
|
||||
@@ -18328,14 +18253,14 @@ msgid "Payment {local_id} has been confirmed."
|
||||
msgstr "Betalingen {local_id} er blevet bekræftet."
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Payment {local_id} has been canceled."
|
||||
msgstr "Bestillingen er blevet annulleret."
|
||||
msgstr "Betalingen {local_id} er blevet annulleret."
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, fuzzy, python-brace-format
|
||||
#, python-brace-format
|
||||
msgid "Canceling payment {local_id} has failed."
|
||||
msgstr "Bestillingen er blevet annulleret."
|
||||
msgstr "Det lykkedes ikke at annullere betalingen {local_id}."
|
||||
|
||||
#: pretix/control/logdisplay.py
|
||||
#, fuzzy, python-brace-format
|
||||
@@ -21795,54 +21720,51 @@ msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "January"
|
||||
msgstr ""
|
||||
msgstr "januar"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "February"
|
||||
msgstr ""
|
||||
msgstr "februar"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
#, fuzzy
|
||||
msgid "March"
|
||||
msgstr "Marts"
|
||||
msgstr "marts"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "April"
|
||||
msgstr ""
|
||||
msgstr "april"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
#, fuzzy
|
||||
#| msgid "Day"
|
||||
msgid "May"
|
||||
msgstr "Dag"
|
||||
msgstr "maj"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "June"
|
||||
msgstr ""
|
||||
msgstr "juni"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "July"
|
||||
msgstr ""
|
||||
msgstr "juli"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "August"
|
||||
msgstr ""
|
||||
msgstr "august"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "September"
|
||||
msgstr "September"
|
||||
msgstr "september"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "October"
|
||||
msgstr ""
|
||||
msgstr "oktober"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "November"
|
||||
msgstr "November"
|
||||
msgstr "november"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
msgid "December"
|
||||
msgstr "December"
|
||||
msgstr "december"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/global_sysreport.html
|
||||
#, fuzzy
|
||||
|
||||
@@ -7,7 +7,7 @@ msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||
"PO-Revision-Date: 2026-04-22 18:00+0000\n"
|
||||
"PO-Revision-Date: 2026-07-31 18:00+0000\n"
|
||||
"Last-Translator: Nikolai <nikolai@lengefeldt.de>\n"
|
||||
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
"da/>\n"
|
||||
@@ -16,7 +16,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.17\n"
|
||||
"X-Generator: Weblate 2026.7.1\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
|
||||
msgid "Marked as paid"
|
||||
@@ -1306,62 +1306,62 @@ msgstr ""
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "January"
|
||||
msgstr "Januar"
|
||||
msgstr "januar"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "February"
|
||||
msgstr "Februar"
|
||||
msgstr "februar"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "March"
|
||||
msgstr "Marts"
|
||||
msgstr "marts"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "April"
|
||||
msgstr "April"
|
||||
msgstr "april"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "May"
|
||||
msgstr "Maj"
|
||||
msgstr "maj"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "June"
|
||||
msgstr "Juni"
|
||||
msgstr "juni"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "July"
|
||||
msgstr "Juli"
|
||||
msgstr "juli"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "August"
|
||||
msgstr "August"
|
||||
msgstr "august"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "September"
|
||||
msgstr "September"
|
||||
msgstr "september"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "October"
|
||||
msgstr "Oktober"
|
||||
msgstr "oktober"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "November"
|
||||
msgstr "November"
|
||||
msgstr "november"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "December"
|
||||
msgstr "December"
|
||||
msgstr "december"
|
||||
|
||||
#~ msgid "iDEAL"
|
||||
#~ msgstr "iDEAL"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||
"PO-Revision-Date: 2026-07-23 15:35+0000\n"
|
||||
"PO-Revision-Date: 2026-08-01 21:00+0000\n"
|
||||
"Last-Translator: szurofkamarciidfbe08444ef04788 <szurofkamarcii@gmail.com>\n"
|
||||
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"hu/>\n"
|
||||
@@ -1377,10 +1377,8 @@ msgid "Membership type"
|
||||
msgstr "Tagságtípus"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "Purchase time"
|
||||
msgid "Purchase ticket"
|
||||
msgstr "Vásárlás időpontja"
|
||||
msgstr "Jegy vásárlása"
|
||||
|
||||
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||
#: pretix/base/exporters/waitinglist.py pretix/base/forms/questions.py
|
||||
@@ -1397,10 +1395,8 @@ msgid "Start date"
|
||||
msgstr "Kezdő dátum"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "Start time from"
|
||||
msgid "Start time"
|
||||
msgstr "Kezdési időpont ettől"
|
||||
msgstr "Kezdési időpont"
|
||||
|
||||
#: pretix/base/exporters/customers.py pretix/base/exporters/orderlist.py
|
||||
#: pretix/base/exporters/waitinglist.py pretix/base/models/memberships.py
|
||||
@@ -1413,10 +1409,8 @@ msgid "End date"
|
||||
msgstr "Záró dátum"
|
||||
|
||||
#: pretix/base/exporters/customers.py
|
||||
#, fuzzy
|
||||
#| msgid "End: %(time)s"
|
||||
msgid "End time"
|
||||
msgstr "Vége: %(time)s"
|
||||
msgstr "Záró időpont"
|
||||
|
||||
#: pretix/base/exporters/dekodi.py pretix/base/exporters/invoices.py
|
||||
msgctxt "export_category"
|
||||
@@ -4641,10 +4635,6 @@ msgid "This event is remote or partially remote."
|
||||
msgstr "Ez az rendezvény távoli vagy részben távoli."
|
||||
|
||||
#: pretix/base/models/event.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This will be used to let users know if the event is in a different "
|
||||
#| "timezone and let’s us calculate users’ local times."
|
||||
msgid ""
|
||||
"This will be used to let users know if the event is in a different timezone, "
|
||||
"and to let us calculate the local time of a user."
|
||||
@@ -7578,15 +7568,11 @@ msgid "This gift card was used in the meantime. Please try again."
|
||||
msgstr "Ezt az ajándékkártyát időközben felhasználták. Kérjük, próbálja újra."
|
||||
|
||||
#: pretix/base/payment.py
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "This payment provider does not exist or the respective plugin is disabled."
|
||||
msgid ""
|
||||
"This payment provider exists for historical purposes only and is no longer "
|
||||
"usable."
|
||||
msgstr ""
|
||||
"Ez a fizetési szolgáltató nem létezik, vagy a hozzá tartozó bővítmény le van "
|
||||
"tiltva."
|
||||
"Ez a fizetési szolgáltató egy korábbi funkció volt, már nem használható."
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
msgid "Ticket code (barcode content)"
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-30 13:52+0000\n"
|
||||
"PO-Revision-Date: 2026-05-12 04:00+0000\n"
|
||||
"Last-Translator: Stefano Campus <stefano.campus@regione.piemonte.it>\n"
|
||||
"PO-Revision-Date: 2026-08-03 23:00+0000\n"
|
||||
"Last-Translator: \"Luca Sorace \\\"Stranck\\\"\" <strdjn@gmail.com>\n"
|
||||
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix/"
|
||||
"it/>\n"
|
||||
"Language: it\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.17.1\n"
|
||||
"X-Generator: Weblate 2026.7.1\n"
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "English"
|
||||
@@ -149,7 +149,7 @@ msgstr "Spagnolo (America Latina)"
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "Thai"
|
||||
msgstr ""
|
||||
msgstr "Tailandese"
|
||||
|
||||
#: pretix/_base_settings.py
|
||||
msgid "Turkish"
|
||||
@@ -413,7 +413,7 @@ msgstr ""
|
||||
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
|
||||
#, python-format
|
||||
msgid "You've been invited to join %(organizer)s"
|
||||
msgstr ""
|
||||
msgstr "Sei stato invitato ad entrare in %(organizer)s"
|
||||
|
||||
#: pretix/api/serializers/organizer.py pretix/control/views/organizer.py
|
||||
msgid "This user already has been invited for this team."
|
||||
@@ -605,6 +605,9 @@ msgid ""
|
||||
"This includes related events like creation, deletion, opening or closing of "
|
||||
"quotas. No webhook is sent for changes to the resulting availability."
|
||||
msgstr ""
|
||||
"Questo include gli eventi relativi quali la creazione, cancellazione, "
|
||||
"apertura o chiusura delle quote. Nessun webhook verrà inviato per modifiche "
|
||||
"alla disponibilità."
|
||||
|
||||
#: pretix/api/webhooks.py
|
||||
msgid "Shop taken live"
|
||||
@@ -1234,8 +1237,9 @@ msgstr "Indirizzi Email (file di testo)"
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||
#: pretix/presale/views/customer.py
|
||||
#, fuzzy
|
||||
msgid "Memberships"
|
||||
msgstr ""
|
||||
msgstr "Membership"
|
||||
|
||||
#: pretix/base/exporters/customers.py pretix/base/models/customers.py
|
||||
#: pretix/control/templates/pretixcontrol/organizers/customer.html
|
||||
@@ -3030,11 +3034,12 @@ msgid ""
|
||||
"The field \"%(label)s\" may not contain special characters such as "
|
||||
"\"%(chars)s\"."
|
||||
msgstr ""
|
||||
"Il campo \"%(label)s\" non può contenere i caratteri speciali \"%(chars)s\"."
|
||||
|
||||
#: pretix/base/forms/questions.py
|
||||
#, python-format
|
||||
msgid "The field \"%(label)s\" may not contain an URL (%(url)s)."
|
||||
msgstr ""
|
||||
msgstr "Il campo \"%(label)s\" non può contenere un URL (%(url)s)."
|
||||
|
||||
#: pretix/base/forms/questions.py
|
||||
msgctxt "phonenumber"
|
||||
@@ -4272,8 +4277,9 @@ msgid "Ticket type not allowed here"
|
||||
msgstr "Biglietto non consentito qui"
|
||||
|
||||
#: pretix/base/models/checkin.py
|
||||
#, fuzzy
|
||||
msgid "Ticket code is ambiguous on list"
|
||||
msgstr "Codice biglietto ambiguo nella lista"
|
||||
msgstr "Il codice del biglietto è ambiguo sulla lista"
|
||||
|
||||
#: pretix/base/models/checkin.py
|
||||
msgid "Server error"
|
||||
@@ -6167,14 +6173,15 @@ msgid "bounced"
|
||||
msgstr "rimbalzato"
|
||||
|
||||
#: pretix/base/models/media.py
|
||||
#, fuzzy
|
||||
msgctxt "reusable_medium"
|
||||
msgid "Claim token"
|
||||
msgstr ""
|
||||
msgstr "Applica token"
|
||||
|
||||
#: pretix/base/models/media.py
|
||||
msgctxt "reusable_medium"
|
||||
msgid "Label"
|
||||
msgstr ""
|
||||
msgstr "Etichetta"
|
||||
|
||||
#: pretix/base/models/media.py
|
||||
#, fuzzy
|
||||
@@ -6188,6 +6195,9 @@ msgid ""
|
||||
"validity. If multiple tickets are valid at once, this will lead to failed "
|
||||
"check-ins."
|
||||
msgstr ""
|
||||
"Se colleghi più di un biglietto, assicurati che la loro validità non si "
|
||||
"sovrapponga. Se più biglietti sono validi contemporaneamente i check-in "
|
||||
"andranno in errore."
|
||||
|
||||
#: pretix/base/models/memberships.py
|
||||
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
|
||||
@@ -7676,6 +7686,8 @@ msgid ""
|
||||
"This payment provider exists for historical purposes only and is no longer "
|
||||
"usable."
|
||||
msgstr ""
|
||||
"Questo provider di pagamenti esiste per ragioni storiche e non ne è più "
|
||||
"possibile l'utilizzo."
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
msgid "Ticket code (barcode content)"
|
||||
@@ -7843,7 +7855,7 @@ msgstr "Giorno di inizio evento"
|
||||
#: pretix/base/pdf.py pretix/base/services/checkin.py
|
||||
#: pretix/control/forms/filter.py
|
||||
msgid "Friday"
|
||||
msgstr "venerdì"
|
||||
msgstr "Venerdì"
|
||||
|
||||
#: pretix/base/pdf.py
|
||||
msgid "Event end date and time"
|
||||
@@ -8387,7 +8399,7 @@ msgstr "Evento annullato"
|
||||
|
||||
#: pretix/base/services/cancelevent.py
|
||||
msgid "Confirm event cancellation and bulk refund"
|
||||
msgstr ""
|
||||
msgstr "Conferma la cancellazione dell'evento e i rimborsi di tutti gli ordini"
|
||||
|
||||
#: pretix/base/services/cart.py pretix/base/services/modelimport.py
|
||||
#: pretix/base/services/orders.py
|
||||
@@ -9333,6 +9345,8 @@ msgstr "Non è possibile creare un buono senza un codice."
|
||||
msgid ""
|
||||
"Voucher codes must be unique. Code \"{code}\" already exists in this import."
|
||||
msgstr ""
|
||||
"Il codice del voucher deve essere univoco. \"{code}\" esiste già in questo "
|
||||
"import."
|
||||
|
||||
#: pretix/base/services/modelimport.py
|
||||
#, python-brace-format
|
||||
@@ -9341,13 +9355,19 @@ msgid ""
|
||||
msgid_plural ""
|
||||
"Voucher codes must be unique. Import contains existing voucher codes {code}."
|
||||
msgstr[0] ""
|
||||
"Il codice del voucher deve essere univoco. \"{code}\" esiste già in questo "
|
||||
"import."
|
||||
msgstr[1] ""
|
||||
"Il codice dei voucher deve essere univoco. \"{code}\" esiste già in questo "
|
||||
"import."
|
||||
|
||||
#: pretix/base/services/modelimport.py
|
||||
msgid ""
|
||||
"Vouchers could not be imported, probably due to a voucher code already being "
|
||||
"in use."
|
||||
msgstr ""
|
||||
"Non è stato possibile importare i voucher, probabilmente perché il codice di "
|
||||
"un voucher è già in uso."
|
||||
|
||||
#: pretix/base/services/orders.py
|
||||
msgid ""
|
||||
@@ -10267,6 +10287,10 @@ msgid ""
|
||||
"ID in all countries. VAT ID will be required for all business addresses in "
|
||||
"the selected countries."
|
||||
msgstr ""
|
||||
"La partita IVA è opzionale di default, perché non tutte le aziende la "
|
||||
"posseggono in tutte le nazioni. Il codice della partita IVA sarà "
|
||||
"obbligatorio per tutti gli indirizzi aziendali locati nelle nazioni "
|
||||
"selezionate."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Invoice address explanation"
|
||||
@@ -11316,50 +11340,60 @@ msgstr ""
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Customers can change the variation of the products they purchased"
|
||||
msgstr ""
|
||||
msgstr "I clienti potranno cambiare la variation dei prodotti già acquistati"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
#, fuzzy
|
||||
msgid "Customers can change their selected add-on products"
|
||||
msgstr "I clienti non possono più modificare i loro ordini"
|
||||
msgstr "I clienti non potranno più modificare i gli add-on selezionati"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"Only allow changes if the resulting price is higher or equal than the "
|
||||
"previous price."
|
||||
msgstr ""
|
||||
"Permetti le modifiche solamente se il prezzo finale è maggiore o uguale al "
|
||||
"prezzo precedente."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"Only allow changes if the resulting price is higher than the previous price."
|
||||
msgstr ""
|
||||
"Permetti le modifiche solamente se il prezzo finale è maggiore del prezzo "
|
||||
"precedente."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"Only allow changes if the resulting price is equal to the previous price."
|
||||
msgstr ""
|
||||
"Permetti le modifiche solamente se il prezzo finale è uguale al prezzo "
|
||||
"precedente."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"Allow changes regardless of price, as long as no refund is required (i.e. "
|
||||
"the resulting price is not lower than what has already been paid)."
|
||||
msgstr ""
|
||||
"Permetti le modifiche a prescindere del prezzo, a meno che non sia "
|
||||
"necessario un rimborso (Il prezzo finale non è inferiore a quanto il cliente "
|
||||
"ha già pagato)."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Allow changes regardless of price, even if this results in a refund."
|
||||
msgstr ""
|
||||
"Permetti le modifiche a prescindere del prezzo, anche se portano ad un "
|
||||
"rimborso."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Requirement for changed prices"
|
||||
msgstr ""
|
||||
msgstr "Requisiti per il cambiamento di prezzi"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Do not allow changes after"
|
||||
msgstr ""
|
||||
msgstr "Non permettere modifiche dopo il"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Allow change even though the ticket has already been checked in"
|
||||
msgstr ""
|
||||
msgstr "Permetti modifiche anche se il biglietto ha già effettuato il check-in"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
@@ -11369,10 +11403,16 @@ msgid ""
|
||||
"in individually. Use with care, and preferably only in combination with a "
|
||||
"limitation on price changes above."
|
||||
msgstr ""
|
||||
"Di default, le modifiche degli ordini sono disabilitate dopo che è stato "
|
||||
"effettuato il check-in con qualsiasi biglietto contenuto nell'ordine. "
|
||||
"Abilitando questa opzione, disabiliterai questo controllo. Non sarà comunque "
|
||||
"possibile rimuovere un add-on con cui è già stato effettuato un check-in. "
|
||||
"Usa questa opzione con attenzione e, preferibilmente, solamente in "
|
||||
"combinazione con una delle limitazioni sul prezzo elencate sopra."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Allow individual attendees to change their ticket"
|
||||
msgstr ""
|
||||
msgstr "Permetti ai singoli partecipanti di modificare il proprio biglietto"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
@@ -11382,15 +11422,20 @@ msgid ""
|
||||
"total price of the order. Such changes can always only be made by the main "
|
||||
"customer."
|
||||
msgstr ""
|
||||
"Di default, solo la persona che ha effettuato l'ordine di questo biglietto "
|
||||
"può eseguire modifiche. Selezionando questa opzione, anche i singoli "
|
||||
"partecipanti potranno fare cambiamenti. In ogni caso, i singoli partecipanti "
|
||||
"non potranno effettuare operazioni che cambiano il costo dell'ordine. Queste "
|
||||
"operazioni sono possibili solamente per chi originariamente ha creato "
|
||||
"l'ordine."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Customers can cancel their unpaid orders"
|
||||
msgstr ""
|
||||
msgstr "I clienti possono annullare i loro ordini non pagati"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
#, fuzzy
|
||||
msgid "Charge a fixed cancellation fee"
|
||||
msgstr "Cancellazione di"
|
||||
msgstr "Addebita una quota di cancellazione fissa"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
@@ -11398,50 +11443,58 @@ msgid ""
|
||||
"never charged. Note that it will be your responsibility to claim the "
|
||||
"cancellation fee from the user."
|
||||
msgstr ""
|
||||
"Interessa solamente gli ordini con pagamenti in attesa, la quota di "
|
||||
"cancellazione non viene mai addebitata sugli ordini gratuiti. Nota: è tua "
|
||||
"responsabilità collezionare la quota di cancellazione dall'utente."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Charge payment, shipping and service fees"
|
||||
msgstr ""
|
||||
msgstr "Addebita la quota di spedizione, pagamento e servizio"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Charge a percentual cancellation fee"
|
||||
msgstr ""
|
||||
msgstr "Addebita una quota di quota di cancellazione in percentuale"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Do not allow cancellations after"
|
||||
msgstr ""
|
||||
msgstr "Non permettere di annullare gli ordine dopo il"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Customers can cancel their paid orders"
|
||||
msgstr ""
|
||||
msgstr "I clienti possono annullare i loro ordini già pagati"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"Paid money will be automatically paid back if the payment method allows it. "
|
||||
"Otherwise, a manual refund will be created for you to process manually."
|
||||
msgstr ""
|
||||
"Il denaro già incassato sarà automaticamente restituito se il metodo di "
|
||||
"pagamento lo permette. Altrimenti, un rimborso manuale verrà creato così che "
|
||||
"tu possa processarlo manualmente."
|
||||
|
||||
#: pretix/base/settings.py pretix/control/forms/orders.py
|
||||
msgid "Keep a fixed cancellation fee"
|
||||
msgstr ""
|
||||
msgstr "Trattieni una quota di cancellazione fissa"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Keep payment, shipping and service fees"
|
||||
msgstr ""
|
||||
msgstr "Trattieni la quota di spedizione, pagamento e servizio"
|
||||
|
||||
#: pretix/base/settings.py pretix/control/forms/orders.py
|
||||
msgid "Keep a percentual cancellation fee"
|
||||
msgstr ""
|
||||
msgstr "Trattieni una quota di cancellazione in percentuale"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid "Allow customers to voluntarily choose a lower refund"
|
||||
msgstr ""
|
||||
msgstr "Permetti si clienti di scegliere volontariamente un rimborso minore"
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
"With this option enabled, your customers can choose to get a smaller refund "
|
||||
"to support you."
|
||||
msgstr ""
|
||||
"Con questa opzione attiva, i tuoi clienti potranno scegliere di ottenere un "
|
||||
"rimborso minore al dovuto, per effettuare una donazione nei vostri confronti."
|
||||
|
||||
#: pretix/base/settings.py
|
||||
msgid ""
|
||||
@@ -20421,7 +20474,7 @@ msgstr "Abilita webhook"
|
||||
#: pretix/control/templates/pretixcontrol/organizers/device_logs.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/logs.html
|
||||
msgid "No results"
|
||||
msgstr ""
|
||||
msgstr "Nessun risultato"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/mail.html
|
||||
#: pretix/control/templates/pretixcontrol/organizers/mail.html
|
||||
@@ -20462,7 +20515,7 @@ msgstr ""
|
||||
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html
|
||||
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "Modifica"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/event/mail.html
|
||||
#, fuzzy
|
||||
@@ -25479,7 +25532,7 @@ msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
msgid "Text box"
|
||||
msgstr ""
|
||||
msgstr "Riquadro testo"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
#, fuzzy
|
||||
@@ -25520,7 +25573,7 @@ msgstr ""
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
msgstr "Duplicato"
|
||||
|
||||
#: pretix/control/templates/pretixcontrol/pdf/index.html
|
||||
msgid "Undo"
|
||||
@@ -27145,11 +27198,11 @@ msgstr ""
|
||||
|
||||
#: pretix/control/views/dashboards.py
|
||||
msgid "Attendees (ordered)"
|
||||
msgstr ""
|
||||
msgstr "Partecipanti (ordini effettuati)"
|
||||
|
||||
#: pretix/control/views/dashboards.py
|
||||
msgid "Attendees (paid)"
|
||||
msgstr ""
|
||||
msgstr "Partecipanti (ordini pagati)"
|
||||
|
||||
#: pretix/control/views/dashboards.py
|
||||
#, python-brace-format
|
||||
@@ -31650,11 +31703,11 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "Bancontact"
|
||||
msgstr ""
|
||||
msgstr "Bancontact"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "SEPA Direct Debit"
|
||||
msgstr ""
|
||||
msgstr "Addebito diretto SEPA"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid ""
|
||||
@@ -31684,7 +31737,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Przelewy24"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
#, fuzzy
|
||||
@@ -31700,7 +31753,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "WeChat Pay"
|
||||
msgstr ""
|
||||
msgstr "WeChat Pay"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "Swish"
|
||||
@@ -31853,7 +31906,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "giropay"
|
||||
msgstr ""
|
||||
msgstr "giropay"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid ""
|
||||
@@ -31877,7 +31930,7 @@ msgstr ""
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid "iDEAL | Wero"
|
||||
msgstr ""
|
||||
msgstr "iDEAL | Wero"
|
||||
|
||||
#: pretix/plugins/stripe/payment.py
|
||||
msgid ""
|
||||
@@ -33621,9 +33674,8 @@ msgstr ""
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
|
||||
#: pretix/presale/templates/pretixpresale/fragment_modals.html
|
||||
#, fuzzy
|
||||
msgid "Renew reservation"
|
||||
msgstr "Descrizione"
|
||||
msgstr "Rinnova scadenza"
|
||||
|
||||
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html
|
||||
#, fuzzy
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-07-06 15:52+0000\n"
|
||||
"PO-Revision-Date: 2026-03-25 14:14+0000\n"
|
||||
"Last-Translator: Pietro Isotti <isottipietro@gmail.com>\n"
|
||||
"PO-Revision-Date: 2026-08-02 22:00+0000\n"
|
||||
"Last-Translator: \"Luca Sorace \\\"Stranck\\\"\" <strdjn@gmail.com>\n"
|
||||
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
"js/it/>\n"
|
||||
"Language: it\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.16.2\n"
|
||||
"X-Generator: Weblate 2026.7.1\n"
|
||||
|
||||
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js
|
||||
msgid "Marked as paid"
|
||||
@@ -42,93 +42,91 @@ msgstr "Apple Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Itaú"
|
||||
msgstr ""
|
||||
msgstr "Ita"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
#, fuzzy
|
||||
msgid "PayPal Credit"
|
||||
msgstr "PayPal"
|
||||
msgstr "PayPal (Pagamento a rate)"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Credit Card"
|
||||
msgstr ""
|
||||
msgstr "Carta di credito"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "PayPal Pay Later"
|
||||
msgstr ""
|
||||
msgstr "PayPal (Acquista ora, paga dopo)"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "iDEAL | Wero"
|
||||
msgstr ""
|
||||
msgstr "iDEAL | Wero"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "SEPA Direct Debit"
|
||||
msgstr ""
|
||||
msgstr "Addebito diretto SEPA"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Bancontact"
|
||||
msgstr ""
|
||||
msgstr "Bancontact"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "giropay"
|
||||
msgstr ""
|
||||
msgstr "giropay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "SOFORT"
|
||||
msgstr ""
|
||||
msgstr "SOFORT"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
#, fuzzy
|
||||
msgid "eps"
|
||||
msgstr "Si"
|
||||
msgstr "eps"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "MyBank"
|
||||
msgstr ""
|
||||
msgstr "MyBank"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Przelewy24"
|
||||
msgstr ""
|
||||
msgstr "Przelewy24"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Verkkopankki"
|
||||
msgstr ""
|
||||
msgstr "Verkkopankki"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "PayU"
|
||||
msgstr ""
|
||||
msgstr "PayU"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "BLIK"
|
||||
msgstr ""
|
||||
msgstr "BLIK"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Trustly"
|
||||
msgstr ""
|
||||
msgstr "Trustly"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Zimpler"
|
||||
msgstr ""
|
||||
msgstr "Zimpler"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Maxima"
|
||||
msgstr ""
|
||||
msgstr "Maxima"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "OXXO"
|
||||
msgstr ""
|
||||
msgstr "OXXO"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Boleto"
|
||||
msgstr ""
|
||||
msgstr "Boleto"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "WeChat Pay"
|
||||
msgstr ""
|
||||
msgstr "WeChat Pay"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Mercado Pago"
|
||||
msgstr ""
|
||||
msgstr "Mercado Pago"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||
@@ -143,7 +141,7 @@ msgstr "Stiamo processando il tuo pagamento …"
|
||||
|
||||
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js
|
||||
msgid "Payment method unavailable"
|
||||
msgstr ""
|
||||
msgstr "Metodo di pagamento non disponibile"
|
||||
|
||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||
msgid "Placed orders"
|
||||
@@ -155,11 +153,11 @@ msgstr "Ordini pagati"
|
||||
|
||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||
msgid "Attendees (ordered)"
|
||||
msgstr ""
|
||||
msgstr "Partecipanti (ordini effettuati)"
|
||||
|
||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||
msgid "Attendees (paid)"
|
||||
msgstr ""
|
||||
msgstr "Partecipanti (ordini pagati)"
|
||||
|
||||
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js
|
||||
msgid "Total revenue"
|
||||
@@ -239,11 +237,11 @@ msgstr "Eliminato"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||
msgid "Confirmed"
|
||||
msgstr ""
|
||||
msgstr "Confermato"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||
msgid "Approval pending"
|
||||
msgstr ""
|
||||
msgstr "In attesa di approvazione"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||
msgid "Redeemed"
|
||||
@@ -310,12 +308,13 @@ msgid "Order canceled"
|
||||
msgstr "Ordine cancellato"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||
#, fuzzy
|
||||
msgid "Ticket code is ambiguous on list"
|
||||
msgstr ""
|
||||
msgstr "Il codice del biglietto è ambiguo sulla lista"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||
msgid "Order not approved"
|
||||
msgstr ""
|
||||
msgstr "Ordine non approvato"
|
||||
|
||||
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/i18n.ts
|
||||
msgid "Checked-in Tickets"
|
||||
@@ -430,11 +429,11 @@ msgstr "Usa i tasti Ctrl-C per copiare!"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "Modifica"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||
msgid "Visualize"
|
||||
msgstr ""
|
||||
msgstr "Visualizza"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||
msgid ""
|
||||
@@ -442,10 +441,13 @@ msgid ""
|
||||
"or variations are not contained in any of your rule parts so people with "
|
||||
"these tickets will not get in:"
|
||||
msgstr ""
|
||||
"La tua regola filtra sempre per prodotto o variation, ma i seguenti prodotti "
|
||||
"o variation non sono presenti in nessuna parte delle tue regole. Questo "
|
||||
"impedirà alle persone con questi biglietti di poter accedere all'evento:"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/App.vue
|
||||
msgid "Please double-check if this was intentional."
|
||||
msgstr ""
|
||||
msgstr "Per favore, controlla se è stato intenzionale."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "All of the conditions below (AND)"
|
||||
@@ -489,17 +491,17 @@ msgstr "minuti"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Duplicate"
|
||||
msgstr ""
|
||||
msgstr "Duplicato"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgctxt "entry_status"
|
||||
msgid "present"
|
||||
msgstr ""
|
||||
msgstr "Presente"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgctxt "entry_status"
|
||||
msgid "absent"
|
||||
msgstr ""
|
||||
msgstr "Assente"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "is one of"
|
||||
@@ -515,7 +517,7 @@ msgstr "è dopo"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "="
|
||||
msgstr ""
|
||||
msgstr "="
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Product"
|
||||
@@ -535,63 +537,55 @@ msgstr "Data e orario corrente"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
|
||||
msgstr ""
|
||||
msgstr "Giorno corrente della settimana (1 = Lunedì, 7 = Domenica)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Current entry status"
|
||||
msgstr ""
|
||||
msgstr "Stato dell'ingresso corrente"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Number of previous entries"
|
||||
msgstr "Numero di inserimenti precedenti"
|
||||
msgstr "Numero di precedenti ingressi"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Number of previous entries since midnight"
|
||||
msgstr "Numero di inserimenti precedenti fino a mezzanotte"
|
||||
msgstr "Numero di precedenti ingressi fino a mezzanotte"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
#, fuzzy
|
||||
#| msgid "Number of previous entries"
|
||||
msgid "Number of previous entries since"
|
||||
msgstr "Numero di inserimenti precedenti"
|
||||
msgstr "Numero di precedenti ingressi dal"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
#, fuzzy
|
||||
#| msgid "Number of previous entries"
|
||||
msgid "Number of previous entries before"
|
||||
msgstr "Numero di inserimenti precedenti"
|
||||
msgstr "Numero di precedenti ingressi prima del"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Number of days with a previous entry"
|
||||
msgstr "Nunmero di giorni con un inserimento precedente"
|
||||
msgstr "Numero di giorni con un precedente ingresso"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
#, fuzzy
|
||||
#| msgid "Number of days with a previous entry"
|
||||
msgid "Number of days with a previous entry since"
|
||||
msgstr "Nunmero di giorni con un inserimento precedente"
|
||||
msgstr "Numero di giorni con un precedente ingresso dal"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
#, fuzzy
|
||||
#| msgid "Number of days with a previous entry"
|
||||
msgid "Number of days with a previous entry before"
|
||||
msgstr "Nunmero di giorni con un inserimento precedente"
|
||||
msgstr "Numero di giorni con un precedente ingresso prima del"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Minutes since last entry (-1 on first entry)"
|
||||
msgstr ""
|
||||
msgstr "Minuti dall'ultimo ingresso (-1 al primo ingresso)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts
|
||||
msgid "Minutes since first entry (-1 on first entry)"
|
||||
msgstr ""
|
||||
msgstr "Minuti dal primo ingresso (-1 al primo ingresso)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
|
||||
msgid "Error: Product not found!"
|
||||
msgstr ""
|
||||
msgstr "Errore: Prodotto non trovato!"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts
|
||||
msgid "Error: Variation not found!"
|
||||
msgstr ""
|
||||
msgstr "Errore: Variation non trovata!"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||
msgid "Check-in QR"
|
||||
@@ -606,16 +600,12 @@ msgid "Group of objects"
|
||||
msgstr "Gruppo di oggetti"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||
#, fuzzy
|
||||
#| msgid "Text object"
|
||||
msgid "Text object (deprecated)"
|
||||
msgstr "Oggetto testo"
|
||||
msgstr "Oggetto testo (deprecato)"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||
#, fuzzy
|
||||
#| msgid "Text object"
|
||||
msgid "Text box"
|
||||
msgstr "Oggetto testo"
|
||||
msgstr "Riquadro testo"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/editor.js
|
||||
msgid "Barcode area"
|
||||
@@ -662,25 +652,24 @@ msgid "Unknown error."
|
||||
msgstr "Errore sconosciuto."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
#, fuzzy
|
||||
#| msgid "Your color has great contrast and is very easy to read!"
|
||||
msgid "Your color has great contrast and will provide excellent accessibility."
|
||||
msgstr "Il colore scelto ha un ottimo contrasto ed è molto leggibile!"
|
||||
msgstr "Il colore scelto ha un ottimo contrasto ed è molto leggibile."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
#, fuzzy
|
||||
#| msgid "Your color has decent contrast and is probably good-enough to read!"
|
||||
msgid ""
|
||||
"Your color has decent contrast and is sufficient for minimum accessibility "
|
||||
"requirements."
|
||||
msgstr ""
|
||||
"Il colore scelto ha un buon contrasto e probabilmente è abbastanza leggibile!"
|
||||
"Il colore scelto ha un buon contrasto ed è sufficiente per i requisiti di "
|
||||
"accessibilità."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid ""
|
||||
"Your color has insufficient contrast to white. Accessibility of your site "
|
||||
"will be impacted."
|
||||
msgstr ""
|
||||
"Il colore scelto ha un contrasto insufficiente rispetto al bianco. "
|
||||
"L'accessibilità nel tuo sito sarà ridotta."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid "Search query"
|
||||
@@ -700,11 +689,11 @@ msgstr "Solo i selezionati"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid "Enter page number between 1 and %(max)s."
|
||||
msgstr ""
|
||||
msgstr "Inserisci il numero di pagina tra 1 e %(max)s."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid "Invalid page number."
|
||||
msgstr ""
|
||||
msgstr "Numero di pagina invalido."
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/main.js
|
||||
msgid "Use a different name internally"
|
||||
@@ -723,10 +712,8 @@ msgid "Calculating default price…"
|
||||
msgstr "Calcolando il prezzo di default…"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/plugins.js
|
||||
#, fuzzy
|
||||
#| msgid "Search results"
|
||||
msgid "No results"
|
||||
msgstr "Risultati ricerca"
|
||||
msgstr "Nessun risultato"
|
||||
|
||||
#: pretix/static/pretixcontrol/js/ui/question.js
|
||||
msgid "Others"
|
||||
@@ -756,39 +743,33 @@ msgstr "Carrello scaduto"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||
msgid "Your cart is about to expire."
|
||||
msgstr ""
|
||||
msgstr "La selezione nel tuo carrello sta per scadere."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||
msgid "The items in your cart are reserved for you for one minute."
|
||||
msgid_plural "The items in your cart are reserved for you for {num} minutes."
|
||||
msgstr[0] "Gli elementi nel tuo carrello sono riservati per 1 minuto."
|
||||
msgstr[0] "Gli elementi nel tuo carrello sono riservati per un minuto."
|
||||
msgstr[1] "Gli elementi nel tuo carrello sono riservati per {num} minuti."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||
#, fuzzy
|
||||
#| msgid "Cart expired"
|
||||
msgid "Your cart has expired."
|
||||
msgstr "Carrello scaduto"
|
||||
msgstr "Il tuo carrello è scaduto."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The items in your cart are no longer reserved for you. You can still "
|
||||
#| "complete your order as long as they’re available."
|
||||
msgid ""
|
||||
"The items in your cart are no longer reserved for you. You can still "
|
||||
"complete your order as long as they're available."
|
||||
msgstr ""
|
||||
"Gli articoli nel tuo carrello non sono più riservati per te. Puoi ancora "
|
||||
"Gli articoli nel tuo carrello non sono più riservati a te. Puoi ancora "
|
||||
"completare il tuo ordine finché sono disponibili."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||
msgid "Do you want to renew the reservation period?"
|
||||
msgstr ""
|
||||
msgstr "Vuoi rinnovare la scadenza del tuo carrello?"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/cart.js
|
||||
msgid "Renew reservation"
|
||||
msgstr ""
|
||||
msgstr "Rinnova scadenza"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
@@ -807,69 +788,64 @@ msgid "Your local time:"
|
||||
msgstr "Ora locale:"
|
||||
|
||||
#: pretix/static/pretixpresale/js/walletdetection.js
|
||||
#, fuzzy
|
||||
#| msgid "Apple Pay"
|
||||
msgid "Google Pay"
|
||||
msgstr "Apple Pay"
|
||||
msgstr "Google Pay"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
msgstr "Quantità"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Decrease quantity"
|
||||
msgstr ""
|
||||
msgstr "Diminuisci quantità"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Increase quantity"
|
||||
msgstr ""
|
||||
msgstr "Aumenta quantità"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter events by"
|
||||
msgstr ""
|
||||
msgstr "Filtra eventi per"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Filter"
|
||||
msgstr ""
|
||||
msgstr "Filtra"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
msgstr "Prezzo"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Original price: %s"
|
||||
msgstr ""
|
||||
msgstr "Prezzo originale: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "New price: %s"
|
||||
msgstr ""
|
||||
msgstr "Nuovo prezzo: %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Select %s"
|
||||
msgctxt "widget"
|
||||
msgid "Select"
|
||||
msgstr "Seleziona %s"
|
||||
msgstr "Seleziona"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
@@ -926,7 +902,7 @@ msgstr "da %(currency)s %(price)s"
|
||||
#, javascript-format
|
||||
msgctxt "widget"
|
||||
msgid "Image of %s"
|
||||
msgstr ""
|
||||
msgstr "Immagine di %s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
@@ -967,27 +943,21 @@ msgstr "Disponibile solo con voucher"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "currently available: %s"
|
||||
msgctxt "widget"
|
||||
msgid "Not yet available"
|
||||
msgstr "attualmente disponibile: %s"
|
||||
msgstr "Ancora non disponibile"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "Not available anymore"
|
||||
msgstr ""
|
||||
msgstr "Non più disponibile"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "currently available: %s"
|
||||
msgctxt "widget"
|
||||
msgid "Currently not available"
|
||||
msgstr "attualmente disponibile: %s"
|
||||
msgstr "Attualmente non disponibile"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
@@ -1095,18 +1065,17 @@ msgstr "Chiudi"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Resume checkout"
|
||||
msgctxt "widget"
|
||||
msgid "Close checkout"
|
||||
msgstr "Ricarica checkout"
|
||||
msgstr "Finisci checkout"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgctxt "widget"
|
||||
msgid "You cannot cancel this operation. Please wait for loading to finish."
|
||||
msgstr ""
|
||||
"Non puoi annullare questa operazione. Per favore, aspetta che il caricamento "
|
||||
"finisca."
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
@@ -1116,21 +1085,15 @@ msgstr "Continua"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Select variant %s"
|
||||
msgctxt "widget"
|
||||
msgid "Show variants"
|
||||
msgstr "Seleziona variante %s"
|
||||
msgstr "Mostra varianti"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "Select variant %s"
|
||||
msgctxt "widget"
|
||||
msgid "Hide variants"
|
||||
msgstr "Seleziona variante %s"
|
||||
msgstr "Nascondi varianti"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
@@ -1236,37 +1199,37 @@ msgstr "Do"
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Monday"
|
||||
msgstr ""
|
||||
msgstr "Lunedì"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Tuesday"
|
||||
msgstr ""
|
||||
msgstr "Martedì"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Wednesday"
|
||||
msgstr ""
|
||||
msgstr "Mercoledì"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Thursday"
|
||||
msgstr ""
|
||||
msgstr "Giovedì"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Friday"
|
||||
msgstr ""
|
||||
msgstr "Venerdì"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Saturday"
|
||||
msgstr ""
|
||||
msgstr "Sabato"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
msgid "Sunday"
|
||||
msgstr ""
|
||||
msgstr "Domenica"
|
||||
|
||||
#: pretix/static/pretixpresale/js/widget/widget.js
|
||||
#: pretix/static/pretixpresale/widget/src/i18n.ts
|
||||
|
||||
@@ -677,6 +677,8 @@ class PaypalMethod(BasePaymentProvider):
|
||||
raise PaymentException(_('We had trouble communicating with PayPal'))
|
||||
else:
|
||||
pp_captured_order = response.result
|
||||
payment.info = json.dumps(pp_captured_order.dict())
|
||||
payment.save()
|
||||
|
||||
try:
|
||||
ReferencedPayPalObject.objects.get_or_create(order=payment.order, payment=payment, reference=pp_captured_order.id)
|
||||
|
||||
@@ -357,14 +357,13 @@ def webhook(request, *args, **kwargs):
|
||||
if 'resource_type' not in event_json:
|
||||
return HttpResponse("Invalid body, no resource_type given", status=400)
|
||||
|
||||
if event_json['resource_type'] not in ["checkout-order", "refund", "capture"]:
|
||||
return HttpResponse("Not interested in this resource type", status=200)
|
||||
|
||||
# Retrieve the Charge ID of the refunded payment
|
||||
if event_json['resource_type'] == 'refund':
|
||||
if event_json['resource_type'] == 'checkout-order':
|
||||
payloadid = event_json['resource']['id']
|
||||
elif event_json['resource_type'] == 'refund' or event_json['resource_type'] == 'capture':
|
||||
payloadid = get_link(event_json['resource']['links'], 'up')['href'].split('/')[-1]
|
||||
else:
|
||||
payloadid = event_json['resource']['id']
|
||||
return HttpResponse("Not interested in this resource type", status=200)
|
||||
|
||||
refs = [payloadid]
|
||||
if event_json['resource'].get('supplementary_data', {}).get('related_ids', {}).get('order_id'):
|
||||
@@ -424,6 +423,8 @@ def webhook(request, *args, **kwargs):
|
||||
**event_json,
|
||||
'_order_state': sale.dict(),
|
||||
})
|
||||
payment.info = json.dumps(sale.dict())
|
||||
payment.save()
|
||||
|
||||
if payment.state == OrderPayment.PAYMENT_STATE_CONFIRMED and sale['status'] in ('PARTIALLY_REFUNDED', 'REFUNDED', 'COMPLETED'):
|
||||
if event_json['resource_type'] == 'refund':
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import transaction
|
||||
from django_filters.rest_framework import DjangoFilterBackend, FilterSet
|
||||
from django_scopes import scopes_disabled
|
||||
from rest_framework import viewsets
|
||||
@@ -118,6 +119,7 @@ class RuleViewSet(viewsets.ModelViewSet):
|
||||
def get_queryset(self):
|
||||
return Rule.objects.filter(event=self.request.event)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_create(self, serializer):
|
||||
super().perform_create(serializer)
|
||||
serializer.instance.log_action(
|
||||
@@ -128,6 +130,7 @@ class RuleViewSet(viewsets.ModelViewSet):
|
||||
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_update(self, serializer):
|
||||
super().perform_update(serializer)
|
||||
serializer.instance.log_action(
|
||||
@@ -137,6 +140,7 @@ class RuleViewSet(viewsets.ModelViewSet):
|
||||
data=self.request.data
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def perform_destroy(self, instance):
|
||||
instance.log_action(
|
||||
'pretix.plugins.sendmail.rule.deleted',
|
||||
|
||||
@@ -384,8 +384,8 @@ class RuleForm(FormPlaceholderMixin, I18nModelForm):
|
||||
]
|
||||
)
|
||||
|
||||
self._set_field_placeholders('subject', ['event', 'order', 'event_or_subevent', 'position_or_address'])
|
||||
self._set_field_placeholders('template', ['event', 'order', 'event_or_subevent', 'position_or_address'], rich=True)
|
||||
self._set_field_placeholders('subject', ['event', 'order', 'event_or_subevent'])
|
||||
self._set_field_placeholders('template', ['event', 'order', 'event_or_subevent'], rich=True)
|
||||
|
||||
choices = [
|
||||
(Order.STATUS_PAID, _('Paid (or canceled with paid fee)')),
|
||||
|
||||
@@ -657,7 +657,7 @@ class UpdateRule(EventPermissionRequiredMixin, UpdateView):
|
||||
|
||||
for lang in self.request.event.settings.locales:
|
||||
with language(lang, self.request.event.settings.region):
|
||||
placeholders = get_sample_context(self.request.event, ['event', 'order', 'event_or_subevent', 'position_or_address'])
|
||||
placeholders = get_sample_context(self.request.event, ['event', 'order', 'position_or_address'])
|
||||
subject = bleach.clean(self.object.subject.localize(lang), tags=set())
|
||||
preview_subject = prefix_subject(self.request.event, format_map(subject, placeholders), highlight=True)
|
||||
template = self.object.template.localize(lang)
|
||||
|
||||
@@ -147,7 +147,7 @@ def get_font_stylesheet(font_name, organizer: Organizer = None, event: Event = N
|
||||
stylesheet = []
|
||||
font = get_fonts(event)[font_name]
|
||||
for sty, formats in font.items():
|
||||
if sty == 'sample':
|
||||
if sty in ['sample', 'pdf_only']:
|
||||
continue
|
||||
stylesheet.append('@font-face { ')
|
||||
stylesheet.append('font-family: "{}";'.format(font_name))
|
||||
|
||||
@@ -795,6 +795,7 @@ class WidgetAPIProductList(EventListMixin, View):
|
||||
'target_url': eventreverse_absolute(request.event, 'presale:event.index'),
|
||||
'subevent': self.subevent.pk if self.subevent else None,
|
||||
'currency': request.event.currency,
|
||||
'currency_places': settings.CURRENCY_PLACES.get(request.event.currency, 2),
|
||||
'display_net_prices': request.event.settings.display_net_prices,
|
||||
'use_native_spinners': request.event.settings.widget_use_native_spinners,
|
||||
'show_variations_expanded': request.event.settings.show_variations_expanded,
|
||||
|
||||
@@ -380,16 +380,16 @@ Vue.component('pricebox', {
|
||||
},
|
||||
display_price: function () {
|
||||
if (this.$root.display_net_prices) {
|
||||
return floatformat(parseFloat(this.price.net), 2);
|
||||
return floatformat(this.price.net, this.$root.currency_places);
|
||||
} else {
|
||||
return floatformat(parseFloat(this.price.gross), 2);
|
||||
return floatformat(this.price.gross, this.$root.currency_places);
|
||||
}
|
||||
},
|
||||
display_price_nonlocalized: function () {
|
||||
if (this.$root.display_net_prices) {
|
||||
return parseFloat(this.price.net).toFixed(2);
|
||||
return parseFloat(this.price.net).toFixed(this.$root.currency_places);
|
||||
} else {
|
||||
return parseFloat(this.price.gross).toFixed(2);
|
||||
return parseFloat(this.price.gross).toFixed(this.$root.currency_places);
|
||||
}
|
||||
},
|
||||
suggested_price_nonlocalized: function () {
|
||||
@@ -398,9 +398,9 @@ Vue.component('pricebox', {
|
||||
price = this.price;
|
||||
}
|
||||
if (this.$root.display_net_prices) {
|
||||
return parseFloat(price.net).toFixed(2);
|
||||
return parseFloat(price.net).toFixed(this.$root.currency_places);
|
||||
} else {
|
||||
return parseFloat(price.gross).toFixed(2);
|
||||
return parseFloat(price.gross).toFixed(this.$root.currency_places);
|
||||
}
|
||||
},
|
||||
original_price_aria_label: function () {
|
||||
@@ -410,7 +410,7 @@ Vue.component('pricebox', {
|
||||
return django.interpolate(strings.new_price, [this.stripHTML(this.priceline)]);
|
||||
},
|
||||
original_line: function () {
|
||||
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> " + floatformat(parseFloat(this.original_price), 2);
|
||||
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> " + floatformat(this.original_price, this.$root.currency_places);
|
||||
},
|
||||
priceline: function () {
|
||||
if (this.price.gross === "0.00") {
|
||||
@@ -645,19 +645,19 @@ Vue.component('item', {
|
||||
if (this.item.free_price) {
|
||||
return django.interpolate(strings.price_from, {
|
||||
'currency': this.$root.currency,
|
||||
'price': floatformat(this.item.min_price, 2)
|
||||
'price': floatformat(this.item.min_price, this.$root.currency_places)
|
||||
}, true).replace(this.$root.currency, '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + '</span>');
|
||||
} else if (this.item.min_price !== this.item.max_price) {
|
||||
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> "
|
||||
+ floatformat(this.item.min_price, 2) + " – "
|
||||
+ floatformat(this.item.max_price, 2);
|
||||
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> "
|
||||
+ floatformat(this.item.min_price, this.$root.currency_places) + " – "
|
||||
+ floatformat(this.item.max_price, this.$root.currency_places);
|
||||
} else if (this.item.min_price === "0.00" && this.item.max_price === "0.00") {
|
||||
if (this.item.mandatory_priced_addons) {
|
||||
return "\xA0"; // nbsp, because an empty string would cause the HTML element to collapse
|
||||
}
|
||||
return strings.free;
|
||||
} else {
|
||||
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> " + floatformat(this.item.min_price, 2);
|
||||
return '<span class="pretix-widget-pricebox-currency">' + this.$root.currency + "</span> " + floatformat(this.item.min_price, this.$root.currency_places);
|
||||
}
|
||||
},
|
||||
variationsToggleLabel: function () {
|
||||
@@ -1949,6 +1949,7 @@ var shared_root_methods = {
|
||||
root.location = data.location;
|
||||
root.categories = data.items_by_category;
|
||||
root.currency = data.currency;
|
||||
root.currency_places = data.currency_places;
|
||||
root.display_net_prices = data.display_net_prices;
|
||||
root.voucher_explanation_text = data.voucher_explanation_text;
|
||||
root.error = data.error;
|
||||
@@ -1983,6 +1984,7 @@ var shared_root_methods = {
|
||||
}, function (error) {
|
||||
root.categories = [];
|
||||
root.currency = '';
|
||||
root.currency_places = 2;
|
||||
if (error.status === 429) {
|
||||
root.error = strings['loading_error_429'];
|
||||
root.connection_error = true;
|
||||
@@ -2339,6 +2341,7 @@ var create_widget = function (element, html_id=null) {
|
||||
is_button: false,
|
||||
categories: null,
|
||||
currency: null,
|
||||
currency_places: 2,
|
||||
name: null,
|
||||
date_range: null,
|
||||
location: null,
|
||||
|
||||
@@ -22,6 +22,7 @@ export interface ProductListResponse {
|
||||
location?: string
|
||||
items_by_category?: Category[]
|
||||
currency?: string
|
||||
currency_places?: number
|
||||
display_net_prices?: boolean
|
||||
voucher_explanation_text?: string
|
||||
error?: string
|
||||
|
||||
@@ -72,7 +72,7 @@ const pricerange = computed(() => {
|
||||
STRINGS.price_from,
|
||||
{
|
||||
currency: store.currency,
|
||||
price: floatformat(props.item.min_price || '0', 2),
|
||||
price: floatformat(props.item.min_price || '0', store.currency_places),
|
||||
},
|
||||
true
|
||||
).replace(
|
||||
@@ -80,14 +80,14 @@ const pricerange = computed(() => {
|
||||
`<span class="pretix-widget-pricebox-currency">${store.currency}</span>`
|
||||
)
|
||||
} else if (props.item.min_price !== props.item.max_price) {
|
||||
return `<span class="pretix-widget-pricebox-currency">${store.currency}</span> ${floatformat(props.item.min_price || '0', 2)} – ${floatformat(props.item.max_price || '0', 2)}`
|
||||
return `<span class="pretix-widget-pricebox-currency">${store.currency}</span> ${floatformat(props.item.min_price || '0', store.currency_places)} – ${floatformat(props.item.max_price || '0', store.currency_places)}`
|
||||
} else if (props.item.min_price === '0.00' && props.item.max_price === '0.00') {
|
||||
if (props.item.mandatory_priced_addons) {
|
||||
return '\xA0' // nbsp, because an empty string would cause the HTML element to collapse
|
||||
}
|
||||
return STRINGS.free
|
||||
} else {
|
||||
return `<span class="pretix-widget-pricebox-currency">${store.currency}</span> ${floatformat(props.item.min_price || '0', 2)}`
|
||||
return `<span class="pretix-widget-pricebox-currency">${store.currency}</span> ${floatformat(props.item.min_price || '0', store.currency_places)}`
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -25,9 +25,9 @@ const ariaLabelledby = computed(() => `${store.htmlId}-item-label-${props.itemId
|
||||
|
||||
const displayPrice = computed(() => {
|
||||
if (store.displayNetPrices) {
|
||||
return floatformat(parseFloat(props.price.net), 2)
|
||||
return floatformat(props.price.net, store.currency_places)
|
||||
}
|
||||
return floatformat(parseFloat(props.price.gross), 2)
|
||||
return floatformat(props.price.gross, store.currency_places)
|
||||
})
|
||||
|
||||
const displayPriceNonlocalized = computed(() => {
|
||||
@@ -40,15 +40,15 @@ const displayPriceNonlocalized = computed(() => {
|
||||
const suggestedPriceNonlocalized = computed(() => {
|
||||
const price = props.suggestedPrice ?? props.price
|
||||
if (store.displayNetPrices) {
|
||||
return parseFloat(price.net).toFixed(2)
|
||||
return parseFloat(price.net).toFixed(store.currency_places)
|
||||
}
|
||||
return parseFloat(price.gross).toFixed(2)
|
||||
return parseFloat(price.gross).toFixed(store.currency_places)
|
||||
})
|
||||
|
||||
// TODO BAD
|
||||
const originalLine = computed(() => {
|
||||
if (!props.originalPrice) return ''
|
||||
return `<span class="pretix-widget-pricebox-currency">${store.currency}</span> ${floatformat(parseFloat(props.originalPrice), 2)}`
|
||||
return `<span class="pretix-widget-pricebox-currency">${store.currency}</span> ${floatformat(props.originalPrice, store.currency_places)}`
|
||||
})
|
||||
|
||||
// TODO BAD
|
||||
|
||||
@@ -71,6 +71,7 @@ export function createWidgetStore (config: {
|
||||
frontpageText: null as string | null,
|
||||
categories: [] as Category[],
|
||||
currency: '',
|
||||
currency_places: 2,
|
||||
displayNetPrices: false,
|
||||
voucherExplanationText: null as string | null,
|
||||
displayAddToCart: false,
|
||||
@@ -299,6 +300,7 @@ export function createWidgetStore (config: {
|
||||
this.location = data.location ?? null
|
||||
this.categories = data.items_by_category ?? []
|
||||
this.currency = data.currency ?? ''
|
||||
this.currency_places = data.currency_places ?? 2
|
||||
this.displayNetPrices = data.display_net_prices ?? false
|
||||
this.voucherExplanationText = data.voucher_explanation_text ?? null
|
||||
this.error = data.error ?? null
|
||||
@@ -338,6 +340,7 @@ export function createWidgetStore (config: {
|
||||
} catch (e) {
|
||||
this.categories = []
|
||||
this.currency = ''
|
||||
this.currency_places = 2
|
||||
if (e instanceof ApiError && e.status === 429) {
|
||||
this.error = STRINGS.loading_error_429
|
||||
} else {
|
||||
|
||||
@@ -20,13 +20,16 @@
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import base64
|
||||
from datetime import datetime, timezone
|
||||
|
||||
import pytest
|
||||
from cryptography.hazmat.primitives.asymmetric import padding
|
||||
from cryptography.hazmat.primitives.serialization import load_pem_private_key
|
||||
from django_scopes import scopes_disabled
|
||||
from freezegun import freeze_time
|
||||
|
||||
from pretix.base.models import Device
|
||||
from pretix.base.models.devices import DeviceLastSeen
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -386,3 +389,26 @@ def test_device_info_key_sets(device_client, device: Device):
|
||||
base64.b64decode(ks['diversification_key']),
|
||||
padding.PKCS1v15()
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_update_last_seen(device_client, device: Device):
|
||||
assert not DeviceLastSeen.objects.exists()
|
||||
|
||||
with freeze_time("2020-01-10T14:30:00+00:00"):
|
||||
resp = device_client.get('/api/v1/device/info')
|
||||
assert resp.status_code == 200
|
||||
assert device.last_seen.last_seen == datetime(2020, 1, 10, 14, 30, tzinfo=timezone.utc)
|
||||
|
||||
with freeze_time("2020-01-10T14:30:05+00:00"):
|
||||
resp = device_client.get('/api/v1/device/info')
|
||||
assert resp.status_code == 200
|
||||
# No update, interal too short
|
||||
device.last_seen.refresh_from_db()
|
||||
assert device.last_seen.last_seen == datetime(2020, 1, 10, 14, 30, tzinfo=timezone.utc)
|
||||
|
||||
with freeze_time("2020-01-10T14:30:30+00:00"):
|
||||
resp = device_client.get('/api/v1/device/info')
|
||||
assert resp.status_code == 200
|
||||
device.last_seen.refresh_from_db()
|
||||
assert device.last_seen.last_seen == datetime(2020, 1, 10, 14, 30, 30, tzinfo=timezone.utc)
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
import json
|
||||
from datetime import timedelta
|
||||
from decimal import Decimal
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
from django.utils.timezone import now
|
||||
@@ -409,7 +410,8 @@ def test_webhook_mark_paid(env, client, monkeypatch):
|
||||
order.payments.update(state=OrderPayment.PAYMENT_STATE_PENDING)
|
||||
|
||||
pp_order = Result(get_test_order())
|
||||
monkeypatch.setattr("paypalcheckoutsdk.orders.OrdersGetRequest", lambda *args: pp_order)
|
||||
mock_orders_get_request = MagicMock(return_value=pp_order)
|
||||
monkeypatch.setattr("paypalcheckoutsdk.orders.OrdersGetRequest", mock_orders_get_request)
|
||||
monkeypatch.setattr("pretix.plugins.paypal2.payment.PaypalMethod.init_api", init_api)
|
||||
with scopes_disabled():
|
||||
ReferencedPayPalObject.objects.create(order=order, payment=order.payments.first(),
|
||||
@@ -497,7 +499,7 @@ def test_webhook_mark_paid(env, client, monkeypatch):
|
||||
"resource_version": "2.0"
|
||||
}
|
||||
), content_type='application_json')
|
||||
|
||||
mock_orders_get_request.assert_called_once_with('806440346Y391300T')
|
||||
order.refresh_from_db()
|
||||
assert order.status == Order.STATUS_PAID
|
||||
|
||||
|
||||
@@ -35,8 +35,6 @@ def event():
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), live=True,
|
||||
plugins='pretix.plugins.sendmail,tests.testdummy',
|
||||
location='Foo City',
|
||||
date_admission=now().replace(hour=12, minute=30),
|
||||
)
|
||||
return event
|
||||
|
||||
|
||||
@@ -697,6 +697,42 @@ class CartTest(CartTestMixin, TestCase):
|
||||
self.assertIsNone(objs[0].variation)
|
||||
self.assertEqual(objs[0].price, 23)
|
||||
|
||||
def test_free_price_rounding(self):
|
||||
self.ticket.free_price = True
|
||||
self.ticket.save()
|
||||
|
||||
response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
|
||||
'item_%d' % self.ticket.id: '1',
|
||||
'price_%d' % self.ticket.id: '40.1234',
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/?require_cookie=true' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
with scopes_disabled():
|
||||
cr1 = CartPosition.objects.get()
|
||||
assert cr1.listed_price == Decimal('23.00')
|
||||
assert cr1.custom_price_input == Decimal('40.12')
|
||||
assert cr1.price == Decimal('40.12')
|
||||
|
||||
def test_free_price_rounding_jpy(self):
|
||||
self.event.currency = "JPY"
|
||||
self.event.save()
|
||||
self.ticket.free_price = True
|
||||
self.ticket.save()
|
||||
|
||||
response = self.client.post('/%s/%s/cart/add' % (self.orga.slug, self.event.slug), {
|
||||
'item_%d' % self.ticket.id: '1',
|
||||
'price_%d' % self.ticket.id: '40.1234',
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/?require_cookie=true' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
|
||||
with scopes_disabled():
|
||||
cr1 = CartPosition.objects.get()
|
||||
assert cr1.listed_price == Decimal('23.00')
|
||||
assert cr1.custom_price_input == Decimal('40.00')
|
||||
assert cr1.price == Decimal('40.00')
|
||||
|
||||
def test_variation_inactive(self):
|
||||
self.shirt_red.active = False
|
||||
self.shirt_red.save()
|
||||
@@ -3060,6 +3096,31 @@ class CartAddonTest(CartTestMixin, TestCase):
|
||||
assert cp1.addons.count() == 3
|
||||
assert all(a.price == Decimal('12.00') for a in cp1.addons.all())
|
||||
|
||||
@classscope(attr='orga')
|
||||
def test_free_price_rounding(self):
|
||||
self.event.settings.locales = ['de']
|
||||
self.event.settings.locale = 'de'
|
||||
self.event.currency = "JPY"
|
||||
self.event.save()
|
||||
|
||||
self.workshop1.free_price = True
|
||||
self.workshop1.save()
|
||||
cp1 = CartPosition.objects.create(
|
||||
event=self.event, cart_id=self.session_key, item=self.ticket,
|
||||
price=23, expires=now() - timedelta(minutes=10)
|
||||
)
|
||||
|
||||
response = self.client.post('/%s/%s/checkout/addons/' % (self.orga.slug, self.event.slug), {
|
||||
'cp_{}_item_{}'.format(cp1.pk, self.workshop1.pk): '1',
|
||||
'cp_{}_item_{}_price'.format(cp1.pk, self.workshop1.pk): '99,99',
|
||||
}, follow=True)
|
||||
self.assertRedirects(response, '/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug),
|
||||
target_status_code=200)
|
||||
with scopes_disabled():
|
||||
assert cp1.addons.count() == 1
|
||||
assert cp1.addons.first().item == self.workshop1
|
||||
assert cp1.addons.first().price == Decimal('100')
|
||||
|
||||
@classscope(attr='orga')
|
||||
def test_change_number(self):
|
||||
cp1 = CartPosition.objects.create(
|
||||
|
||||
@@ -173,6 +173,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
"frontpage_text": "",
|
||||
"location": "",
|
||||
"currency": "EUR",
|
||||
"currency_places": 2,
|
||||
"show_variations_expanded": False,
|
||||
"display_net_prices": False,
|
||||
"use_native_spinners": False,
|
||||
@@ -379,6 +380,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
"frontpage_text": "",
|
||||
"location": "",
|
||||
"currency": "EUR",
|
||||
"currency_places": 2,
|
||||
"show_variations_expanded": False,
|
||||
"display_net_prices": False,
|
||||
"use_native_spinners": False,
|
||||
@@ -439,6 +441,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
"frontpage_text": "",
|
||||
"location": "",
|
||||
"currency": "EUR",
|
||||
"currency_places": 2,
|
||||
"show_variations_expanded": False,
|
||||
"display_net_prices": False,
|
||||
"use_native_spinners": False,
|
||||
@@ -524,6 +527,7 @@ class WidgetCartTest(CartTestMixin, TestCase):
|
||||
"frontpage_text": "",
|
||||
"location": "",
|
||||
"currency": "EUR",
|
||||
"currency_places": 2,
|
||||
'poweredby': '<a href="https://pretix.eu" target="_blank" rel="noopener">ticketing powered by pretix</a>',
|
||||
"show_variations_expanded": False,
|
||||
"display_net_prices": False,
|
||||
|
||||
Reference in New Issue
Block a user