A comprehensive full-stack web application for managing student grades, attendance, assignments, exams, messaging, fee management, and report card generation.
| Module | Capabilities |
|---|---|
| Multi-role Auth | Admin, Teacher, Student, Parent — each with role-based dashboards |
| Grade Management | Percentage-based (0–100%) grading per subject/term, auto letter grades, trend charts |
| Attendance | Daily attendance per section (present/absent/late/excused), monthly views |
| Assignments | Teachers create assignments; students submit online; teachers grade with feedback |
| Online Exams | MCQ, True/False, and Short Answer — auto-graded with countdown timer |
| Report Cards | PDF + HTML report cards with grades, attendance, and teacher comments per term |
| Digital Wallet | Razorpay-powered parent wallet for micro-fee deductions and instant top-ups |
| Early Warning | Predictive algorithm identifying at-risk students based on attendance/grades |
| Micro-Credentials | Issue digital PDF certificates for soft skills and extracurricular achievements |
| Fee Management | Track fee types, payment records, and download official PDF receipts |
| In-App Messaging | Thread-based messaging between all user roles |
| AI Assistant | Google Gemini integration for personalized academic/holistic insights |
| Timetable Mgmt | Schedule subjects, sections, and teachers with weekly views and collision detection |
| Admin Panel | Manage users, classes, sections, subjects, teacher assignments, academic terms |
| Analytical Dashboards | Rich Chart.js visualizations for Admin, Teacher, and Parent roles |
| Parent Portal | View all linked children's progress, grades, attendance, fees, and wallet |
| Multi-school | Full multi-tenant support via School model |
| Mobile Responsive | Works on phones and tablets |
cd elwoodpython3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activatepip install -r requirements.txtPDF generation requires WeasyPrint system libraries. On Ubuntu/Debian:
sudo apt-get install libpango-1.0-0 libharfbuzz0b libpangoft2-1.0-0On macOS:
brew install pango
Copy .env.example to .env and edit:
cp .env.example .envSECRET_KEY=your-secret-key-here
DATABASE_URL=sqlite:///elwood.db # local
# DATABASE_URL=postgresql://... # cloud/production
# Email (SMTP) — required for notifications & digests
MAIL_SERVER=smtp.gmail.com
MAIL_PORT=587
MAIL_USE_TLS=true
MAIL_USERNAME=your@gmail.com
MAIL_PASSWORD=your-app-password
# Razorpay (Required for Digital Wallet)
RAZORPAY_KEY_ID=rzp_test_xxxxxx
RAZORPAY_KEY_SECRET=xxxxxxxxxxxxxxpython3 seed.pypython3 run.pyVisit http://localhost:5000
| Role | Password | |
|---|---|---|
| Admin | admin@gmail.com | admin123 |
| Teacher | teacher@gmail.com | teacher123 |
| Student | student@gmail.com | student123 |
| Parent | parent@gmail.com | parent123 |
elwood/
├── run.py # Flask entry point
├── seed.py # Database seeder with demo data
├── config.py # App configuration
├── requirements.txt
├── app/
│ ├── __init__.py # App factory
│ ├── models.py # All SQLAlchemy models
│ ├── auth/ # Login / logout / profile
│ ├── admin/ # Admin panel (users, classes, terms…)
│ ├── teacher/ # Grades, attendance, assignments, comments
│ ├── student/ # Student portal
│ ├── parent/ # Parent portal
│ ├── reports/ # Report card generation (HTML + PDF)
│ ├── exams/ # Online exam builder and test-taker
│ ├── messages/ # In-app messaging
│ ├── fees/ # Fee tracking & Digital Wallet (Razorpay)
│ └── utils/
│ └── algorithms.py # Early Warning & Weekly Digest logic
├── templates/
│ ├── base.html # Shared layout (sidebar, topbar, design system)
│ └── ... # Per-blueprint templates
└── static/
└── ... # CSS / JS (served by Flask)
Set DATABASE_URL to your PostgreSQL connection string:
DATABASE_URL=postgresql://user:password@host:5432/elwood_db
The app automatically uses PostgreSQL when this env var is set.
pip install gunicorn
gunicorn "app:create_app()" -w 4 -b 0.0.0.0:8000FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "app:create_app()", "-w", "4", "-b", "0.0.0.0:8000"]Every record is scoped to a School. To add a second school:
- Insert a new
Schoolrow with a uniquecode - Create users with
school_idpointing to the new school - Each school's data is fully isolated
| Score | Letter |
|---|---|
| 90–100% | A+ |
| 80–89% | A |
| 70–79% | B+ |
| 60–69% | B |
| 50–59% | C |
| 40–49% | D |
| < 40% | F |
Low-grade threshold (default 40%) triggers automatic student notifications. Configurable in config.py.
The architecture is LMS-ready. To integrate with an external LMS (Moodle, Canvas, Google Classroom):
- Add an
/api/blueprint with JWT auth - Expose
/api/students,/api/grades,/api/attendanceendpoints - Use the existing SQLAlchemy models — no schema changes needed
- Backend: Python 3.11, Flask 3.0
- ORM: Flask-SQLAlchemy (SQLite / PostgreSQL)
- Payments: Razorpay SDK
- Auth: Flask-Login
- PDF: WeasyPrint (Digital Receipts & Report Cards)
- Charts: Chart.js 4.4 (Radar, Bar, Line, Doughnut)
- Email: Flask-Mail (Background threading & Weekly Digest)
- Frontend: Server-rendered Jinja2, Vanilla JS
- Fonts: Playfair Display + DM Sans (Google Fonts)
- Icons: Font Awesome 6