Skip to content
Snippets Groups Projects
Commit a42e160a authored by Alice Heaton's avatar Alice Heaton :speech_balloon:
Browse files

Merge branch 'date-range-api' into develop

parents cb1139d8 45590dbe
No related branches found
No related tags found
No related merge requests found
from __future__ import unicode_literals, absolute_import
from datetime import timedelta
import pytest
from django.core.urlresolvers import reverse
from django.utils import timezone
from rest_framework.test import APIRequestFactory
from rest_framework import status
......@@ -15,16 +19,16 @@ from .taxonomy_and_term_create_tests import (
)
def get_term_itemcount(taxonomy_slug):
response = get_term_itemcount_response(taxonomy_slug)
def get_term_itemcount(taxonomy_slug, get_params=None):
response = get_term_itemcount_response(taxonomy_slug, get_params)
assert status.is_success(response.status_code), response.data
return response
def get_term_itemcount_response(taxonomy_slug):
def get_term_itemcount_response(taxonomy_slug, get_params=None):
url = reverse('taxonomy-itemcount', kwargs={'slug': taxonomy_slug})
request = APIRequestFactory().get(url)
request = APIRequestFactory().get(url, data=get_params)
view = TaxonomyViewSet.as_view(actions={'get': 'itemcount'})
return view(request, slug=taxonomy_slug)
......@@ -121,6 +125,49 @@ def test_term_itemcount_contains_taxonomy_term_long_name(
assert origins['long_name'] == long_name
@pytest.mark.django_db
def test_items_in_date_range_returned(questions_category_slug):
now = timezone.now().replace(
microsecond=0 # MySQL discards microseconds
)
one_day_ago = now - timedelta(days=1)
one_week_ago = now - timedelta(weeks=1)
eight_days_ago = now - timedelta(days=8)
item_too_recent = create_item(
body="Where did ebola came from?",
timestamp=now
).data
item_in_range_1 = create_item(
body="What was the caused of ebola outbreak in liberia?",
timestamp=one_day_ago
).data
item_in_range_2 = create_item(
body="Is Ebola a man made sickness",
timestamp=one_week_ago
).data
item_too_old = create_item(
body="What brought about ebola in liberia",
timestamp=eight_days_ago
).data
origins = add_term(taxonomy=questions_category_slug, name="Test Origins").data
categorize_item(item_in_range_1, origins)
categorize_item(item_in_range_2, origins)
categorize_item(item_too_old, origins)
categorize_item(item_too_recent, origins)
get_params = {
'start_time': one_week_ago,
'end_time': one_day_ago}
[term] = get_term_itemcount(questions_category_slug, get_params).data
assert term['count'] == 2
@pytest.mark.django_db
def test_error_for_non_existent_taxonomy():
response = get_term_itemcount_response('a-taxonomy-that-does-not-exist')
......
......@@ -70,13 +70,24 @@ class TaxonomyViewSet(viewsets.ModelViewSet):
data = {'detail': message}
return Response(data, status=status.HTTP_400_BAD_REQUEST)
terms = Term.objects.filter(taxonomy=taxonomy).annotate(
count=Count('items')
)
terms = self._get_terms(request, taxonomy)
data = TermItemCountSerializer(terms, many=True).data
return Response(data, status=status.HTTP_200_OK)
def _get_terms(self, request, taxonomy):
start_time = request.query_params.get('start_time', None)
end_time = request.query_params.get('end_time', None)
filters = {'taxonomy': taxonomy}
if start_time is not None and end_time is not None:
filters['items__timestamp__range'] = [start_time, end_time]
return Term.objects.filter(**filters).annotate(
count=Count('items'))
class TermViewSet(viewsets.ModelViewSet):
serializer_class = TermSerializer
......
......@@ -12,12 +12,12 @@ Base URL '/items/'
#### Create Items
'/items/' POST
'/items/' POST
{
"body": "blah",
"timestamp": "..."
}
{
"body": "blah",
"timestamp": "..."
}
- create an item. Should return the object, including its unique ID and the
system allocated creation time.
......@@ -26,7 +26,7 @@ Base URL '/items/'
#### Create item with tags and categories
{
"body": "blah",
"body": "blah",
"timestamp": "...",
"metadata": [
{ "slug": "<taxonomy-slug>", // slug OR: name
......@@ -54,7 +54,7 @@ should be an exception.
- returns a list of Items
[ { "id": nn,
[ { "id": nn,
"body": "...",
"created": ...
"timestamp": ...
......@@ -65,9 +65,9 @@ should be an exception.
- When we do categories it should return those the same way as post above,
e.g.:
[ {
"id": nn,
[ {
"id": nn,
"body": "...",
"created": ...
"timestamp": ...
......@@ -94,17 +94,17 @@ the expanded `Item` JSON somehow too.
[
{ "name": "Ebola Question Type",
"slug": "ebola-question-type",
"long_name": "Question Type",
"long_name": "Question Type",
"cardinality": "optional",
"vocabulary": "closed",
"terms": [
{"name": "Is Ebola Real",
{"name": "Is Ebola Real",
"long name": ...
},
...
]
},
{ "name": "Reliability",
{ "name": "Reliability",
...
},
...
......@@ -126,11 +126,11 @@ the unique field is derived from the given one?
{ "name": "Ebola Question Type",
"slug": "ebola-question-type", // do we supply this or is it calculated?
"long_name": "Question Type",
"long_name": "Question Type",
"cardinality": "optional",
"vocabulary": "closed",
"terms": [
{"name": "Is Ebola Real",
{"name": "Is Ebola Real",
"long name": ...
},
...
......@@ -146,27 +146,27 @@ be returned by the call.
{ "name": "Ebola Question Type",
"slug": "ebola-question-type", // calculated from name
"long_name": "Question Type",
"long_name": "Question Type",
"cardinality": "optional",
"vocabulary": "closed",
"terms": [
{"name": "Is Ebola Real",
{"name": "Is Ebola Real",
"long name": ...
},
...
]
},
e.g. `/taxonomies/ebola-questions/`
e.g. `/taxonomies/ebola-questions/`
- Taxonomy details URL should use the taxonomy's sluggified name
### Update Taxonomy Details
### Update Taxonomy Details
`/taxonomies/ebola-questions/` POST
{
"long_name": "Question Type",
{
"long_name": "Question Type",
"cardinality": "optional",
"vocabulary": "closed",
},
......@@ -181,7 +181,7 @@ e.g. `/taxonomies/ebola-questions/`
### Add a term to a taxonomy
We could do
We could do
`/taxonomies/ebola-questions/terms/` POST { 'name': 'vaccine' }
But for the moment we;re doing
......@@ -189,6 +189,28 @@ But for the moment we;re doing
`/terms/` POST { 'name': 'vaccine', 'taxonomy': 'ebola-questions' }
### Get count of items per term for a taxonomy
`/taxonomies/<taxonomy-slug>/itemcount?start_time=<start-time>&end_time=<end_time>
Returns a list of terms:
[ { "name": "Vaccine",
"long_name": "Vaccine Trial",
"count": 2
},
{
"name": "Measures",
"long_name": "What measures could end Ebola?",
"count": 1
},
{
"name": "Symptoms",
"long_name": "Symptoms/Medical",
"count": 0
},
...
]
### List all Terms (all taxonomies)
'/terms/' GET
......@@ -255,7 +277,7 @@ OR
'/items/2314/taxonomies/terms/<term-slug>/' DELETE
- Where term slug is the unique slug for the term.
- Where term slug is the unique slug for the term.
e.g.
'/items/2314/taxonomies/terms/ebola-questions-
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment