From a51db7c9e4e997b1bbdc5f5af06d29e5df18f1c7 Mon Sep 17 00:00:00 2001 From: Damien De Paoli Date: Tue, 3 Nov 2020 18:29:41 +1100 Subject: [PATCH] initial commit of book library in python with sqlalchemy (as an ORM), flask (for the web server) and jinja2 (as the web template front-end bit) --- README | 12 +++++ __pycache__/author.cpython-38.pyc | Bin 0 -> 492 bytes __pycache__/authorroutes.cpython-38.pyc | Bin 0 -> 498 bytes __pycache__/book.cpython-38.pyc | Bin 0 -> 516 bytes __pycache__/db.cpython-38.pyc | Bin 0 -> 594 bytes __pycache__/db_model.cpython-38.pyc | Bin 0 -> 1045 bytes main.py | 60 ++++++++++++++++++++++++ templates/author.html | 9 ++++ templates/books.html | 45 ++++++++++++++++++ 9 files changed, 126 insertions(+) create mode 100644 README create mode 100644 __pycache__/author.cpython-38.pyc create mode 100644 __pycache__/authorroutes.cpython-38.pyc create mode 100644 __pycache__/book.cpython-38.pyc create mode 100644 __pycache__/db.cpython-38.pyc create mode 100644 __pycache__/db_model.cpython-38.pyc create mode 100644 main.py create mode 100644 templates/author.html create mode 100644 templates/books.html diff --git a/README b/README new file mode 100644 index 0000000..61689f7 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +## TODO: get all this inside a docker container and use compose to do the whole set (pg, flask, ?) +# flash -> python web server +# sqlalchemy -> provides db-agnostic python objects of db content (and more) +## LEARN: not totally sure what flask-sqlachemy provides + +# --user sticks python libs in ~/.local/[bin|lib|share] +##LEARN: supposedly could use virtualenv instead? +sudo apt install python3-psycopg2 libpq-dev +pip3 install --user flask sqlalchemy flask-sqlalchemy + +# run the web server by: +python3 book.py diff --git a/__pycache__/author.cpython-38.pyc b/__pycache__/author.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ae55ffda105664650b3eb57ad5705628a74288ca GIT binary patch literal 492 zcmZWmy-ve05VoDPftK>KFjivBlDt4wfe>OVh_p+WD&#DxlHg!F60PV&*S-RRu@Aya zc;yKY8x!XmP$f?K?sU$5-*y84_R#3B8Qs z(Qnu}A90FMZA_13g44jjyJ6rj8PuS@AWw8ofgn5R&4M_s^jJvaouBoMe|eGgLu!J8 z;~}UFHU7dnS@i^=4l!vmp)c%}%!&4ZKH^5p^-jH6(}_l7UF0h|3|y;1-_%c>UG2W& za%#LZ&&{6XcfjRH^P9r8IKTAjD)YP4}y}GhI z!WwjTlyE&Loz<17G*?k47g?ICZsg|ik~L|+gbbG`OW8!~+R-KZL(IWH8T$s#hVE0j ai(M~tb%Sg7mTQ5nP9dPmdDrqj5#$@fgK~cW literal 0 HcmV?d00001 diff --git a/__pycache__/authorroutes.cpython-38.pyc b/__pycache__/authorroutes.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0523e9d0aff312105bd9e65d24cbe73e82d52071 GIT binary patch literal 498 zcmZWmy-ve05VoDPftKHe5ebPUOY;I%1wx3eAkr>fs*tm&N`iy!NVIAvy7m+pGt}<^-X(FaZI&AOiv{CZU&7 zJo*hg=OfM#>JZb6jBy$mc()AvC4(B&7vzb~DG+1_-Dwadr5*`syo>Xm@vko9UPw)l zb36o3#Dtaj>7n@+Sf(s{O`gTS>a^iBQL+0`CO zE+@uIvdrvCeh*v@HP4GI(Og=W6_J}*zK)}j$aw@%L`tSnF}V@q?q_K!O3hWPn3%eA zun(Xto3I9*9>rYu3uk!kM%$T4lT3A5ZXT~%t3*PEs}zN7BDL~$$$pF3|0iQ#!r9P0 cDtEB!hOVx0?e?+~*l6bh%8Yj`?-N130a#6SCjbBd literal 0 HcmV?d00001 diff --git a/__pycache__/book.cpython-38.pyc b/__pycache__/book.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bdc13aef77105fc26dfc320b2f6016fcc57e2a3 GIT binary patch literal 516 zcmZ8dJx>Bb5Z%2G4v7f%YH4!K-5(&tXp9{i4;mVRx2uSE?7F)YT%dxMzhJcFFKwy4 zjh&SNFQ%$vO3`FK0Mdc8)#-iw#PC&UjVyXF8n1K0Zij4-+)eZriCglen#O z1HS;*CjfIYhHU0A_rYP_+F?GctjLlsC?ilEbP7Md6XMCbSC?Ju-CQT#klG;UW+a$S zp~Iiy9PFKd>r((j##A+pgKTWkq$H6jxZk<;48cj9S|U; uI)Ku0+7{|SZR1}H+>S$_1Ndyp45V;N%Cf*mrsW literal 0 HcmV?d00001 diff --git a/__pycache__/db.cpython-38.pyc b/__pycache__/db.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0cc63287617d91ac6d431349c5201f487c4bd33 GIT binary patch literal 594 zcmYjOJ5Ss|5Z;%4zE>AfP(|t7;2xn90x2j(t^pc1E8oomKGqM`cBJD`g_d7{grMXv zZJUa}kSa4i1>H#Br+MwneD?WtI$~(gzg~2}8T&)QwkZq_5zRLwV8AUac*;3DVIV+0 zGLVL^#BZ5OP^T;oKCq9)+zVJN$=$XPgF{3!LozJoz*1r4N+AN^IFN&UQfau!y$(RV z@jf3s$uxox29GQqLWGNkUL94{_1X7W`mihWo6h*C?5xce*7$Ml@*;C zNQw)PmMHYo$d`y?L^DAG{>tvziobE(BIdW_gR{J~X8-Hm!z>m)yr^7}wLWMmi$Yan z?8Q5CV|@E}H@T_`lK|97fgc5ZzsW=8Hlp1qp<5jf5Jh;)Fs}s1(G3ToNw6SV?BnIJM(+Z68wLM6dk| zs5#~@?Uhsh0w-o{90d>(BhB;9+g;7Vm|zcB%h}>h*5X>gctXp4voSbBPr3+_c^sH0 zq%k+qE#R1fgK=wmcEQ~_V6J)2TepVif(_0M^D5wCqKY=(#_{E_w=uMxErP2|YIl)^ z;bN-mY}JCqPbV2ock=qV@VPQO*9V~bHFeP367x}1fyuKWH~HVTU!MVGaG9*0@9 z(9ZisDleqcA^>d^d>~mGyZ?be2t6@*k5N=NqRE1X05&lw)&g6>G<4VO)HL(_j zYR@{oKqV=4ij;fN9Av5tx-CP|f8bT7+(;Ow?0i|0&NC+@&%T7a^C21R}QIvOI?-3kRy00_y|KSFT=u ZV($gH@>IQcJH;S%Y337ZVO<".format(self.title, self.id, self.author, self.id ) +# return "".format(self.title, self.id, self.author, self.author.firstnames ) + +class Author(db.Model): + id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True) + firstnames = db.Column(db.String(50), unique=False, nullable=False) + surname = db.Column(db.String(30), unique=False, nullable=False) + +# book = db.relationship('Book', secondary=book_author_link ) + + def __repr__(self): + return "".format(self.firstnames, self.surname ) +# return "".format(self.firstnames, self.surname, self.book) + +####################################### ROUTES ####################################### +@app.route("/books", methods=["GET"]) +def books(): + if request.form: + print(request.form) + books = Book.query.all() + return render_template("books.html", books=books) + +@app.route("/book/", methods=["GET"]) +def book(id): + book = Book.query.get(id) + print( book ) + return render_template("books.html", books=book ) + +@app.route("/authors", methods=["GET"]) +def author(): + authors = Author.query.all() + return render_template("author.html", authors=authors) + +if __name__ == "__main__": + app.run(host="0.0.0.0", debug=True) + diff --git a/templates/author.html b/templates/author.html new file mode 100644 index 0000000..0dbdf16 --- /dev/null +++ b/templates/author.html @@ -0,0 +1,9 @@ + + + +

authors

+ {% for author in authors %} +

{{author.surname}}, {{author.firstnames}}

+ {% endfor %} + + diff --git a/templates/books.html b/templates/books.html new file mode 100644 index 0000000..6f73b31 --- /dev/null +++ b/templates/books.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + +
+ + +
+ +

All Books

+ {% if books is iterable %} + + + + + + + {% for book in books %} + + {% endfor %} + +
TitleAuthor
{{book.title}}{{ book.author[0]['surname'] }}, {{ book.author[0]['firstnames'] }}
+ {% else %} +

{{books.title}}, {{ books.author[0]['surname'] }}, {{books.author[0]['firstnames']}}

+ {% endif %} + + + + + + + +