def desde_tag(cls, tag, con_dnis=True): if con_dnis: struct = struct_recuento_dni else: struct = struct_recuento datos_tag = struct.parse(tag) por_categoria = int(datos_tag.por_categoria) cod_categoria = datos_tag.cod_categoria if SMART_PACKING: num_mesa, valores = unpack("".join(datos_tag.datos)) mesa = Ubicacion.one(numero=str(num_mesa)) else: tag = "".join(datos_tag.datos) len_cod_mesa = int(tag[:2]) cod_mesa = tag[2:2 + len_cod_mesa] mesa = Ubicacion.one(cod_mesa) valores = unpack(tag[len_cod_mesa + 2:]) if not mesa: raise MesaNoEncontrada() current_data_code(mesa.cod_datos) if por_categoria: categorias = Categoria.many(codigo=cod_categoria) else: categorias = Categoria.many(sorted='codigo') recuento = Recuento(mesa) principales = recuento._get_dict_candidatos() # leemos los valores y los seteamos en los resultados # vienen ordenados por cod_lista,cod_categoria for lista in Lista.many(sorted='codigo'): for categoria in categorias: candidato = Candidato.one(cod_categoria=categoria.codigo, cod_lista=lista.codigo, titular=True, numero_de_orden=1) if candidato is not None: recuento._resultados[categoria.codigo, candidato.codigo] = valores.pop(0) ordered_keys = sorted(recuento.campos_extra.keys()) for key in ordered_keys: recuento.campos_extra[key] = valores.pop(0) ordered_keys = sorted(recuento.listas_especiales.keys()) for key in ordered_keys: recuento.listas_especiales[key] = valores.pop(0) if por_categoria: recuento.cod_categoria = cod_categoria if con_dnis: dnis = unpack_slow(datos_tag.documentos, 27) for dni in dnis: autoridad = Autoridad("", "", 0, dni) recuento.autoridades.append(autoridad) return recuento
def desde_tag(cls, tag, con_dnis=True): if con_dnis: struct = struct_recuento_dni else: struct = struct_recuento datos_tag = struct.parse(tag) por_categoria = int(datos_tag.por_categoria) cod_categoria = datos_tag.cod_categoria if SMART_PACKING: num_mesa, valores = unpack("".join(datos_tag.datos)) mesa = Ubicacion.one(numero=str(num_mesa)) else: tag = "".join(datos_tag.datos) len_cod_mesa = int(tag[:2]) cod_mesa = tag[2:2 + len_cod_mesa] mesa = Ubicacion.one(cod_mesa) valores = unpack(tag[len_cod_mesa + 2:]) if not mesa: raise MesaNoEncontrada() current_data_code(mesa.cod_datos) if por_categoria: categorias = Categoria.many(codigo=cod_categoria) else: categorias = Categoria.many(sorted='codigo') recuento = Recuento(mesa) principales = recuento._get_dict_candidatos() # leemos los valores y los seteamos en los resultados # vienen ordenados por cod_lista,cod_categoria for lista in Lista.many(sorted='codigo'): for categoria in categorias: candidato = principales.get((lista.codigo, categoria.codigo)) if candidato is not None: recuento._resultados[categoria.codigo, candidato.codigo] = valores.pop(0) ordered_keys = sorted(recuento.campos_extra.keys()) for key in ordered_keys: recuento.campos_extra[key] = valores.pop(0) ordered_keys = sorted(recuento.listas_especiales.keys()) for key in ordered_keys: recuento.listas_especiales[key] = valores.pop(0) if por_categoria: recuento.cod_categoria = cod_categoria if con_dnis: dnis = unpack_slow(datos_tag.documentos, 27) for dni in dnis: autoridad = Autoridad("", "", 0, dni) recuento.autoridades.append(autoridad) return recuento
def recibir_mesaypin(self, data): """ Recibe la mesa y pin ingresada y la valida para pasar a la siguiente pantalla, o rechaza el ingreso y vuelve a pedir el ingreso de datos Respuesta es un json: {"mesa": 1, "pin": 23533} """ mesa = data['mesa'] pin = data['pin'] mesa_obj = Ubicacion.one(numero=mesa) if mesa_obj is not None and (pin is not None and hashlib.sha1(pin).hexdigest() == mesa_obj.pin): try: self.parent._validar_configuracion(mesa, pin) except: self.sesion.mesa = mesa_obj self.estado = E_INGRESO_DATOS self.set_pantalla({"callback": ""}) else: self.msg_mesaypin_incorrecto() self._intento += 1 if self._intento >= 3: self.sesion.impresora.expulsar_boleta() self.parent.quit()
def desde_string(cls, tag, mesa=None): datos_tag = struct_voto.parse(tag) if mesa is not None: # verificamos la mesa if mesa.cod_datos != datos_tag.ubicacion: raise MesaIncorrecta() else: #OJO: ESTO trae cualquier mesa del juego de datos mesa = Ubicacion.one(cod_datos=datos_tag.ubicacion) current_data_code(datos_tag.ubicacion) if datos_tag.cod_interna != "": interna = Partido.one(datos_tag.cod_interna) else: interna = None candidatos = [] for elem in datos_tag.voto_categoria: cod_categoria = elem["cod_categoria"].strip() cod_candidato = elem["cod_candidatura"].strip() if cod_candidato == COD_LISTA_BLANCO: candidato = Candidato.one(codigo__endswith=cod_candidato, cod_categoria=cod_categoria) else: candidato = Candidato.one(codigo__endswith="." + cod_candidato, cod_categoria=cod_categoria) candidatos.append(candidato) return Seleccion(mesa, None, candidatos)
def recibir_mesaypin(self, data): """ Recibe la mesa y pin ingresada y la valida para pasar a la siguiente pantalla, o rechaza el ingreso y vuelve a pedir el ingreso de datos Respuesta es un json: {"mesa": 1, "pin": A1C2E3G4} """ mesa_valida = False mesa = data['mesa'] pin = data['pin'] mesa_obj = Ubicacion.one(numero=mesa) if mesa_obj is not None: mesa_valida = mesa_obj.validar(self.sesion.salt, pin, self.sesion.key_credencial) if mesa_valida: self.modulo._validar_configuracion(mesa_obj) else: self.msg_mesaypin_incorrecto() self._intento += 1 if self._intento >= 3: self.sesion.impresora.expulsar_boleta() self.modulo.salir_a_modulo(MODULO_INICIO)
def desde_string(cls, tag, mesa=None): datos_tag = struct_voto.parse(tag) if mesa is not None: # verificamos la mesa if mesa.cod_datos != datos_tag.ubicacion: raise MesaIncorrecta() else: #OJO: ESTO trae cualquier mesa del juego de datos mesa = Ubicacion.one(cod_datos=datos_tag.ubicacion) current_data_code(datos_tag.ubicacion) candidatos = [] for elem in datos_tag.voto_categoria: cod_categoria = elem["cod_categoria"].strip() cod_candidato = elem["cod_candidatura"].strip() if cod_candidato == COD_LISTA_BLANCO: candidato = Candidato.one(codigo__endswith=cod_candidato, cod_categoria=cod_categoria) else: candidato = Candidato.one(codigo__endswith="." + cod_candidato, cod_categoria=cod_categoria) candidatos.append(candidato) return Seleccion(mesa, None, candidatos)
def _configurar_ubicacion_demo(self, tag, data=None): # Guardo una referencia a la configuracion anterior, para cuando salga # volver a configurarla #if self.pantalla: # self.pantalla.callback = self.controlador # self.pantalla.quit() mesa_obj = Ubicacion.one(numero=tag) self._mesa_anterior = sesion.mesa #self._configurar_mesa(mesa_obj) sesion.mesa = mesa_obj
def buffer_file_cmp(printer, file_name): current_data_code("EJ.01.01") mesa = Ubicacion.one(codigo="EJ.01.01.01.01") boleta = Seleccion(mesa) boleta.elegir_lista(Lista.one()) img = boleta.a_imagen() img = img.output() img = img.transpose(Image.ROTATE_90) data = img.getdata() printer.load_buffer_compressed(data)
def _get_data_mesas(self): # Uso un set para tomar las N distintas configuraciones configuraciones = set() # En mesas_demo guardo las mesas de ejemplo. mesas_demo = [] # Tomo una mesa testigo por cada lugar diferente for obj in Ubicacion.many(clase="Mesa"): if obj.cod_datos not in configuraciones: configuraciones.add(obj.cod_datos) ext = obj.extranjera and _("extranjeros_demo") or "" mesas_demo.append((obj.numero, obj.municipio, ext)) return mesas_demo
def _get_data_mesas(self): """Devuelve la data de los botones de cada ubicacion diferente.""" # Uso un set para tomar las N distintas configuraciones configuraciones = set() # En mesas_capacitacion guardo las mesas de ejemplo. mesas_capacitacion = [] # Tomo una mesa testigo por cada lugar diferente for obj in Ubicacion.many(clase="Mesa"): if obj.cod_datos not in configuraciones: configuraciones.add(obj.cod_datos) mesas_capacitacion.append((obj.numero, obj.departamento, obj.municipio, obj.extranjera)) return mesas_capacitacion
def _get_data_mesas(self): # Uso un set para tomar las N distintas configuraciones configuraciones = set() # En mesas_demo guardo las mesas de ejemplo. mesas_demo = [] # Tomo una mesa testigo por cada lugar diferente for obj in Ubicacion.many(clase="Mesa"): key = (obj.municipio, obj.extranjera) if key not in configuraciones: configuraciones.add(key) ext = obj.extranjera and "(Ext)" or '' mesas_demo.append( (obj.numero, obj.departamento, obj.municipio, ext)) return mesas_demo
def _get_data_mesas(self): # Uso un set para tomar las N distintas configuraciones configuraciones = set() # En mesas_demo guardo las mesas de ejemplo. mesas_demo = [] # Tomo una mesa testigo por cada lugar diferente for obj in Ubicacion.many(clase="Mesa"): key = (obj.municipio, obj.extranjera) if key not in configuraciones: configuraciones.add(key) ext = obj.extranjera and "(Ext)" or '' mesas_demo.append((obj.numero, obj.departamento, obj.municipio, ext)) return mesas_demo
def get_estado_mesas(id_ubicacion, acta_desglosada=False): """ Recibe un id_ubicación de un establecimiento y devuelve los datos en el formato del server. [id_planilla, estado, numero_mesa, sexo, codigo_ubicacion] @TODO: Ver actas desglosadas. """ mesas = [] for u in Ubicacion.many(clase='Mesa', codigo__startswith=id_ubicacion + '.'): datos_mesa = [[u.id_planilla, "Espera", u.numero, None, u.codigo]] if acta_desglosada: current_data_code(u.cod_datos) for c in Categoria.all(): datos_mesa.append([c.codigo, c.nombre, c.posicion]) mesas.append(datos_mesa) return mesas
def desde_tag(self, 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.one(numero=str(nro_mesa)) nombres = self.decodear_string(datos.nombres).split(";") for i in range(datos.cantidad_autoridades): apellido = nombres.pop(0) nombre = nombres.pop(0) tipo = datos.tipos.pop(0) dni = unpack_slow(datos.dnis.pop(0), 27)[0] autoridad = Autoridad(apellido, nombre, tipo, dni) autoridades.append(autoridad) return Apertura(mesa, autoridades, hora={"horas": horas, "minutos": minutos})
def _validar_configuracion(self, mesa=None, pin=None, con_acta_apertura=False, datos_tag=''): """ Recibe el numero de mesa y el pin de la pantalla de configuración y verifica que sea correcto. Si es *con_acta_apertura* se carga la mesa automaticamente y con datos tag carga los datos del presidente Si es correcto configura la mesa para dejarla operativa y pasa al menú de administración, en otro caso presenta la pantalla principal. """ mesa_obj = Ubicacion.one(numero=mesa) if mesa_obj is not None and \ (pin is not None and hashlib.sha1(pin).hexdigest() == mesa_obj.pin or con_acta_apertura): self._mesa = mesa_obj # Le seteo el atributo abierta si la configuracion de la mesa fue # con el acta de apertura self._configurar_mesa() if con_acta_apertura: apertura = Apertura.desde_tag(datos_tag) sesion.apertura = apertura self.estado = E_CONFIGURADA self.ret_code = MODULO_ADMIN if self.rampa.tiene_papel: self.rampa.expulsar_boleta() gobject.idle_add(self.quit) else: if sesion.lector is None: msg = _("error_conectar_lector") else: msg = _("mesa_pin_incorrectos") mensaje = {"aclaracion": msg} self.estado = E_INICIAL self.ventana.remove(self.ventana.children()[0]) self._cargar_ui_web() self.ventana.show_all() self._pantalla_principal() self.show_dialogo(mensaje, btn_aceptar=True)
def desde_dict(self, id_planilla, hora, data_dict, campos_extra): """Genera un recuento desde un diccionario con los datos. Argumentos: id_planilla -- el id_planilla del acta que queremos generar. hora -- un diccionario con la hora {"horas": int, "minutos": int} data_dict -- un diccionario con los datos. De key el id_ubicacion y de value la cantidad de votos. listas_especiales -- un diccionaio con las listas_especiales de key el id_de lista especial y de value un diccionario que a su vez tiene de key el codigo de categoria y la cantidad de votos especiales como valor. campos_extra -- un diccionario con los campos_extra como key y el valor numerico del campo extra como valor. """ mesa = Ubicacion.one(id_planilla=id_planilla) mesa.usar_cod_datos() recuento = Recuento(mesa, hora=hora) for key, value in data_dict.items(): recuento.pizarra.set_votos_candidato(key, value) recuento.campos_extra = campos_extra return recuento
def generar_lista_archivos(self): """Genera la lista de archivos de los cuales puede sacar settings.""" files = [] default = self._generar_nombre(DEFAULT_FILE) files.append(default) ubic_files = [] # Configuraciones por ubicacion. ubicacion = Ubicacion.one(codigo=self.id_ubicacion) while ubicacion is not None: if ubicacion.clase in NIVELES_CONFIG: file_ = self._generar_nombre(ubicacion.codigo) ubic_files.append(file_) ubicacion = ubicacion.parent ubic_files.reverse() files += ubic_files local = self._generar_nombre(OVERRIDE_FILE) files.append(local) return files
def get_tag(): mesa = Ubicacion.get(numero="1001") recuento = Recuento(mesa) seleccion = Seleccion(mesa) listas = Lista.all() lista = Lista.get(numero="207") for i in range(200): seleccion.elegir_lista(lista) recuento.sumar_seleccion(seleccion) lista = Lista.get(numero="38") for i in range(100): seleccion.elegir_lista(lista) recuento.sumar_seleccion(seleccion) lista = Lista.get(numero="603") for i in range(50): seleccion.elegir_lista(lista) recuento.sumar_seleccion(seleccion) for i in range(46): lista = choice(listas) seleccion.elegir_lista(lista) recuento.sumar_seleccion(seleccion) tag = seleccion.a_tag() return tag
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 activar_impresion(self, nro_mesa): mesa = Ubicacion.one(numero=nro_mesa) self.mesa = mesa mesa.usar_cod_datos() self.estado = E_EN_CONFIGURACION
# Seteo el volumen del audio al maximo antes de iniciar audioplayer = WavPlayer(as_daemon=False) audioplayer.set_volume(VOLUMEN_GENERAL) audioplayer.close() if options.modulo is None: modulo = modulos_startup.pop() else: modulo = options.modulo if options.ubicacion is not None: from msa.core.data import Ubicacion from msa.voto.sesion import get_sesion sesion = get_sesion() sesion.mesa = Ubicacion.one(options.ubicacion) ejecutar = True res = "" while ejecutar: # Instancio una clase, y ejecuto su metodo main() # Este metodo debe devolver un string si quiere llamar a otro modulo paquete, nombre_mod = modulos_aplicacion[modulo] paquete = import_module(".%s" % paquete, "msa.voto.modulos") mod = getattr(paquete, nombre_mod)() res = mod.main() # Paso la escoba para evitar el leak de las imágenes de los candidatos # esto es quizá redundante, dados los pasos similares en ModuloVoto, # pero necesario. if hasattr(mod, "pantalla"):
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
def _configurar_ubicacion_capacitacion(self, tag, data=None): """Establece la ubicacion para capacitar.""" mesa_obj = Ubicacion.one(numero=tag) mesa_obj.set_aes_key(b"\xff" * 16) self._mesa_anterior = self.sesion.mesa self.sesion.mesa = mesa_obj
# Seteo el volumen del audio al maximo antes de iniciar audioplayer = WavPlayer(as_daemon=False) audioplayer.set_volume(VOLUMEN_GENERAL) audioplayer.close() if options.modulo is None: modulo = modulos_startup.pop() else: modulo = options.modulo if options.ubicacion is not None: from msa.core.data import Ubicacion from msa.voto.sesion import get_sesion sesion = get_sesion() sesion.mesa = Ubicacion.one(options.ubicacion) ejecutar = True res = '' while ejecutar: # Instancio una clase, y ejecuto su metodo main() # Este metodo debe devolver un string si quiere llamar a otro modulo paquete, nombre_mod = modulos_aplicacion[modulo] paquete = import_module(".%s" % paquete, "msa.voto.modulos") mod = getattr(paquete, nombre_mod)() res = mod.main() # Paso la escoba para evitar el leak de las imágenes de los candidatos # esto es quizá redundante, dados los pasos similares en ModuloVoto, # pero necesario. if hasattr(mod, 'pantalla'):