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:
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_