app.py 2.2 KB

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