A Python Dash web application for campus navigation and administration. Users get room-to-room routing with step-by-step directions and distance. Admins manage users, send notifications, view system logs, and monitor analytics, all backed by CSV-based persistent storage with no external database dependency.
Built as an MSc Computer Science project exploring graph algorithms, design patterns, role-based access control, and reactive web application development.
- Room-to-room navigation: fastest and accessible route options using Dijkstra's algorithm across a weighted building graph
- Step-by-step directions: turn-by-turn instructions with outdoor distance in metres
- Role-based access control: student, staff, and admin roles with role-appropriate UI rendering
- Notification system: global broadcast (
ALL) and individual user notifications with delivered/pending status - Admin user management: create, update, and delete users with CSV persistence
- Admin notification management: create, update, delete, and send notifications
- Analytics dashboard: bar chart of notification delivery status, pie chart of user role breakdown (Plotly)
- System audit log: all admin actions logged with a live log viewer in the dashboard
- CSV persistence: data stored in
data/locations.csv,data/users.csv,data/notifications.csv
| Layer | Technology |
|---|---|
| Framework | Python Dash |
| Charts | Plotly (go.Figure, px) |
| Routing | Strategy pattern (FastestRouteStrategy, AccessibleRouteStrategy) |
| Algorithm | Dijkstra's shortest path on weighted building graph |
| Logging | Custom Logger class |
| Data storage | CSV files |
| Language | Python |
├── app.py # Main application, layout and all callbacks
├── data/
│ ├── locations.csv # Campus rooms and floors
│ ├── users.csv # Users (id, name, role)
│ └── notifications.csv # Notifications (id, user_id, message, delivered)
└── scns/
├── models/
│ ├── location.py # Location model
│ ├── user.py # User model
│ └── notification.py # Notification model
├── data_loader.py # CSV loading functions
├── functions/
│ └── routing_functions.py # Graph construction helpers
└── patterns/
├── fastest_route.py # FastestRouteStrategy
├── accessible_route.py # AccessibleRouteStrategy
└── logger.py # Audit logger
Prerequisites
- Python 3.8+
- pip
Install and run
git clone https://github.com/AlexMcHugh1/campus-navigation-system.git
cd campus-navigation-system
pip install -r requirements.txt
python app.pyThe application will be available at http://127.0.0.1:8050
Login
Select an existing user from the dropdown to log in. Authentication is identity-based against the users CSV.
| Feature | Student | Staff | Admin |
|---|---|---|---|
| Navigation | Yes | Yes | Yes |
| Own notifications | Yes | Yes | Yes |
| Analytics | No | Yes | Yes |
| User management | No | No | Yes |
| Notification management | No | No | Yes |
| System logs | No | No | Yes |
Routes are computed across a weighted building graph. Within the same building, floor-based navigation is used directly. Between buildings, the selected strategy (fastest or accessible) finds the optimal path using Dijkstra's algorithm, returning an ordered list of hops with distances.
The strategy pattern allows new routing modes to be added without modifying the core routing logic.
- Strategy pattern for routing:
FastestRouteStrategyandAccessibleRouteStrategyshare a common interface, making alternative routing modes easy to add - CSV storage: chosen over a database to keep the application self-contained and portable, all writes are synchronous to maintain consistency
- Dash callbacks: reactive UI state managed through Dash's callback system using
dcc.Storefor session data (user ID and role) - Audit logging: all admin mutations (create, update, delete) are logged via
Loggerfor accountability
MSc Computer Science project exploring practical application of graph algorithms, software design patterns, and reactive web development. The CSV-over-database constraint was deliberate, to focus on data modelling and algorithmic correctness rather than infrastructure.
MIT