From cd2087c5676dc8245c53a018f4f2125f5f298e81 Mon Sep 17 00:00:00 2001 From: Daniel Cortes Date: Sat, 9 Mar 2019 02:44:17 -0300 Subject: [PATCH] Los archivos se guardan en la base de datos y se agregaron categorias Si, creo que eso nada mas --- files/__init__.py | 4 + files/categories.py | 88 +++++++++++ files/db.py | 16 ++ files/files.py | 195 +++++++++++++++++++++---- files/static/style.css | 2 +- files/templates/base.html | 8 + files/templates/categories/create.html | 12 ++ files/templates/categories/index.html | 13 ++ files/templates/categories/view.html | 13 ++ files/templates/files/index.html | 6 +- files/templates/files/preview.html | 10 +- files/templates/files/upload.html | 14 +- 12 files changed, 340 insertions(+), 41 deletions(-) create mode 100644 files/categories.py create mode 100644 files/templates/categories/create.html create mode 100644 files/templates/categories/index.html create mode 100644 files/templates/categories/view.html diff --git a/files/__init__.py b/files/__init__.py index ab36d14..f2a9396 100644 --- a/files/__init__.py +++ b/files/__init__.py @@ -29,6 +29,9 @@ def create_app(): from . import auth app.register_blueprint(auth.bp) + from . import categories + app.register_blueprint(categories.bp) + from . import about app.register_blueprint(about.bp) app.add_url_rule('/about', endpoint='about') @@ -37,4 +40,5 @@ def create_app(): app.register_blueprint(files.bp) app.add_url_rule('/', endpoint='index') + return app diff --git a/files/categories.py b/files/categories.py new file mode 100644 index 0000000..b7991d8 --- /dev/null +++ b/files/categories.py @@ -0,0 +1,88 @@ +from flask import Flask, Blueprint, flash, request, redirect, url_for, current_app, render_template, jsonify + +from werkzeug.exceptions import abort + +from files.db import get_db +from files.auth import admin_required +from files.files import get_files_by_category + +bp = Blueprint('categories', __name__, url_prefix='/categories') + +def get_categories(): + db = get_db() + categories = db.execute( + 'SELECT id, name' + ' FROM categories' + ' ORDER BY name DESC' + ).fetchall() + return categories + +def get_category(id): + db = get_db() + category = db.execute( + 'SELECT id, name' + ' FROM categories' + ' WHERE id = ?' + ' LIMIT 1', + (id,) + ).fetchone() + return category + +def get_files_by_category(id): + db = get_db() + files = db.execute( + 'SELECT id, filename, private' + ' FROM files' + ' WHERE category = ?' + ' ORDER BY filename DESC', + (id,) + ).fetchall() + return files + +@bp.route('/') +def index(): + categories = get_categories() + return render_template('categories/index.html', categories=categories) + +@bp.route('/create', methods=['GET', 'POST']) +@admin_required +def create(): + if request.method == 'POST': + name = request.form['name'] + error = None + + if not name: + error = "Name is required" + + if error is not None: + flash(error) + else: + db = get_db() + db.execute( + 'INSERT INTO categories (name)' + ' VALUES (?)', + (name,) + ) + db.commit() + return redirect(url_for('categories.index')) + + return render_template('categories/create.html') + +@bp.route('') +def view(id): + category = get_category(id) + files = get_files_by_category(id) + return render_template('categories/view.html', category=category, files=files) + + +@bp.route('//update') +@admin_required +def update(): + pass + +@bp.route('//delete') +@admin_required +def delete(): + pass + + diff --git a/files/db.py b/files/db.py index 9cd1490..66ccf47 100644 --- a/files/db.py +++ b/files/db.py @@ -37,6 +37,10 @@ def generate_admin(): ) db.commit() +def generate_files(): + pass + + @click.command('init-db') @with_appcontext def init_db_command(): @@ -51,6 +55,18 @@ def generate_admin_command(): generate_admin() click.echo('The admin was created') + +@click.command('generate-files') +@with_appcontext +def generate_files_command(): + """ + Generates the rows in the database for the files currently uploaded + They all will have default privacy, so, public + """ + generate_files() + click.echo('files generated') + + def init_app(app): app.teardown_appcontext(close_db) app.cli.add_command(init_db_command) diff --git a/files/files.py b/files/files.py index c93580d..8a4e068 100644 --- a/files/files.py +++ b/files/files.py @@ -1,12 +1,13 @@ import os import random -from flask import Flask, Blueprint, flash, request, redirect, url_for, current_app, render_template, send_from_directory +from flask import Flask, Blueprint, flash, request, redirect, url_for, current_app, render_template, send_from_directory, g from werkzeug.utils import secure_filename from werkzeug.exceptions import abort from files.auth import admin_required +from files.db import get_db bp = Blueprint('files', __name__) @@ -18,62 +19,194 @@ def get_extension(filename): def get_path_in_upload(filename): return os.path.join(current_app.config['UPLOAD_FOLDER'], filename) +def save_file(file, private, category): + if private is None: + is_private = 0 + else: + is_private = 1 + + db = get_db() + + filename = secure_filename(file.filename) + db.execute( + 'INSERT INTO files (filename, private, category)' + ' VALUES (?,?,?)', + (filename, is_private, category['id'],) + ) + + file.save(get_path_in_upload(filename)) + + db.commit() + + return filename + +def _rename_file(file, new_name): + db = get_db() + + new_name = secure_filename(new_name) + db.execute( + 'UPDATE files' + ' SET filename = ?' + ' WHERE id = ?', + (new_name, file['id'],) + ) + + os.rename(get_path_in_upload(file['filename']), get_path_in_upload(new_name)) + + db.commit() + + return new_name + + +def _delete_file(file): + db = get_db() + db.execute( + 'DELETE from files' + ' WHERE id = ?', + (file['id'],) + ) + + os.remove(get_path_in_upload(file['filename'])) + db.commit() + + +def get_files(): + db = get_db() + files = db.execute( + 'SELECT id, filename, private, category' + ' FROM files' + ' ORDER BY filename' + ).fetchall() + return files + +def get_public_files(): + db = get_db() + files = db.execute( + 'SELECT id, filename, private, category' + ' FROM files' + ' WHERE private = false' + ' ORDER BY filename' + ).fetchall() + + return files + +def get_files_by_category(id): + db = get_db() + files = db.execute( + 'SELECT id, filename, private' + ' FROM files' + ' WHERE category = ?' + ' ORDER BY filename', + (id,) + ).fetchall() + +def get_file(id): + db = get_db() + file = db.execute( + 'SELECT id, filename, private, category' + ' FROM files' + ' WHERE id = ?' + ' LIMIT 1', + (id,) + ).fetchone() + return file + +def get_categories(): + db = get_db() + categories = db.execute( + 'SELECT id, name' + ' FROM categories' + ' ORDER BY name' + ).fetchall() + return categories + +def get_category(id): + db = get_db() + category = db.execute( + 'SELECT id, name' + ' FROM categories' + ' WHERE id = ?' + ' LIMIT 1', + (id,) + ).fetchone() + return category + @bp.route('/', methods=['GET', 'POST']) def index(): - filenames = os.listdir(current_app.config['UPLOAD_FOLDER']) - return render_template('files/index.html', filenames=filenames) + if g.user is None: + files = get_public_files() + else: + files = get_files() + + return render_template('files/index.html', files=files) @bp.route('/upload', methods=['GET', 'POST']) @admin_required def upload_file(): + db = get_db() + if request.method == 'POST': if 'file' not in request.files: flash('No file part') return redirect(request.url) - file = request.files['file'] + else: + file = request.files['file'] + + if 'private' not in request.form: + private = None + else: + private = request.form['private'] + + if 'category' not in request.form: + flash('No category selected') + return redirect(request.url) + else: + category = get_category(request.form['category']) + if file.filename == '': flash('No seleted file') - return rediret(request.url) + return redirect(request.url) + if file: - filename = secure_filename(file.filename) - file.save(get_path_in_upload(filename)) + filename = save_file(file, private, category) + return redirect(url_for('files.index')) + + return render_template('files/upload.html', categories=get_categories()) - return redirect(url_for('files.preview_file', filename=filename)) - return render_template('files/upload.html') - -@bp.route('/preview/') -def preview_file(filename): - file = os.path.isfile(get_path_in_upload(filename)) - if os.path.isfile(get_path_in_upload(filename)): - return render_template('files/preview.html', filename=filename) +@bp.route('/preview/') +def preview_file(id): + file = get_file(id) + if (file['private'] == 1 and g.user is not None) or (file['private'] == 0): + return render_template('files/preview.html', file=file) else: - abort(404) + return abort(404) -@bp.route('/rename/', methods=['POST']) +@bp.route('/rename/', methods=['POST']) @admin_required -def rename_file(filename): - if request.method == 'POST' and os.path.isfile(get_path_in_upload(filename)): +def rename_file(id): + if request.method == 'POST': + file = get_file(id) + new_name = request.form['new_name'].lower() - extension = filename.rsplit('.', 1)[1].lower() + extension = file['filename'].rsplit('.', 1)[1].lower() if "." in new_name and get_extension(new_name): new_name = new_name.rsplit('.',1)[0] + '.' + extension else: new_name = new_name + '.' + extension + + _rename_file(file, new_name) + + return redirect(url_for('files.preview_file', id=file['id'])) - new_name = secure_filename(new_name) - os.rename(get_path_in_upload(filename), get_path_in_upload(new_name)) - - return redirect(url_for('files.preview_file', filename=new_name)) - -@bp.route('/delete/', methods=['POST']) +@bp.route('/delete/', methods=['POST']) @admin_required -def delete_file(filename): - full_path = os.path.join(current_app.config['UPLOAD_FOLDER'], filename) - - if request.method == 'POST' and os.path.isfile(full_path): - os.remove(full_path) +def delete_file(id): + if request.method == 'POST': + file = get_file(id) + print(file) + _delete_file(file) return redirect(url_for('index')) else: abort(404) diff --git a/files/static/style.css b/files/static/style.css index 1c2b06c..303f884 100644 --- a/files/static/style.css +++ b/files/static/style.css @@ -63,7 +63,7 @@ input[type="button"].button-primary:focus { border-color: var(--secondary-color); } -.file-listing{ +.grid{ display: grid; grid-template-columns: repeat(5, 1fr); grid-gap: 3rem 1rem; diff --git a/files/templates/base.html b/files/templates/base.html index 66f4a39..c0c5b4f 100644 --- a/files/templates/base.html +++ b/files/templates/base.html @@ -12,7 +12,9 @@
+
    + {% for message in get_flashed_messages() %} +
  • {{ message }}
  • + {% endfor %} +
+ {% block content %}{% endblock %}
diff --git a/files/templates/categories/create.html b/files/templates/categories/create.html new file mode 100644 index 0000000..28ba18a --- /dev/null +++ b/files/templates/categories/create.html @@ -0,0 +1,12 @@ +{% extends 'base.html' %} + +{% block title %}Categories{% endblock %} + +{% block content %} +

Create a new Category

+
+ + + +
+{% endblock %} diff --git a/files/templates/categories/index.html b/files/templates/categories/index.html new file mode 100644 index 0000000..6f6219f --- /dev/null +++ b/files/templates/categories/index.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block title %}category{% endblock %} + +{% block content %} +
+ {% for category in categories %} + {{ category.name }} + {% endfor %} +
+{% endblock %} + + diff --git a/files/templates/categories/view.html b/files/templates/categories/view.html new file mode 100644 index 0000000..3bbfe66 --- /dev/null +++ b/files/templates/categories/view.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% block title %}categories/view/{{ category.name }}{% endblock %} + +{% block content %} +

{{ category.name }}

+
+ {% for file in files %} + {{ file.filename }} + {% endfor %} +
+{% endblock %} + diff --git a/files/templates/files/index.html b/files/templates/files/index.html index cceec85..a3ab5d4 100644 --- a/files/templates/files/index.html +++ b/files/templates/files/index.html @@ -3,9 +3,9 @@ {% block title %}{% endblock %} {% block content %} -
- {% for filename in filenames %} - {{ filename }} +
+ {% for file in files %} + {{ file.filename}} {% endfor %}
{% endblock %} diff --git a/files/templates/files/preview.html b/files/templates/files/preview.html index 7e263c5..947a2fd 100644 --- a/files/templates/files/preview.html +++ b/files/templates/files/preview.html @@ -3,21 +3,21 @@ {% block content %} {% if g.user %} -
+
{% endif %} - + {% if g.user %} -
+ - +
{% endif %} diff --git a/files/templates/files/upload.html b/files/templates/files/upload.html index 8ef69bc..3ae9483 100644 --- a/files/templates/files/upload.html +++ b/files/templates/files/upload.html @@ -4,7 +4,19 @@ {% block content %}
- + + + + + + +
{% endblock %}