from pysqlite2 import dbapi2 as sqlite from mod_python import util import sys ,datetime, md5, cgi # sqlite database path path = '/home1/106/nimajomo/html/hidden/kanta/kanta' # xml declaraatiot xmldec ='\n' xmlns = 'xmlns="http://www.w3.org/1999/xhtml"' json = "application/json; charset=ISO-8859-1" def index(req): con = openDB() form = req.form # lajityyppien ja treenityyppien haku if form.has_key("gettype"): type = form["gettype"] req.content_type = "text/xml" if type == "lajityyppi":req.write(getSportTypes(con)) if type == "treenityypit": req.write(getWorkoutType(con)) # tunnuksen ja salasanan tarkistus if form.has_key("checkusername"): req.content_type = json if form.has_key("checkpassword"): req.write(getPassword(con,form["checkusername"],form["checkpassword"],"json")) else: req.write(getUserName(con,form["checkusername"],"json")) # keston tarkistus if form.has_key("checkduration"): req.content_type = json req.write(checkDuration(con,form.getfirst("checkduration"),"json")) # ajan tarkistus if form.has_key("checktime"): req.content_type = json req.write(checktime(form["checktime"],"json")) # lajien hakeminen if form.has_key("getsports"): req.content_type = "text/xml" req.write(getSports(con,form["getsports"])) # treenin lisääminen if form.has_key("submit"): req.content_type = "text/xml; charset=ISO-8859-1" if form.has_key("editworkout"): req.write(editWorkout(con,form)) else: req.write(addworkout(con,form)) if form.has_key("getuserworkouts"): req.content_type = "text/xml; charset=ISO-8859-1" req.write(getUserWorkouts(con,form["getuserworkouts"])) if form.has_key("getUserworkoutbyid"): req.content_type = json req.write(getUserworkoutbyid(con,form["getUserworkoutbyid"])) if form.has_key("removeworkout"): req.content_type = json req.write(removeWorkout(con,form["removeworkout"])) con.close return def editWorkout(con,form): string = removeWorkout(con,form["editworkout"]) if string == "": string = addworkout(con,form) return string else: return "Virhe muokattaessa treeniä" def removeWorkout(con,id): workout = """ DELETE FROM treeni WHERE treeniID=:id """ workouttype = """ DELETE FROM tyyppia WHERE treeniID=:id """ sport = """ DELETE FROM lajia WHERE treeniID=:id """ try: cur = con.cursor() cur.execute(workout,{"id":id}) cur.execute(workouttype,{"id":id}) cur.execute(sport,{"id":id}) con.commit() return ""; except: return "Virhe poistettaessa treeniä"; def getUserworkoutbyid(con,id): sql = """ SELECT t.Alkuaika , t.kesto , t.km , t.syke_avg , t.syke_max , t.kalorit , t.kommentti , t.henkiloid ,l.lajiID, lon.lajityyppiID FROM treeni t, laji l, laji_on lon WHERE t.treeniID=:id and l.lajiID =( SELECT la.lajiID FROM lajia la WHERE la.treeniID=t.treeniID) and lon.lajityyppiID=( SELECT lon.lajityyppiID FROM laji_on lon WHERE lon.lajiID=l.lajiID) """ cur = con.cursor() try: cur.execute(sql,{"id":id}) result = cur.fetchone() return '{"alkuaika":"%s","kesto":"%s","km":"%s","syke":"%s","syke_max":"%s","kalorit":"%s","kommentti":"%s","sport":"%s","sportstype":"%s"}'%( result[0],result[1],result[2],result[3],result[4],result[5],result[6],result[7],result[8]) except: con.rollback() return "virhe haettaessa treeniä vastaavia tietoja" def checkDuration(con,duration,json = None): msg = " kesto on väärässä muodossa (1:05:30)" try: tmp = duration.split(':') if len(tmp) == 3: if int(tmp[0]) >= 0 and int(tmp[1]) > 0 and int(tmp[1]) < 60 and int(tmp[2]) >= 0 and int(tmp[2]) < 60: if json: return '{"duration":"%s","status":"ok"}'%duration else: return "" except: pass if duration == "": msg = " kesto ei voi olla tyhjä (1:05:30)" if json: return '{"duration":"%s","status":"error","msg":"%s"}'%(duration,msg) else: return msg def getPassword(con,nick,password,json = None): """Hakee tietokannasta käyttäjänimen""" sql =""" SELECT salasana FROM henkilo WHERE tunnus=:nick """ cur = con.cursor() status = "error" try: cur.execute(sql,{"nick":nick}) result = cur.fetchone()[0] if md5hash(password) == result: if json: return '{"username":"%s","password":"%s","status":"ok"}'%(nick,password) else: return "" except: pass if json: return '{"username":"%s","password":"%s","status":"erro"}'%(nick,password) else: return "tunnus ja salasana eivät täsmää" def md5hash(password): hash = md5.new() hash.update(password) return hash.hexdigest() def getUserName(con,nick,json = None): """Hakee tietokannasta käyttäjänimen""" sql =""" SELECT tunnus FROM henkilo WHERE tunnus=:nick """ cur = con.cursor() status = "error" try: cur.execute(sql,{"nick":nick}) result = cur.fetchone()[0] if nick == result: if json: return'{"username":"%s","status":"ok"}'%(nick) else: return "" except: pass if json: return'{"username":"%s","status":"error"}'%(nick) else: return " Tunnusta ei Löydy" def checktime(time,json = None): """Tarkistaa onko annettu aika kelvollinen""" msg = "" status = "ok" now = datetime.datetime.now() tmp = parse(time) try: if isinstance(tmp,str): msg = tmp status = "error" if not len(tmp) == 5: status = "error" msg = " alkuaika on väärässä muodossa (2008-05-18 13:40)" else: senttime = datetime.datetime(int(tmp[0]),int(tmp[1]),int(tmp[2]),int(tmp[3]),int(tmp[4])) if now < senttime: msg = " alkuaika ei voi olla tulevaisuudessa (2008-05-18 13:40)" except: msg = " alkuaika on väärässä muodossa (2008-05-18 13:40)" status = "error" if time == "": msg = " alkuaika ei voi olla tyhjä (2008-05-18 13:40)" if json: return '{"status":"%s","time":"%s","msg":"%s"}'%(status,time,msg) else: return msg def parse(time): """Parsii ajan merkkijonosta""" try: tmp = time.split(' ') datetime = [] tmp2 = tmp[0].split('-') # päivämäärä for a in tmp2: datetime.append(a) tmp2 = tmp[1].split(':') # kellonaika for a in tmp2: datetime.append(a) return datetime except: return "Aika on virheellisessä muodossa (2008-05-18 13:40)" def openDB(): """Tietokantayhteys""" con = sqlite.connect(path) con.text_factory = str con.row_factory = sqlite.Row return con def addworkout(con,form): """Lisää treenin, siihen kuuluvat lajit sekä treenityypit tietokantaan""" string = "" # tarkistukset varalta, jos joku on onnistunut kiertämään ajax tarkistukset ret = getUserName(con,form["tunnus"]) if not ret == "": return ret ret = getPassword(con,form["tunnus"],form["salasana"]) if not ret == "": return ret ret = checktime(form["alkuaika"]) if not ret == "": return ret ret = checkDuration(con,form["kesto"]) if not ret == "": return ret if form.getfirst("sport","") == "": return "Valitse ainakin yksi laji" if len(form.getlist("workout")) == 0: return "Valitse ainakin yksi treenityyppi" form = checkFormForEmptystr(form) cur = con.cursor() treeniID = 0 try: # haetaan käyttäjän id userID = getUserID(con,form.getfirst("tunnus",0)) if not isinstance(userID,int): return "Virhe haettaessa käyttäjää" else: # lisätään treeni Alkuaika = cgi.escape(form.getfirst('alkuaika','')) kesto = cgi.escape(form.getfirst('kesto','')) Km = cgi.escape(form.getfirst('km','')) Syke_avg = cgi.escape(form.getfirst('syke_avg',0)) Syke_max = cgi.escape(form.getfirst('syke_max',0)) Kalorit = cgi.escape(form.getfirst('kalorit',0)) Kommentti = cgi.escape(form.getfirst('kommentti','')) # Treeni taulu: (TreeniID|Alkuaika|kesto|km|syke_avg|syke_max|kalorit|kommentti|henkiloid,) sql = 'INSERT INTO Treeni (Alkuaika, kesto, Km, Syke_avg, Syke_max, Kalorit, Kommentti, HenkiloID) VALUES (:Alkuaika , :kesto, :Km , :Syke_avg , :Syke_max , :Kalorit , :Kommentti , :HenkiloID )' cur.execute(sql,{"Alkuaika":Alkuaika, "kesto":kesto, "Km":Km, "Syke_avg":Syke_avg, "Syke_max":Syke_max, "Kalorit":Kalorit, "Kommentti":Kommentti, "HenkiloID":userID}) treeniID = cur.lastrowid con.commit() except: string += "virhe lisättäessä treeniä" con.rollback() # Lisätään treeniin kuuluvat lajit if string == "": # lajia taulu (treeniid,lajiid) sql = '''INSERT INTO lajia (treeniid,lajiid) VALUES ( :treeni, :laji)''' try: sports = form.getlist("sport") if len(sports) == 0: sportID = getSportID(con,form["sporttype"]) cur.execute(sql,{"treeni":treeniID,"laji":sportID}) else: for i in range(len(sports)): cur.execute(sql,{"treeni":treeniID,"laji":int(sports[i])}) con.commit() except: string +=" virhe lisättäessä treeniin kuuluvia lajeja" con.rollback() # lisätään treeniin liittyvät treenityypit if string == "": # lajia taulu (treeniid,treenityyppiid) sql = '''INSERT INTO tyyppia (treeniid,treenityyppiid) VALUES ( :treeni,:tyyppi)''' try: workouts = form.getlist("workout") for i in range(len(workouts)): cur.execute(sql,{"treeni":treeniID,"tyyppi":int(workouts[i])}) con.commit() except: string += "Virhe lisättäessä treenityyppiä" con.rollback() if string == "": return showworkouts(con,userID) return string def getSportID(con,sporttype): sql =""" SELECT l.lajiID FROM laji l WHERE l.lajiID=( SELECT lon.lajiID FROM laji_on lon WHERE lon.lajityyppiID=:id) """ try: cur = con.cursor() cur.execute(sql,{"id":int(sporttype)}) return cur.fetchone()[0] except: return "virhe haettaessa käyttäjää" def getUserID(con, nick): """Hakee tietokannasta käyttäjänimen""" sql =""" SELECT henkiloid FROM henkilo WHERE tunnus=:nick """ cur = con.cursor() try: cur.execute(sql,{"nick":nick}) result = cur.fetchone()[0] return result except: return 'virhe haettaessa käyttäjää' def getUserWorkouts(con, user): return showworkouts(con,getUserID(con,user)) def showworkouts(con,userID): """Hakee tietokannasta henkilöt ja näyttää heidän treenit ja treeniin kuuluvat lajit""" sql = """ SELECT t.alkuaika, l.lajinimi, t.treeniID FROM treeni t, laji l WHERE t.henkiloid=:id AND l.lajiID=( SELECT la.lajiID FROM lajia la WHERE la.treeniID=t.treeniID) ORDER BY t.alkuaika DESC """ cur = con.cursor() try: cur.execute(sql,{"id":userID}) xml = xmldec+"\n' except: con.rollback() return " virhe haettaessa treenejä" return xml def getSportTypes(con): """Hakee lajit tietokannasta ja palauttaa fieldsetin lajeista""" sql =""" SELECT * FROM lajityyppi """ cur = con.cursor() try: cur.execute(sql) html = xmldec html += '\n' except: html = "virhe haettaessa treenityyppejä" con.rollback() return html def getWorkoutType(con): """Hakee treenityypit tietokannasta ja palauttaa fieldsetin treenityypeistä""" sql =""" SELECT * FROM treenityyppi """ cur = con.cursor() html = xmldec+'
\n' %xmlns try: cur.execute(sql) for rivi in cur: html += '

%s

\n'%(rivi[0],rivi[1]) except: html = "nyt tuli virhe: %s" % sys.exc_info()[0] con.rollback() html += "
" return html def getSports(con,id): """Hakee treenityypit tietokannasta ja palauttaa fieldsetin treenityypeistä""" sql =""" SELECT l1.lajiID,l1.lajiNimi FROM laji l1 INNER JOIN laji_on l2 ON l1.lajiID= l2.lajiID WHERE l2.lajityyppiID =:id """ cur = con.cursor() try: cur.execute(sql,{"id":id}) select = xmldec+'\n' return html except: html = " Virhe haettaessa lajeja" con.rollback() return html def checkFormForEmptystr(form): """Muuttaa lomakkeen tyhjät tiedot tietokantaan sopivaksi""" if form["syke_avg"] == "": form["syke_avg"] = 0 if form["syke_max"] == "": form["syke_max"] = 0 if form["kalorit"] == "": form["kalorit"] = 0 return form