def notify_followers(self): ''' Crea un timelineSystem por cada usuario que sigue a esta lista ''' if not self._is_private(): if ListFollowersIndex.all().ancestor(self.key()).count() == 0: return True for list in ListFollowersIndex.all().ancestor(self.key()): for key in list.users: timeline = UserTimelineSystem(user=key, msg_id=352, instance=self) timeline.put() return True
def notify_followers(self): ''' Crea un timelineSystem por cada usuario que sigue a esta lista ''' from models_indexes import ListFollowersIndex if not self._is_private(): if ListFollowersIndex.all().ancestor(self.key()).count() == 0: return True timelines = [] for list in ListFollowersIndex.all().ancestor(self.key()): for key in list.users: timelines.append(UserTimelineSystem(parent=key, user=key, msg_id=351, instance=self)) db.put(timelines) return True
def get_list_user_following(self, user): ''' Devuelve las listas a las que sigue el usuario :param user: usuario del que buscar las listas :type user: :class:`geouser.models.User` ''' indexes = ListFollowersIndex.all().filter('_kind =', self._klass.kind()).filter('keys =', user.key()) return [index.parent() for index in indexes]
def insert_list(cls, user, id=None, name=None, description = None, instances=[], instances_del=[], tags = None, vis='public'): """ Crea una nueva lista, en el caso de que exista una con ese nombre, se añaden las alertas :param user: usuario :type user: :class:`geouser.models.User` :param name: nombre de la lista :type name: :class:`string` :param description: descripcion de la lista :type description: :class:`string` :param instances: objetos a añadir a la lista :type instances: :class:`geoalert.models.Alert` :param vis: Visibilidad de la lista :type vis: :class:`string` """ list = None if id is not None: list = cls.objects.get_by_id_user(id, user) if list is None: list = user.listsuggestion_set.filter('name =', name).get() if list is not None: # la lista con ese nombre ya existe, la editamos list.update(name=name, description=description, instances=instances, instances_del=instances_del, tags=tags, vis=vis ) return list return False keys= set([db.Key.from_path('Event', int(instance)) for instance in instances]) list = ListSuggestion(name=name, user=user, description=description, keys=[k for k in keys], _vis=vis if vis is not None else 'public' ) if tags is not None: list._tags_setter(tags, commit=False) list.put() followers = ListFollowersIndex(parent=list.key(), keys=[list.user.key()]) followers.put() return list
def _user_is_follower(self, user_key): ''' Busca si un usuario ya sigue a una lista :param user_key: key del usuario a buscar :type user_key: :class:`db.Key` :returns: True si el usuario ya sigue la lista. False si no. ''' if not self.is_saved(): return db.NotSavedError() index = ListFollowersIndex.all().ancestor(self.key()).filter('keys =', user_key).get() if index is not None: return True return False
def _user_is_follower(self, user_key): ''' Busca si un usuario ya sigue a una lista :param user_key: key del usuario a buscar :type user_key: :class:`db.Key` :returns: True si el usuario ya sigue la lista. False si no. ''' if not self.is_saved(): return db.NotSavedError() from models_indexes import ListFollowersIndex index = ListFollowersIndex.all().ancestor(self.key()).filter('keys =', user_key).get() if index is not None: return True return False
def del_follower(self, user_key): ''' Borra un usuario de la lista :param user_key: key del usuario a buscar :type user_key: :class:`db.Key` :returns: True si se borro el usuario. False si hubo algun error o no existia ''' def _tx(index_key, user_key): index = db.get(index_key) index.keys.remove(user_key) index.count -= 1 index.put() if not self._user_is_follower(user_key): return False index = ListFollowersIndex.all().ancestor(self.key()).filter('keys =', user_key).get() db.run_in_transaction(index.key(), user_key)
def _tx(list_key, user_key): # TODO : cambiar a contador con sharding from models_indexes import ListFollowersIndex if ListFollowersIndex.all().ancestor(list_key).filter('keys =', user_key).get() is not None: return False # el usuario ya sigue la lista # indice con personas que siguen la sugerencia index = ListFollowersIndex.all().ancestor(list_key).filter('count <', 80).get() if index is None: index = ListFollowersIndex(parent=list_key) index.keys.append(user_key) index.count += 1 index.put() return True
def del_follower(self, user): """ Borra un usuario de la lista :param user_key: key del usuario a buscar :type user_key: :class:`db.Key` :returns: True si se borro el usuario. False si hubo algun error o no existia """ if self.__class.user.get_value_for_datastore(self) == user.key(): return False def _tx(index_key, user_key): index = db.get(index_key) index.keys.remove(user_key) index.count -= 1 index.put() user_key = user.key() if not self._user_is_follower(user_key): return False from models_indexes import ListFollowersIndex index = ListFollowersIndex.all().ancestor(self.key()).filter('keys =', user_key).get() db.run_in_transaction(_tx, index.key(), user_key) list_following_deleted.send(sender=self, user=db.get(user_key)) return True
def add_follower(self, user_key): ''' Añade un usuario a la lista :param user_key: key del usuario a buscar :type user_key: :class:`db.Key` :returns: True si se añadio (o ya existia) el usuario. False si hubo algun error ''' def _tx(index_key, user_key): index = db.get(index_key) index.keys.append(user_key) index.count += 1 index.put() if self._user_is_follower(user_key): return True if ListFollowersIndex.all().ancestor(self.key).count() == 0: index = ListFollowersIndex(parent=self, kind=self.kind()) index.put() else: index = ListFollowersIndex.all().ancestor(self.key()).filter('count <', 80).order('created').get() # TODO: en vez de cargar todo el objeto, obtener solo el key db.run_in_transaction(index.key(), user_key)
class ListHelper(object): _klass = List def get_all_public(self, query_id=None, page=1): ''' Devuelve todas las listas publicas ¡PAGINADA! :param page: numero de pagina a mostrar :type param: int :param query_id: identificador de busqueda :type query_id: int ''' q = self._klass.all().filter('_vis =', 'public').filter('active =', True).order('-modified') from georemindme.paging import PagedQuery p = PagedQuery(q, id=query_id) lists = p.fetch_page(page) prefetch_refprops(lists, self._klass.user) return [p.id, lists] def get_by_id(self, id): ''' Devuelve la lista publica con ese ID :param id: identificador de la lista :type id: :class:`Integer` :returns: None o :class:`geolist.models.List` ''' try: id = int(id) except: raise TypeError list = self._klass.get_by_id(id) return list def get_by_name_user(self, name, user): list = self._klass.all().filter('user ='******'name =', name).filter( 'active =', True).get() return list def get_by_id_querier(self, id, querier): ''' Devuelve la lista publica con ese ID :param id: identificador de la lista :type id: :class:`Integer` :returns: None o :class:`geolist.models.List` ''' if not isinstance(querier, User) and not isinstance( querier, AnonymousUser): raise TypeError() list = self.get_by_id(id) if list is None: return None if list.__class__.user.get_value_for_datastore(list) == querier.key(): return list if hasattr(list, '_vis'): if list._is_public(): return list elif list._is_shared() and list.user_invited(querier): return list return None def get_by_id_user(self, id, user): ''' Devuelve la lista con ese ID y el usuario como dueño. :param id: identificador de la lista :type id: :class:`Integer` :param user: usuario :type user: :class:`geouser.models.User` :returns: None o :class:`geolist.models.List` ''' list = self.get_by_id(id) if list is not None: if not list.active: return None if list.__class__.user.get_value_for_datastore(list) == user.key(): return list return None def get_list_user_following(self, user, resolve=False, async=False): ''' Devuelve las listas a las que sigue el usuario :param user: usuario del que buscar las listas :type user: :class:`geouser.models.User` ''' if not user.is_authenticated(): return [] from google.appengine.api import datastore if async: indexes = ListFollowersIndex.all(keys_only=True).filter( 'keys =', user.key()) return indexes.run() q = datastore.Query('ListFollowersIndex', {'keys =': user.key()}, keys_only=True) run = q.Run() indexes = [a for a in run] lists = model_plus.fetch_parentsKeys(indexes) return [list.to_dict(resolve=resolve) for list in lists if list.active]
def has_follower(self, user): if not user.is_authenticated(): return False if ListFollowersIndex.all(keys_only=True).ancestor(self.key()).filter('keys =', user.key()).get() is not None: return True return False