Allow to modify answers for pending orders

This commit is contained in:
Raphael Michel
2015-03-14 13:32:56 +01:00
parent a0b9e9a5f9
commit 197fbbd180
13 changed files with 252 additions and 101 deletions

View File

@@ -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'),
),
]

View File

@@ -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,

View File

@@ -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):