def feed(request): if not request.user.is_authenticated(): return redirect('landingpage') top_hashtags = Hashtag.top() user_circles = request.user.get_circles() user_circles_with_posts = [] all_circles_posts = [] for circle in user_circles: posts_in_circle = Post.visible_posts_for(request.user) \ .filter(author__in=circle.get_members()) \ .order_by('-created_at')[:50] circle_with_posts = { 'circle': circle, 'posts': posts_in_circle } user_circles_with_posts.append(circle_with_posts) all_circles_posts.extend(posts_in_circle) # take all posts of all circles sort them by create_at descending and take only 50 newest all_circles_posts.sort(key=lambda post: post.created_at, reverse=True) all_circles_posts = all_circles_posts[:50] context = { 'top_hashtags': top_hashtags, 'user_circles_with_posts': user_circles_with_posts, 'all_circles_posts': all_circles_posts } return render(request, 'feed.html', context)
def render_to_response(self, context, **response_kwargs): posts = Post.visible_posts_for(self.request.user).filter(author=self.object.pk) \ .select_related('author', 'repost_original', 'reply_original').all() for post in posts: post.set_post_extra(self.request) for reply in post.extra['replies']: reply.set_post_extra(self.request) context.update(posts=posts) context.update(top_hashtags=Hashtag.top()) context.update(active_tab='posts') return super(UserProfileView, self).render_to_response(context, **response_kwargs)
def get_queryset(self): """ Returns the posts containing a wished hashtag @return posts objects that contain the searched hashtag """ try: posts = Hashtag.filter_posts_by_hashtag(self.kwargs['hashtag_name']) except Hashtag.DoesNotExist: raise Http404('Hashtag "%s" does not exist' % self.kwargs['hashtag_name']) for post in posts: post.set_post_extra(self.request) return posts
def get_queryset(self): """ Returns the posts containing a wished hashtag @return posts objects that contain the searched hashtag """ try: posts = Hashtag.filter_posts_by_hashtag( self.kwargs['hashtag_name']) except Hashtag.DoesNotExist: raise Http404('Hashtag "%s" does not exist' % self.kwargs['hashtag_name']) for post in posts: post.set_post_extra(self.request) return posts
def render_to_response(self, context, **response_kwargs): """ Gets all the posts that have been favour by the user. @return: the favorited posts """ favorite_posts = User.objects.get(pk=self.object.pk).favorites.all() visible_posts = Post.visible_posts_for(self.request.user).filter(author=self.object.pk) \ .select_related('author', 'repost_original', 'reply_original').all() posts = list() for favorite_post in favorite_posts: if favorite_post in visible_posts: favorite_post.set_post_extra(self.request) for reply in favorite_post.extra['replies']: reply.set_post_extra(self.request) posts.append(favorite_post) context.update(posts=posts) context.update(top_hashtags=Hashtag.top()) context.update(active_tab='favorites') return super(UserFavoriteView, self).render_to_response(context, **response_kwargs)
def get_context_data(self, **kwargs): """Collects all results and update the context with them.""" query = self.request.GET.get('q', '').strip() show_all = self.request.GET.get('all', '') p_from, p_to = map(int, self.request.GET.get('range', '0-3').split('-')) # xxx 20 or 50 # search_type is @ for user, # for hashtag, # anything else for full text search search_type = query[0] if query and query[0] in ('@', '#') else None # for user/hashtag search, skip the @# and search for the remaining text search_text = query[1:] if search_type else query pq = Post.visible_posts_for(self.request.user) if search_type == '@': # user search users_by_name = User.objects.filter(name__icontains=search_text) users_by_username = User.objects.filter(username__icontains=search_text) users = users_by_name | users_by_username hashtags = Hashtag.objects.filter( posts__author__in=users, posts__created_at__gt=datetime.datetime.now() - datetime.timedelta(days=1) ).annotate(itemcount=Count('name')).order_by('-itemcount') posts_by_content = pq.filter(content__icontains=query) posts_by_name = pq.filter(author__name__icontains=search_text) posts_by_username = pq.filter(author__username__icontains=search_text) posts = posts_by_content | posts_by_name | posts_by_username elif search_type == '#': # hashtag search # users with most usages of this hashtag during the past day users = User.objects.filter( post__hashtag__name=search_text, post__created_at__gt=datetime.datetime.now() - datetime.timedelta(days=1) ).annotate(itemcount=Count('name')).order_by('-itemcount') hashtags = [] posts = pq.filter(hashtag__name=search_text) else: # full text search users_by_name = User.objects.filter(name__icontains=search_text) users_by_username = User.objects.filter(username__icontains=search_text) users_by_desc = User.objects.filter(description__icontains=query) users = users_by_name | users_by_username | users_by_desc hashtags = Hashtag.objects.filter(name__icontains=query) \ .annotate(itemcount=Count('name')).order_by('-itemcount') posts_by_content = pq.filter(content__icontains=query) posts_by_name = pq.filter(author__name__icontains=search_text) posts_by_username = pq.filter(author__username__icontains=search_text) posts = posts_by_content | posts_by_name | posts_by_username # only show first few results, except all users/hashtags are explicitly wanted if show_all == 'users': hashtags = posts = [] elif show_all == 'hashtags': users = posts = [] elif show_all == 'posts': users = hashtags = [] posts = posts[p_from:p_to] else: users = users[:3] hashtags = hashtags[:10] posts = posts[:3] # pagination # prev_range should be None on first page, # next_range should be None on last page range_size = p_to - p_from prev_range = '%i-%i' % (max(0, p_from - range_size), p_from) if p_from < range_size or prev_range == '0-0': prev_range = None next_range = '%i-%i' % (p_to, p_to + range_size) if p_to > len(posts): next_range = None ctx = super(SearchView, self).get_context_data(**kwargs) ctx.update({ 'show_all': show_all, 'search_query': query, 'search_text': search_text, 'prev_range': prev_range, 'next_range': next_range, 'users': users, 'hashtags': hashtags, 'posts': [p.set_post_extra(self.request) for p in posts], 'top_hashtags': Hashtag.top() if not users and not posts and not hashtags else [], }) return ctx