Exemplo n.º 1
0
 def delete(self):
     ndb.delete_multi(Comentario.query().fetch(keys_only=True))
     ndb.delete_multi(MeGusta.query().fetch(keys_only=True))
     ndb.delete_multi(Evento.query().fetch(keys_only=True))
     ndb.delete_multi(Usuario.query().fetch(keys_only=True))
     ndb.delete_multi(Categoria.query().fetch(keys_only=True))
     self.response.unicode_body = u'{"True": "👌🏿"}'
Exemplo n.º 2
0
def do_it():
    ndb.delete_multi(Comentario.query().fetch(keys_only=True))
    ndb.delete_multi(MeGusta.query().fetch(keys_only=True))
    ndb.delete_multi(Evento.query().fetch(keys_only=True))
    ndb.delete_multi(Usuario.query().fetch(keys_only=True))
    ndb.delete_multi(Categoria.query().fetch(keys_only=True))

    add_categories()
    add_users()
    add_events()
Exemplo n.º 3
0
def buscar_eventos_tipo_usuario(usuario):
    """
    :param usuario:
    :return: list Evento
    """
    current_datetime = datetime.datetime.today()
    q = Evento.query(Evento.fecha > current_datetime)
    q.order(Evento.fecha)
    if usuario and usuario.tipo != 3:
        q.filter(Evento.validado == True)
    return q.fetch()
Exemplo n.º 4
0
def buscar_eventos_usuario(usuario, todos):
    """
    :param usuario: Usuario
    :param todos: boolean
    :return: list Evento
    """
    if usuario:
        q = Evento.query(ancestor=usuario.key)
        if todos:
            q.filter(Evento.validado == True)
        q.order(Evento.fecha)
        return q.fetch()
    else:
        raise AgendamlgNotFoundException.usuario_no_existe()
Exemplo n.º 5
0
def buscar_evento_categorias(usuario, **filtrado):
    """
    Dados unos criterios de filtrados proporcionados en filtrado, se devuelve
    una lista de Eventos que satisfagan esos criterios. El filtrado se pasa como
    un diccionario expandido: buscar_evento_categorias(**filtrado), filtrado tiene el siguiente
    aspecto:

    {
    categorias: list Categoria, # Lista de claves de Categoria para el filtrado, claves de Categoria!
    ordenarPorDistancia: Boolean     # Indicar si se esta filtrando (ordenando) por cercania respecto a una posicion y radio dados
    coordenadas: ndb.GeoPt      # Objeto GeoPt de ndb que almacena las coordenadas, posicion dada por el usuario (procedente GeoLocalizacion normalmente)
    radio: float                # Radio alrededor del cual filtrar los eventos
    textoTitulo: string         # Filtrar eventos ademas en base al titulo
    }

    :param usuario: Usuario     # Usuario que hace la consulta (qué eventos mostrar)
    :param filtrado: Descrito anteriormente
    :return: list Evento
    """

    fecha_actual = dt.utcnow()

    # Se construye una primera consulta, la cual irá refinándose
    # conforme los requisitos de filtrado

    # Ojo! Los objetos de consulta son inmutables, tener esto en cuenta
    consulta = Evento.query()

    # Filtrar por aquellos cuya fecha sea posterior a la actual o bien sean persistentes o frecuentes (tipo 2 y 3)
    consulta = consulta.filter(ndb.OR(Evento.fecha > fecha_actual, Evento.tipo == 2, Evento.tipo == 3))

    # Si no se pide filtrado por distancia, se hace ordenacion por fecha descendente
    if not filtrado.get('ordenarPorDistancia', '') == 'true':
        consulta = consulta.order(Evento.fecha)

    else:
        # De lo contrario no se traen de la base de datos eventos que no tengan coordenadas
        # consulta = consulta.filter(Evento.coordenadas != None)
        # Esto no se puede hacer, porque en una query solo se permite un unico filter de no
        # gualdad, que no sea ==
        # Ademas en el objeto filtrado hay que establecer la clave "coordenadas" que es un GeoPt
        # a partir de la latitud y longitud proporcionadas
        filtrado['coordenadas'] = ndb.GeoPt(filtrado['latitud']+', '+filtrado['longitud'])
        # Por otro lado se convierte el radio a float
        filtrado['radio'] = float(filtrado['radio'])

    # Si el usuario no es periodista o no ha iniciado sesion se obtienen solo los eventos validados
    if not usuario or usuario.tipo != 3:
        consulta = consulta.filter(Evento.validado == True)

    # Si se da una lista de categorias y esta no es vacia considera tambien en la consulta
    if len(filtrado.get('categorias', [])) > 0:
        consulta = consulta.filter(Evento.categorias.IN(filtrado['categorias']))

    # El orden por distancia o el filtrado por titulo debe hacerse fuera de DataStore por la forma en que este funciona
    # https://stackoverflow.com/questions/23317280/appengine-search-api-vs-datastore
    # Las coordenadas del evento no pueden usarse para hacer una query por cercania a otra coordenada, es decir
    # datastore no las trata de forma especial, de ahi que sea necesaria la formula del Haversine:
    # https://stackoverflow.com/questions/1033240/how-do-i-query-for-entities-that-are-nearby-with-the-geopt-property-in-google
    # Es por esto que ahora se esta en condicion de obtener la lista de resultados para trabajar con ella

    resultados = consulta.fetch()

    # Se dispone de filtro de cercania, en consecuencia los eventos se ordenan por distancia a la proporcionada
    if filtrado.get('ordenarPorDistancia', '') == 'true':

        # Dado que anteriormente el query de no igualdad no se ha podido hacer porque solo se puede
        # tener uno en una query, se eliminan a mano los eventos que no tienen coordenadas, es decir GeoPt
        resultados = [resultadogeo for resultadogeo in resultados if resultadogeo.coordenadas is not None]

        # Preparar un iterador con pares (distancia, evento). Donde distancia es la distancia del evento a
        # la posición proporcionada
        distancias = ((distancia((ev.coordenadas.lat, ev.coordenadas.lon),
                                 (filtrado['coordenadas'].lat, filtrado['coordenadas'].lon)), ev) for ev in resultados)

        # El siguiente iterador elimina los eventos que esten a una distancia mayor de la proporcionada
        # La distancia se pone negativa para que funcione la ordenacion descendente (a igual distancia,
        # se escoger la fecha mas reciente (mayor)
        lejanos_eliminados = ((-dist, ev) for (dist, ev) in distancias if dist <= filtrado['radio'])

        # Se ordenan los pares de esa lista de acuerdo a una funcion de ordenacion
        ordenacion = sorted(lejanos_eliminados, key=itemgetter(0, 1), reverse=True)

        # Se obtiene una lista de eventos
        resultados = [ev for (dist, ev) in ordenacion]

    # Fitrar resultados de nuevo, esta vez por el texto del titulo que se ofrezca (si se ofrece)

    if len(filtrado.get('textoTitulo', '').strip()) > 0:
        palabra_clave = filtrado.get('textoTitulo', '').strip().lower()
        resultados = [evento_filtro for evento_filtro in resultados if palabra_clave in evento_filtro.nombre.lower()]

    return resultados