app.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. """
  2. Backend
  3. """
  4. import os
  5. from urllib.parse import quote
  6. from flask_login import login_required, current_user
  7. from flask_menu import register_menu
  8. from flask import render_template, request, redirect, url_for, flash, Blueprint
  9. from werkzeug.utils import secure_filename
  10. from app import app, db
  11. from app.models import File
  12. BLUEPRINT = Blueprint(
  13. 'backend_file',
  14. __name__,
  15. template_folder='templates'
  16. )
  17. def allowed_file(filename):
  18. allowed_extensions = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'docx'])
  19. return '.' in filename and \
  20. filename.rsplit('.', 1)[1].lower() in allowed_extensions
  21. @BLUEPRINT.route('/upload', methods=["GET", "POST"])
  22. @register_menu(BLUEPRINT, 'upload_file', 'Upload file')
  23. @login_required
  24. def create():
  25. """File creating"""
  26. if request.method == 'POST':
  27. if 'file' not in request.files:
  28. flash('No file part', 'warning')
  29. return redirect(request.url)
  30. file = request.files['file']
  31. if file.filename == '':
  32. flash('No file selected', 'warning')
  33. return redirect(request.url)
  34. if file and allowed_file(file.filename):
  35. filename = file.filename
  36. if request.form['title']:
  37. title = request.form['title']
  38. url = quote(title.strip().lower().replace(" ", "_"))
  39. filename = secure_filename('%s.%s' % (url, filename.rsplit('.', 1)[1]))
  40. else:
  41. title = filename.rsplit('.', 1)[0]
  42. file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
  43. db_file = File()
  44. db_file.title = title
  45. db_file.user_id = current_user.id
  46. db_file.path = filename
  47. db.session.add(db_file)
  48. db.session.commit()
  49. flash('File "%s" successfully uploaded' % db_file.title, 'success')
  50. return redirect(url_for('backend_file.view', file_id=db_file.id))
  51. return render_template('file/create.j2')
  52. @BLUEPRINT.route('/edit/<int:file_id>', methods=["GET", "POST"])
  53. @login_required
  54. def edit(file_id):
  55. """File editing"""
  56. db_file = File.query.get(file_id)
  57. if request.method == 'POST':
  58. file = None
  59. if 'file' in request.files:
  60. file = request.files['file']
  61. if file.filename == '':
  62. flash('No file selected', 'warning')
  63. return redirect(request.url)
  64. if file and allowed_file(file.filename):
  65. filename = secure_filename(file.filename)
  66. file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
  67. filename = db_file.path
  68. if file is not None:
  69. db_file.path = file.filename
  70. if request.form['title']:
  71. title = request.form['title']
  72. url = quote(title.strip().lower().replace(" ", "_"))
  73. db_file.path = secure_filename('%s.%s' % (url, db_file.path.rsplit('.', 1)[1]))
  74. os.rename(os.path.join(app.config['UPLOAD_FOLDER'], filename), os.path.join(app.config['UPLOAD_FOLDER'], db_file.path))
  75. db_file.title = title
  76. db_file.user_id = current_user.id
  77. db.session.add(db_file)
  78. db.session.commit()
  79. flash('File "%s" successfully edit' % db_file.title, 'success')
  80. return render_template(
  81. 'file/edit.j2',
  82. file=db_file,
  83. )
  84. @BLUEPRINT.route('/remove/<int:file_id>')
  85. @login_required
  86. def remove(file_id):
  87. """File removing"""
  88. file = File.query.get(file_id)
  89. db.session.delete(file)
  90. db.session.commit()
  91. flash('File "%s" successfully remove' % file.title, 'success')
  92. return redirect(url_for('backend.index'))
  93. @BLUEPRINT.route('/view/<int:file_id>')
  94. @login_required
  95. def view(file_id):
  96. """Display file"""
  97. file = File.query.get(file_id)
  98. return render_template('file/view.j2', file=file)