Added filetype support
This commit is contained in:
@@ -6,7 +6,7 @@ from flask.cli import with_appcontext
|
|||||||
|
|
||||||
from werkzeug.security import generate_password_hash
|
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():
|
def init_db():
|
||||||
@@ -25,19 +25,26 @@ def generate_admin():
|
|||||||
|
|
||||||
def add_defaults():
|
def add_defaults():
|
||||||
default_category = Category('Default')
|
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_category)
|
||||||
|
db.session.add(default_file_type)
|
||||||
|
db.session.add(code_file_type)
|
||||||
|
db.session.add(image_file_type)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
|
||||||
def add_files():
|
def add_files():
|
||||||
existing_files = os.listdir(current_app.config['UPLOAD_FOLDER'])
|
existing_files = os.listdir(current_app.config['UPLOAD_FOLDER'])
|
||||||
default_category = Category.query.filter_by(name='Default').first()
|
default_category = Category.query.filter_by(name='Default').first()
|
||||||
|
default_file_type = FileType.query.filter_by(name='Default').first()
|
||||||
added = 0
|
added = 0
|
||||||
|
|
||||||
for f in existing_files:
|
for f in existing_files:
|
||||||
search = File.query.filter_by(filename=f).first()
|
search = File.query.filter_by(filename=f).first()
|
||||||
if search is None:
|
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)
|
db.session.add(file)
|
||||||
added += 1
|
added += 1
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from flask import Flask, Blueprint, flash, request, redirect, url_for, current_a
|
|||||||
|
|
||||||
from werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
from werkzeug.exceptions import abort
|
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
|
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)
|
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:
|
if private is None:
|
||||||
is_private = 0
|
is_private = 0
|
||||||
else:
|
else:
|
||||||
@@ -30,7 +30,7 @@ def _save_file(file, private, category):
|
|||||||
filename = secure_filename(file.filename)
|
filename = secure_filename(file.filename)
|
||||||
|
|
||||||
file.save(_get_path_in_upload(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.add(f)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
@@ -85,23 +85,33 @@ def upload_file():
|
|||||||
flash('The category selected won\'t exists')
|
flash('The category selected won\'t exists')
|
||||||
return redirect(request.url)
|
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 == '':
|
if file.filename == '':
|
||||||
flash('No seleted file')
|
flash('No seleted file')
|
||||||
return redirect(request.url)
|
return redirect(request.url)
|
||||||
|
|
||||||
if file:
|
if file:
|
||||||
_save_file(file, private, category)
|
_save_file(file, private, category, file_type)
|
||||||
return redirect(url_for('files.index'))
|
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>')
|
@bp.route('/preview/<int:id>')
|
||||||
def preview_file(id):
|
def preview_file(id):
|
||||||
file = File.query.get(id)
|
file = File.query.get(id)
|
||||||
categories = Category.query.all()
|
categories = Category.query.all()
|
||||||
|
file_types = FileType.query.all()
|
||||||
if (file.private == 1 and g.user is not None) or (file.private == 0):
|
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:
|
else:
|
||||||
return abort(404)
|
return abort(404)
|
||||||
|
|
||||||
@@ -144,6 +154,24 @@ def recategorize(id):
|
|||||||
return redirect(url_for('files.preview_file', id=file.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'])
|
@bp.route('/delete/<int:id>', methods=['POST'])
|
||||||
@admin_required
|
@admin_required
|
||||||
|
|||||||
@@ -41,11 +41,13 @@ class File(db.Model):
|
|||||||
filename = db.Column(db.String, nullable=False)
|
filename = db.Column(db.String, nullable=False)
|
||||||
private = db.Column(db.Integer, nullable=False)
|
private = db.Column(db.Integer, nullable=False)
|
||||||
category_id = db.Column(db.Integer, db.ForeignKey('categories.id'), 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.filename = filename
|
||||||
self.private = private
|
self.private = private
|
||||||
self.category_id = category_id
|
self.category_id = category_id
|
||||||
|
self.file_type_id = file_type_id
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'<File name:{self.filename}>'
|
return f'<File name:{self.filename}>'
|
||||||
@@ -62,3 +64,15 @@ class Category(db.Model):
|
|||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'<Category name:{self.name}>'
|
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}>'
|
||||||
|
|||||||
@@ -10,11 +10,15 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h4 class="u-pull-left">
|
<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>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if file.type.name == 'Image' %}
|
||||||
<img class="preview" src="{{ url_for('files.uploaded_file', filename=file.filename) }}">
|
<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 %}
|
{% if g.user %}
|
||||||
<form action="{{ url_for('files.rename_file', id=file.id) }}" method="post">
|
<form action="{{ url_for('files.rename_file', id=file.id) }}" method="post">
|
||||||
@@ -28,17 +32,36 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<form action="{{ url_for('files.recategorize', id=file.id) }}" method="post">
|
<form action="{{ url_for('files.recategorize', id=file.id) }}" method="post">
|
||||||
<label for="new_category">~/category</label>
|
<div class="row">
|
||||||
<div class="nine columns">
|
<label for="new_category">~/category</label>
|
||||||
<select class="u-full-width" name="new_category" id="new_category">
|
<div class="nine columns">
|
||||||
{% for category in categories %}
|
<select class="u-full-width" name="new_category" id="new_category">
|
||||||
<option value="{{ category.id }}" {{ 'selected' if category.id == file.category_id }}>{{ category.name }}</option>
|
{% for category in categories %}
|
||||||
{% endfor %}
|
<option value="{{ category.id }}" {{ 'selected' if category.id == file.category_id }}>{{ category.name }}</option>
|
||||||
</select>
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="two columns">
|
||||||
|
<input type="submit" class="button-primary" value="change category">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="two columns">
|
</form>
|
||||||
<input type="submit" class="button-primary" value="change category">
|
|
||||||
|
<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>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -14,6 +14,12 @@
|
|||||||
<option value="{{ category.id }}">{{ category.name }}</option>
|
<option value="{{ category.id }}">{{ category.name }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</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 for="private">~/private</label>
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" name="private" id="private">
|
<input type="checkbox" name="private" id="private">
|
||||||
|
|||||||
Reference in New Issue
Block a user