예제 #1
0
파일: actas.py 프로젝트: bauna/vot.ar
    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})
예제 #2
0
    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
                        })
예제 #3
0
    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
예제 #4
0
파일: actas.py 프로젝트: bauna/vot.ar
    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
예제 #5
0
    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