From 42092b3cc4fd552c817579891898b08164ae8ffb Mon Sep 17 00:00:00 2001 From: amrshedou Date: Sun, 2 Oct 2016 15:04:30 +0200 Subject: [PATCH 1/4] added tons of features --- app/__init__.py | 6 ++- app/forms/user_forms.py | 1 + app/models/accounts.py | 23 +++++++---- app/templates/edit_profile.html | 13 +++++++ app/templates/login.html | 2 +- app/templates/profile_user.html | 8 ++++ app/templates/register.html | 1 + app/views/accounts.py | 66 ++++++++++++++++++++++++++------ example.db | Bin 2048 -> 0 bytes kawn.db | Bin 4096 -> 4096 bytes 10 files changed, 100 insertions(+), 20 deletions(-) create mode 100644 app/templates/edit_profile.html create mode 100644 app/templates/profile_user.html delete mode 100644 example.db diff --git a/app/__init__.py b/app/__init__.py index d29b2d8..fde6a25 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -16,8 +16,12 @@ @login_manager.user_loader def load_user(user_id): - return User.get(email=user_id) + try: + return User.get(username=user_id) + except User.DoesNotExist: + pass +#User.drop_table() User.create_table(fail_silently=True) from app.views.accounts import * diff --git a/app/forms/user_forms.py b/app/forms/user_forms.py index 896db38..fc039de 100644 --- a/app/forms/user_forms.py +++ b/app/forms/user_forms.py @@ -5,4 +5,5 @@ class LoginForm(Form): email = StringField('email', validators=[DataRequired()]) + username = StringField('username', validators=[DataRequired()]) password = StringField('password', validators=[DataRequired()]) diff --git a/app/models/accounts.py b/app/models/accounts.py index 09e03b1..42859a3 100644 --- a/app/models/accounts.py +++ b/app/models/accounts.py @@ -3,9 +3,12 @@ from werkzeug import security from app.models.core import Base -class UserAlreadyExists(BaseException): +class EmailAlreadyUsed(BaseException): pass +class UsernameAlreadyUsed(BaseException): + pass + class User(Base, UserMixin): ''' User model that represnts all user types in the app @@ -13,17 +16,23 @@ class User(Base, UserMixin): Note: should only contain methods and fields related to this functionalties only ''' - email = TextField(primary_key=True) + email = TextField(unique=True) + username = TextField(primary_key = True) password = TextField() @staticmethod - def register(email, password): + def register(email, username, password): password = security.generate_password_hash(password, method='pbkdf2:sha1', salt_length=8) try: - user = User.get(email=email) - raise UserAlreadyExists + if User.get(email=email) : + raise EmailAlreadyUsed except User.DoesNotExist: - user = User.create(email=email, password=password) + try : + if User.get(username=username) : + raise UsernameAlreadyUsed + except User.DoesNotExist : + pass + user = User.create(email=email, username=username, password=password) return user def authenticat_password(self, password): @@ -31,4 +40,4 @@ def authenticat_password(self, password): def get_id(self): - return self.email + return self.username diff --git a/app/templates/edit_profile.html b/app/templates/edit_profile.html new file mode 100644 index 0000000..2c9e71b --- /dev/null +++ b/app/templates/edit_profile.html @@ -0,0 +1,13 @@ +{%extends 'base.html'%} +{% block title %} + Edit Profile +{% endblock %} +{%block content%} +
+

Edit

+

{{ form.username.label}} {{form.username}}

+

{{ form.email.label }} {{ form.email }}

+

{{ form.password.label }} {{ form.password }}

+ +
+{%endblock%} \ No newline at end of file diff --git a/app/templates/login.html b/app/templates/login.html index 5292227..97f0604 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -6,7 +6,7 @@ {%block content%}

Login

-

{{ form.email.label }} {{ form.email }}

+

{{ form.email.label }} or username {{ form.email }}

{{ form.password.label }} {{ form.password }}

diff --git a/app/templates/profile_user.html b/app/templates/profile_user.html new file mode 100644 index 0000000..d13245c --- /dev/null +++ b/app/templates/profile_user.html @@ -0,0 +1,8 @@ +{% extends "base.html"%} +{%block content%} +{%if current_user.username == user.username %} +Edit +{%endif%} +

username :{{ user.username }}

+

email : {{user.email}}

+{%endblock%} \ No newline at end of file diff --git a/app/templates/register.html b/app/templates/register.html index c0f93f2..7f93354 100644 --- a/app/templates/register.html +++ b/app/templates/register.html @@ -5,6 +5,7 @@ {%block content%}

