def carga_docentes(self): ges = self.plantillaxls_set.all().values('docente', 'x_docente', 'dni', 'email', 'puesto', 'x_puesto', 'x_departamento').distinct() x_docentes = [] docentes = [] cargo = self.carga_cargo_g_docente() for ge in ges: if not ge['x_docente'] in x_docentes: x_docentes.append(ge['x_docente']) last_name, first_name = ge['docente'].split(', ') clave_ex, dni, puesto, x_puesto, x_departamento, email = ge['x_docente'], genera_nie(ge['dni']), ge[ 'puesto'], ge['x_puesto'], ge['x_departamento'], ge['email'] try: gauser = Gauser.objects.get(dni=dni) except Exception as msg: log = 'Error: %s. dni %s - email %s' % (str(msg), dni, email) LogCarga.objects.create(g_e=self.g_e, log=log) try: gex = Gauser_extra.objects.get(clave_ex=clave_ex, ronda=self.ronda_centro) gauser = gex.gauser gauser.set_password(pass_generator(size=9)) log = 'Sin embargo existe g_e con clave_x: %s - %s' % (clave_ex, gex) logger.warning(log) LogCarga.objects.create(g_e=self.g_e, log=log) except: gauser = Gauser.objects.create_user(pass_generator(size=9), email=email, last_login=now(), password=pass_generator(size=9)) log = 'Creado usuario: %s' % (gauser) LogCarga.objects.create(g_e=self.g_e, log=log) # try: # gauser = Gauser.objects.get(email=email) # gauser.set_password(pass_generator(size=9)) # log = 'Sin embargo existe usuario con email: %s - %s' % (email, gauser) # logger.warning(log) # LogCarga.objects.create(g_e=self.g_e, log=log) # except: # gauser = Gauser.objects.create_user(pass_generator(size=9), email=email, last_login=now(), # password=pass_generator(size=9)) # log = 'Creado usuario: %s' % (gauser) # LogCarga.objects.create(g_e=self.g_e, log=log) try: gauser.dni = dni gauser.first_name = first_name[0:29] gauser.last_name = last_name[0:29] gauser.email = email gauser.save() gex = self.get_gex_docente(gauser, clave_ex, puesto, x_puesto, x_departamento, cargo) if gex: docentes.append(gex) except Exception as msg: LogCarga.objects.create(g_e=self.g_e, log=str(msg)) return docentes
def update_fichero_attached(instance, filename): nombre = filename.rpartition('.') instance.fich_name = filename fichero = pass_generator(size=20) + '.' + nombre[2] return '/'.join( ['actas', str(instance.acta.convocatoria.entidad.code), fichero])
def update_fichero_documental(instance, filename): nombre = filename.partition('.') instance.fich_name = filename.rpartition('/')[2].replace(' ', '_') nombre = pass_generator(size=20) + '.' + nombre[2] return '/'.join( ['documentos', str(instance.propietario.ronda.entidad.code), nombre])
def update_fichero(instance, filename): nombre, dot, ext = filename.rpartition('.') instance.fich_name = filename fichero = pass_generator(size=20) + '.' + ext return '/'.join([ 'inspeccion', str(instance.informe.inspector.ronda.entidad.code), fichero ])
def comprar_y_vender(request): g_e = request.session['gauser_extra'] if request.method == 'POST': if request.POST['action'] == 'introduce_articulo': codigo = pass_generator(size=35) articulo = Articulo(vendedor=g_e.gauser, entidad=g_e.ronda.entidad, estado='DISPONIBLE', codigo=codigo) elif request.POST['action'] == 'modifica_articulo': articulo = Articulo.objects.get(id=request.POST['id_articulo']) form = Articulo_Form(request.POST, instance=articulo) if form.is_valid(): articulo = form.save() articulo.categorias.clear() if request.POST['categorias']: id_categorias = list(filter(None, request.POST['categorias'].split(','))) categorias = Categoria_objeto.objects.filter(id__in=id_categorias) articulo.categorias.add(*categorias) articulo.fotos.clear() if request.POST['fotos_existentes']: id_fotos = list(filter(None, request.POST['fotos_existentes'].split(','))) fotos_existentes = Foto_objeto.objects.filter(id__in=id_fotos) articulo.fotos.add(*fotos_existentes) for input_file, object_file in request.FILES.items(): for fichero in request.FILES.getlist(input_file): if fichero.content_type in ['image/png', 'image/gif', 'image/jpeg']: foto = Foto_objeto.objects.create(entidad=g_e.ronda.entidad, fichero=fichero, content_type=fichero.content_type) articulo.fotos.add(foto) foto_url = RUTA_BASE + foto.fichero.url os.system('convert %s -resize 400x %s' % (foto_url, foto_url)) else: crear_aviso(request, False, u'Tipo de imagen: %s, no permitido (sólo jpeg, png y gif)' % ( fichero.content_type)) else: crear_aviso(request, False, form.errors) articulos = Articulo.objects.filter(~Q(estado='VENDIDO'), Q(entidad=g_e.ronda.entidad)) respuesta = { 'iconos': ({'tipo': 'button', 'nombre': 'check', 'texto': 'Aceptar', 'title': 'Aceptar los cambios realizados', 'permiso': 'libre'}, {'tipo': 'button', 'nombre': 'plus', 'texto': 'Añadir', 'title': 'Añadir un nuevo artículo o servicio', 'permiso': 'libre'}, {'tipo': 'button', 'nombre': 'list-alt', 'texto': 'Artículos', 'title': 'Mostrar la lista de artículos', 'permiso': 'libre'}, ), 'formname': 'compraventa', 'articulos': articulos, 'avisos': Aviso.objects.filter(usuario=request.session["gauser_extra"], aceptado=False), } return render(request, "compra_y_venta.html", respuesta)
def enviar_correo(etiqueta=Etiqueta.objects.none(), asunto=None, texto_html=None, receptores=Gauser.objects.none(), emisor=None, entidad=Entidad.objects.none()): if not receptores: return False, 'No hay definidos destinatarios' if not emisor: if not entidad: return False, 'No hay definido ni un emisor, ni la entidad de emisión' else: try: emisor = Gauser_extra.objects.get(ronda=entidad.ronda, gauser__username='******') except: return False, 'No ha sido posible definir un emisor' if texto_html: soup = BeautifulSoup(texto_html, 'html.parser') texto = soup.get_text() else: return False, 'El mensaje no contiene texto' if not etiqueta or type(etiqueta) != Etiqueta: etiqueta = Etiqueta.objects.create(nombre=pass_generator( 9, 'abcdefghijkmnopqrs0123456789'), propietario=emisor) if not asunto: asunto = 'Mensaje de %s' % (emisor.gauser.get_full_name()) mensaje = Mensaje.objects.create(emisor=emisor, fecha=datetime.now(), asunto=asunto, mensaje=texto_html, mensaje_texto=texto) mensaje.etiquetas.add(etiqueta) try: mensaje.receptores.add(*receptores) except: return False, 'Los receptores deben ser del tipo Gauser' crea_mensaje_cola(mensaje) return True, 'Enviado correctamente'
def carga_masiva_tipo_DOCENTES_RACIMA(carga): gauss = Gauser.objects.get(username='******') errores = {} f = carga.fichero.read() book = xlrd.open_workbook(file_contents=f) sheet = book.sheet_by_index(0) # Get the keys from line 5 of excel file: dict_names = {} for col_index in range(sheet.ncols): dict_names[sheet.cell(4, col_index).value] = col_index for row_index in range(5, sheet.nrows): try: code_entidad = int( sheet.cell(row_index, dict_names['Código']).value) entidad = Entidad.objects.get(code=code_entidad) try: cargo = Cargo.objects.get(entidad=entidad, clave_cargo='g_docente', borrable=False) except: cargo = Cargo.objects.create(entidad=entidad, clave_cargo='g_docente', borrable=False, cargo='Docente') dni = genera_nie( str(sheet.cell(row_index, dict_names['DNI']).value)) nombre = sheet.cell(row_index, dict_names['Nombre docente']).value apellidos = sheet.cell(row_index, dict_names['Apellidos docente']).value email = sheet.cell(row_index, dict_names['Correo-e']).value username = sheet.cell(row_index, dict_names['Usuario']).value clave_ex = str( sheet.cell(row_index, dict_names['X_DOCENTE']).value).strip() puesto = str(sheet.cell(row_index, dict_names['Puesto']).value).strip() tipo_personal = str( sheet.cell(row_index, dict_names['Tipo personal']).value).strip() jornada_contratada = str( sheet.cell(row_index, dict_names['Jornada contratada']).value).strip() try: try: gauser = Gauser.objects.get(dni=dni) gauser.email = email gauser.username = username except: gauser = Gauser.objects.get(username=username) gauser.email = email gauser.dni = dni except: gauser = Gauser.objects.create_user( username, email=email, last_login=now(), dni=dni, password=pass_generator(size=9)) # try: # gauser = Gauser.objects.create_user(username, email=email, last_login=now(), # password=pass_generator(size=9)) # except: # usuario = crear_nombre_usuario(nombre, apellidos) # gauser = Gauser.objects.create_user(usuario, email=email, last_login=now(), # password=pass_generator(size=9)) # if 'larioja.edu.es' in email.split('@')[1]: # gauser.username = email.split('@')[0] gauser.first_name = nombre gauser.last_name = apellidos # gauser.dni = dni gauser.save() gauser_extra, c = Gauser_extra.objects.get_or_create( ronda=entidad.ronda, gauser=gauser) gauser_extra.clave_ex = clave_ex gauser_extra.activo = True gauser_extra.puesto = puesto gauser_extra.tipo_personal = tipo_personal gauser_extra.jornada_contratada = jornada_contratada gauser_extra.cargos.add(cargo) gauser_extra.save() except Exception as msg: apellidos = slugify( sheet.cell(row_index, dict_names['Apellidos docente']).value) errores[row_index] = {'error': str(msg), 'apellidos': apellidos} logger.info('Error carga general docentes %s -- %s' % (str(apellidos), msg)) return HttpResponse(errores)
def code_grupo(): return pass_generator(10)
def update_fichero_carga_masiva(instance, filename): nombre = filename.partition('.') nombre = '%s_%s.%s' % (str( instance.ronda.entidad.code), pass_generator(), nombre[2]) return os.path.join("carga_masiva/", nombre)
def correo(request): g_e = request.session['gauser_extra'] sub_accesibles = Subentidad.objects.filter( entidad=g_e.ronda.entidad, fecha_expira__gt=datetime.today()) car_accesibles = Cargo.objects.filter(entidad=g_e.ronda.entidad) mensaje = None receptores = None tipo_respuesta = None adjuntos = None usa_mensaje = '' if request.method == 'GET': if 'm' in request.GET: # try: m = Mensaje.objects.get(id=request.GET['m']) socios_mensaje = list(m.receptores.all().values_list('id', flat=True)) socios_mensaje.append(m.emisor.gauser.id) socios_mensaje = Gauser.objects.filter(id__in=socios_mensaje) if g_e.gauser not in socios_mensaje: mensaje = None crear_aviso( request, False, 'No eres ni emisor, ni receptor del mensaje indicado', link='/correo/') else: tipo_respuesta = request.GET['t'] # socios_mensaje = socios_mensaje.values_list('id', 'last_name', 'first_name') keys = ('id', 'text') if tipo_respuesta == 'responder': receptores = json.dumps([{ 'id': m.emisor.gauser.id, 'text': '%s, %s' % (m.emisor.gauser.last_name, m.emisor.gauser.first_name) }]) mensaje = Mensaje( emisor=m.emisor, asunto='Re: ' + m.asunto, mensaje= '<br><br>______<br><span class="wysiwyg-color-gray">' + m.mensaje + '</span>') elif tipo_respuesta == 'responder_todos': receptores = json.dumps([ dict( zip(keys, (row.id, "%s, %s" % (row.last_name, row.first_name)))) for row in socios_mensaje ]) mensaje = Mensaje( emisor=m.emisor, asunto='Re: ' + m.asunto, mensaje= '<br><br>______<br><span class="wysiwyg-color-gray">' + m.mensaje + '</span>') elif tipo_respuesta == 'reenviar': receptores = None mensaje = Mensaje(emisor=m.emisor, asunto=m.asunto, mensaje=m.mensaje) adjuntos = m.adjuntos.all() # except: # crear_aviso(request,False,'Solicitud incorrecta') form1 = MensajeForm(prefix="mensaje", instance=mensaje) if request.method == 'POST': if request.POST['action'] == 'mail': etiqueta = Etiqueta.objects.create(propietario=g_e, nombre='___' + pass_generator(size=15)) if request.POST['usa_mensaje'] != '': mensaje = Mensaje.objects.get(id=request.POST['usa_mensaje']) else: mensaje = Mensaje(emisor=g_e, fecha=datetime.now(), tipo='mail') form1 = MensajeForm(request.POST, prefix="mensaje", instance=mensaje) if form1.is_valid(): mensaje = form1.save() receptores = Gauser.objects.filter( id__in=request.POST['mensaje-receptores'].split(',')) mensaje.receptores.add(*receptores) mensaje.etiquetas.add(etiqueta) crear_aviso(request, True, request.META['PATH_INFO'] + ' Manda correo ') for input_file, object_file in request.FILES.items(): for fichero in request.FILES.getlist(input_file): adjunto = Adjunto.objects.create( propietario=g_e, fichero=fichero, content_type=fichero.content_type) mensaje.adjuntos.add(adjunto) if request.POST['tipo_respuesta'] == 'reenviar': ids = map( int, filter(None, request.POST['adjuntos_reenviados'].split(','))) adjuntos = Adjunto.objects.filter(id__in=ids) mensaje.adjuntos.add(*adjuntos) form1 = MensajeForm(prefix="mensaje") # direcciones = list( # mensaje.receptores.all().values_list('email', flat=True)) # receptores son tipo Gauser # if 'autoenvio' in request.POST: # direcciones.append(g_e.gauser.email) # direcciones = ['*****@*****.**'] # c = ['*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**'] # direcciones = ['*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**'] crea_mensaje_cola(mensaje) crear_aviso( request, False, 'El envío puede tardar varios minutos. Recibirás un aviso cuando finalice.' ) # nom = mensaje.emisor.alias if mensaje.emisor.alias else mensaje.emisor.gauser.get_full_name() # texto_mensaje = render_to_string('template_correo.html', {'mensaje': mensaje, }, # request=request) # # email = EmailMessage(mensaje.asunto, texto_mensaje.encode('utf-8'), # # '%s <%s>' % (nom, mensaje.emisor.gauser.email), bcc=direcciones, # # headers={'Reply-To': mensaje.emisor.gauser.email}) # email = EmailMessage(mensaje.asunto, texto_mensaje.encode('utf-8'), # '%s <*****@*****.**>' % (nom), bcc=direcciones, # headers={'Reply-To': mensaje.emisor.gauser.email}) # for adjunto in mensaje.adjuntos.all(): # email.attach_file(adjunto.fichero.url.replace('/media/adjuntos/', MEDIA_ADJUNTOS)) # email.content_subtype = "html" # email.send() # crear_aviso(request, False, 'Correo enviado correctamente.') # else: # crear_aviso(request, False, form1.errors) if request.POST['action'] == 'telegram': etiqueta = Etiqueta.objects.create(propietario=g_e, nombre='___' + pass_generator(size=15)) mensaje = Mensaje(emisor=g_e, fecha=datetime.now(), tipo='telegram') form1 = MensajeForm(request.POST, prefix="mensaje", instance=mensaje) if form1.is_valid(): mensaje = form1.save() mensaje.etiquetas.add(etiqueta) for filename, fichero in request.FILES.iteritems(): adjunto = Adjunto.objects.create(propietario=g_e, fichero=fichero) mensaje.adjuntos.add(adjunto) form1 = MensajeForm(prefix="mensaje") # Para crear un nuevo Telegram hay que borrar el directorio ~/.telegram # http://geekytheory.com/tutorial-raspberry-pi-uso-de-telegram-con-python/ # http://pexpect.sourceforge.net/doc/ # You can read everything up to the EOF without generating an exception by using the expect(pexpect.EOF). # In this case everything the child has output will be available in the before property. # Crea el contacto, abre la conexión y espera a que Telegram se haya inicializado contacto = "Juanjo_Martín" telegram = pexpect.spawn( '/home/juanjo/Telegram/tg/telegram -k /home/juanjo/Telegram/tg/tg.pub' ) telegram.expect('0m> ') ruta_file_text = MEDIA_FILES + str(g_e.id) + 'prueba.txt' file_text = open(ruta_file_text, 'w') file_text.write( html2text.html2text(mensaje.mensaje).encode('utf8')) file_text.close() # send_text <peer> <text-file-name> - sends text file as plain messages telegram.sendline('send_text ' + contacto + ' ' + ruta_file_text) telegram.sendline('quit') os.remove(ruta_file_text) crear_aviso(request, False, 'Mensaje enviado correctamente.') else: crear_aviso(request, False, form1.errors) return render( request, "correo.html", { 'iconos': ( { 'tipo': 'button', 'nombre': 'send-o', 'texto': 'Telegram', 'permiso': 'enviar_actasssss', 'title': 'Enviar mensaje a través de Telegram' }, { 'tipo': 'button2', 'nombre': 'envelope-o', 'nombre2': 'share', 'texto': 'Enviar', 'title': 'Enviar correo electrónico', 'permiso': 'acceso_redactar_mensaje' }, ), 'form1': form1, 'formname': 'correo', 'avisos': Aviso.objects.filter(usuario=g_e, aceptado=False), 'sub_accesibles': sub_accesibles, 'car_accesibles': car_accesibles, 'mensaje': mensaje, 'receptores': receptores, 'adjuntos': adjuntos, 'tipo_respuesta': tipo_respuesta, 'usa_mensaje': usa_mensaje, })
def create_usuario(datos, carga, tipo): dni = genera_nie(datos['dni' + tipo]) if len( datos['dni' + tipo]) > 6 else 'DNI inventado generar error en el try' try: gauser = Gauser.objects.get(dni=dni) logger.info('Existe Gauser con dni %s' % dni) except ObjectDoesNotExist: logger.warning('No existe Gauser con dni %s' % dni) try: gauser_extra = Gauser_extra.objects.get( id_entidad=datos['id_socio'], ronda=carga.ronda) gauser = gauser_extra.gauser logger.warning('Encontrado Gauser y Gauser_extra con id_socio %s' % (datos['id_socio'])) except ObjectDoesNotExist: gauser = None logger.warning('No existe Gauser con id_socio %s' % (datos['id_socio'])) except MultipleObjectsReturned: gauser_extra = Gauser_extra.objects.filter( id_entidad=datos['id_socio'], ronda=carga.ronda)[0] logger.warning( 'Existen varios Gauser_extra asociados al Gauser encontrado. Se elige %s' % (gauser_extra)) gauser = gauser_extra.gauser except MultipleObjectsReturned: gauser = Gauser.objects.filter(dni=dni)[0] logger.warning('Existen varios Gauser con el mismo DNI. Se elige %s' % (gauser)) if gauser: try: gauser_extra = Gauser_extra.objects.get(gauser=gauser, ronda=carga.ronda) mensaje = 'Existe el g_e %s con el dni %s. No se vuelve a crear fff.' % ( gauser, dni) logger.info(mensaje) except ObjectDoesNotExist: gauser_extra = None logger.warning( 'No existe Gauser_extra asociado al Gauser %s, deberemos crearlo fff' % (gauser)) except MultipleObjectsReturned: ges = Gauser_extra.objects.filter(gauser=gauser, ronda=carga.ronda) gauser_extra = ges[0] # Podríamos escribir ges.exclude(id=gauser_extra.id).delete(), pero como hay un error porque # falta el nregistro en vut_vivienda necesito hacer esta triquiñuela para no duplicar usuarios: for ge_borrar in ges.exclude(id=gauser_extra.id): try: ge_borrar.delete() except: entidad, c = Entidad.objects.get_or_create( code=CODE_CONTENEDOR) ge_borrar.ronda = entidad.ronda ge_borrar.save() logger.warning( 'Gauser_extra asociados al Gauser %s, desplazado al contenedor.' % (gauser)) logger.warning( 'Varios Gauser_extra asociados al Gauser %s, se borran todos menos uno.' % (gauser)) mensaje = 'Varios Gauser_extra asociados al Gauser %s, se borran todos menos uno.' % ( gauser) logger.info(mensaje) else: gauser_extra = None if not gauser: if datos['nombre' + tipo] and datos['apellidos' + tipo]: nombre = datos['nombre' + tipo] apellidos = datos['apellidos' + tipo] usuario = crear_nombre_usuario(nombre, apellidos) dni = genera_nie(datos['dni' + tipo]) gauser = Gauser.objects.create_user(usuario, email=datos['email' + tipo].lower(), password=pass_generator(), last_login=now()) gauser.first_name = string.capwords(nombre.title()[0:28]) gauser.last_name = string.capwords(apellidos.title()[0:28]) gdata = { 'dni': dni, 'telfij': datos['telefono_fijo' + tipo], 'sexo': datos['sexo' + tipo], 'telmov': datos['telefono_movil' + tipo], 'localidad': datos['localidad' + tipo], 'address': datos['direccion' + tipo], 'provincia': get_provincia(datos['provincia' + tipo]), 'nacimiento': devuelve_fecha(datos['nacimiento' + tipo]), 'postalcode': datos['cp' + tipo], 'fecha_alta': devuelve_fecha(datos['fecha_alta' + tipo]) } for key, value in gdata.items(): setattr(gauser, key, value) gauser.save() else: mensaje = 'No se ha podido crear un usuario porque no se han indicado nombre y apellidos' logger.warning(mensaje) if gauser and not gauser_extra: if 'id_organizacion' + tipo in datos: id_organizacion = datos['id_organizacion' + tipo] else: id_organizacion = datos['id_socio' + tipo] gauser_extra = Gauser_extra.objects.create( gauser=gauser, ronda=carga.ronda, activo=True, id_entidad=datos['id_socio' + tipo], num_cuenta_bancaria=datos['iban' + tipo], observaciones=datos['observaciones' + tipo], id_organizacion=id_organizacion) try: asocia_banco_ge(gauser_extra) except: mensaje = 'El IBAN asociado a %s parece no ser correcto. No se ha podido asociar una entidad bancaria al mismo.' % ( gauser.first_name.decode('utf8') + ' ' + gauser.last_name.decode('utf8')) logger.info(mensaje) if gauser_extra: logger.info('antes de subentidades') if datos['subentidades' + tipo]: logger.info('entra en subentidades') # La siguientes dos líneas no se si funcionarán en python3 debido a que filter en python3 no devuelve # una lista. Incluida la conversión list() para evitar errores: # http://stackoverflow.com/questions/3845423/remove-empty-strings-from-a-list-of-strings subentidades_id = list( filter( None, datos['subentidades' + tipo].replace(' ', '').split(','))) logger.info('entra en subentidades %s' % subentidades_id) subentidades = Subentidad.objects.filter( id__in=subentidades_id, entidad=carga.ronda.entidad, fecha_expira__gt=datetime.today()) gauser_extra.subentidades.add(*subentidades) if datos['perfiles' + tipo]: logger.info('entra en perfiles') cargos_id = list( filter(None, datos['perfiles' + tipo].replace(' ', '').split(','))) cargos = Cargo.objects.filter(id__in=cargos_id, entidad=carga.ronda.entidad) gauser_extra.cargos.add(*cargos) if gauser_extra: Gauser_extra_estudios.objects.get_or_create(ge=gauser_extra) return gauser_extra
def update_fichero(instance, filename): nombre = filename.rpartition('.') instance.fich_name = filename fichero = pass_generator(size=30) + '.' + nombre[2] return '/'.join(['compraventa', str(instance.entidad.code), fichero])
def crea_clave(): return pass_generator(49)
def mqtt_id_generator(): generado = pass_generator(size=10, chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') return 'ID%s' % generado
def update_file(instance, filename): nombre = filename.partition('.') nombre = '%s.%s' % (pass_generator(size=10), nombre[2]) return os.path.join('contabilidad/', nombre)
def clave_secreta(): return pass_generator(size=10)
def mqtt_topic_generator(): generado = pass_generator(size=10, chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') return 'DOMOTICA/%s' % generado
def ajax_actividades(request): g_e = request.session["gauser_extra"] if request.is_ajax(): if request.method == 'POST': if request.POST['action'] == 'remove_file': file_actividad = File_actividad.objects.get( code=request.POST['file_code']) os.remove(RUTA_BASE + file_actividad.fichero.url) file_actividad.delete() return HttpResponse(request.POST['file_code']) elif request.POST['action'] == 'open_accordion': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) html = render_to_string('actividad_accordion_content.html', { 'actividad': actividad, 'g_e': g_e }) return JsonResponse({'ok': True, 'html': html}) elif request.POST['action'] == 'delete_actividad': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) mensaje = '' try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) evento.delete() mensaje += 'Se ha borrado el evento del calendario relacionado con la actividad.' except: mensaje += '<i class="fa fa-warning"></i> No se ha podido localizar el evento del calendario ' \ 'relacionado con la actividad.' files_actividad = actividad.file_actividad_set.all() if actividad.organizador == g_e or g_e.has_permiso( 'borra_actividad'): for file_actividad in files_actividad: os.remove(RUTA_BASE + file_actividad.fichero.url) mensaje += '<br>Borrado el archivo %s' % ( file_actividad.fichero.url) file_actividad.delete() mensaje += '<br>Se ha borrado la actividad.' actividad.delete() return JsonResponse({'mensaje': mensaje, 'ok': True}) elif request.POST['action'] == 'add_actividad': try: actividad = Actividad.objects.create( organizador=g_e, actividad_title='Nueva actividad', description='Este es un resumen de la actividad', fecha_hora_inicio=datetime.now(), fecha_hora_fin=datetime.now()) crea_evento_actividad(g_e, actividad) html = render_to_string('actividad_accordion.html', {'actividades': [actividad]}) return JsonResponse({'html': html, 'ok': True}) except: return JsonResponse({'ok': False}) elif request.POST['action'] == 'get_actividad': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) return HttpResponse( render_to_string('actividad_accordion.html', {'actividades': [actividad]})) elif request.POST['action'] == 'aceptar_fecha_aprobacion_general': try: actividades = Actividad.objects.filter( organizador__ronda__entidad=g_e.ronda.entidad, aprobada=False, organizador__ronda=g_e.ronda) fecha = datetime.strptime(request.POST['fecha'], '%d-%m-%Y') for actividad in actividades: actividad.aprobada = True actividad.fecha_aprobacion = fecha actividad.save() return JsonResponse({'success': True}) except: return JsonResponse({'success': False}) elif request.POST['action'] == 'update_fecha_aprobacion': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) try: fecha = datetime.strptime(request.POST['fecha'], '%d-%m-%Y') actividad.fecha_aprobacion = fecha actividad.save() return HttpResponse(True) except: return HttpResponse(False) elif request.POST['action'] == 'update_fecha_inicio': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) try: fecha = datetime.strptime(request.POST['fecha'], '%d-%m-%Y %H:%M') actividad.fecha_hora_inicio = fecha actividad.save() try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) evento.dtstart = actividad.fecha_hora_inicio evento.save() return HttpResponse(True) except: return HttpResponse(False) elif request.POST['action'] == 'update_fecha_fin': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) try: fecha = datetime.strptime(request.POST['fecha'], '%d-%m-%Y %H:%M') actividad.fecha_hora_fin = fecha actividad.save() try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) evento.dtend = actividad.fecha_hora_fin evento.save() return HttpResponse(True) except: return HttpResponse(False) elif request.POST['action'] == 'update_actividad_title': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) try: actividad.actividad_title = request.POST['actividad_title'] actividad.save() try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) evento.summary = actividad.actividad_title evento.save() return JsonResponse({ 'success': True, 'actividad_title': actividad.actividad_title }) except: return JsonResponse({'success': False}) elif request.POST['action'] == 'update_organizador': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) try: organizador = Gauser_extra.objects.get( id=request.POST['organizador'], ronda=g_e.ronda) actividad.organizador = organizador actividad.save() try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) description = render_to_string( 'actividad_event_description.html', {'actividad': actividad}) evento.propietarios.clear() evento.propietarios.add(actividad.organizador.gauser) evento.description = description evento.save() return HttpResponse(True) except: return HttpResponse(False) elif request.POST['action'] == 'update_colaboradores': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) try: if 'added[]' in request.POST: ges = Gauser_extra.objects.filter( ronda=g_e.ronda, id__in=request.POST.getlist('added[]')) actividad.colaboradores.add(*ges) if 'removed[]' in request.POST: ges = Gauser_extra.objects.filter( ronda=g_e.ronda, id__in=request.POST.getlist('removed[]')) actividad.colaboradores.remove(*ges) try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) description = render_to_string( 'actividad_event_description.html', {'actividad': actividad}) evento.description = description evento.save() return HttpResponse(True) except: return HttpResponse(False) elif request.POST['action'] == 'update_tramos_horarios': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) try: tramo = Tramo_horario.objects.get( horario__ronda__entidad=g_e.ronda.entidad, id=request.POST['tramo_horario']) if request.POST['operation'] == 'added': actividad.tramos_horarios.add(tramo) else: actividad.tramos_horarios.remove(tramo) try: fin = actividad.tramos_horarios.all().order_by( 'fin').last().fin except: fin = \ Tramo_horario.objects.filter(horario__ronda=g_e.ronda).order_by('fin').last().fin try: inicio = actividad.tramos_horarios.all().earliest( 'inicio').inicio except: inicio = \ Tramo_horario.objects.filter(horario__ronda=g_e.ronda).order_by( 'inicio')[0].inicio try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) evento.dtend = datetime.combine(actividad.fecha_fin, fin) evento.dtstart = datetime.combine(actividad.fecha_inicio, inicio) evento.save() return HttpResponse(True) except: return HttpResponse(False) elif request.POST['action'] == 'todos_ninguno': try: alumnos_id = request.POST.getlist('alumnos_id[]') alumnos = Gauser_extra.objects.filter(ronda=g_e.ronda, id__in=alumnos_id) actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) if request.POST['operation'] == 'select_ninguno': actividad.alumnos_incluidos.remove(*alumnos) else: actividad.alumnos_incluidos.add(*alumnos) return JsonResponse({'ok': True}) except: return JsonResponse({'ok': False}) elif request.POST['action'] == 'update_alumnos_incluidos': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) ge = Gauser_extra.objects.get(ronda=g_e.ronda, id=request.POST['alumno']) if request.POST['operation'] == 'added': actividad.alumnos_incluidos.add(ge) else: actividad.alumnos_incluidos.remove(ge) try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) description = render_to_string( 'actividad_event_description.html', {'actividad': actividad}) evento.description = description evento.save() return HttpResponse(True) elif request.POST['action'] == 'update_grupos': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) grupo = Grupo.objects.get(ronda=g_e.ronda, id=request.POST['grupo']) alumnos = Gauser_extra_estudios.objects.filter( grupo=grupo).values_list('ge__id', flat=True) if request.POST['operation'] == 'added': actividad.alumnos_incluidos.add(*alumnos) html = render_to_string( 'actividad_accordion_content_grupo_alumno.html', { 'grupo': grupo, 'actividad': actividad }) data = { 'grupo': 'En este caso, esta variable no se utiliza', 'html': html } else: actividad.alumnos_incluidos.remove(*alumnos) data = {'grupo': grupo.id, 'html': False} try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) description = render_to_string( 'actividad_event_description.html', {'actividad': actividad}) evento.description = description evento.save() return JsonResponse(data) elif request.POST['action'] == 'update_texto_actividad': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) actividad.description = request.POST['texto'] actividad.save() try: evento = Vevent.objects.get(entidad=g_e.ronda.entidad, uid='extraescolar' + str(actividad.id)) except: evento = crea_evento_actividad(g_e, actividad) description = render_to_string( 'actividad_event_description.html', {'actividad': actividad}) evento.description = description evento.save() return HttpResponse(True) elif request.POST['action'] == 'busca_actividades': fecha_inicio = datetime.strptime( request.POST['id_fecha_inicio'], '%d-%m-%Y') fecha_fin = datetime.strptime(request.POST['id_fecha_fin'], '%d-%m-%Y') texto = request.POST['texto'] actividades = Actividad.objects.filter( Q(organizador__ronda=g_e.ronda), Q(description__icontains=texto) | Q(organizador__gauser__first_name__icontains=texto) | Q(organizador__gauser__last_name__icontains=texto) | Q(actividad_title__icontains=texto), Q(fecha_hora_inicio__gt=fecha_inicio), Q(fecha_hora_fin__lt=fecha_fin)) if actividades.count() > 0: html = render_to_string('actividad_accordion.html', { 'actividades': actividades, 'check': True }) else: html = '<h3 style="color:red">No se han encontrado resultados</h3>' return JsonResponse({'html': html, 'ok': True}) elif request.POST['action'] == 'paginar_actividades': try: actividades = Actividad.objects.filter( organizador__ronda=g_e.ronda) paginator = Paginator(actividades, 25) actividades_page = paginator.page(int( request.POST['page'])) html = render_to_string('actividad_accordion.html', { 'actividades': actividades_page, 'pag': True }) return JsonResponse({'ok': True, 'html': html}) except: return JsonResponse({'ok': False}) elif request.method == 'GET': if request.GET['action'] == 'busca_profesor': texto = request.GET['q'] # 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]) usuarios_contain_texto = usuarios.filter( Q(gauser__first_name__icontains=texto) | Q(gauser__last_name__icontains=texto)).values_list( 'id', 'gauser__last_name', 'gauser__first_name') keys = ('id', 'last_name', 'first_name') return HttpResponse( json.dumps([ dict(zip(keys, row)) for row in usuarios_contain_texto ])) elif request.GET['action'] == 'buscar_extraescolares': fecha_inicio = datetime.strptime( request.GET['id_fecha_inicio'], '%d-%m-%Y') fecha_fin = datetime.strptime(request.GET['id_fecha_fin'], '%d-%m-%Y') texto = request.GET['q'] actividades = Actividad.objects.filter( Q(organizador__ronda__entidad=g_e.ronda.entidad), Q(organizador__ronda=g_e.ronda), Q(description__icontains=texto) | Q(organizador__gauser__last_name__icontains=texto) | Q(actividad_title__icontains=texto), Q(fecha_inicio__gt=fecha_inicio), Q(fecha_fin__lt=fecha_fin)).values_list( 'id', 'actividad_title') pass # fecha_inicio = datetime.strptime(request.GET['search_fecha_inicio'], '%d-%m-%Y') # fecha_fin = datetime.strptime(request.GET['search_fecha_fin'], '%d-%m-%Y') # texto = request.GET['q'] # actividades = Actividad.objects.filter(Q(organizador__ronda__entidad=g_e.ronda.entidad), # Q(organizador__ronda=g_e.ronda), # Q(description__icontains=texto) | Q( # organizador__gauser__last_name__icontains=texto) | Q( # actividad_title__icontains=texto), # Q(fecha_inicio__gt=fecha_inicio), # Q(fecha_fin__lt=fecha_fin)).values_list('id', 'actividad_title') # keys = ('id', 'text') # return HttpResponse(json.dumps([dict(zip(keys, row)) for row in actividades])) else: if request.POST['action'] == 'upload_fichero_extraescolar': actividad = Actividad.objects.get( id=request.POST['actividad'], organizador__ronda__entidad=g_e.ronda.entidad) n_files = int(request.POST['n_files']) ficheros = [] for i in range(n_files): fichero = request.FILES['fichero_xhr' + str(i)] code = pass_generator(20) file_actividad = File_actividad.objects.create( actividad=actividad, fichero=fichero, content_type=fichero.content_type, code=code) # http: // www.imagemagick.org / discourse - server / viewtopic.php?t = 28069 # If # test = 1, then # landscape.If # test = 0, then # portrait or square # CODE: SELECT # ALL # test = `convert # image - format # "%[fx:(w/h>1)?1:0]" # info:` # if [ $test -eq 1]; then # convert # image - resize # 800 # x # result # else # convert # image - resize # x800 # result # fi ficheros.append({ 'file_name': file_actividad.fich_name, 'url': file_actividad.fichero.url, 'code': code }) return JsonResponse({'ficheros': ficheros})
def ajax_politica_cuotas(request): if request.is_ajax(): g_e = request.session['gauser_extra'] if request.method == 'POST': if request.POST['action'] == 'open_accordion': politica = Politica_cuotas.objects.get(id=request.POST['id']) remesas_emitidas = Remesa_emitida.objects.filter(visible=True, politica=politica) paginator= Paginator(remesas_emitidas, 5) html = render_to_string('politica_cuotas_accordion_content.html', {'politica': politica, 'g_e': g_e, 'remitidas': paginator.page(1)}) return JsonResponse({'ok': True, 'html': html}) elif request.POST['action'] == 'crear_politica': try: if g_e.has_permiso('crea_politica_cuotas'): politica = Politica_cuotas.objects.create(entidad=g_e.ronda.entidad, tipo_cobro='MEN', concepto='Cuota mensual', cuota='0') html = render_to_string("politica_cuotas_accordion.html", {'politicas': [politica]}) return JsonResponse({'ok': True, 'html': html}) else: return JsonResponse({'ok': False, 'mensaje': 'No tienes permisos para borrar la política'}) except: return JsonResponse({'ok': False, 'mensaje': 'Tu petición no ha podido ser atendida.'}) elif request.POST['action'] == 'borrar_politica': try: if g_e.has_permiso('borra_politica_cuotas'): politica = Politica_cuotas.objects.get(id=request.POST['politica'], entidad=g_e.ronda.entidad) politica_id = politica.id politica.delete() return JsonResponse({'ok': True, 'politica': politica_id}) else: return JsonResponse({'ok': False, 'mensaje': 'No tienes permisos para borrar la política'}) except: return JsonResponse({'ok': False, 'mensaje': 'Tu petición no ha podido ser atendida.'}) elif request.POST['action'] == 'update_page': try: politica = Politica_cuotas.objects.get(id=request.POST['politica']) total_remesas_emitidas = Remesa_emitida.objects.filter(visible=True, politica=politica) paginator = Paginator(total_remesas_emitidas, 5) remitidas = paginator.page(int(request.POST['page'])) html = render_to_string('remesas_emitidas.html', {'remitidas': remitidas, 'politica': politica}) return JsonResponse({'ok': True, 'html': html, 'politica': politica.id}) except: return JsonResponse({'ok': False}) elif request.POST['action'] == 'borrar_remesa_emitida': try: if g_e.has_permiso('borra_politica_cuotas'): remesa = Remesa_emitida.objects.get(id=request.POST['id']) if remesa.creado.date() < (date.today() - timedelta(1000)): remesa.delete() else: remesa.visible = False remesa.save() politica = Politica_cuotas.objects.get(id=request.POST['politica']) total_remesas_emitidas = Remesa_emitida.objects.filter(visible=True, politica=politica) paginator = Paginator(total_remesas_emitidas, 5) remitidas = paginator.page(int(request.POST['page'])) html = render_to_string('remesas_emitidas.html', {'remitidas': remitidas, 'politica': politica}) return JsonResponse({'ok': True, 'html': html, 'politica': politica.id}) else: return JsonResponse({'ok': False, 'mensaje': 'No tienes permisos para borrar la remesa'}) except: return JsonResponse({'ok': False}) elif request.POST['action'] == 'update_exentos': try: politica = Politica_cuotas.objects.get(id=request.POST['politica'], entidad=g_e.ronda.entidad) if g_e.has_permiso('crea_politica_cuotas') or g_e.has_permiso('edita_politica_cuotas'): exentos = Gauser_extra.objects.filter(ronda=g_e.ronda, id__in=request.POST.getlist('exentos[]')) exentos_gauser = Gauser.objects.filter(id__in=exentos.values_list('gauser__id', flat=True)) politica.exentos.clear() politica.exentos.add(*exentos_gauser) politica.save() return JsonResponse({'ok': True, 'exentos': exentos_gauser.count()}) except: return JsonResponse({'ok': False}) elif request.POST['action'] == 'update_campo_text': try: politica = Politica_cuotas.objects.get(id=request.POST['politica'], entidad=g_e.ronda.entidad) if g_e.has_permiso('crea_politica_cuotas') or g_e.has_permiso('edita_politica_cuotas'): setattr(politica, request.POST['campo'], request.POST['valor']) politica.save() return JsonResponse({'ok': True}) except: return JsonResponse({'ok': False}) elif request.POST['action'] == 'update_campo_select': try: politica = Politica_cuotas.objects.get(id=request.POST['politica'], entidad=g_e.ronda.entidad) if g_e.has_permiso('crea_politica_cuotas') or g_e.has_permiso('edita_politica_cuotas'): campo = request.POST['campo'] valor = request.POST['valor'] if campo == 'cargo': valor = Cargo.objects.get(entidad=g_e.ronda.entidad, id=request.POST['valor']) setattr(politica, campo, valor) politica.save() return JsonResponse({'ok': True}) except: return JsonResponse({'ok': False}) # elif request.POST['action'] == 'cargar_no_exentos': # politica = Politica_cuotas.objects.get(id=request.POST['id']) # num = int(request.POST['num']) # data = render_to_string("no_exentos.html", {'numero': num, 'politica': politica}) # return HttpResponse(data) # elif request.POST['action'] == 'cargar_exentos': # politica = Politica_cuotas.objects.get(id=request.POST['id']) # num = int(request.POST['num']) # data = render_to_string("exentos.html", {'numero': num, 'politica': politica}) # return HttpResponse(data) elif request.POST['action'] == 'generar_remesas': # Para validar el xml generado # http://www.mobilefish.com/services/sepa_xml_validation/sepa_xml_validation.php politica = Politica_cuotas.objects.get(id=request.POST['politica']) if politica.tipo == 'extraord': politica.concepto = request.POST['concepto'] politica.cuota = request.POST['cuota'] politica.save() usuarios = usuarios_ronda(g_e.ronda).filter(id__in=request.POST.getlist('usuarios[]')) destinatarios = [] for u in usuarios: num = 1 texto = '%s' % (u.gauser.get_full_name()) try: oa = OrdenAdeudo.objects.get(politica=politica, fecha_firma__isnull=False, gauser=u.gauser) except: oa = OrdenAdeudo.objects.none() destinatarios.append({'oa': oa, 'ge': u, 'num': num, 'texto': texto}) else: destinatarios = politica.destinatarios grupo = pass_generator(size=15, chars='abcdefghijkmnopqrstuvwxyz1234567890') remesa_emitida = Remesa_emitida.objects.create(grupo=grupo, politica=politica) # array_coutas identifica los enteros y floats almacenados en cuota # que pueden estar separados por espacios, comas, ... o cualquier secuencia de caracteres: importes = politica.array_cuotas # Proporciona una secuencia de importes añadiendo el último valor lo suficientemente grande como para # asegurar que el número elementos sobre los que se aplica la cuota es superado. # Por ejemplo si importes es [30,20,15], después de ser procesado con array_cutoas # sería [30,20,15,15,15,15,15,15,15,15,15,15,15,15,...,15,15,15,15,15] con el 15 prolongado mil veces datos = create_remesas_info_xls(remesa_emitida, destinatarios) remesa_emitida.ctrlsum = datos['ctrlsum'] remesa_emitida.nboftxs = datos['nboftxs'] remesa_emitida.reqdcolltndt = date.today() + timedelta(days=4) remesa_emitida.save() xml = render_to_string("xml_gauss.xml", {'remesa_emitida': remesa_emitida, 'destinatarios': destinatarios}) fichero = '%s.xml' % (remesa_emitida.grupo) ruta = MEDIA_CONTABILIDAD + str(g_e.ronda.entidad.code) + '/' xmlfile = open(ruta + '/' + fichero, "w+") xmlfile.write(xml) xmlfile.close() total_remesas_emitidas = Remesa_emitida.objects.filter(visible=True, politica=politica) paginator = Paginator(total_remesas_emitidas, 5) html = render_to_string('remesas_emitidas.html', {'remitidas': paginator.page(1), 'politica': politica}) return JsonResponse({'ok': True, 'html': html, 'politica': politica.id})