#!/usr/bin/python # -*- coding: utf-8 -*- from flask import Flask, session, redirect, url_for, escape, request, Response, render_template import hashlib import sys from functools import wraps import sqlite3 import logging import os logging.basicConfig(filename='flask.log',level=logging.DEBUG) app = Flask(__name__) app.debug = True @app.route('/', methods=['POST','GET']) def index(): con = sqlite3.connect( os.path.abspath('../../hidden/video')) con.row_factory = sqlite3.Row cur = con.cursor() try: cur.execute(""" SELECT nimi, julkaisuvuosi, vuokrahinta, arvio, tyypinnimi as lajityyppi, elokuvaid FROM Elokuva, Lajityyppi WHERE elokuva.lajityyppiID = lajityyppi.lajityyppiID """) except: logging.debug( "Elokuvalistaus ei onnistu" ) logging.debug( sys.exc_info()[0] ) elokuvat = [] for e in cur: elokuvat.append( {"nimi":e["nimi"], "julkaisuvuosi":e['julkaisuvuosi'], "vuokrahinta":e['vuokrahinta'], "arvio":e['arvio'], "lajityyppi":e['lajityyppi'], "id":e['elokuvaid']} ) jasen_sql = """ SELECT JasenId, nimi FROM Jasen """ cur.execute(jasen_sql ) jasenet = cur.fetchall() # tuloksena lista tupleja joissa [0] on jasenid ja [1] on nimi if request.form.get("vuokraa", None): # jos on valittu vuokraa-painike insert_sql = """ INSERT INTO Vuokraus (JasenID, ElokuvaID, Palautuspvm, Vuokrauspvm) VALUES (:jasenid, :elokuvaid, :palautuspvm, :vuokrauspvm ) """ # http://werkzeug.pocoo.org/docs/0.11/datastructures/ # request.form on multidict-tyyppinen objekti lisattavat = request.form.getlist("elokuva") # Palauttaa kaikki arvot listana # Jos jasenta ei ole annettu käytetään -1, joka kaataa executen jasen = request.form.get("jasen", -1) # Lisäys kaatuu jos yritetään vuokrata sama elokuva samalle henkilölle useammin kuin kerran # täytyy tehdä silmukassa koska voidaan valita useampi elokuva for e in lisattavat: try: cur.execute(insert_sql, {"jasenid":jasen, "elokuvaid":e, "palautuspvm":"2016-03-05", "vuokrauspvm":"2016-03-15"}) except: logging.debug( "Vuokraus ei onnistu: " + jasen + " " + e ) logging.debug( sys.exc_info()[0] ) con.commit() # tehdään commit vaikka osa lisäyksistä epäonnistuisikin if request.form.get("palauta", None): # valittu palauta-painike delete_sql = """ DELETE FROM Vuokraus WHERE jasenid = :jasen AND elokuvaid = :elokuva """ palautettavat = request.form.getlist("vuokrattu") for p in palautettavat: tiedot = p.split("|") # palauttaa tuplen jossa kaksi alkiota cur.execute(delete_sql, {"jasen":tiedot[1], "elokuva":tiedot[0]}) con.commit() vuokratut = """SELECT Jasen.Nimi AS Jasen, Elokuva.nimi AS Elokuva, Vuokraus.ElokuvaID AS ElokuvaID, Vuokraus.JasenID AS JasenID, VuokrausPVM, palautuspvm FROM Vuokraus, Elokuva, Jasen WHERE Vuokraus.JasenID = Jasen.JasenID AND Elokuva.ElokuvaID = Vuokraus.ElokuvaID ORDER BY Jasen ASC, elokuva ASC, vuokrauspvm """ cur.execute(vuokratut) vuokratut = cur.fetchall() return render_template('video.html', elokuvat=elokuvat, vuokratut=vuokratut, jasenet=jasenet) @app.route('/vuokraus//', methods=['POST','GET']) def vuokraus(jasen, elokuva): con = sqlite3.connect( os.path.abspath('../../hidden/video')) con.row_factory = sqlite3.Row cur = con.cursor() pvm = request.form.get("pvm", None) if pvm: sql = """UPDATE vuokraus SET palautuspvm = :pvm WHERE vuokraus.jasenid = :jasen AND vuokraus.elokuvaid = :elokuva """ cur.execute(sql, {"jasen":jasen, "elokuva":elokuva, "pvm": pvm }) con.commit() return redirect(url_for('index')) sql = """SELECT vuokraus.jasenid, vuokraus.elokuvaid, vuokrauspvm, palautuspvm, elokuva.nimi as elokuva, jasen.nimi as jasen FROM vuokraus, jasen, elokuva WHERE vuokraus.jasenid = :jasen AND vuokraus.elokuvaid = :elokuva AND vuokraus.jasenid = jasen.jasenid AND elokuva.elokuvaid = vuokraus.elokuvaid """ cur.execute(sql, {"jasen":jasen, "elokuva":elokuva}) vuokraus = cur.fetchone() # tulee vain yksi tietue joten fetchone riittäää return render_template('vuokraus.html', vuokraus=vuokraus) if __name__ == '__main__': app.debug = True app.run(debug=True)