Flask, sessiot ja tiedostot - Viikkotehtävä 3
Tällä viikolla harjoitellaan Flaskin ja sessioiden käyttöä.
Kaikille tasoille yhteiset vaatimukset:
- Käytetään Python-kieltä. Ohjelmakoodi on kommentoitava.
- Sivut on toteutettava Flask-sovelluksena, joka toimii users.jyu.fi-palvelimella. Muille palvelimille sijoitetut sovellukset eivät kelpaa.
- Kaikkien sivujen on oltava validia HTML5:sta
- Javascriptiä ei saa käyttää
- Olkaa tarkkana sessiomuuttujien kanssa. Sovelluksen on toimittava vaikka sille saavuttaisiin ensimmäistä kertaa jollekin muulle sivulle kuin etusivulle. try..except-rakennetta on hyvä käyttää niin välttää KeyErrorit. Sessio-muuttujat kannattaa aina alustaa jollakin. Validaattoria voi aina käyttää hyvänä testiapuna, koska se paljastaa tämän sortin virheet. Sovellus ei saa kaatua
- Sivujen tulee pysyä valideina, vaikka käyttäjä syöttäisi HTML-koodia joihinkin syötekenttiin.
- Ohjelma ei saa kaatua
- Sivuston sisältämä HTML on tuotettava Jinja-templatejen avulla Python-koodin seassa ei saa esiintyä HTML-koodia. Jinja-koodi on pidettävä mahdollisimman yksinkertaisena.
- Koodin olennaisimmat osat on kommentoitava
- Lomakkeessa, jolla aiheutetaan muutoksia (lisäys, muutos, poisto) tietorakenteeseen, ei saa käyttää GET-metodia
- Sivustolla on käytettävä UTF-8-merkistöä kaikkialla.
- Salasanoja ei saa tallentaa selkokielisinä vaan on käytettävä SHA-512-algoritmia.
- Et saa CGI / Flask-sovelluksella kirjoittaa mitään cgi-bin-kansioon tai sen alikansioihin
- Toteuta sivuston lomakkeet Flask-WTF-kirjaston avulla
Taso 1
Toteuta tulospalvelusivusto, jolla on seuraavat ominaisuudet. Käytä valmista tietorakennetta.
- Pura zip-paketista data.json-tiedosto kansioon, josta voit sen Flask-sovelluksellasi avata. Esim. w:\data. Muista antaa tiedostoon sekä kansioon kaikille käyttäjille kirjoitus- ja lukuoikeudet, jotta www-palvelin pystyy tiedostoasi käsittelemään. Tiedostoa ei saa sijoittaa cgi-bin-kansion alle
-
Toteuta seuraavat
vaatimukset käyttäen data.json-tiedostosssa olevia tietoja. Tiedosto on
sama kuin viikkotehtävässä 1. Jos tiedoston avaaminen ei onnistu niin
ohjelman on ilmoitettava virheestä. Tallenna kaikki tietorakenteen sisältöön tehdyt
muutokset samaan tiedostooon.
Käytä tiedoston käsittelyssä io-kirjastoa
- Sovellukseen pitää kirjautua valitsemalla lomakkeelta jokin tietorakenteessa olevista kilpailuista ja syöttämällä lomakkeelle joukkueen nimi ja salasana. Salasana on kaikilla sama eli tiea2080. Salasana ei saa esiintyä selkokielisenä ohjelmakoodissa eikä tiedostoissa! Joukkueen nimessä ei huomioida isoja ja pieniä kirjaimia eikä mahdollisiä välilyöntejä nimen alussa ja lopussa. Ts. " Kukka kaali " on sama asia kuin "kukka kaali".
- Jos nimi tai salasana oli väärä tai joukkuetta ei löydy valitusta kilpailusta, tulostetaan asianmukaiset virheilmoitukset ja palautetaan käyttäjä takaisin kirjautumissivulle. Lomake muistaa aiemmin syötetyt tiedot. Virheilmoituksessa tulee eritellä virhe tarkemmin. Esimerkiksi "Salasana oli väärä." tai "Joukkuetta ei löytynyt.". Virheilmoitukset esitetään niihin liittyvien syöttökenttien vieressä.
- Jos yrittää tulla jollekin sovelluksen sivulle kirjautumatta niin edelleenohjataan automaattisesti kirjautumissivulle.
- Oikeiden kirjautumistietojen syöttämisen jälkeen pääsee automaattisesti (edelleenohjaus, redirect) joukkuelistaussivulle
- Sovelluksen jokaisella alasivulla on sivun ylälaidassa navigointipalkki, jossa on seuraavanlaiset tiedot:
- Kilpailun nimi
- Kirjautuneen joukkueen nimi, josta on linkki sivulle, jossa joukkue voi muokata tietojaan
- Linkki joukkuelistaussivulle
Kirjautumissivulla ei ole navigointilinkkejä.
Toteuta sivujen yhteiset osat käyttäen Jinja-templatea eli käytä yhteistä pohjatemplatea. Kts. base.txt ja jinja2.txt -
Toteuta joukkuelistaussivu jossa on listaus kaikista valitun kilpailun joukkueista. Listauksessa näkyvät myös sarjan nimi sekä joukkueiden
jäsenet.
Joukkuelistaus on ensisijaisesti aakkosjärjestyksessa sarjan nimen mukaan ja toissijaisesti joukkueen nimen mukaan. Joukkueen jäsenten nimet listataan myös aakkosjärjestyksessä. Listauksen on oltava seuraavan mallin mukainen:
- Sarjan nimi
- Rennot 2
- Heikki Häkkinen
- Pia Virtanen
- Sari Maaninka
- Retkellä v 13
- Henna Venäläinen
- Katja Vitikka
- ...
- Rennot 2
<ul> <li>Sarjan nimi <ul> <li>Rennot 2 <ul> <li>Heikki Häkkinen</li> <li>Pia Virtanen</li> <li>Sari Maaninka</li> </ul> </li> <li>Retkellä v 13 <ul> <li>Henna Venäläinen</li> <li>Katja Vitikka</li> </ul> </li> <li>...</li> </ul> </li> </ul> - Sarjan nimi
- Luo sivu, jossa järjestelmään kirjautunut joukkue voi muuttaa oman joukkueensa tietoja. Sivulla on lomake, joka sisältää seuraavat asiat:
- Sarja, joka on valittava tietorakenteessa tarjolla olevista sarjoista. Sarjan valinta on toteutettava radiobuttonien avulla.
- Joukkueen nimi, jota ei saa jättää tyhjäksi
- Samassa kilpailussa ei saa olla kahta samannimistä joukkuetta
- Joukkueen jäsenet, joita voi olla 2-5 kappaletta. Lomakkeella on valmiina viisi kenttää joihin voi syöttää jäsenten nimiä. Jäsenen nimi ei saa olla tyhjä eli tyhjiä kenttiä ei huomioida.
Muista tallentaa muuttunut tietorakenne samaan tiedostoon. Varmista, että tiedostoon on kirjoitusoikeus.
- Jos lomakkeen tiedoissa on puutteita niin virheistä pitää ilmoittaa kyseisen kentän vieressä esitettävällä virheilmoituksella. Esim. joukkueen nimeä ei ole annettu tai jäseniä on syötetty vähemmän kuin kaksi kappaletta. Jos tiedoissa on virheitä tai puutteita niin muutoksia ei tallenneta.
- Aiemmin tietorakenteessa olleiden arvojen täytyy olla lomakkeella valmiina odottamassa muutoksia. Jos syötetyissä tiedoissa on virheitä niin lomake muistaa myös virheelliset syötteet.
Taso 3
Toteuta taso 1 -mukainen sovellus seuraavilla muutoksilla ja lisäyksillä:
- Tee sovellukseen sivu (logout), jolla voi kirjautua ulos sovelluksesta painikkeella. Uloskirjautumisen jälkeen siirrytään takaisin kirjautumissivulle eikä muille sivuille enää pääse. Lisää navigointipalkkiin linkki uloskirjautumissivulle.
- Lisää sovellukseen uusi sivu (admin), jolla pyydetään kirjautumaan sisään ylläpitäjänä. Sivulla on yksi salasanakenttä. Salasanana toimii admin. Salasana ei saa esiintyä koodissa eikä tiedostoissa selkokielisenä.
- Kirjauduttaessa sovellukseen admin-sivulta muuttuu sovelluksen ulkoasu. Huom. tee aivan uudet sivut ylläpitäjän käyttöön. Älä yritä muokata edellisellä tasolla olevia sivuja. admin-sivulta kirjauduttaessa ei saa päästä edellistasolla toteutetuille sivuille
-
Navigointipalkissa lukee joukkueen nimen sijaan sana admin, josta on linkki sovelluksen
etusivulle.
Sovelluksen etusivulla on linkkilistaus tietorakenteesta löytyvistä kilpailuista.
- Kilpailun nimeä klikattaessa päästään sivulle, jossa listataan
kilpailun sarjat keston mukaan järjestettyinä. Listaus on oltava
seuraavan mallin mukainen:
<ul> <li><a href="...">4 h</a></li> <li><a href="...">2 h</a></li> <li><a href="...">8 h</a></li> </ul>
- Valittaessa sarjalistaussivulta sarja päästään sivulle, jossa listataan kaikki kyseisen sarjan joukkueet. Samalla sivulla on myös lomake, jolla voidaan lisätä uusia joukkueita samaan sarjaan. Joukkueelta kysytään samat tiedot kuin joukkueen tietojen muutoslomakkeella (kts. taso 1). Myös samat tarkistukset ovat voimassa.
- Onnistuneen joukkueen lisäämisen jälkeen sovellus ohjautuu (redirect) automaattisesti sarjalistaussivulle. Myös juuri lisätty joukkue täytyy näkyä listauksessa.
- Tee joukkuelistauksessa olevista joukkueiden nimistä linkkejä. Linkki vie joukkueen omalle sivulle, joka on samanlainen kuin tasolla 1, eli pääsee muokkaamaan joukkueen tietoja.
- Lisää joukkueen muokkauslomakkeeseen myös checkbox, jonka valitsemalla kyseinen joukkue poistetaan tietorakenteesta. Joukkuetta ei kuitenkaan saa poistaa, jos joukkueella on jo rastileimauksia. Anna selkeä virheilmoitus jos joukkueen poistaminen ei onnistu.
Taso 5
Toteuta taso 3 -mukainen sovellus seuraavilla muutoksilla ja lisäyksillä:
- Lisää sovelluksen admin-osioon uusi sivu, jossa listataan kilpailun kaikki rastit kaikkine tietoineen taulukkomuodossa. Kunkin rastin yhteydessä kerrotaan myös lukumäärä tämän rastin leimauskerroista. Huomioi myös rastit joita ei ole leimattu kertaakaan! Lisää rastisivulle vievä linkki navigointipalkkiin sekä sarjalistaussivulle.
- Lisää joukkuekohtaiselle sivulle
taulukkomuotoinen listaus kyseisen joukkueen rastileimauksista aikajärjestyksessä:
Aika Rasti 2017-03-18 10:30:30 34 2017-03-18 10:47:50 5C ... ... <table> <tr><th>Aika</th><th>Rasti</th></tr> <tr><td><a href="...">2017-03-18 10:30:30</a></td><td>34</td></tr> <tr><td><a href="...">2017-03-18 10:47:50</a></td><td>5C</td></tr> <tr><td>...</td><td>...</td></tr> </table>
- Admin-tilassa jokaisen rastileimauksen kellonajasta on linkki sivulle, jossa pääsee muokkaamaan kyseisen rastileimauksen tietoja.
- Sivulla on oltava lomake, jossa voi muokata leimausaikaa ja valita leimatun rastin alasvetovalikosta.
- Lomakkeella on myös "poista leimaus"-kohta, jonka voi ruksata, jos haluaa poistaa kyseisen leimauksen.
- Leimaukseen liittyvää joukkuetta ei voi vaihtaa.

Käyttäjien kommentit