Skip to content
Snippets Groups Projects
Verified Commit 486dc5ee authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Allow negative values for seat positions

parent eb08c7bd
No related branches found
No related tags found
1 merge request!2Views
......@@ -65,6 +65,9 @@ class SeatForm(ExtensibleForm):
)
x = forms.IntegerField(initial=0, widget=forms.HiddenInput(attrs={"class": "x-input"}))
y = forms.IntegerField(initial=0, widget=forms.HiddenInput(attrs={"class": "y-input"}))
seated = forms.BooleanField(
initial=False, widget=forms.HiddenInput(attrs={"class": "seated-input"}), required=False
)
class Meta:
model = Seat
......
from collections import OrderedDict
from django.db.models import Max, Q, QuerySet
from django.db.models import Max, Min, QuerySet
from aleksis.core.managers import CurrentSiteManagerWithoutMigrations
......@@ -14,29 +14,36 @@ class SeatQuerySet(QuerySet):
def get_constraints(self) -> (int, int):
"""Get the width and height the grid needs at least."""
aggr = self.aggregate(Max("x"), Max("y"))
aggr = self.aggregate(Max("x"), Max("y"), Min("x"), Min("y"))
width = max(10, aggr["x__max"] or 0)
height = max(10, aggr["y__max"] or 0)
start_x = aggr["x__min"] or 0
start_y = aggr["y__min"] or 0
end_x = aggr["x__max"] or 0
end_y = aggr["y__max"] or 0
width = max(10, end_x - start_x)
height = max(10, end_y - start_y)
return width, height
end_x = start_x + width
end_y = start_y + height
return start_x, start_y, end_x, end_y
def without_position(self) -> "SeatQuerySet":
"""Filter for seats without a position."""
return self.filter(Q(x__lt=0) | Q(y__lt=0))
return self.filter(seated=False)
def build_grid(self) -> OrderedDict[int, OrderedDict[int, "Seat"]]:
"""Build a grid with the seats as dictionaries."""
width, height = self.get_constraints()
start_x, start_y, end_x, end_y = self.get_constraints()
grid = OrderedDict()
for x in range(width):
for x in range(start_x, end_x + 1):
grid[x] = OrderedDict()
for y in range(height):
for y in range(start_x, end_y + 1):
grid[x][y] = None
for seat in self.all():
if seat.x < 0 or seat.y < 0:
if not seat.seated:
continue
grid[seat.x][seat.y] = seat
......
# Generated by Django 3.2.12 on 2022-03-20 10:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('stoelindeling', '0002_seat_auto_create'),
]
operations = [
migrations.AlterModelManagers(
name='seat',
managers=[
],
),
migrations.AddField(
model_name='seat',
name='seated',
field=models.BooleanField(default=False, verbose_name='Seated'),
),
migrations.AlterField(
model_name='seat',
name='x',
field=models.IntegerField(default=0, verbose_name='X position'),
),
migrations.AlterField(
model_name='seat',
name='y',
field=models.IntegerField(default=0, verbose_name='Y position'),
),
]
......@@ -51,8 +51,10 @@ class Seat(ExtensibleModel):
person = models.ForeignKey(
Person, on_delete=models.CASCADE, verbose_name=_("Person"), related_name="seats"
)
x = models.IntegerField(verbose_name=_("X position"), default=-1)
y = models.IntegerField(verbose_name=_("Y position"), default=-1)
x = models.IntegerField(verbose_name=_("X position"), default=0)
y = models.IntegerField(verbose_name=_("Y position"), default=0)
seated = models.BooleanField(verbose_name=_("Seated"), default=False)
class Meta:
verbose_name = _("Seat")
......
......@@ -7,13 +7,16 @@ function setPosition(event) {
let sel = $("#seating-plan-form input[value=" + pk + "].pk-input");
let x = sel.nextAll("input.x-input").first();
let y = sel.nextAll("input.y-input").first();
let seated = sel.nextAll("input.seated-input").first();
if (parent.hasClass("seat-grid-cell")) {
x.val(xPos);
y.val(yPos);
seated.val("True");
} else {
x.val("-1");
y.val("-1");
x.val("0");
y.val("0");
seated.val("False");
}
}
......
......@@ -60,7 +60,15 @@ class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView):
initial = []
for seat in seats:
initial.append({"pk": seat.person.pk, "x": seat.x, "y": seat.y, "seat": seat})
initial.append(
{
"pk": seat.person.pk,
"x": seat.x,
"y": seat.y,
"seat": seat,
"seated": seat.seated,
}
)
formset = SeatFormSet(self.request.POST or None, initial=initial, prefix="seats")
self.formset = formset
......@@ -76,13 +84,15 @@ class SeatingPlanEditView(PermissionRequiredMixin, AdvancedEditView):
for form in self.formset:
new_x = form.cleaned_data["x"]
new_y = form.cleaned_data["y"]
if form.seat.x != new_x or form.seat.y != new_y:
new_seated = form.cleaned_data["seated"]
if form.seat.x != new_x or form.seat.y != new_y or form.seat.seated != new_seated:
form.seat.x = new_x
form.seat.y = new_y
form.seat.seated = new_seated
objects_to_update.append(form.seat)
print(form.seat, new_x, new_y)
print(form.seat, new_x, new_y, new_seated)
Seat.objects.bulk_update(objects_to_update, ["x", "y"])
Seat.objects.bulk_update(objects_to_update, ["x", "y", "seated"])
messages.success(self.request, _("The seating plan has been updated."))
return redirect("edit_seating_plan", self.object.pk)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment