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