app.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. if not page.private and not page.parent_id:
  53. path += 'public/' + page.url()
  54. else:
  55. path += page.url()
  56. if page.children.count():
  57. parent_path = path + '/'
  58. if not os.path.exists(parent_path):
  59. os.makedirs(parent_path)
  60. for child_page in page.children:
  61. render_page(parent_path, child_page, menu)
  62. with open('%s.html' % path, 'w') as file:
  63. rendered_page = render_template(
  64. 'public/site.j2',
  65. page=page,
  66. menu=menu
  67. )
  68. file.write(rendered_page)