Extends the app with friendly form-based management for Teams and Projects — an alternative to using Django admin for routine maintenance. New URLs (admin-only, all return 403 for non-admins): - /teams/ · /teams/new/ · /teams/<id>/ · /teams/<id>/edit/ - /teams/report/ · /teams/report/csv/ - /projects/ + same 5 variants Forms (core/forms.py): - TeamForm — ModelForm with pay-schedule validation (both or neither field) - ProjectForm — ModelForm with end_date >= start_date validation - _supervisor_user_queryset() — admins + Work Logger group members Views (core/views.py): - 10 new views (5 per model: list, detail, edit, batch_report, batch_csv) - _build_team_report_context() / _build_project_report_context() shared helpers - All views gate on is_admin(user) - Reuses existing get_pay_period() for Team detail Pay Schedule tab Templates (core/templates/core/teams/ and projects/): - list.html — filterable table with search - detail.html — tabbed profile / workers / history / schedule - edit.html — serves both /new/ and /edit/ - batch_report.html — lifetime aggregates per row, CSV download UI integration: - Resources dropdown added to top nav (admin-only, Teams + Projects) - Manage All buttons added to Dashboard Manage Resources tabs (Teams, Projects) No model changes, no migrations — purely additive. CLAUDE.md updated with new routes and section describing the pattern. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
100 lines
4.9 KiB
Python
100 lines
4.9 KiB
Python
# === URL ROUTING ===
|
|
# Maps URLs to view functions. Each path() connects a web address to
|
|
# the Python function that handles it.
|
|
|
|
from django.urls import path
|
|
from . import views
|
|
|
|
urlpatterns = [
|
|
# Dashboard — the home page after login
|
|
path('', views.index, name='home'),
|
|
|
|
# Attendance logging — where supervisors log daily work
|
|
path('attendance/log/', views.attendance_log, name='attendance_log'),
|
|
|
|
# Work history — table of all work logs with filters
|
|
path('history/', views.work_history, name='work_history'),
|
|
|
|
# CSV export — downloads filtered work logs as a spreadsheet
|
|
path('history/export/', views.export_work_log_csv, name='export_work_log_csv'),
|
|
|
|
# CSV export — downloads all worker data (admin only)
|
|
path('workers/export/', views.export_workers_csv, name='export_workers_csv'),
|
|
|
|
# AJAX toggle — activates/deactivates workers, projects, teams from dashboard
|
|
path('toggle/<str:model_name>/<int:item_id>/', views.toggle_active, name='toggle_active'),
|
|
|
|
# === TEAMS MANAGEMENT ===
|
|
# Friendly form-based management pages (alternative to Django admin).
|
|
# Admins can view, create, edit, and report on teams without leaving the app.
|
|
path('teams/', views.team_list, name='team_list'),
|
|
path('teams/new/', views.team_edit, name='team_new'),
|
|
path('teams/<int:team_id>/', views.team_detail, name='team_detail'),
|
|
path('teams/<int:team_id>/edit/', views.team_edit, name='team_edit'),
|
|
path('teams/report/', views.team_batch_report, name='team_batch_report'),
|
|
path('teams/report/csv/', views.team_batch_report_csv, name='team_batch_report_csv'),
|
|
|
|
# === PROJECTS MANAGEMENT ===
|
|
# Same pattern as Teams — friendly management pages outside Django admin.
|
|
path('projects/', views.project_list, name='project_list'),
|
|
path('projects/new/', views.project_edit, name='project_new'),
|
|
path('projects/<int:project_id>/', views.project_detail, name='project_detail'),
|
|
path('projects/<int:project_id>/edit/', views.project_edit, name='project_edit'),
|
|
path('projects/report/', views.project_batch_report, name='project_batch_report'),
|
|
path('projects/report/csv/', views.project_batch_report_csv, name='project_batch_report_csv'),
|
|
|
|
# === PAYROLL ===
|
|
# Main payroll dashboard — shows pending payments, history, loans, and charts
|
|
path('payroll/', views.payroll_dashboard, name='payroll_dashboard'),
|
|
|
|
# Process payment — pays a worker and links their unpaid logs + adjustments
|
|
path('payroll/pay/<int:worker_id>/', views.process_payment, name='process_payment'),
|
|
|
|
# Batch pay — preview which workers would be paid, then process all at once
|
|
path('payroll/batch-pay/preview/', views.batch_pay_preview, name='batch_pay_preview'),
|
|
path('payroll/batch-pay/', views.batch_pay, name='batch_pay'),
|
|
|
|
# Price overtime — creates Overtime adjustments from unpriced OT entries
|
|
path('payroll/price-overtime/', views.price_overtime, name='price_overtime'),
|
|
|
|
# Add a new payroll adjustment (bonus, deduction, loan, etc.)
|
|
path('payroll/adjustment/add/', views.add_adjustment, name='add_adjustment'),
|
|
|
|
# Edit an existing unpaid adjustment
|
|
path('payroll/adjustment/<int:adj_id>/edit/', views.edit_adjustment, name='edit_adjustment'),
|
|
|
|
# Delete an unpaid adjustment
|
|
path('payroll/adjustment/<int:adj_id>/delete/', views.delete_adjustment, name='delete_adjustment'),
|
|
|
|
# Preview a worker's payslip (AJAX — returns JSON)
|
|
path('payroll/preview/<int:worker_id>/', views.preview_payslip, name='preview_payslip'),
|
|
|
|
# Worker lookup — AJAX report card for a single worker (returns JSON)
|
|
path('payroll/worker-lookup/<int:worker_id>/', views.worker_lookup_ajax, name='worker_lookup_ajax'),
|
|
|
|
# Add a repayment from the payslip preview modal (AJAX — returns JSON)
|
|
path('payroll/repayment/<int:worker_id>/', views.add_repayment_ajax, name='add_repayment_ajax'),
|
|
|
|
# View a completed payslip (print-friendly page)
|
|
path('payroll/payslip/<int:pk>/', views.payslip_detail, name='payslip_detail'),
|
|
|
|
# === EXPENSE RECEIPTS ===
|
|
# Create a new expense receipt — emails HTML + PDF to Spark Receipt
|
|
path('receipts/create/', views.create_receipt, name='create_receipt'),
|
|
|
|
# === TEMPORARY: Import production data from browser ===
|
|
# Visit /import-data/ once to populate the database. Remove after use.
|
|
path('import-data/', views.import_data, name='import_data'),
|
|
|
|
# === TEMPORARY: Run migrations from browser ===
|
|
# Visit /run-migrate/ to apply pending database migrations on production.
|
|
path('run-migrate/', views.run_migrate, name='run_migrate'),
|
|
|
|
# === BACKUP / RESTORE (admin-only, browser-accessible) ===
|
|
# Flatlogic has no SSH/shell — admins use these to snapshot and
|
|
# restore all app data via the browser. See CLAUDE.md "Backup &
|
|
# Restore" section for the full procedure.
|
|
path('backup-data/', views.backup_data, name='backup_data'),
|
|
path('restore-data/', views.restore_data, name='restore_data'),
|
|
]
|