Compare commits

..

34 Commits

Author SHA1 Message Date
Raphael Michel
4c9032f2a8 Bump version to 2.6.0 2019-04-03 16:02:39 +02:00
Raphael Michel
cae2bb944a Merge pull request #1243 from pretix-translations/weblate-pretix-pretix
Update from Weblate
2019-04-03 15:02:23 +01:00
Raphael Michel
724e745b8d Translated on translate.pretix.eu (German)
Currently translated at 100.0% (3057 of 3057 strings)

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

powered by weblate
2019-04-03 14:02:01 +00:00
Raphael Michel
f4cead1c20 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (3057 of 3057 strings)

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

powered by weblate
2019-04-03 13:26:15 +00:00
Raphael Michel
7cab1924bb Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2019-04-03 15:19:57 +02:00
Raphael Michel
641148fecc Merge pull request #1239 from pretix-translations/weblate-pretix-pretix
Update from Weblate
2019-04-03 14:19:23 +01:00
mussol
9b3860e5fd Translated on translate.pretix.eu (Catalan)
Currently translated at 27.5% (839 of 3047 strings)

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

powered by weblate
2019-04-03 11:13:19 +00:00
mussol
cb9d4c10df Translated on translate.pretix.eu (Catalan)
Currently translated at 22.0% (669 of 3047 strings)

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

powered by weblate
2019-04-03 11:13:19 +00:00
oocf
84105b9585 Translated on translate.pretix.eu (Spanish)
Currently translated at 100.0% (96 of 96 strings)

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

powered by weblate
2019-04-03 11:13:19 +00:00
oocf
3f38caeb24 Translated on translate.pretix.eu (Spanish)
Currently translated at 99.3% (3026 of 3047 strings)

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

powered by weblate
2019-04-03 11:13:19 +00:00
mussol
eae552e474 Translated on translate.pretix.eu (Catalan)
Currently translated at 21.1% (643 of 3047 strings)

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

powered by weblate
2019-04-03 11:13:19 +00:00
mussol
f27c10c2ac Translated on translate.pretix.eu (Catalan)
Currently translated at 8.8% (267 of 3047 strings)

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

