From 27a6c4e87fa3cd8a4b8556f7af2e5ac1de993da6 Mon Sep 17 00:00:00 2001 From: Sumit Tomar Date: Mon, 15 Jul 2019 21:11:54 +0530 Subject: [PATCH 1/3] Added databases and templates --- week-0/day-3/my_todo_app/run.sh | 4 + week-0/day-3/my_todo_app/todo_app/__init__.py | 65 +++++------ .../day-3/my_todo_app/todo_app/__init__.pyc | Bin 1920 -> 0 bytes week-0/day-3/my_todo_app/todo_app/auth.py | 92 ++++++++++++++++ week-0/day-3/my_todo_app/todo_app/db.py | 38 +++++++ week-0/day-3/my_todo_app/todo_app/post.py | 102 ++++++++++++++++++ week-0/day-3/my_todo_app/todo_app/schema.sql | 18 ++++ .../todo_app/templates/auth/login.html | 15 +++ .../todo_app/templates/auth/register.html | 15 +++ .../my_todo_app/todo_app/templates/base.html | 24 +++++ .../todo_app/templates/posts/create.html | 15 +++ .../todo_app/templates/posts/index.html | 28 +++++ .../todo_app/templates/posts/update.html | 20 ++++ 13 files changed, 399 insertions(+), 37 deletions(-) create mode 100755 week-0/day-3/my_todo_app/run.sh delete mode 100644 week-0/day-3/my_todo_app/todo_app/__init__.pyc create mode 100644 week-0/day-3/my_todo_app/todo_app/auth.py create mode 100644 week-0/day-3/my_todo_app/todo_app/db.py create mode 100644 week-0/day-3/my_todo_app/todo_app/post.py create mode 100644 week-0/day-3/my_todo_app/todo_app/schema.sql create mode 100644 week-0/day-3/my_todo_app/todo_app/templates/auth/login.html create mode 100644 week-0/day-3/my_todo_app/todo_app/templates/auth/register.html create mode 100644 week-0/day-3/my_todo_app/todo_app/templates/base.html create mode 100644 week-0/day-3/my_todo_app/todo_app/templates/posts/create.html create mode 100644 week-0/day-3/my_todo_app/todo_app/templates/posts/index.html create mode 100644 week-0/day-3/my_todo_app/todo_app/templates/posts/update.html diff --git a/week-0/day-3/my_todo_app/run.sh b/week-0/day-3/my_todo_app/run.sh new file mode 100755 index 00000000..df743747 --- /dev/null +++ b/week-0/day-3/my_todo_app/run.sh @@ -0,0 +1,4 @@ +export FLASK_APP=todo_app +export FLASK_ENV=development +flask init-db +flask run diff --git a/week-0/day-3/my_todo_app/todo_app/__init__.py b/week-0/day-3/my_todo_app/todo_app/__init__.py index c1833cb0..9751f819 100644 --- a/week-0/day-3/my_todo_app/todo_app/__init__.py +++ b/week-0/day-3/my_todo_app/todo_app/__init__.py @@ -1,52 +1,43 @@ import os - from flask import Flask -from flask import request - - def create_app(test_config=None): # create and configure the app app = Flask(__name__, instance_relative_config=True) - # ensure the instance folder exists + app.config.from_mapping( + SECRET_KEY='dev', + DATABASE=os.path.join(app.instance_path,'todo_app.sqlite') + ) + + + if test_config is None: + # load the instance config, if it exists, when not testing + app.config.from_pyfile('config.py', silent=True) + else: + # load the test config if passed in + app.config.from_mapping(test_config) + + try: os.makedirs(app.instance_path) except OSError: pass + # a simple page that list my todos + @app.route('/shivang') + def shivang(): + return ('Wake Up' + '
' + + 'Drink Coffee' + '
' + + 'Read Non-fiction Novel' + '
' + ) - def todo_view(todos): - the_view = 'List of my todos:' + '
' - for todo in todos: - the_view += ( todo + '
' ) - - the_view += '---- LIST ENDS HERE ---' - return the_view - - def get_todos_by_name(name): - if name == 'depo': - return ['Go for run', 'Listen Rock Music'] - elif name == 'shivang': - return ['Read book', 'Play Fifa', 'Drink Coffee'] - elif name == 'raj': - return ['Study', 'Brush'] - elif name == 'sanket': - return ['Sleep', 'Code'] - elif name == 'aagam': - return ['play cricket', 'have tea'] - else: - return [] + from . import db + db.init_app(app) + from . import auth + app.register_blueprint(auth.bp) - # http://127.0.0.1:5000/todos?name=duster - @app.route('/todos') - def todos(): - name = request.args.get('name') - print('---------') - print(name) - print('---------') - - person_todo_list = get_todos_by_name(name) - return todo_view(person_todo_list) + from . import post + app.register_blueprint(post.bp) + app.add_url_rule('/', endpoint='index') return app - diff --git a/week-0/day-3/my_todo_app/todo_app/__init__.pyc b/week-0/day-3/my_todo_app/todo_app/__init__.pyc deleted file mode 100644 index 45e35a62304fd57942e8da34ed12d0253d261011..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1920 zcmcgtUvJws5I<6O{+S<=cPG#L1eq*S$Jl9n1uOv0 z+p&a&fTe_U34(MH&m%aGa4tZ1;H`l3E^V3&yJ(>J8=vt|;4skq*+TiUoo?gQnX8rY zAt!x=jh4{YUtt&UMVkVGgx`dCBcM5i5W!^!ZUtO+Q3&E?wGW-J1!WK1BM?GV0$yne zZvpPcVT0hMNIwP>q-& zhNT2|pYTGAW)dbO?XWbVSm`a$+c1k-#SSY*pm#y{Hp}m^^cT>5(0d!{2Q0k;{UPW9 zOJ^88jcrISju|CwYRk@^+IVVR>{it#G^UDEo0stqD_`V+n7c;K(|uE;bbMiL$+Mpp zs)?T!Q|0@pJ8?x-#!u~ZY7BB0DX%U$R+F&O4UfKaD?djHqfu3rCba5>F*W=3)M~>b zrDkf$Mr%4EcSVk?J%xL&u1y?_YNO2AMuD%?()?e6Cm?4gFg<*B(PVV^Cv>U%*n#LH z1^P&W_DkcQ^mJ+FkyKl9C45bqDw#77sDO$0vm9uXN+`~FYlFs}0uiWyTcNr~e{8wv|ag!xil{$jse`k|S}vw0gBLPl$ZX`@S5A GLG%xQ{;XdB diff --git a/week-0/day-3/my_todo_app/todo_app/auth.py b/week-0/day-3/my_todo_app/todo_app/auth.py new file mode 100644 index 00000000..e26da5fd --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/auth.py @@ -0,0 +1,92 @@ +import functools + +from flask import ( + Blueprint, flash, g, redirect, render_template, request, session, url_for +) +from werkzeug.security import check_password_hash, generate_password_hash + +from todo_app.db import get_db +from flask import current_app + +bp = Blueprint('auth', __name__, url_prefix='/auth') + +@bp.route('/register',methods=('GET','POST')) +def register(): + if request.method=='POST': + username=request.form['username'] + password=request.form['password'] + db=get_db() + error=None + + if not username: + error='Username is required' + elif not password: + error='Password is required' + elif db.execute( + 'SELECT id FROM user WHERE username=?',(username,) + ).fetchone() is not None: + error='User {} is already registered'.format(username) + + if error is None: + db.execute( + 'INSERT INTO user(username,password) VALUES (?,?)', + (username,generate_password_hash(password)) + ) + db.commit() + return redirect(url_for('auth.login')) + + flash(error) + return render_template('auth/register.html') + +@bp.route('/login',methods=('GET','POST')) +def login(): + if request.method=='POST': + username=request.form['username'] + password=request.form['password'] + db=get_db() + error=None + user=db.execute( + 'SELECT * FROM user WHERE username=?',(username,) + ).fetchone() + + if user is None: + error='Incorrect Username' + elif not check_password_hash(user['password'],password): + error='Incorrect password' + + if error is None: + session.clear() + session['user_id']=user['id'] + return redirect(url_for('index')) + + flash(error) + return render_template('auth/login.html') + +@bp.route('/logout') +def logout(): + session.clear() + return redirect(url_for('auth.login')) + +def login_required(view): + @functools.wraps(view) + def wrapped_view(**kwargs): + if g.user is None: + return redirect(url_for('auth.login')) + + return view(**kwargs) + + return wrapped_view + +@bp.before_app_request +def load_logged_in_user(): + user_id=session.get('user_id') + + if user_id is None: + g.user=None + else: + g.user=get_db().execute( + 'SELECT * FROM user WHERE id=?',(user_id,) + ).fetchone() + + + diff --git a/week-0/day-3/my_todo_app/todo_app/db.py b/week-0/day-3/my_todo_app/todo_app/db.py new file mode 100644 index 00000000..c83d0adf --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/db.py @@ -0,0 +1,38 @@ +import sqlite3 + +import click +from flask import current_app,g +from flask.cli import with_appcontext + +def get_db(): + if 'db' not in g: + g.db=sqlite3.connect( + current_app.config['DATABASE'], + detect_types=sqlite3.PARSE_DECLTYPES + ) + g.db.row_factory=sqlite3.Row + return g.db; + +def init_app(app): + app.teardown_appcontext(close_db) + app.cli.add_command(init_db_command) + +def init_db(): + db = get_db() + + with current_app.open_resource('schema.sql') as f: + db.executescript(f.read().decode('utf8')) + + +@click.command('init-db') +@with_appcontext +def init_db_command(): + """Clear the existing data and create new tables.""" + init_db() + click.echo('Initialized the database.') + +def close_db(e=None): + db=g.pop('db',None) + + if db is not None: + db.close() \ No newline at end of file diff --git a/week-0/day-3/my_todo_app/todo_app/post.py b/week-0/day-3/my_todo_app/todo_app/post.py new file mode 100644 index 00000000..a03b1720 --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/post.py @@ -0,0 +1,102 @@ +from flask import( + Blueprint, flash, g, redirect, render_template,request,url_for,session +) +from werkzeug.exceptions import abort + +from todo_app.auth import login_required +from todo_app.db import get_db +from flask import session + +bp=Blueprint('post',__name__) + +@bp.route('/') +def index(): + user_id=session.get('user_id') + print(user_id) + if user_id is None: + return redirect('auth/login') + + db=get_db() + posts = db.execute( + 'SELECT * FROM post WHERE author_id=?',(user_id,) + + # 'SELECT p.id, title, body, created, author_id' + # 'FROM post p WHERE p.author_id=?', (user_id,) + ).fetchall() + return render_template('posts/index.html',posts=posts) + + +@bp.route('/create',methods=('GET','POST')) +@login_required +def create(): + if request.method=='POST': + title=request.form['title'] + body=request.form['body'] + error=None + + if not title: + error='Title required' + if error is not None: + flash(error) + else: + db=get_db() + db.execute( + 'INSERT INTO post (title, body, author_id)' + ' VALUES (?, ?, ?)', + (title, body, g.user['id']) + ) + db.commit() + return redirect(url_for('post.index')) + return render_template('posts/create.html') + +def get_post(id,check_author=True): + post=get_db().execute( + 'SELECT p.id, title, body, created, author_id, username' + ' FROM post p JOIN user u ON p.author_id = u.id' + ' WHERE p.id = ?', + (id,) + ).fetchone() + + if post is None: + abort(404,"Post id {0} doesn't exist.".format(id)) + + if check_author and post['author_id']!=g.user['id']: + abort(403) + + return post + +@bp.route('//update',methods=('GET','POST')) +@login_required +def update(id): + post=get_post(id) + + if request.method=='POST': + title=request.form['title'] + body=request.form['body'] + error=None + + if not title: + error='Title is required' + + if error is not None: + flash(error) + else: + db=get_db() + db.execute( + 'UPDATE post SET title=?,body=?' + 'WHERE id=?' + (title,body,id) + ) + db.commit() + return redirect(url_for('post.index')) + + return render_template('posts/update.html',post=post) + +@bp.route('//delete',methods=('POST',)) +@login_required +def delete(id): + get_post(id) + db=get_db() + db.execute('DELETE FROM post WHERE id=?',(id,)) + db.commit() + return redirect(url_for('post.index')) diff --git a/week-0/day-3/my_todo_app/todo_app/schema.sql b/week-0/day-3/my_todo_app/todo_app/schema.sql new file mode 100644 index 00000000..113a7438 --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/schema.sql @@ -0,0 +1,18 @@ +DROP TABLE IF EXISTS user; +DROP TABLE IF EXISTS post; + +CREATE TABLE user( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT UNIQUE NOT NULL, + password TEXT NOT NULL +); + +CREATE TABLE post( + id INTEGER PRIMARY KEY AUTOINCREMENT, + author_id INTEGER NOT NULL, + created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + title TEXT NOT NULL, + body TEXT NOT NULL, + FOREIGN KEY(author_id) REFERENCES user (id) +); + diff --git a/week-0/day-3/my_todo_app/todo_app/templates/auth/login.html b/week-0/day-3/my_todo_app/todo_app/templates/auth/login.html new file mode 100644 index 00000000..b7dd5dc1 --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/templates/auth/login.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} + +{% block header %} +

