Skip to content
Snippets Groups Projects
routes.py 5.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • from flask import abort, flash, redirect, render_template, request, url_for
    from flask_breadcrumbs import register_breadcrumb
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    from flask_login import current_user, login_user, login_required, logout_user
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    from app import db
    from app.email import create_message, send
    from app.models import User
    
    from .forms import (
        LoginForm,
        ResetPasswordForm,
        ResetPasswordRequestForm,
        RegistrationForm
    )
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    def before_request():
        """
        Checks if a user is unconfirmed when visiting specific sites. Redirects to
        unconfirmed view if user is unconfirmed.
        """
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            current_user.ping()
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            if (not current_user.confirmed
                    and request.endpoint
                    and request.blueprint != 'auth'
                    and request.endpoint != 'static'):
    
                return redirect(url_for('auth.unconfirmed'))
    
    @bp.route('/register', methods=['GET', 'POST'])
    
    @register_breadcrumb(bp, '.register', 'Register')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
        if current_user.is_authenticated:
    
            return redirect(url_for('main.dashboard'))
    
        form = RegistrationForm()
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
                user = User.create(
                    email=form.email.data.lower(),
                    password=form.password.data,
    
                    username=form.username.data,
                    terms_of_use_accepted=form.terms_of_use_accepted.data
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
                )
            except OSError:
    
                flash('Internal Server Error', category='error')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            flash(f'User "{user.username}" created')
            token = user.generate_confirm_token()
    
            msg = create_message(
                user.email,
                'Confirm Your Account',
                'auth/email/confirm',
                token=token,
                user=user
            )
            send(msg)
            flash('A confirmation email has been sent to you by email')
            db.session.commit()
            return redirect(url_for('.login'))
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            title='Register',
            form=form
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    @bp.route('/login', methods=['GET', 'POST'])
    
    @register_breadcrumb(bp, '.login', 'Login')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    def login():
        if current_user.is_authenticated:
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            return redirect(url_for('main.dashboard'))
    
        form = LoginForm()
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
        if form.validate_on_submit():
            user = User.query.filter((User.email == form.user.data.lower()) | (User.username == form.user.data)).first()
            if user and user.verify_password(form.password.data):
                login_user(user, form.remember_me.data)
                next = request.args.get('next')
                if next is None or not next.startswith('/'):
                    next = url_for('main.dashboard')
                flash('You have been logged in')
                return redirect(next)
            flash('Invalid email/username or password', category='error')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
        return render_template(
            'auth/login.html.j2',
            title='Log in',
            form=form
        )
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    
    
    @bp.route('/logout')
    @login_required
    def logout():
        logout_user()
        flash('You have been logged out')
        return redirect(url_for('main.index'))
    
    @register_breadcrumb(bp, '.unconfirmed', 'Unconfirmed')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    @login_required
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
        if current_user.confirmed:
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            return redirect(url_for('main.dashboard'))
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
        return render_template(
            'auth/unconfirmed.html.j2',
            title='Unconfirmed'
        )
    
    @bp.route('/confirm-request')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    def confirm_request():
        if current_user.confirmed:
            return redirect(url_for('main.dashboard'))
        token = current_user.generate_confirm_token()
    
        msg = create_message(
            current_user.email,
            'Confirm Your Account',
            'auth/email/confirm',
            token=token,
            user=current_user
        )
    
        flash('A new confirmation email has been sent to you by email')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
        return redirect(url_for('.unconfirmed'))
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    @bp.route('/confirm/<token>')
    @login_required
    def confirm(token):
        if current_user.confirmed:
            return redirect(url_for('main.dashboard'))
        if current_user.confirm(token):
            db.session.commit()
            flash('You have confirmed your account')
            return redirect(url_for('main.dashboard'))
        flash('The confirmation link is invalid or has expired', category='error')
        return redirect(url_for('.unconfirmed'))
    
    
    
    @bp.route('/reset-password-request', methods=['GET', 'POST'])
    
    @register_breadcrumb(bp, '.reset_password_request', 'Password Reset')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    def reset_password_request():
        if current_user.is_authenticated:
    
            return redirect(url_for('main.dashboard'))
    
        form = ResetPasswordRequestForm()
    
        if form.validate_on_submit():
            user = User.query.filter_by(email=form.email.data.lower()).first()
            if user is not None:
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
                token = user.generate_reset_password_token()
    
                msg = create_message(
                    user.email,
                    'Reset Your Password',
                    'auth/email/reset_password',
                    token=token,
                    user=user
                )
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
                'An email with instructions to reset your password has been sent '
                'to you'
    
        return render_template(
            'auth/reset_password_request.html.j2',
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            title='Password Reset',
            form=form
    
    @bp.route('/reset-password/<token>', methods=['GET', 'POST'])
    
    @register_breadcrumb(bp, '.reset_password', 'Password Reset')
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
    def reset_password(token):
        if current_user.is_authenticated:
    
            return redirect(url_for('main.dashboard'))
    
        form = ResetPasswordForm()
    
        if form.validate_on_submit():
            if User.reset_password(token, form.password.data):
    
                db.session.commit()
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            return redirect(url_for('main.index'))
    
        return render_template(
            'auth/reset_password.html.j2',
            title='Password Reset',
    
    Patrick Jentsch's avatar
    Patrick Jentsch committed
            form=form,