예제 #1
0
def enviar_mensaje_registro(viajero, log='Correcto'):
    reserva = viajero.reserva
    vivienda = reserva.vivienda
    ronda = vivienda.entidad.ronda
    html = render_to_string('correo_PN_GC.html', {
        'viajero': viajero,
        'log': log
    })
    #Si es correcto solo recibirán mensaje los propietarios. Si hay errores, el Administrador con el
    #permiso requerido recibirá un correo con el fin de corregir el programa o ayudar al interesado:
    usuarios = usuarios_ronda(ronda)
    if log != 'Correcto':
        logger.info('!=Correcto')
        permiso = Permiso.objects.get(code_nombre='recibe_errores_de_viajeros')
        receptores_ge = usuarios.filter(
            Q(gauser__in=vivienda.propietarios.all())
            | Q(permisos__in=[permiso]))
        receptores = [receptor_ge.gauser for receptor_ge in receptores_ge]
    else:
        receptores = [
            propietario for propietario in vivienda.propietarios.all()
        ]
    emisor = usuarios.get(gauser=vivienda.propietarios.all()[0])
    if log == 'Correcto':
        asunto = 'Efectuado registro de viajero en %s' % vivienda.get_police_display(
        )
        gtexto = 'Registrado en la %s el viajero: %s %s (%s)' % (
            vivienda.get_police_display(), viajero.nombre, viajero.apellido1,
            vivienda.nombre)
        envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                               texto=gtexto)
    elif log == 'Error1':
        asunto = 'Error al hacer el registro de viajero en %s' % vivienda.get_police_display(
        )
        gtexto = 'Error en la comunicación con %s. Se debe hacer el registro manualmente. Viajero: %s %s (%s)' % (
            vivienda.get_police_display(), viajero.nombre, viajero.apellido1,
            vivienda.nombre)
        envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                               texto=gtexto)
    elif log == 'Error2':
        asunto = 'Error al identificarse en web de %s' % vivienda.get_police_display(
        )
        gtexto = 'Error al hacer el login en la web de la %s. Viajero: %s %s (%s)' % (
            vivienda.get_police_display(), viajero.nombre, viajero.apellido1,
            vivienda.nombre)
        envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                               texto=gtexto)
    elif log == 'Error3':
        asunto = 'Error registro GAUSS - Policía Nacional o Guardia Civil sin configurar'
        gtexto = 'Error. Debes indicar en GAUSS si el registro se hace en Policía Nacional o Guardia Civil. Vivienda: %s' % (
            viajero.reserva.vivienda.nombre)
        envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                               texto=gtexto)
    elif log == 'Error4':
        asunto = 'Error con registro de viajero en GAUSS'
        gtexto = 'Error durante el grabado del viajero. Hacer el registro manualmente. Viajero: %s %s (%s)' % (
            viajero.nombre, viajero.apellido1, vivienda.nombre)
        envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                               texto=gtexto)
    else:
        asunto = 'Error en registro VUT'
        envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                               texto=asunto)
    etiqueta = 'error-vut%s' % ronda.id
    encolar_mensaje(emisor=emisor,
                    receptores=receptores,
                    asunto=asunto,
                    html=html,
                    etiqueta=etiqueta)
    logger.info(asunto)
    return True
