def index(req): """Näytä kirjautumislomake tai tarkista ohjaa etusivulle jos löytyy kelvolliset kirjautumistiedot.""" dom = minidom.parse(htmlpath) # Jos login-lomakkeen tiedot pyynnössä mukana, tehdään tarkistukset. if req.form.getfirst("submit") != None: tunnus = req.form.getfirst("tunnus", "") salasana = req.form.getfirst("salasana", "") virhe = dbutil.verify(tunnus, salasana) # Tallennetaan kirjautuminen ja ohjataan etusivulle jos tiedot ok. if virhe == 0: req.session["kirjautunut"] = "1" req.session.save() modutil.redirect(req, "index.py") # Ilmoitetaan virheistä, jos tiedot väärin. if virhe == 1: msg = u"Virheellinen salasana!" else: msg = u"Käyttäjätunnusta ei löydy!" dom_errmsg = domutil.getContentElementById("error_text", dom) dom_p = dom.createElement("p") dom_errmsg.appendChild(dom_p) dom_p.appendChild(dom.createTextNode(msg)) req.content_type = "application/xhtml+xml; charset=utf-8" html = dom.toxml("utf-8") return html
def fill_form(id, data, dom): """Hae pyynnöstä lomakkeen data. Returns: Data dict-muodossa. Avaimet: nimi (str), kuvaus (str) """ dom_item = domutil.getContentElementById("item%s" % id, dom) domutil.getElementById("nimi%s" % id, dom_item).setAttribute("value", data["nimi"].decode("utf-8")) domutil.getElementById("kuvaus%s" % id, dom_item).setAttribute("value", data["kuvaus"].decode("utf-8"))
def fill_errors(errors, dom): """Täytä errors-dictin avaimien nimiä vastaavat DOM-elementit avaimia vastaavalla virheilmoituksella. Args: errors: Virheilmoitukset dict-muodossa. Avaimet: nimi (str), kuvaus (str), maara (str), laji (str), tekstit (str[]). HUOM oletetaan, että löytyy virhe-elementit muotoa avain+"_err" """ for error in errors.keys(): errname = "%s_err" % error dom_err = domutil.getContentElementById(errname, dom) dom_err.appendChild(dom.createTextNode(errors[error]))
def fetch(recipe_id, dom, con): """Hae recipe_id:tä vastaava resepti tietokannasta ja aseta sen tiedot sivun lomakkeelle. Returns: True, jos onnistui. """ try: data = db_fetch(recipe_id, con) except Exception, e: dom_errmsg = domutil.getContentElementById("error_text", dom) dom_errmsg.appendChild(dom.createTextNode(u"Ongelmia tietokannasta haettaessa! (virhe: %s)" % str(e))) return False
def index(req): """Näytä listaus tietokannassa olevista resepteistä. Reseptiä klikkaamalla pääsee muokkaussivulle.""" req.content_type = "application/xhtml+xml; charset=utf-8" dom = minidom.parse(htmlpath) dom_reseptit = domutil.getContentElementById("reseptit", dom) dom_reseptilista = dom.createElement("ul") dom_reseptit.appendChild(dom_reseptilista) con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() cmd = """ select re.nimi as nimi, re.reseptiid as id, oh.ohjeteksti as teksti from resepti re left outer join ohje oh on re.reseptiid = oh.reseptiid order by re.nimi, re.reseptiid collate nocase; """ cur.execute(cmd) # Lisää reseptien vaiheet sivulle listana. Jos vaihe on reseptin ensimmäinen, luodaan uusi reseptin nimellä otsikoitu taso. prev_row = (None, None) for row in cur: curr_row = (row["nimi"], row["id"]) if prev_row != curr_row: dom_outer_li = dom.createElement("li") dom_reseptilista.appendChild(dom_outer_li) dom_h = dom.createElement("h2") dom_outer_li.appendChild(dom_h) dom_a = dom.createElement("a") dom_h.appendChild(dom_a) # Otsikoissa on linkit sivulle, jossa reseptiä pääsee muokkaamaan. dom_a.setAttribute("href", "add_recipe.py?id=%s" % (row["id"],)) dom_a.appendChild(dom.createTextNode(row["nimi"].decode("utf-8"))) dom_ol = dom.createElement("ol") dom_outer_li.appendChild(dom_ol) prev_row = curr_row if row["teksti"] != None: dom_li = dom.createElement("li") dom_ol.appendChild(dom_li) dom_li.appendChild(dom.createTextNode(row["teksti"].decode("utf-8"))) # tyhjät listat ei kelpaa else: tmp = dom_ol.parentNode tmp.removeChild(dom_ol) con.close() html = dom.toxml("utf-8") return html
def update(recipe_id, req, dom, con): """Päivitä recipe_id:tä vastaava resepti tietokantaan req:n lomakkeen tiedoilla. Myös syötteet tarkistetaan ja lomakkeen virheilmoitukset asetetaan. Returns: True, jos onnistui. """ success = True data = get_form_data(req) errors = validate_form(data) if errors != None: fill_form(data, dom) fill_errors(errors, dom) return try: db_update(recipe_id, data, con) dom_statusmsg = domutil.getContentElementById("status_text", dom) dom_statusmsg.appendChild(dom.createTextNode(u"Päivitettiin resepti!")) except Exception, e: success = False fill_form(data, dom) dom_errmsg = domutil.getContentElementById("error_text", dom) dom_errmsg.appendChild(dom.createTextNode(u"Virhe muokatessa! (virhe: %s)" % str(e)))
def fill_form(data, dom): """Täytä sivun lomake datan tiedoilla. Args: data: Data dict-muodossa. Avaimet: nimi (str), kuvaus (str), maara (str), laji (str), tekstit (str[]) """ domutil.getContentElementById("nimi", dom).setAttribute("value", data["nimi"].decode("utf-8")) domutil.getContentElementById("kuvaus", dom).appendChild(dom.createTextNode(data["kuvaus"].decode("utf-8"))) domutil.getContentElementById("maara", dom).setAttribute("value", data["maara"].decode("utf-8")) # Hae ja aseta viimeksi valittu ruokalaji. for option in domutil.getContentElementById("laji", dom).childNodes: if option.getAttribute("value") == data["laji"]: option.setAttribute("selected", "selected") # Palauta ohjetekstit. dom_tekstit = domutil.getContentElementById("vaiheet", dom).childNodes tekstit = data["tekstit"] for i in xrange(0, len(tekstit)): teksti = tekstit[i] dom_teksti = dom_tekstit[i].firstChild dom_teksti.appendChild(dom.createTextNode(teksti.decode("utf-8")))
cmd = """ update ruokalaji set nimi = ?, kuvaus = ? where ruokalajiid = ?; """ cur.execute(cmd, (data["nimi"], data["kuvaus"], id)) cur.execute("commit") status = u"Muutokset tallennettu!" except Exception, e: cur.execute("rollback") db_error = True status = u"Virhe tallentaessa! (virhe: %s)" % str(e) # Luo kentät jokaiselle tietokannasta löytyvälle ruokalajille, ja aseta niiden id:t ruokalajia vastaaviksi dom_items = domutil.getContentElementById("items", dom) cur.execute(""" select nimi as nimi, kuvaus as kuvaus, ruokalajiid as id from ruokalaji; """) kinds = cur.fetchall() # Luo oma lomake jokaiselle ruokalajille. for row in kinds: id = str(row["id"]) dom_item = dom_item_template.cloneNode(True) # Aseta piilotetun id-inputin arvo ruokalajiid:n mukaan dom_id = domutil.getElementById("id", dom_item) dom_id.setAttribute("value", id) # Aseta näille uniikit id:t ruokalajiid:n perusteella että löydetään myöhemmin eikä tule id-konflikteja elem_names = ["item", "id", "nimi", "kuvaus", "status_text", "nimi_err", "kuvaus_err"] for elem_name in elem_names:
def index(req): """Näytä sivu, jolla voi lisätä reseptin. Jos pyynnössä on mukana "id"-kenttä, näytetään muokkaussivu vastaavalle reseptille.""" global addpath global editpath vaiheita = 10 recipe_id = req.form.getfirst("id") get_present = recipe_id != None submit_present = req.form.getfirst("submit") != None inserting = submit_present and not get_present updating = submit_present and get_present fetching = not (inserting or updating) and get_present if fetching or updating: htmlpath = editpath else: htmlpath = addpath dom = minidom.parse(htmlpath) con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() # Luo dynaamiset dom-elementit. # Dropdown, jossa saatavilla olevat ruokalajit. dom_lajilista = domutil.getContentElementById("laji", dom) cur.execute(""" select nimi, ruokalajiid as id from ruokalaji; """) for row in cur: dom_option = dom.createElement("option") dom_lajilista.appendChild(dom_option) dom_option.setAttribute("value", str(row["id"]).decode("utf-8")) dom_option.appendChild(dom.createTextNode(row["nimi"].decode("utf-8"))) # Tekstikentät, joihin voi kirjoittaa reseptin vaiheet. dom_vaihelista = domutil.getContentElementById("vaiheet", dom) for i in xrange(0, vaiheita): dom_li = dom.createElement("li") dom_vaihelista.appendChild(dom_li) dom_textarea = dom.createElement("textarea") dom_li.appendChild(dom_textarea) dom_textarea.setAttribute("name", "teksti") dom_textarea.setAttribute("cols", "60") dom_textarea.setAttribute("rows", "2") to_index = False if inserting: insert(req, dom, con) elif updating: to_index = update(recipe_id, req, dom, con) elif fetching: fetch(recipe_id, dom, con) con.close() # Jos muokattiin olemassaolevaa reseptiä, ei jäädä lomakkeelle. if to_index: modutil.redirect(req, "index.py") req.content_type = "application/xhtml+xml; charset=utf-8" html = dom.toxml("utf-8") return html