TutorHub — System zarządzania szkołą jako praca inżynierska
Adam SzczotkaOd chaosu w Excelu do prawdziwego systemu
Moja praca inżynierska zaczęła się od prawdziwego problemu. Szkoła korepetycji z ponad 200 uczniami prowadziła wszystko w Excelu — grafiki, płatności, obecności, komunikację z rodzicami. Właściciel poświęcał ponad 10 godzin tygodniowo na zadania, które powinny zajmować minuty.
Zaproponowałem zbudowanie kompletnego systemu zarządzania jako projekt inżynierski. Nie prototyp, nie mockup — gotowa produkcyjnie platforma, której szkoła mogłaby naprawdę używać.
Dlaczego Django
Wybór był celowy. Niektórzy rodzice korzystają z systemu na 5-letnich telefonach z Androidem — ciężki SPA by nie zadziałał. Django daje strony renderowane po stronie serwera, które ładują się szybko na każdym urządzeniu, plus wbudowany panel admina, który właściciel szkoły mógł używać od razu.
PostgreSQL był bezwzględny. Sloty grafiku używają kluczy złożonych, a zapobieganie podwójnej rezerwacji potrzebuje ograniczeń na poziomie bazy danych, nie tylko logiki aplikacji. Gdy dwie osoby rezerwują ten sam slot jednocześnie, baza odrzuca jednego — zero wyścigów.
Architektura
System urósł do 17 aplikacji Django, każda obsługująca konkretną domenę:
- Konta — własny model użytkownika z 4 rolami (Admin, Korepetytor, Uczeń, Rodzic), autoryzacja emailem, archiwizacja zgodna z RODO
- Lekcje — planowanie z FullCalendar, lekcje cykliczne, widoki zasobów pokoi/korepetytorów, wykrywanie konfliktów
- Obecność — oznaczanie w czasie rzeczywistym (obecny/nieobecny/spóźniony/usprawiedliwiony), raporty miesięczne z eksportem PDF, alerty niskiej frekwencji
- Faktury — automatyczne fakturowanie miesięczne przez Celery Beat (uruchamia się 25.), wykrywanie zaległości, przypomnienia o płatności, generowanie PDF
- Wiadomości — wątkowe konwersacje z czatem grupowym, załącznikami, potwierdzeniami odczytu
- Odwołania — wnioski uczniów, workflow zatwierdzania przez admina, automatyczne tworzenie lekcji zastępczych z wygaśnięciem
- Powiadomienia — wielokanałowe (email, SMS, push, in-app) z cichymi godzinami i preferencjami per użytkownik
- Portal rodzica — konfigurowalne poziomy dostępu, przeglądanie faktur, komunikacja z korepetytorami
Automatyzacja, która ma znaczenie
Największy wpływ miały zadania w tle zasilane przez Celery i Redis:
- Faktury generują się automatycznie 25. dnia każdego miesiąca — zero ręcznej pracy
- Zaległe faktury wykrywane codziennie o 8:00 z automatyczną aktualizacją statusów
- Przypomnienia o płatności wysyłane 7 dni przed terminem
- Przypomnienia o lekcjach powiadamiają uczniów 24 godziny przed zaplanowaną lekcją
- Lekcje zastępcze wygasają automatycznie po 30 dniach jeśli nie zostały zaplanowane
Właściciel szkoły przeszedł z 10 godzin pracy administracyjnej tygodniowo do poniżej 1 godziny.
Czego się nauczyłem
Budowanie systemu dla prawdziwych użytkowników jest fundamentalnie inne od projektów akademickich. Użytkownicy znajdują edge case'y, których nigdy sobie nie wyobraziłeś. Klikają rzeczy w kolejności, której nie planowałeś. Potrzebują wyjaśnienia funkcji, które uważałeś za oczywiste.
Ścieżka audytu (logowanie każdej operacji CRUD z użytkownikiem, IP i timestampem) nie była w moim oryginalnym zakresie. Właściciel szkoły poprosił o nią po tym, jak rodzic zakwestionował rekord obecności. Teraz każda zmiana jest śledzona.
HTMX był przełomem dla UI. Zamiast budować pełny SPA, mogłem uczynić szablony Django reaktywnymi z minimalnym JavaScriptem. Oznaczanie obecności, filtrowanie lekcji, wysyłanie wiadomości — wszystko działa bez przeładowań strony, ale serwer nadal renderuje wszystko.
Stack
- Django 5.1 + Python 3.11
- PostgreSQL 17 (ograniczenia na poziomie bazy)
- Redis 7 + Celery 5.4 (zadania w tle)
- HTMX + Tailwind CSS + DaisyUI (reaktywny UI)
- FullCalendar (planowanie)
- ReportLab + PyMuPDF (raporty PDF)
- Docker Compose (wdrożenie)
- Gunicorn + WhiteNoise (serwowanie produkcyjne)
Wypróbuj
Demo jest dostępne pod adresem tutorhub.adamszczotka-pokaz.pl. Kod źródłowy jest na GitHubie.
