| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 | 
"""Backend"""import osfrom flask_login import login_required, login_user, logout_user, current_userfrom flask_menu import Menu, register_menufrom flask import render_template, request, redirect, url_for, flash, Blueprint, abort, jsonifyfrom jinja2 import TemplateNotFoundfrom app import app, login_manager, dbfrom app.models import User, PageBLUEPRINT = Blueprint(    'backend',    __name__,    template_folder='templates')@BLUEPRINT.route("/login", methods=["GET", "POST"])def login():    """Handle login page and data"""    if request.method == 'POST':        email = request.form['email']        password = request.form['password']        user = User.query.filter(User.email == email).first()        if user is not None:            if user.check_password(password):                login_user(user, remember=True)                flash('You were successfully logged in.', 'success')                if request.args.get("next") is not None:                    return redirect(request.args.get("next"))                return redirect(url_for('backend.index'))            flash('Incorrect password.', 'danger')        else:            flash('User not found.', 'danger')        return redirect(url_for('backend.login'))    return render_template('user/login.j2')@BLUEPRINT.route("/register", methods=["POST"])def register():    """Register a new user"""    name = request.form['name'] if 'name' in request.form else None    email = request.form['email'] if 'email' in request.form else None    password = request.form['password'] if 'email' in request.form else None    if name is None:        flash('Fill in the name.', 'warning')        return render_template('user/login.j2')    if email is None:        flash('Fill in the email.', 'warning')        return render_template(            'user/login.j2',            name=name        )    if password is None:        flash('Fill in the password.', 'warning')        return render_template(            'user/login.j2',            name=name,            email=email        )    user = User.query.filter(User.email == email).first()    if user is not None:        flash('Email already taken.', 'warning')        return render_template(            'user/login.j2',            name=name,        )    user = User()    user.name = name    user.email = email    user.password = password    db.session.add(user)    db.session.commit()    login_user(user, remember=True)    flash('Successfully registered account "%s".' % (user.name), 'success')    if request.args.get("next") is not None:        return redirect(request.args.get("next"))    return redirect(url_for('backend.index'))@BLUEPRINT.route("/logout")@login_requireddef logout():    """Logout function for users"""    logout_user()    flash('Successfully logged out.', 'success')    return redirect(url_for('backend.login'))@BLUEPRINT.route('/')@register_menu(BLUEPRINT, 'index', 'Home')@login_requireddef index():    """Show homepage"""    pages = Page.query.filter(Page.parent_id == None).all()    return render_template('site/index.j2', pages=pages)@BLUEPRINT.route('/page/create', methods=["GET", "POST"])@register_menu(BLUEPRINT, 'page_create', 'Create page')@login_requireddef create_page():    """Page creating"""    pages = Page.query.all()    if request.method == 'POST':        page = Page()        page.title = request.form['title']        page.source = request.form['source']        page.user_id = current_user.id        page.parent_id = request.form['parent_id'] if request.form['parent_id'] else None        db.session.add(page)        db.session.commit()        flash('Page "%s" successfully created' % page.title, 'success')    return render_template('page/create.j2', pages=pages)@BLUEPRINT.route('/page/edit/<int:page_id>', methods=["GET", "POST"])@login_requireddef edit_page(page_id):    """Page editing"""    page = Page.query.get(page_id)    pages = Page.query.filter(Page.id != page.id).all()    if request.method == 'POST':        page.title = request.form['title']        page.source = request.form['source']        page.parent_id = request.form['parent_id'] if request.form['parent_id'] else None        page.user_id = current_user.id        db.session.add(page)        db.session.commit()        flash('Page "%s" successfully edit' % page.title, 'success')    return render_template(        'page/edit.j2',        page=page,        pages=pages    )@BLUEPRINT.route('/page/remove/<int:page_id>')@login_requireddef remove_page(page_id):    """Page removing"""    page = Page.query.get(page_id)    db.session.delete(page)    db.session.commit()    flash('Page "%s" successfully remove' % page.title, 'success')    return redirect(url_for('backend.index'))@BLUEPRINT.route('/page/view/<int:page_id>')@login_requireddef view_page(page_id):    """Display page"""    page = Page.query.get(page_id)    return render_template('page/view.j2', page=page)@BLUEPRINT.route('/render')@register_menu(BLUEPRINT, 'render', 'Render')@login_requireddef render():    """Render pages to file"""    pages = Page.query.filter(Page.parent_id == None).all()    menu = []    for page in pages:        menu.append(generate_menu(page))    path_base = 'app/modules/static/pages/'    for page in pages:        render_page(path_base, page, menu)    flash('Successfully rendered pages.', 'success')    return redirect(url_for('backend.index'))def generate_menu(page):    """Generate menu based on pages"""    menu_item = {}    menu_item['title'] = page.title    menu_item['url'] = page.path()    if page.children.count():        menu_item['children'] = []        for child_page in page.children:            menu_item['children'].append(generate_menu(child_page))    return menu_itemdef render_page(path, page, menu):    """Function for page generation, recursive"""    path = path + page.url()    if page.children.count():        parent_path = path + '/'        if not os.path.exists(parent_path):            os.makedirs(parent_path)        for child_page in page.children:            render_page(parent_path, child_page, menu)    with open('%s.html' % path, 'w') as file:        rendered_page = render_template(            'public/site.j2',            page=page,            menu=menu        )        file.write(rendered_page)
 |