sistema_web/private-dynamic/content/docs/routes.py

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()