Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
    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()
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
    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()
Exemple #7
0
    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)
Exemple #8
0
    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)
Exemple #9
0
 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
Exemple #10
0
 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
Exemple #11
0
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)
Exemple #12
0
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)
Exemple #13
0
    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})
Exemple #14
0
    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})
Exemple #15
0
    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)
Exemple #16
0
 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
Exemple #17
0
 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
Exemple #18
0
    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
Exemple #19
0
 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
Exemple #20
0
 def activar_impresion(self, nro_mesa):
     mesa = Ubicacion.one(numero=nro_mesa)
     self.mesa = mesa
     mesa.usar_cod_datos()
     self.estado = E_EN_CONFIGURACION
Exemple #21
0
    # 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'):
Exemple #22
0
    # 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"):
Exemple #23
0
 def activar_impresion(self, nro_mesa):
     mesa = Ubicacion.one(numero=nro_mesa)
     self.mesa = mesa
     mesa.usar_cod_datos()
     self.estado = E_EN_CONFIGURACION