From 0772b8d780de1169fbd5ac3273eb7a38f7462fb2 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 13 Apr 2017 00:27:29 +1000 Subject: [PATCH] Major improvements to Parts API - Requires authentication (or read only) - Separated URL patterns - Better use of generics - Can add/edit parts and part categories --- InvenTree/part/serializers.py | 4 ++-- InvenTree/part/urls.py | 42 ++++++++++++++++++++++++++++------- InvenTree/part/views.py | 24 +++++++++++++------- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 1ff66264e3..774815ac1a 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -44,10 +44,10 @@ class PartCategoryBriefSerializer(serializers.ModelSerializer): class PartCategoryDetailSerializer(serializers.ModelSerializer): # List of parts in this category - parts = PartSerializer(many=True) + parts = PartSerializer(many=True, read_only=True) # List of child categories under this one - children = PartCategoryBriefSerializer(many=True) + children = PartCategoryBriefSerializer(many=True, read_only=True) class Meta: model = PartCategory diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index de6c9c13a8..01db39c149 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -1,19 +1,45 @@ -from django.conf.urls import url +from django.conf.urls import url, include from . import views -urlpatterns = [ - # Single part detail - url(r'^(?P[0-9]+)/$', views.PartDetail.as_view()), - - # Part parameters list - url(r'^(?P[0-9]+)/parameters/$', views.PartParameters.as_view()), +""" URL patterns associated with part categories: +/category -> List all top-level categories +/category/ -> Detail view of given category +/category/new -> Create a new category +""" +categorypatterns = [ # Part category detail url(r'^category/(?P[0-9]+)/$', views.PartCategoryDetail.as_view()), # List of top-level categories - url(r'^category/$', views.PartCategoryList.as_view()), + url(r'^$', views.PartCategoryList.as_view()) +] + +""" URL patterns associated with a particular part: +/part/ -> Detail view of a given part +/part//parameters -> List parameters associated with a part +""" +partdetailpatterns = [ + # Single part detail + url(r'^$', views.PartDetail.as_view()), + + # View part parameters + url(r'parameters/$', views.PartParameters.as_view()) +] + +""" Top-level URL patterns for the Part app: +/part/ -> List all parts +/part/new -> Create a new part +/part/ -> (refer to partdetailpatterns) +/part/category -> (refer to categorypatterns) +""" +urlpatterns = [ + # Individual part + url(r'^(?P[0-9]+)/', include(partdetailpatterns)), + + # Part categories + url(r'^category/', views.PartCategoryList.as_view()), # List of all parts url(r'^$', views.PartList.as_view()) diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py index dcd5ac54a3..d2cf26dfa3 100644 --- a/InvenTree/part/views.py +++ b/InvenTree/part/views.py @@ -1,42 +1,50 @@ -from rest_framework import generics +from rest_framework import generics, permissions from .models import PartCategory, Part, PartParameter from .serializers import PartSerializer +from .serializers import PartCategoryBriefSerializer from .serializers import PartCategoryDetailSerializer from .serializers import PartParameterSerializer -class PartDetail(generics.RetrieveAPIView): - +class PartDetail(generics.RetrieveUpdateDestroyAPIView): + """ Return information on a single part + """ queryset = Part.objects.all() serializer_class = PartSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) -class PartParameters(generics.ListAPIView): - +class PartParameters(generics.ListCreateAPIView): + """ Return all parameters associated with a particular part + """ def get_queryset(self): part_id = self.kwargs['pk'] return PartParameter.objects.filter(part=part_id) serializer_class = PartParameterSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) -class PartList(generics.ListAPIView): +class PartList(generics.ListCreateAPIView): queryset = Part.objects.all() serializer_class = PartSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) -class PartCategoryDetail(generics.RetrieveAPIView): +class PartCategoryDetail(generics.RetrieveUpdateAPIView): """ Return information on a single PartCategory """ queryset = PartCategory.objects.all() serializer_class = PartCategoryDetailSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) -class PartCategoryList(generics.ListAPIView): +class PartCategoryList(generics.ListCreateAPIView): """ Return a list of all top-level part categories. Categories are considered "top-level" if they do not have a parent """ queryset = PartCategory.objects.filter(parent=None) serializer_class = PartCategoryDetailSerializer + permission_classes = (permissions.IsAuthenticatedOrReadOnly,)