Persist and show full "path" of seats

This commit is contained in:
Raphael Michel
2019-07-29 15:23:09 +02:00
parent 79ee851fae
commit a664d51dbc
4 changed files with 82 additions and 7 deletions

View File

@@ -0,0 +1,31 @@
# Generated by Django 2.2.1 on 2019-07-29 13:11
import django.db.models.deletion
from django.db import migrations, models
import pretix.base.models.fields
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0129_auto_20190724_1548'),
]
operations = [
migrations.AddField(
model_name='seat',
name='row_name',
field=models.CharField(default='', max_length=190),
),
migrations.AddField(
model_name='seat',
name='seat_number',
field=models.CharField(default='', max_length=190),
),
migrations.AddField(
model_name='seat',
name='zone_name',
field=models.CharField(default='', max_length=190),
),
]

View File

@@ -7,7 +7,7 @@ from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.utils.deconstruct import deconstructible from django.utils.deconstruct import deconstructible
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext, ugettext_lazy as _
from pretix.base.models import Event, Item, LoggedModel, Organizer, SubEvent from pretix.base.models import Event, Item, LoggedModel, Organizer, SubEvent
@@ -39,7 +39,7 @@ class SeatingPlan(LoggedModel):
layout = models.TextField(validators=[SeatingPlanLayoutValidator()]) layout = models.TextField(validators=[SeatingPlanLayoutValidator()])
Category = namedtuple('Categrory', 'name') Category = namedtuple('Categrory', 'name')
RawSeat = namedtuple('Seat', 'name guid number row category') RawSeat = namedtuple('Seat', 'name guid number row category zone')
def __str__(self): def __str__(self):
return self.name return self.name
@@ -67,6 +67,7 @@ class SeatingPlan(LoggedModel):
guid=s['seat_guid'], guid=s['seat_guid'],
name='{} {}'.format(r['row_number'], s['seat_number']), # TODO: Zone? Variable scheme? name='{} {}'.format(r['row_number'], s['seat_number']), # TODO: Zone? Variable scheme?
row=r['row_number'], row=r['row_number'],
zone=z['name'],
category=s['category'] category=s['category']
) )
@@ -90,12 +91,24 @@ class Seat(models.Model):
event = models.ForeignKey(Event, related_name='seats', on_delete=models.CASCADE) event = models.ForeignKey(Event, related_name='seats', on_delete=models.CASCADE)
subevent = models.ForeignKey(SubEvent, null=True, blank=True, related_name='seats', on_delete=models.CASCADE) subevent = models.ForeignKey(SubEvent, null=True, blank=True, related_name='seats', on_delete=models.CASCADE)
name = models.CharField(max_length=190) name = models.CharField(max_length=190)
zone_name = models.CharField(max_length=190, blank=True, default="")
row_name = models.CharField(max_length=190, blank=True, default="")
seat_number = models.CharField(max_length=190, blank=True, default="")
seat_guid = models.CharField(max_length=190, db_index=True) seat_guid = models.CharField(max_length=190, db_index=True)
product = models.ForeignKey('Item', null=True, blank=True, related_name='seats', on_delete=models.CASCADE) product = models.ForeignKey('Item', null=True, blank=True, related_name='seats', on_delete=models.CASCADE)
blocked = models.BooleanField(default=False) blocked = models.BooleanField(default=False)
def __str__(self): def __str__(self):
return self.name parts = []
if self.zone_name:
parts.append(self.zone_name)
if self.row_name:
parts.append(gettext('Row {number}').format(number=self.row_name))
if self.seat_number:
parts.append(gettext('Seat {number}').format(number=self.seat_number))
if not parts:
return self.name
return ', '.join(parts)
def is_available(self, ignore_cart=None, ignore_orderpos=None): def is_available(self, ignore_cart=None, ignore_orderpos=None):
from .orders import Order from .orders import Order

View File

@@ -239,10 +239,25 @@ DEFAULT_VARIABLES = OrderedDict((
) if ev.date_admission else "" ) if ev.date_admission else ""
}), }),
("seat", { ("seat", {
"label": _("Seat name"), "label": _("Seat: Full name"),
"editor_sample": _("3, 4-5"), "editor_sample": _("Ground floor, Row 3, Seat 4"),
"evaluate": lambda op, order, ev: str(op.seat if op.seat else _('General admission')) "evaluate": lambda op, order, ev: str(op.seat if op.seat else _('General admission'))
}), }),
("seat_zone", {
"label": _("Seat: zone"),
"editor_sample": _("Ground floor"),
"evaluate": lambda op, order, ev: str(op.seat.zone_name if op.seat else _('General admission'))
}),
("seat_row", {
"label": _("Seat: row"),
"editor_sample": "3",
"evaluate": lambda op, order, ev: str(op.seat.row_name if op.seat else "")
}),
("seat_number", {
"label": _("Seat: seat number"),
"editor_sample": 4,
"evaluate": lambda op, order, ev: str(op.seat.number if op.seat else "")
}),
)) ))

View File

@@ -29,14 +29,27 @@ def generate_seats(event, subevent, plan, mapping):
s.seat_guid: s for s in s.seat_guid: s for s in
event.seats.select_related('product').annotate(has_op=Count('orderposition')).filter(subevent=subevent) event.seats.select_related('product').annotate(has_op=Count('orderposition')).filter(subevent=subevent)
} }
def update(o, a, v):
if getattr(o, a) != v:
setattr(o, a, v)
return True
return False
create_seats = [] create_seats = []
if plan: if plan:
for ss in plan.iter_all_seats(): for ss in plan.iter_all_seats():
p = mapping.get(ss.category) p = mapping.get(ss.category)
if ss.guid in current_seats: if ss.guid in current_seats:
seat = current_seats.pop(ss.guid) seat = current_seats.pop(ss.guid)
if seat.product != p: updated = any([
seat.product = p update(seat, 'product', p),
update(seat, 'name', ss.name),
update(seat, 'row_name', ss.row),
update(seat, 'seat_number', ss.number),
update(seat, 'zone_name', ss.zone),
])
if updated:
seat.save() seat.save()
else: else:
create_seats.append(Seat( create_seats.append(Seat(
@@ -44,6 +57,9 @@ def generate_seats(event, subevent, plan, mapping):
subevent=subevent, subevent=subevent,
seat_guid=ss.guid, seat_guid=ss.guid,
name=ss.name, name=ss.name,
row_name=ss.row,
seat_number=ss.number,
zone_name=ss.zone,
product=p, product=p,
)) ))