home · contact · privacy
Handle more Booking edit_raw input cases.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 6 Feb 2025 12:26:04 +0000 (13:26 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 6 Feb 2025 12:26:04 +0000 (13:26 +0100)
ledger.py

index b9df71d07aac3bac3628bda5c285a36fb6069dcf..2961da789e7469f3209c96b37adc4661b723b2be 100755 (executable)
--- a/ledger.py
+++ b/ledger.py
@@ -602,14 +602,35 @@ class Server(PlomHttpServer):
         self._recalc_dat_lines()
         return new_id
 
-    def rewrite_booking(self, old_id: int, new_booked_lines: list[DatLine]
-                        ) -> int:
-        """Rewrite Booking with new_booked_lines, move if changed date."""
+    def rewrite_booking(self, old_id: int, new_lines: list[DatLine]) -> int:
+        """Rewrite Booking with new_lines, move if changed date."""
         old_booking = self.bookings[old_id]
+        booked_start, booked_end, gap_start_found = -1, 0, False
+        for i, line in enumerate(new_lines):
+            if booked_start < 0 and line.code.strip():
+                booked_start = i
+            elif booked_start >= 0 and not line.code.strip():
+                gap_start_found = True
+            if not gap_start_found:
+                booked_end += 1
+            elif line.code.strip():
+                new_lines[i] = DatLine(f'; {line.code}')
+        before_gap = new_lines[:booked_start]
+        new_booked_lines = (new_lines[booked_start:booked_end]
+                            if booked_start > -1 else [])
+        after_gap = old_booking.gap_lines_copied + new_lines[booked_end:]
+        if not new_booked_lines:
+            del self.bookings[old_id]
+            for booking in self.bookings[old_id:]:
+                booking.id_ -= 1
+            for neighbour in old_booking.prev, old_booking.next:
+                if neighbour:
+                    neighbour.recalc_prev_next(self.bookings)
+            self._recalc_dat_lines()
+            return -1
         new_date = new_booked_lines[0].code.lstrip().split(maxsplit=1)[0]
         if new_date == old_booking.date:
-            new_booking = Booking(
-                    old_id, new_booked_lines, old_booking.gap_lines_copied)
+            new_booking = Booking(old_id, new_booked_lines, after_gap)
             self.bookings[old_id] = new_booking
             new_booking.recalc_prev_next(self.bookings)
         else:
@@ -624,15 +645,18 @@ class Server(PlomHttpServer):
                 i_booking = i_booking.next
             if new_idx is None:
                 new_idx = i_booking.id_ + 1
-            # ensure that, if we land in group of like-dated Bookings, we land
-            # on the edge closest to our last position
+            # ensure that, if we land in group of like-dated Bookings, we
+            # land on the edge closest to our last position
             if i_booking.date == new_date and old_id < i_booking.id_:
                 new_idx = [b for b in self.bookings
                            if b.date == new_date][0].id_
-            new_booking = Booking(
-                    new_idx, new_booked_lines, old_booking.gap_lines_copied)
+            new_booking = Booking(new_idx, new_booked_lines, after_gap)
             self.bookings[old_id] = new_booking
             self._move_booking(old_id, new_idx)
+        if new_booking.id_ == 0:
+            self.initial_gap_lines += before_gap
+        else:
+            self.bookings[new_booking.id_ - 1].gap_lines += before_gap
         self._recalc_dat_lines()
         return new_booking.id_