From 3cc7e46aaf0b7dd4c0fbb013a419005991318eee Mon Sep 17 00:00:00 2001 From: Xevion Date: Tue, 2 Jul 2019 14:10:11 -0500 Subject: [PATCH] added sign-up, tweaked jinja macro flashes and message display --- app/__init__.py | 3 +- app/forms.py | 22 +++++- app/routes.py | 35 ++++++---- app/static/script.js | 50 ++++++++------ app/templates/base.html | 70 ++++++++++++++++---- app/templates/hidden.html | 2 +- app/templates/login.html | 23 +++---- app/templates/{signup.html => register.html} | 50 ++++++++++---- 8 files changed, 177 insertions(+), 78 deletions(-) rename app/templates/{signup.html => register.html} (60%) diff --git a/app/__init__.py b/app/__init__.py index 71b02a7..e7b2379 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -15,4 +15,5 @@ login.login_view = 'login' db = SQLAlchemy(app) migrate = Migrate(app, db) -from app import routes, models \ No newline at end of file +from app import routes, models +app.jinja_env.globals.update(get_hidden=routes.get_hidden) \ No newline at end of file diff --git a/app/forms.py b/app/forms.py index 91ea3d1..8432cac 100644 --- a/app/forms.py +++ b/app/forms.py @@ -1,9 +1,27 @@ from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField -from wtforms.validators import DataRequired +from wtforms.validators import ValidationError, DataRequired, EqualTo, Email +from app.models import User class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) password = PasswordField('Password', validators=[DataRequired()]) remember_me = BooleanField('Remember Me') - submit = SubmitField('Sign in') \ No newline at end of file + submit = SubmitField('Sign 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_username(self, username): + user = User.query.filter_by(username=username.data).first() + if user is not None: + raise ValidationError('That username is not available.') + + def validate_email(self, email): + user = User.query.filter_by(email=email.data).first() + if user is not None: + raise ValidationError('That email address is not available.') \ No newline at end of file diff --git a/app/routes.py b/app/routes.py index 05c1efc..d7e9cbb 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,6 +1,6 @@ -from app import app +from app import app, db from app.models import User -from app.forms import LoginForm +from app.forms import LoginForm, RegistrationForm from werkzeug.urls import url_parse from flask import render_template, redirect, url_for, flash, request, jsonify from flask_login import current_user, login_user, logout_user, login_required @@ -49,11 +49,19 @@ def index(): for _ in range(10)] return render_template('index.html', content=content) -@app.route('/signup') -@app.route('/sign-up') -def signup(): - return render_template('signup.html', title='Sign Up', hideSignup=True) - +@app.route('/register', methods=['GET', 'POST']) +def register(): + 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('Registered Successfully!', 'info') + return redirect(url_for('login')) + return render_template('register.html', title='Register', form=form, hideRegister=True) @app.route('/login', methods=['GET', 'POST']) def login(): @@ -63,14 +71,14 @@ def login(): if form.validate_on_submit(): 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') + flash('Invalid username or password', 'error') 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(next_page) - return render_template('login.html', title='Sign In', form=form, hideLogin=True) + return render_template('login.html', title='Login', form=form, hideLogin=True) @app.route('/logout') def logout(): @@ -95,6 +103,9 @@ def validate_id(id): val = str(app.config['HIDDEN_URL']).strip() return id == val +def get_hidden(): + return "/hidden{}/".format(app.config['HIDDEN_URL']) + @app.route('/hidden/help') @login_required def hidden_help(id): @@ -103,7 +114,7 @@ def hidden_help(id): else: return 'error: bad id' -@app.route('/hidden') +@app.route('/hidden/') @login_required def hidden(id): if not validate_id(id): @@ -124,7 +135,7 @@ def hidden(id): showfull = boolparse(request.args.get('showfull')) showtags = boolparse(request.args.get('showtags')) # Request, Parse & Build Data - data = trap(tags, page-1, count, base64, showfull) + data = build_data(tags, page-1, count, base64, showfull) # Handling for limiters if base64: if showfull: @@ -139,7 +150,7 @@ def base64ify(url): gelbooru_api_url = "https://gelbooru.com/index.php?page=dapi&s=post&q=index&tags={}&pid={}&limit={}" gelbooru_view_url = "https://gelbooru.com/index.php?page=post&s=view&id={}" -def trap(tags, page, count, base64, showfull): +def build_data(tags, page, count, base64, showfull): # URL Building & Request temp = gelbooru_api_url.format(tags, page, count) response = requests.get(temp).text diff --git a/app/static/script.js b/app/static/script.js index 5af30e4..dd8d949 100644 --- a/app/static/script.js +++ b/app/static/script.js @@ -1,23 +1,35 @@ -console.log('loaded') +console.log('Loaded'); +$('.delete').each(function (e) { + console.log('Each'); + $(this).click(function() { + $(this).parent().parent().fadeOut(); + console.log('Parent'); + }); +}); + +console.log('1'); +$('.delete').click(function () { + console.log('Received Click'); +}); // Close mobile & tablet menu on item click - $('.navbar-item').each(function (e) { - $(this).click(function () { - if ($('#navbar-burger-id').hasClass('is-active')) { - $('#navbar-burger-id').removeClass('is-active'); - $('#navbar-menu-id').removeClass('is-active'); - } - }); - }); +$('.navbar-item').each(function (e) { + $(this).click(function () { + if ($('#navbar-burger-id').hasClass('is-active')) { + $('#navbar-burger-id').removeClass('is-active'); + $('#navbar-menu-id').removeClass('is-active'); + } + }); +}); // Open or Close mobile & tablet menu - $('#navbar-burger-id').click(function () { - console.log("hit") - if ($('#navbar-burger-id').hasClass('is-active')) { - $('#navbar-burger-id').removeClass('is-active'); - $('#navbar-menu-id').removeClass('is-active'); - } else { - $('#navbar-burger-id').addClass('is-active'); - $('#navbar-menu-id').addClass('is-active'); - } - }); \ No newline at end of file +$('#navbar-burger-id').click(function () { + console.log("hit") + if ($('#navbar-burger-id').hasClass('is-active')) { + $('#navbar-burger-id').removeClass('is-active'); + $('#navbar-menu-id').removeClass('is-active'); + } else { + $('#navbar-burger-id').addClass('is-active'); + $('#navbar-menu-id').addClass('is-active'); + } +}); diff --git a/app/templates/base.html b/app/templates/base.html index 16d04c1..06dade6 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -1,3 +1,21 @@ +{# +Title = Title of the Message Box +Text = Text inside the Message Box +Color = Bulma Color Type of the Message Box +#} +{% macro flash(title, text, color) -%} +
+
+ + {{ title }} + +
+
+ {{ text }} +
+
+{%- endmacro %} + @@ -12,7 +30,8 @@ {% block head %} - + {% endblock head %} @@ -53,25 +77,43 @@