From 2238f0fdd7ec780fb3a2ae62601c6a9d59fb5572 Mon Sep 17 00:00:00 2001 From: grgr Date: Sun, 8 Jan 2023 19:33:27 +0000 Subject: [PATCH] update of db contents --- .ipynb_checkpoints/app-checkpoint.py | 212 ++++++++++++++++++ __pycache__/app.cpython-37.pyc | Bin 0 -> 5191 bytes library.db | Bin 24576 -> 24576 bytes .../.ipynb_checkpoints/base-checkpoint.html | 25 +++ 4 files changed, 237 insertions(+) create mode 100644 .ipynb_checkpoints/app-checkpoint.py create mode 100644 __pycache__/app.cpython-37.pyc create mode 100644 templates/.ipynb_checkpoints/base-checkpoint.html diff --git a/.ipynb_checkpoints/app-checkpoint.py b/.ipynb_checkpoints/app-checkpoint.py new file mode 100644 index 0000000..de600a5 --- /dev/null +++ b/.ipynb_checkpoints/app-checkpoint.py @@ -0,0 +1,212 @@ +# THE LIBRARY # + + +from itertools import groupby # to handle complex iterations +import os +from pydoc_data.topics import topics + +import sqlite3 +from webbrowser import get +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__) +app.config['SECRET KEY'] = 'this should be a secret random string' + +# register the middleware to prefix all the requests with our base_url +app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix='/soupboat/library-db/') + + +@ app.route("/") +def home(): + conn = get_db_connection() + todos = conn.execute('SELECT c.id, c.content, cat.category_name \ + FROM cards c JOIN categories cat \ + ON c.category_id = cat.id ORDER BY cat.category_name').fetchall() + + categories = {} + topics = {} # hint for later to fetch all the topics ehhe + + # for each category and group of cards for each cat in groupby() grouper object + for k, g in groupby(todos, key=lambda t: t['category_name']): + cards = [] + + for card in g: + topics = conn.execute('SELECT t.id, t.content FROM topics t \ + JOIN topic_cards t_c \ + ON t.id = t_c.topic_id \ + WHERE t_c.card_id = ?', + (card['id'],)).fetchall() + + card = dict(card) + card['topics'] = topics + print('card is:', card) + cards.append(card) + + categories[k] = list(cards) + + for cat, cards in categories.items(): # .items is a build in attribute of the dictionary(?) + print(cat) + for card in cards: + topicss = [t['content'] for t in card['topics']] + print(' ', card['content']) + print(' ', list(topicss)) + + conn.close() + 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'] + category_name = request.form['cat'] + # can this be a category? o be general? + topic_tag = request.form['topic_tag'] + + # create a new category and topic: + new_category = request.form['new_category'] + new_topic = request.form['new_topic'] + # if a new category_category_name is created add it to the table of categories + if category_name == 'New category' and new_category: + conn.execute('INSERT INTO categories (category_name) VALUES (?)', + (new_category,)) + conn.commit() + # update category_name to refer to the newly added category + category_name = new_category + + # if topic_tag == 'New topic' and new_topic: + # conn.execute('INSERT INTO topics (content) VALUES (?)', + # (new_topic,)) + # conn.commit() + # topic_tag = new_topic + + # cat_id = conn.execute('SELECT id FROM categories WHERE category_name = (?);', + # (category_name,)).fetchone()['id'] + + # topic_id = conn.execute('SELECT id FROM topics WHERE content = (?);', + # (topic_tag,)).fetchone()['id'] + # conn.execute('INSERT INTO topic_cards (topic_id, card_id) VALUES (?,?)', + # (topic_id, cat_id)) + + if topic_tag =='New topic' and new_topic: + conn.execute('INSERT INTO topics (content) VALUES (?)', + (new_topic,)) + conn.commit() + topic_tag = new_topic + + + if not content: + flash('plz write a content!') + return redirect(url_for('home')) + + cat_id = conn.execute('SELECT id FROM categories WHERE category_name = (?);', + (category_name,)).fetchone()['id'] + + conn.execute('INSERT INTO cards (content, category_id) VALUES (?,?)', + (content, cat_id)) + conn.commit() + + topic_id = conn.execute('SELECT id FROM topics WHERE content = (?);', + (topic_tag,)).fetchone()['id'] + card_id = conn.execute('SELECT id FROM cards WHERE content = (?);', + (content,)).fetchone()['id'] + conn.execute('INSERT INTO topic_cards (topic_id, card_id) VALUES (?,?)', + (topic_id, card_id)) + + conn.commit() + conn.close() + return redirect(url_for('home')) + + categories = conn.execute( + 'SELECT category_name FROM categories;').fetchall() + topics = conn.execute('SELECT content FROM topics;').fetchall() + + conn.close() + return render_template('create.html', categories=categories, topics=topics) + + +@ app.route('//edit/', methods=('GET', 'POST')) +def edit(id): + conn = get_db_connection() + + todo = conn.execute('SELECT c.id, c.category_id, c.content, cat.category_name \ + FROM cards c JOIN categories cat \ + ON c.category_id = cat.id WHERE c.id = ?', (id,)).fetchone() + + categories = conn.execute( + 'SELECT category_name FROM categories;').fetchall() + topics = conn.execute('SELECT content FROM topics;').fetchall() + + if request.method == 'POST': + content = request.form['content'] + category_name = request.form['cat'] + + if not content: + flash('plz insert any content!') + return redirect(url_for('home')) + + cat_id = conn.execute('SELECT id FROM categories WHERE category_name = (?);', + (category_name,)).fetchone()['id'] + + conn.execute('UPDATE cards SET content = ?, category_id = ? \ + WHERE id = ?', + (content, cat_id, id)) + conn.commit() + conn.close() + return redirect(url_for('home')) + + return render_template('edit.html', todo=todo, categories=categories) + + +@ app.route('//delete/', methods=('POST',)) +def delete(id): + conn = get_db_connection() + conn.execute('DELETE FROM cards WHERE id = ?', (id,)) + conn.commit() + conn.close() + return redirect(url_for('home')) + +if __name__ == "__main__" : + app.run(port=3150) + + +# TODO: + +# - categoryes are added to the wrong card, fix it +# - check for double tags +# - add more topic tags + +# - add title to cards +# - list the cards +# - put its category inside + diff --git a/__pycache__/app.cpython-37.pyc b/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf0cdd1b61251cc0f825b3abe4366987e77b636c GIT binary patch literal 5191 zcmb_g&2JmW72j`?OG=_7Teh69O_3mBkcdf}0I99Wc5M2iO(;WB;%3ocLvdEr%1bUa zJF29`@+9{tAiWobbW1Ni6g?K`t$)N`d+Mz~Z$1?Ly;+K)7}o`YEHJZgXWq=bdGp@y zz1dHvrfdbzKdv6P|MfE7^l|nWAa0?=|3SqRriMyabybyUE!12MZ#~qzhHDJlOxHx4 z5nA1XTaayLSnQVEQrC9vZrLq&D{iGbq_k> z|AY>dnwk|lJlgAT9yUQ+BI*b27?j@eMa|00dtobnlFe|x$9(PyzuOO6!p{nOJoL6A zo)x&iyXVIuD{`L&+;5A_+`^dcHcd~DilU?3L5UYo3FSm(>Zv*awWFnqr>6=8(wd1K z2AjOa50}_x&BzMzZWsvvXIY^g^?I1u)z_kZx6Gq`Z>!Z75kG{W26g^X;nSG;*$4IQ zsO#4|yu<7Lz0ELad)uNL*84o#!31%AxWIdCv)=0Wm->g(~O>ekH5cOtAPz#l! z+G(Q(U@Y|a zTinl-HqAf}y)~3OC^4;*s?dj$l2$M)#;eVmmg$f+v-)zLnw}Z4A8zq^u=7h)(bn^d zM9+$z7xV(*d5idp$>tT+Qj^6=IhM}&E{H??QXCgVii28IPLx#H!GZBx`L}?0JL(Yx z{H?Yqd6p#ydNra>bZkRAg_WgH2{StCkp`vz^3KHBh_w?A)W`iJj-Skscqov0`Lo_KHLu#N&S4k9x8H9No5CVd#0UU{qW|rD#?48VsePRi3ZooFCrB=fDlAa6Y|O*Y~{4 z_PlPy_Clg7p0~T#3iBRLe!^d)>ilpeMJLQ>QC&rmhg(!_L$)Mu3Q|kF9qok-3UOLa z?6WuQ%?jH8z}IHoi(O*JE=2s3pc-1G17~JyYv#yyQcmT0oJe zK|U>%BV|B`Eq(b!J5>g1pbRt={Xhtqfb<7|=dpHI`TCn*YXf6oc9em2a4$8{vN9;h z(Pmm;)}pedo@#OyT^MQMNJX!Xp2D&sOjbk-OenQZth8_n2;05&SP_NPI)b64#y6JEcQ%~%Qo!Ct4GbZJ1=$iy zD1HYRB@f$q!Ed8iEOy$?FIFEmX*dlHVA~*HFmx5X=L-eQ`9v-aVs-6qW6k;W zEBSpvlr{k}J@h8DKl6=VZ9IZ5SayR zMKX{XBvNJ~KzHNJY=;rRl7eQ<=2LjNrifS+^Y=hYHD&6POzpU)JT2FtSEfS-w~(KC zJhAD_kf9vIl>u>t}nJD7LTB<3{De8LfbbZXcOv=#?&X;w<=!(tuw^Bfhs8-lqM+y zlrAX~lp!gA*}w!$6p(lAqy~y|VgSMnf;fPfa$*vgq{cu?byfn`x2cIjTy|P`sN$3PXv1zPq$<`S}U~3C8cx*kIznbb7xCw#{Hk+y! zT8pxEE-j?R@6BOLAe@w9{!~3FBLtM>$VBhiI1m-=Di>~om8({hFkujj_~;Sk7x2SW%S zp>~cK7bF4bK!zKjS|b8k@VCseIa zbrV%)VH3c1w|KT`w?H~W)45EO7-i+Me~IxiAu~`4X`rpznyph^LE;UB(v0em0%{p( zsQ}HYD7aq`1uiPKM6(Jojt~tP*1(L(Onn)+dp%$)b=pSyObFA zR}eBiL%gB%EIm)IG})rTKXrI3kOlqv@XHX!j>!z*(VswBj1bL~6d{_Gn(>Z6;v`Y1 zC`t^el|&($qXe`WCUDFKcR|ivPLbSUbzS0+nqvWafD}Nou{lJARglQ(xD69NOg|^J zI?JYhc&7Ek^Q`}!W)1x*PbzLEKY~9@AY*cc04SiVh;UlH!ygZWnqNG+dwZh+?4-c2bln_f5#vO@`#c{?N@SfwFU|~#{?c#G+?afplX>PYNe0VrQFWWD zi%!fxr8eom(shdxHFN*HM_r?=V$7ZIQpfbDlG&+2GW`K;Fh7~ z&QsHy$*Xs9i@-sQ+2^=oWw5DPIT%VUo@-|WdjJIrEV+s%lwjq;{|)^y>6ucgX}MAU z0AF+;?c!FAzX45LXptcq{fLX&%UKCgkBcY@<2(=4qS&47AF`7%Q6kf-P!A`tmH@vLKX_+-LZGn-JR{s zY>c@$ZY9LAktNh))f1OWRJnv(4mof{LWoL8+>mD;#i8t$Q3g$v2=dH)H-}`>v z%>Hp^|2T8^)y&Dkh3%OWYo*qBxj9o`B)M5r3-;mBYfyT* zT*zh@GFn93QFeYR`%=cC(pBdVpH|DIMccAw3oVQMN*>y$nM`#f; zwc^k{M)gXYRfURHJRSIVuAIwRnYFJz&HnrS`c|X9x#Wo+xB~hj249GqKs9KOffPOi z(E;iPJRESPCDmMnz(bJCA3tjWj_`fvXuijwC*;j0eDFWuo}*C(Gz8{yEo8-sv4@b& zC3r`&$dgnt7yD`P?f|Za2`fj0nth=Sv5C%?q30oW9xC4Tw1IUYmR%M)oT)0lXA~e9 zuz=w*bfgFp$Viw~1l;4SmnaU$q7jgz2U_;|AnXE)Rk6~Dk-QdA%_OIO(ufCVU$GOa zL8laSgv6~}O;R;b9*rUvHo>^B4RKd6h3q?ijFeewiNSX~!3Pdg&Ed7OiSf4hZ;ZA2 zSiDN8DFkPilSh=s&=K8FXqsGIV?J-kNtmgPv@OzfmyvQP!iq8XZ1oZhjIAyM3Qp{6 zjL8QfyENoqCWFv~tH@nLB$VQ9b?VCu1V&*6qN29pybH@xSlT7KR{gbtO zFl=qVXV0L%&!#30-FoA#b=)Un>6pIb6F{A01TlY{dM&YYEb-UTgX^o)*xB&2R6#pDT`QelBY* ij3?*(Y}TrxN=BvQ!L1m5!6Q*DWUa;L+DFT~kN*Ztxz4=+ delta 508 zcmZoTz}Rqrae_4C%84@0tScGx;$=3bEZ`UC;@`o*|BL@K{~P|N{P*~;^IzaU!GC~% zv!cUv&W#h;*f#HwR}hfk;$mi&WGu-q$V@KgQ&NP zTv+uR;nk1OK6#O!p{g=FD+8yoGTbwk3Py%j21ZuK29>EL3W<67K#Pke|L{{{Vqlmo z<8KzN%L200lo_rA;r+~FpfiC)qC#P5YH>+sexAL(7Bfh>KGcsWp%nsBTb>Bgl&S!< qD0T8$|8Ox*ehmg-1YYIe$-jWVi9dxuh~I)=0~qvt{F61}ZvX(he23rw diff --git a/templates/.ipynb_checkpoints/base-checkpoint.html b/templates/.ipynb_checkpoints/base-checkpoint.html new file mode 100644 index 0000000..6cb558e --- /dev/null +++ b/templates/.ipynb_checkpoints/base-checkpoint.html @@ -0,0 +1,25 @@ + + + + + {% block title %} {% endblock %} + + + + + + + {% for message in get_flashed_messages() %} +
{{ message }}
+ {% endfor %} + {% block content %} {% endblock %} + +