diff --git a/src/pretix/base/migrations/0018_auto_20150314_1232.py b/src/pretix/base/migrations/0018_auto_20150314_1232.py new file mode 100644 index 000000000..e9311f609 --- /dev/null +++ b/src/pretix/base/migrations/0018_auto_20150314_1232.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import versions.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0017_auto_20150308_1507'), + ] + + operations = [ + migrations.AlterField( + model_name='order', + name='status', + field=models.CharField(verbose_name='Status', choices=[('p', 'pending'), ('n', 'paid'), ('e', 'expired'), ('c', 'cancelled'), ('r', 'refunded')], max_length=3), + ), + migrations.AlterField( + model_name='orderposition', + name='order', + field=versions.models.VersionedForeignKey(verbose_name='Order', to='pretixbase.Order', related_name='positions'), + ), + ] diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index 79bc6035e..3b5d9f737 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -1,3 +1,4 @@ +from datetime import datetime from itertools import product import copy import uuid @@ -1327,6 +1328,19 @@ class Order(Versionable): self.code = code return + @property + def can_modify_answers(self): + if self.status not in (Order.STATUS_PENDING, Order.STATUS_PAID, Order.STATUS_EXPIRED): + return False + modify_deadline = self.event.settings.get('last_order_modification_date', as_type=datetime) + if modify_deadline is not None and now() > modify_deadline: + return False + ask_names = self.event.settings.get('attendee_names_asked', as_type=bool) + for cp in self.positions.all().prefetch_related('item__questions'): + if (cp.item.admission and ask_names) or cp.item.questions.all(): + return True + return False # nothing there to modify + class QuestionAnswer(Versionable): """ @@ -1376,7 +1390,8 @@ class OrderPosition(ObjectWithAnswers, Versionable): """ order = VersionedForeignKey( Order, - verbose_name=_("Order") + verbose_name=_("Order"), + related_name='positions' ) item = VersionedForeignKey( Item, diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index ab600997f..6f77802e9 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -1,6 +1,8 @@ +from datetime import datetime, date, time import json import decimal +import dateutil.parser from django.db.models import Model from versions.models import Versionable @@ -11,6 +13,7 @@ DEFAULTS = { 'attendee_names_asked': 'True', 'attendee_names_required': 'False', 'reservation_time': '30', + 'last_order_modification_date': None, } @@ -51,6 +54,12 @@ class SettingsProxy: return json.loads(value) elif as_type == bool: return value == 'True' + elif as_type == datetime: + return dateutil.parser.parse(value) + elif as_type == date: + return dateutil.parser.parse(value).date() + elif as_type == time: + return dateutil.parser.parse(value).time() elif as_type == decimal.Decimal: return decimal.Decimal(value) elif issubclass(as_type, Versionable): @@ -67,6 +76,8 @@ class SettingsProxy: return str(value) elif isinstance(value, list) or isinstance(value, dict): return json.dumps(value) + elif isinstance(value, datetime) or isinstance(value, date) or isinstance(value, time): + return value.isoformat() elif isinstance(value, Versionable): return value.identity elif isinstance(value, Model): diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html b/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html index 206f7fe5f..b9485f7a2 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html @@ -12,16 +12,16 @@