From 75a8e1bd427d0248b0e58c27c3fc9e80a24f887f Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Mon, 16 May 2022 20:32:03 -0700 Subject: [PATCH 01/17] Small routes test --- app/routes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/routes.py b/app/routes.py index cab1df0..a9dd6f0 100644 --- a/app/routes.py +++ b/app/routes.py @@ -11,6 +11,7 @@ def index(): {"author": {"username": "Sal"}, "body": "Beautiful day in Portland!"}, {"author": {"username": "Michael"}, "body": "Pyrates are so cool!"}, {"author": {"username": "Scott"}, "body": "Ooh, Bootstrap!"}, + {"author": {"username": "Allyson"}, "body": "Hello, World!"}, ] return render_template("index.html", title="Home", user=user, posts=posts) From db2469c23cffc8a6037f46bd836db90fbe674b4f Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Mon, 16 May 2022 21:08:05 -0700 Subject: [PATCH 02/17] Fingers crossed! --- app/__init__.py | 5 ++++ app/forms.py | 20 ++++++++++++- app/models.py | 15 ++++++++-- app/routes.py | 47 ++++++++++++++++++++++-------- app/templates/404.html | 2 +- app/templates/base.html | 4 +++ app/templates/login.html | 6 ++-- app/templates/register.html | 37 ++++++++++++++++++++++++ poetry.lock | 57 ++++++++++++++++++++++++++++++++++++- pyproject.toml | 2 ++ 10 files changed, 175 insertions(+), 20 deletions(-) create mode 100644 app/templates/register.html diff --git a/app/__init__.py b/app/__init__.py index 3dd28d4..d05db83 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,6 +3,7 @@ from config import Config from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate +from flask_login import LoginManager # Construct core Flask application with embedded Dash app. @@ -11,6 +12,10 @@ app.config.from_object(Config) db = SQLAlchemy(app) migrate = Migrate(app, db) +login = LoginManager(app) +login.login_view='login' + +from app import routes,models with app.app_context(): diff --git a/app/forms.py b/app/forms.py index 0657146..4e7845e 100644 --- a/app/forms.py +++ b/app/forms.py @@ -1,6 +1,7 @@ from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField -from wtforms.validators import DataRequired +from wtforms.validators import DataRequired, ValidationError, Email, EqualTo +from app.models import User class LoginForm(FlaskForm): @@ -8,3 +9,20 @@ class LoginForm(FlaskForm): password = PasswordField("Password", validators=[DataRequired()]) remember_me = BooleanField("Remember Me") submit = SubmitField("Log In") + +class RegistrationForm(FlaskForm): + username = StringField('Username', validators=[DataRequired()]) + email = StringField('Email',validators=[DataRequired(), Email()]) + password = PasswordField('Password', validators=[DataRequired()]) + password2 = PasswordField('Repeat Password', validators=[DataRequired(), EqualTo('password')]) + submit = SubmitField('Register') + + def validate_usernames(self, username): + user = User.query.filter_by(username=username.data).first() + if user is not None: + raise ValidationError('This username is already in use.') + + def validate_email(self, email): + user = User.query.filter_by(email=email.data).first() + if user is not None: + raise ValidationError('Please use a different email address') \ No newline at end of file diff --git a/app/models.py b/app/models.py index 3c7be1a..676aa46 100644 --- a/app/models.py +++ b/app/models.py @@ -1,5 +1,7 @@ from datetime import datetime -from app import db +from app import db, login +from werkzeug.security import generate_password_hash, check_password_hash +from flask_login import UserMixin user_coins = db.Table( @@ -13,7 +15,7 @@ ) -class User(db.Model): +class User(db.Model, UserMixin): __tablename__ = "user" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), index=True, unique=True) @@ -26,6 +28,15 @@ class User(db.Model): def __repr__(self): return "".format(self.username) + def set_password(self, password): + self.password_hash = generate_password_hash(password) + + def check_password(self, password): + return check_password_hash(self.password_hash, password) + +@login.user_loader +def load_user(id): + return User.query.get(int(id)) class Coin(db.Model): __tablename__ = "coin" diff --git a/app/routes.py b/app/routes.py index a9dd6f0..fabf4e9 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,6 +1,8 @@ -from flask import render_template, flash, redirect, url_for -from app import app -from app.forms import LoginForm +from flask import render_template, flash, redirect, url_for, request +from app import app,db +from app.forms import LoginForm, RegistrationForm +from flask_login import current_user, login_user, logout_user, login_required +from werkzeug.urls import url_parse @app.route("/") @@ -18,16 +20,37 @@ def index(): @app.route("/login", methods=["GET", "POST"]) def login(): - form = LoginForm() + if current_user.is_authenticated: + return redirect(url_for('index')) + form=LoginForm() if form.validate_on_submit(): - flash( - f"Login requested for user {form.username.data}, " - f"remember_me={form.remember_me.data}" - ) - return redirect(url_for("index")) - return render_template("login.html", title="Log In", form=form) + user=User.query.filter_by(username=form.username.data).first() + if user is None or not user.check_password(form.password.data): + flash('Invalid username or password') + return redirect(url_for('login')) + login_user(user, remember=form.remember_me.data) + next_page = request.args.get('next') + if not next_page or url_parse(next_page).netloc !='': + next_page = url_for('index') + return redirect(url_for('index')) + return render_template('login.html', title='Sign In', form=form) +@app.route('/logout') +def logout(): + logout_user() + return redirect(url_for('index')) -@app.route("/register") + +@app.route("/register", methods=['GET', 'POST']) def register(): - return render_template("wip.html") + if current_user.is_authenticated: + return redirect(url_for('index')) + form = RegistrationForm() + if form.validate_on_submit(): + user = User(username=form.username.data, email=form.email.data) + user.set_password(form.password.data) + db.session.add(user) + db.session.commit() + flash('WELCOME! YOU GOT CRYPTO!') + return redirect(url_for('login')) + return render_template('register.html', title='Register', form=form) diff --git a/app/templates/404.html b/app/templates/404.html index ce8a7c1..5d55d3f 100644 --- a/app/templates/404.html +++ b/app/templates/404.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %}
-

