# coding: utf-8 from flask import send_file, render_template, flash, redirect, url_for, request, Blueprint, current_app, abort, g from flask_login import login_required, current_user from webinterface import db from webinterface.models.documentos import Documento from webinterface.models.gestion import Evidencia, AnexosActa from .utils import ingest_file from werkzeug.utils import secure_filename import os docs = Blueprint('docs', __name__) @docs.before_request @login_required def verifica_permisos(): pass def touchContainer(filehash, oldhash): try: if 'actividadid' in request.form and int(request.form['actividadid']) > 0: actividadid = request.form['actividadid'] current_app.logger.debug(u'Actividad {} detectada' .format(actividadid)) inode = Evidencia.query.filter(Evidencia.actividadid==actividadid, Evidencia.documentohash==oldhash).one_or_none() if inode is not None: db.session.delete(inode) inode = Evidencia.query.filter(Evidencia.actividadid==actividadid, Evidencia.documentohash==filehash).one_or_none() if inode is None: inode = Evidencia(actividadid=actividadid, documentohash=filehash) db.session.add(inode) db.session.commit() return inode elif 'actaid' in request.form and int(request.form['actaid']) > 0: actaid = request.form['actaid'] current_app.logger.debug(u'AnexosActa {} detectado' .format(actaid)) inode = AnexosActa.query.filter(AnexosActa.actaid==actaid, AnexosActa.documentohash==oldhash).one_or_none() if inode is not None: db.session.delete(inode) inode = AnexosActa.query.filter(AnexosActa.actaid==actaid, AnexosActa.documentohash==filehash).one_or_none() if inode is None: inode = AnexosActa(actaid=actaid, documentohash=filehash) db.session.add(inode) db.session.commit() return inode else: return None except: db.session.rollback() return None @docs.route("/docs/upload", methods=['POST']) def upload(): (item, previtem) = ingest_file() if item is None or (previtem is not None and touchContainer(item.hash, previtem.hash) is None) or (previtem is None and touchContainer(item.hash, "00000000000000000000000000000000") is None): current_app.logger.debug(u'Item is {}, previtem is {}'.format(item, previtem)) flash(u"Ocurrió un error al subir el documento", "danger") else: flash(u"El documento fue almacenado con éxito", "success") nombre, extension = os.path.splitext(item.nombre.lower()) if extension not in ['.pdf', '.jpg', '.jpeg', '.png']: flash(u"El formato '{}' no es compatible con los reportes automáticos. Si desea que se incluya como evidencia en los reportes súbalo como PDF (tamaño carta) o imágen compatible.".format(extension), "warning") return redirect(request.form['redirect']) @docs.route("/docs/") def get(filehash=0): doc = Documento.query.get(filehash) if doc.tamano == 0: return redirect(doc.nombre) else: try: return send_file(os.path.abspath(doc.get_file()), as_attachment=True, download_name=doc.nombre, last_modified=doc.creado) except FileNotFoundError: abort(404) @docs.route("/docs/evidencia", methods=['POST']) def evidencias(): return upload()