# 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
import jinja2
import base64


gestion = Blueprint('gestion', __name__)

@gestion.before_request
@login_required
def verifica_permisos():
    pass

@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')


@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:
        from webinterface.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 webinterface.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/<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
    from webinterface.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/<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
	from webinterface 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)
