From 677da4427b0606858bb42d5689e0c1a62b4b33b1 Mon Sep 17 00:00:00 2001 From: ndimoro Date: Fri, 23 Jan 2026 13:39:39 -0700 Subject: [PATCH 1/2] Fix: Auto-calculate SlotEntry.order when not provided via API The SlotEntry model's `order` field was defined with `blank=True` but no default value, causing 500 Internal Server Error when creating entries via /api/v2/slot-entry/ without specifying an order. Changes: - Add `null=True` to allow Python None value before save - Auto-calculate order in save() method as max(existing_orders) + 1 This matches the behavior of similar models (Day, Slot) which have default=1 for their order fields. Fixes: IntegrityError "null value in column 'order' violates not-null constraint" Co-Authored-By: Claude Opus 4.5 --- wger/manager/models/slot_entry.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/wger/manager/models/slot_entry.py b/wger/manager/models/slot_entry.py index dfc4a606f..7bae76835 100644 --- a/wger/manager/models/slot_entry.py +++ b/wger/manager/models/slot_entry.py @@ -140,6 +140,7 @@ class SlotEntry(models.Model): order = models.PositiveIntegerField( blank=True, + null=True, db_index=True, ) @@ -213,6 +214,12 @@ class SlotEntry(models.Model): ) if not self.weight_rounding: self.weight_rounding = self.slot.day.routine.user.userprofile.weight_rounding + + # Auto-calculate order if not provided + if self.order is None: + max_order = self.slot.entries.aggregate(models.Max('order'))['order__max'] + self.order = (max_order or 0) + 1 + return super().save(*args, **kwargs) def get_owner_object(self): From 65eb06ace40aeea09865dfe9e35e451ee5ce2dd0 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Thu, 29 Jan 2026 20:06:42 +0100 Subject: [PATCH 2/2] Remove null constraint from the order field in SlotEntry and add some tests --- wger/manager/models/slot_entry.py | 1 - wger/manager/tests/test_slot_entry.py | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/wger/manager/models/slot_entry.py b/wger/manager/models/slot_entry.py index 7bae76835..711008f3e 100644 --- a/wger/manager/models/slot_entry.py +++ b/wger/manager/models/slot_entry.py @@ -140,7 +140,6 @@ class SlotEntry(models.Model): order = models.PositiveIntegerField( blank=True, - null=True, db_index=True, ) diff --git a/wger/manager/tests/test_slot_entry.py b/wger/manager/tests/test_slot_entry.py index 3e148ced6..a6976986c 100644 --- a/wger/manager/tests/test_slot_entry.py +++ b/wger/manager/tests/test_slot_entry.py @@ -58,6 +58,24 @@ class SlotEntryTestCase(WgerTestCase): ) self.slot_entry.save() + def test_auto_add_order(self): + """ + Test that the order is automatically added if not provided + """ + slot_entry_2 = SlotEntry(slot_id=1, exercise_id=2, order=None) + slot_entry_2.save() + + slot_entry_3 = SlotEntry(slot_id=1, exercise_id=3, order=7) + slot_entry_3.save() + + slot_entry_4 = SlotEntry(slot_id=1, exercise_id=3) + slot_entry_4.save() + + self.assertEqual(self.slot_entry.order, 1) + self.assertEqual(slot_entry_2.order, 2) + self.assertEqual(slot_entry_3.order, 7) + self.assertEqual(slot_entry_4.order, 8) + def test_weight_config(self): """ Test that the weight is correctly calculated for each step / iteration