Google App Engine ja Datastore - viikkotehtävä 4
Tehdään pienelle tietokannalle käyttöliittymä (vrt. vt3) Googlen App Engine -palveluun.
Tämän tehtävän toteuttaminen edellyttää vähintään seuraavien materiaalien ja tehtävien läpikäyntiä:
Yhteiset vaatimukset:
- Tietojen tallentamiseen on käytettävä Google App Enginen tarjoamaa Google NoSQL-tietokantaa (Datastore).
- Javascriptia ei saa käyttää
- Sovelluksen on toimittava ja oltava testattavissa Googlen App Engine
-pilvipalvelussa (osoite.appspot.com).
Käytä App enginen standard-versiota. Älä käytä flexible-versiota!
Flexible syö nopeasti kaikki krediittisi.
Pelkästään omalla koneella
toimiva työ ei kelpaa.
Sovelluksen asetukset app.yaml-tiedostossa on oltava seuraavat.
Pythonin versio saa olla uudempikin kuin 3.9.
runtime: python39 instance_class: F1 automatic_scaling: target_cpu_utilization: 0.5 min_instances: 2 max_instances: 3 min_idle_instances: 2 max_idle_instances: 3 min_pending_latency: 30ms max_pending_latency: 100ms max_concurrent_requests: 10
- Sovellus on toteutettava Flask-frameworkilla
- Kaikissa vertailuissa ja järjestämisissä isoilla ja pienillä kirjaimilla ei ole merkitystä.
- Sovelluksen on toimittava riippumatta tietokannan sisällöstä ja koosta. Kilpailuja voi olla kymmeniä ja joukkueita voi olla satoja ja silti sovelluksen on toimittava.
- Sovelluksen on toimittava usealla yhtäaikaisella käyttäjällä
- Kaikkien lomakkeiden virheellisistä syötteistä on esitettävä virheilmoitus kyseisen kentän yhteydessä
- Sovellus ei saa kaatua
- Sovelluksesta on oltava gitillä ylläpidetty versiohallinta
Taso 1
Toteuta web-sovellus, jossa voi lisätä joukkueita kilpailutietokantaan.
Datastoreen on tallennettava valmiiksi hieman vastaavat tiedot, kuin mitä käytettiin aiemmissa viikkotehtävissä. Tässä sisältö on helposti käsiteltävässä muodossa. Muista varmistaa, että sarjat liittyvät oikeaan kilpailuu ja joukkueet oikeaan sarjaan. Kilpailun id ja sarjan id ovat yhdistäviä tietoja.
kilpailut = [{"id": 1, "kisanimi":"Jäärogaining", "loppuaika": "2019-03-17 20:00:00", "alkuaika": "2019-03-15 09:00:00"}, {"id": 2, "kisanimi":"Fillarirogaining", "loppuaika": "2016-03-17 20:00:00", "alkuaika": "2016-03-15 09:00:00"}, {"id": 3, "kisanimi":"Kintturogaining", "loppuaika": "2017-03-18 20:00:00", "alkuaika": "2017-03-18 09:00:00"},{"id": 99, "kisanimi":"Jäärogaining", "loppuaika": "2023-05-01 20:00:00", "alkuaika": "2023-05-01 12:00:00"}]
sarjat = [{"sarjanimi":"4 h", "kilpailu": 1, "kesto": 4, "id": 1}, {"sarjanimi":"2 h", "kilpailu": 1, "kesto": 2, "id": 2}, {"sarjanimi":"8 h", "kilpailu": 1, "kesto": 8, "id": 3},{"sarjanimi":"Pikkusarja", "kilpailu": 3, "kesto": 4, "id": 4},{"sarjanimi":"8 h", "kilpailu": 3, "kesto": 8, "id": 5}, {"sarjanimi":"Isosarja", "kilpailu": 3, "kesto": 8, "id": 6},{"sarjanimi":"Pääsarja", "kilpailu": 2, "kesto": 4, "id":7},{"sarjanimi":"2 h", "kilpailu": 2, "kesto": 2, "id": 8}]
joukkueet = [{"sarja": 3, "nimi": "Onnenonkijat", "jasenet": ["Antero Paununen", "Pekka Paununen", "Raimo Laine"]}, {"sarja": 3, "nimi": "Mudan Ystävät", "jasenet": ["Kaija Kinnunen", "Teija Kinnunen"]}, {"sarja": 3, "nimi": "Vara 3", "jasenet": ["barbar", "foofoo"]}, {"sarja": 3, "nimi": "Tollot", "jasenet": ["Juju", "Tappi"]}, {"sarja": 3, "nimi": "Kahden joukkue", "jasenet": ["Matti Humppa", "Miikka Talvinen"]}, {"sarja": 3, "nimi": "Siskokset", "jasenet": ["Sanna Haavikko", "Seija Kallio"]}, {"sarja": 3, "nimi": "Dynamic Duo", "jasenet": ["Karhusolan Rentukka", "Kutajoen Tiukunen"]}, {"sarja": 3, "nimi": "Toipilas", "jasenet": ["Leena Annila", "Satu Lehtonen"]}, {"sarja": 3, "nimi": "Sopupeli", "jasenet": ["Antti Haukio", "Janne Hautanen", "Taina Pekkanen", "Venla Kujala"]}, {"sarja": 1, "nimi": "Retkellä v 13", "jasenet": ["Henna Venäläinen", "Katja Vitikka"]}, {"sarja": 1, "nimi": "Pelättimet", "jasenet": ["Kari Vaara", "Katja Vaara"]}, {"sarja": 3, "nimi": "Kaakelin putsaajat", "jasenet": ["Jaana Kaajanen", "Mikko Kaajanen", "Timo Ruonanen"]}, {"sarja": 3, "nimi": "Vara 1", "jasenet": ["barfoo","foobar"]}, {"sarja": 2, "nimi": "Hullut fillaristit", "jasenet": ["Hannele Saari", "Paula Kujala"]}, {"sarja": 2, "nimi": "Kotilot", "jasenet": ["Jaana Meikäläinen", "Kaisa Konttinen", "Maija Meikäläinen", "Niina Salonen"]}, {"sarja": 3, "nimi": "Rennot 1", "jasenet": ["Anja Huttunen", "Siru Kananen"]}, {"sarja": 3, "nimi": "Vara 2", "jasenet": ["bar","foo"]}, {"sarja": 1, "nimi": "Vapaat", "jasenet": ["Juha Vapaa", "Matti Vapaa"]}, {"sarja": 3, "nimi": "Susi jo syntyessään", "jasenet": ["Janne Pannunen", "Riku Aarnio"]}, {"sarja": 3, "nimi": "Vara 4", "jasenet": ["foo","bar"]}, {"sarja": 1, "nimi": "Rennot 2", "jasenet": ["Heikki Häkkinen", "Piia Virtanen", "Sari Maaninka"]}, {"sarja": 1, "nimi": "Tähdenlento", "jasenet": ["Anu", "Virva"]}, {"sarja": 3, "nimi": "RogRog", "jasenet": ["Antti Kaakkuri", "Mikko Meikäläinen", "Pekka Kosonen", "Samuli Paavola"]},{"sarja": 5, "nimi": "Onnenonkijat", "jasenet": ["Antero Paununen", "Pekka Paununen", "Raimo Laine"]}, {"sarja": 5, "nimi": "Mudan Ystävät", "jasenet": ["Kaija Kinnunen", "Teija Kinnunen"]}, {"sarja": 5, "nimi": "Vara 3", "jasenet": ["barbar", "foofoo"]}, {"sarja": 6, "nimi": "Tollot", "jasenet": ["Juju", "Tappi"]}, {"sarja": 6, "nimi": "Kahden joukkue", "jasenet": ["Matti Humppa", "Miikka Talvinen"]}, {"sarja": 8, "nimi": "Siskokset", "jasenet": ["Sanna Haavikko", "Seija Kallio"]}]
Suunnittele tarjolla olevia tietoja varten sopiva tallennushierarkia Datastoreen. Tallenna valmiina annetut tiedot datastoreen.
Vinkki tietojen lisäämiseen:
from datetime import datetime
alkuaika = datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S")
Sovellukseen on kirjauduttava google-tunnuksella. Kirjautumatta ei saa päästä millekään sovelluksen sivulle. Kirjautumista EI SAA rajata vain student.jyu.fi-tunnuksille tai muulle rajatulle joukolle. Millä tahansa google-tunnuksella täytyy päästä käyttämään sovellusta.
Kirjautumisen jälkeen sovelluksen ylälaidassa on vaakasuuntainen navigointipalkki (vrt. viikkotehtävä 3), josta löytyvät seuraavat kohdat:
- Kilpailut
- Omat joukkueet
- Logout
Sovellus siirtyy kirjautumisen jälkeen suoraan Omat joukkueet-sivulle, jossa listataan kaikki kilpailut sekä kaikki joukkueet, joita kirjautunut henkilö on ilmoittanyt eri kilpailuihin. Jos kirjautunut ei ole ilmoittautunut johonkin kilpailuun, on listauksessa näkyvissä vain kilpailun nimi. Listauksessa näkyy aina ensimmäisenä tapahtuman alkamisaika, tapahtuman nimi ja lopuksi tapahtumaan ilmoitetun joukkueen nimi. Uusin tapahtuma esitetään listauksessa ensimmäisenä ja vanhin viimeisenä.
- 2019-03-15 Fillarirogaining
- Tohelot
- 2018-03-15 Mallikilpailu
- 2016-03-15 Jäärogaining
- Mahtijoukkue
- Kakkossakki
- 2015-03-15 Jäärogaining
- Mahtijoukkue
- ...
- ...
Kukin listauksen kilpailurivi on myös linkki, jota klikkaamalla pääsee lisäämään kyseiseen kilpailuun joukkueen.
Päästään www-lomakkeelle , jolla voi lisätä joukkueen edellä valittuun kilpailuun. Samaan kilpailuun voi lisätä useita joukkueita. Joukkueelta on kysyttävä joukkueen nimi, jäsenten nimet ja sarja. Sarja on valittava kyseiseen kilpailuun kuuluvista sarjoista.
Joukkueita koskevat seuraavat syöttörajoitteet:
- Jäseniä on oltava vähintään kaksi. Jäseniä saa olla enintään viisi
- Joukkueen nimi on pakollinen tieto
- Joukkueen nimi ei saa olla tyhjä eli nimi ei saa sisältää pelkkää whitespacea. Nimen alussa ja lopussa mahdollisesti oleva whitespace poistetaan ennen joukkueen tallentamista
- Joukkue liittyy aina yhteen ja vain yhteen sarjaan
- Sarja on pakko valita. Sarjavalinta on toteutettava radiopainikkeilla, joista on aina jonkun oltava valittuna. Jos kilpailussa ei ole yhtään sarjaa, ei myöskään joukkuetta voi lisätä.
Virheellisistä tai puutteellisista syötteistä on ilmoitettava virheilmoituksella kunkin virheellisen kentän oikealla puolella. Virheellinen syöte täytyy olla kentässä valmiina odottamassa korjausta.
Sovellus listaa Kilpailut-sivulla kolmitasoisena listana kaikki Datastoreen tallennetut kilpailut, sarjat ja joukkueet. Kilpailut listataan käänteisesessä aikajärjestyksessä eli uusin kilpailu (alkuajan mukaan) ensimmäisenä ja vanhin viimeisenä. Joukkueet listataan kilpailuttain ja sarjoittain aakkosjärjestyksessä ja sarjan sisällä joukkueen nimen mukaan aakkosjärjestyksessä. Listaa myös joukkueen jäsenet aakkosjärjestyksessä. Listauksessa on esitettävä myös ne kilpailut, joissa ei ole sarjoja tai joukkueita. Joukkuelistaussivuun (Kilpailut) on linkki kaikkien sivujen ylälaidassa.
- Jäärogaining 2019-03-17
- 2 h
- Joukkue 1
- Jäsen 1
- Jäsen 2
- Joukkue 2
- Jäsen 1
- Jäsen 2
- Joukkue 1
- 4 h
- ...
- 2 h
- Fillarirogaining 2016-03-17
- ...
- ...
- ...
Ylänavigoinnin logout-linkistä voi korjautua ulos järjestelmästä.
Taso 3
Laajenna taso 1 -ohjelmaa seuraavilla ominaisuuksilla:
- Sovelluksessa voi poistaa ja muuttaa joukkueita, jotka kyseinen käyttäjä
on itse lisännyt. Muiden lisäämiä joukkueita ei saa edes tarjota muokattavaksi.
Käyttäjä Tommi kirjautuu sivustolle google-tunnuksellaan.
Käyttäjä Tommi lisää uuden joukkueen Jäärogaining-kilpailuun. Käyttäjä Tommi
voi muokata lisäämiensä joukkueiden tietoja. Käyttäjä Tommi voi poistaa
lisäämänsä joukkueen. Muihin joukkueisiin käyttäjä Tommi ei voi tehdä muutoksia, mutta
näkee kuitenkin kaikki lisätyt joukkueet listauksessa.
Muokkauksen yhteydessä voi myös valita koko
joukkueen poistettavaksi. Muokkaamisessa pätevät samat rajoitukset, kuin
joukkuetta lisättäessä. Muokatessa voi vaihtaa myös joukkueen sarjan.
Kaikki tietoja voi muuttaa.
Joudut tallentamaan sopivan tunnistetiedon käyttäjästä joukkueen tietoihin.
- Lisää seuraavat tarkistukset ja muutokset:
- Joukkueessa ei saa olla kahta samannimistä jäsentä. Nimien vertailu on oltava caseinsensitive. Jäsenen nimessä ei tallenneta nimen alussa tai lopussa mahdollisesti olevaa whitespacea
- Jäseniä voi olla 1 - N kappaletta
- Joukkueen jäsenen nimi ei saa olla kokonaan tyhjä eli nimi ei saa sisältää pelkkää whitespacea
- Samassa kilpailussa ei osaa olla kahta samannimistä joukkuetta
- Kilpailut-sivun listauksessa on oltava linkki kaikista kirjautuneen henkilön joukkueista muokkaussivulle, jossa voi muokata kyseisen joukkueen tietoja tai poistaa joukkueen
Taso 5
Laajenna taso 3 -ohjelmaa seuraavilla ominaisuuksilla:
- Lisää sovellukseen kilpailukohtainen Admin-tila (oma sivu, jonka osoite on /admin), johon kirjaudutaan erikseen vielä Google-kirjautumisen lisäksi. Admin-tilaan ei saa päästä ilman google-tunnusta. Admin-tilan salasana on jokaisella kilpailulla sama kuin kyseisen kilpailun nimi. Salasana ei saa esiintyä missään selkokielisenä. Salasana on toteutettava tavalla, jossa kunkin kilpailun salasana voisi olla mitä tahansa. Testaamisen helpottamiseksi aseta tässä oletussalasanaksi kaikille kilpailun nimi.
- Lisää sovellukseen myös mahdollisuus luoda Admin-käyttäjänä kokonaan uusi kilpailu ja siihen liittyviä sarjoja sekä joukkueita. Mahdollista myös kilpailujen poistaminen. Kilpailun voi poistaa, jos kilpailuun ei liity yhtään joukkuetta.
- Admin-käyttäjä näkee aina vain valitun kilpailun tiedot. Käyttäjä
voi vapaasti muokata kaikkia kyseisen kilpailun tietoja (kilpailun nimi, alkuaika, loppuaika),
lisätä, poistaa ja muuttaa kilpailun joukkueita sekä
muokata, poistaa ja lisätä kilpailuun sarjoja
- Samassa kilpailussa ei saa olla kahta samannimistä sarjaa. Nimien vertailu on caseinsensitive eikä nimen alussa tai lopussa olevaa whitespacea huomioida
- Sarjan keston on oltava positiivinen kokonaisluku
- Sarjaa ei saa poistaa, jos sarjaan liittyy joukkueita
- Kilpailun alkuaika on oltava ennen loppuaikaa
- Kilpailun nimi, alkuaika ja loppuaika ovat pakollisia
- Kilpailuja voi olla useita samannimisiä, mutta kilpailun nimi ja sen kilpailuaika (alkuajan ja loppuajan välinen aika) eivät saa mennä päällekkäin toisen samannimisen kilpailun kanssa. Esim. Jäärogaining voi olla useana vuotena, mutta kahta Jäärogainingia ei voi olla saman päivänä
- Kilpailun alkuaika ja loppuaika kelpuutetaan vain samassa muodossa, kuin valmiissa datassa olevien kilpailujen alku- ja loppuajat
- Halutessaan muokata toisen kilpailun tietoja, on Admin-käyttäjän erikseen kirjauduttava toiseen kilpailuun
- Admin-käyttäjä näkee myös millä google-tunnuksilla joukkueita on lisätty. Admin-käyttäjä voi myös vaihtaa joukkueen omistajaksi eri google-tunnuksen. Admin-käyttävä voi myös siirtää joukkueen kilpailussa toiseen sarjaan.
- Sovelluksesta täytyy selkeästi näkyä, että milloin ollaan Admin-tilassa ja minkä kilpailun tietoja muokataan ja milloin ollaan tavallisen käyttäjän tilassa
Käyttäjien kommentit