powered by weblate
2019-04-03 11:13:19 +00:00
Raphael Michel
abd237b969 Checkout redirection: Respect cart_namespace 2019-04-03 13:12:49 +02:00
Raphael Michel
99c61c9060 Orders API: Add a missing sorting method to the documentation 2019-04-03 11:18:13 +02:00
Raphael Michel
246f307e21 Pin version of pillow (incompatibility with reportlab) 2019-04-02 11:31:01 +02:00
Raphael Michel
1f672e7df2 Fix incorrect test 2019-04-02 11:30:47 +02:00
Raphael Michel
b261a2041a Actually set the revoked flag 2019-04-02 09:44:31 +02:00
Raphael Michel
2d37c6d94d Make device token revokation more explicit 2019-04-02 09:36:07 +02:00
Raphael Michel
e75ae80fb5 REST API: Allow to filter orders by datetime 2019-03-29 17:15:15 +01:00
Raphael Michel
73ec5bac79 Allow to set a custom error message when presale is ended 2019-03-29 16:38:47 +01:00
Raphael Michel
46166159b0 Allow to force order creation through the API 2019-03-28 18:11:06 +01:00
Raphael Michel
598693fab2 Add Chinese as a selectable language 2019-03-28 17:06:28 +01:00
Raphael Michel
2420d884fc Merge pull request #1232 from pretix-translations/weblate-pretix-pretix
Update from Weblate
2019-03-28 16:06:26 +00:00
Raphael Michel
f95005a8d4 Added translation on translate.pretix.eu (Catalan) 2019-03-28 16:04:15 +00:00
Raphael Michel
e773096df3 Added translation on translate.pretix.eu (Catalan) 2019-03-28 16:03:59 +00:00
yichengsd
c42905421d Translated on translate.pretix.eu (Chinese (Simplified))
Currently translated at 100.0% (96 of 96 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/zh_Hans/

powered by weblate
2019-03-28 15:58:20 +00:00
Alvaro Enrique Ruano
46c2e28def Translated on translate.pretix.eu (Spanish)
Currently translated at 99.0% (3018 of 3047 strings)

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

powered by weblate
2019-03-28 15:58:20 +00:00
yichengsd
07bc3df6d3 Translated on translate.pretix.eu (Chinese (Simplified))
Currently translated at 99.8% (3041 of 3047 strings)

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

powered by weblate
2019-03-28 15:58:20 +00:00
Maarten van den Berg
2992c4c48a Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (96 of 96 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/nl_Informal/

powered by weblate
2019-03-28 15:58:20 +00:00
Maarten van den Berg
c53718381e Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (3047 of 3047 strings)

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

powered by weblate
2019-03-28 15:58:20 +00:00
Maarten van den Berg
98e5f0b95d Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 71.9% (69 of 96 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/nl_Informal/

powered by weblate
2019-03-28 15:58:20 +00:00
Maarten van den Berg
7f11f06f3f Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (96 of 96 strings)

Translation: pretix/pretix (frontend)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/nl/

powered by weblate
2019-03-28 15:58:20 +00:00
Raphael Michel
949057a9cc Allow to persist filter attributes in session 2019-03-28 16:58:05 +01:00
Raphael Michel
edd643cc32 Event index: Filter subevent list as well 2019-03-28 16:54:21 +01:00
73 changed files with 23619 additions and 6285 deletions

View File

@@ -373,8 +373,8 @@ List of all orders
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``datetime``, ``code`` and
``status``. Default: ``datetime``
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``datetime``, ``code``,
``last_modified``, and ``status``. Default: ``datetime``
:query string code: Only return orders that match the given order code
:query string status: Only return orders in the given order status (see above)
:query boolean testmode: Only return orders with ``testmode`` set to ``true`` or ``false``
@@ -385,6 +385,7 @@ List of all orders
:query datetime modified_since: Only return orders that have changed since the given date. Be careful: We only
recommend using this in combination with ``testmode=false``, since test mode orders can vanish at any time and
you will not notice it using this method.
:query datetime created_since: Only return orders that have been created since the given date.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:resheader X-Page-Generated: The server time at the beginning of the operation. If you're using this API to fetch
@@ -788,6 +789,8 @@ Creating orders
* ``internal_type``
* ``tax_rule``
* ``force`` (optional). If set to ``true``, quotas will be ignored.
If you want to use add-on products, you need to set the ``positionid`` fields of all positions manually
to incrementing integers starting with ``1``. Then, you can reference one of these
IDs in the ``addon_to`` field of another position. Note that all add_ons for a specific position need to come

View File

@@ -1 +1 @@
__version__ = "2.6.0.dev0"
__version__ = "2.6.0"

View File

@@ -19,7 +19,7 @@ class DeviceTokenAuthentication(TokenAuthentication):
if not device.initialized:
raise exceptions.AuthenticationFailed('Device has not been initialized.')
if not device.api_token:
if device.revoked:
raise exceptions.AuthenticationFailed('Device access has been revoked.')
return AnonymousUser(), device

View File

@@ -457,11 +457,12 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
payment_provider = serializers.CharField(required=True)
payment_info = CompatibleJSONField(required=False)
consume_carts = serializers.ListField(child=serializers.CharField(), required=False)
force = serializers.BooleanField(default=False, required=False)
class Meta:
model = Order
fields = ('code', 'status', 'testmode', 'email', 'locale', 'payment_provider', 'fees', 'comment', 'sales_channel',
'invoice_address', 'positions', 'checkin_attention', 'payment_info', 'consume_carts')
'invoice_address', 'positions', 'checkin_attention', 'payment_info', 'consume_carts', 'force')
def validate_payment_provider(self, pp):
if pp not in self.context['event'].get_payment_providers():
@@ -532,6 +533,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
positions_data = validated_data.pop('positions') if 'positions' in validated_data else []
payment_provider = validated_data.pop('payment_provider')
payment_info = validated_data.pop('payment_info', '{}')
force = validated_data.pop('force', False)
if 'invoice_address' in validated_data:
iadata = validated_data.pop('invoice_address')
@@ -565,29 +567,30 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
errs = [{} for p in positions_data]
for i, pos_data in enumerate(positions_data):
new_quotas = (pos_data.get('variation').quotas.filter(subevent=pos_data.get('subevent'))
if pos_data.get('variation')
else pos_data.get('item').quotas.filter(subevent=pos_data.get('subevent')))
if len(new_quotas) == 0:
errs[i]['item'] = [ugettext_lazy('The product "{}" is not assigned to a quota.').format(
str(pos_data.get('item'))
)]
else:
for quota in new_quotas:
if quota not in quota_avail_cache:
quota_avail_cache[quota] = list(quota.availability())
if not force:
for i, pos_data in enumerate(positions_data):
new_quotas = (pos_data.get('variation').quotas.filter(subevent=pos_data.get('subevent'))
if pos_data.get('variation')
else pos_data.get('item').quotas.filter(subevent=pos_data.get('subevent')))
if len(new_quotas) == 0:
errs[i]['item'] = [ugettext_lazy('The product "{}" is not assigned to a quota.').format(
str(pos_data.get('item'))
)]
else:
for quota in new_quotas:
if quota not in quota_avail_cache:
quota_avail_cache[quota] = list(quota.availability())
if quota_avail_cache[quota][1] is not None:
quota_avail_cache[quota][1] -= 1
if quota_avail_cache[quota][1] < 0:
errs[i]['item'] = [
ugettext_lazy('There is not enough quota available on quota "{}" to perform the operation.').format(
quota.name
)
]
if quota_avail_cache[quota][1] is not None:
quota_avail_cache[quota][1] -= 1
if quota_avail_cache[quota][1] < 0:
errs[i]['item'] = [
ugettext_lazy('There is not enough quota available on quota "{}" to perform the operation.').format(
quota.name
)
]
quotadiff.update(new_quotas)
quotadiff.update(new_quotas)
if any(errs):
raise ValidationError({'positions': errs})

View File

@@ -105,7 +105,7 @@ class RevokeKeyView(APIView):
def post(self, request, format=None):
device = request.auth
device.api_token = None
device.revoked = True
device.save()
device.log_action('pretix.device.revoked', auth=device)

View File

@@ -50,6 +50,7 @@ class OrderFilter(FilterSet):
code = django_filters.CharFilter(field_name='code', lookup_expr='iexact')
status = django_filters.CharFilter(field_name='status', lookup_expr='iexact')
modified_since = django_filters.IsoDateTimeFilter(field_name='last_modified', lookup_expr='gte')
created_since = django_filters.IsoDateTimeFilter(field_name='datetime', lookup_expr='gte')
class Meta:
model = Order

View File

@@ -173,7 +173,6 @@ class BaseQuestionsForm(forms.Form):
initial = None
tz = pytz.timezone(event.settings.timezone)
help_text = rich_text(q.help_text)
default = q.default_value
label = escape(q.question) # django-bootstrap3 calls mark_safe
required = q.required and not self.all_optional
if q.type == Question.TYPE_BOOLEAN:
@@ -186,8 +185,6 @@ class BaseQuestionsForm(forms.Form):
if initial:
initialbool = (initial.answer == "True")
elif default:
initialbool = (default == "True")
else:
initialbool = False
@@ -200,21 +197,21 @@ class BaseQuestionsForm(forms.Form):
field = forms.DecimalField(
label=label, required=required,
help_text=q.help_text,
initial=initial.answer if initial else (default if default else None),
initial=initial.answer if initial else None,
min_value=Decimal('0.00'),
)
elif q.type == Question.TYPE_STRING:
field = forms.CharField(
label=label, required=required,
help_text=help_text,
initial=initial.answer if initial else (default if default else None),
initial=initial.answer if initial else None,
)
elif q.type == Question.TYPE_TEXT:
field = forms.CharField(
label=label, required=required,
help_text=help_text,
widget=forms.Textarea,
initial=initial.answer if initial else (default if default else None),
initial=initial.answer if initial else None,
)
elif q.type == Question.TYPE_CHOICE:
field = forms.ModelChoiceField(
@@ -246,24 +243,21 @@ class BaseQuestionsForm(forms.Form):
field = forms.DateField(
label=label, required=required,
help_text=help_text,
initial=dateutil.parser.parse(initial.answer).date() if initial and initial.answer else (
dateutil.parser.parse(default).date() if default else None),
initial=dateutil.parser.parse(initial.answer).date() if initial and initial.answer else None,
widget=DatePickerWidget(),
)
elif q.type == Question.TYPE_TIME:
field = forms.TimeField(
label=label, required=required,
help_text=help_text,
initial=dateutil.parser.parse(initial.answer).time() if initial and initial.answer else (
dateutil.parser.parse(default).time() if default else None),
initial=dateutil.parser.parse(initial.answer).time() if initial and initial.answer else None,
widget=TimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')),
)
elif q.type == Question.TYPE_DATETIME:
field = SplitDateTimeField(
label=label, required=required,
help_text=help_text,
initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else (
dateutil.parser.parse(default).astimezone(tz) if default else None),
initial=dateutil.parser.parse(initial.answer).astimezone(tz) if initial and initial.answer else None,
widget=SplitDateTimePickerWidget(time_format=get_format_without_seconds('TIME_INPUT_FORMATS')),
)
field.question = q

View File

@@ -1,20 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.13 on 2018-05-31 15:39
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0115_auto_20190323_2238'),
]
operations = [
migrations.AddField(
model_name='question',
name='default_value',
field=models.TextField(blank=True, help_text='The question will be filled with this response by default', null=True, verbose_name='Default answer'),
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 2.1.5 on 2019-04-02 07:22
import django.db.models.deletion
import jsonfallback.fields
from django.db import migrations, models
import pretix.base.models.fields
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0115_auto_20190323_2238'),
]
operations = [
migrations.AddField(
model_name='device',
name='revoked',
field=models.BooleanField(default=False),
),
]

View File

@@ -41,6 +41,7 @@ class Device(LoggedModel):
api_token = models.CharField(max_length=190, unique=True, null=True)
all_events = models.BooleanField(default=False, verbose_name=_("All events (including newly created ones)"))
limit_events = models.ManyToManyField('Event', verbose_name=_("Limit to events"), blank=True)
revoked = models.BooleanField(default=False)
name = models.CharField(
max_length=190,
verbose_name=_('Name')

View File

@@ -963,11 +963,6 @@ class Question(LoggedModel):
'Question', null=True, blank=True, on_delete=models.SET_NULL, related_name='dependent_questions'
)
dependency_value = models.TextField(null=True, blank=True)
default_value = models.TextField(
verbose_name=_('Default answer'),
help_text=_('The question will be filled with this response by default'),
null=True, blank=True,
)
class Meta:
verbose_name = _("Question")
@@ -985,10 +980,6 @@ class Question(LoggedModel):
def clean_identifier(self, code):
Question._clean_identifier(self.event, code, self)
def clean(self):
if self.default_value is not None:
self.clean_answer(self.default_value, check_required=False)
@staticmethod
def _clean_identifier(event, code, instance=None):
qs = Question.objects.filter(event=event, identifier__iexact=code)
@@ -1016,8 +1007,8 @@ class Question(LoggedModel):
def __lt__(self, other) -> bool:
return self.sortkey < other.sortkey
def clean_answer(self, answer, check_required=True):
if self.required and check_required:
def clean_answer(self, answer):
if self.required:
if not answer or (self.type == Question.TYPE_BOOLEAN and answer not in ("true", "True", True)):
raise ValidationError(_('An answer to this question is required to proceed.'))
if not answer:

View File

@@ -101,6 +101,10 @@ DEFAULTS = {
'default': 'False',
'type': bool
},
'presale_has_ended_text': {
'default': '',
'type': LazyI18nString
},
'payment_explanation': {
'default': '',
'type': LazyI18nString

View File

@@ -1049,6 +1049,14 @@ class DisplaySettingsForm(SettingsForm):
required=False,
widget=I18nTextarea
)
presale_has_ended_text = I18nFormField(
label=_("End of presale text"),
required=False,
widget=I18nTextarea,
widget_kwargs={'attrs': {'rows': '2'}},
help_text=_("This text will be shown above the ticket shop once the designated sales timeframe for this event "
"is over. You can use it to describe other options to get a ticket, such as a box office.")
)
voucher_explanation_text = I18nFormField(
label=_("Voucher explanation"),
required=False,

View File

@@ -1,14 +1,8 @@
import datetime
import dateutil
import pytz
from django import forms
from django.core.exceptions import ValidationError
from django.db.models import Max
from django.forms.formsets import DELETION_FIELD_NAME
from django.forms.utils import from_current_timezone, to_current_timezone
from django.urls import reverse
from django.utils import formats
from django.utils.translation import (
pgettext_lazy, ugettext as __, ugettext_lazy as _,
)
@@ -39,63 +33,6 @@ class CategoryForm(I18nModelForm):
]
class AdjustableTypeField(forms.Textarea):
def __init__(self, *args, type=None, **kwargs):
super().__init__(*args, **kwargs)
def format_value(self, value):
if getattr(self, 'type') == 'W' and value:
return str(formats.localize_input(to_current_timezone(dateutil.parser.parse(value))))
elif getattr(self, 'type') == 'D' and value:
return str(formats.localize_input(dateutil.parser.parse(value).date()))
elif getattr(self, 'type') == 'T' and value:
return str(formats.localize_input(dateutil.parser.parse(value).time()))
return super().format_value(value)
def value_from_datadict(self, data, files, name):
if 'type' in data and data['type'] == 'W' and 'default_value_date' in data and 'default_value_time' in data:
d_date = d_time = None
for format in formats.get_format('DATE_INPUT_FORMATS'):
try:
d_date = datetime.datetime.strptime(data['default_value_date'], format).date()
break
except (ValueError, TypeError):
continue
for format in formats.get_format('TIME_INPUT_FORMATS'):
try:
d_time = datetime.datetime.strptime(data['default_value_time'], format).time()
break
except (ValueError, TypeError):
continue
if d_date and d_time:
return from_current_timezone(datetime.datetime.combine(d_date, d_time)).astimezone(pytz.UTC).isoformat()
else:
return None
else:
val = super().value_from_datadict(data, files, name)
if 'type' in data and data['type'] == 'D' and val:
for format in formats.get_format('DATE_INPUT_FORMATS'):
try:
d_date = datetime.datetime.strptime(val, format).date()
val = d_date.isoformat()
break
except (ValueError, TypeError):
continue
elif 'type' in data and data['type'] == 'T' and val:
for format in formats.get_format('TIME_INPUT_FORMATS'):
try:
d_date = datetime.datetime.strptime(val, format).time()
val = d_date.isoformat()
break
except (ValueError, TypeError):
continue
return val
class QuestionForm(I18nModelForm):
question = I18nFormField(
label=_("Question"),
@@ -114,8 +51,6 @@ class QuestionForm(I18nModelForm):
pk=self.instance.pk
)
self.fields['identifier'].required = False
if self.instance:
self.fields['default_value'].widget.type = self.instance.type
self.fields['help_text'].widget.attrs['rows'] = 3
def clean_dependency_question(self):
@@ -145,7 +80,6 @@ class QuestionForm(I18nModelForm):
'help_text',
'type',
'required',
'default_value',
'ask_during_checkin',
'identifier',
'items',
@@ -156,8 +90,7 @@ class QuestionForm(I18nModelForm):
'items': forms.CheckboxSelectMultiple(
attrs={'class': 'scrolling-multiple-choice'}
),
'default_value': AdjustableTypeField(),
'dependency_value': forms.Select
'dependency_value': forms.Select,
}

View File

@@ -11,6 +11,7 @@
<legend>{% trans "Event page" %}</legend>
{% bootstrap_field form.logo_image layout="control" %}
{% bootstrap_field form.frontpage_text layout="control" %}
{% bootstrap_field form.presale_has_ended_text layout="control" %}
{% bootstrap_field form.voucher_explanation_text layout="control" %}
{% bootstrap_field form.show_variations_expanded layout="control" %}
{% bootstrap_field form.meta_noindex layout="control" %}

View File

@@ -107,7 +107,6 @@
<fieldset>
<legend>{% trans "Advanced settings" %}</legend>
{% bootstrap_field form.help_text layout="control" %}
{% bootstrap_field form.default_value layout="control" %}
{% bootstrap_field form.identifier layout="control" %}
{% bootstrap_field form.ask_during_checkin layout="control" %}

View File

@@ -9,6 +9,13 @@
<strong>{% blocktrans %}Are you sure you want remove access for this device?{% endblocktrans %}</strong>
{% trans "All data of this device will stay available, but you can't use the device any more." %}
</p>
<div class="alert alert-warning">
<ul>
<li>{% trans "All data uploaded by this device will stay available online." %}</li>
<li>{% trans "If data (e.g. POS transactions or check-ins) has been created on this device and has not been uploaded, you will no longer be able to upload it." %}</li>
<li>{% trans "If the device software supports it, personal data such as orders will be deleted from the device on the next synchronization attempt. Non-personal data such as event metadata and POS transactions will persist until you uninstall or reset the software manually." %}</li>
</ul>
</div>
<div class="form-group submit-group">
<a href="{% url "control:organizer.devices" organizer=request.organizer.slug %}" class="btn btn-default btn-cancel">
{% trans "Cancel" %}

View File

@@ -756,7 +756,7 @@ class DeviceRevokeView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
def post(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.api_token = None
self.object.revoked = True
self.object.save()
self.object.log_action('pretix.device.revoked', user=self.request.user)
messages.success(request, _('Access for this device has been revoked.'))

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,465 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:68
msgid "Marked as paid"
msgstr ""
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
msgid "Comment:"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Placed orders"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Paid orders"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:12
msgid "Contacting Stripe …"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:56
msgid "Total"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:39
#: pretix/static/pretixbase/js/asynctask.js:95
msgid ""
"Your request has been queued on the server and will now be processed. "
"Depending on the size of your event, this might take up to a few minutes."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:45
#: pretix/static/pretixbase/js/asynctask.js:101
msgid ""
"Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your "
"browser and try again."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:66
#: pretix/static/pretixbase/js/asynctask.js:124
#: pretix/static/pretixcontrol/js/ui/mail.js:23
msgid "An error of type {code} occurred."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:69
msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: "
"{code}"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:115
#: pretix/static/pretixcontrol/js/ui/mail.js:20
msgid "The request took to long. Please try again."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:127
#: pretix/static/pretixcontrol/js/ui/mail.js:25
msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:148
msgid "We are processing your request …"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:156
msgid ""
"We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this "
"page and try again."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:193
#: pretix/static/pretixcontrol/js/ui/main.js:20
msgid "Close message"
msgstr ""
#: pretix/static/pretixcontrol/js/clipboard.js:23
msgid "Copied!"
msgstr ""
#: pretix/static/pretixcontrol/js/clipboard.js:29
msgid "Press Ctrl-C to copy!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:43
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:45
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:249
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:418
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:424
msgid "Text object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:426
msgid "Barcode area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:428
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:430
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:434
msgid "Ticket design"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:687
msgid "Saving failed."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:735
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:749
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/mail.js:18
msgid "An error has occurred."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/mail.js:52
msgid "Generating messages …"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:55
msgid "Unknown error."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:217
msgid "Your color has great contrast and is very easy to read!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:221
msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:225
msgid ""
"Your color has bad contrast for text on white background, please choose a "
"darker shade."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:306
msgid "All"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:307
msgid "None"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:595
msgid "Use a different name internally"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:646
msgid "Click to close"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:42
msgid "Others"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:71
msgid "Count"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:121
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
msgid_plural "({num} more dates)"
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/cart.js:39
msgid "The items in your cart are no longer reserved for you."
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:41
msgid "Cart expired"
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:46
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] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/widget/widget.js:14
msgctxt "widget"
msgid "Sold out"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:15
msgctxt "widget"
msgid "Buy"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16
msgctxt "widget"
msgid "Reserved"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17
msgctxt "widget"
msgid "FREE"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18
msgctxt "widget"
msgid "from %(currency)s %(price)s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
msgctxt "widget"
msgid "currently available: %s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24
msgctxt "widget"
msgid "Only available with a voucher"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25
#, javascript-format
msgctxt "widget"
msgid "minimum amount to order: %s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26
msgctxt "widget"
msgid "Close ticket shop"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27
msgctxt "widget"
msgid "The ticket shop could not be loaded."
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28
msgctxt "widget"
msgid "The cart could not be created. Please try again later"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29
msgctxt "widget"
msgid "Waiting list"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30
msgctxt "widget"
msgid ""
"You currently have an active cart for this event. If you select more "
"products, they will be added to your existing cart."
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32
msgctxt "widget"
msgid "Resume checkout"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33
msgctxt "widget"
msgid ""
"<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
"ticketing powered by pretix</a>"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35
msgctxt "widget"
msgid "Redeem a voucher"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36
msgctxt "widget"
msgid "Redeem"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37
msgctxt "widget"
msgid "Voucher code"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38
msgctxt "widget"
msgid "Close"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39
msgctxt "widget"
msgid "Continue"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40
msgctxt "widget"
msgid "See variations"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41
msgctxt "widget"
msgid "Choose a different event"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2018-04-24 14:22+0000\n"
"Last-Translator: Pernille Thorsen <perth@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-22 15:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-22 15:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-02-20 03:00+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-31 08:00+0000\n"
"Last-Translator: oocf <oswaldocerna@gmail.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
"js/es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.4\n"
"X-Generator: Weblate 3.5.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -220,7 +220,7 @@ msgstr "Usar un nombre diferente internamente"
#: pretix/static/pretixcontrol/js/ui/main.js:646
msgid "Click to close"
msgstr ""
msgstr "Click para cerrar"
#: pretix/static/pretixcontrol/js/ui/question.js:42
msgid "Others"
@@ -232,13 +232,11 @@ msgstr "Cantidad"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr ""
msgstr "Si"
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr "Ninguno"
msgstr "No"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -300,12 +298,12 @@ msgstr "más %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
msgstr "incl. impuestos"
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr ""
msgstr "más impuestos"
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -400,102 +398,100 @@ msgid "See variations"
msgstr "Ver variaciones"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "Usar un nombre diferente internamente"
msgstr "Elige un evento diferente"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr ""
msgstr "Atrás"
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr ""
msgstr "Siguiente mes"
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr ""
msgstr "Mes anterior"
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr ""
msgstr "Me"
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr ""
msgstr "Ma"
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr ""
msgstr "Mie"
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr ""
msgstr "Ju"
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr ""
msgstr "Vi"
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr ""
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr ""
msgstr "Do"
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr ""
msgstr "Enero"
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr ""
msgstr "Febrero"
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr ""
msgstr "Marzo"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr ""
msgstr "Abril"
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr ""
msgstr "Mayo"
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr ""
msgstr "Junio"
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr ""
msgstr "Julio"
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr ""
msgstr "Agosto"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr ""
msgstr "Septiembre"
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr ""
msgstr "Octubre"
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr ""
msgstr "Noviembre"
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr ""
msgstr "Diciembre"
#~ msgid ""
#~ "Your request has been queued on the server and will now be processed. If "

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: French\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2018-10-28 10:23+0000\n"
"Last-Translator: Arnaud Vergnet <keplyx@gmail.com>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-01-02 08:20+0000\n"
"Last-Translator: amefad <fame@libero.it>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"

File diff suppressed because it is too large Load Diff

View File

@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-13 15:49+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-24 05:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
"nl/>\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 3.4\n"
"X-Generator: Weblate 3.5.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -40,7 +40,7 @@ msgstr "Betaalde bestellingen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr "Volledige omzet"
msgstr "Totaalomzet"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:12
msgid "Contacting Stripe …"
@@ -226,13 +226,11 @@ msgstr "Aantal"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr ""
msgstr "Ja"
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr "Geen"
msgstr "Nee"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -294,12 +292,12 @@ msgstr "plus %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
msgstr "incl. belasting"
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr ""
msgstr "excl. belasting"
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -394,102 +392,100 @@ msgid "See variations"
msgstr "Zie variaties"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "Gebruik intern een andere naam"
msgstr "Ander evenement kiezen"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr ""
msgstr "Terug"
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr ""
msgstr "Volgende maand"
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr ""
msgstr "Vorige maand"
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr ""
msgstr "Ma"
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr ""
msgstr "Di"
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr ""
msgstr "Wo"
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr ""
msgstr "Do"
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr ""
msgstr "Vr"
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr ""
msgstr "Za"
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr ""
msgstr "Zo"
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr ""
msgstr "Januari"
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr ""
msgstr "Februari"
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr ""
msgstr "Maart"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr ""
msgstr "April"
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr ""
msgstr "Mei"
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr ""
msgstr "Juni"
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr ""
msgstr "Juli"
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr ""
msgstr "Augustus"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr ""
msgstr "September"
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr ""
msgstr "Oktober"
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr ""
msgstr "November"
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr ""
msgstr "December"
#~ msgid ""
#~ "Your request has been queued on the server and will now be processed. If "

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-13 15:49+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-27 01:00+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
"pretix-js/nl_Informal/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.4\n"
"X-Generator: Weblate 3.5.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -41,7 +41,7 @@ msgstr "Betaalde bestellingen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr "Volledige omzet"
msgstr "Totaalomzet"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:12
msgid "Contacting Stripe …"
@@ -228,13 +228,11 @@ msgstr "Aantal"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr ""
msgstr "Ja"
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr "Geen"
msgstr "Nee"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -296,12 +294,12 @@ msgstr "plus %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
msgstr "incl. belasting"
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr ""
msgstr "excl. belasting"
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -396,99 +394,97 @@ msgid "See variations"
msgstr "Zie variaties"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "Gebruik intern een andere naam"
msgstr "Ander evenement kiezen"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr ""
msgstr "Terug"
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr ""
msgstr "Volgende maand"
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr ""
msgstr "Vorige maand"
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr ""
msgstr "Ma"
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr ""
msgstr "Di"
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr ""
msgstr "Wo"
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr ""
msgstr "Do"
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr ""
msgstr "Vr"
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr ""
msgstr "Za"
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr ""
msgstr "Zo"
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr ""
msgstr "Januari"
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr ""
msgstr "Februari"
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr ""
msgstr "Maart"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr ""
msgstr "April"
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr ""
msgstr "Mei"
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr ""
msgstr "Juni"
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr ""
msgstr "Juli"
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr ""
msgstr "Augustus"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr ""
msgstr "September"
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr ""
msgstr "Oktober"
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr ""
msgstr "November"
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr ""
msgstr "December"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-15 11:19+0000\n"
"Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-19 09:00+0000\n"
"Last-Translator: Vitor Reis <vitor.reis7@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-01-02 08:21+0000\n"
"Last-Translator: Alexey Zh <write2aracon@gmail.com>\n"
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix-"

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2018-09-03 06:36+0000\n"
"Last-Translator: Yunus Fırat Pişkin <firat.piskin@idvlabs.com>\n"
"Language-Team: Turkish <https://translate.pretix.eu/projects/pretix/pretix-"

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-19 09:00+0000\n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-28 14:00+0000\n"
"Last-Translator: yichengsd <sunzl@jxepub.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/zh_Hans/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.4\n"
"X-Generator: Weblate 3.5.1\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -219,13 +219,11 @@ msgstr "数量"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr ""
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr ""
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -283,12 +281,12 @@ msgstr "另加 %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
msgstr "包含税"
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr ""
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -381,102 +379,100 @@ msgid "See variations"
msgstr "查看变化"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "在内部使用一个不同的名称"
msgstr "选择一个不同的活动"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr ""
msgstr "后退"
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr ""
msgstr "下个月"
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr ""
msgstr "上个月"
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr ""
msgstr "周一"
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr ""
msgstr "周二"
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr ""
msgstr "周三"
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr ""
msgstr "周四"
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr ""
msgstr "周五"
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr ""
msgstr "周六"
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr ""
msgstr "周天"
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr ""
msgstr "一月"
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr ""
msgstr "二月"
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr ""
msgstr "三月"
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr ""
msgstr "四月"
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr ""
msgstr "五月"
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr ""
msgstr "六月"
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr ""
msgstr "七月"
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr ""
msgstr "八月"
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr ""
msgstr "九月"
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr ""
msgstr "十月"
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr ""
msgstr "十一月"
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr ""
msgstr "十二月"
#~ msgid "Ja"
#~ msgstr "是"

View File

@@ -110,9 +110,13 @@
{% if not ev.presale_is_running %}
<div class="alert alert-info">
{% if ev.presale_has_ended %}
{% blocktrans trimmed %}
The presale period for this event is over.
{% endblocktrans %}
{% if event.settings.presale_has_ended_text %}
{{ event.settings.presale_has_ended_text|rich_text }}
{% else %}
{% blocktrans trimmed %}
The presale period for this event is over.
{% endblocktrans %}
{% endif %}
{% elif event.settings.presale_start_show_date %}
{% blocktrans trimmed with date=ev.presale_start|date:"SHORT_DATE_FORMAT" time=ev.presale_start|time:"TIME_FORMAT" %}
The presale for this event will start on {{ date }} at {{ time }}.

View File

@@ -426,9 +426,11 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, TemplateView):
)
if self.request.event.settings.redirect_to_checkout_directly:
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.checkout.start')
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.checkout.start',
kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''})
else:
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.index')
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.index',
kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''})
if context['cart_redirect'].startswith('https:'):
context['cart_redirect'] = '/' + context['cart_redirect'].split('/', 3)[3]

