Full-stack relational database and web backend designed to manage student records, staff operations, and administrative workflows for Good Foundation International School in Nsawam, Ghana.
# GFIS School Management System
A school management system for **GOOD FOUNDATION INTERNATIONAL SCHOOL - NSAWAM** (Ghana), covering admissions, academics (scores, grading, attendance), fees, report cards, and a public, no-login parent lookup portal — built to keep working well on slow or intermittent internet.
Stack: Django 6 + PostgreSQL (SQLite for local dev), Django templates + HTMX (no JS framework), Django's built-in auth extended with a `role` field for access control.
## Contents
- Requirements
- Local setup
- Seed / demo data
- Running the app
- Running tests
- Project structure
- Roles & access control
- Deployment
- Cloud deployment
- On-premises (school office) deployment
- Low-bandwidth design notes
## Requirements
- Python 3.12+
- PostgreSQL 14+ (production only — local dev uses SQLite by default)
## Local setup
```bash
# 1. Create and activate a virtual environment
python -m venv venv
source venv/Scripts/activate # Windows (Git Bash) / macOS / Linux: source venv/bin/activate
# 2. Install dependencies
pip install -r requirements-dev.txt # includes requirements.txt plus test tooling
# 3. Configure environment
cp .env.example .env
# Generate a real secret key and paste it into .env:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
# 4. Run migrations
python manage.py migrate
# 5. Create your own super admin (or use the seeded "admin" account below)
python manage.py createsuperuser
```
By default `.env` sets `DJANGO_SETTINGS_MODULE=config.settings.dev`, which always uses a local `db.sqlite3` file regardless of `DATABASE_URL` — no PostgreSQL install needed to start developing.
## Seed / demo data
To load the 13 class levels, the NaCCA/GES subject list, and a full demo dataset (one staff account per role, ~65 students spread across classes with guardians, scores, attendance, payments, and parent-lookup PINs):
```bash
python manage.py seed_demo_data
```
This is idempotent — re-ru …