# EduPortal South Sudan
A Flask-based education portal for South Sudan that connects students, parents, teachers, school administrators, NGOs, and platform administrators. It provides a verified school directory, study materials, announcements, and scholarship listings — all moderated before going public.
---
## Table of Contents
- User Roles
- Features
- Tech Stack
- Project Structure
- Getting Started
- Environment Variables
- Database Setup
- Demo Accounts
- Running Tests
- Main Pages
- API Reference
- Background Jobs
- File Storage
- Notifications
- Web Push
- Google Sign-In
- Material Thumbnails
- Backups
- Security
- Deployment
- Live Project
---
## User Roles
| Role | What they can do |
|---|---|
| `student` | Browse schools, materials, announcements; apply for scholarships; bookmark items |
| `parent` | Same as student, plus a linked child's school/grade on their profile |
| `teacher` | Everything a student can, plus upload study materials and post school announcements |
| `school_admin` | Manage their school's profile, admission requirements, materials, and applications |
| `ngo_officer` | Post and manage scholarships for their NGO |
| `org_publisher` | Post announcements on behalf of a verified organization |
| `admin` | Onboard schools/NGOs/organizations; approve/reject all submitted content; manage users, roles, analytics, and the audit log |
> The platform admin manages the platform, not the content. Their sidebar only shows the Admin Panel — no Dashboard, Materials, Scholarships, or Announcements. Every role only sees the nav items it's entitled to use, enforced both client-side (`sidebar-main.js`) and server-side (`@require_role`).
---
## Features
- **Authentication** — Email/phone + password or Google Sign-In; JWT access tokens (2h) with rotating refresh tokens (30 days)
- **Email verification** — Required before login for email-registered accounts; Google Sign-In auto-verifies
- **Password reset** — Time-limited, single-use reset codes se …