- EmployeeAttendanceSerializer: add meeting_title (source: meeting.title)
fixes attendance.js rendering r.meeting_title as undefined
- MeetingParticipantSerializer: add user_email and user_display_name
so meeting detail participant list shows human-readable identity
- OrganizationProfileListCreateView: add GET handler to list org profiles
(previously POST-only, returning 405 on GET)
- UserProfileSerializer: add org_ids derived from role_bindings
so frontend can resolve which org profile to load for branding
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Backend:
- Add migration 0002 for Meeting, MeetingParticipant, EmployeeAttendance models
- Add EmployeeAttendanceSerializer with meeting_title helper field
- Add MeetingDetailView (GET /meetings/{id}/ with participants embedded)
- Add EmployeeAttendanceListView (GET /training/attendance/) with
role-based access: own records always visible; other users require
progress:view_all / progress:view_team / users:manage capability
- Register meeting-detail and attendance-list routes in urls.py
Frontend:
- attendance.html + attendance.js: JWT login flow, attendance history
table with status badges, token refresh via sessionStorage only
(no localStorage for access tokens)
- meetings.html + meetings.js: meeting list, create-meeting form,
per-meeting participant management, inline attendance recording
with select + save per row; UUID input validated before submit
- attendance.css: shared stylesheet for both pages
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- TrainingRecord model with completion_mode (online/offline/blended) and CompletionStatus state machine
- TrainerSignoff model with decision, notes, trainer FK, and audit timestamp
- SignoffEvidence model for uploaded proof files
- services.py state transitions:
- mark_in_progress: not_started → in_progress
- mark_online_passed: online → completed; blended → pending_signoff
- submit_trainer_signoff: offline/blended approved → completed; rejected → in_progress
- InvalidTransitionError on illegal state moves
- IsTrainer permission class based on training:signoff capability
- API: record detail, start, mark-online-passed, trainer-signoff, pending-signoff list
- 20 unit + integration tests covering all mode paths, invalid transitions, and access control
- Blended completion requires both online pass AND trainer approval
Co-Authored-By: Paperclip <noreply@paperclip.ing>