2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-29 20:16:44 +00:00

Major improvements to Parts API

- Requires authentication (or read only)
- Separated URL patterns
- Better use of generics
- Can add/edit parts and part categories
This commit is contained in:
Oliver Walters 2017-04-13 00:27:29 +10:00
parent 48f9914a49
commit 0772b8d780
3 changed files with 52 additions and 18 deletions

View File

@ -44,10 +44,10 @@ class PartCategoryBriefSerializer(serializers.ModelSerializer):
class PartCategoryDetailSerializer(serializers.ModelSerializer): class PartCategoryDetailSerializer(serializers.ModelSerializer):
# List of parts in this category # List of parts in this category
parts = PartSerializer(many=True) parts = PartSerializer(many=True, read_only=True)
# List of child categories under this one # List of child categories under this one
children = PartCategoryBriefSerializer(many=True) children = PartCategoryBriefSerializer(many=True, read_only=True)
class Meta: class Meta:
model = PartCategory model = PartCategory

View File

@ -1,19 +1,45 @@
from django.conf.urls import url from django.conf.urls import url, include
from . import views from . import views
urlpatterns = [ """ URL patterns associated with part categories:
# Single part detail /category -> List all top-level categories
url(r'^(?P<pk>[0-9]+)/$', views.PartDetail.as_view()), /category/<pk> -> Detail view of given category
/category/new -> Create a new category
# Part parameters list """
url(r'^(?P<pk>[0-9]+)/parameters/$', views.PartParameters.as_view()), categorypatterns = [
# Part category detail # Part category detail
url(r'^category/(?P<pk>[0-9]+)/$', views.PartCategoryDetail.as_view()), url(r'^category/(?P<pk>[0-9]+)/$', views.PartCategoryDetail.as_view()),
# List of top-level categories # 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/<pk> -> Detail view of a given part
/part/<pk>/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/<pk> -> (refer to partdetailpatterns)
/part/category -> (refer to categorypatterns)
"""
urlpatterns = [
# Individual part
url(r'^(?P<pk>[0-9]+)/', include(partdetailpatterns)),
# Part categories
url(r'^category/', views.PartCategoryList.as_view()),
# List of all parts # List of all parts
url(r'^$', views.PartList.as_view()) url(r'^$', views.PartList.as_view())

View File

@ -1,42 +1,50 @@
from rest_framework import generics from rest_framework import generics, permissions
from .models import PartCategory, Part, PartParameter from .models import PartCategory, Part, PartParameter
from .serializers import PartSerializer from .serializers import PartSerializer
from .serializers import PartCategoryBriefSerializer
from .serializers import PartCategoryDetailSerializer from .serializers import PartCategoryDetailSerializer
from .serializers import PartParameterSerializer from .serializers import PartParameterSerializer
class PartDetail(generics.RetrieveAPIView): class PartDetail(generics.RetrieveUpdateDestroyAPIView):
""" Return information on a single part
"""
queryset = Part.objects.all() queryset = Part.objects.all()
serializer_class = PartSerializer 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): def get_queryset(self):
part_id = self.kwargs['pk'] part_id = self.kwargs['pk']
return PartParameter.objects.filter(part=part_id) return PartParameter.objects.filter(part=part_id)
serializer_class = PartParameterSerializer serializer_class = PartParameterSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class PartList(generics.ListAPIView): class PartList(generics.ListCreateAPIView):
queryset = Part.objects.all() queryset = Part.objects.all()
serializer_class = PartSerializer serializer_class = PartSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class PartCategoryDetail(generics.RetrieveAPIView): class PartCategoryDetail(generics.RetrieveUpdateAPIView):
""" Return information on a single PartCategory """ Return information on a single PartCategory
""" """
queryset = PartCategory.objects.all() queryset = PartCategory.objects.all()
serializer_class = PartCategoryDetailSerializer serializer_class = PartCategoryDetailSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class PartCategoryList(generics.ListAPIView): class PartCategoryList(generics.ListCreateAPIView):
""" Return a list of all top-level part categories. """ Return a list of all top-level part categories.
Categories are considered "top-level" if they do not have a parent Categories are considered "top-level" if they do not have a parent
""" """
queryset = PartCategory.objects.filter(parent=None) queryset = PartCategory.objects.filter(parent=None)
serializer_class = PartCategoryDetailSerializer serializer_class = PartCategoryDetailSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)