Exemple #1
0
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
Exemple #2
0
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"))
Exemple #3
0
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]))
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
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)))
Exemple #7
0
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")))
Exemple #8
0
			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:
Exemple #9
0
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