diff --git a/doc/api/resources/questions.rst b/doc/api/resources/questions.rst index 512a8ec0d..596ced03d 100644 --- a/doc/api/resources/questions.rst +++ b/doc/api/resources/questions.rst @@ -30,6 +30,7 @@ type string The expected ty * ``D`` – date * ``H`` – time * ``W`` – date and time + * ``CC`` – country code (ISO 3666-1 alpha-2) required boolean If ``true``, the question needs to be filled out. position integer An integer, used for sorting items list of integers List of item IDs this question is assigned to. @@ -72,7 +73,7 @@ dependency_value string The value ``dep .. versionchanged:: 2.7 - The attribute ``hidden`` has been added. + The attribute ``hidden`` and the question type ``CC`` have been added. Endpoints --------- diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index ddf777853..df4dfd98d 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -12,6 +12,7 @@ from django.core.exceptions import ValidationError from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ +from django_countries.fields import CountryField from pretix.base.forms.widgets import ( BusinessBooleanRadio, DatePickerWidget, SplitDateTimePickerWidget, @@ -213,6 +214,14 @@ class BaseQuestionsForm(forms.Form): widget=forms.Textarea, initial=initial.answer if initial else None, ) + elif q.type == Question.TYPE_COUNTRYCODE: + field = CountryField().formfield( + label=label, required=required, + help_text=help_text, + widget=forms.Select, + empty_label='', + initial=initial.answer if initial else None, + ) elif q.type == Question.TYPE_CHOICE: field = forms.ModelChoiceField( queryset=q.options, diff --git a/src/pretix/base/migrations/0119_auto_20190509_0654.py b/src/pretix/base/migrations/0119_auto_20190509_0654.py index 5329eace6..e16ba93f1 100644 --- a/src/pretix/base/migrations/0119_auto_20190509_0654.py +++ b/src/pretix/base/migrations/0119_auto_20190509_0654.py @@ -1,8 +1,9 @@ # Generated by Django 2.2 on 2019-05-09 06:54 -from django.db import migrations, models import django.db.models.deletion import jsonfallback.fields +from django.db import migrations, models + import pretix.base.models.fields diff --git a/src/pretix/base/models/items.py b/src/pretix/base/models/items.py index 7bd5b894b..389460eff 100644 --- a/src/pretix/base/models/items.py +++ b/src/pretix/base/models/items.py @@ -16,6 +16,7 @@ from django.utils.crypto import get_random_string from django.utils.functional import cached_property from django.utils.timezone import is_naive, make_aware, now from django.utils.translation import pgettext_lazy, ugettext_lazy as _ +from django_countries.fields import Country from i18nfield.fields import I18nCharField, I18nTextField from pretix.base.models import fields @@ -912,6 +913,7 @@ class Question(LoggedModel): TYPE_DATE = "D" TYPE_TIME = "H" TYPE_DATETIME = "W" + TYPE_COUNTRYCODE = "CC" TYPE_CHOICES = ( (TYPE_NUMBER, _("Number")), (TYPE_STRING, _("Text (one line)")), @@ -923,6 +925,7 @@ class Question(LoggedModel): (TYPE_DATE, _("Date")), (TYPE_TIME, _("Time")), (TYPE_DATETIME, _("Date and time")), + (TYPE_COUNTRYCODE, _("Country code (ISO 3166-1 alpha-2)")), ) event = models.ForeignKey( @@ -1078,6 +1081,12 @@ class Question(LoggedModel): return dt except: raise ValidationError(_('Invalid datetime input.')) + elif self.type == Question.TYPE_COUNTRYCODE and answer: + c = Country(answer.upper()) + if c.name: + return answer + else: + raise ValidationError(_('Unknown country code.')) return answer diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 7c2b8e75d..567ad297c 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -24,7 +24,7 @@ from django.utils.formats import date_format from django.utils.functional import cached_property from django.utils.timezone import make_aware, now from django.utils.translation import pgettext_lazy, ugettext_lazy as _ -from django_countries.fields import CountryField +from django_countries.fields import Country, CountryField from i18nfield.strings import LazyI18nString from jsonfallback.fields import FallbackJSONField @@ -860,6 +860,8 @@ class QuestionAnswer(models.Model): return date_format(d, "TIME_FORMAT") except ValueError: return self.answer + elif self.question.type == Question.TYPE_COUNTRYCODE and self.answer: + return Country(self.answer).name or self.answer else: return self.answer diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index d814e63b5..bf200e2a6 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -15,6 +15,7 @@ from django.views.generic import ListView from django.views.generic.base import TemplateView from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.edit import DeleteView +from django_countries.fields import Country from pretix.base.forms import I18nFormSet from pretix.base.models import ( @@ -444,6 +445,10 @@ class QuestionView(EventPermissionRequiredMixin, QuestionMixin, ChartContainingV a['alink'] = a['answer'] a['answer'] = ugettext('Yes') if a['answer'] == 'True' else ugettext('No') a['answer_bool'] = a['answer'] == 'True' + elif self.object.type == Question.TYPE_COUNTRYCODE: + for a in qs: + a['alink'] = a['answer'] + a['answer'] = Country(a['answer']).name or a['answer'] return list(qs)