from flask import ( Blueprint, render_template, redirect, url_for, send_from_directory, flash, ) from flask_login import current_user, login_required from sqlalchemy.exc import ( DatabaseError, DataError, IntegrityError, InterfaceError, InvalidRequestError, ) from exif import Image from app import db from models.distribusi_model import Distribusis from models.distribusi_file_model import DistribusiFiles from describer.forms.describe_files_form import DescribeFilesForm describer = Blueprint( "describer", __name__, template_folder="templates/describe_files", static_folder="static", ) @describer.route("/") @login_required def show_distribusi_files(distribusiname): if not current_user.is_authenticated: return redirect(url_for("index")) distribusi = Distribusis.query.filter_by( distribusiname=distribusiname ).first() distribusi_file_forms = get_distribusi_file_forms(distribusi.id) return render_template( "describe.html", distribusi_file_forms=distribusi_file_forms, ) @describer.route("/describe_file/", methods=["POST"]) @login_required def describe_file(file_id): distribusi_file = DistribusiFiles.query.filter_by(id=file_id).first() describe_form = DescribeFilesForm( distribusi_file.id, distribusi_file.path, distribusi_file.type ) save_described_file_to_db(describe_form, distribusi_file) add_exif_to_image(describe_form, distribusi_file) distribusi = Distribusis.query.filter_by( id=distribusi_file.distribusi ).first() return redirect( url_for( "describer.show_distribusi_files", distribusiname=distribusi.distribusiname, ) ) @describer.route("/stash/") def send_stash_file(path): return send_from_directory("stash", path) def get_distribusi_file_forms(distribusi_id): distribusi_file_forms = {} distribusi_files = DistribusiFiles.query.filter_by( distribusi=distribusi_id ).all() for distribusi_file in distribusi_files: describe_form = DescribeFilesForm( distribusi_file.id, distribusi_file.path, distribusi_file.type ) describe_form.description.data = distribusi_file.description describe_form.alttext.data = distribusi_file.alttext describe_form.searchtags.data = distribusi_file.tags distribusi_file_forms[distribusi_file.id] = describe_form return distribusi_file_forms def save_described_file_to_db(describe_form, distribusi_file): try: if describe_form.description.data: print(distribusi_file.id) distribusi_file.description = describe_form.description.data if describe_form.alttext.data: distribusi_file.alttext = describe_form.alttext.data if describe_form.searchtags.data: distribusi_file.tags = describe_form.searchtags.data db.session.add(distribusi_file) db.session.commit() except (InvalidRequestError, IntegrityError): db.session.rollback() describe_form.save.errors.append("Something went wrong!") flash("Something went wrong!", "danger") except DataError: db.session.rollback() describe_form.save.errors.append("Invalid Entry") flash("Invalid Entry", "warning") except InterfaceError: db.session.rollback() describe_form.save.errors.append("Error connecting to the database") flash("Error connecting to the database", "danger") except DatabaseError: db.session.rollback() describe_form.save.errors.append("Error connecting to the database") flash("Error connecting to the database", "danger") def add_exif_to_image(describe_form, distribusi_file): if not describe_form.alttext.data: return if distribusi_file.type != "image": return updating_image = bytearray() with open(distribusi_file.path, "rb") as image_file: image_bytes = image_file.read() updating_image = Image(image_bytes) updating_image.communication = describe_form.alttext.data with open(distribusi_file.path, "wb") as new_image_file: new_image_file.write(updating_image.get_file()) print( f"{updating_image.communication} is set from form data: {describe_form.alttext.data}" ) return