Added filetype support

This commit is contained in:
Daniel Cortes
2019-03-12 00:51:29 -03:00
parent f12fe5b46d
commit 77c901f4f0
5 changed files with 97 additions and 19 deletions

View File

@@ -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()

View File

@@ -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/<int:id>')
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/<int:id>', 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/<int:id>', methods=['POST'])
@admin_required

View File

@@ -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'<File name:{self.filename}>'
@@ -62,3 +64,15 @@ class Category(db.Model):
def __repr__(self):
return f'<Category name:{self.name}>'
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'<FileType name:{self.name}>'

View File

@@ -10,11 +10,15 @@
<div class="row">
<h4 class="u-pull-left">
<a href="{{ url_for('files.uploaded_file', filename=file.filename) }}">{{ file.filename }}</a>
<a href="{{ url_for('files.uploaded_file', filename=file.filename) }}">{{ file.filename }}{{' - Private' if file.private == 1 }}</a>
</h4>
</div>
{% if file.type.name == 'Image' %}
<img class="preview" src="{{ url_for('files.uploaded_file', filename=file.filename) }}">
{% elif file.type.name == 'Code' %}
<pre><code>{{file.filename}}</code></pre>
{% endif %}
{% if g.user %}
<form action="{{ url_for('files.rename_file', id=file.id) }}" method="post">
@@ -28,17 +32,36 @@
</div>
</div>
</form>
<form action="{{ url_for('files.recategorize', id=file.id) }}" method="post">
<label for="new_category">~/category</label>
<div class="nine columns">
<select class="u-full-width" name="new_category" id="new_category">
{% for category in categories %}
<option value="{{ category.id }}" {{ 'selected' if category.id == file.category_id }}>{{ category.name }}</option>
{% endfor %}
</select>
<div class="row">
<label for="new_category">~/category</label>
<div class="nine columns">
<select class="u-full-width" name="new_category" id="new_category">
{% for category in categories %}
<option value="{{ category.id }}" {{ 'selected' if category.id == file.category_id }}>{{ category.name }}</option>
{% endfor %}
</select>
</div>
<div class="two columns">
<input type="submit" class="button-primary" value="change category">
</div>
</div>
<div class="two columns">
<input type="submit" class="button-primary" value="change category">
</form>
<form action="{{ url_for('files.retype', id=file.id) }}" method="post">
<div class="row">
<label for="new_type">~/type</label>
<div class="nine columns">
<select class="u-full-width" name="new_type" id="new_type">
{% for file_type in file_types %}
<option value="{{ file_type.id }}" {{ 'selected' if file_type.id == file.file_type_id}}>{{ file_type.name }}</option>
{% endfor %}
</select>
</div>
<div class="two columns">
<input type="submit" class="button-primary" value="change type">
</div>
</div>
</form>
{% endif %}

View File

@@ -14,6 +14,12 @@
<option value="{{ category.id }}">{{ category.name }}</option>
{% endfor %}
</select>
<label for="file_type">~/file-type</label>
<select class="u-full-width" name="file_type" id="file_type">
{% for file_type in file_types %}
<option value="{{ file_type.id }}">{{ file_type.name }}</option>
{% endfor %}
</select>
<label for="private">~/private</label>
<label>
<input type="checkbox" name="private" id="private">