fix(fusion_clock): code-review hardening [19.0.5.0.1]
- _cron_generate: per-rule savepoint isolation (one bad rule can't abort the whole daily batch) - fclk_attach_recurrence: clear an existing recurrence first (no orphaned rule generating forever) - fclk_apply_planner_cell: collapse split rows (search was limit=1 after the UNIQUE drop, orphaning extras) - fclk_release_shift: reject non-posted/open shifts (raw-POST guard) - delete_open_shift: report success=false when nothing was deleted + JS surfaces it - _generate: log before removing an empty recurrence Tests added for collapse, re-attach, draft-release. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -96,7 +96,9 @@ class FusionClockScheduleRecurrence(models.Model):
|
||||
seed = Schedule.search(
|
||||
[('recurrence_id', '=', rec.id)], order='schedule_date desc', limit=1)
|
||||
if not seed:
|
||||
# No anchor row -> nothing to repeat; drop the empty rule.
|
||||
# No anchor row left -> nothing to repeat; drop the empty rule.
|
||||
_logger.info(
|
||||
"Fusion Clock: recurrence %s has no shifts left; removing it.", rec.id)
|
||||
rec.unlink()
|
||||
continue
|
||||
anchor = Schedule.search(
|
||||
@@ -150,5 +152,13 @@ class FusionClockScheduleRecurrence(models.Model):
|
||||
|
||||
@api.model
|
||||
def _cron_generate(self):
|
||||
"""Roll every recurrence's horizon forward (called daily)."""
|
||||
self.search([])._generate()
|
||||
"""Roll every recurrence's horizon forward (called daily). Each rule is
|
||||
isolated in its own savepoint so one bad recurrence can't abort
|
||||
generation for all the others."""
|
||||
for rec in self.search([]):
|
||||
try:
|
||||
with self.env.cr.savepoint():
|
||||
rec._generate()
|
||||
except Exception:
|
||||
_logger.exception(
|
||||
"Fusion Clock: recurrence %s failed to generate; skipping.", rec.id)
|
||||
|
||||
Reference in New Issue
Block a user