예제 #2
0
def comunica_viajero2PNGC():
    registros = RegistroPolicia.objects.filter(enviado=False)[:5]
    for registro in registros:
        sleep(1)
        registro.enviado = True  # Esto evitará que se ejecute de nuevo el reenvío del registro
        registro.save()
        viajero = registro.viajero
        vivienda = registro.viajero.reserva.vivienda
        logger.info("1")
        if type(viajero) is not Viajero:
            gtexto = 'Error durante el proceso de registro. No existe viajero'
            envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                   texto=gtexto)
            return False
        if viajero.fichero_policia:
            gtexto = 'Se ha tratado de registrar un mismo viajero varias veces. Viajero: %s %s (%s)' % (
                viajero.nombre, viajero.apellido1,
                viajero.reserva.vivienda.nombre)
            envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                   texto=gtexto)
            return False
        if not viajero.observaciones:
            viajero.observaciones = ''
            viajero.save()
        try:
            if vivienda.police == 'GC':
                fichero = open(RUTA_BASE + registro.parte.url)
                logger.info("4")
                url = 'https://%s:%[email protected]/hospederias/servlet/ControlRecepcionFichero' % (
                    vivienda.police_code, vivienda.police_pass)
                try:
                    r = requests.post(url,
                                      files={'fichero': fichero},
                                      data={},
                                      verify=False,
                                      timeout=5)
                except:
                    gtexto = 'Error al tratar de enviar el fichero de datos a la Guardia Civil. Viajero: %s %s (%s)' % (
                        viajero.nombre, viajero.apellido1,
                        viajero.reserva.vivienda.nombre)
                    envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                           texto=gtexto)
                    return False
                if r.status_code == 200:
                    if 'Errores' in r.text:
                        gauser_autorizados = Autorizado.objects.filter(
                            vivienda=vivienda).values_list('gauser__id',
                                                           flat=True)
                        receptores = Gauser.objects.filter(
                            Q(id__in=gauser_autorizados)
                            | Q(id__in=vivienda.propietarios.all()))
                        mensaje = '<p>En el registro de %s, reserva %s</p><p>La Guardia Civil dice:</p>%s' % (
                            viajero.nombre_completo, viajero.reserva,
                            r.text.replace('\r\n', '<br>'))
                        viajero.observaciones += mensaje
                        emisor = Gauser_extra.objects.get(
                            gauser=vivienda.propietarios.all()[0],
                            ronda=vivienda.entidad.ronda)
                        encolar_mensaje(
                            emisor=emisor,
                            receptores=receptores,
                            asunto='Error en comunicación a la Guardia Civil',
                            html=mensaje,
                            etiqueta='guardia_civl%s' % vivienda.id)
                        gtexto = 'Error con registro en Guardia Civil del viajero: %s %s (%s)' % (
                            viajero.nombre, viajero.apellido1,
                            viajero.reserva.vivienda.nombre)
                        envia_telegram_gausers(
                            gausers=vivienda.propietarios.all(), texto=gtexto)
                    else:
                        viajero.fichero_policia = True
                        mensaje = '<p>En el registro de %s, reserva %s</p><p>La Guardia Civil dice:</p>%s' % (
                            viajero.nombre_completo, viajero.reserva,
                            r.text.replace('\r\n', '<br>'))
                        viajero.observaciones += mensaje
                        emisor = Gauser_extra.objects.get(
                            gauser=vivienda.propietarios.all()[0],
                            ronda=vivienda.entidad.ronda)
                        encolar_mensaje(
                            emisor=emisor,
                            receptores=[vivienda.propietarios.all()],
                            asunto='Comunicación a la Guardia Civil',
                            html=mensaje,
                            etiqueta='guardia_civl%s' % vivienda.id)
                        gtexto = 'Registrado en Guardia Civil el viajero: %s %s (%s)' % (
                            viajero.nombre, viajero.apellido1,
                            viajero.reserva.vivienda.nombre)
                        envia_telegram_gausers(
                            gausers=vivienda.propietarios.all(), texto=gtexto)
                    viajero.save()
                    fichero.close()
                    return True
                else:
                    gauser_autorizados = Autorizado.objects.filter(
                        vivienda=vivienda).values_list('gauser__id', flat=True)
                    receptores = Gauser.objects.filter(
                        id__in=gauser_autorizados)
                    mensaje = '<p>No se ha podido establecer comunicación con la Guardia Civil.</p>'
                    viajero.observaciones += mensaje
                    emisor = Gauser_extra.objects.get(
                        gauser=vivienda.propietarios.all()[0],
                        ronda=vivienda.entidad.ronda)
                    encolar_mensaje(
                        emisor=emisor,
                        receptores=receptores,
                        asunto='Error en comunicación a la Guardia Civil',
                        html=mensaje,
                        etiqueta='guardia_civl%s' % vivienda.id)
                    gtexto = 'Error con registro en Guardia Civil del viajero: %s %s (%s)' % (
                        viajero.nombre, viajero.apellido1,
                        viajero.reserva.vivienda.nombre)
                    envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                           texto=gtexto)
                    viajero.save()
                    fichero.close()
                    return False
            elif vivienda.police == 'PN':
                logger.info("entra al registro PN. Viajero: %s" % viajero)
                # RegistraViajeroPN(viajero)
                # enviar_mensaje_registro(viajero, log='Correcto')
                # return True
                # Iniciamos una sesión
                s = requests.Session()
                s.verify = False  # Para que los certificados ssl no sean verificados. Comunicación https confiada
                # Accedemos a la página de inicio y de la respuesta capturamos el token csrf
                try:
                    p1 = s.get('https://webpol.policia.es/e-hotel/', timeout=5)
                except:
                    gtexto = 'Error al tratar de acceder a la web de la Policía Nacional. Viajero: %s %s (%s)' % (
                        viajero.nombre, viajero.apellido1,
                        viajero.reserva.vivienda.nombre)
                    envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                           texto=gtexto)
                    return False
                # Escribimos las cookies en una cadena de texto, para introducirlas en las distintas cabeceras
                cookies_header = ''
                for c in dict(s.cookies):
                    cookies_header += '%s=%s;' % (c, dict(s.cookies)[c])
                # Debemos salvar el token csrf de la sesión, que utilizaremos en los diferentes enlaces
                soup1 = BeautifulSoup(p1.content.decode(p1.encoding),
                                      'html.parser')
                csrf_token = soup1.find('input', {'name': '_csrf'})['value']
                # El siguiente paso que da el sistema es la obtención de etiquetas de su sistema "ARGOS"
                obtener_etiquetas_url = 'https://webpol.policia.es/e-hotel/obtenerEtiquetas'
                obtener_etiquetas_headers = {
                    'Accept': 'application/json, text/javascript, */*; q=0.01',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                    'Ajax-Referer': '/e-hotel/obtenerEtiquetas',
                    'Connection': 'keep-alive',
                    'Content-Length': '0',
                    'Content-Type':
                    'application/x-www-form-urlencoded; charset=UTF-8',
                    'Cookie': cookies_header,
                    'Host': 'webpol.policia.es',
                    'Referer': 'https://webpol.policia.es/e-hotel/',
                    'User-Agent': 'python-requests/2.21.0',
                    'X-CSRF-TOKEN': csrf_token,
                    'X-Requested-With': 'XMLHttpRequest'
                }
                try:
                    p11 = s.post(obtener_etiquetas_url,
                                 headers=obtener_etiquetas_headers,
                                 timeout=5)
                except:
                    gtexto = 'Error durante la obtención de etiquetas en la Policía Nacional. Viajero: %s %s (%s)' % (
                        viajero.nombre, viajero.apellido1,
                        viajero.reserva.vivienda.nombre)
                    envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                           texto=gtexto)
                    return False
                # Cargamos los valores de los inputs demandados para hacer el login y enviamos el post con el payload
                # En este caso enviamos: headers, cookies y parámetros (payload)
                payload = {
                    'username': vivienda.police_code,
                    '_csrf': csrf_token,
                    'password': vivienda.police_pass
                }
                execute_login_headers = {
                    'Accept':
                    'text/html,  application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                    'Connection': 'keep-alive',
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Cookie': cookies_header,
                    'Host': 'webpol.policia.es',
                    'Referer': 'https://webpol.policia.es/e-hotel/',
                    'Upgrade-Insecure-Requests': '1',
                    'User-Agent': 'python-requests/2.21.0'
                }
                try:
                    p2 = s.post(
                        'https://webpol.policia.es/e-hotel/execute_login',
                        data=payload,
                        headers=execute_login_headers,
                        timeout=5)
                except:
                    gtexto = 'Error durante el proceso de login en la Policía Nacional. Viajero: %s %s (%s)' % (
                        viajero.nombre, viajero.apellido1,
                        viajero.reserva.vivienda.nombre)
                    envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                           texto=gtexto)
                    return False
                # A continuación hacemos una petición GET a inicio sin ningún parámetro
                execute_inicio_headers = {
                    'Accept':
                    'text/html,  application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                    'Connection': 'keep-alive',
                    'Cookie': cookies_header,
                    'Host': 'webpol.policia.es',
                    'Referer': 'https://webpol.policia.es/e-hotel/',
                    'Upgrade-Insecure-Requests': '1',
                    'User-Agent': 'python-requests/2.21.0'
                }
                try:
                    p21 = s.get('https://webpol.policia.es/e-hotel/inicio',
                                headers=execute_inicio_headers,
                                cookies=dict(s.cookies),
                                timeout=5)
                except:
                    gtexto = 'Error tras el proceso de login en la Policía Nacional. Viajero: %s %s (%s)' % (
                        viajero.nombre, viajero.apellido1,
                        viajero.reserva.vivienda.nombre)
                    envia_telegram_gausers(gausers=vivienda.propietarios.all(),
                                           texto=gtexto)
                    return False
                # Hacemos una comprabción para asegurarnos de que se ha accedido correctamente a la webpol.
                # Si la respuesta es correcta la respuesta contendrá el usuario:
                if vivienda.police_code in p21.content.decode(p2.encoding):
                    # El siguiente paso es obtener etiquetas. Esta es una solicitud POST sin payload
                    # obtener_etiquetas_url = 'https://webpol.policia.es/e-hotel/obtenerEtiquetas'
                    # obtener_etiquetas_headers = {'Accept': 'application/json, text/javascript, */*; q=0.01',
                    #                              'Accept-Encoding': 'gzip, deflate, br',
                    #                              'Accept-Language': 'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                    #                              'Ajax-Referer': '/e-hotel/obtenerEtiquetas',
                    #                              'Connection': 'keep-alive',
                    #                              'Content-Length': '0',
                    #                              'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                    #                              'Cookie': cookies_header, 'Host': 'webpol.policia.es',
                    #                              'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                    #                              'User-Agent': 'python-requests/2.21.0',
                    #                              'X-CSRF-TOKEN': '92a4cc08-b50b-4be3-8a98-8adf8bb1db2e',
                    #                              'X-Requested-With': 'XMLHttpRequest'}
                    # try:
                    #     p22 = s.post(obtener_etiquetas_url, headers=obtener_etiquetas_headers, cookies=dict(s.cookies),
                    #                  timeout=5)
                    # except:
                    #     return False
                    # A continuación debemos ir a la grabación manual. Antes se hace una llamada para limpiar la sesión
                    limpiar_sesion_temporal_url = 'https://webpol.policia.es/e-hotel/limpiarSesionTemporal'
                    limpiar_sesion_temporal_headers = {
                        'Accept':
                        'application/json, text/javascript, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Ajax-Referer': '/e-hotel/limpiarSesionTemporal',
                        'Connection': 'keep-alive',
                        'Content-Length': '0',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    try:
                        p23 = s.post(limpiar_sesion_temporal_url,
                                     headers=limpiar_sesion_temporal_headers,
                                     timeout=5)
                    except:
                        gtexto = 'Error durante el proceso de envío de los datos del huésped. Viajero: %s %s (%s)' % (
                            viajero.nombre, viajero.apellido1,
                            viajero.reserva.vivienda.nombre)
                        envia_telegram_gausers(
                            gausers=vivienda.propietarios.all(), texto=gtexto)
                        return False
                    # Ahora es cuando se hace otra petición POST para llegar a la grabación manual sin payload
                    logger.info("5")
                    grabador_manual_url = 'https://webpol.policia.es/e-hotel/hospederia/manual/vista/grabadorManual'
                    grabador_manual_headers = {
                        'Accept': 'text/html, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Ajax-Referer':
                        '/e-hotel/hospederia/manual/vista/grabadorManual',
                        'Connection': 'keep-alive',
                        'Content-Length': '0',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    try:
                        p3 = s.post(grabador_manual_url,
                                    headers=grabador_manual_headers,
                                    timeout=5)
                        logger.info("Entrada en grabador manual")
                        sleep(10)
                    except:
                        logger.info("Error al entrar en grabador manual")
                        gtexto = 'Error al entrar en el grabador manual de la Policía Nacional. Viajero: %s %s (%s)' % (
                            viajero.nombre, viajero.apellido1,
                            viajero.reserva.vivienda.nombre)
                        envia_telegram_gausers(
                            gausers=vivienda.propietarios.all(), texto=gtexto)
                        return False
                    # En esta petición nos han devuelto el id de la hospedería. Lo tenemos que guardar:
                    soup3 = BeautifulSoup(p3.content.decode(p3.encoding),
                                          'html.parser')
                    idHospederia = soup3.find('input',
                                              {'id': 'idHospederia'})['value']
                    logger.info('idHospederia %s' % idHospederia)
                    # Pasamos a rellenar el parte del viajero. Necesitamos algunos campos como sexoStr o tipoDocumentoStr.
                    # En el caso de sexoStr debemos asignar el texto MASCULINO o FEMENINO, que es diferente de
                    # get_sexo_display() y por eso definimos el siguiente diccionario.
                    sexo = {'M': 'MASCULINO', 'F': 'FEMENINO'}
                    data_viajero = {
                        'nombre':
                        viajero.nombre,
                        'apellido1':
                        viajero.apellido1,
                        'apellido2':
                        viajero.apellido2,
                        'nacionalidad':
                        viajero.pais,
                        'tipoDocumento':
                        viajero.tipo_ndi,
                        'numIdentificacion':
                        viajero.ndi,
                        'fechaExpedicionDoc':
                        viajero.fecha_exp.strftime('%d/%m/%Y'),
                        'dia':
                        '%s' % viajero.nacimiento.day,
                        'mes':
                        '%s' % viajero.nacimiento.month,
                        'ano':
                        '%s' % viajero.nacimiento.year,
                        'idHospederia':
                        idHospederia,
                        'fechaEntrada':
                        viajero.fecha_entrada.strftime('%d/%m/%Y'),
                        'sexo':
                        viajero.sexo,
                        'fechaNacimiento':
                        viajero.nacimiento.strftime('%d/%m/%Y'),
                        '_csrf':
                        csrf_token,
                        'jsonHiddenComunes':
                        '',
                        'nacionalidadStr':
                        viajero.get_pais_display().encode('utf-8'),
                        'sexoStr':
                        sexo[viajero.sexo],
                        'tipoDocumentoStr':
                        viajero.get_tipo_ndi_display()
                    }
                    logger.info("Definido data_viajero")
                    huesped_url = 'https://webpol.policia.es/e-hotel/hospederia/manual/insertar/huesped'
                    huesped_headers = {
                        'Accept': 'text/html, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Ajax-Referer':
                        '/e-hotel/hospederia/manual/insertar/huesped',
                        'Connection': 'keep-alive',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    logger.info("Definido huesped_headers")
                    try:
                        p4 = s.post(huesped_url,
                                    data=data_viajero,
                                    headers=huesped_headers,
                                    timeout=5)
                        logger.info("Enviados datos del huesped")
                        sleep(4)
                    except:
                        logger.info("Error al enviar datos del huesped")
                        gtexto = 'Error al enviar los datos del huésped. Viajero: %s %s (%s)' % (
                            viajero.nombre, viajero.apellido1,
                            viajero.reserva.vivienda.nombre)
                        envia_telegram_gausers(
                            gausers=vivienda.propietarios.all(), texto=gtexto)
                        return False
                    # En esta petición nos devuelven datos que no vamos a necesitar, pero que almacenamos para guarar en
                    # la información del registro.
                    soup4 = BeautifulSoup(p4.content.decode(p4.encoding),
                                          'html.parser')
                    logger.info("Se ha recibido respuesta de la policia")
                    mensaje = soup4.find('em')
                    logger.info("Parseado mensaje de correcto o incorrecto")
                    huespedJson = soup4.find('input',
                                             {'name': 'huespedJson'})['value']
                    logger.info("Parseado huespedJson")
                    idHuesped = soup4.find('input',
                                           {'name': 'idHuesped'})['value']
                    logger.info("Parseado idHuesped")
                    viajero.observaciones += "Mensaje de la Policía: %s<br>idHuesped: %s<br>idHospederia: %s" % (
                        mensaje, idHuesped, idHospederia)
                    logger.info("Se han grabado las observaciones")
                    # Para completar la grabación es necesario llamar a parteViajero a través de una petición GET:
                    parte_viajero_url = 'https://webpol.policia.es/e-hotel/hospederia/manual/vista/parteViajero'
                    parte_viajero_headers = {
                        'Accept': 'text/html, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Ajax-Referer':
                        '/e-hotel/hospederia/manual/insertar/huesped',
                        'Connection': 'keep-alive',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    try:
                        p5 = s.get(parte_viajero_url,
                                   headers=parte_viajero_headers,
                                   cookies=dict(s.cookies),
                                   timeout=5)
                        logger.info("Enviado GET a parteViajero")
                        sleep(4)
                    except:
                        logger.info("Error al procesar parteViajero")
                    # En siguiente paso dado a través de un navegador es llamar a tipoDocumentoNacionalidad con una
                    # petición POST enviando como parámetro la "nacionalidad":
                    nacionalidad_url = 'https://webpol.policia.es/e-hotel/combo/tipoDocumentoNacionalidad'
                    nacionalidad_headers = {
                        'Accept': 'text/html, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Ajax-Referer':
                        '/e-hotel/combo/tipoDocumentoNacionalidad',
                        'Connection': 'keep-alive',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    payload = {'nacionalidad': viajero.pais}
                    try:
                        p6 = s.post(nacionalidad_url,
                                    headers=nacionalidad_headers,
                                    cookies=dict(s.cookies),
                                    data=payload,
                                    timeout=5)
                        logger.info("Enviado POST a tipoDocumentoNacionalidad")
                    except:
                        logger.info(
                            "Error al enviar POST a tipoDocumentoNacionalidad")

                    generar_parte_url = 'https://webpol.policia.es/e-hotel/hospederia/generarParteHuesped'
                    generar_parte_headers = {
                        'Accept': 'text/html, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Ajax-Referer':
                        '/e-hotel/hospederia/generarParteHuesped',
                        'Connection': 'keep-alive',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    payload = {
                        'huespedJson': huespedJson,
                        'idHuesped': idHuesped
                    }

                    try:
                        p7 = s.post(generar_parte_url,
                                    headers=generar_parte_headers,
                                    data=payload,
                                    timeout=5)
                        logger.info("Solicitud generar PDF")
                    except:
                        logger.info("Error al solicitar generar PDF")

                    previsualiza_url = 'https://webpol.policia.es/e-hotel/previsualizacionPdf/'
                    previsualiza_headers = {
                        'Accept': 'text/html, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Ajax-Referer':
                        '/e-hotel/hospederia/generarParteHuesped',
                        'Connection': 'keep-alive',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    try:
                        p8 = s.get(previsualiza_url,
                                   headers=previsualiza_headers,
                                   timeout=5)
                        logger.info("Solicitud previsualizar PDF")
                    except:
                        logger.info("Error al solicitar previsualizar PDF")

                    genera_url = 'https://webpol.policia.es/e-hotel/hospederia/generarPDFparteHuesped'
                    genera_headers = {
                        'Accept': 'text/html, */*; q=0.01',
                        'Accept-Encoding': 'gzip, deflate, br',
                        'Accept-Language':
                        'es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
                        'Connection': 'keep-alive',
                        'Content-Type':
                        'application/x-www-form-urlencoded; charset=UTF-8',
                        'Cookie': cookies_header,
                        'Host': 'webpol.policia.es',
                        'Referer': 'https://webpol.policia.es/e-hotel/inicio',
                        'User-Agent': 'python-requests/2.21.0',
                        'X-CSRF-TOKEN': csrf_token,
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    try:
                        p9 = s.get(genera_url,
                                   headers=genera_headers,
                                   timeout=5)
                        fPN = ContentFile(p9.content)
                        fPN.name = '%s.pdf' % viajero.id
                        registro.pdf_PN = fPN
                        registro.save()
                        logger.info("Solicitud generar parte PDF ejecutada")
                    except:
                        logger.info("Error al solicitar generar parte PDF")
                    # En este punto termina el proceso de grabación
                    if p4.status_code == 200:
                        logger.info('Todo correcto celery')
                        s.close()
                        viajero.fichero_policia = True
                        viajero.observaciones += '<br><span style="color:green;">Registro finalizado con todas las comunicaciones correctas.</span>'
                        viajero.observaciones += '<hr>Información JSON: <br> %s' % huespedJson
                        viajero.save()
                        enviar_mensaje_registro(viajero, log='Correcto')
                        # emisor = Gauser_extra.objects.get(gauser=vivienda.propietarios.all()[0],
                        #                                   ronda=vivienda.entidad.ronda)
                        # gtexto = 'Registrado en Policía el viajero: %s %s (%s)' % (
                        #     viajero.nombre, viajero.apellido1, viajero.reserva.vivienda.nombre)
                        # envia_telegram_gausers(gausers=vivienda.propietarios.all(), texto=gtexto)
                        return True
                    else:
                        logger.info(
                            'Error durante el grabado del viajero. Hacer el registro manualmente.'
                        )
                        viajero.observaciones += '<br><span style="color:red;">Error durante el grabado del viajero. Hacer el registro manualmente.</span>'
                        viajero.save()
                        s.close()
                        logger.info('Error4')
                        enviar_mensaje_registro(viajero, log='Error4')
                        # emisor = Gauser_extra.objects.get(gauser=vivienda.propietarios.all()[0],
                        #                                   ronda=vivienda.entidad.ronda)
                        # gtexto = 'Error durante el grabado del viajero. Hacer el registro manualmente. Viajero: %s %s (%s)' % (
                        #     viajero.nombre, viajero.apellido1, viajero.reserva.vivienda.nombre)
                        # envia_telegram_gausers(gausers=vivienda.propietarios.all(), texto=gtexto)
                        return p4
                else:
                    # 'Error al hacer el login en webpol para el viajero: %s' % (viajero)
                    logger.info('Error2 %s' % viajero)
                    viajero.observaciones += 'Error al hacer el login en webpol para el viajero'
                    viajero.save()
                    s.close()
                    enviar_mensaje_registro(viajero, log='Error2')
                    # gtexto = 'Error al hacer el login en la web de la Policía Nacional. Viajero: %s %s (%s)' % (
                    #     viajero.nombre, viajero.apellido1, viajero.reserva.vivienda.nombre)
                    # envia_telegram_gausers(gausers=vivienda.propietarios.all(), texto=gtexto)
            else:
                logger.info('Error3')
                enviar_mensaje_registro(viajero, log='Error3')
                # gtexto = 'Error. Debes indicar en GAUSS si el registro se hace en Policía Nacional o Guardia Civil. Vivienda: %s' % (
                #     viajero.reserva.vivienda.nombre)
                # envia_telegram_gausers(gausers=vivienda.propietarios.all(), texto=gtexto)
                return False
        except:
            logger.info('Error1')
            enviar_mensaje_registro(viajero, log='Error1')
            # mensaje = 'Error en la comunicación con Policía/Guardia Civil. Se debe hacer el registro manualmente.'
            # ronda = viajero.reserva.vivienda.entidad.ronda
            # permiso = Permiso.objects.get(code_nombre='recibe_errores_de_viajeros')
            # receptores_ge = Gauser_extra.objects.filter(ronda=ronda, permisos__in=[permiso])
            # receptores = Gauser.objects.filter(id__in=receptores_ge.values_list('gauser__id', flat=True))
            # emisor = Gauser_extra.objects.get(gauser=vivienda.propietarios.all()[0], ronda=vivienda.entidad.ronda)
            # encolar_mensaje(emisor=emisor, receptores=receptores,
            #                 asunto='Error en Registro Policia', html=mensaje, etiqueta='error%s' % ronda.id)
            # gtexto = 'Error en la comunicación con Policía/Guardia Civil. Se debe hacer el registro manualmente. Viajero: %s %s (%s)' % (
            #     viajero.nombre, viajero.apellido1, viajero.reserva.vivienda.nombre)
            # envia_telegram_gausers(gausers=vivienda.propietarios.all(), texto=gtexto)
            return False
예제 #3
0
def sancionar_conductas(request):
    g_e = request.session['gauser_extra']

    inf_actual = None
    if request.method == 'POST' and not request.is_ajax():
        if request.POST['action'] == 'genera_pdf':
            doc_ie = 'Configuración de informes sancionadores de alumnos'
            dce = get_dce(entidad=g_e.ronda.entidad, nombre=doc_ie)
            informe = Informe_sancionador.objects.get(
                sancionado__ronda=g_e.ronda, id=request.POST['inf_actual'])
            coherente, mensaje = informe.is_coherente
            if coherente:
                if informe.fichero:
                    os.remove(informe.fichero.path)
                listar_conductas, informes, expulsiones = False, None, None
                if 'listar_conductas' in request.POST:
                    listar_conductas = True
                    informes = Informe_sancionador.objects.filter(
                        sancionado=informe.sancionado)
                    sanciones_expulsion = Sancion.objects.filter(
                        entidad=g_e.ronda.entidad, expulsion=True)
                    expulsiones = informes.filter(
                        sanciones__in=sanciones_expulsion)
                # Código para enviar correo
                asunto = render_to_string(
                    'informe_sancionador_mail_asunto.html',
                    {'informe': informe})
                texto = render_to_string('informe_sancionador_mail.html',
                                         {'informe': informe})
                permisos = ['recibe_mensajes_aviso_informes_sancionadores']
                cargos = Cargo.objects.filter(
                    permisos__code_nombre__in=permisos,
                    entidad=g_e.ronda.entidad).distinct()
                try:
                    tutor = informe.sancionado.gauser_extra_estudios.tutor.id
                    q = Q(permisos__code_nombre__in=permisos) | Q(
                        cargos__in=cargos) | Q(id=tutor)
                except:
                    q = Q(permisos__code_nombre__in=permisos) | Q(
                        cargos__in=cargos)
                receptores = Gauser_extra.objects.filter(
                    Q(activo=True), Q(ronda=g_e.ronda),
                    q).values_list('gauser__id', flat=True).distinct()
                try:
                    # Comprobamos si un mensaje igual se ha mandado ya
                    Mensaje.objects.get(emisor=g_e,
                                        asunto=asunto,
                                        mensaje=texto)
                except:
                    mc = Mensaje_cola.objects.filter(mensaje__emisor=g_e,
                                                     mensaje__asunto=asunto,
                                                     enviado=False)
                    if mc.count() > 0:
                        mc[0].mensaje.delete()
                        mc.delete()
                    encolar_mensaje(emisor=g_e,
                                    receptores=receptores,
                                    asunto=asunto,
                                    html=texto,
                                    etiqueta='is%s' % informe.id)
                # Fin de código para enviar correo
                texto_html = render_to_string(
                    'is2pdf.html', {
                        'informe': informe,
                        'MEDIA_ANAGRAMAS': MEDIA_ANAGRAMAS,
                        'listar_conductas': listar_conductas,
                        'expulsiones': expulsiones,
                        'informes': informes
                    })
                nombre = '%s_%s.pdf' % (
                    slugify(informe.sancionado.gauser.get_full_name()),
                    timezone.localtime(
                        informe.created).strftime('%d-%m-%Y_%H%M'))
                url_pdf = MEDIA_CONVIVENCIA + '%s/%s' % (
                    g_e.ronda.entidad.code, nombre)
                pdfkit.from_string(texto_html, url_pdf, dce.get_opciones)
                fich = open(url_pdf, 'rb')
                informe.texto_html = texto_html
                nombre_fichero = 'convivencia/%s/%s' % (g_e.ronda.entidad.code,
                                                        nombre)
                informe.fichero.save(nombre_fichero, File(fich))
                fich.close()
                informe.save()
                response = HttpResponse(informe.fichero,
                                        content_type='application/pdf')
                response[
                    'Content-Disposition'] = 'attachment; filename=%s' % nombre
                return response
            else:
                inf_actual = informe
                crear_aviso(request, False, '<ul>%s</ul>' % mensaje)
        if request.POST['action'] == 'descargar_informe':
            informe = Informe_sancionador.objects.get(
                sancionado__ronda=g_e.ronda, id=request.POST['inf_descargar'])
            filename = informe.fichero.name.split('/')[-1]
            response = HttpResponse(informe.fichero,
                                    content_type='application/pdf')
            response[
                'Content-Disposition'] = 'attachment; filename=%s' % filename
            return response

    informes = Informe_sancionador.objects.filter(Q(sancionador=g_e),
                                                  ~Q(fichero=''))
    informes_como_tutor = Informe_sancionador.objects.filter(
        Q(sancionado__gauser_extra_estudios__tutor=g_e),
        ~Q(fichero='')).exclude(id__in=informes)
    respuesta = {
        'iconos': ({
            'tipo': 'button',
            'nombre': 'file-pdf-o',
            'texto': 'Generar',
            'title': 'Generar informe sancionador',
            'permiso': 'genera_informe_sancionador'
        }, ),
        'formname':
        'gestionar_conductas',
        'conductas':
        Conducta.objects.filter(entidad=g_e.ronda.entidad),
        'sanciones':
        Sancion.objects.filter(entidad=g_e.ronda.entidad),
        'informes':
        informes,
        'informes_como_tutor':
        informes_como_tutor,
        'inf_actual':
        inf_actual,
        'avisos':
        Aviso.objects.filter(usuario=g_e, aceptado=False),
    }
    return render(request, "sancionar_conductas.html", respuesta)
예제 #4
0
파일: views.py 프로젝트: jjmartinr01/gauss3
def ajax_informe_seguimiento(request):
    g_e = request.session['gauser_extra']
    if request.is_ajax():
        logger.info('%s, %s' % (g_e, request.POST['action']))
        if request.POST['action'] == 'buscar_usuarios_destino':
            q = request.POST['q'].split()
            Q_total = Q(gauser__isnull=False)
            for texto in q:
                Q_parcial = Q(gauser__first_name__icontains=texto) | Q(
                    gauser__last_name__icontains=texto)
                Q_total = Q_total & Q_parcial
            # sub_docentes = Subentidad.objects.get(entidad=g_e.ronda.entidad, clave_ex='docente')
            # usuarios = usuarios_de_gauss(g_e.ronda.entidad, subentidades=[sub_docentes])
            cargo = Cargo.objects.get(entidad=g_e.ronda.entidad,
                                      clave_cargo='g_docente')
            usuarios = Gauser_extra.objects.filter(ronda=g_e.ronda,
                                                   cargos__in=[cargo])
            filtrados = usuarios.filter(Q_total)
            options = []
            for u in filtrados:
                options.append({'id': u.id, 'text': u.gauser.get_full_name()})
            return JsonResponse(options, safe=False)
        elif request.POST['action'] == 'buscar_usuario':
            q = request.POST['q'].split()
            Q_total = Q(gauser__isnull=False)
            for texto in q:
                Q_parcial = Q(gauser__first_name__icontains=texto) | Q(
                    gauser__last_name__icontains=texto)
                Q_total = Q_total & Q_parcial & ~Q(
                    id__in=request.POST.getlist('ges_informes_abiertos[]'))
            sub_alumnos = Subentidad.objects.get(entidad=g_e.ronda.entidad,
                                                 clave_ex='alumnos')
            usuarios = usuarios_de_gauss(g_e.ronda.entidad,
                                         subentidades=[sub_alumnos])
            filtrados = usuarios.filter(Q_total)
            options = []
            for u in filtrados:
                try:
                    grupo_nombre = u.gauser_extra_estudios.grupo.nombre
                except:
                    grupo_nombre = 'Sin grupo asignado'
                options.append({
                    'id':
                    u.id,
                    'text':
                    u.gauser.get_full_name() + ' (' + grupo_nombre + ')'
                })
            return JsonResponse(options, safe=False)
        elif request.POST['action'] == 'get_informes_usuario':
            usuario = Gauser_extra.objects.get(ronda=g_e.ronda,
                                               id=request.POST['usuario'])
            informes = Informe_seguimiento.objects.filter(
                Q(usuario=usuario),
                ~Q(id__in=request.POST.getlist('ges_informes_cerrados[]')))
            # data = render_to_string('informes_seguimiento_accordion.html', {'informes': informes, 'g_e': g_e})
            # return JsonResponse({'html': data, 'ok': True, 'usuario_nombre': usuario.gauser.get_full_name()})

            # usuario = Gauser_extra.objects.get(ronda=g_e.ronda, id=request.POST['usuario'])
            # informes = Informe_tareas.objects.filter(Q(usuario=usuario),
            #                                          ~Q(id__in=request.POST.getlist('ges_informes_cerrados[]')))
            crea_informe = False
            ge_informes = []
            for i in informes:
                if g_e in i.usuarios_destino.all() or g_e.has_permiso(
                        've_informes_seguimiento'):
                    ge_informes.append(i)
            con_crea_informe1 = g_e in usuario.gauser_extra_estudios.grupo.tutores
            con_crea_informe2 = g_e in usuario.gauser_extra_estudios.grupo.cotutores
            con_crea_informe3 = g_e.has_permiso(
                'solicita_informes_seguimiento')
            if con_crea_informe1 or con_crea_informe2 or con_crea_informe3:
                crea_informe = True
            if len(ge_informes) > 0:
                data = render_to_string('informes_seguimiento_accordion.html',
                                        {
                                            'informes': ge_informes,
                                            'g_e': g_e
                                        })
            else:
                data = False
            return JsonResponse({
                'html':
                data,
                'ok':
                True,
                'usuario_nombre':
                usuario.gauser.get_full_name(),
                'crea_informe':
                crea_informe
            })
        elif request.POST['action'] == 'solicitar_informe':
            usuario = Gauser_extra.objects.get(ronda=g_e.ronda,
                                               id=request.POST['usuario_id'])
            if (g_e in usuario.gauser_extra_estudios.grupo.tutores
                ) or g_e.has_permiso('solicita_informes_seguimiento') or (
                    g_e in usuario.gauser_extra_estudios.grupo.cotutores):
                try:
                    informe = Informe_seguimiento.objects.get(
                        usuario=usuario, deadline__gte=date.today())
                    html = False
                except:
                    texto_solicitud = 'Hola, voy a tener una reunión para hablar de {0}. Por favor, responde a ' \
                                      'las siguientes preguntas'.format(usuario.gauser.get_full_name())
                    deadline = date.today() + timedelta(days=7)
                    informe = Informe_seguimiento.objects.create(
                        usuario=usuario,
                        solicitante=g_e,
                        deadline=deadline,
                        texto_solicitud=texto_solicitud,
                        fecha=datetime.today())
                    try:
                        grupo = usuario.gauser_extra_estudios.grupo
                        ges = set(grupo.sesion_set.all().values_list(
                            'g_e', flat=True))
                        informe.usuarios_destino.add(*ges)
                    except:
                        pass
                    html = render_to_string(
                        'informes_seguimiento_accordion.html', {
                            'informes': [informe],
                            'g_e': g_e
                        })
                return JsonResponse({
                    'html': html,
                    'ok': True,
                    'informe': informe.id
                })
            else:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'open_accordion':
            # sub_docentes = Subentidad.objects.get(entidad=g_e.ronda.entidad, clave_ex='docente')
            # docentes = usuarios_de_gauss(g_e.ronda.entidad, subentidades=[sub_docentes])
            cargo = Cargo.objects.get(entidad=g_e.ronda.entidad,
                                      clave_cargo='g_docente')
            docentes = Gauser_extra.objects.filter(ronda=g_e.ronda,
                                                   cargos__in=[cargo])
            informe = Informe_seguimiento.objects.get(
                usuario__ronda=g_e.ronda, id=request.POST['informe'])
            data = render_to_string(
                'informe_seguimiento_accordion_content.html', {
                    'informe': informe,
                    'g_e': g_e,
                    'docentes': docentes,
                    'preguntas': preguntas_base
                })
            return HttpResponse(data)
        elif request.POST['action'] == 'deadline':
            try:
                informe = Informe_seguimiento.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                informe.deadline = datetime.strptime(request.POST['deadline'],
                                                     '%d/%m/%Y').date()
                informe.save()
                estado = 'closed' if informe.deadline < date.today(
                ) else 'open'
                return JsonResponse({
                    'ok': True,
                    'estado': estado,
                    'inf': informe.id
                })
            except:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'del_informe_seguimiento':
            try:
                informe = Informe_seguimiento.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                informe.delete()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'del_participacion_informe_seguimiento':
            try:
                informe = Informe_seguimiento.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                informe.usuarios_destino.remove(g_e)
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'texto_solicitud':
            try:
                informe = Informe_seguimiento.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                informe.texto_solicitud = request.POST['texto']
                informe.save()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})
        elif request.POST[
                'action'] == 'mod_usuarios_destino' and g_e.has_permiso(
                    'solicita_informes_seguimiento'):
            informe = Informe_seguimiento.objects.get(
                usuario__ronda=g_e.ronda, id=request.POST['informe'])
            usuarios = Gauser_extra.objects.filter(
                ronda=g_e.ronda, id__in=request.POST.getlist('usuarios[]'))
            informe.usuarios_destino.clear()
            informe.usuarios_destino.add(*usuarios)
            return JsonResponse({
                'ok': True,
                'n': informe.usuarios_destino.all().count()
            })
        elif request.POST['action'] == 'aviso_informe_seguimiento':
            informe = Informe_seguimiento.objects.get(
                usuario__ronda=g_e.ronda, id=request.POST['informe'])
            asunto = render_to_string('informe_seguimiento_mail_asunto.html',
                                      {'informe': informe})
            texto = render_to_string('informe_seguimiento_mail.html',
                                     {'informe': informe})
            receptores = []
            for ge in informe.usuarios_destino.all():
                if ge.respuesta_set.filter(pregunta__informe=informe).count(
                ) != informe.pregunta_set.all().count():
                    Aviso.objects.create(usuario=ge,
                                         aviso=texto,
                                         fecha=datetime.now(),
                                         aceptado=False,
                                         link='/informes_seguimiento')
                    receptores.append(ge.gauser)
            encolar_mensaje(emisor=g_e,
                            receptores=receptores,
                            asunto=asunto,
                            html=texto)
            return JsonResponse({'ok': True})
        elif request.POST[
                'action'] == 'add_pregunta_informe' and g_e.has_permiso(
                    'solicita_informes_seguimiento'):
            informe = Informe_seguimiento.objects.get(
                usuario__ronda=g_e.ronda, id=request.POST['informe'])
            n = request.POST['n']
            if n == 'nueva':
                p = Pregunta.objects.create(informe=informe, pregunta='')
            else:
                p = Pregunta.objects.create(informe=informe,
                                            pregunta=preguntas_base[int(n)])
            html = render_to_string(
                'informe_seguimiento_accordion_content_pregunta.html', {
                    'pregunta': p,
                    'g_e': g_e
                })
            return JsonResponse({'ok': True, 'html': html})
        elif request.POST['action'] == 'delete_pregunta':
            ok = False
            try:
                pregunta = Pregunta.objects.get(
                    informe__usuario__ronda=g_e.ronda,
                    id=request.POST['pregunta'])
                pregunta_id = pregunta.id
                informe = pregunta.informe
                if g_e.has_permiso('borra_preguntas_informes_seguimiento'
                                   ) or pregunta.informe.solicitante == g_e:
                    pregunta.delete()
                    ok = True
                n_preguntas = informe.pregunta_set.all().count()
                return JsonResponse({
                    'pregunta': pregunta_id,
                    'n_preguntas': n_preguntas,
                    'ok': ok
                })
            except:
                return JsonResponse({'ok': ok})
        elif request.POST['action'] == 'pregunta':
            try:
                informe = Informe_seguimiento.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                pregunta = Pregunta.objects.get(informe=informe,
                                                id=request.POST['pregunta'])
                pregunta.pregunta = request.POST['texto']
                pregunta.save()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'respuesta_a_pregunta':
            try:
                informe = Informe_seguimiento.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                responde = Gauser_extra.objects.get(ronda=g_e.ronda,
                                                    id=request.POST['ge'])
                pregunta = Pregunta.objects.get(informe=informe,
                                                id=request.POST['pregunta'])
                try:
                    respuesta, c = Respuesta.objects.get_or_create(
                        informe=informe, usuario=responde, pregunta=pregunta)
                except:
                    Respuesta.objects.filter(informe=informe,
                                             usuario=responde,
                                             pregunta=pregunta).delete()
                    respuesta = Respuesta.objects.create(informe=informe,
                                                         usuario=responde,
                                                         pregunta=pregunta)
                respuesta.respuesta = request.POST['respuesta']
                respuesta.save()
                return JsonResponse({
                    'ok': True,
                    'n': informe.num_usuarios_respondido
                })
            except:
                return JsonResponse({'ok': False})
        else:
            logger.info(u'%s, acción no permitida' % (g_e))
            return HttpResponse(False)

    else:
        return HttpResponse(status=400)
예제 #5
0
파일: views.py 프로젝트: jjmartinr01/gauss3
def ajax_informe_tareas(request):
    g_e = request.session['gauser_extra']
    if request.is_ajax():
        logger.info('%s, %s' % (g_e, request.POST['action']))
        if request.POST['action'] == 'buscar_usuarios_destino':
            q = request.POST['q'].split()
            Q_total = Q(gauser__isnull=False)
            for texto in q:
                Q_parcial = Q(gauser__first_name__icontains=texto) | Q(
                    gauser__last_name__icontains=texto)
                Q_total = Q_total & Q_parcial
            # sub_docentes = Subentidad.objects.get(entidad=g_e.ronda.entidad, clave_ex='docente')
            # usuarios = usuarios_de_gauss(g_e.ronda.entidad, subentidades=[sub_docentes])
            cargo = Cargo.objects.get(entidad=g_e.ronda.entidad,
                                      clave_cargo='g_docente')
            usuarios = Gauser_extra.objects.filter(ronda=g_e.ronda,
                                                   cargos__in=[cargo])
            filtrados = usuarios.filter(Q_total)
            options = []
            for u in filtrados:
                options.append({'id': u.id, 'text': u.gauser.get_full_name()})
            return JsonResponse(options, safe=False)
        elif request.POST['action'] == 'buscar_usuario':
            q = request.POST['q'].split()
            Q_total = Q(gauser__isnull=False)
            for texto in q:
                Q_parcial = Q(gauser__first_name__icontains=texto) | Q(
                    gauser__last_name__icontains=texto)
                Q_total = Q_total & Q_parcial & ~Q(
                    id__in=request.POST.getlist('ges_informes_abiertos[]'))
            sub_alumnos = Subentidad.objects.get(entidad=g_e.ronda.entidad,
                                                 clave_ex='alumnos')
            usuarios = usuarios_de_gauss(g_e.ronda.entidad,
                                         subentidades=[sub_alumnos])
            filtrados = usuarios.filter(Q_total)
            options = []
            for u in filtrados:
                try:
                    grupo_nombre = u.gauser_extra_estudios.grupo.nombre
                except:
                    grupo_nombre = 'Sin grupo asignado'
                options.append({
                    'id':
                    u.id,
                    'text':
                    u.gauser.get_full_name() + ' (' + grupo_nombre + ')'
                })
            return JsonResponse(options, safe=False)
        elif request.POST['action'] == 'get_informes_usuario':
            usuario = Gauser_extra.objects.get(ronda=g_e.ronda,
                                               id=request.POST['usuario'])
            informes = Informe_tareas.objects.filter(
                Q(usuario=usuario),
                ~Q(id__in=request.POST.getlist('ges_informes_cerrados[]')))
            crea_informe = False
            ge_informes = []
            for i in informes:
                if g_e in i.usuarios_destino.all() or g_e.has_permiso(
                        've_informes_tareas'):
                    ge_informes.append(i)
            if (g_e in usuario.gauser_extra_estudios.grupo.tutores) or (
                    g_e in usuario.gauser_extra_estudios.grupo.cotutores
            ) or g_e.has_permiso('solicita_informes_tareas'):
                crea_informe = True
            if len(ge_informes) > 0:
                data = render_to_string('informes_tareas_accordion.html', {
                    'informes': ge_informes,
                    'g_e': g_e
                })
            else:
                data = False
            return JsonResponse({
                'html':
                data,
                'ok':
                True,
                'usuario_nombre':
                usuario.gauser.get_full_name(),
                'crea_informe':
                crea_informe
            })

        elif request.POST['action'] == 'solicitar_informe':
            usuario = Gauser_extra.objects.get(ronda=g_e.ronda,
                                               id=request.POST['usuario_id'])
            if (g_e in usuario.gauser_extra_estudios.grupo.tutores
                ) or g_e.has_permiso('solicita_informes_tareas') or (
                    g_e in usuario.gauser_extra_estudios.grupo.cotutores):
                try:
                    informe = Informe_tareas.objects.get(
                        usuario=usuario, deadline__gte=date.today())
                    html = False
                except:
                    t = 'el alumno' if usuario.gauser.sexo == 'H' else 'la alumna'
                    texto_solicitud = 'Hola, {0} {1} ... '.format(
                        t, usuario.gauser.get_full_name())
                    deadline = date.today() + timedelta(days=7)
                    informe = Informe_tareas.objects.create(
                        usuario=usuario,
                        solicitante=g_e,
                        fecha=datetime.today(),
                        texto_solicitud=texto_solicitud,
                        deadline=deadline)
                    try:
                        grupo = usuario.gauser_extra_estudios.grupo
                        ges = set(grupo.sesion_set.all().values_list(
                            'g_e', flat=True))
                        informe.usuarios_destino.add(*ges)
                    except:
                        pass
                    html = render_to_string('informes_tareas_accordion.html', {
                        'informes': [informe],
                        'g_e': g_e
                    })
                return JsonResponse({
                    'html': html,
                    'ok': True,
                    'informe': informe.id
                })
            else:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'open_accordion':
            informe = Informe_tareas.objects.get(usuario__ronda=g_e.ronda,
                                                 id=request.POST['informe'])
            data = render_to_string('informe_tareas_accordion_content.html', {
                'informe': informe,
                'g_e': g_e
            })
            return HttpResponse(data)
        elif request.POST['action'] == 'deadline':
            try:
                informe = Informe_tareas.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                informe.deadline = datetime.strptime(request.POST['deadline'],
                                                     '%d/%m/%Y').date()
                informe.save()
                estado = 'closed' if informe.deadline < date.today(
                ) else 'open'
                return JsonResponse({
                    'ok': True,
                    'estado': estado,
                    'inf': informe.id
                })
            except:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'del_informe_tareas':
            try:
                informe = Informe_tareas.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                informe.delete()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'texto_solicitud':
            try:
                informe = Informe_tareas.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                informe.texto_solicitud = request.POST['texto']
                informe.save()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})
        elif request.POST[
                'action'] == 'mod_usuarios_destino' and g_e.has_permiso(
                    'solicita_informes_tareas'):
            informe = Informe_tareas.objects.get(
                usuario__entidad=g_e.ronda.entidad,
                usuario__ronda=g_e.ronda,
                id=request.POST['informe'])
            usuarios = Gauser_extra.objects.filter(
                ronda=g_e.ronda, id__in=request.POST.getlist('usuarios[]'))
            informe.usuarios_destino.clear()
            informe.usuarios_destino.add(*usuarios)
            return JsonResponse({
                'ok': True,
                'n': informe.usuarios_destino.all().count()
            })
        elif request.POST['action'] == 'aviso_informe_tareas':
            informe = Informe_tareas.objects.get(usuario__ronda=g_e.ronda,
                                                 id=request.POST['informe'])
            asunto = render_to_string('informe_tareas_mail_asunto.html',
                                      {'informe': informe})
            texto = render_to_string('informe_tareas_mail.html',
                                     {'informe': informe})
            receptores = []
            for ge in informe.usuarios_destino.all():
                if ge.tarea_propuesta_set.filter(informe=informe).count() == 0:
                    Aviso.objects.create(usuario=ge,
                                         aviso=texto,
                                         fecha=datetime.now(),
                                         aceptado=False,
                                         link='/informes_tareas')
                    receptores.append(ge.gauser)
            encolar_mensaje(emisor=g_e,
                            receptores=receptores,
                            asunto=asunto,
                            html=texto)
            return JsonResponse({'ok': True})
        elif request.POST['action'] == 'update_texto_tarea':
            try:
                informe = Informe_tareas.objects.get(
                    usuario__ronda=g_e.ronda, id=request.POST['informe'])
                tarea, c = Tarea_propuesta.objects.get_or_create(
                    usuario=g_e, informe=informe)
                if c:
                    tarea.fecha = datetime.today()
                tarea.texto_tarea = request.POST['texto']
                tarea.save()
                return JsonResponse({
                    'ok':
                    True,
                    'respuestas':
                    informe.tarea_propuesta_set.all().count()
                })
            except:
                return JsonResponse({'ok': False})
        elif request.POST['action'] == 'remove_file':
            file_tarea = Fichero_tarea.objects.get(id=request.POST['id'])
            os.remove(RUTA_BASE + file_tarea.fichero.url)
            file_tarea.delete()
            return JsonResponse({'ok': True, 'id': request.POST['id']})
    elif request.POST['action'] == 'upload_fichero_tarea':
        informe = Informe_tareas.objects.get(usuario__ronda=g_e.ronda,
                                             id=request.POST['informe'])
        tarea = Tarea_propuesta.objects.get(usuario=g_e, informe=informe)
        n_files = int(request.POST['n_files'])
        ficheros = []
        for i in range(n_files):
            fichero = request.FILES['fichero_xhr' + str(i)]
            fichero_tarea = Fichero_tarea.objects.create(
                tarea=tarea,
                fichero=fichero,
                content_type=fichero.content_type)
            ficheros.append({
                'file_name': fichero_tarea.fich_name,
                'url': fichero_tarea.fichero.url,
                'id': fichero_tarea.id
            })
        return JsonResponse({'ficheros': ficheros})
    else:
        return HttpResponse(status=400)
예제 #6
0
def gestionar_reparaciones_ajax(request):
    g_e = request.session["gauser_extra"]

    if request.method == 'POST' and request.is_ajax():
        if request.POST['action'] == 'crea_solicitud':
            if g_e.has_permiso('crea_solicitud_reparacion'):
                reparacion = Reparacion.objects.create(detecta=g_e, lugar='', describir_problema='',
                                                       describir_solucion='')
                html = render_to_string('reparacion_accordion.html',
                                        {'buscadas': False, 'reparaciones': [reparacion], 'g_e': g_e, 'nueva':True})
                return JsonResponse({'ok': True, 'html': html})
            else:
                JsonResponse({'ok': False})
        elif request.POST['action'] == 'open_accordion':
            try:
                reparacion = Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id'])
                html = render_to_string('reparacion_accordion_content.html', {'reparacion': reparacion, 'g_e': g_e})
                return JsonResponse({'ok': True, 'html': html})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'update_lugar':
            try:
                reparacion = Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id'])
                reparacion.lugar = request.POST['valor']
                if len(reparacion.lugar) < 3:
                    reparacion.borrar = True
                else:
                    reparacion.borrar = False
                reparacion.save()
                return JsonResponse({'ok': True, 'valor': reparacion.lugar})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'update_tipo':
            try:
                reparacion = Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id'])
                reparacion.tipo = request.POST['valor']
                reparacion.save()
                return JsonResponse({'ok': True, 'valor': reparacion.get_tipo_display()})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'enviar_mensaje':
            try:
                reparacion = Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id'])
                reparacion.comunicado_a_reparador = True
                mensaje = render_to_string('reparaciones_mail.html', {'reparacion': reparacion})
                # mensaje = u'El usuario %s ha grabado una incidencia de reparación. Los datos significativos son:<br><strong>Lugar:</strong> <em>%s</em> <br><strong>Descripción:</strong> <em>%s</em> <br>Gracias por tu atención.' % (
                #     g_e.gauser.get_full_name(), reparacion.lugar, reparacion.describir_problema)
                permisos = ['controla_reparaciones_%s' % reparacion.tipo, 'controla_reparaciones']
                cargos = Cargo.objects.filter(permisos__code_nombre__in=permisos, entidad=g_e.ronda.entidad).distinct()

                receptores = Gauser_extra.objects.filter(Q(ronda=g_e.ronda), Q(permisos__code_nombre__in=permisos) | Q(
                                                             cargos__in=cargos)).values_list('gauser__id', flat=True)
                encolar_mensaje(emisor=g_e, receptores=receptores, asunto='Solicitud de reparación', html=mensaje,
                                etiqueta='reparacion%s' % reparacion.id)
                reparacion.save()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'update_resuelta':
            try:
                reparacion = Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id'])
                reparacion.resuelta = not reparacion.resuelta
                reparacion.reparador = g_e
                reparacion.save()
                html = render_to_string('reparacion_accordion_content.html', {'reparacion': reparacion, 'g_e': g_e})
                if reparacion.resuelta:
                    mensaje = u'El %s grabaste una incidencia de reparación en la que indicabas lo siguiente:<br><br><em>%s</em> <br>A fecha %s se ha indicado en GAUSS que %s ha solucionado la incidencia.<br> <strong>%s</strong><br>Gracias por tu atención' % (
                        reparacion.fecha_comunicado.strftime("%d-%m-%Y"), reparacion.describir_problema,
                        reparacion.fecha_solucion.strftime("%d-%m-%Y"), reparacion.reparador.gauser.get_full_name(),
                        reparacion.describir_solucion)
                    encolar_mensaje(emisor=g_e, receptores=[reparacion.detecta.gauser],
                                    asunto='Reparación solicitada realizada', html=mensaje,
                                    etiqueta='reparacion%s' % reparacion.id)
                return JsonResponse({'ok': True, 'valor': ['No', 'Sí'][reparacion.resuelta],
                                     'resuelta': reparacion.resuelta, 'html': html})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'update_describir_problema':
            try:
                reparacion = Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id'])
                reparacion.describir_problema = request.POST['valor']
                if len(reparacion.describir_problema) < 5:
                    reparacion.borrar = True
                else:
                    reparacion.borrar = False
                reparacion.save()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'update_describir_solucion':
            try:
                reparacion = Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id'])
                reparacion.describir_solucion = request.POST['valor']
                reparacion.reparador = g_e
                reparacion.save()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'borrar_solicitud':
            try:
                Reparacion.objects.get(detecta__ronda__entidad=g_e.ronda.entidad, id=request.POST['id']).delete()
                return JsonResponse({'ok': True})
            except:
                return JsonResponse({'ok': False})

        elif request.POST['action'] == 'busca_reparaciones':
            try:
                try:
                    inicio = datetime.strptime(request.POST['id_fecha_inicio'], '%d-%m-%Y')
                except:
                    inicio = datetime.strptime('01-01-2000', '%d-%m-%Y')
                try:
                    fin = datetime.strptime(request.POST['id_fecha_fin'], '%d-%m-%Y')
                except:
                    fin = datetime.strptime('01-01-3000', '%d-%m-%Y')
                texto = request.POST['texto'] if request.POST['texto'] else ' '
                tipos = ['inf', 'ele', 'fon', 'alb', 'gen', 'car']
                tipo = [request.POST['tipo_busqueda']] if request.POST['tipo_busqueda'] in tipos else tipos
                q_texto = Q(describir_problema__icontains=texto) | Q(describir_solucion__icontains=texto)
                q_inicio = Q(fecha_comunicado__gte=inicio)
                q_fin = Q(fecha_comunicado__lte=fin)
                q_tipo = Q(tipo__in=tipo)
                q_entidad = Q(detecta__ronda__entidad=g_e.ronda.entidad)
                rs = Reparacion.objects.filter(q_entidad, q_texto, q_inicio, q_fin, q_tipo)
                html = render_to_string('reparacion_accordion.html', {'reparaciones': rs, 'g_e': g_e, 'buscadas': True})
                return JsonResponse({'ok': True, 'html': html})
            except:
                return JsonResponse({'ok': False})