diff --git a/kitsune/questions/api.py b/kitsune/questions/api.py index 60ecc1d7471..cb0daab95e6 100644 --- a/kitsune/questions/api.py +++ b/kitsune/questions/api.py @@ -55,6 +55,7 @@ class QuestionSerializer(serializers.ModelSerializer): creator = ProfileFKSerializer(source='creator.get_profile', read_only=True) involved = serializers.SerializerMethodField('get_involved_users') is_solved = serializers.Field(source='is_solved') + is_taken = serializers.Field(source='is_taken') metadata = QuestionMetaDataSerializer(source='metadata_set', required=False) num_votes = serializers.Field(source='num_votes') solution = serializers.PrimaryKeyRelatedField(read_only=True) @@ -75,6 +76,7 @@ class Meta: 'is_locked', 'is_solved', 'is_spam', + 'is_taken', 'last_answer', 'locale', 'metadata', @@ -107,8 +109,10 @@ class QuestionFilter(django_filters.FilterSet): product = django_filters.CharFilter(name='product__slug') creator = django_filters.CharFilter(name='creator__username') involved = django_filters.MethodFilter(action='filter_involved') - metadata = django_filters.MethodFilter(action='filter_metadata') is_solved = django_filters.MethodFilter(action='filter_is_solved') + is_taken = django_filters.MethodFilter(action='filter_is_taken') + metadata = django_filters.MethodFilter(action='filter_metadata') + taken_by = django_filters.CharFilter(name='taken_by__username') class Meta(object): model = Question @@ -118,11 +122,13 @@ class Meta(object): 'involved', 'is_archived', 'is_locked', - 'is_spam', 'is_solved', + 'is_spam', + 'is_taken', 'locale', 'num_answers', 'product', + 'taken_by', 'title', 'topic', 'updated', diff --git a/kitsune/questions/tests/test_api.py b/kitsune/questions/tests/test_api.py index 8004fd9e4e5..cb55187c18d 100644 --- a/kitsune/questions/tests/test_api.py +++ b/kitsune/questions/tests/test_api.py @@ -210,6 +210,54 @@ def test_solve(self): q = Question.objects.get(id=q.id) eq_(q.solution, a) + def test_filter_is_taken_true(self): + q1 = question(save=True) + q2 = question(save=True) + q2.take(q1.creator) + + url = reverse('question-list') + '?is_taken=1' + res = self.client.get(url) + + eq_(res.status_code, 200) + eq_(res.data['count'], 1) + eq_(res.data['results'][0]['id'], q2.id) + + def test_filter_is_taken_false(self): + q1 = question(save=True) + q2 = question(save=True) + q2.take(q1.creator) + + url = reverse('question-list') + '?is_taken=0' + res = self.client.get(url) + + eq_(res.status_code, 200) + eq_(res.data['count'], 1) + eq_(res.data['results'][0]['id'], q1.id) + + def test_filter_is_taken_expired(self): + q = question(save=True) + # "take" the question, but with an expired timer. + q.taken_by = profile().user + q.taken_until = datetime.now() - timedelta(seconds=60) + + url = reverse('question-list') + '?is_taken=1' + res = self.client.get(url) + + eq_(res.status_code, 200) + eq_(res.data['count'], 0) + + def test_filter_taken_by_username(self): + q1 = question(save=True) + q2 = question(save=True) + q2.take(q1.creator) + + url = reverse('question-list') + '?taken_by=' + q1.creator.username + res = self.client.get(url) + + eq_(res.status_code, 200) + eq_(res.data['count'], 1) + eq_(res.data['results'][0]['id'], q2.id) + def test_helpful(self): q = question(save=True) u = profile().user @@ -294,6 +342,15 @@ def test_filter_involved(self): eq_(res.data['results'][0]['id'], q2.id) eq_(res.data['results'][1]['id'], q1.id) + def test_is_taken(self): + q = question(save=True) + u = profile().user + q.take(u) + url = reverse('question-detail', args=[q.id]) + res = self.client.get(url) + eq_(res.status_code, 200) + eq_(res.data['taken_by']['username'], u.username) + def test_take(self): q = question(save=True) u = user(save=True)