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 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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}>'
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user