forked from CGM_Public/pretix_original
Seating: Support custom row and seat labels
This commit is contained in:
28
src/pretix/base/migrations/0143_auto_20200217_1211.py
Normal file
28
src/pretix/base/migrations/0143_auto_20200217_1211.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Generated by Django 2.2.4 on 2020-02-17 12:11
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('pretixbase', '0142_auto_20191215_1522'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='seat',
|
||||||
|
name='row_label',
|
||||||
|
field=models.CharField(max_length=190, null=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='seat',
|
||||||
|
name='seat_label',
|
||||||
|
field=models.CharField(max_length=190, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='giftcard',
|
||||||
|
name='secret',
|
||||||
|
field=models.CharField(db_index=True, max_length=190),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -40,7 +40,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 zone sorting_rank')
|
RawSeat = namedtuple('Seat', 'name guid number row category zone sorting_rank row_label seat_label')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
@@ -69,11 +69,17 @@ class SeatingPlan(LoggedModel):
|
|||||||
# optimization, because this way we do not need to update the rank of very seat if we change a plan a little.
|
# optimization, because this way we do not need to update the rank of very seat if we change a plan a little.
|
||||||
for zi, z in enumerate(self.layout_data['zones']):
|
for zi, z in enumerate(self.layout_data['zones']):
|
||||||
for ri, r in enumerate(z['rows']):
|
for ri, r in enumerate(z['rows']):
|
||||||
|
row_label = None
|
||||||
|
if r.get('row_label'):
|
||||||
|
row_label = r['row_label'].replace("%s", r.get('row_number', str(ri)))
|
||||||
try:
|
try:
|
||||||
row_rank = int(r['row_number'])
|
row_rank = int(r['row_number'])
|
||||||
except ValueError:
|
except ValueError:
|
||||||
row_rank = ri
|
row_rank = ri
|
||||||
for si, s in enumerate(r['seats']):
|
for si, s in enumerate(r['seats']):
|
||||||
|
seat_label = None
|
||||||
|
if r.get('seat_label'):
|
||||||
|
seat_label = r['seat_label'].replace("%s", s.get('seat_number', str(si)))
|
||||||
try:
|
try:
|
||||||
seat_rank = int(s['seat_number'])
|
seat_rank = int(s['seat_number'])
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@@ -87,6 +93,8 @@ 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'],
|
||||||
|
row_label=row_label,
|
||||||
|
seat_label=seat_label,
|
||||||
zone=z['name'],
|
zone=z['name'],
|
||||||
category=s['category'],
|
category=s['category'],
|
||||||
sorting_rank=rank
|
sorting_rank=rank
|
||||||
@@ -114,7 +122,9 @@ class Seat(models.Model):
|
|||||||
name = models.CharField(max_length=190)
|
name = models.CharField(max_length=190)
|
||||||
zone_name = models.CharField(max_length=190, blank=True, default="")
|
zone_name = models.CharField(max_length=190, blank=True, default="")
|
||||||
row_name = models.CharField(max_length=190, blank=True, default="")
|
row_name = models.CharField(max_length=190, blank=True, default="")
|
||||||
|
row_label = models.CharField(max_length=190, null=True)
|
||||||
seat_number = models.CharField(max_length=190, blank=True, default="")
|
seat_number = models.CharField(max_length=190, blank=True, default="")
|
||||||
|
seat_label = models.CharField(max_length=190, null=True)
|
||||||
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)
|
||||||
@@ -127,10 +137,17 @@ class Seat(models.Model):
|
|||||||
parts = []
|
parts = []
|
||||||
if self.zone_name:
|
if self.zone_name:
|
||||||
parts.append(self.zone_name)
|
parts.append(self.zone_name)
|
||||||
if self.row_name:
|
|
||||||
|
if self.row_label:
|
||||||
|
parts.append(self.row_label)
|
||||||
|
elif self.row_name:
|
||||||
parts.append(gettext('Row {number}').format(number=self.row_name))
|
parts.append(gettext('Row {number}').format(number=self.row_name))
|
||||||
if self.seat_number:
|
|
||||||
|
if self.seat_label:
|
||||||
|
parts.append(self.seat_label)
|
||||||
|
elif self.seat_number:
|
||||||
parts.append(gettext('Seat {number}').format(number=self.seat_number))
|
parts.append(gettext('Seat {number}').format(number=self.seat_number))
|
||||||
|
|
||||||
if not parts:
|
if not parts:
|
||||||
return self.name
|
return self.name
|
||||||
return ', '.join(parts)
|
return ', '.join(parts)
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ def generate_seats(event, subevent, plan, mapping):
|
|||||||
update(seat, 'seat_number', ss.number),
|
update(seat, 'seat_number', ss.number),
|
||||||
update(seat, 'zone_name', ss.zone),
|
update(seat, 'zone_name', ss.zone),
|
||||||
update(seat, 'sorting_rank', ss.sorting_rank),
|
update(seat, 'sorting_rank', ss.sorting_rank),
|
||||||
|
update(seat, 'row_label', ss.row_label),
|
||||||
|
update(seat, 'seat_label', ss.seat_label),
|
||||||
])
|
])
|
||||||
if updated:
|
if updated:
|
||||||
seat.save()
|
seat.save()
|
||||||
@@ -78,6 +80,8 @@ def generate_seats(event, subevent, plan, mapping):
|
|||||||
seat_number=ss.number,
|
seat_number=ss.number,
|
||||||
zone_name=ss.zone,
|
zone_name=ss.zone,
|
||||||
sorting_rank=ss.sorting_rank,
|
sorting_rank=ss.sorting_rank,
|
||||||
|
row_label=ss.row_label,
|
||||||
|
seat_label=ss.seat_label,
|
||||||
product=p,
|
product=p,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["zones", "name", "categories"],
|
"required": ["zones", "name", "categories", "size"],
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
"definitions": {
|
"definitions": {
|
||||||
"zone": {
|
"zone": {
|
||||||
@@ -69,6 +69,14 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "Row number or name by which it can be identified"
|
"description": "Row number or name by which it can be identified"
|
||||||
},
|
},
|
||||||
|
"row_label": {
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"description": "Human-readable name for the row. May include %s as a placeholder for the row_number value. Not used for rendering the plan, but for describing the seats in text."
|
||||||
|
},
|
||||||
|
"seat_label": {
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"description": "Human-readable name for the seats in this. May include %s as a placeholder for the seat_number values. Not used for rendering the plan, but for describing the seats in text."
|
||||||
|
},
|
||||||
"seats": {
|
"seats": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"description": "List of seats in this row",
|
"description": "List of seats in this row",
|
||||||
|
|||||||
Reference in New Issue
Block a user