# -*- coding: UTF-8 -*- from xml.dom.minidom import getDOMImplementation, parse, parseString import os def index(req): req.content_type = 'text/html ;charset=utf-8' #oletukset virheille ja oletusarvoille virheet = {"etunimi": "", "sukunimi":"", "tiedekunta":""} oletus = {"etunimi": "", "sukunimi":"", "tiedekunta":"0"} #jos lomake on lähetetty niin tarkistetaan virheet ja alustetaan lomakkeen oletukset if req.form.getfirst("laheta") == "Lähetä!": if req.form.getfirst("etunimi") == "": virheet["etunimi"] = u"etunimeä ei ole annettu" else: oletus["etunimi"] = req.form.getfirst("etunimi") if req.form.getfirst(u"sukunimi") == "": virheet["sukunimi"] = u"sukunimeä ei ole annettu" else: oletus["sukunimi"] = req.form.getfirst(u"sukunimi") if req.form.getfirst("tdk") == '0': virheet["tiedekunta"] = "Tiedekuntaa ei ole valittu" else: oletus["tiedekunta"] = req.form.getfirst("tdk", "0") viikkotehtavat = dict() viikkotehtavat_error = dict() # tämä pitäisi kaivella pohjatiedostosta. Tehtävien lukumäärä. Vaihtoehtoisesti pitäisi luoda koodissa tämän # perusteella oikea määrä valintoja i = 9 while(i): tunniste = "vt_" + str(i) arvo = req.form.getfirst(tunniste, "") viikkotehtavat[tunniste] = arvo viikkotehtavat_error[tunniste] = "" if arvo != "": try: if int( arvo ) < 0 or int(arvo) > 5: viikkotehtavat_error[tunniste] = "!" except: viikkotehtavat_error[tunniste] = "!" i -= 1 #tiedekunnat on tutkittava erikseen tiedekunnat = {"0":"Valitse tiedekunta", "1":"Humanistinen tiedekunta", "2":"Informaatioteknologian tiedekunta", "3":"Kasvatustieteiden tiedekunta", "4":"Liikunta- ja terveystieteiden tiedekunta", "5":"Matemaattis-luonnontieteellinen tiedekunta", "6":"Taloustieteiden tiedekunta", "7":"Yhteiskuntatieteellinen tiedekunta"} # sivu = """ # """ % (req.uri, oletus["etunimi"],virheet["etunimi"], oletus["sukunimi"], virheet["sukunimi"], tiedekunnat_html, virheet["tiedekunta"]) return html(req, req.uri, oletus["etunimi"],virheet["etunimi"], oletus["sukunimi"], virheet["sukunimi"], tiedekunnat, virheet["tiedekunta"], oletus["tiedekunta"], viikkotehtavat, viikkotehtavat_error) # Tehdään kaikki html:ään liittyvä erillään muusta ohjelmalogiikasta (MVC) def html(req, uri, etunimi_default,etunimi_error, sukunimi_default, sukunimi_error, tiedekunnat, tiedekunnat_error, tiedekunnat_default, viikkotehtavat, viikkotehtavat_error): # seuraavat eivät tässä toimi # dom = parse("/wwwhome/nashome3/tjlahton/html/python/ohjaus4/pohja.html") # dom = parse("/autowebhome/home/tjlahton/html/python/ohjaus4/pohja.html") # nyt ei ole käytössä CGI-rajapinta vaan mod_pythonin rajapinta ja oikea polku löytyy req.filenamen kautta # luodaan absoluuttinen tiedostopolku samassa kansiossa tämän python-ohjelman kanssa olevaan pohja.html-tiedostoon: pohja = os.path.join(os.path.dirname(req.filename), 'pohja.html') # kaikissa seuraavissa dom-operaatioissa pitäisi varautua virheisiin ja laittaa koko höskä try..exceptin sisälle dom = parse(pohja) form = find_element(dom, "form", "form") form.setAttribute("action", uri) # oletusarvot etunimi = find_element(dom, "etunimi", "input") etunimi.setAttribute("value", etunimi_default) sukunimi = find_element(dom, "sukunimi", "input") sukunimi.setAttribute("value", sukunimi_default) tdk = find_element(dom, "tdk", "select") for key in sorted(tiedekunnat.iterkeys()): option = dom.createElement("option") option.setAttribute("value", key) txt = dom.createTextNode(tiedekunnat[key]) option.appendChild(txt) if tiedekunnat_default == key: option.setAttribute("selected", "selected") tdk.appendChild(option) #virheet etunimi = find_element(dom, "etunimi_err", "span") txt = dom.createTextNode(etunimi_error) etunimi.appendChild(txt) sukunimi = find_element(dom, "sukunimi_err", "span") txt = dom.createTextNode(sukunimi_error) sukunimi.appendChild(txt) tdk = find_element(dom, "tdk_err", "p") txt = dom.createTextNode(tiedekunnat_error) tdk.appendChild(txt) #viikkotehtävät for key in viikkotehtavat: arvo = viikkotehtavat[key] vt = find_element(dom, key, "input") vt.setAttribute("value", arvo) if viikkotehtavat_error[key]: virhe = dom.createTextNode("!") vt.parentNode.appendChild(virhe) return dom.toxml('UTF-8') # apufunktio tietyn elementin hakemiseen id:n perusteella, koska minidom ei tunnista id-attribuutteja # Jos olisi käytössö python 2.5 tai uudempi niin voitaisiin käyttää kätsympää elementtree-kirjastoa... # xhtml-dokumenteissa # root = elementti, jonka alta etsitään # id = haettava tunniste # element = haettava elementti def find_element(root, id, element="*"): for e in root.getElementsByTagName(element): if e.hasAttribute("id") and e.getAttribute("id") == id: return e return None