90 lines
3.2 KiB
Python
90 lines
3.2 KiB
Python
# 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/<string:filehash>")
|
|
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()
|