app.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. if page.title != 'index':
  36. menu.append(generate_menu(page))
  37. path_base = 'app/modules/static/pages/'
  38. path_public = path_base + "public"
  39. path_private = path_base + "private"
  40. if os.path.exists(path_public):
  41. shutil.rmtree(path_public)
  42. os.makedirs(path_public)
  43. if os.path.exists(path_private):
  44. shutil.rmtree(path_private)
  45. os.makedirs(path_private)
  46. for page in pages:
  47. render_page(path_base, page, menu)
  48. flash('Successfully rendered pages.', 'success')
  49. return redirect(request.referrer, code=302)
  50. def generate_menu(page):
  51. """Generate menu based on pages"""
  52. menu_item = {}
  53. menu_item['title'] = page.title
  54. menu_item['url'] = page.path()
  55. if page.children.count():
  56. menu_item['children'] = []
  57. for child_page in page.children:
  58. menu_item['children'].append(generate_menu(child_page))
  59. return menu_item
  60. def render_page(path, page, menu):
  61. """Function for page generation, recursive"""
  62. if not page.private and not page.parent_id:
  63. path += 'public/' + page.url()
  64. else:
  65. path += page.url()
  66. if page.children.count():
  67. parent_path = path + '/'
  68. if not os.path.exists(parent_path):
  69. os.makedirs(parent_path)
  70. for child_page in page.children:
  71. render_page(parent_path, child_page, menu)
  72. with open('%s.html' % path, 'w') as file:
  73. rendered_page = render_template(
  74. 'public/site.j2',
  75. page=page,
  76. menu=menu
  77. )
  78. file.write(rendered_page)