app.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. """
  2. Backend
  3. """
  4. import os
  5. import shutil
  6. import json
  7. from flask_login import login_required
  8. from flask_menu import register_menu
  9. from flask import render_template, request, redirect, url_for, flash, Blueprint
  10. from app.models import Page, File, User
  11. BLUEPRINT = Blueprint(
  12. 'backend',
  13. __name__,
  14. template_folder='templates'
  15. )
  16. BASE_PATH = 'app/modules/static/pages/'
  17. @BLUEPRINT.route('/')
  18. @register_menu(BLUEPRINT, 'index', 'Home')
  19. @login_required
  20. def index():
  21. """Show homepage"""
  22. pages = Page.query.filter(Page.parent_id == None).all()
  23. files = File.query.all()
  24. users = User.query.all()
  25. return render_template(
  26. 'site/index.j2',
  27. pages=pages,
  28. files=files,
  29. users=users
  30. )
  31. @BLUEPRINT.route('/render')
  32. @register_menu(BLUEPRINT, 'render', 'Render')
  33. @login_required
  34. def render():
  35. """Render pages to file"""
  36. pages = Page.query.filter(Page.parent_id == None).all()
  37. menu = []
  38. for page in pages:
  39. if page.title != 'index':
  40. menu.append(generate_menu(page))
  41. print_json(menu)
  42. path_base = 'app/modules/static/pages/'
  43. path_public = path_base + "public"
  44. path_private = path_base + "private"
  45. if os.path.exists(path_public):
  46. shutil.rmtree(path_public)
  47. os.makedirs(path_public)
  48. if os.path.exists(path_private):
  49. shutil.rmtree(path_private)
  50. os.makedirs(path_private)
  51. for page in pages:
  52. generate_directory('', page)
  53. for page in pages:
  54. render_page('', page, menu)
  55. flash('Successfully rendered pages.', 'success')
  56. return redirect(request.referrer, code=302)
  57. def generate_menu(page):
  58. """Generate menu based on pages"""
  59. menu_item = {}
  60. menu_item['title'] = page.title
  61. menu_item['url'] = page.path()
  62. menu_item['private'] = page.private
  63. if page.children.count():
  64. menu_item['children'] = []
  65. for child_page in page.children:
  66. menu_item['children'].append(generate_menu(child_page))
  67. return menu_item
  68. def generate_directory(path, page):
  69. """Generate directories for pages"""
  70. if page.children.count():
  71. parent_path = path + page.url() + '/'
  72. print(parent_path)
  73. public_path = BASE_PATH + 'public/' + path + page.url()
  74. private_path = BASE_PATH + 'private/' + path + page.url()
  75. #print(public_path)
  76. #print(private_path)
  77. if not os.path.exists(public_path):
  78. os.makedirs(public_path)
  79. if not os.path.exists(private_path):
  80. os.makedirs(private_path)
  81. for child_page in page.children:
  82. generate_directory(parent_path, child_page)
  83. def render_page(path, page, menu):
  84. """Function for page generation, recursive"""
  85. if page.children.count():
  86. path += page.url() + '/'
  87. for child_page in page.children:
  88. render_page(path, child_page, menu)
  89. path += page.url()
  90. # private
  91. private_path = '%s%s/%s.html' % (BASE_PATH, 'private', path)
  92. with open(private_path, 'w') as file:
  93. rendered_page = render_template(
  94. 'public/private.j2',
  95. page=page,
  96. menu=menu
  97. )
  98. file.write(rendered_page)
  99. public_path = '%s%s/%s.html' % (BASE_PATH, 'public', path)
  100. with open(public_path, 'w') as file:
  101. rendered_page = render_template(
  102. 'public/public.j2',
  103. page=page,
  104. menu=menu
  105. )
  106. file.write(rendered_page)
  107. def print_json(json_text):
  108. """Print data to console"""
  109. print(json.dumps(json_text, sort_keys=True, indent=4))