app.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. """
  2. Backend
  3. """
  4. import os
  5. from flask_login import login_required
  6. from flask_menu import register_menu
  7. from flask import render_template, request, redirect, url_for, flash, Blueprint
  8. from app.models import Page
  9. BLUEPRINT = Blueprint(
  10. 'backend',
  11. __name__,
  12. template_folder='templates'
  13. )
  14. @BLUEPRINT.route('/')
  15. @register_menu(BLUEPRINT, 'index', 'Home')
  16. @login_required
  17. def index():
  18. """Show homepage"""
  19. pages = Page.query.filter(Page.parent_id == None).all()
  20. return render_template('site/index.j2', pages=pages)
  21. @BLUEPRINT.route('/render')
  22. @register_menu(BLUEPRINT, 'render', 'Render')
  23. @login_required
  24. def render():
  25. """Render pages to file"""
  26. pages = Page.query.filter(Page.parent_id == None).all()
  27. menu = []
  28. for page in pages:
  29. menu.append(generate_menu(page))
  30. path_base = 'app/modules/static/pages/'
  31. for page in pages:
  32. render_page(path_base, page, menu)
  33. flash('Successfully rendered pages.', 'success')
  34. return redirect(request.referrer, code=302)
  35. def generate_menu(page):
  36. """Generate menu based on pages"""
  37. menu_item = {}
  38. menu_item['title'] = page.title
  39. menu_item['url'] = page.path()
  40. if page.children.count():
  41. menu_item['children'] = []
  42. for child_page in page.children:
  43. menu_item['children'].append(generate_menu(child_page))
  44. return menu_item
  45. def render_page(path, page, menu):
  46. """Function for page generation, recursive"""
  47. path = path + page.url()
  48. if page.children.count():
  49. parent_path = path + '/'
  50. if not os.path.exists(parent_path):
  51. os.makedirs(parent_path)
  52. for child_page in page.children:
  53. render_page(parent_path, child_page, menu)
  54. with open('%s.html' % path, 'w') as file:
  55. rendered_page = render_template(
  56. 'public/site.j2',
  57. page=page,
  58. menu=menu
  59. )
  60. file.write(rendered_page)