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 index(req): """Päivitä id:tä vastaava resepti.""" req.content_type = "text; charset=utf-8" data = tarkista_resepti.get_data(req) if not tarkista_resepti.data_ok(data): return "Virhe syötetyissä tiedoissa!" recipe_id = int(req.form.getfirst("id")) con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() try: cur.execute("begin") cmd = """ update resepti set nimi = ?, kuvaus = ?, henkilomaara = ?, ruokalajiid = ? where reseptiid = ?; """ cur.execute(cmd, (data["nimi"], data["kuvaus"], int(data["maara"]), int(data["laji"]), recipe_id)) # Aiemmat vaiheet poistetaan. cmd = """ delete from ohje where reseptiid = ?; """ cur.execute(cmd, (recipe_id,)) # Uudet vaiheet lisätään järjestyksessä. cmd = """ insert into ohje (vaihenro, reseptiid, ohjeteksti) values (?, ?, ?); """ vaihenro = 1 for teksti in data["tekstit"]: # Tyhjät vaiheet ohitetaan/poistetaan if teksti.strip() == "": continue cur.execute(cmd, (vaihenro, recipe_id, teksti)) vaihenro += 1 cur.execute("commit") except Exception, e: cur.execute("rollback") return "Tietokantavirhe! (%s)" % str(e)
def index(req): """Hae reseptit aakkosjärjestyksessä. Jos lomakkeessa on mukana "id", haetaan vain id:tä vastaava resepti.""" con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() accept_id = req.form.getfirst("id") if accept_id != None: accept_id = int(accept_id) cmd = """ select re.nimi as nimi, re.reseptiid as id, re.kuvaus as kuvaus, re.henkilomaara as maara, re.ruokalajiid as lajiid, 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) reseptilista = [] resepti = None prev_row = None for row in cur: id = row["id"] if accept_id != None and id != accept_id: continue curr_row = id if prev_row != curr_row: resepti = {} resepti["nimi"] = row["nimi"] resepti["id"] = row["id"] resepti["kuvaus"] = row["kuvaus"] resepti["maara"] = row["maara"] resepti["laji"] = row["lajiid"] resepti["ohjetekstit"] = [] reseptilista.append(resepti) prev_row = curr_row if row["teksti"] != None: resepti["ohjetekstit"].append(row["teksti"]) con.close() req.content_type = "text; charset=utf-8" reseptijson = json.dumps(reseptilista) return reseptijson
def index(req): con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() cur.execute(""" select nimi as nimi, kuvaus as kuvaus, ruokalajiid as id from ruokalaji order by nimi collate nocase; """) lajit = [] for row in cur: laji = listaus.append_dict({}, row) lajit.append(laji) req.content_type = "text; charset=utf-8" return json.dumps(lajit)
def index(req): con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() cur.execute(""" select nimi, kuvaus, ruokalajiid as id from ruokalaji order by nimi collate nocase; """) lajit = [] for row in cur: laji = {} laji["nimi"] = row["nimi"] laji["id"] = row["id"] laji["kuvaus"] = row["kuvaus"] lajit.append(laji) req.content_type = "text; charset=utf-8" return json.dumps(lajit)
def index(req): """Näytä lomake, jossa voi muokata kaikkia ruokalajeja yksi kerrallaan.""" global htmlpath global itempath inserting = req.form.getfirst("insert") != None updating = req.form.getfirst("update") != None fetching = not (inserting or updating) dom = minidom.parse(htmlpath) itemdom = minidom.parse(itempath) dom_item_template = itemdom.documentElement con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() # Hoida uusien tietojen päivittäminen tietokantaan ensiksi. errors = None db_error = False # Yleinen näytettävä viesti tietokantaoperaation onnistumisesta. status = u"" if inserting or updating: data = get_form_data(req) errors = validate_form(data) if errors == None and inserting: try: cur.execute("begin") cmd = """ insert into ruokalaji (nimi, kuvaus) values (?, ?); """ cur.execute(cmd, (data["nimi"], data["kuvaus"])) cur.execute("commit") status = u"Lisättiin uusi ruokalaji!" except Exception, e: cur.execute("rollback") db_error = True status = u"Virhe lisättäessä! (virhe: %s)" % str(e)
def index(req): req.content_type = "text; charset=utf-8" data = tarkista_laji.get_data(req) if not tarkista_laji.data_ok(data): return "Virhe syötetyissä tiedoissa!" con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() try: cur.execute("begin") cmd = """ insert into ruokalaji (nimi, kuvaus) values(?, ?); """ cur.execute(cmd, (data["nimi"], data["kuvaus"])) cur.execute("commit") except Exception, e: cur.execute("rollback") return "Tietokantavirhe! (%s)" % str(e)
def index(req): """Hae reseptit aakkosjärjestyksessä.""" con = dbutil.get_con(dbutil.dbfile) cur = con.cursor() accept_id = req.form.getfirst("id") if accept_id != None: accept_id = int(accept_id) cmd = """ select distinct re.nimi as nimi, re.kuvaus as kuvaus, re.henkilomaara as maara, re.reseptiid as id, ru.nimi as laji, ru.ruokalajiid as lajiid from resepti re, ruokalaji ru where re.reseptiid = ? and ru.ruokalajiid = re.ruokalajiid order by re.nimi, re.reseptiid collate nocase; """ cur.execute(cmd, (accept_id,)); else: cmd = """ select distinct re.nimi as nimi, re.kuvaus as kuvaus, re.henkilomaara as maara, re.reseptiid as id, ru.nimi as laji, ru.ruokalajiid as lajiid from resepti re, ruokalaji ru where ru.ruokalajiid = re.ruokalajiid order by re.nimi, re.reseptiid collate nocase; """ cur.execute(cmd); aineet_cmd = """ select ai.nimi as nimi, ai.aineid as aineid, yk.lyhenne as yksikko, yk.nimi as yksikkonimi, li.maara as maara from liittyy li, aine ai, yksikko yk where li.resepti_reseptiid = ? and ai.aineid = li.aine_aineid and yk.lyhenne = li.yksikko_lyhenne; """ vaiheet_cmd = """ select vaihenro as numero, ohjeteksti as teksti from ohje where ohje.reseptiid = ?; """ reseptilista = [] rows = cur.fetchall() for row in rows: resepti = append_dict({}, row) id = resepti["id"] cur.execute(aineet_cmd, (id,)) aineet = [] for i in cur: aine = append_dict({}, i) aineet.append(aine) resepti["aineet"] = aineet cur.execute(vaiheet_cmd, (id,)) vaiheet = [] for i in cur: vaihe = append_dict({}, i) vaiheet.append(vaihe) resepti["vaiheet"] = vaiheet reseptilista.append(resepti) con.close() req.content_type = "text; charset=utf-8" return json.dumps(reseptilista)
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