You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.1 KiB
Python

# THE LIBRARY #
from itertools import groupby # to handle complex iterations
import os
import sqlite3
from flask import Flask, render_template, url_for, request, redirect, flash
# ----- functions ----- #
def get_db_connection():
conn = sqlite3.connect('library.db')
conn.row_factory = sqlite3.Row
return conn
# Added row_factory attribute to the sqlite connection, in this way you can have name-based access to columns; this means that the database connection will return rows that behave like regular Python dictionaries.
# ----- FLASK ----- #
class PrefixMiddleware(object):
def __init__(self, app, prefix=""):
self.app = app
self.prefix = prefix
def __call__(self, environ, start_response):
if environ["PATH_INFO"].startswith(self.prefix):
environ["PATH_INFO"] = environ["PATH_INFO"][len(self.prefix):]
environ["SCRIPT_NAME"] = self.prefix
return self.app(environ, start_response)
else:
start_response("404", [("Content-Type", "text/plain")])
return ["This url does not belong to the app.".encode()]
app = Flask(__name__)
# register the middleware to prefix all the requests with our base_url
app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/soupboat/library')
@app.route("/")
def home():
conn = get_db_connection()
todos = conn.execute('SELECT c.content, cat.title FROM cards c JOIN categories cat \
ON c.category_id = cat.id ORDER BY cat.title').fetchall()
categories = {}
# for each category and group of cards for each cat in groupby() grouper object
for k, g in groupby(todos, key=lambda t: t['title']):
categories[k] = list(g)
print(categories[k])
for cat, cards in categories.items(): # ♥ .items is a build in attribute of the dictionary(?)
print(cat)
for card in cards:
print(' ', card['content'])
# if request.method == 'POST':
# title = request.form.get('title')
# author = request.form.get('author')
# description = request.form.get('description')
# add_book(author, title, description)
# return redirect(url_for('home'))
return render_template('home.html', categories=categories)
@app.route("/add/", methods=['GET', 'POST'])
def create():
conn = get_db_connection()
if request.method == 'POST':
content = request.form['content']
cat_title = request.form['cat']
if not content:
flash('plz write a content!')
return redirect(url_for('home'))
cat_id = conn.execute('SELECT id FROM categories WHERE title = (?);',
(cat_title,)).fetchone()['id']
conn.execute('INSERT INTO cards (content, category_id) VALUES (?,?)',
(content, cat_title))
conn.commit()
conn.close()
return redirect(url_for('home'))
categories = conn.execute('SELECT title FROM categories;').fetchall()
conn.close()
return render_template('create.html', categories=categories)
# app.run(port=3148)
# TODO:
# - list the cards
# - put its category inside