app.py 2.3 KB

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