{% block title %}Log In{% endblock %}

+{% endblock %} + +{% block content %} +
+ + + + + +
+{% endblock %} \ No newline at end of file diff --git a/week-0/day-3/my_todo_app/todo_app/templates/auth/register.html b/week-0/day-3/my_todo_app/todo_app/templates/auth/register.html new file mode 100644 index 00000000..a3c73cc9 --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/templates/auth/register.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} + +{% block header %} +

{% block title %}Register{% endblock %}

+{% endblock %} + +{% block content %} +
+ + + + + +
+{% endblock %} \ No newline at end of file diff --git a/week-0/day-3/my_todo_app/todo_app/templates/base.html b/week-0/day-3/my_todo_app/todo_app/templates/base.html new file mode 100644 index 00000000..12f8410d --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/templates/base.html @@ -0,0 +1,24 @@ + +{% block title %}{% endblock %} - TodoApp + + +
+
+ {% block header %}{% endblock %} +
+ {% for message in get_flashed_messages() %} +
{{ message }}
+ {% endfor %} + {% block content %}{% endblock %} +
\ No newline at end of file diff --git a/week-0/day-3/my_todo_app/todo_app/templates/posts/create.html b/week-0/day-3/my_todo_app/todo_app/templates/posts/create.html new file mode 100644 index 00000000..90d5c379 --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/templates/posts/create.html @@ -0,0 +1,15 @@ +{% extends 'base.html' %} + +{% block header %} +

