Skip to content
Snippets Groups Projects
Commit c96b203a authored by Mark Skipper's avatar Mark Skipper
Browse files

Add API to associate terms with items

Add passingt est for adding a Term to an Item
Add unicode methods for Taxonomy and Term
Change the unique contstraints for Term so that
Term name needs be unique only for a given Taxonomy
parent a1f6aeda
No related branches found
No related tags found
No related merge requests found
......@@ -2,16 +2,23 @@ from __future__ import unicode_literals, absolute_import
import pytest
from django.core.urlresolvers import reverse
from rest_framework.test import APIRequestFactory
from data_layer.models import Item
from .item_create_view_tests import create_item
from .taxonomy_and_term_create_tests import (
create_category,
add_term,
)
from ..views import ItemViewSet
def categorize_item(**kwargs):
pass
def categorize_item(item_id, taxonomy_slug, term_name):
url = reverse('item-add-term', kwargs={"pk": item_id})
term = {'taxonomy': taxonomy_slug, 'name': term_name}
request = APIRequestFactory().post(url, term)
view = ItemViewSet.as_view(actions={'post': 'add_term'})
return view(request, item_pk=item_id)
@pytest.mark.django_db
......@@ -29,7 +36,8 @@ def test_item_can_haz_category():
# Associate category with the item
categorize_item(
item_id=item['id'],
category=term['name'],
taxonomy_slug=category['slug'],
term_name=term['name'],
)
# Fetch the item
......@@ -40,8 +48,5 @@ def test_item_can_haz_category():
[term_orm] = item_orm.terms.all()
assert term_orm.name == 'Vaccine'
# Feel vindicated
pass # and go home happy
# TODO test for terms with the same name in different taxonomies
from rest_framework_bulk.routes import BulkRouter
from django.conf.urls import patterns, include, url
from rest_framework import routers
from .views import (
ItemViewSet,
......@@ -6,7 +9,7 @@ from .views import (
TermViewSet,
)
router = BulkRouter()
router = routers.SimpleRouter()
router.register(
r'items',
ItemViewSet,
......@@ -20,4 +23,5 @@ router.register(
r'terms',
TermViewSet,
)
urlpatterns = router.urls
from rest_framework import viewsets, status
from rest_framework_bulk.mixins import BulkDestroyModelMixin
from rest_framework import viewsets
from rest_framework.decorators import detail_route
from rest_framework.response import Response
from data_layer.models import (
Item,
......@@ -29,6 +31,18 @@ class ItemViewSet(viewsets.ModelViewSet, BulkDestroyModelMixin):
return items
@detail_route(methods=['post'])
def add_term(self, request, item_pk):
item = Item.objects.get(pk=item_pk)
term_data = request.data
term = Term.objects.get(
taxonomy__slug=term_data['taxonomy'],
name=term_data['name'],
)
item.terms.add(term)
data = {} # TODO should be the item containing the new term
return Response(data, status=status.HTTP_200_OK)
class TaxonomyViewSet(viewsets.ModelViewSet):
serializer_class = TaxonomySerializer
......
......@@ -24,6 +24,9 @@ class Taxonomy(models.Model):
self.slug = slugify(self.name)
super(Taxonomy, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
# My thoughts on how this grows...
#
# multiplicity = models.CharField(
......@@ -53,7 +56,6 @@ class Term(models.Model):
verbose_name=_('Name'),
max_length=250,
help_text=_('Tag or Category Name'),
unique=True,
db_index=True,
)
......@@ -67,3 +69,13 @@ class Term(models.Model):
verbose_name=_('Long Name'),
blank=True,
)
def __unicode__(self):
return "{}:{}".format(
self.taxonomy.name,
self.name
)
class Meta:
unique_together = ('name', 'taxonomy')
index_together = ['name', 'taxonomy']
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