A Django web app for an elevator maintenance company. Staff keep the client list, the elevator registry, service visits and the weekly shift roster. Clients get their own portal: see their equipment, follow the service history, report a fault with a photo, and pay for a service through Stripe Checkout.
A short video walkthrough of the staff and client dashboards.
Python 3.9 and pip. SQLite is the default database, so there is nothing else to install.
Create a virtual environment, activate it, then pip install -r requirements.txt.
cp .env.example .env. Generate a fresh SECRET_KEY and add your Stripe test keys. Nothing secret lives in the repo.
python manage.py makemigrations core, migrate, createsuperuser. In the admin site add two Groups, Company and Client, and put your superuser in Company.
python manage.py runserver and open 127.0.0.1:8000. The login page is the site root; from the staff dashboard you add clients, staff and elevators.
Two kinds of users, two dashboards, one shared record of the equipment.
Two Django Groups, Company and Client, guarded by an allowed_users decorator. Each role sees its own dashboard and only the actions it is allowed to take.
Each elevator, hydraulic or mechanical, is registered against a client with its technical details: motor cauldron, control panel, book code, wattage, stations, wire ropes and the last KTEO inspection date.
Staff log each visit per elevator with cost, technician, receipt code and dates. Clients can add a comment to a completed service.
A rolling weekly roster records which technician is on shift each day. Fault alerts are routed automatically to whoever is on shift today.
Alert messages are categorised fault reports from a client, optionally with a photo. Simple messages are free text and can be broadcast to all clients or all staff. Replies and read-tracking included.
A client pays for a service through Stripe Checkout. Service history and elevator search are powered by django-filter.
One Django app, core, holds all the business logic. The docs folder documents it in full.
Originally built in 2021 on Django 3.1 and re-published with full documentation and the hard-coded secrets moved into a .env file read by python-decouple. It is a learning and portfolio project: before a real deployment you would set DEBUG=False, configure hosts and static files, move off SQLite, and verify Stripe payments with a webhook rather than the success redirect.
core/ ├── models.py # User, week, elevators, service, Message ├── views.py # function-based views for both roles ├── urls.py # login, dashboards, add/update/delete, search, messages, Stripe checkout ├── forms.py # ModelForms + custom user-creation form ├── filters.py # django-filter FilterSets for the search pages └── decorators.py # allowed_users role guard