Register

+

{{ form.username.label}} {{form.username}}

{{ form.email.label }} {{ form.email }}

{{ form.password.label }} {{ form.password }}

diff --git a/app/views/accounts.py b/app/views/accounts.py index a9c846b..bdb5257 100644 --- a/app/views/accounts.py +++ b/app/views/accounts.py @@ -1,24 +1,64 @@ from flask import render_template, request, redirect, url_for, flash from flask_login import login_user, logout_user, current_user - +import peewee from app import App from app.forms.user_forms import LoginForm -from app.models.accounts import User, UserAlreadyExists - +from app.models.accounts import User, EmailAlreadyUsed, UsernameAlreadyUsed +from werkzeug import security @App.route('/index') def index(): - return "Hello " + current_user.email + return "Hello " + current_user.username + +@App.route('/') +def profile(username): + try : + user = User.get(username=username) + except User.DoesNotExist : + flash("User doesn't exist") + return redirect(url_for('register')) + return render_template('profile_user.html', user=user) + +@App.route("/edit_profile", methods=('GET', 'POST')) +def edit_profile(): + global current_user + user = User.get(email=current_user.email) + #username = current_user.username + #email = current_user.email + form = LoginForm(username=user.username, email=user.email) + if request.method == "POST" : + if form.username.data != user.username : + try: + User.update(username=form.username.data).where(email==user.email).execute() + current_user = User.get(email=user.email) + current_user.username = User.get(email=user.email).username + current_user.save() + except peewee.IntegrityError: + flash("Username already registered") + if form.email.data != user.email: + try : + User.update(email=form.email.data).where(username==user.username).execute() + current_user = User.get(username=user.username) + current_user.email = User.get(username = user.username).email + current_user.save() + except peewee.IntegrityError : + flash("Email already registered") + if form.password.data != '': + User.update(password=security.generate_password_hash(form.password.data, method='pbkdf2:sha1', salt_length=8)).where(username==username).execute() + return render_template("edit_profile.html", form=form) @App.route('/register', methods=('GET', 'POST')) def register(): form = LoginForm() if request.method == 'POST': try: - User.register(form.email.data, form.password.data) - except UserAlreadyExists : - flash('User already registered') - return redirect(url_for('login')) + User.register(form.email.data, form.username.data, form.password.data) + except EmailAlreadyUsed : + flash('Email already registered') + return render_template('register.html', form=form) + except UsernameAlreadyUsed : + flash('Username already registered') + return render_template('register.html', form=form) flash('Created user succesfully') return redirect(url_for('login')) return render_template('register.html', form=form) @@ -29,13 +69,17 @@ def login(): if request.method == 'POST': try: user = User.get(email=form.email.data) + except User.DoesNotExist: + try : + user = User.get(username=form.email.data) + except User.DoesNotExist: + user = None + if user: check = user.authenticat_password(form.password.data) if check: login_user(user) return redirect(url_for('index')) - except User.DoesNotExist: - pass - flash("wrong password or email") + flash("wrong password or email/username") return render_template('login.html', form=form) @App.route('/logout') diff --git a/example.db b/example.db deleted file mode 100644 index 230276e312cf3f225b759eeb0122458b901b003c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCU|@n`AO!}DK#~Q@22mhBA;83-`*8;^ zP!%I{BLfhPg3%Bd4FTj3sAXgq7Zqh}j4eq_%1JFPPAvjqCg&hm#}HSA5Jx8;R|O@I zkdlIiQf7*hf~Q}ItGjEEf}ekgf?ueQk3v9@r>|pBq=L6=q>h48YHng?j*>!%YXndl zsst!pkXT$?o?isik0PT9$(zd=n3p3vYLq=10;3@?h(aKok(EKbQ9UCyCnsOURHZ1t zG%uyt*3{V4z`#JI&@d+|F(@-Q-O|azz{fFHrPAFyK;N;%LN7GTEH5J^wbaAW-$ySj Y#5BpGG%VFqKQYnJ)wv?bFEGRz0QGH1-T(jq diff --git a/kawn.db b/kawn.db index 44446a08a838672d2c878153737a1994e392c189..10f32075e035e714e61824815e7554f04e2cc829 100644 GIT binary patch literal 4096 zcmeHJ&2G~`5MFzu@FT*{A<6-yuAN9wiJ)C?96RBHp*}0vBbD)?l%(9urzM(a4~ zE6Vg>nFwvmw-^s_-U& z@8nWSiNFO%;8?9{PV?jzJDdxiF@+eIblU{Cv4KdZ-|6&C>j5PMQ#+5z2}+KFS3ENM z$sr?sf-!DQUt%X2g}fy~%FQ4YQDhQ>5<4)Mh0R{T4O5sAwK2DQoJDk{RJR=MOyPg2 z`$t(}q+ZO&!e7}TZNwh{3@4HN(4#- z&K&~Rp{8uUXX-V$b>*j7@c$IRFYxr-HC{GUB5>gmxB;65`-?vnwFb3<{<-}fdbzuW literal 4096 zcmeH}NpBlB6vs!FvvkQJ2O|i283+TkL2LPOCkH4HFRG$c@;Y)P0Y$-WEZbTv$?}q% z(w_PO`dQk0KT1DA&%Kn2lOm~HQmyR9n_F4D*{s*&?cG{qb+;XV zTWNn4m+aWPMVg*o5XhrLpqRa#-`>*ZniL{BE?!*SUAota0sLNp4+ zKW8ynylOtU@Z22u#seRy2a0!Rx%qB%85Msl-d^}=AujwCskIDp1p-lJRNlQaPm(E9DSc8UGK@1@Dy+v2$u*2(lwyx7p?XB{?I1E+Q33Nr(7wnEKp2n z?mcC~P(nD;R10V1!Q!voDGP^yua1f8PfZW0I0kXjv*Gq<95-Y^TPT?XaJ)WIUV>+~jLULL4Bu z(9NTZW~<+B)b^*Fy@Or~rM&Yq*(pyuR>Xr9$p zUMyS-hZIm*0SH3h1K;Rvna=LccK33WPY1nG(yCA~>S#D*0=D_l3Eo*@m1EwhF@KWP z*P9!RwCI+e=oR{+a2*_@6st0)EQIqt@J@Fl8=w2m_Qh5w8#J;6_Bd+GR`0Nq(dyHl z*&Q6OR2w0}CNr)5i#9sjJ1wu(JNXfQ^^?EwT~z$J_~pWHp>tz59{8_3;64pE`~GW{ zLa+=dhVV@VndfDSBn94|*TQNxI%bM zCxNo`mKO3D1&W+eIO0q~5UAmtLN(4CXV0EBb`k;#du@Wi_*^lL2?r{u1e=HCAxw~B zrX5qf`*GmRWvqarL7_k*xDttZ(l-V@-D&n4i82fkFNk-!WWrM_j0B>Bx@m+RV8#NO z=Abs}MiLP=ZPmwGW&ae_!dE|2LP*sD-ChkoW?krXzeF!DMYAiwmaUx85OO3FC Kn?PbYbAJKUv7goe From d9835eb147908958e00e1bacfc39dab73200be2f Mon Sep 17 00:00:00 2001 From: amrshedou Date: Tue, 4 Oct 2016 21:01:06 +0200 Subject: [PATCH 2/4] fixing stuff --- app/models/accounts.py | 2 +- app/views/accounts.py | 13 +++---------- kawn.db | Bin 4096 -> 4096 bytes 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/app/models/accounts.py b/app/models/accounts.py index 42859a3..e04633e 100644 --- a/app/models/accounts.py +++ b/app/models/accounts.py @@ -17,7 +17,7 @@ class User(Base, UserMixin): related to this functionalties only ''' email = TextField(unique=True) - username = TextField(primary_key = True) + username = TextField(unique = True) password = TextField() @staticmethod diff --git a/app/views/accounts.py b/app/views/accounts.py index bdb5257..34bcc2d 100644 --- a/app/views/accounts.py +++ b/app/views/accounts.py @@ -5,6 +5,7 @@ from app.forms.user_forms import LoginForm from app.models.accounts import User, EmailAlreadyUsed, UsernameAlreadyUsed from werkzeug import security +from app.models.core import db @App.route('/index') def index(): @@ -23,24 +24,16 @@ def profile(username): def edit_profile(): global current_user user = User.get(email=current_user.email) - #username = current_user.username - #email = current_user.email form = LoginForm(username=user.username, email=user.email) if request.method == "POST" : if form.username.data != user.username : try: - User.update(username=form.username.data).where(email==user.email).execute() - current_user = User.get(email=user.email) - current_user.username = User.get(email=user.email).username - current_user.save() + db.execute_sql("UPDATE User SET username=? WHERE email=?;", (form.username.data, user.email)) except peewee.IntegrityError: flash("Username already registered") if form.email.data != user.email: try : - User.update(email=form.email.data).where(username==user.username).execute() - current_user = User.get(username=user.username) - current_user.email = User.get(username = user.username).email - current_user.save() + db.execute_sql("UPDATE User SET email=? WHERE username=?;", ( form.email.data,user.username)) except peewee.IntegrityError : flash("Email already registered") if form.password.data != '': diff --git a/kawn.db b/kawn.db index 10f32075e035e714e61824815e7554f04e2cc829..914e363285c482b26ed27306e63aea89329ab67c 100644 GIT binary patch delta 468 zcma)&&r1S96vuaGG_6dK5Dy+)H=%-*ncbaPXX(;G!UB!x5FLuqoyE-`q+)qfJ9RAf zACUfoutR^3|3MK1(IHo`4qbZie)4^M9&e}&mHT8YC`nRa<_m)lJNkN1%D%p=%|;N6 zC3pZn!T4#E1IbeuN^HjEk?gi?(eHId=fV#y-W1*kNbN2fRVkMg)$degYo2|Hx?KWG ziF91<{jQ59cN@MCdS8Gn>vAX&kIT13&w`m%*H)Ec>7=kYc~!f{16L^W^dgqjEuO(1Gi4bveuGb`8fj66uE{)he{ z{{^4vZEhSql!ayE{I9E$%Ty!t|60gVsPPTd51ctvoe3eRDy4CI*CNy;bS=P E4HrRuI{*Lx delta 424 zcma*jze>YU6bA5{dqS;ZrA11W2)4A~V&(oxnl$22XK|2j{1 z2EIZUH{U>Cp+g5(b#ZVoEeL{(2fhObKKQ{I=7;$^Bf}6vdYqpr-f!|{hRSb`DfmQy z#|Q|#;PEJ9wlU7ePM89`ByBqybbsKcLA$F5fI~4~*8o>>uN13D!gA1G})QVRb(QGR@?NUZ) zrA$egusk(g({wF+i&ILtGwZ0fXr0hA?^p)R4V!|xln_#C9g$jC_hm`>Tw0#5g21AT zQ^#Y%CRWvx%u-gs9U`5o6anvRiS=4x@Js#={Kr+Sx7U@22PNC)oGMFDB|V=8(yltf iQ$pIrsZbKL70)t#?k&t-FhTGE6NE-fi|_D|)V~2Xr*9en From a116fa80ac5996ac0c1e05980f777f73ec432e9f Mon Sep 17 00:00:00 2001 From: amrshedou Date: Tue, 4 Oct 2016 21:26:06 +0200 Subject: [PATCH 3/4] overrided flask'slogin unauthorized access --- app/__init__.py | 5 ++++- app/views/accounts.py | 6 +++++- kawn.db | Bin 4096 -> 4096 bytes 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index fde6a25..41e62a2 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -21,7 +21,10 @@ def load_user(user_id): except User.DoesNotExist: pass -#User.drop_table() +@login_manager.unauthorized_handler +def unauthorized_callback(): + return redirect('/login') + User.create_table(fail_silently=True) from app.views.accounts import * diff --git a/app/views/accounts.py b/app/views/accounts.py index 34bcc2d..c949764 100644 --- a/app/views/accounts.py +++ b/app/views/accounts.py @@ -1,5 +1,5 @@ from flask import render_template, request, redirect, url_for, flash -from flask_login import login_user, logout_user, current_user +from flask_login import login_user, logout_user, current_user, login_required import peewee from app import App from app.forms.user_forms import LoginForm @@ -8,10 +8,12 @@ from app.models.core import db @App.route('/index') +@login_required def index(): return "Hello " + current_user.username @App.route('/') +@login_required def profile(username): try : user = User.get(username=username) @@ -21,6 +23,7 @@ def profile(username): return render_template('profile_user.html', user=user) @App.route("/edit_profile", methods=('GET', 'POST')) +@login_required def edit_profile(): global current_user user = User.get(email=current_user.email) @@ -76,6 +79,7 @@ def login(): return render_template('login.html', form=form) @App.route('/logout') +@login_required def logout(): logout_user() return redirect(url_for('login')) diff --git a/kawn.db b/kawn.db index 914e363285c482b26ed27306e63aea89329ab67c..140278b6d4e32030e74eccfd0a6ad00b1b39a003 100644 GIT binary patch delta 374 zcmaLSy-or_5C`zR9TOD!2!$0E5TG$ZXP0A-z1SF|mWJ3_xnCFjzz~rHJE*jj+!Oc+ zhIg>Aq~HOJPoOX05j3H4l1b)Y{4z76(x~)Y^fHs}Lof4s@dBIhL@133jUhKJtUc1b z2QNhqYUOc(BNKIob@WS|g~&t3cYTx`h3a&jbzOCN!y55^s(5x}PTRM=^Fb9Iw@s;i zAzH#$s$rOrfixKSMp@xp%gIPLWiX`4lFENeVoYtF@SeW55fA$v#X^RN)mGFV^rNfe zsxTrlT3g4gLTN>ER=|zYO=C<$qxE?*3xkA^;beTDNy8VRFeC5*vuR=d4Z=LsHda5$ sL&aOkG?BTae=7~&iJudg!)M~(VJ8dar62U&9m_#^sTYYaaQ2UqAKQ&wga7~l delta 362 zcmaKnyG{Z@7=>r|55Ws!HpWU4SfMh({4+ZjW;1B?^qmH35MZ`wCeKY6|d+kO_xz?FXsW3E& zxJ_F;5>g=wW>NB#D2+h89*v zm^c|3E0i$G*bKR0sI(E>SjSpUI^}lOrxyf1VKEO%A26E+C;L$MHahC>LAbr?IkF`1 W1 Date: Tue, 4 Oct 2016 22:11:30 +0200 Subject: [PATCH 4/4] made the user logged by an id instead of the username --- app/__init__.py | 4 +++- app/models/accounts.py | 3 ++- kawn.db | Bin 4096 -> 4096 bytes 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 41e62a2..4cbf8e6 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -17,7 +17,7 @@ @login_manager.user_loader def load_user(user_id): try: - return User.get(username=user_id) + return User.get(id=user_id) except User.DoesNotExist: pass @@ -25,6 +25,8 @@ def load_user(user_id): def unauthorized_callback(): return redirect('/login') +from app.models.core import db User.create_table(fail_silently=True) +db.register_fields({'primary_key': 'BIGINT AUTOINCREMENT'}) from app.views.accounts import * diff --git a/app/models/accounts.py b/app/models/accounts.py index e04633e..3d87679 100644 --- a/app/models/accounts.py +++ b/app/models/accounts.py @@ -19,6 +19,7 @@ class User(Base, UserMixin): email = TextField(unique=True) username = TextField(unique = True) password = TextField() + id = PrimaryKeyField() @staticmethod def register(email, username, password): @@ -40,4 +41,4 @@ def authenticat_password(self, password): def get_id(self): - return self.username + return self.id diff --git a/kawn.db b/kawn.db index 140278b6d4e32030e74eccfd0a6ad00b1b39a003..a130456abe3b0ac9738462c8be0b380dfe1344df 100644 GIT binary patch delta 352 zcmaKo&q~8U5XO@%*cwWu=*?nNT2E4$neJ|~xv8LcFM2fD-B{5|u`Se-?agD0eFpE^ zXYfIUzJV`b{DTOB10VCj$MEBuaWD?1o31~r9=QI~*&|z-JKmg?7nS0@cQ$y)R{_B-R3d`5FD*ZWhzL88g-_%8hJT+t5N?C{eXpyBmBeap59)cC%v#4X%QNo zK_~=SvbL?XP>K{#I}sVFlp}CsBgb(@v&rDO_{w&0jWyg~oxD6O=lUK$-yT~!?2RoK ZmC_5FP1mbsR{uKrsE%HV)mDE#@eU%!TE+kX delta 341 zcmZorXi%6S&B!xR#+i|4W5P0Kw#f`klbQK83v#qG=~ptcGdQX$HVPUU7@FxC8t59B zC>R-985mg^8tIuBSQ;6aC1&KNrljU3X66_gPqtx~4slKP56mlwDpfH^HA*qHOfoSu zvoJGBOf*h5G_y3fOg1n#Nlr{LOHH*%wM>}<)1xeW{X+~DX z8Ht8gh6V-(Di&#hrNwDkZYpNUW@*VuNhzs@DTxM_DP}--nHwc1CYdHDCmSajq?i~1 z*=ETG3=9kv6B|o5aXe(!Hs)tmW<+v56Ht;5h@pUs`7;9(^EC$MYs^nJ3-X*|*5YMW am}BS{VSLVpJLc