Page Not Found

+

Page Has Been Eaten by a Gru

Back to home

{% endblock %} \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index 5e9f315..06a3b10 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -17,8 +17,12 @@ diff --git a/app/templates/login.html b/app/templates/login.html index 5de1d3c..982941b 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -1,7 +1,7 @@ {% extends "base.html" %} {% block content %} -
+

Log In

@@ -24,6 +24,6 @@

Log In

{{ form.remember_me() }} {{ form.remember_me.label }}

{{ form.submit() }}

- -
+

New User?Click to Register!

+
{% endblock %} \ No newline at end of file diff --git a/app/templates/register.html b/app/templates/register.html new file mode 100644 index 0000000..325066b --- /dev/null +++ b/app/templates/register.html @@ -0,0 +1,37 @@ +{% extends 'base.html' %} + +{% block content %} +

Register

+
+ {{ form.hidden_tag() }} +

+ {{ form.username.label }}
+ {{ form.username(size=32) }}
+ {% for error in form.username.errors %} + [{{ error }}] + {% endfor %} +

+

+ {{ form.email.label }}
+ {{ form.email(size=32) }}
+ {% for error in form.email.errors %} + [{{ error }}] + {% endfor %} +

+

+ {{ form.password.label }}
+ {{ form.password(size=32) }}
+ {% for error in form.password.errors %} + [{{ error }}] + {% endfor %} +

+

+ {{ form.password2.label }}
+ {{ form.password2(size=32) }}
+ {% for error in form.password2.errors %} + [{{ error }}] + {% endfor %} +

+

{{ form.submit() }}