{% block title %}Add NewTodo{% endblock %}

+{% endblock %} + +{% block content %} +
+ + + + + +
+{% endblock %} \ No newline at end of file diff --git a/week-0/day-3/my_todo_app/todo_app/templates/posts/index.html b/week-0/day-3/my_todo_app/todo_app/templates/posts/index.html new file mode 100644 index 00000000..b4364ed9 --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/templates/posts/index.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} + +{% block header %} +

{% block title %}Todos{% endblock %}

+ {% if g.user %} + New + {% endif %} +{% endblock %} + +{% block content %} + {% for post in posts %} +
+
+
+

{{ post['title'] }}

+
on {{ post['created'].strftime('%Y-%m-%d') }}
+
+ {% if g.user['id'] == post['author_id'] %} + Edit + {% endif %} +
+

{{ post['body'] }}

+
+ {% if not loop.last %} +
+ {% endif %} + {% endfor %} +{% endblock %} \ No newline at end of file diff --git a/week-0/day-3/my_todo_app/todo_app/templates/posts/update.html b/week-0/day-3/my_todo_app/todo_app/templates/posts/update.html new file mode 100644 index 00000000..a24a8d4f --- /dev/null +++ b/week-0/day-3/my_todo_app/todo_app/templates/posts/update.html @@ -0,0 +1,20 @@ +{% extends 'base.html' %} + +{% block header %} +

