diff --git a/app/__init__.py b/app/__init__.py index d29b2d8..4cbf8e6 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -16,8 +16,17 @@ @login_manager.user_loader def load_user(user_id): - return User.get(email=user_id) + try: + return User.get(id=user_id) + except User.DoesNotExist: + pass +@login_manager.unauthorized_handler +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/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..3d87679 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,24 @@ 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(unique = True) password = TextField() + id = PrimaryKeyField() @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 +41,4 @@ def authenticat_password(self, password): def get_id(self): - return self.email + return self.id 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..c949764 100644 --- a/app/views/accounts.py +++ b/app/views/accounts.py @@ -1,24 +1,60 @@ 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 -from app.models.accounts import User, UserAlreadyExists - +from app.models.accounts import User, EmailAlreadyUsed, UsernameAlreadyUsed +from werkzeug import security +from app.models.core import db @App.route('/index') +@login_required def index(): - return "Hello " + current_user.email + return "Hello " + current_user.username + +@App.route('/') +@login_required +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')) +@login_required +def edit_profile(): + global current_user + user = User.get(email=current_user.email) + form = LoginForm(username=user.username, email=user.email) + if request.method == "POST" : + if form.username.data != user.username : + try: + 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 : + 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 != '': + 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,16 +65,21 @@ 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') +@login_required def logout(): logout_user() return redirect(url_for('login')) diff --git a/example.db b/example.db deleted file mode 100644 index 230276e..0000000 Binary files a/example.db and /dev/null differ diff --git a/kawn.db b/kawn.db index 44446a0..a130456 100644 Binary files a/kawn.db and b/kawn.db differ