Project Directory Structure
Proposed Django project layout:
chargesol/
├── manage.py
├── pyproject.toml
├── chargesol/ # Project configuration
│ ├── __init__.py
│ ├── settings/
│ │ ├── __init__.py
│ │ ├── base.py # Shared settings
│ │ ├── dev.py # Development overrides
│ │ └── prod.py # Production settings
│ ├── urls.py # Root URL configuration
│ ├── wsgi.py
│ └── asgi.py
├── apps/
│ ├── accounts/
│ │ ├── __init__.py
│ │ ├── models.py # User, Role, Team, TeamMembership, Zone
│ │ ├── views.py # Auth + user/team CRUD
│ │ ├── serializers.py # DRF serializers
│ │ ├── urls.py # App URL routes
│ │ ├── admin.py # Admin configuration
│ │ ├── permissions.py # Custom permission classes
│ │ ├── managers.py # Custom model managers
│ │ ├── signals.py # Post-save signals
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── test_models.py
│ │ ├── test_views.py
│ │ └── test_permissions.py
│ ├── leads/
│ │ ├── __init__.py
│ │ ├── models.py # Lead, LeadSource, LeadDocument
│ │ ├── views.py # Lead CRUD + document management
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── admin.py
│ │ ├── filters.py # DRF filter backends
│ │ ├── signals.py # Status change triggers
│ │ ├── tasks.py # Celery: lead import, notifications
│ │ └── tests/
│ ├── surveys/
│ │ ├── __init__.py
│ │ ├── models.py # Survey, SurveyAssignment, SurveyReport, SurveyMedia
│ │ ├── views.py # Survey lifecycle endpoints
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── admin.py
│ │ ├── filters.py
│ │ ├── signals.py # Assignment notifications
│ │ ├── tasks.py # Celery: reminder calls, report reminders
│ │ └── tests/
│ ├── installations/
│ │ ├── __init__.py
│ │ ├── models.py # Installation, InstallationAssignment, Report, Media
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── admin.py
│ │ ├── filters.py
│ │ ├── signals.py
│ │ ├── tasks.py
│ │ └── tests/
│ ├── procurement/
│ │ ├── __init__.py
│ │ ├── models.py # Material, Stock, Allocation, ProcurementRequest, Vendor
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── admin.py
│ │ ├── services.py # Stock check + allocation logic
│ │ └── tests/
│ ├── finance/
│ │ ├── __init__.py
│ │ ├── models.py # VendorPayment, JobPayout, PaymentSchedule
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── admin.py
│ │ ├── services.py # Payment processing logic
│ │ ├── tasks.py # Celery: scheduled payouts
│ │ └── tests/
│ ├── reporting/
│ │ ├── __init__.py
│ │ ├── models.py # ClosurePack, WeeklyReport, MonthlyReport
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── admin.py
│ │ ├── services.py # Report generation logic
│ │ ├── tasks.py # Celery: scheduled report generation
│ │ └── tests/
│ ├── notifications/
│ │ ├── __init__.py
│ │ ├── models.py # Notification, Template, CallLog, DeliveryReceipt
│ │ ├── views.py
│ │ ├── serializers.py
│ │ ├── urls.py
│ │ ├── admin.py
│ │ ├── backends/ # SMS, email, WhatsApp backends
│ │ │ ├── __init__.py
│ │ │ ├── sms.py
│ │ │ ├── email.py
│ │ │ └── whatsapp.py
│ │ ├── services.py # Dispatch logic
│ │ ├── tasks.py # Celery: async dispatch
│ │ └── tests/
│ └── emergency/
│ ├── __init__.py
│ ├── models.py # EmergencyEvent, BackupSearch, Assignment, Reschedule
│ ├── views.py
│ ├── serializers.py
│ ├── urls.py
│ ├── admin.py
│ ├── services.py # Backup team search algorithm
│ └── tests/
├── templates/ # Django templates (admin customization, email)
├── static/ # Static assets
└── media/ # User-uploaded files (dev only; S3 in prod)
Key Conventions
App isolation: Each app owns its models, views, serializers, and tests. Cross-app imports go through public model/service interfaces only.
UUID primary keys: All domain models use
UUIDFieldas primary key for security and distributed-friendliness. Lookup tables (Role, Zone) useAutoField.Split settings:
base.pyfor shared config,dev.pyfor local development (DEBUG=True, SQLite optional),prod.pyfor production (PostgreSQL, S3, proper secrets).Service layer: Apps with complex business logic (procurement, finance, reporting, emergency) have a
services.pymodule to keep views thin.Celery tasks: Async operations (notifications, scheduled reports, payment processing) live in
tasks.pyper app.Custom permissions: Each app defines its own permission classes in
permissions.pyor uses role-based checks fromaccounts.permissions.