app.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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("/login", methods=["GET", "POST"])
  17. def login():
  18. """Handle login page and data"""
  19. if request.method == 'POST':
  20. email = request.form['email']
  21. password = request.form['password']
  22. user = User.query.filter(User.email == email).first()
  23. if user is not None:
  24. if user.check_password(password):
  25. login_user(user, remember=True)
  26. flash('You were successfully logged in.', 'success')
  27. if request.args.get("next") is not None:
  28. return redirect(request.args.get("next"))
  29. return redirect(url_for('backend.index'))
  30. flash('Incorrect password.', 'danger')
  31. else:
  32. flash('User not found.', 'danger')
  33. return redirect(url_for('backend.login'))
  34. return render_template('user/login.j2')
  35. @BLUEPRINT.route("/register", methods=["POST"])
  36. def register():
  37. """Register a new user"""
  38. name = request.form['name'] if 'name' in request.form else None
  39. email = request.form['email'] if 'email' in request.form else None
  40. password = request.form['password'] if 'email' in request.form else None
  41. if name is None:
  42. flash('Fill in the name.', 'warning')
  43. return render_template('user/login.j2')
  44. if email is None:
  45. flash('Fill in the email.', 'warning')
  46. return render_template(
  47. 'user/login.j2',
  48. name=name
  49. )
  50. if password is None:
  51. flash('Fill in the password.', 'warning')
  52. return render_template(
  53. 'user/login.j2',
  54. name=name,
  55. email=email
  56. )
  57. user = User.query.filter(User.email == email).first()
  58. if user is not None:
  59. flash('Email already taken.', 'warning')
  60. return render_template(
  61. 'user/login.j2',
  62. name=name,
  63. )
  64. user = User()
  65. user.name = name
  66. user.email = email
  67. user.password = password
  68. db.session.add(user)
  69. db.session.commit()
  70. login_user(user, remember=True)
  71. flash('Successfully registered account "%s".' % (user.name), 'success')
  72. if request.args.get("next") is not None:
  73. return redirect(request.args.get("next"))
  74. return redirect(url_for('backend.index'))
  75. @BLUEPRINT.route("/logout")
  76. @login_required
  77. def logout():
  78. """Logout function for users"""
  79. logout_user()
  80. flash('Successfully logged out.', 'success')
  81. return redirect(url_for('backend.login'))
  82. @BLUEPRINT.route('/')
  83. @register_menu(BLUEPRINT, 'index', 'Home')
  84. @login_required
  85. def index():
  86. """Show homepage"""
  87. pages = Page.query.filter(Page.parent_id == None).all()
  88. return render_template('site/index.j2', pages=pages)
  89. @BLUEPRINT.route('/page/create', methods=["GET", "POST"])
  90. @register_menu(BLUEPRINT, 'page_create', 'Create page')
  91. @login_required
  92. def create_page():
  93. """Page creating"""
  94. pages = Page.query.all()
  95. if request.method == 'POST':
  96. page = Page()
  97. page.title = request.form['title']
  98. page.source = request.form['source']
  99. page.user_id = current_user.id
  100. page.parent_id = request.form['parent_id'] if request.form['parent_id'] else None
  101. db.session.add(page)
  102. db.session.commit()
  103. flash('Page "%s" successfully created' % page.title, 'success')
  104. return render_template('page/create.j2', pages=pages)
  105. @BLUEPRINT.route('/page/edit/<int:page_id>', methods=["GET", "POST"])
  106. @login_required
  107. def edit_page(page_id):
  108. """Page editing"""
  109. page = Page.query.get(page_id)
  110. pages = Page.query.filter(Page.id != page.id).all()
  111. if request.method == 'POST':
  112. page.title = request.form['title']
  113. page.source = request.form['source']
  114. page.parent_id = request.form['parent_id'] if request.form['parent_id'] else None
  115. page.user_id = current_user.id
  116. db.session.add(page)
  117. db.session.commit()
  118. flash('Page "%s" successfully edit' % page.title, 'success')
  119. return render_template(
  120. 'page/edit.j2',
  121. page=page,
  122. pages=pages
  123. )
  124. @BLUEPRINT.route('/page/view/<int:page_id>')
  125. @login_required
  126. def view_page(page_id):
  127. """Display page"""
  128. page = Page.query.get(page_id)
  129. return render_template('page/view.j2', page=page)
  130. @BLUEPRINT.route('/render')
  131. @register_menu(BLUEPRINT, 'render', 'Render')
  132. @login_required
  133. def render():
  134. """Render pages to file"""
  135. pages = Page.query.filter(Page.parent_id == None).all()
  136. menu = []
  137. for page in pages:
  138. menu.append(generate_menu(page))
  139. path_base = 'app/modules/static/pages/'
  140. for page in pages:
  141. render_page(path_base, page, menu)
  142. flash('Successfully rendered pages.', 'success')
  143. return redirect(url_for('backend.index'))
  144. def generate_menu(page):
  145. """Generate menu based on pages"""
  146. menu_item = {}
  147. menu_item['title'] = page.title
  148. menu_item['url'] = page.path()
  149. if page.children.count():
  150. menu_item['children'] = []
  151. for child_page in page.children:
  152. menu_item['children'].append(generate_menu(child_page))
  153. return menu_item
  154. def render_page(path, page, menu):
  155. """Function for page generation, recursive"""
  156. path = path + page.url()
  157. if page.children.count():
  158. parent_path = path + '/'
  159. if not os.path.exists(parent_path):
  160. os.makedirs(parent_path)
  161. for child_page in page.children:
  162. render_page(parent_path, child_page, menu)
  163. with open('%s.html' % path, 'w') as file:
  164. rendered_page = render_template(
  165. 'public/site.j2',
  166. page=page,
  167. menu=menu
  168. )
  169. file.write(rendered_page)