+
+{% endblock %} \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 3c68c8c..69bd08c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -198,6 +198,22 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "dnspython" +version = "2.2.1" +description = "DNS toolkit" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[package.extras] +dnssec = ["cryptography (>=2.6,<37.0)"] +curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.10.0)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.20)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + [[package]] name = "dominate" version = "2.6.0" @@ -206,6 +222,18 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +[[package]] +name = "email-validator" +version = "1.2.1" +description = "A robust email syntax and deliverability validation library." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +dnspython = ">=1.15.0" +idna = ">=2.0.0" + [[package]] name = "filelock" version = "3.6.0" @@ -274,6 +302,18 @@ python-versions = "*" brotli = "*" flask = "*" +[[package]] +name = "flask-login" +version = "0.6.1" +description = "User authentication and session management for Flask." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +Flask = ">=1.0.4" +Werkzeug = ">=1.0.1" + [[package]] name = "flask-migrate" version = "3.1.0" @@ -850,7 +890,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "==3.8.10" -content-hash = "7f4ddf244726fd42a10a6b6dd0556a2d93a6dc27573e0babda64266245157fc8" +content-hash = "48bf6f5fa1282b265e7181ca749dec8653a2113dfe476b5d5983dc8af4cad287" [metadata.files] alembic = [ @@ -1055,22 +1095,33 @@ dash = [ {file = "dash-2.2.0.tar.gz", hash = "sha256:e88e6615695e83b7a8339301a92700461435fef734b40eca864cff6d853a3b9c"}, ] dash-core-components = [ + {file = "dash_core_components-2.0.0-py3-none-any.whl", hash = "sha256:52b8e8cce13b18d0802ee3acbc5e888cb1248a04968f962d63d070400af2e346"}, {file = "dash_core_components-2.0.0.tar.gz", hash = "sha256:c6733874af975e552f95a1398a16c2ee7df14ce43fa60bb3718a3c6e0b63ffee"}, ] dash-html-components = [ + {file = "dash_html_components-2.0.0-py3-none-any.whl", hash = "sha256:b42cc903713c9706af03b3f2548bda4be7307a7cf89b7d6eae3da872717d1b63"}, {file = "dash_html_components-2.0.0.tar.gz", hash = "sha256:8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50"}, ] dash-table = [ + {file = "dash_table-5.0.0-py3-none-any.whl", hash = "sha256:19036fa352bb1c11baf38068ec62d172f0515f73ca3276c79dee49b95ddc16c9"}, {file = "dash_table-5.0.0.tar.gz", hash = "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308"}, ] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, ] +dnspython = [ + {file = "dnspython-2.2.1-py3-none-any.whl", hash = "sha256:a851e51367fb93e9e1361732c1d60dab63eff98712e503ea7d92e6eccb109b4f"}, + {file = "dnspython-2.2.1.tar.gz", hash = "sha256:0f7569a4a6ff151958b64304071d370daa3243d15941a7beedf0c9fe5105603e"}, +] dominate = [ {file = "dominate-2.6.0-py2.py3-none-any.whl", hash = "sha256:84b5f71ed30021193cb0faa45d7776e1083f392cfe67a49f44e98cb2ed76c036"}, {file = "dominate-2.6.0.tar.gz", hash = "sha256:76ec2cde23700a6fc4fee098168b9dee43b99c2f1dd0ca6a711f683e8eb7e1e4"}, ] +email-validator = [ + {file = "email_validator-1.2.1-py2.py3-none-any.whl", hash = "sha256:c8589e691cf73eb99eed8d10ce0e9cbb05a0886ba920c8bcb7c82873f4c5789c"}, + {file = "email_validator-1.2.1.tar.gz", hash = "sha256:6757aea012d40516357c0ac2b1a4c31219ab2f899d26831334c5d069e8b6c3d8"}, +] filelock = [ {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, @@ -1090,6 +1141,10 @@ flask-compress = [ {file = "Flask-Compress-1.12.tar.gz", hash = "sha256:e2159499f39d618a4d56ba0484e7b58b57956b9a2c6d3510f095f5bb14b7afc5"}, {file = "Flask_Compress-1.12-py3-none-any.whl", hash = "sha256:9f4e40211755e86f85e5eb7d414856ef1e8751912caa78d62853169400335f0c"}, ] +flask-login = [ + {file = "Flask-Login-0.6.1.tar.gz", hash = "sha256:1306d474a270a036d6fd14f45640c4d77355e4f1c67ca4331b372d3448997b8c"}, + {file = "Flask_Login-0.6.1-py3-none-any.whl", hash = "sha256:b9a4287a2d0067a7a482a23e40075e0d670f371974633fe890222dece4e02a74"}, +] flask-migrate = [ {file = "Flask-Migrate-3.1.0.tar.gz", hash = "sha256:57d6060839e3a7f150eaab6fe4e726d9e3e7cffe2150fb223d73f92421c6d1d9"}, {file = "Flask_Migrate-3.1.0-py3-none-any.whl", hash = "sha256:a6498706241aba6be7a251078de9cf166d74307bca41a4ca3e403c9d39e2f897"}, diff --git a/pyproject.toml b/pyproject.toml index 459d977..4976667 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,8 @@ pycoingecko = "==2.2.0" Werkzeug = "==2.0.0" # required pin https://github.com/plotly/dash/issues/1992 PyMySQL = "==1.0.2" cryptography = "==37.0.2" +Flask-Login = "^0.6.1" +email-validator = "^1.2.1" [tool.poetry.dev-dependencies] black = "==22.3.0" From a29c160e4d7542f4826733d9259564c5b7019fb9 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 17 May 2022 14:33:42 -0700 Subject: [PATCH 03/17] Small tweaks, and userpage added. --- app/forms.py | 2 +- app/routes.py | 12 +++++++++++- app/templates/login.html | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/forms.py b/app/forms.py index 4e7845e..4afdde9 100644 --- a/app/forms.py +++ b/app/forms.py @@ -25,4 +25,4 @@ def validate_usernames(self, username): def validate_email(self, email): user = User.query.filter_by(email=email.data).first() if user is not None: - raise ValidationError('Please use a different email address') \ No newline at end of file + raise ValidationError('This email address is already active.') \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index fabf4e9..05559cb 100644 --- a/app/routes.py +++ b/app/routes.py @@ -3,6 +3,7 @@ from app.forms import LoginForm, RegistrationForm from flask_login import current_user, login_user, logout_user, login_required from werkzeug.urls import url_parse +from app.models import User @app.route("/") @@ -15,7 +16,7 @@ def index(): {"author": {"username": "Scott"}, "body": "Ooh, Bootstrap!"}, {"author": {"username": "Allyson"}, "body": "Hello, World!"}, ] - return render_template("index.html", title="Home", user=user, posts=posts) + return render_template("index.html", title="Home", posts=posts) @app.route("/login", methods=["GET", "POST"]) @@ -54,3 +55,12 @@ def register(): flash('WELCOME! YOU GOT CRYPTO!') return redirect(url_for('login')) return render_template('register.html', title='Register', form=form) + +@app.route('/user/') +@login_required +def user(username): + user = User.query.filter_by(username=username.data).first_or_404() + posts = [ + {'author': user, 'body': 'Test post #1'}, + ] + return render_template('user.html', user=user, posts=posts) diff --git a/app/templates/login.html b/app/templates/login.html index 982941b..a552b4b 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -24,6 +24,6 @@

Log In

{{ form.remember_me() }} {{ form.remember_me.label }}

{{ form.submit() }}

-

New User?Click to Register!

+

New User? Click to Register!

{% endblock %} \ No newline at end of file From 39640637bc81155d64d8b00a5811988ab3106eaa Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 17 May 2022 14:39:16 -0700 Subject: [PATCH 04/17] I think I broke something on the last one. ROUND 2! --- app/routes.py | 2 +- app/templates/base.html | 9 +++++---- app/templates/register.html | 4 +++- app/templates/user.html | 13 +++++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 app/templates/user.html diff --git a/app/routes.py b/app/routes.py index 05559cb..5589547 100644 --- a/app/routes.py +++ b/app/routes.py @@ -16,7 +16,7 @@ def index(): {"author": {"username": "Scott"}, "body": "Ooh, Bootstrap!"}, {"author": {"username": "Allyson"}, "body": "Hello, World!"}, ] - return render_template("index.html", title="Home", posts=posts) + return render_template("index.html", title="Home", user=user, posts=posts) @app.route("/login", methods=["GET", "POST"]) diff --git a/app/templates/base.html b/app/templates/base.html index 06a3b10..dfaea33 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -16,12 +16,13 @@
  • Home
  • diff --git a/app/templates/register.html b/app/templates/register.html index 325066b..03539ce 100644 --- a/app/templates/register.html +++ b/app/templates/register.html @@ -1,6 +1,7 @@ -{% extends 'base.html' %} +{% extends 'bootstrap/base.html' %} {% block content %} +

    Register

    {{ form.hidden_tag() }} @@ -34,4 +35,5 @@

    Register

    {{ form.submit() }}

    +
    {% endblock %} \ No newline at end of file diff --git a/app/templates/user.html b/app/templates/user.html new file mode 100644 index 0000000..f64cdc7 --- /dev/null +++ b/app/templates/user.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block content %} +
    +

    {{user.username}}

    +
    + {% for post in posts %} +

    + {{post.author.username}} says: {{post.body}} +

    + {%endfor %} +
    +{% endblock %} From 15b8c43042947d8a679ecf3ec1759687ab531b5d Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 17 May 2022 14:58:56 -0700 Subject: [PATCH 05/17] Fixed missing menu bar on registration page --- app/templates/register.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/register.html b/app/templates/register.html index 03539ce..0916827 100644 --- a/app/templates/register.html +++ b/app/templates/register.html @@ -1,4 +1,4 @@ -{% extends 'bootstrap/base.html' %} +{% extends 'base.html' %} {% block content %}
    From 5bc3be2615cf293b37d2cb11a92c2fa722897cf8 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 17 May 2022 15:48:15 -0700 Subject: [PATCH 06/17] minor tweaks, removed login requirement, user page gets 404 though --- app/routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes.py b/app/routes.py index 5589547..c8b37cd 100644 --- a/app/routes.py +++ b/app/routes.py @@ -57,7 +57,7 @@ def register(): return render_template('register.html', title='Register', form=form) @app.route('/user/') -@login_required + def user(username): user = User.query.filter_by(username=username.data).first_or_404() posts = [ From 61c7bed6dfba23a36ef80487216079b0c2a0b373 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 17 May 2022 16:24:32 -0700 Subject: [PATCH 07/17] >_< --- app/models.py | 5 +++++ app/templates/base.html | 6 +++--- app/templates/user.html | 16 ++++++++++++---- pyproject.toml | 4 ++-- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/app/models.py b/app/models.py index 676aa46..dd8a05a 100644 --- a/app/models.py +++ b/app/models.py @@ -2,6 +2,7 @@ from app import db, login from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin +from hashlib import md5 user_coins = db.Table( @@ -33,6 +34,10 @@ def set_password(self, password): def check_password(self, password): return check_password_hash(self.password_hash, password) + + def avatar(self,size): + digest = md5(self.email.lower().encode('utf-8')).hexdigest() + return 'https://www.gravatar.com/avatar/{}?d=identicons&s={}'.format(digest, size) @login.user_loader def load_user(id): diff --git a/app/templates/base.html b/app/templates/base.html index dfaea33..eaeaa4d 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -17,13 +17,13 @@
    diff --git a/app/templates/user.html b/app/templates/user.html index f64cdc7..dbac00a 100644 --- a/app/templates/user.html +++ b/app/templates/user.html @@ -1,13 +1,21 @@ {% extends "base.html" %} {% block content %} + + + + + +

    User: {{ user.username }}

    -

    {{user.username}}


    {% for post in posts %} -

    - {{post.author.username}} says: {{post.body}} -

    + + + + + +
    {{ post.author.username }} says:
    {{ post.body }}
    {%endfor %}
    {% endblock %} diff --git a/pyproject.toml b/pyproject.toml index 4976667..3b14262 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,8 +20,8 @@ pycoingecko = "==2.2.0" Werkzeug = "==2.0.0" # required pin https://github.com/plotly/dash/issues/1992 PyMySQL = "==1.0.2" cryptography = "==37.0.2" -Flask-Login = "^0.6.1" -email-validator = "^1.2.1" +Flask-Login = "==0.6.1" +email-validator = "==1.2.1" [tool.poetry.dev-dependencies] black = "==22.3.0" From 45014a9119b089412b56f20f22b267429a0248a5 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Sun, 22 May 2022 16:27:33 -0700 Subject: [PATCH 08/17] Re-introduce login requirements --- app/routes.py | 3 ++- app/templates/base.html | 6 +++--- docker-compose.yml | 2 +- ppp-project-2 | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) create mode 160000 ppp-project-2 diff --git a/app/routes.py b/app/routes.py index c8b37cd..0537e7e 100644 --- a/app/routes.py +++ b/app/routes.py @@ -8,6 +8,7 @@ @app.route("/") @app.route("/index") +@login_required def index(): user = {"username": "Fellow Pyrates"} posts = [ @@ -57,7 +58,7 @@ def register(): return render_template('register.html', title='Register', form=form) @app.route('/user/') - +@login_required def user(username): user = User.query.filter_by(username=username.data).first_or_404() posts = [ diff --git a/app/templates/base.html b/app/templates/base.html index eaeaa4d..dfaea33 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -17,13 +17,13 @@ diff --git a/docker-compose.yml b/docker-compose.yml index 4509470..9f7d531 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,7 +38,7 @@ services: ports: # : < MySQL Port running inside container> - - '33060:3306' + - '3306:3306' # Where our data will be persisted volumes: # pass volume named mysql-data to mysql container diff --git a/ppp-project-2 b/ppp-project-2 new file mode 160000 index 0000000..654332a --- /dev/null +++ b/ppp-project-2 @@ -0,0 +1 @@ +Subproject commit 654332abe2934485844bedf5635124d0858561df From 5e22f60ec9c39d0e02335151e08800f291d1c2ec Mon Sep 17 00:00:00 2001 From: Sal Mireles Date: Sun, 22 May 2022 18:21:12 -0700 Subject: [PATCH 09/17] remove login required from user --- app/routes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/routes.py b/app/routes.py index 0537e7e..eb65d23 100644 --- a/app/routes.py +++ b/app/routes.py @@ -58,7 +58,6 @@ def register(): return render_template('register.html', title='Register', form=form) @app.route('/user/') -@login_required def user(username): user = User.query.filter_by(username=username.data).first_or_404() posts = [ From 3235283039ea7c34ad7a100833c488d86f377fba Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 24 May 2022 15:35:05 -0700 Subject: [PATCH 10/17] Possible malfunction between chair and keyboard. --- app/forms.py | 2 +- app/models.py | 7 +------ app/routes.py | 29 ++++++++++------------------- app/templates/500.html | 2 +- app/templates/base.html | 10 ++++++++++ app/templates/login.html | 5 +++++ 6 files changed, 28 insertions(+), 27 deletions(-) diff --git a/app/forms.py b/app/forms.py index 4afdde9..04391a9 100644 --- a/app/forms.py +++ b/app/forms.py @@ -25,4 +25,4 @@ def validate_usernames(self, username): def validate_email(self, email): user = User.query.filter_by(email=email.data).first() if user is not None: - raise ValidationError('This email address is already active.') \ No newline at end of file + raise ValidationError('This email address is already active.') diff --git a/app/models.py b/app/models.py index dd8a05a..ad764ea 100644 --- a/app/models.py +++ b/app/models.py @@ -34,15 +34,10 @@ def set_password(self, password): def check_password(self, password): return check_password_hash(self.password_hash, password) - - def avatar(self,size): - digest = md5(self.email.lower().encode('utf-8')).hexdigest() - return 'https://www.gravatar.com/avatar/{}?d=identicons&s={}'.format(digest, size) -@login.user_loader +@login.user_loaders def load_user(id): return User.query.get(int(id)) - class Coin(db.Model): __tablename__ = "coin" id = db.Column(db.Integer, primary_key=True) diff --git a/app/routes.py b/app/routes.py index eb65d23..3f6b7cf 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,10 +1,9 @@ from flask import render_template, flash, redirect, url_for, request -from app import app,db +from app import app, db from app.forms import LoginForm, RegistrationForm from flask_login import current_user, login_user, logout_user, login_required -from werkzeug.urls import url_parse from app.models import User - +from werkzeug.urls import url_parse @app.route("/") @app.route("/index") @@ -22,11 +21,11 @@ def index(): @app.route("/login", methods=["GET", "POST"]) def login(): - if current_user.is_authenticated: + if current_user.is_authenticated(): return redirect(url_for('index')) - form=LoginForm() + form = LoginForm() if form.validate_on_submit(): - user=User.query.filter_by(username=form.username.data).first() + user = User.query.filter_by(username=form.username.data).first() if user is None or not user.check_password(form.password.data): flash('Invalid username or password') return redirect(url_for('login')) @@ -34,12 +33,12 @@ def login(): next_page = request.args.get('next') if not next_page or url_parse(next_page).netloc !='': next_page = url_for('index') - return redirect(url_for('index')) - return render_template('login.html', title='Sign In', form=form) + return redirect(next_page) + return render_template("login.html", title="Log In", form=form) -@app.route('/logout') +@app.route("/logout") def logout(): - logout_user() + logout_user return redirect(url_for('index')) @@ -53,14 +52,6 @@ def register(): user.set_password(form.password.data) db.session.add(user) db.session.commit() - flash('WELCOME! YOU GOT CRYPTO!') + flash('CONGRATS! Welcome to the Crypto Sea! X marks the spot!') return redirect(url_for('login')) return render_template('register.html', title='Register', form=form) - -@app.route('/user/') -def user(username): - user = User.query.filter_by(username=username.data).first_or_404() - posts = [ - {'author': user, 'body': 'Test post #1'}, - ] - return render_template('user.html', user=user, posts=posts) diff --git a/app/templates/500.html b/app/templates/500.html index 7c99306..c79acf4 100644 --- a/app/templates/500.html +++ b/app/templates/500.html @@ -2,7 +2,7 @@ {% block content %}

    An unexpected error has occurred

    -

    The administrator has been notified. Sorry for the inconvenience!

    +

    An administrator has been bribed with coffee and will fix it soon.

    Back

    {% endblock %} \ No newline at end of file diff --git a/app/templates/base.html b/app/templates/base.html index dfaea33..2903334 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -16,6 +16,7 @@
  • Home
  • diff --git a/app/templates/login.html b/app/templates/login.html index a552b4b..a25d5b1 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -24,6 +24,11 @@

    Log In

    {{ form.remember_me() }} {{ form.remember_me.label }}

    {{ form.submit() }}

    +<<<<<<< Updated upstream

    New User? Click to Register!

    +======= +

    New User? Click to Register!

    + +>>>>>>> Stashed changes {% endblock %} \ No newline at end of file From d179368d1ff8815517bc4605d431f4ab3fdf0bf0 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 24 May 2022 15:36:16 -0700 Subject: [PATCH 11/17] Maybe? --- ppp-project-2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppp-project-2 b/ppp-project-2 index 654332a..439886e 160000 --- a/ppp-project-2 +++ b/ppp-project-2 @@ -1 +1 @@ -Subproject commit 654332abe2934485844bedf5635124d0858561df +Subproject commit 439886eb7959afcee194a4d239831010bf739330 From bb8c4beb8edccd19d938e1070d85c382a9ee6429 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 24 May 2022 15:53:09 -0700 Subject: [PATCH 12/17] removed a letter XD --- app/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models.py b/app/models.py index ad764ea..e88f90d 100644 --- a/app/models.py +++ b/app/models.py @@ -35,7 +35,7 @@ def set_password(self, password): def check_password(self, password): return check_password_hash(self.password_hash, password) -@login.user_loaders +@login.user_loader def load_user(id): return User.query.get(int(id)) class Coin(db.Model): From 4f1b65a1bd9cc6114240017f68160acc30c1d6d0 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 24 May 2022 15:59:59 -0700 Subject: [PATCH 13/17] Did absolutely nothing of note this time --- app/templates/base.html | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/templates/base.html b/app/templates/base.html index 2903334..dfaea33 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -16,7 +16,6 @@
  • Home
  • From dc413e7fd20369962fdad9ce760a3dfd5600d3f6 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 24 May 2022 18:55:56 -0700 Subject: [PATCH 14/17] *insert meme here* --- app/routes.py | 2 +- app/templates/index.html | 16 ++++++++-------- app/templates/login.html | 5 ----- ppp-project-2 | 1 - 4 files changed, 9 insertions(+), 15 deletions(-) delete mode 160000 ppp-project-2 diff --git a/app/routes.py b/app/routes.py index 3f6b7cf..d4c81ce 100644 --- a/app/routes.py +++ b/app/routes.py @@ -21,7 +21,7 @@ def index(): @app.route("/login", methods=["GET", "POST"]) def login(): - if current_user.is_authenticated(): + if current_user.is_authenticated: return redirect(url_for('index')) form = LoginForm() if form.validate_on_submit(): diff --git a/app/templates/index.html b/app/templates/index.html index 42f9a6f..e029015 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -1,12 +1,12 @@ {% extends "base.html" %} {% block content %} -
    -

    Hi, {{ user.username }}!

    -
    - {% for post in posts %} -
    -

    {{ post.author.username }} says: {{ post.body }}

    -
    - {% endfor %} +
    +

    Hi, {{ user.username }}!

    +
    + {% for post in posts %} +
    +

    {{ post.author.username }} says: {{ post.body }}

    +
    + {% endfor %} {% endblock %} \ No newline at end of file diff --git a/app/templates/login.html b/app/templates/login.html index a25d5b1..a552b4b 100644 --- a/app/templates/login.html +++ b/app/templates/login.html @@ -24,11 +24,6 @@

    Log In

    {{ form.remember_me() }} {{ form.remember_me.label }}

    {{ form.submit() }}

    -<<<<<<< Updated upstream

    New User? Click to Register!

    -======= -

    New User? Click to Register!

    - ->>>>>>> Stashed changes {% endblock %} \ No newline at end of file diff --git a/ppp-project-2 b/ppp-project-2 deleted file mode 160000 index 439886e..0000000 --- a/ppp-project-2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 439886eb7959afcee194a4d239831010bf739330 From 856be882cf7bc9c554994e8495ff7bf9a453f201 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 24 May 2022 18:59:58 -0700 Subject: [PATCH 15/17] And the plot thickens.... --- app/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/__init__.py b/app/__init__.py index f5e984e..f1cc87f 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,6 +3,7 @@ from config import Config from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate +from flask import LoginManager # Construct core Flask application with embedded Dash app. app = Flask(__name__, instance_relative_config=False) From ae6077d4d646322a37c60e7fbdcbbfaeccf5a755 Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Tue, 24 May 2022 19:05:48 -0700 Subject: [PATCH 16/17] *summons coffee* --- app/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/__init__.py b/app/__init__.py index f1cc87f..dc71a95 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,7 +3,7 @@ from config import Config from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate -from flask import LoginManager +from flask_login import LoginManager # Construct core Flask application with embedded Dash app. app = Flask(__name__, instance_relative_config=False) From 1a0c5f8fe089abb55639aeb3cf45760cb5409e5c Mon Sep 17 00:00:00 2001 From: CloudF1sh <61166522+CloudF1sh@users.noreply.github.com> Date: Mon, 30 May 2022 13:01:21 -0700 Subject: [PATCH 17/17] Removed login requirements again, still unable to connect via localhost [WinError 10061]. --- app/routes.py | 1 - app/templates/base.html | 3 --- 2 files changed, 4 deletions(-) diff --git a/app/routes.py b/app/routes.py index d4c81ce..d933a24 100644 --- a/app/routes.py +++ b/app/routes.py @@ -7,7 +7,6 @@ @app.route("/") @app.route("/index") -@login_required def index(): user = {"username": "Fellow Pyrates"} posts = [ diff --git a/app/templates/base.html b/app/templates/base.html index dfaea33..626efe8 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -17,13 +17,10 @@