app.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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, File
  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.all()
  20. files = File.query.all()
  21. return render_template(
  22. 'site/index.j2',
  23. pages=pages,
  24. files=files
  25. )
  26. @BLUEPRINT.route('/render')
  27. @register_menu(BLUEPRINT, 'render', 'Render')
  28. @login_required
  29. def render():
  30. """Render pages to file"""
  31. pages = Page.query.filter(Page.parent_id == None).all()
  32. menu = []
  33. for page in pages:
  34. menu.append(generate_menu(page))
  35. path_base = 'app/modules/static/pages/'
  36. for page in pages:
  37. render_page(path_base, page, menu)
  38. flash('Successfully rendered pages.', 'success')
  39. return redirect(request.referrer, code=302)
  40. def generate_menu(page):
  41. """Generate menu based on pages"""
  42. menu_item = {}
  43. menu_item['title'] = page.title
  44. menu_item['url'] = page.path()
  45. if page.children.count():
  46. menu_item['children'] = []
  47. for child_page in page.children:
  48. menu_item['children'].append(generate_menu(child_page))
  49. return menu_item
  50. def render_page(path, page, menu):
  51. """Function for page generation, recursive"""
  52. path = path + page.url()
  53. if page.children.count():
  54. parent_path = path + '/'
  55. if not os.path.exists(parent_path):
  56. os.makedirs(parent_path)
  57. for child_page in page.children:
  58. render_page(parent_path, child_page, menu)
  59. with open('%s.html' % path, 'w') as file:
  60. rendered_page = render_template(
  61. 'public/site.j2',
  62. page=page,
  63. menu=menu
  64. )
  65. file.write(rendered_page)