app.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. """
  2. Backend
  3. """
  4. import os
  5. from flask_login import login_required, login_user, logout_user, current_user
  6. from flask_menu import Menu, register_menu
  7. from flask import render_template, request, redirect, url_for, flash, Blueprint, abort, jsonify
  8. from jinja2 import TemplateNotFound
  9. from app import app, login_manager, db
  10. from app.models import User, Page
  11. BLUEPRINT = Blueprint(
  12. 'backend',
  13. __name__,
  14. template_folder='templates'
  15. )
  16. @BLUEPRINT.route('/')
  17. @register_menu(BLUEPRINT, 'index', 'Home')
  18. @login_required
  19. def index():
  20. """Show homepage"""
  21. pages = Page.query.filter(Page.parent_id == None).all()
  22. return render_template('site/index.j2', pages=pages)
  23. @BLUEPRINT.route('/page/create', methods=["GET", "POST"])
  24. @register_menu(BLUEPRINT, 'page_create', 'Create page')
  25. @login_required
  26. def create_page():
  27. """Page creating"""
  28. pages = Page.query.all()
  29. if request.method == 'POST':
  30. page = Page()
  31. page.title = request.form['title']
  32. page.source = request.form['source']
  33. page.user_id = current_user.id
  34. page.parent_id = request.form['parent_id'] if request.form['parent_id'] else None
  35. db.session.add(page)
  36. db.session.commit()
  37. flash('Page "%s" successfully created' % page.title, 'success')
  38. return render_template('page/create.j2', pages=pages)
  39. @BLUEPRINT.route('/page/edit/<int:page_id>', methods=["GET", "POST"])
  40. @login_required
  41. def edit_page(page_id):
  42. """Page editing"""
  43. page = Page.query.get(page_id)
  44. pages = Page.query.filter(Page.id != page.id).all()
  45. if request.method == 'POST':
  46. page.title = request.form['title']
  47. page.source = request.form['source']
  48. page.parent_id = request.form['parent_id'] if request.form['parent_id'] else None
  49. page.user_id = current_user.id
  50. db.session.add(page)
  51. db.session.commit()
  52. flash('Page "%s" successfully edit' % page.title, 'success')
  53. return render_template(
  54. 'page/edit.j2',
  55. page=page,
  56. pages=pages
  57. )
  58. @BLUEPRINT.route('/page/remove/<int:page_id>')
  59. @login_required
  60. def remove_page(page_id):
  61. """Page removing"""
  62. page = Page.query.get(page_id)
  63. db.session.delete(page)
  64. db.session.commit()
  65. flash('Page "%s" successfully remove' % page.title, 'success')
  66. return redirect(url_for('backend.index'))
  67. @BLUEPRINT.route('/page/view/<int:page_id>')
  68. @login_required
  69. def view_page(page_id):
  70. """Display page"""
  71. page = Page.query.get(page_id)
  72. return render_template('page/view.j2', page=page)
  73. @BLUEPRINT.route('/render')
  74. @register_menu(BLUEPRINT, 'render', 'Render')
  75. @login_required
  76. def render():
  77. """Render pages to file"""
  78. pages = Page.query.filter(Page.parent_id == None).all()
  79. menu = []
  80. for page in pages:
  81. menu.append(generate_menu(page))
  82. path_base = 'app/modules/static/pages/'
  83. for page in pages:
  84. render_page(path_base, page, menu)
  85. flash('Successfully rendered pages.', 'success')
  86. return redirect(url_for('backend.index'))
  87. def generate_menu(page):
  88. """Generate menu based on pages"""
  89. menu_item = {}
  90. menu_item['title'] = page.title
  91. menu_item['url'] = page.path()
  92. if page.children.count():
  93. menu_item['children'] = []
  94. for child_page in page.children:
  95. menu_item['children'].append(generate_menu(child_page))
  96. return menu_item
  97. def render_page(path, page, menu):
  98. """Function for page generation, recursive"""
  99. path = path + page.url()
  100. if page.children.count():
  101. parent_path = path + '/'
  102. if not os.path.exists(parent_path):
  103. os.makedirs(parent_path)
  104. for child_page in page.children:
  105. render_page(parent_path, child_page, menu)
  106. with open('%s.html' % path, 'w') as file:
  107. rendered_page = render_template(
  108. 'public/site.j2',
  109. page=page,
  110. menu=menu
  111. )
  112. file.write(rendered_page)