dev-2026-03-29 #7
Reference in New Issue
Block a user
Delete Branch "dev-2026-03-29"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
- New router: /projects/{project_id}/proposals/{proposal_id}/essentials - GET (list) - list all essentials under a proposal - POST (create) - create essential with auto-generated EssentialCode - GET /{id} - get single essential by id or essential_code - PATCH /{id} - update essential (title, type, description) - DELETE /{id} - delete essential - All mutations restricted to open proposals only - Permission: creator, project owner, or global admin - Registered essentials router in main.py - Updated GET /proposals/{id} to return ProposalDetailResponse with embedded essentials list - Activity logging on all CRUD operations- Virtual slot ID: plan-{plan_id}-{YYYY-MM-DD} format with parse/make helpers - Plan-date matching: on_month/on_week/on_day hierarchy with week_of_month calc - Materialization: convert virtual slot to real TimeSlot row, copy plan template - Detach: clear plan_id after edit/cancel to break plan association - Bulk materialization: materialize_all_for_date for daily pre-compute - 23 tests covering all paths (matching, virtual gen, materialize, detach, bulk)- Add TimeSlotEdit schema (partial update, all fields optional) - Add TimeSlotEditResponse schema - Add PATCH /calendar/slots/{slot_id} for editing real slots - Add PATCH /calendar/slots/virtual/{virtual_id} for editing virtual slots - Triggers materialization before applying edits - Detaches from plan after edit - Both endpoints enforce: - Past-slot immutability guard - Overlap detection (excluding self) - Plan detachment on edit - Workload warnings in response- Add POST /calendar/slots/{slot_id}/cancel for real slot cancellation - Add POST /calendar/slots/virtual/{virtual_id}/cancel for virtual slot cancellation - Virtual cancel materializes the slot first, then marks as Skipped - Both endpoints enforce past-slot immutability guard - Both endpoints detach from plan (set plan_id=NULL) - Status set to SlotStatus.SKIPPED on cancel - Add TimeSlotCancelResponse schema - Import guard_cancel_real_slot and guard_cancel_virtual_slot- Add SchedulePlanCreate, SchedulePlanResponse, SchedulePlanListResponse schemas - Add DayOfWeekEnum, MonthOfYearEnum schema enums - Add POST /calendar/plans endpoint (create plan with hierarchy validation) - Add GET /calendar/plans endpoint (list plans, optional include_inactive) - Add GET /calendar/plans/{plan_id} endpoint (get single plan) - Mark BE-CAL-API-005 complete in TASKLIST.md- PATCH /calendar/plans/{plan_id}: edit a recurring schedule plan - Validates period-parameter hierarchy after merge - Rejects edits to inactive (cancelled) plans - Detaches future materialized slots so they keep old data - Past materialized slots remain untouched - POST /calendar/plans/{plan_id}/cancel: cancel (soft-delete) a plan - Sets is_active=False - Detaches future materialized slots (plan_id -> NULL) - Preserves past materialized slots, returns their IDs - Added SchedulePlanEdit and SchedulePlanCancelResponse schemas - Imported guard_plan_edit/cancel_no_past_retroaction from slot_immutability