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": "👌🏿"}'
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()
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()
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()
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