{% block title %}Edit "{{ post['title'] }}"{% endblock %}

+{% endblock %} + +{% block content %} +
+ + + + + +
+
+
+ +
+{% endblock %} \ No newline at end of file From 6d1291aef05f54344eaf72cbc7695f5857fcaf32 Mon Sep 17 00:00:00 2001 From: Sumit Tomar Date: Mon, 15 Jul 2019 22:06:36 +0530 Subject: [PATCH 2/3] JustSomeText --- .../day-3/my_todo_app/instance/todo_app.sqlite | Bin 0 -> 20480 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 1283 bytes .../todo_app/__pycache__/auth.cpython-36.pyc | Bin 0 -> 2537 bytes .../todo_app/__pycache__/db.cpython-36.pyc | Bin 0 -> 1352 bytes .../todo_app/__pycache__/post.cpython-36.pyc | Bin 0 -> 2567 bytes .../my_todo_app/todo_app/templates/base.html | 2 +- 6 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 week-0/day-3/my_todo_app/instance/todo_app.sqlite create mode 100644 week-0/day-3/my_todo_app/todo_app/__pycache__/__init__.cpython-36.pyc create mode 100644 week-0/day-3/my_todo_app/todo_app/__pycache__/auth.cpython-36.pyc create mode 100644 week-0/day-3/my_todo_app/todo_app/__pycache__/db.cpython-36.pyc create mode 100644 week-0/day-3/my_todo_app/todo_app/__pycache__/post.cpython-36.pyc diff --git a/week-0/day-3/my_todo_app/instance/todo_app.sqlite b/week-0/day-3/my_todo_app/instance/todo_app.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..b6cfbb8c11d5952935ef7cfc76d242e916681e84 GIT binary patch literal 20480 zcmeI%&raJg90zcxvbu0QSmQxzl#KmY;|fB*y_009U<00I#BZvqdy z;WYn|q`^{v+ZW{ejx!s-Ol6qMh=kqaLt*s>G#{r^-nD#3P{;Q?HD9oJ zWEPpn`B;+R-_>+0Q(h#|&$s%!eUIB`u3l+tu`H83-sNik4j~^efy+I~#r*d*B*P7)Oq_x4;B)pb~D$@MDZxqB2m10i)E}cs&(YoiO#5zX5 zWwvMEwa zv8M|p2tWV=5P$##AOHafKmY;|fB*zGRiLUjhWr1feqQVg0uX=z1Rwwb2tWV=5P$## zAW#V4|9>0=2tWV=5P$##AOHafKmY;|fWYPp;Qqh)-xxcD00bZa0SG_<0uX=z1Rwwb G2)qDKGOOGG literal 0 HcmV?d00001 diff --git a/week-0/day-3/my_todo_app/todo_app/__pycache__/__init__.cpython-36.pyc b/week-0/day-3/my_todo_app/todo_app/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04c891f67f268338565a746a7bd1075fc9317628 GIT binary patch literal 1283 zcmbVM&2Aev5GJ`lT1hM0QH&sHP{8e}0%C6vUve;vIJSBzpa7BEGy;mndP!N7cF7Hw za-xNFa;|xhyb=$&Zz$1s^A?o>G!43_2*m%EYNjXcgox|{fLZDNi@-r}v zG^Uu6k7R|HcuJ-Yb+kM6rasIX)V(Iu`v?J+5N;Nz7qv}5eZVxVUW9AZ5?y1A7CV4# zTBM!5Mq<}Rx;1Mlg^~TM@HKtA4`T)2Up=}ywVcuCe5XqTtEwROewgcMj zl?z%t-C4TRdmH^0=({U#qxaT&u(?mS=?=YD@7N}yJ2;0VJmjL(iAY(jSe9sh#o|WnAWg=`l^2(|JHvq3eHZ>PhOl1`&Dy|Iw%(4)Gv9) zgsy_9obaneT&9rDn?XPt0+mooM4Pac)}U&v_}g=dP3+1{xfj~S~T zykZI68%VJ~=BegVfPBTWD%_yfn1^>~|HA+Hy_Gfa@IRNo6Z_f!0M+3>A=QAB-?DFi zL=%~_NSE`R>!*j&87pU67EzKWl;w;4Ns`VIJ&_`M$JlKDNko&y{$Z3a;(y8$-3W2a z1=n#5l`xG>`hT$5wrNLh^(a*=(X6iNQ6|$QD~}I0c3-nR$W~ILAaO~Cnf~vQ5Bq&?LgHQ)Yf`uB(1fp6|*B8 z3+aMVMT#OED31IA{sb5P#a=n_7dX*9YsqrLORnwh>6xCH?(gef-e5(u_1JKY*mTX#pjvLoL9QLz!we|S%Iyx(kselS@{JSY3`D;&an&1 zI?ooAby-;#M;cpV%gS<&onw_3#I3;0d3K(yDC-K-_DJpG9}olCsX1BUqo~KbBJ9Y_ zY(#$A%Cu(Y2+l&m1DVYU-eFvLlE>Z1mprot|FXwZnb|2%(=h2|c27iJBM~*4Ed?ze zw7ssMrbmfjUJLiDG+FGCrQumb~D58$yVR2;|u1BxPMph zM)Dc80wvC11;TTCTP_GJv5j#APsFq56uyP*)E9BnSBVh zkp@0GSRC=aTIURivusY<=U=&ffO!e)ZAL{uAZ4Hon#R_)@j%r*|Je z+up0LZLM$B`b9))BTAZKr@x5$1f`9ZjHBADurWF-2PrdvEU_q|$>z^_&;wdI4K9OL z(&3qfv%VBF$|XqRIFtgR6i|>v=qM}@HA5_+z6>Ix>>x9_5Q+GOh|6I4bGP0~VqTYN z5BzW5s(;MWwoJNpKkylkkFU4g@VduX z7I~It;e_-W2ttb*{#lwq4V3CBfhzNy2{dorWhASq-gphC=;4~ z_a8JxN*bq>92x^dk?^6S?4q<_4Acf9($rX^a(DchJz84Ve<5MZPSiWx$;dETE>BvPrGW{@}s84?u~$R2SX z#R`fd3I{}H1`+qg-x9_=4MAK)hfC;S;Ms~Zxp+(MqRy^?n!XES3T6PctUCa386bBw z05^yCJy_MZ5#FRHC-|c81Ycw-;;Y&Ll{$lFpvs@_OqUQ48zT`{P@EDUS^fGot^ByV zFqLA*BS^IO;T>o=f**wkXYdl~1rT_Fm(aDog>J?)MqfD4!L$K(A$@0ZZ*)f&OjB9~ zp?HZ+t|F&y{*pAvfc${YZ^VG7imNClF<{GYANiu0f@XXb@}sGgmyQG!9cLceAAnzq zRgRf2(f(D1hc|A28=FxQ_)&UiW7-KmK!rxH6UZcq(#*uEv_{1m-T|Rhht;&)pkOYa z-S$2#%JZmIY_SfbHxhCWmwW(1B?RCbLIPCbU0_5~Pw!NuF(QX1qbJ2_jg*}cm0|G? z`1UXVV*!Qi_Eyc#sjS22QJkjnEaf2%-0F2kEJcaWJP4}^nG8D~lKUy%87l;miIk<5 zCN^LMxtWKT`t+R9R|WRA{QrTrKnmq;SKURSiO{H~o>LV&v%7G_MZ3>?&5aa#x(MZQ zUY6L%-I;MS-CzfK@nR3n9M8j#lILagpqrTjYKN;%DX^Xtl@$)z;sJ;60>{3rSOEWl os2HZ=R|TSAbvEOK^&)-;X`Eu&Idn~*r&y|GTDeqNSu~yEUuT|LF8}}l literal 0 HcmV?d00001 diff --git a/week-0/day-3/my_todo_app/todo_app/__pycache__/db.cpython-36.pyc b/week-0/day-3/my_todo_app/todo_app/__pycache__/db.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5bf67b618ef9b338d6d501267b258efb0e566b09 GIT binary patch literal 1352 zcmZ8hO>Y}F5GA>*)#}T3nqHjtAoQl9mV!8k9Ezfj?L&b=aP0tX7bq4h&d6G6zrv*; zOGr-gwaD+tU*ff={)L`8q!Lx=0vrx!xXbtE4fnj)Yq#;cKVEx`{lyL*pZp(b)H5=` zfM+b)%{=0?7MaMs$jkl6=Qi$TjXa0~@_lGLvZx6GG-(bYgci*$;?6q>~W`AyB{K^$63$NFOp@FVeVA$1Z?jb6xoHxHg3?OZa6qeRdLJF%T-@GW$5+>vKfn3?=K4-G zC>wdVNr5BS_X~=c9Zb>k>*^j?vzM$*@|R;2w1hlO`QecgZjwa-T+5w7IeY$!(M# zJ6i&-aL>qj$L3V1E$7w~b5Hx$2Sz30<3Ynb)tD$KSH*!0CX`uOBb{hGnWd(a0K~G) z^P~WCoEE7C^Ep5=dIb4D{;EUAn$T^d#0jlxt0m(E_9@MKl`T+PHV5`4Iht+Rd#kGe zg8bpxdrqLecYN+|8EGwSgK_pN!T*Kbvfp+zyz!=8%Ngd$khC=ZQcqtE0#}xumc6pV zB34+JOC>St;RDL0##*Yh(#BVqfC&I)2{;f=V8f^X=hOT|`%8jZ2V@uzM3<{m@-{Ac z29rHAo8QY|U$M;io*4-sNC0m$yv(TleLcfIKBToyi~Bw#I_XoT`;w4p>=(G|>tvE) zJ=~oBM8!{&EZrcux9sLgQsZzu@EjJ?AjRau_$X)P0SVWhRvGn#%vUsaqWA%Kk$neQ z*d7fhN}n9MP#oz0uoWZ+&5M@$nj{gHkn1Bcc10rq_C4cOWo1!N2hpYH=#mFW9Ec;@ z`3;RvrR<83D;u*-*;BUBmF-^Bm}W`6a60b3-g1EzeG{jeGGqu^hQ$u5=v literal 0 HcmV?d00001 diff --git a/week-0/day-3/my_todo_app/todo_app/__pycache__/post.cpython-36.pyc b/week-0/day-3/my_todo_app/todo_app/__pycache__/post.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..715e4c6a759d2253b61f5383a373c292a82cd3ea GIT binary patch literal 2567 zcmZuzUvtw&5Z9gl+Ho8wfj|PZDrJU!KCSllbi4c8-<}^VE*6=r{`RJ582=jQE(_%E z;g|jc12Y(jjF^NZrXh{Z(2T9nitW&jozRKh(2c#&BWOpXLR<`sN;ac~xD=L@Y(yLhIc7@PME`&rZlYZN`INTQ^Gt}cyCNexS}*gw!s!ZP+nqXwuE|^S!LJQGFy31 z!b{3#m0h3NTw<4JHkZ}R8oM!@xx%i_X4cqx(+Ix$527*xFE9KMjrmCQhBCJgqfUC9 zlcU@dob?3n%6v)iA>*Pgc|3|blIO1AzmIt;b9XGF_F*D&H|1&CONIf-?ao0WBnagw zIqD7DXbbOQpmC14Y_o%ahyrY!TcaeEA4#o?Zs29Y4^#dWe(5t9q|qk~!hL5*nnB>i z$RND~Pu!Fyqf^o}q%}3(k&N_hW@g4AnbN)k8Y*38Wt7<;Cz|#~W=&?z$GnU6S z<=W&{v;MOFwB_INpY8Ac?4vvWuRqoI>pmJKXurKPsh~cs^&kf)TgNhvFi52fJROJ$ zae)dGC~RUX$rK z?#cTPYP&og$YfOObUTd4r+1G#-9ZPu8rI%&KDc|Y#yY2WAJpR0woF*k?uES-acz@YyM zoHrn7a0XNiL86SV8vqkZCP;(<2$_-IVHVsefL0KXq?rL|#2DUJu$h?&u-TcB5$W_@ z=Byis=9B`+X5X6{#E=D9L_R2>7nq0lpwJK-uzPOHo{V^I9VF~@Qf}dc|Ebm{51%)h z_5GIrywTdzxNa)*s*mQ?GkgR8mnSb@*PH(4PSwY6kW;J@l|hxg$+E^@CrKATNx0~O zqjQv7K!I3b^(y4WDoU8I+`_WUoo*5XsJb>hoK%HiiR&oeKtr1gkqB`a6<7{>xPnuT z-Wko(uV66DBEgSEEkMyDMTI7%E7T(;B5r|2t4q-kE_7;6sRleqW2#6sBMU{cD11Co zMN%=dZz0tb4n(|wIcwdJcHd$4x-l@t3$St&6_HwQW0KBTG}`L1s{dJ~^FloI%VL{-Y;WJ}pGUNifK4cj&>_`Qh_y#nsPx^T6ImXX1%3>-`=Sr z!M1mF8&&=D3tZCS&zh;qX|SMjqce1|9(2VypMXQ3_*6nZQLza&=b>Xf;^&}4qM?@xx_cmK=%9I#*~tU|YO+CN z0}xf}EotNVr5c*qm|WY1g9ws&@ff<8zrfL1!j7)H%;y;is7}Tg1J{nXVQGpL4}n9K zmZ5=&0G=AKb{+1jxdx>5`J>ie(SHvH0)y7rU~kcgU=3^d6gKLFUwzBPV8X{oTl}QU zM-u)aq>66g;-|ApFA@(sMFPjEI{% block title %}{% endblock %} - TodoApp