def _add_follows(self, followiterator, key): ''' Guarda el usuario en el ultimo index posible, si se ha llegado al maximo numero de usuarios por lista, se crea uno nuevo. :param followiterator: Iterador con la consulta para obtener los index, ordenador por fecha de creacion asi el primero de la lista, sera el ultimo index posible. :type followiterator: :class:`_QueryIterator` :param key: key del usuario a añadir :type key: :class:`db.Key() :returns: True si se añadio el usuario ''' from models_acc import UserFollowingIndex try: last_follow = followiterator.next( ) # como estan ordenados por fecha de creacion, carga el primero que seria el ultimo indice. except StopIteration: last_follow = UserFollowingIndex(parent=self) if len( last_follow.following ) < TIMELINE_PAGE_SIZE * 2: # un maximo de usuarios en este index para que las listas no sean lentas last_follow.following.append(key) else: # creamos un index nuevo last_follow = UserFollowingIndex(parent=self, following=[key]) try: from models_acc import UserCounter counter_result = self.counters_async( ) # obtiene los contadores de self follow_query = UserCounter.all().ancestor( key) # obtiene los contadores del otro usuario follow_result = follow_query.run() counter_result = counter_result.next() follow_result = follow_result.next() counter_result.set_followings( +1) # sumamos uno al contador de following follow_result.set_followers( +1) # sumamos uno al contador de followers del otro usuario except: return False last_follow.put() return True
def _tx(user): try: from models_acc import UserFollowingIndex, UserSettings, UserProfile, UserCounter settings = UserSettings(key_name='settings_%s' % user.id, parent=user, language=language) profile = UserProfile(key_name='profile_%s' % user.id, parent=user, username=user.username, email=user.email) followings = UserFollowingIndex(parent=user) counters = UserCounter(key_name='counters_%s' % user.id, parent=user) db.put_async([settings, profile, followings, counters]) return True except: return False