- AttendanceSession model with open/closed status, org_id, timestamps - POST /api/v1/attendance/check-in/ – creates session, rejects duplicate open check-ins (409) - POST /api/v1/attendance/check-out/ – closes open session, validates checkout > checkin - GET /api/v1/attendance/status/ – current open session for requesting user - GET /api/v1/attendance/history/ – paginated session history per user - GET /api/v1/attendance/admin/sessions/ – admin view for managers/admins with filters - Initial migration with composite indexes on (user, status) and (user, checked_in_at) - 18 test cases covering core flows and edge cases Co-Authored-By: Paperclip <noreply@paperclip.ing>
31 lines
1.5 KiB
Python
31 lines
1.5 KiB
Python
from django.contrib import admin
|
|
from django.urls import path, include
|
|
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView, SpectacularRedocView
|
|
|
|
urlpatterns = [
|
|
path("admin/", admin.site.urls),
|
|
|
|
# Public waitlist endpoints (marketing routes)
|
|
path("", include("waitlist.urls", namespace="waitlist")),
|
|
|
|
# Health
|
|
path("", include("api.urls", namespace="api")),
|
|
|
|
# Domain apps
|
|
path("api/v1/accounts/", include("accounts.urls", namespace="accounts")),
|
|
path("api/v1/courses/", include("courses.urls", namespace="courses")),
|
|
path("api/v1/cms/", include("cms.urls", namespace="cms")),
|
|
path("api/v1/tracking/", include("tracking.urls", namespace="tracking")),
|
|
path("api/v1/quizzes/", include("quizzes.urls", namespace="quizzes")),
|
|
path("api/v1/training/", include("training.urls", namespace="training")),
|
|
path("api/v1/certificates/", include("certificates.urls", namespace="certificates")),
|
|
path("api/v1/reports/", include("reports.urls", namespace="reports")),
|
|
path("api/v1/notifications/", include("notifications.urls", namespace="notifications")),
|
|
path("api/v1/attendance/", include("attendance.urls", namespace="attendance")),
|
|
|
|
# OpenAPI (guarded per-env in settings)
|
|
path("api/schema/", SpectacularAPIView.as_view(), name="schema"),
|
|
path("api/schema/swagger/", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger"),
|
|
path("api/schema/redoc/", SpectacularRedocView.as_view(url_name="schema"), name="redoc"),
|
|
]
|