from gluon.tools import Mail response.title = "Viikkotehtävät" @auth.requires_login() def index(): response.title = "Täydennä henkilötietosi" record = db.auth_user(auth.user.id) # pyytää täydentämään henkilötiedot jos ne ovat vajaat if ( record.first_name == "" or record.last_name == "" or ( record.first_name == record.last_name ) ): form = SQLFORM(db.auth_user, record, fields = ['first_name', 'last_name'], showid=False) if str(form.vars.first_name).strip() != "" and str(form.vars.last_name).strip() != "" and form.process().accepted: return redirect(URL('palauta')) elif form.errors: response.flash = 'Lomakkeessa on virheitä' else: response.flash = 'Täytä lomake' return dict(form=form) return redirect(URL('palauta')) def user(): return dict(form=auth()) def kiitos(): return dict(form="kiitos") def arviointi(): return dict(form="arviointi") @auth.requires_login() def palauta(): record = db.auth_user(auth.user.id) # tarkistetaan vielä jos nimitietoja ei ole syötetty ja ohjataan index-sivulle jos on puutteita if ( record.first_name.strip() == "" or record.last_name.strip() == ""): return redirect(URL('index')) if ( record.first_name == record.last_name ): return redirect(URL('index')) response.title = "Palauta viikkotehtävä" # kellonaika tietokannalle sopivassa muodossa aika = datetime.datetime.fromtimestamp(time.time()+3*60*60).strftime('%Y-%m-%d %H:%M:%S') # haetaan viikot joiden deadline on myöhemmin kuin kellonaika, järjestetään kunkin viikon takarajan perusteella ja # otetaan näin saaduista viikoista ensimmäinen (.first()) vt = db( db.viikko.deadline > aika).select(orderby=db.viikko.deadline).first() # haetaan jos tehtävä olisi palautettu jo aiemmin eli viimeinen # kirjautuneena olevan käyttäjän palauttama tehtävä, joka on halutulta viikolta # kysely palauttaa oikeasti vain yhden tuloksen mutta tietorakenne on kuitenkin lista niin pitää pyytää .last() # jotta saadaan vain se yksi kappale tehtava = db( (db.tehtava.palauttaja == auth.user.id) & (db.tehtava.vt == vt)).select(orderby=db.tehtava.palautusaika).last() update = False # jos tehtävä löytyi niin näytetään lomake päivitysmoodissa ja muussa tapauksessa lisäysmoodissa if ( tehtava ): form = SQLFORM(db.tehtava, tehtava, showid=False) update = True else: form = SQLFORM(db.tehtava) # tarkistetaan lomakkeen tiedot, jos ok niin syötetään uusi tai päivitetään vanha if form.validate(): # lisätään lomakkeelta tulleiden muuttujien joukkoon viikkotehtävän numero, käyttäjän tunniste ja palautusaika # näitähän ei kysytty lomakkeella mutta tarvitaan kuitenkin, että lisääminen onnistuu form.vars.vt = vt form.vars.palauttaja = auth.user.id form.vars.palautusaika = datetime.datetime.fromtimestamp(time.time()+3*60*60).strftime('%Y-%m-%d %H:%M:%S') # tehdään varsinainen päivitys tai lisäys tietokantaan. Jos ehtojen mukaista tietuetta ei löydy niin syötetään uusi # lomakkeella olevan tietojen pohjalta. Jos löytyy niin silloin tehdään päivitys # Tässä olisi voinut hyödyntää myös ylempänä jo haettua tehtävää ja toteuttaa ihan eri tavalla db.tehtava.update_or_insert((db.tehtava.vt==form.vars.vt)&(db.tehtava.palauttaja==form.vars.palauttaja),**dict(form.vars)) # lähetetään myös sähköposti. App Engine antaa lähettää 100 sähköpostiviestiä päivässä user = db.auth_user(auth.user.id) mail = Mail() mail.settings.server = 'gae' try: onnistui = mail.send(to=[user.first_name + " " + user.last_name + " <" + user.email + ">"], subject='TIEA218 Viikkotehtävä ' + str(vt.viikko), sender="hazorus@gmail.com", bcc="hazorus@gmail.com", message="Palautit viikkotehtävän: " + str(vt.viikko) + "\n" + "Palautusaika: " + str(form.vars.palautusaika) + "\n" + "Taso: " + str(form.vars.taso) + "\n" + "Aika: " + str(form.vars.aika) + "\n" + "Url: " + str(form.vars.url) + "\n" + "Zip: " + str(form.vars.url_zip) + "\n") except apiproxy_errors.OverQuotaError, message: logging.error(message) return redirect(URL('kiitos')) # else: # response.flash = 'Sähköposti epäonnistui' elif form.errors: response.flash = 'Lomakkeessa on virheitä' else: response.flash = 'Täytä lomake' return dict(form=form, viikko=vt, update=update) return "foo" @auth.requires_login() def tarkista(): user = db.auth_user(auth.user.id) response.title = "Tarkista viikkotehtävä" # Haetaan valmis palaute palaute = db(db.palaute.arvostelija == auth.user.id).select(db.palaute, orderby=db.palaute.arvosteluaika).last() if not palaute: return dict(form="", palaute="", tehtava="", user="") # tarkistettava tehtävä tehtava = db( db.tehtava.id == palaute.tehtava).select(db.tehtava, orderby=db.tehtava.palautusaika).last() form = SQLFORM(db.palaute, palaute, fields = ['palaute', 'arvosana'], showid=False) if form.process().accepted: return redirect(URL('arviointi')) elif form.errors: response.flash = 'Lomakkeessa on virheitä' else: response.flash = 'Täytä lomake' return dict(form=form, palaute=palaute, tehtava=tehtava, user=user) @auth.requires_login() def omat(): user = db.auth_user(auth.user.id) # haetaam kaikki omat tehtävät tehtavat = db(db.tehtava.palauttaja == user).select(db.tehtava, orderby=db.tehtava.palautusaika) palautteet = {} # haetaan tehtäviä vastaavat palautteet ja muodostetaan näistä näkymälle sopiva tietorakenne # relaatiotietokannassa nämä olisi pitänyt hakea samassa kyselyssä, kun haettiin tehtävätkin mutta # nyt käytössä ei ole relaatiotietokanta ja liitoksia ei voida tehdä vaan täytyy hoitaa sama asia # ohjelmallisesti for item in tehtavat: palaute = db(db.palaute.tehtava == item).select(db.palaute.ALL).first() if palaute: palautteet[(item.id,"palaute")] = palaute.palaute palautteet[(item.id,"arvosana")] = palaute.arvosana else: palautteet[(item.id,"palaute")] = "" palautteet[(item.id,"arvosana")] = "" # haetaan myös ite tehdyt arvostelut arvostelut = db(db.palaute.arvostelija == user).select(db.palaute, orderby=db.palaute.arvosteluaika) return dict(tehtavat=tehtavat, user=user, arvostelut=arvostelut, palautteet=palautteet)