# coding: utf-8 from flask import render_template, flash, redirect, send_file, url_for, request, Blueprint, current_app, abort, g from flask_login import login_required, current_user from webinterface import db from sqlalchemy.sql import func from webinterface.models.gestion import Objetivo, Comision, Miembro, Avance, Accion, AccesoGestion, ModuloGestion, AccesosModuloGestion, Acta, AnexosActa, MiembrosAsistentes, InvitadosAsistentes import datetime gestion = Blueprint('gestion', __name__) @gestion.before_request @login_required def verifica_permisos(): pass # @gestion.route("/gestion/nuevoobjetivo", methods=['POST']) # def newsingle(): # cid = int(request.form['responsable']) # fid = int(request.form['id']) # nombre = request.form['nombre'].strip() # if fid > 0 and cid > 0 and nombre: # fobj = Objetivo.query.get(fid) # nobj = Objetivo(nombre=nombre, tipo=fobj.tipo, parentid=fid, estado=0, responsableid=cid) # db.session.add(nobj) # db.session.commit() # flash(u'Elemento "{}" generado con exito.'.format(nombre),'success') # else: # flash(u'Los datos ingresados son inválidos.','danger') # # return redirect(url_for('gestion.manager')) @gestion.route("/objetivos/editmodulo", methods=['POST']) def editmodulo(): # for key, values in request.form.items(): # current_app.logger.debug('request: {}: {}'.format(key, values)) try: mid = int(request.form['id']) except: mid = 0 uri = request.form['uri'].strip().lower() if not uri: flash("Los datos ingresados son incorrectos: uri vacio", 'danger') abort(400) existeA = ModuloGestion.query.filter(ModuloGestion.id==mid).one_or_none() existeB = ModuloGestion.query.filter(ModuloGestion.uri==uri).one_or_none() if existeA is None and existeB is None: flash("Creado el modulo: {}".format(request.form['nombre'].strip()), 'success') nodobase = Objetivo(nombre=request.form['nombre'].strip(), tipo=request.form['icon'].strip().lower(), descripcion='gestion.{}'.format(uri), parentid=1, estado=0, responsableid=1) db.session.add(nodobase) if mid==0: existe = ModuloGestion(nombre=request.form['nombre'].strip(), etiqueta=request.form['etiqueta'].strip().lower().capitalize(), uri=uri, nodobase=nodobase) else: existe = ModuloGestion(id=mid, nombre=request.form['nombre'].strip(), etiqueta=request.form['etiqueta'].strip().lower().capitalize(), uri=uri, nodobase=nodobase) db.session.add(existe) for value in request.form.getlist('comisiones'): acceso = AccesosModuloGestion(comisionid=int(value), modulo=existe) db.session.add(acceso) # current_app.logger.debug('Acceso comision: {}'.format(value)) db.session.commit() elif existeA is not None: flash("Modificada el acceso del modulo: {}".format(existeA.nombre), 'success') for exmiembro in AccesosModuloGestion.query.filter(AccesosModuloGestion.moduloid==mid).all(): # current_app.logger.debug('quita comision: {}'.format(exmiembro.comisionid)) db.session.delete(exmiembro) db.session.commit() existeA.nombre = request.form['nombre'].strip() existeA.etiqueta = request.form['etiqueta'].strip().lower().capitalize() existeA.uri = uri existeA.nodobase.nombre = request.form['nombre'].strip() existeA.nodobase.tipo = request.form['icon'].strip().lower() existeA.nodobase.descripcion = 'gestion.{}'.format(uri) for value in request.form.getlist('comisiones'): acceso = AccesosModuloGestion(comisionid=int(value), modulo=existeA) db.session.add(acceso) # current_app.logger.debug('Acceso comision: {}'.format(value)) db.session.commit() existe = existeA elif existeB is not None and mid > 0: flash("Modificada el acceso del modulo: {}".format(existeB.nombre), 'success') for exmiembro in AccesosModuloGestion.query.filter(AccesosModuloGestion.moduloid==existeB.id).all(): # current_app.logger.debug('quita comision: {}'.format(exmiembro.comisionid)) db.session.delete(exmiembro) db.session.commit() existeB.nombre = request.form['nombre'].strip() existeB.etiqueta = request.form['etiqueta'].strip().lower().capitalize() existeB.id = mid existeB.nodobase.nombre = request.form['nombre'].strip() existeB.nodobase.tipo = request.form['icon'].strip().lower() existeB.nodobase.descripcion = 'gestion.{}'.format(uri) for value in request.form.getlist('comisiones'): acceso = AccesosModuloGestion(comisionid=int(value), modulo=existeB) db.session.add(acceso) # current_app.logger.debug('Acceso comision: {}'.format(value)) db.session.commit() existe = existeB else: flash("Los datos ingresados son incorrectos", 'danger') abort(400) ############################################################################ ############# Mantenimieto de las accesos grupales ############# ############################################################################ administradores = [] conacceso = existe.mvector() for item in Comision.query.filter(Comision.id>999, Comision.creado==1).all(): administradores.append(item.id) for administrador in administradores: acceso = Objetivo.query.filter(Objetivo.parentid==existe.nodobase.id, Objetivo.responsableid==administrador).one_or_none() if acceso is None and administrador in conacceso: responsable = Comision.query.get(administrador) acceso = Objetivo(nombre="{} {}".format(request.form['nombre'].strip(), responsable.nombre), descripcion=existe.nodobase.descripcion, tipo=existe.nodobase.tipo, responsableid=administrador, parentid=existe.nodobase.id, estado=0) db.session.add(acceso) elif acceso is not None: acceso.tipo = existe.nodobase.tipo acceso.descripcion = existe.nodobase.descripcion if administrador in conacceso: acceso.estado = 0 else: acceso.estado = 100 db.session.commit() return redirect(url_for('gestion.modulos')) @gestion.route("/objetivos/nuevacomision", methods=['POST']) def newcomision(): cid = int(request.form['id']) if cid == 0: ncomision = Comision(nombre=request.form['nombre'].strip(), creado=int(request.form['admin'])) db.session.add(ncomision) for value in request.form.getlist('miembros'): miembro = Miembro(personaid=int(value), comision=ncomision) db.session.add(miembro) # current_app.logger.debug('crea miembro: {}'.format(value)) db.session.commit() else: for exmiembro in Miembro.query.filter_by(comisionid=cid).all(): # current_app.logger.debug('quita miembro: {}'.format(exmiembro.personaid)) db.session.delete(exmiembro) db.session.commit() ncomision = Comision.query.get(cid) ncomision.nombre=request.form['nombre'].strip() for value in request.form.getlist('miembros'): miembro = Miembro(personaid=int(value), comision=ncomision) db.session.add(miembro) # current_app.logger.debug('agrega miembro: {}'.format(value)) db.session.commit() if ncomision.creado==1 and cid==0: return redirect(url_for('gestion.manager', admin=1)) elif ncomision.creado==1 and cid>0: return redirect(url_for('gestion.manager', admin=cid)) else: return redirect(url_for('gestion.manager', admin=ncomision.creado)) @gestion.route("/objetivos/delcomision/", methods=['GET']) def delcomision(comisionid): todel = Comision.query.filter(Comision.id == comisionid).first() if todel is None: abort(404) if todel.creado == 1: abort(403) canI = Miembro.query.filter(Miembro.personaid==current_user.id, Miembro.comisionid==todel.creado).first() if canI is None: abort(403) responsable = todel.creado nombre = todel.nombre for item in Objetivo.query.filter(Objetivo.responsableid==todel.id).all(): item.responsableid = responsable for item in Objetivo.query.filter(Objetivo.invitadosid==todel.id).all(): item.invitadosid = None for item in Miembro.query.filter(Miembro.comisionid==todel.id).all(): db.session.delete(item) db.session.delete(todel) db.session.commit() flash(u"Comision '{}' eliminada con éxito".format(nombre), 'success') return redirect(url_for('gestion.manager', admin=responsable)) @gestion.route("/objetivos/syscomision", methods=['POST']) def syscomision(): cid = int(request.form['id']) new = Comision.query.filter(Comision.id == cid).first() if cid == 0: ncomision = Comision(nombre=request.form['nombre'].strip(), creado=1) db.session.add(ncomision) for value in request.form.getlist('miembros'): miembro = Miembro(personaid=int(value), comision=ncomision) db.session.add(miembro) # current_app.logger.debug('crea miembro: {}'.format(value)) db.session.commit() elif new is None: ncomision = Comision(id=cid, nombre=request.form['nombre'].strip(), creado=1) db.session.add(ncomision) for value in request.form.getlist('miembros'): miembro = Miembro(personaid=int(value), comision=ncomision) db.session.add(miembro) # current_app.logger.debug('crea miembro: {}'.format(value)) db.session.commit() else: for exmiembro in Miembro.query.filter_by(comisionid=cid).all(): # current_app.logger.debug('quita miembro: {}'.format(exmiembro.personaid)) db.session.delete(exmiembro) db.session.commit() ncomision = Comision.query.get(cid) ncomision.nombre=request.form['nombre'].strip() for value in request.form.getlist('miembros'): miembro = Miembro(personaid=int(value), comision=ncomision) db.session.add(miembro) # current_app.logger.debug('agrega miembro: {}'.format(value)) db.session.commit() ############################################################################ ############# Mantenimieto del acceso alas tareas personales ############# ############################################################################ for item in Objetivo.query.filter(Objetivo.parentid==2, Objetivo.estado<100).all(): item.estado=100 db.session.commit() personal = [] for item in Miembro.query.filter(Miembro.comisionid==2).all(): personal.append(item.personaid) for personaid in personal: from ilab_app.models.system import Persona theuser = Persona.query.get(personaid) comisionpersonal = Comision.query.filter(Comision.nombre=="Personal {}".format(theuser.login), Comision.creado==2).one_or_none() if comisionpersonal is None: comisionpersonal = Comision(nombre="Personal {}".format(theuser.login), creado=2) db.session.add(comisionpersonal) db.session.commit() miembrocomisonpersoanal = Miembro.query.filter(Miembro.comisionid==comisionpersonal.id).first() if miembrocomisonpersoanal is None: miembrocomisonpersoanal = Miembro(comisionid=comisionpersonal.id, personaid=personaid) db.session.add(miembrocomisonpersoanal) objetivopersonal = Objetivo.query.filter(Objetivo.responsableid==comisionpersonal.id, Objetivo.parentid==2).one_or_none() if objetivopersonal is None: objetivopersonal = Objetivo(tipo='user-lock', nombre="{}".format(theuser.nombrecompleto), responsableid=comisionpersonal.id, parentid=2, estado=0) db.session.add(objetivopersonal) else: objetivopersonal.estado=0 db.session.commit() return redirect(url_for('gestion.manager', admin=1)) @gestion.route("/gestion/actividad", methods=['POST']) def actividad(): # for key, values in request.form.items(): # current_app.logger.debug('request: {}: {}'.format(key, values)) try: oid = int(request.form['oid']) pid = int(request.form['pid']) fecha = datetime.datetime.strptime(request.form['fecha'], '%d/%m/%Y').date() except Exception as e: flash("Los datos ingresados son incorrectos: {}".format(str(e)), 'danger') abort(400) try: dedicacion = int(request.form['dedicacion']) except Exception as e: dedicacion = 0 if oid > 0: item = Accion.query.get(oid) item.nombre = request.form['nombre'].strip()[:100] item.descripcion = request.form['descripcion'].strip() item.dedicacion = dedicacion item.fecha = fecha item.modificadopor = current_user.id # item.modificado = datetime.datetime.now() db.session.commit() elif pid > 0: item = Accion(objetivoid=pid, nombre=request.form['nombre'].strip()[:100], descripcion=request.form['descripcion'].strip(), fecha=fecha, estado=0, dedicacion=dedicacion) item.creadopor = current_user.id # item.creado = datetime.datetime.now() item.modificadopor = current_user.id # item.modificado = datetime.datetime.now() db.session.add(item) db.session.commit() return redirect(url_for('gestion.show', objetivoid=item.objetivoid)) @gestion.route("/gestion/acta", methods=['POST']) def acta(): # for key, values in request.form.items(): # current_app.logger.debug('request: {}: {}'.format(key, values)) try: aid = int(request.form['aid']) pid = int(request.form['pid']) except Exception as e: import traceback current_app.logger.error('Traceback {}'.format(traceback.format_exc())) flash("Los datos ingresados son incorrectos: {}".format(str(e)), 'danger') abort(400) try: lugar = request.form['lugar'].strip() d, m, y = request.form['fecha'].split('/',2) hi, mi = request.form['hini'].split(':',2) hf, mf = request.form['hfin'].split(':',2) except Exception as e: import traceback current_app.logger.error('Traceback {}'.format(traceback.format_exc())) abort(400) horaini = datetime.datetime.strptime('{}/{}/{} {}:{}'.format(d,m,y,hi,mi), "%d/%m/%Y %H:%M") horafin = datetime.datetime.strptime('{}/{}/{} {}:{}'.format(d,m,y,hf,mf), "%d/%m/%Y %H:%M") if aid > 0: item = Acta.query.filter(Acta.id==aid).one() item.lugar = lugar item.horaini = horaini item.horafin = horafin item.temas = request.form['temario'] item.desarrollo = request.form['desarrollo'] item.acuerdos = request.form['acuerdos'] item.modificadopor = current_user.id # item.modificado = datetime.datetime.now() # db.session.commit() elif pid > 0: cantidad = db.session.query(func.count(Acta.id)).filter(Acta.objetivoid==pid).scalar() current_app.logger.debug('Contador {}'.format(cantidad)) seq = 1+int(cantidad) item = Acta(objetivoid=pid, secuencia=seq, lugar=lugar, horaini=horaini, horafin=horafin, temas=request.form['temario'], desarrollo=request.form['desarrollo'], acuerdos=request.form['acuerdos']) item.creadopor = current_user.id # item.creado = datetime.datetime.now() item.modificadopor = current_user.id # item.modificado = datetime.datetime.now() db.session.add(item) else: current_app.logger.error('aid = 0 y pid = 0') abort(400) db.session.commit() miembros = [] for ma in MiembrosAsistentes.query.filter(MiembrosAsistentes.actaid==item.id).all(): miembros.append(ma.personaid) for value in request.form.getlist('asistentes'): v = int(value) if v in miembros: miembros.remove(v) else: db.session.add( MiembrosAsistentes(personaid=v, actaid=item.id) ) for v in miembros: db.session.delete( MiembrosAsistentes.query.filter(MiembrosAsistentes.actaid==item.id, MiembrosAsistentes.personaid==v).one() ) invitados = [] for ia in InvitadosAsistentes.query.filter(InvitadosAsistentes.actaid==item.id).all(): invitados.append(ia.correo) for value in request.form['invitados'].splitlines(): value = value.replace('\t', ' ') try: correo, nombre = value.strip().split(' ', 1) except: correo = value.strip() nombre = '' kcorreo = correo.strip().lower() if kcorreo in invitados: invitados.remove(kcorreo) ikc = InvitadosAsistentes.query.filter(InvitadosAsistentes.actaid==item.id, InvitadosAsistentes.correo==kcorreo).one() ikc.nombre = nombre.strip().title() else: db.session.add( InvitadosAsistentes(correo=kcorreo, actaid=item.id, nombre=nombre.strip().title()) ) for v in invitados: db.session.delete( InvitadosAsistentes.query.filter(InvitadosAsistentes.actaid==item.id, InvitadosAsistentes.correo==v).one() ) db.session.commit() flash(u"El Acta fue ingresado con éxito con el correlativo: {}".format(item.secuencia), 'success') return redirect(url_for('gestion.show', objetivoid=item.objetivoid)) @gestion.route("/gestion/carpeta", methods=['POST']) def carpeta(): # for key, values in request.form.items(): # current_app.logger.debug('request: {}: {}'.format(key, values)) try: oid = int(request.form['oid']) pid = int(request.form['pid']) except Exception as e: flash("Los datos ingresados son incorrectos: {}".format(str(e)), 'danger') abort(400) try: dedicacion = int(request.form['dedicacion']) except Exception as e: dedicacion = 0 fecha = datetime.datetime.strptime(request.form['fecha'], '%d/%m/%Y').date() if oid > 0: item = Accion.query.get(oid) item.nombre = request.form['nombre'].strip()[:100] item.descripcion = request.form['descripcion'].strip() item.dedicacion = dedicacion item.fecha = fecha item.modificadopor = current_user.id # item.modificado = datetime.datetime.now() db.session.commit() elif pid > 0: item = Accion(objetivoid=pid, nombre=request.form['nombre'].strip()[:100], descripcion=request.form['descripcion'].strip(), fecha=fecha, estado=0, dedicacion=dedicacion) item.creadopor = current_user.id # item.creado = datetime.datetime.now() item.modificadopor = current_user.id # item.modificado = datetime.datetime.now() db.session.add(item) db.session.commit() return redirect(url_for('gestion.documentos')) @gestion.route("/gestion/edit", methods=['POST']) def modificar(): # for key, values in request.form.items(): # current_app.logger.debug('request: {}: {}'.format(key, values)) try: oid = int(request.form['oid']) pid = int(request.form['pid']) rid = int(request.form['responsable']) except Exception as e: flash("Los datos ingresados son incorrectos: {}".format(str(e)), 'danger') abort(400) try: iid = int(request.form['invitado']) except: iid = None finally: if iid == 0: iid = None if oid > 0: item = Objetivo.query.get(oid) item.nombre = request.form['nombre'].strip()[:200] item.descripcion = request.form['descripcion'].strip() item.responsableid = rid item.invitadosid = iid item.modificadopor = current_user.id # item.modificado = datetime.datetime.now() db.session.commit() elif pid > 0: item = Objetivo(parentid=pid, nombre=request.form['nombre'].strip()[:200], descripcion = request.form['descripcion'].strip(), responsableid = rid, invitadosid=iid, estado=0) item.creadopor = current_user.id item.modificadopor = current_user.id # item.creado = datetime.datetime.now() # item.modificado = datetime.datetime.now() db.session.add(item) db.session.commit() if request.form['redirect']: return redirect(request.form['redirect']) else: return redirect(url_for('gestion.show', objetivoid=item.id)) @gestion.route("/gestion/indicador", methods=['POST']) def indicador(): # for key, values in request.form.items(): # current_app.logger.debug('request: {}: {}'.format(key, values)) try: oid = int(request.form['oid']) pid = int(request.form['pid']) except Exception as e: flash("Los datos ingresados son incorrectos: {}".format(str(e)), 'danger') abort(400) try: ini = int(request.form['inicial']) val = int(request.form['valor']) tot = int(request.form['meta']) except: ini = 0 val = 0 tot = 100 if oid > 0: item = Avance.query.get(oid) item.nombre = request.form['nombre'].strip()[:100] item.inicial = ini item.valor = val item.meta = tot db.session.commit() elif pid > 0: item = Avance(objetivoid=pid, nombre=request.form['nombre'].strip()[:100], inicial = ini, valor = val, meta = tot) db.session.add(item) db.session.commit() return redirect(url_for('gestion.show', objetivoid=item.objetivoid)) @gestion.route("/gestion/subelogo", methods=['POST']) def subelogo(): # for key, values in request.form.items(): # current_app.logger.debug('request: {}: {}'.format(key, values)) try: cid = int(request.form['cid']) tipologo = int(request.form['tipologo']) except Exception as e: flash(u"Los datos ingresados son incorrectos: {}".format(str(e)), 'danger') abort(400) comision = Comision.query.filter(Comision.id==cid).one_or_none() if comision is None: abort(404) if comision.creado > 1: abort(403) permiso = Miembro.query.filter(Miembro.comisionid==comision.id, Miembro.personaid==current_user.id).one_or_none() if permiso is None: abort(403) if 'documento' in request.files and len(request.files['documento'].filename) > 0: from werkzeug.utils import secure_filename import os uploaded_file = request.files['documento'] name = secure_filename(uploaded_file.filename) nombre, extension = os.path.splitext(name.lower()) if extension not in ['.png']: flash(u"Solo se aceptan imágenes formato PNG", 'warning') else: from ilab_app.content.docs.utils import ingest_file (item, previtem) = ingest_file() if tipologo == 1: flash(u"El logo fue subido con éxito", 'success') comision.logo = item.hash elif tipologo == 2: flash(u"El encabezado de página fue subido con éxito", 'success') comision.titulo = item.hash db.session.commit() return redirect(url_for('gestion.manager', admin=comision.id)) @gestion.route("/gestion/admin/") @gestion.route("/gestion/admin/") def manager(admin=0): admindata = AccesoGestion() current_app.logger.info('Admin Access: IP({}), USER({})'.format(g.ip.ipaddr, current_user.login)) if admin==0 or (admin not in admindata.admin): adming = next(admindata.administrador()) return redirect(url_for('gestion.manager', admin=adming.id)) else: return render_template('gestion/comisiones.html', title=u'Gestión', admindata=admindata, admin=admin, grupo='Responsabilidades', tag='gestion.manager') @gestion.route("/gestion/modulos/") def modulos(): admindata = AccesoGestion() if not admindata.sysadmin: current_app.logger.warning('Modulo Access Denied: IP({}), USER({})'.format(g.ip.ipaddr, current_user.login)) abort(403) current_app.logger.info('Modulo Access: IP({}), USER({})'.format(g.ip.ipaddr, current_user.login)) return render_template('gestion/modulos.html', title=u'Módulos de Gestión', admindata=admindata, grupo='Responsabilidades', tag='gestion.modulos') @gestion.route("/gestion/documentos/") def documentos(): uri = "documentos" modulo = ModuloGestion.query.filter(ModuloGestion.uri==uri).one_or_none() if modulo is None: current_app.logger.info('Acceso main {}: 404 IP({}), USER({})'.format(uri, g.ip.ipaddr, current_user.login)) abort(404) accessdata = AccesoGestion() if modulo not in accessdata.usuario: current_app.logger.info('Acceso main {}: 403 IP({}), USER({})'.format(uri, g.ip.ipaddr, current_user.login)) abort(403) return render_template('gestion/documentos.html', title=u'Almacen de {}'.format(modulo.nombre), root=modulo.nodobase, label=modulo.etiqueta, grupo='Responsabilidades', tag='gestion.{}'.format(modulo.uri), uri=uri) @gestion.route("/gestion/") def main(uri): modulo = ModuloGestion.query.filter(ModuloGestion.uri==uri).one_or_none() if modulo is None: current_app.logger.info('Acceso main {}: 404 IP({}), USER({})'.format(uri, g.ip.ipaddr, current_user.login)) abort(404) accessdata = AccesoGestion() if modulo not in accessdata.usuario: current_app.logger.info('Acceso main {}: 403 IP({}), USER({})'.format(uri, g.ip.ipaddr, current_user.login)) abort(403) return render_template('gestion/resumenes.html', title=u'Tareas {}'.format(modulo.nombre), root=modulo.nodobase, label=modulo.etiqueta, grupo='Responsabilidades', tag='gestion.{}'.format(modulo.uri), uri=uri) @gestion.route("/gestion/ver/") def show(objetivoid): root = Objetivo.query.filter(Objetivo.id==objetivoid).one_or_none() if root is None: abort(404) if not root.visible: abort(403) return render_template('gestion/objetivo.html', title=u'Tareas personales', subtitulo='Vista en Detalle', root=root, label=root.modulo.etiqueta, grupo='Responsabilidades', tag='gestion.{}'.format(root.modulo.uri)) @gestion.route("/gestion/pdf/listaacta/") def listapdf(actaid): root = Acta.query.filter(Acta.id==actaid).one_or_none() if root is None: abort(404) if not root.objetivo.visible: abort(403) from .reporte import ListaActaPDF from tempfile import NamedTemporaryFile import traceback with NamedTemporaryFile() as tmp: try: nombre_reporte = ListaActaPDF(tmp.name, root) with NamedTemporaryFile() as tmp2: import subprocess cmd = subprocess.Popen([u"/usr/bin/ps2pdf {} {}".format(tmp.name, tmp2.name)], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) cmd.wait() return send_file(tmp2.name, as_attachment=True, download_name=nombre_reporte) except: current_app.logger.critical('Error al generar reporte: Objetivoid = {}'.format(actaid)) current_app.logger.debug('Traceback {}'.format(traceback.format_exc())) abort(500) @gestion.route("/gestion/pdf/acta/") def actapdf(actaid): root = Acta.query.filter(Acta.id==actaid).one_or_none() if root is None: abort(404) if not root.objetivo.visible: abort(403) from .reporte import ActaPDF from tempfile import NamedTemporaryFile import traceback with NamedTemporaryFile() as tmp: try: nombre_reporte = ActaPDF(tmp.name, root) with NamedTemporaryFile() as tmp2: import subprocess cmd = subprocess.Popen([u"/usr/bin/ps2pdf {} {}".format(tmp.name, tmp2.name)], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) cmd.wait() return send_file(tmp2.name, as_attachment=True, download_name=nombre_reporte) except: current_app.logger.critical('Error al generar reporte: Objetivoid = {}'.format(actaid)) current_app.logger.debug('Traceback {}'.format(traceback.format_exc())) abort(500) @gestion.route("/gestion/xls/reporte/", methods=['GET']) def reportexls(objetivoid): root = Objetivo.query.filter(Objetivo.id==objetivoid).one_or_none() if root is None: abort(404) if not root.visible: abort(403) from openpyxl import Workbook from ilab_app.models.system import Persona from openpyxl.utils import get_column_letter from tempfile import NamedTemporaryFile wb = Workbook() ws = wb.active ws.title = root.nombre[:20] ws.cell(column=1, row=1, value="Fecha") ws.cell(column=2, row=1, value="Dedicación (Horas)") ws.cell(column=3, row=1, value="Responsable") ws.cell(column=4, row=1, value="Nombre") ws.cell(column=5, row=1, value="Descripcion") i = 1 for Accion in root.iactividades: i = i + 1 ws.cell(column=1, row=i, value=Accion.fecha) ws.cell(column=2, row=i, value=Accion.dedicacion) if Accion.creadopor is not None: creador = Persona.query.filter(Persona.id==Accion.creadopor).one_or_none() ws.cell(column=3, row=i, value=creador.nombrecompleto) ws.cell(column=4, row=i, value=Accion.nombre) ws.cell(column=5, row=i, value=Accion.descripcion) with NamedTemporaryFile() as tmp: wb.save(tmp.name) return send_file(tmp.name, as_attachment=True, download_name="Reporte_{}.xls".format(root.nombre[:20])) @gestion.route("/gestion/pdf/reporte", methods=['POST']) @gestion.route("/gestion/pdf/reporte/", methods=['GET']) def reporte(objetivoid=None): if objetivoid==None: try: objetivoid = int(request.form['oid']) except: objetivoid = None root = Objetivo.query.filter(Objetivo.id==objetivoid).one_or_none() if root is None: abort(404) if not root.visible: abort(403) try: Fini = datetime.datetime.strptime(request.form['fini'], '%d/%m/%Y').date() Fend = datetime.datetime.strptime(request.form['fend'], '%d/%m/%Y').date() current_app.logger.info('Se especifica rango de {} hasta {} para el reporte'.format(Fini, Fend)) except Exception as e: import traceback Fini = None Fend = None current_app.logger.info('No se especifica rango de fechas (valido) para el reporte') from .reporte import ReportePDF from tempfile import NamedTemporaryFile import traceback with NamedTemporaryFile() as tmp: try: nombre_reporte = ReportePDF(tmp.name, root, Fini, Fend) # return send_file(tmp.name, as_attachment=True, download_name=nombre_reporte) with NamedTemporaryFile() as tmp2: import subprocess cmd = subprocess.Popen([u"/usr/bin/ps2pdf {} {}".format(tmp.name, tmp2.name)], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) cmd.wait() return send_file(tmp2.name, as_attachment=True, download_name=nombre_reporte) except: current_app.logger.critical('Error al generar reporte: Objetivoid = {}'.format(objetivoid)) current_app.logger.debug('Traceback {}'.format(traceback.format_exc())) abort(500) @gestion.route("/gestion/pdf/acta//") @gestion.route("/gestion/pdf/acta//") def acta_copiame(actaid, masivo=None): root = Acta.query.filter(Acta.id==actaid).one_or_none() if root is None: abort(404) if not root.objetivo.visible: abort(403) from flask_mail import Message from ilab_app import mail from .reporte import ActaPDF from tempfile import NamedTemporaryFile import traceback with NamedTemporaryFile() as tmp: try: nombre_reporte = ActaPDF(tmp.name, root) with NamedTemporaryFile() as tmp2: import subprocess cmd = subprocess.Popen([u"/usr/bin/ps2pdf {} {}".format(tmp.name, tmp2.name)], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) cmd.wait() timestamp = datetime.datetime.today().strftime('%Y%m%d%H.%M%S') if masivo is None: msg = Message('Copia de Acta {}, {}'.format(root.secuencia, root.objetivo.nombre), sender='noreply@ilab.cl', recipients=[current_user.correodefecto.correo]) else: msg = Message('Copia de Acta {}, {}'.format(root.secuencia, root.objetivo.nombre), sender='noreply@ilab.cl', recipients=root.correosasistentes) msg.body = '''Ésta acta corresponde a la reunión {}, Fecha : {} desde las {} hasta las {} horas Ubicación: {} El detalle de los temas a tratar y los citados a asistir se encuentra en el documento adjunto. Favor no contestar este mensaje, fue generado automáticamente por: {} a las {}'''.format(root.secuencia, root.horaini.strftime('%d/%m/%Y'), root.horaini.strftime('%H:%M'), root.horafin.strftime('%H:%M'), root.lugar, current_user.nombrecompleto, timestamp) with open(tmp.name, 'rb') as fp: msg.attach(filename=nombre_reporte, content_type="application/pdf", data=fp.read(), disposition=None, headers=None) mail.send(msg) return redirect(url_for('gestion.show', objetivoid=root.objetivoid)) except: current_app.logger.critical('Error al generar reporte: Objetivoid = {}'.format(actaid)) current_app.logger.debug('Traceback {}'.format(traceback.format_exc())) abort(500)