From 77c901f4f0d5e7e213bd7a7f1c3599e6ea6c716f Mon Sep 17 00:00:00 2001 From: Daniel Cortes Date: Tue, 12 Mar 2019 00:51:29 -0300 Subject: [PATCH] Added filetype support --- files/commands.py | 11 ++++++-- files/files.py | 40 ++++++++++++++++++++++----- files/models.py | 16 ++++++++++- files/templates/files/preview.html | 43 +++++++++++++++++++++++------- files/templates/files/upload.html | 6 +++++ 5 files changed, 97 insertions(+), 19 deletions(-) diff --git a/files/commands.py b/files/commands.py index dbd3f5a..b5d2c07 100644 --- a/files/commands.py +++ b/files/commands.py @@ -6,7 +6,7 @@ from flask.cli import with_appcontext from werkzeug.security import generate_password_hash -from files.models import db, User, Category, File +from files.models import db, User, Category, File, FileType def init_db(): @@ -25,19 +25,26 @@ def generate_admin(): def add_defaults(): default_category = Category('Default') + default_file_type = FileType('Default') + code_file_type = FileType('Code') + image_file_type = FileType('Image') db.session.add(default_category) + db.session.add(default_file_type) + db.session.add(code_file_type) + db.session.add(image_file_type) db.session.commit() def add_files(): existing_files = os.listdir(current_app.config['UPLOAD_FOLDER']) default_category = Category.query.filter_by(name='Default').first() + default_file_type = FileType.query.filter_by(name='Default').first() added = 0 for f in existing_files: search = File.query.filter_by(filename=f).first() if search is None: - file = File(f, 0, default_category.id) + file = File(f, 0, default_category.id, default_file_type.id) db.session.add(file) added += 1 db.session.commit() diff --git a/files/files.py b/files/files.py index 6c68fda..31f1f4c 100644 --- a/files/files.py +++ b/files/files.py @@ -5,7 +5,7 @@ from flask import Flask, Blueprint, flash, request, redirect, url_for, current_a from werkzeug.utils import secure_filename from werkzeug.exceptions import abort -from files.models import db, File, Category, User +from files.models import db, File, Category, User, FileType from files.auth import admin_required @@ -21,7 +21,7 @@ def _get_path_in_upload(filename): return os.path.join(current_app.config['UPLOAD_FOLDER'], filename) -def _save_file(file, private, category): +def _save_file(file, private, category, file_type): if private is None: is_private = 0 else: @@ -30,7 +30,7 @@ def _save_file(file, private, category): filename = secure_filename(file.filename) file.save(_get_path_in_upload(filename)) - f = File(filename, is_private, category.id) + f = File(filename, is_private, category.id, file_type.id) db.session.add(f) db.session.commit() @@ -85,23 +85,33 @@ def upload_file(): flash('The category selected won\'t exists') return redirect(request.url) + if 'file_type' not in request.form: + flash('No file type selected') + return redirect(request.url) + + file_type = FileType.query.get(request.form['file_type']) + if file_type is None: + flash('The file type selected won\'t exists') + return redirect(request.url) + if file.filename == '': flash('No seleted file') return redirect(request.url) if file: - _save_file(file, private, category) + _save_file(file, private, category, file_type) return redirect(url_for('files.index')) - return render_template('files/upload.html', categories=Category.query.all()) + return render_template('files/upload.html', categories=Category.query.all(), file_types=FileType.query.all()) @bp.route('/preview/') def preview_file(id): file = File.query.get(id) categories = Category.query.all() + file_types = FileType.query.all() if (file.private == 1 and g.user is not None) or (file.private == 0): - return render_template('files/preview.html', file=file, categories=categories) + return render_template('files/preview.html', file=file, categories=categories, file_types=file_types) else: return abort(404) @@ -144,6 +154,24 @@ def recategorize(id): return redirect(url_for('files.preview_file', id=file.id)) +@bp.route('/retype/', methods=['POST']) +@admin_required +def retype(id): + file = File.query.get(id) + + if 'new_type' not in request.form: + flash('No type selected') + return redirect(request.url) + + new_type = FileType.query.get(request.form['new_type']) + if new_type is None: + flash('The file type selected won\'t exists') + return redirect(request.url) + + file.file_type_id= new_type.id + db.session.commit() + + return redirect(url_for('files.preview_file', id=file.id)) @bp.route('/delete/', methods=['POST']) @admin_required diff --git a/files/models.py b/files/models.py index a17f55d..d4c1a56 100644 --- a/files/models.py +++ b/files/models.py @@ -41,11 +41,13 @@ class File(db.Model): filename = db.Column(db.String, nullable=False) private = db.Column(db.Integer, nullable=False) category_id = db.Column(db.Integer, db.ForeignKey('categories.id'), nullable=False) + file_type_id = db.Column(db.Integer, db.ForeignKey('file_types.id'), nullable=False) - def __init__(self, filename=None, private=None, category_id=None): + def __init__(self, filename=None, private=None, category_id=None, file_type_id=None): self.filename = filename self.private = private self.category_id = category_id + self.file_type_id = file_type_id def __repr__(self): return f'' @@ -62,3 +64,15 @@ class Category(db.Model): def __repr__(self): return f'' + +class FileType(db.Model): + __tablename__ = 'file_types' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String, nullable=False) + files = db.relationship('File', backref='type', lazy=True) + + def __init__(self, name=None): + self.name = name + + def __repr__(self): + return f'' diff --git a/files/templates/files/preview.html b/files/templates/files/preview.html index b9c41ea..3a928b6 100644 --- a/files/templates/files/preview.html +++ b/files/templates/files/preview.html @@ -10,11 +10,15 @@ + {% if file.type.name == 'Image' %} + {% elif file.type.name == 'Code' %} +
{{file.filename}}
+ {% endif %} {% if g.user %}
@@ -28,17 +32,36 @@
+
- -
- +
+ +
+ +
+
+ +
-
- + + +
+
+ +
+ +
+
+ +
{% endif %} diff --git a/files/templates/files/upload.html b/files/templates/files/upload.html index b8e9dd4..0c42890 100644 --- a/files/templates/files/upload.html +++ b/files/templates/files/upload.html @@ -14,6 +14,12 @@ {% endfor %} + +