2023-02-27 16:21:22 -03:00
# 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
2023-02-28 00:15:12 -03:00
import jinja2
import base64
2023-02-27 16:21:22 -03:00
gestion = Blueprint ( ' gestion ' , __name__ )
@gestion.before_request
@login_required
def verifica_permisos ( ) :
pass
2023-02-28 00:15:12 -03:00
@jinja2.pass_context
@gestion.app_template_filter ( )
def b64encode ( context , value ) :
if value is None :
return ' '
else :
return base64 . b64encode ( value . encode ( " utf-8 " ) ) . decode ( ' utf-8 ' )
2023-02-27 16:21:22 -03:00
@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/<int:comisionid> " , 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 :
2023-02-28 00:15:12 -03:00
from webinterface . models . system import Persona
2023-02-27 16:21:22 -03:00
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 :
2023-02-28 00:15:12 -03:00
from webinterface . content . docs . utils import ingest_file
2023-02-27 16:21:22 -03:00
( 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/<int: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/<uri> " )
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/<int:objetivoid> " )
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/<int:actaid> " )
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/<int:actaid> " )
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/<int:objetivoid> " , 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
2023-02-28 00:15:12 -03:00
from webinterface . models . system import Persona
2023-02-27 16:21:22 -03:00
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/<int:objetivoid> " , 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/<int:actaid>/<string:masivo> " )
@gestion.route ( " /gestion/pdf/acta/<int:actaid>/ " )
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
2023-02-28 00:15:12 -03:00
from webinterface import mail
2023-02-27 16:21:22 -03:00
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 )