def questions(request): """View the questions.""" filter = request.GET.get('filter') tagged = request.GET.get('tagged') tags = None sort_ = request.GET.get('sort') if sort_ == 'requested': order = '-num_votes_past_week' else: sort_ = None order = '-updated' question_qs = Question.objects.filter(creator__is_active=1, status=CONFIRMED) if filter == 'no-replies': question_qs = question_qs.filter(num_answers=0) elif filter == 'replies': question_qs = question_qs.filter(num_answers__gt=0) elif filter == 'solved': question_qs = question_qs.exclude(solution=None) elif filter == 'unsolved': question_qs = question_qs.filter(solution=None) elif filter == 'my-contributions' and request.user.is_authenticated(): criteria = Q(answers__creator=request.user) | Q(creator=request.user) question_qs = question_qs.filter(criteria).distinct() else: filter = None feed_urls = ((reverse('questions.feed'), QuestionsFeed().title()), ) if tagged: tag_slugs = tagged.split(',') tags = Tag.objects.filter(slug__in=tag_slugs) if tags: for t in tags: question_qs = question_qs.filter(tags__name__in=[t.name]) if len(tags) == 1: feed_urls += ((reverse('questions.tagged_feed', args=[tags[0].slug]), TaggedQuestionsFeed().title(tags[0])), ) else: question_qs = Question.objects.get_empty_query_set() question_qs = question_qs.order_by(order) questions_ = paginate(request, question_qs, per_page=constants.QUESTIONS_PER_PAGE) return jingo.render( request, 'questions/questions.html', { 'questions': questions_, 'feeds': feed_urls, 'filter': filter, 'sort': sort_, 'top_contributors': _get_top_contributors(), 'tags': tags, 'tagged': tagged })
def test_no_inactive_users(self): """Ensure that inactive users' questions don't appear in the feed.""" u = User.objects.get(pk=118533) u.is_active = False u.save() q = Question(title='Test Question', content='Lorem Ipsum Dolor', creator_id=118533) q.save() assert q.id not in [x.id for x in QuestionsFeed().items()]
{'content_type': ContentType.objects.get_for_model(Question).id}, name='questions.flag'), url(r'^/(?P<question_id>\d+)/flag/(?P<object_id>\d+)$', flagit_views.flag, {'content_type': ContentType.objects.get_for_model(Answer).id}, name='questions.answer_flag'), # Subcribe by email url(r'^/(?P<question_id>\d+)/watch$', 'watch_question', name='questions.watch'), url(r'^/(?P<question_id>\d+)/unwatch$', 'unwatch_question', name='questions.unwatch'), url(r'^/confirm/(?P<watch_id>\d+)/(?P<secret>\w+)$', 'activate_watch', name='questions.activate_watch'), url(r'^/unsubscribe/(?P<watch_id>\d+)/(?P<secret>\w+)$', 'unsubscribe_watch', name='questions.unsubscribe'), # Feeds url(r'^/feed$', QuestionsFeed(), name='questions.feed'), url(r'^/(?P<question_id>\d+)/feed$', AnswersFeed(), name='questions.answers.feed'), url(r'^/tagged/(?P<tag_slug>[\w\-]+)/feed$', TaggedQuestionsFeed(), name='questions.tagged_feed'), )
def questions(request): """View the questions.""" filter_ = request.GET.get('filter') tagged = request.GET.get('tagged') tags = None sort_ = request.GET.get('sort') cache_count = True # Some counts are too esoteric to cache right now. if sort_ == 'requested': order = '-num_votes_past_week' else: sort_ = None order = '-updated' question_qs = Question.objects.select_related( 'creator', 'last_answer', 'last_answer__creator') question_qs = question_qs.extra( {'_num_votes': 'SELECT COUNT(*) FROM questions_questionvote WHERE ' 'questions_questionvote.question_id = ' 'questions_question.id'}) question_qs = question_qs.filter(creator__is_active=1, is_locked=False) if filter_ == 'no-replies': question_qs = question_qs.filter(num_answers=0) elif filter_ == 'replies': question_qs = question_qs.filter(num_answers__gt=0) elif filter_ == 'solved': question_qs = question_qs.exclude(solution=None) elif filter_ == 'unsolved': question_qs = question_qs.filter(solution=None) elif filter_ == 'my-contributions' and request.user.is_authenticated(): criteria = Q(answers__creator=request.user) | Q(creator=request.user) question_qs = question_qs.filter(criteria).distinct() cache_count = False else: filter_ = None feed_urls = ((reverse('questions.feed'), QuestionsFeed().title()),) if tagged: cache_count = False tag_slugs = tagged.split(',') tags = Tag.objects.filter(slug__in=tag_slugs) if tags: for t in tags: question_qs = question_qs.filter(tags__name__in=[t.name]) if len(tags) == 1: feed_urls += ((reverse('questions.tagged_feed', args=[tags[0].slug]), TaggedQuestionsFeed().title(tags[0])),) else: question_qs = Question.objects.get_empty_query_set() question_qs = question_qs.order_by(order) if cache_count: cache_key = u'questions:count:%s' % filter_ count = cache.get(cache_key) if not count: count = question_qs.count() cache.add(cache_key, count, settings.QUESTIONS_COUNT_TTL) else: count = question_qs.count() questions_ = paginate(request, question_qs, count=count, per_page=constants.QUESTIONS_PER_PAGE) data = {'questions': questions_, 'feeds': feed_urls, 'filter': filter_, 'sort': sort_, 'tags': tags, 'tagged': tagged} if (waffle.flag_is_active(request, 'karma') and waffle.switch_is_active('karma')): kmgr = KarmaManager() data.update(karma_top=kmgr.top_users()) if request.user.is_authenticated(): ranking = kmgr.ranking(request.user) if ranking <= constants.HIGHEST_RANKING: data.update(karma_ranking=ranking) else: data.update(top_contributors=_get_top_contributors()) return jingo.render(request, 'questions/questions.html', data)
def questions(request): """View the questions.""" filter_ = request.GET.get('filter') tagged = request.GET.get('tagged') tags = None sort_ = request.GET.get('sort', None) if sort_ == 'requested': order = '-num_votes_past_week' elif sort_ == 'created': order = '-created' else: order = '-updated' question_qs = Question.objects.select_related('creator', 'last_answer', 'last_answer__creator') if not waffle.switch_is_active('hide-total-question-votes'): question_qs = question_qs.extra({ '_num_votes': 'SELECT COUNT(*) FROM questions_questionvote WHERE ' 'questions_questionvote.question_id = ' 'questions_question.id' }) question_qs = question_qs.filter(creator__is_active=1) if filter_ == 'no-replies': question_qs = question_qs.filter(num_answers=0, is_locked=False) elif filter_ == 'replies': question_qs = question_qs.filter(num_answers__gt=0) elif filter_ == 'solved': question_qs = question_qs.exclude(solution=None) elif filter_ == 'unsolved': question_qs = question_qs.filter(solution=None) elif filter_ == 'my-contributions' and request.user.is_authenticated(): criteria = Q(answers__creator=request.user) | Q(creator=request.user) question_qs = question_qs.filter(criteria).distinct() elif filter_ == 'recent-unanswered': # Only unanswered questions from the last 72 hours. start = datetime.now() - timedelta(hours=72) question_qs = question_qs.filter(num_answers=0, created__gt=start, is_locked=False) else: filter_ = None feed_urls = ((reverse('questions.feed'), QuestionsFeed().title()), ) if tagged: tag_slugs = tagged.split(',') tags = Tag.objects.filter(slug__in=tag_slugs) if tags: for t in tags: question_qs = question_qs.filter(tags__name__in=[t.name]) if len(tags) == 1: feed_urls += ((reverse('questions.tagged_feed', args=[tags[0].slug]), TaggedQuestionsFeed().title(tags[0])), ) else: question_qs = Question.objects.get_empty_query_set() # Exclude questions over 90 days old without an answer. oldest_date = date.today() - timedelta(days=90) question_qs = question_qs.exclude(created__lt=oldest_date, num_answers=0) # Set the order. question_qs = question_qs.order_by(order) try: with statsd.timer('questions.view.paginate.%s' % filter_): questions_page = simple_paginate( request, question_qs, per_page=constants.QUESTIONS_PER_PAGE) except (PageNotAnInteger, EmptyPage): # If we aren't on page 1, redirect there. # TODO: Is 404 more appropriate? if request.GET.get('page', '1') != '1': url = build_paged_url(request) return HttpResponseRedirect(urlparams(url, page=1)) # Recent answered stats recent_asked_count = Question.recent_asked_count() recent_unanswered_count = Question.recent_unanswered_count() if recent_asked_count: recent_answered_percent = int( (float(recent_asked_count - recent_unanswered_count) / recent_asked_count) * 100) else: recent_answered_percent = 0 data = { 'questions': questions_page, 'feeds': feed_urls, 'filter': filter_, 'sort': sort_, 'tags': tags, 'tagged': tagged, 'recent_asked_count': recent_asked_count, 'recent_unanswered_count': recent_unanswered_count, 'recent_answered_percent': recent_answered_percent } if (waffle.flag_is_active(request, 'karma') and waffle.switch_is_active('karma')): kmgr = KarmaManager() data.update(karma_top=kmgr.top_users()) if request.user.is_authenticated(): ranking = kmgr.ranking(request.user) if ranking <= constants.HIGHEST_RANKING: data.update(karma_ranking=ranking) else: data.update(top_contributors=_get_top_contributors()) with statsd.timer('questions.view.render'): return jingo.render(request, 'questions/questions.html', data)