View File

@@ -277,7 +277,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
context['years'] = range(now().year - 2, now().year + 3)
else:
context['subevent_list'] = self.request.event.subevents_sorted(
self.request.event.subevents_annotated(self.request.sales_channel)
filter_qs_by_attr(self.request.event.subevents_annotated(self.request.sales_channel), self.request)
)
context['show_cart'] = (
@@ -292,7 +292,8 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
)
)
if self.request.event.settings.redirect_to_checkout_directly:
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.checkout.start')
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.checkout.start',
kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''})
if context['cart_redirect'].startswith('https:'):
context['cart_redirect'] = '/' + context['cart_redirect'].split('/', 3)[3]
else:

View File

@@ -35,6 +35,12 @@ def filter_qs_by_attr(qs, request):
if k.startswith("attr[") and k.endswith("]"):
attrs[k[5:-1]] = v
skey = 'filter_qs_by_attr_{}_{}'.format(request.organizer.pk, request.event.pk if hasattr(request, 'event') else '')
if request.GET.get('attr_persist'):
request.session[skey] = attrs
elif skey in request.session:
attrs = request.session[skey]
props = {
p.name: p for p in request.organizer.meta_properties.filter(
name__in=attrs.keys()

View File

@@ -437,7 +437,10 @@ class WidgetAPIProductList(EventListMixin, View):
if not ev.presale_is_running:
if ev.presale_has_ended:
data['error'] = ugettext('The presale period for this event is over.')
if request.event.settings.presale_has_ended_text:
data['error'] = str(request.event.settings.presale_has_ended_text)
else:
data['error'] = ugettext('The presale period for this event is over.')
elif request.event.settings.presale_start_show_date:
data['error'] = ugettext('The presale for this event will start on %(date)s at %(time)s.') % {
'date': date_format(ev.presale_start.astimezone(request.event.timezone), "SHORT_DATE_FORMAT"),

View File

@@ -395,12 +395,15 @@ ALL_LANGUAGES = [
('pt-br', _('Portuguese (Brazil)')),
('es', _('Spanish')),
('tr', _('Turkish')),
('pl', _('Polish')),
('it', _('Italian')),
('zh-hans', _('Chinese (simplified)')),
]
LANGUAGES_OFFICIAL = {
'en', 'de', 'de-informal'
}
LANGUAGES_INCUBATING = {
'pt-br', 'da'
'pt-br', 'da', 'pl', 'it'
}
if DEBUG:

View File

@@ -93,67 +93,6 @@ $(function () {
show = $("#id_type").val() == "B" && $("#id_required").prop("checked");
$(".alert-required-boolean").toggle(show);
update_default_value_field()
}
function update_default_value_field() {
let input = $('#id_default_value');
let parent = input.parent();
let field = input.prop("tagName") == 'DIV' ? input.children().first() : input;
let common_attrs = ' name="default_value" placeholder="' + field.attr('placeholder') + '" title="' + field.attr('title') + '" id="id_default_value"';
let value = field.val();
switch ($("#id_type").val()) {
case 'N':
input.replaceWith('<input type="number" class="form-control" value="' + value + '" ' + common_attrs + '>');
$('.form-group:has(#id_default_value)').show();
break;
case 'S':
input.replaceWith('<input type="text" maxlength="190" class="form-control" value="' + value + '" ' + common_attrs + '>');
$('.form-group:has(#id_default_value)').show();
break;
case 'T':
input.replaceWith('<textarea cols="40" rows="10" class="form-control" ' + common_attrs + '>' + value + '</textarea>');
$('.form-group:has(#id_default_value)').show();
break;
case 'B':
let checked = (value === 'True' || value === 'on' ? 'checked' : '');
input.replaceWith('<input type="checkbox" ' + common_attrs + ' ' + checked + '>');
$('.form-group:has(#id_default_value)').show();
break;
case 'D':
let dateField = input.replaceWith('<input type="text" class="form-control datepickerfield" value="' + value + '" ' + common_attrs + '>');
form_handlers(parent);
$('.form-group:has(#id_default_value)').show();
break;
case 'H':
let timeField = input.replaceWith('<input type="text" class="form-control timepickerfield" value="' + value + '" ' + common_attrs + '>');
form_handlers(parent);
$('.form-group:has(#id_default_value)').show();
break;
case 'W':
let split = value.split(' ');
let date, time;
if (split.length > 1) {
date = split[0];
time = split[1];
} else {
date = null;
time = null;
}
let dtField = input.replaceWith('<div class="splitdatetimerow" id="id_default_value">\n' +
'<input type="text" class="form-control splitdatetimepart datepickerfield" value="' + date + '" name="default_value_date" placeholder="' + field.attr('placeholder') + '" title="' + field.attr('title') + '">\n' +
'<input type="text" class="form-control splitdatetimepart timepickerfield" value="' + time + '" name="default_value_time" placeholder="' + field.attr('placeholder') + '" title="' + field.attr('title') + '">\n' +
'</div>\n');
form_handlers(parent);
$('.form-group:has(#id_default_value)').show();
break;
default:
// file, choice, and multiple choice are not implemented
$('.form-group:has(#id_default_value)').hide();
input.val('')
}
}
var $val = $("#id_dependency_value");

View File

@@ -10,7 +10,7 @@ django-hierarkey==1.0.*,>=1.0.3
django-filter==2.0.*
reportlab==3.5.*
PyPDF2==1.26.*
Pillow
Pillow==5.*
django-libsass
libsass
django-otp==0.4.*

View File

@@ -97,7 +97,7 @@ setup(
'django-hierarkey==1.0.*,>=1.0.2',
'django-filter==2.0.*',
'reportlab==3.5.*',
'Pillow',
'Pillow==5.*',
'PyPDF2==1.26.*',
'django-libsass',
'libsass',

View File

@@ -72,7 +72,8 @@ def test_device_auth_valid(client, device):
@pytest.mark.django_db
def test_device_auth_revoked(client, device):
client.credentials(HTTP_AUTHORIZATION='Device ' + device.api_token)
device.api_token = None
device.revoked = True
device.save()
resp = client.get('/api/v1/organizers/')
assert resp.status_code == 401
assert str(resp.data['detail']) == "Device access has been revoked."

View File

@@ -145,4 +145,4 @@ def test_revoke_valid(device_client, device: Device):
resp = device_client.post('/api/v1/device/revoke')
assert resp.status_code == 200
device.refresh_from_db()
assert not device.api_token
assert device.revoked

View File

@@ -2295,6 +2295,14 @@ def test_order_create_quota_validation(token_client, organizer, event, item, quo
]
}
res['force'] = True
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
), format='json', data=res
)
assert resp.status_code == 201
@pytest.mark.django_db
def test_order_create_quota_consume_cart(token_client, organizer, event, item, quota, question):

View File

@@ -80,4 +80,4 @@ def test_revoke_device(event, admin_user, admin_team, device, client):
client.get('/control/organizer/dummy/device/{}/revoke'.format(device.pk))
client.post('/control/organizer/dummy/device/{}/revoke'.format(device.pk), {}, follow=True)
device.refresh_from_db()
assert device.api_token is None
assert device.revoked

View File

@@ -251,41 +251,6 @@ class QuestionsTest(ItemFormTest):
form_data)
assert not doc.select(".alert-success")
def test_set_default_value(self):
q = Question.objects.create(event=self.event1, question="What city are you from?", type=Question.TYPE_TEXT,
required=True)
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['default_value'] = 'Heidelberg'
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q.id),
form_data)
assert doc.select(".alert-success")
q.refresh_from_db()
assert q.default_value == 'Heidelberg'
def test_set_default_value_datetime(self):
q = Question.objects.create(event=self.event1, question="What city are you from?", type=Question.TYPE_DATETIME,
required=True)
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['default_value_date'] = '2019-01-01'
form_data['default_value_time'] = '10:00'
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q.id),
form_data)
assert doc.select(".alert-success")
q.refresh_from_db()
assert q.default_value == '2019-01-01T10:00:00+00:00'
def test_set_default_value_invalid(self):
q = Question.objects.create(event=self.event1, question="What city are you from?", type=Question.TYPE_DATE,
required=True)
doc = self.get_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q.id))
form_data = extract_form_fields(doc.select('.container-fluid form')[0])
form_data['default_value'] = 'foobar'
doc = self.post_doc('/control/event/%s/%s/questions/%s/change' % (self.orga1.slug, self.event1.slug, q.id),
form_data)
assert not doc.select(".alert-success")
class QuotaTest(ItemFormTest):

