Esempio n. 1
0
    def query_by_user(user_id, hints=None, detail=False):
        """获取用户所有的订阅,支持增量查询

        hints: T.list(T.dict(id=T.unionid, dt_updated=T.datetime))
        """
        detail = Detail.from_schema(detail, FeedDetailSchema)
        exclude_fields = [f'feed__{x}' for x in detail.exclude_fields]
        if not hints:
            q = UserFeed.objects.select_related('feed').filter(user_id=user_id)
            q = q.defer(*exclude_fields)
            union_feeds = UnionFeed._merge_user_feeds(list(q.all()), detail=detail)
            return len(union_feeds), union_feeds, []
        hints = {x['id'].feed_id: x['dt_updated'] for x in hints}
        q = UserFeed.objects.filter(user_id=user_id).select_related('feed')
        q = q.only("id", 'feed_id', 'feed__dt_updated')
        user_feeds = list(q.all())
        total = len(user_feeds)
        feed_ids = {user_feed.feed_id for user_feed in user_feeds}
        deteted_ids = []
        for feed_id in set(hints) - feed_ids:
            deteted_ids.append(FeedUnionId(user_id, feed_id))
        updates = []
        for user_feed in user_feeds:
            feed_id = user_feed.feed_id
            dt_updated = user_feed.feed.dt_updated
            if feed_id not in hints or not dt_updated:
                updates.append(feed_id)
            elif dt_updated > hints[feed_id]:
                updates.append(feed_id)
        q = UserFeed.objects.select_related('feed')\
            .filter(user_id=user_id, feed_id__in=updates)
        q = q.defer(*exclude_fields)
        union_feeds = UnionFeed._merge_user_feeds(list(q.all()), detail=detail)
        return total, union_feeds, deteted_ids
Esempio n. 2
0
 def to_dict(self, detail=False):
     ret = dict(
         id=self.id,
         user=dict(id=self.user_id),
         is_ready=self.is_ready,
         url=self.url,
         is_from_bookmark=self.is_from_bookmark,
         status=self.status,
         dt_created=self.dt_created,
         dt_updated=self.dt_updated,
         feed_unionid=None,
     )
     if self.feed_id:
         feed_unionid = FeedUnionId(self.user_id, self.feed_id)
         ret.update(feed_id=feed_unionid)
     if detail:
         ret.update(message=self.message)
     return ret
Esempio n. 3
0
 def id(self):
     return FeedUnionId(self._user_feed.user_id, self._feed.id)
Esempio n. 4
0
 def feed_id(self):
     story = self._user_story or self._story
     return FeedUnionId(self._user_id, story.feed_id)
Esempio n. 5
0
 def feed_id(self):
     return FeedUnionId(self._user_id, self._story.feed_id)