From: Christian Heller Date: Thu, 6 Feb 2025 12:26:04 +0000 (+0100) Subject: Handle more Booking edit_raw input cases. X-Git-Url: https://plomlompom.com/repos/%7B%7Bdb.prefix%7D%7D/static/%7B%7B%20web_path%20%7D%7D/%7B%7Bprefix%7D%7D/templates?a=commitdiff_plain;h=2327431be197df8318d91eb568a76ef2813d9917;p=plomledger Handle more Booking edit_raw input cases. --- diff --git a/ledger.py b/ledger.py index b9df71d..2961da7 100755 --- 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_