def desde_tag(cls, tag): """Devuelve un apertura a partir de la informacion de un tag rfid.""" autoridades = [] datos = struct_apertura.parse(tag) nro_mesa = datos.numero_mesa horas = datos.hora minutos = datos.minutos mesa = Ubicacion.first(numero=str(nro_mesa)) nombres = decodear_string_apertura(datos.nombres).split(";") dnis = unpack_slow(datos.dnis, BITS_DNI) for i in range(datos.cantidad_autoridades): apellido = nombres.pop(0) nombre = nombres.pop(0) tipo = datos.tipos.pop(0) dni = dnis.pop(0) autoridad = Autoridad(apellido, nombre, tipo, dni) autoridades.append(autoridad) return Apertura(mesa, autoridades, hora={"horas": horas, "minutos": minutos})
def desde_tag(cls, tag): """Devuelve un apertura a partir de la informacion de un tag rfid.""" autoridades = [] datos = struct_apertura.parse(tag) nro_mesa = datos.numero_mesa horas = datos.hora minutos = datos.minutos mesa = Ubicacion.first(numero=str(nro_mesa)) nombres = decodear_string_apertura(datos.nombres).split(";") dnis = unpack_slow(datos.dnis, BITS_DNI) for i in range(datos.cantidad_autoridades): apellido = nombres.pop(0) nombre = nombres.pop(0) tipo = datos.tipos.pop(0) dni = dnis.pop(0) autoridad = Autoridad(apellido, nombre, tipo, dni) autoridades.append(autoridad) return Apertura(mesa, autoridades, hora={ "horas": horas, "minutos": minutos })
def desde_string(cls, tag, mesa=None): """Devuelve una seleccion a partir de la informacion de un tag rfid. """ seleccion = None try: datos_tag = struct_voto.parse(tag) except (RangeError, FieldError, ValueError): # Manejamos que no nos puedan meter cualquier datos_tag = None if datos_tag is not None: ubic = datos_tag.ubicacion.decode("utf-8") if mesa is not None: # verificamos la mesa if mesa.cod_datos != ubic: raise MesaIncorrecta() else: # OJO: Esto trae cualquier mesa del juego de datos. # No importa por que todas las mesas del mismo juego son # compatibles. Pero no nos permite identificar de que mesa es # el voto. mesa = Ubicacion.first(cod_datos=ubic) mesa.usar_cod_datos() seleccion = Seleccion(mesa) seleccion.serial = datos_tag.serial sel_por_cat = {} # recorremos cada uno de los pares de categoria/candidatos en el # tag str_opciones = datos_tag.opciones.decode() opciones = str_opciones.split(",") if len(opciones): for elem in opciones: if len(elem): cod_cat, id_umv = elem.split(":") id_umv = int(id_umv) sel_por_cat[cod_cat] = sel_por_cat.get(cod_cat, 0) + 1 # Buscamos el candidato votado para la categoria en # cuestion candidato = Candidatura.one(id_umv=id_umv, cod_categoria=cod_cat) # y lo elegimos (Si no encontró ninguno lanza un value # error). if candidato is None: raise ValueError() max_selecciones = int( candidato.categoria.max_selecciones) borrar = max_selecciones == 1 seleccion.elegir_candidato(candidato, borrar=borrar) if len(list(sel_por_cat.keys())) != len(Categoria.all()): # caso en el que la canditad de categorias votadas sea # diferente que la cantidad de categorias seleccion = None else: # aca verificamos que la cantidad de candidatos por # categoria sea menor o igual de la cantidad de selecciones # maximas que esperamos for cod_categoria, cantidad in list(sel_por_cat.items()): categoria = Categoria.one(cod_categoria) max_selec = int(categoria.max_selecciones) if categoria is None or cantidad > max_selec: seleccion = None break return seleccion
def desde_tag(cls, tag, con_dnis=True): # Si vamos a guardar los dnis usamos el struct con DNIS, sino no. if con_dnis: struct = struct_recuento_dni else: struct = struct_recuento # Parseamos el tag datos_tag = struct.parse(tag) # Nos fijamos si el tag tiene la data de una categoria o solo de una if SMART_PACKING: try: string_datos = b"" for byte in datos_tag.datos: string_datos += byte num_mesa, valores = unpack(string_datos) except IndexError as e: raise TagMalformado(e) mesa = Ubicacion.first(numero=str(num_mesa)) else: tag = b"" for byte in datos_tag.datos: tag += byte len_cod_mesa = int(tag[:2]) cod_mesa = tag[2:2 + len_cod_mesa] mesa = Ubicacion.first(codigo=cod_mesa.decode("utf-8")) valores = unpack(tag[len_cod_mesa + 2:]) if not mesa: raise MesaNoEncontrada() mesa.usar_cod_datos() recuento = Recuento(mesa) grupo = datos_tag.grupo # Establecemos el grupo del recuento, si viene en 0 lo establecemos en # None recuento.grupo_cat = grupo if grupo else None # Traemos las candidaturas que se guardaron en el recuento candidatos = Candidatura.para_recuento(recuento.grupo_cat) # leemos los valores y los seteamos en los resultados for candidato in candidatos: recuento.pizarra.set_votos_candidato(candidato.id_umv, valores.pop(0)) # extraemos los campos extras (boletas_contadas, total_boletas, etc) ordered_keys = sorted(recuento.campos_extra.keys()) for key in ordered_keys: recuento.campos_extra[key] = valores.pop(0) # extraemos las listas especiales (OBS, IMP, NUL, REC, etc) ordered_keys = sorted(recuento.listas_especiales.keys()) for key in ordered_keys: recuento.listas_especiales[key] = valores.pop(0) # si estan los DNIS los extraemos del tag if con_dnis: dnis = unpack_slow(datos_tag.documentos, BITS_DNI) for dni in dnis: autoridad = Autoridad("", "", 0, dni) recuento.autoridades.append(autoridad) return recuento