parameters: (cls, tag, mesa=None)
return_statement: return seleccion
docstring: Devuelve una seleccion a partir de la informacion de un tag rfid.
docstring_summary: Devuelve una seleccion a partir de la informacion de un tag rfid.
docstring_tokens: Devuelve una seleccion a partir de la informacion de un tag rfid .
function: 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
function_tokens: 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