예제 #1
0
 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
예제 #2
0
 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
예제 #3
0
 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]
예제 #4
0
    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
예제 #5
0
 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
예제 #6
0
    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
예제 #7
0
 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)
예제 #8
0
 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
예제 #9
0
    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
예제 #10
0
 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)
예제 #11
0
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]
예제 #12
0
 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