#!/usr/bin/python # -*- coding: utf-8 -*- from flask import Flask, session, redirect, url_for, escape, request, Response, render_template, make_response import sqlite3 import logging import os import sys import json logging.basicConfig(filename='flask.log',level=logging.DEBUG) app = Flask(__name__) app.debug = True def tietokanta(): #tietokantayhteyden avaaminen ja olennaiset asetukset try: con = sqlite3.connect(os.path.abspath('../../../piilo/oppilaitos')) con.row_factory = sqlite3.Row con.execute("PRAGMA foreign_keys = ON") except: #virheenkäsittely... logging.debug("tietokantayhteys ei aukea") for err in sys.exc_info(): logging.debug(err) return None return con @app.route('/postitoimipaikat', methods=['GET']) def postitoimipaikat(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT postinro, postitoimipaikka FROM Postitoimipaikka """) data = cur.fetchall() # muunnetaan kyselyn tulos json-muotoon. Tarvitaan oma konversiofunktio row_to_json json_data = json.dumps(data, default=row_to_json) resp = make_response(json_data, 200) resp.charset = "UTF-8" resp.mimetype = "application/json" return resp @app.route('/postitoimipaikka', methods=['GET']) def postitoimipaikka(): con = tietokanta() postinro = request.args.get("postinro") if not postinro: resp = make_response(json.dumps([]), 200) resp.charset = "UTF-8" resp.mimetype = "application/json" return resp cur = con.cursor() cur.execute(""" SELECT postinro, postitoimipaikka FROM Postitoimipaikka WHERE postinro = :postinro """,{"postinro": postinro}) data = cur.fetchall() # muunnetaan kyselyn tulos json-muotoon. Tarvitaan oma konversiofunktio row_to_json json_data = json.dumps(data, default=row_to_json) resp = make_response(json_data, 200) resp.charset = "UTF-8" resp.mimetype = "application/json" return resp # muuntaa sqlite3 row -tyyppisen objektin tavalliseksi dictiksi def row_to_json(row): d = dict() for key in row.keys(): d[key] = row[key] return d @app.route('/', methods=['GET']) def root(): return "kokeile http://users.jyu.fi/~tjlahton/cgi-bin/tiea2080/ohjaus5/flask.cgi/hae_postitoimipaikka" @app.route('/hae_ryhmat', methods=['GET']) def hae_ryhmat(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT RyhmaID, RyhmaNimi FROM Oppilaitosryhma ORDER BY RyhmaID """) ryhmat = cur.fetchall() resp = make_response( render_template("ryhmat.xml",ryhmat=ryhmat, name="oppilaitosryhma")) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp from xml.dom.minidom import getDOMImplementation, parse, parseString @app.route('/hae_ryhmat2', methods=['GET']) def hae_ryhmat2(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT RyhmaID, RyhmaNimi FROM Oppilaitosryhma ORDER BY RyhmaID """) impl = getDOMImplementation() # createDocument(nimiavaruus, juurielementti, dokumenttityyppi) doc = impl.createDocument("http://www.w3.org/1999/xhtml", "select", None) # pakko laittaa seuraava, koska jostakin syystä edellinen ei riitä doc.documentElement.setAttribute("xmlns", "http://www.w3.org/1999/xhtml") doc.documentElement.setAttribute("name", "ryhmat") doc.documentElement.setAttribute("id", "ryhmat") for ryhma in cur.fetchall(): option = doc.createElement("option"); txt = doc.createTextNode( ryhma['ryhmanimi'] ); option.appendChild(txt) # minidom ei tue textContent-ominaisuutta # li.textContent = ryhma['ryhmanimi'] option.setAttribute("value", str(ryhma["ryhmaid"])) doc.documentElement.appendChild(option) resp = make_response( doc.toxml('UTF-8') ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp import xml.etree.ElementTree as ET @app.route('/hae_ryhmat3', methods=['GET']) def hae_ryhmat3(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT RyhmaID, RyhmaNimi FROM Oppilaitosryhma ORDER BY RyhmaID """) xml = """""" root = ET.fromstring( xml ) root.attrib["xmlns"] = "http://www.w3.org/1999/xhtml" for ryhma in cur.fetchall(): option = ET.SubElement(root, "option") option.text = ryhma['ryhmanimi'] option.attrib['value'] = str(ryhma["ryhmaid"]) resp = make_response( ET.tostring( root, encoding="UTF-8", method="xml" ) ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp @app.route('/oppilaitokset', methods=['GET']) def oppilaitokset(): con = tietokanta() cur = con.cursor() ryhmaid = request.args.get("ryhmaid", None) if ryhmaid: cur.execute(""" SELECT OppilaitosID, Nimi FROM Oppilaitos WHERE Oppilaitosryhma = :ryhmaid """, {"ryhmaid": ryhmaid }) else: cur.execute(""" SELECT OppilaitosID, Nimi FROM Oppilaitos """) xml = """""" root = ET.fromstring( xml ) root.attrib["xmlns"] = "http://www.w3.org/1999/xhtml" for ryhma in cur.fetchall(): option = ET.SubElement(root, "option") option.text = ryhma['nimi'] option.attrib['value'] = str(ryhma["oppilaitosid"]) resp = make_response( ET.tostring( root, encoding="UTF-8", method="xml" ) ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp @app.route('/tilaajat', methods=['GET']) def tilaajat(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT etunimi, sukunimi, lahiosoite, postinumero, postitoimipaikka, nimi FROM tilaaja, postitoimipaikka, oppilaitos WHERE tilaaja.postinumero = postitoimipaikka.postinro AND tilaaja.oppilaitos = oppilaitos.oppilaitosID """) xml = """""" root = ET.fromstring( xml ) root.attrib["xmlns"] = "http://www.w3.org/1999/xhtml" for t in cur.fetchall(): li = ET.SubElement(root, "li") li.text = t['etunimi'] + " " + t["sukunimi"] + " ( " + t["nimi"] + " ) " p = ET.SubElement(li, "p") p.text = t["lahiosoite"] p = ET.SubElement(li, "p") p.text = t["postinumero"] + " " + t["postitoimipaikka"] resp = make_response( ET.tostring( root, encoding="UTF-8", method="xml" ) ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp @app.route('/lisaa_tilaaja', methods=['POST']) def lisaa_tilaaja(): con = tietokanta() kentat = {"etunimi":"","sukunimi":"","lahiosoite":"","postinumero":"","oppilaitos":""} postinro = request.form.get("postinro") virheet = dict() for k in kentat.keys(): kentat[k] = request.form.get(k, "") if kentat[k] == "": virheet[k] = k + " puuttuu" if not len(virheet): cur = con.cursor() try: cur.execute(""" INSERT INTO tilaaja (etunimi, sukunimi, lahiosoite, postinumero, oppilaitos) VALUES (:etunimi, :sukunimi, :lahiosoite, :postinumero, :oppilaitos); """,kentat) con.commit() except sqlite3.IntegrityError: virheet["error"] = [] virheet["error"].append( u"Virheellinen postinumero tai oppilaitos" ) except: virheet["error"] = [] virheet["error"].append( u"Lisäys epäonnistui" ) for err in sys.exc_info(): virheet["error"].append( str(err) ) virheet["error"].append( str(type(e)) ) # jos ei ole virheitä niin palautetaan tyhjä json-rakenne. Muussa tapauksessa palautetaan virheilmoituksia resp = make_response(json.dumps(virheet), 200) resp.charset = "UTF-8" resp.mimetype = "application/json" return resp if __name__ == '__main__': app.debug = True app.run(debug=True)