View File

@@ -1985,59 +1985,6 @@ class QuestionsTestCase(BaseCheckoutTestCase, TestCase):
self.q3: 'False',
}, should_fail=True)
def test_datetime_defaultvalues(self):
""" Test timezone and format handling for default values """
q1 = Question.objects.create(
event=self.event, question='When did you wake up today?', type=Question.TYPE_TIME,
required=True, default_value='10:00'
)
q2 = Question.objects.create(
event=self.event, question='When was your last haircut?', type=Question.TYPE_DATE,
required=True, default_value='2019-01-01'
)
q3 = Question.objects.create(
event=self.event, question='When are you going to arrive?', type=Question.TYPE_DATETIME,
required=True, default_value='2019-01-01T10:00:00+00:00'
)
self.ticket.questions.add(q1)
self.ticket.questions.add(q2)
self.ticket.questions.add(q3)
cr = CartPosition.objects.create(
event=self.event, cart_id=self.session_key, item=self.ticket,
price=23, expires=now() + timedelta(minutes=10)
)
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
assert doc.select('input[name="%s-question_%s"]' % (cr.id, q1.id))[0]['value'] == '10:00'
assert doc.select('input[name="%s-question_%s"]' % (cr.id, q2.id))[0]['value'] == '2019-01-01'
assert doc.select('input[name="%s-question_%s_0"]' % (cr.id, q3.id))[0]['value'] == '2019-01-01'
assert doc.select('input[name="%s-question_%s_1"]' % (cr.id, q3.id))[0]['value'] == '10:00'
# set to different timezone, this should affect the datetime question's default value displayed
self.event.settings.set('timezone', 'US/Central')
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
assert doc.select('input[name="%s-question_%s"]' % (cr.id, q1.id))[0]['value'] == '10:00'
assert doc.select('input[name="%s-question_%s"]' % (cr.id, q2.id))[0]['value'] == '2019-01-01'
assert doc.select('input[name="%s-question_%s_0"]' % (cr.id, q3.id))[0]['value'] == '2019-01-01'
assert doc.select('input[name="%s-question_%s_1"]' % (cr.id, q3.id))[0]['value'] == '04:00'
# set locale, this should affect the date format
self.event.settings.set('locales', ['de'])
self.event.save()
response = self.client.get('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), follow=True)
doc = BeautifulSoup(response.rendered_content, "lxml")
assert doc.select('input[name="%s-question_%s"]' % (cr.id, q1.id))[0]['value'] == '10:00'
assert doc.select('input[name="%s-question_%s"]' % (cr.id, q2.id))[0]['value'] == '01.01.2019'
assert doc.select('input[name="%s-question_%s_0"]' % (cr.id, q3.id))[0]['value'] == '01.01.2019'
assert doc.select('input[name="%s-question_%s_1"]' % (cr.id, q3.id))[0]['value'] == '04:00'
class CheckoutBundleTest(BaseCheckoutTestCase, TestCase):
def setUp(self):