| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | 
"""Backend"""import osimport shutilfrom flask_login import login_requiredfrom flask_menu import register_menufrom flask import render_template, request, redirect, url_for, flash, Blueprintfrom app.models import Page, File, UserBLUEPRINT = Blueprint(    'backend',    __name__,    template_folder='templates')BASE_PATH = 'app/modules/static/pages/'@BLUEPRINT.route('/')@register_menu(BLUEPRINT, 'index', 'Home')@login_requireddef index():    """Show homepage"""    pages = Page.query.filter(Page.parent_id == None).all()    files = File.query.all()    users = User.query.all()    return render_template(        'site/index.j2',        pages=pages,        files=files,        users=users    )@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:        if page.title != 'index':            menu.append(generate_menu(page))    path_base = 'app/modules/static/pages/'    path_public = path_base + "public"    path_private = path_base + "private"    if os.path.exists(path_public):        shutil.rmtree(path_public)    os.makedirs(path_public)    if os.path.exists(path_private):        shutil.rmtree(path_private)    os.makedirs(path_private)    for page in pages:        generate_directory('', page)    for page in pages:        render_page('', page, menu, False)    flash('Successfully rendered pages.', 'success')    return redirect(request.referrer, code=302)def generate_menu(page):    """Generate menu based on pages"""    menu_item = {}    menu_item['title'] = page.title    menu_item['url'] = page.path()    menu_item['private'] = page.private    if page.children.count():        menu_item['children'] = []        for child_page in page.children:            menu_item['children'].append(generate_menu(child_page))    return menu_itemdef generate_directory(path, page):    """Generate directories for pages"""    if page.children.count():        parent_path = path + page.url() + '/'        public_path = BASE_PATH + 'public/' + path + page.url()        private_path = BASE_PATH + 'private/' + path + page.url()        if not os.path.exists(public_path):            os.makedirs(public_path)        if not os.path.exists(private_path):            os.makedirs(private_path)        for child_page in page.children:            generate_directory(parent_path, child_page)def render_page(path, page, menu, private):    """Function for page generation, recursive"""    if page.private:        private = True    if page.children.count():        parent_path = path + page.url() + '/'        for child_page in page.children:            render_page(parent_path, child_page, menu, private)    path += page.url()    private_path = '%s%s/%s.html' % (BASE_PATH, 'private', path)    with open(private_path, 'w') as file:        rendered_page = render_template(            'public/private.j2',            page=page,            menu=menu        )        file.write(rendered_page)    if not private:        public_path = '%s%s/%s.html' % (BASE_PATH, 'public', path)        with open(public_path, 'w') as file:            rendered_page = render_template(                'public/public.j2',                page=page,                menu=menu            )            file.write(rendered_page)
 |