(cls, tag, mesa=None)
return seleccion
Devuelve una seleccion a partir de la informacion de un tag rfid.
Devuelve una seleccion a partir de la informacion de un tag rfid.
Devuelve una seleccion a partir de la informacion de un tag rfid .
def desde_tag(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:
            # 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 cual porque 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)

            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 , mesa = None ) : seleccion = None try : datos_tag = struct_voto . parse ( tag ) except RangeError : # 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 cual porque 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 ) 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