1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
Część 1.
Wstęp
Będziemy przygotowywać generator współczesnej wizualizacji wyborów prezydenckich z 2000 roku. http://prezydent2000.pkw.gov.pl/gminy/index.html
Opis
Należy przygotować generator stron HTML, który weźmie wyniki (pliki w excelu lub skonwertowane csv) wyborów i przygotuje zestaw stron:
Wyniki wyborów w całym kraju plus mapka z województwami, na których można klikać
Wyniki wyborów w każdym z województw plus odnośniki do okręgów
Wyniki wyborów w każdym okręgu plus odnośniki do gmin
Wyniki wyborów w każdej gminie w podziale na obwody
Wymagania dodatkowe
Powinien być generowany poprawny HTML
Powinien być generowany porawny CSS
Strona powinna być responsywna
Sugerowane technologie
python
pyCharm
http://jinja.pocoo.org/
Dodatkowo trzeba zrobić następujące rzeczy:
Na każdej stronie zamiast wykresu kołowego chcę mieć kolumnę w tabeli z wynikami, z paskiem szerokości odpowiadającej zdobytej liczbie głosów. Zwycięzca ma mieć pasek czerwony, drugi w kolejności - niebieski, a pozostałe mają być szare. Dla małego ekranu ta kolumna ma być niewidoczna.
Parzyste wiersze w tabeli kandydatów mają mieć delikatnie szare tło, należy to zrobić bez użycia klasy do zaznaczenia tych wierszy. Wiersz w którym jest kursor myszki powinien mieć pomarańczowe tło.
Część 2.
Opis
Należy przerobić statyczne strony na aplikację django. Dane powinny być przechowywane w bazie danych. Dodatkowo należy:
Dodać logowanie i wylogowywanie
Pozwolić zalogowanym użytkownikom edytować liczby głosów wypadające na kandydata w obwodzie
Dorobić (dla wszystkich) wyszukiwarkę gmin
Przygotować testy jednostkowe
Dodatkowo trzeba zrobić następujące rzeczy:
Podczas zapisywania liczby głosów na kandydata aktualizować liczbę ważnych głosów w obwodzie - w szczególności przyjmując, że liczba ważnych głosów nie może być większa od liczby wydanych kart.
Powyższe sprawdzenie musi zakładać, że z programu jednocześnie korzysta wiele osób i działać poprawnie na różnych bazach danych, nie tylko MySQL.
Elegancko obsługiwać błędy, które mogą wystąpić podczas edycji.
Część 3.
Należy zmodernizować wyniki zadania drugiego przerabiając serwer na RESTowy.
Klient powinien być statycznym HTML + CSS + JS (może być serwowany przez django)
Po załadowaniu HTML, klient powinien rozpocząć pobieranie danych z serwera. Do momentu pobrania danych klient powinien wyświetlać informacje pobrane w poprzedniej sesji przechowywane po stronie przeglądarki
Klient powinien komunikować się z serwisem RESTowym
Komunikacja powinna odbywać się przy wykorzystaniu JSONa
Należy obsługiwać błędy po obu stronach
Można wykorzystać dodatkową bibliotekę JS
Dodatkowo trzeba zrobić następujące rzeczy:
Poprawić zgłaszane przez jshint sensowne problemy.
Nie oszukiwać przesyłająć JSONa i przesyłać dane, a nie fragmenty HTMLa.
Część 4.
Należy zmodyfikować stronę w taki sposób, aby korzystała z django channels i w momencie kiedy pojawiają się zmiany w wynikach wyświetlała te zmiany na stronie (modyfikując stronę jak również informując w "dymku") bez żadnej interakcji ze strony użytkownika. (ten punkt jest opcjonalny, jego realizacja daje +0.5 do egzaminu)
Należy przygotować wygodną (wyszukiwarka, sortowanie, sensowna nawigacja) wersję strony dla admina.
Należy przygotować całościowe testy aplikacji w selenium.
To zadanie może być uciążliwe, w szczególności:
trzeba zainstalować reddisa https://redis.io/topics/quickstart
trzeba zainstalować channelsy https://channels.readthedocs.io/en/stable/
warto przeczytać tutorial https://realpython.com/blog/python/getting-started-with-django-channels/
Konkretnie trzeba zrobić co najmniej następujące rzeczy:
Admin: w adminie mają być edytowalne wszystkie modele, czyli w szczególności głosy w obwodzie mają być edytowalne zarówno w adminie jak i w samej aplikacji. Przy czym w adminie głosy mają być edytowalne na stronie obwodu, a jako oddzielna tabela nie muszą być widoczne. Widok tabeli ma być sensowny, tzn. standardowa jedna niesortowalna kolumna to trochę za mało, trzeba wybrać "rozsądne" kolumny i umożliwić sortowanie a także dodać wyszukiwarkę. No i oczywiście zapewnić kontrolę wpisywanych danych z sensownym wyświetlaniem informacji o błędach. Na dodatek program ma być napisany tak, żeby był odporny na równoległe działanie wielu użytkowników zarówno korzystających z admina jak i z aplikacji.
Testy: mają obejmować całą aplikację czyli potrzeba co najmniej następujących scenariuszy:
logowanie -> wylogowanie, poprawne i z błędami,
jako niezalogowany użytkownik przejście po wszystkich "ekranach", sprawdzanie wyświetlonych danych i braku możliwości edycji,
użycie wyszukiwarki, znajdowane są dokładnie te gminy, które powinny być znalezione i można wejść na stronę jednej z nich,
jako zalogowany użytkownik edycja danych w jakimś obwodzie i sprawdzenie, że wprowadzone zmiany są widoczne na wszystkich wyższych poziomach,
jakiś test równoległego działania dwóch użytkowników, to zależy od architektury aplikacji, ale jakaś próba edycji tego samego obwodu przez dwóch użytkowników, tak, żeby tylko akcja jednego z nich mogła się udać, a drugiego została odrzucona przez serwer.
Oczywiście testy nie powinny zawierać zbyt dużo powtórzonego kodu, czyli wielokrotnie powtarzane czynności trzeba zaimplementować jako funkcje.