diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index 6f5327baa4..f53be800b5 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -19,6 +19,7 @@ from django.urls import reverse from .models import Part, PartCategory, BomItem, PartStar from .models import PartParameter, PartParameterTemplate +from .models import PartAttachment from . import serializers as part_serializers @@ -105,6 +106,27 @@ class CategoryDetail(generics.RetrieveUpdateDestroyAPIView): queryset = PartCategory.objects.all() +class PartAttachmentList(generics.ListCreateAPIView): + """ + API endpoint for listing (and creating) a PartAttachment (file upload). + """ + + queryset = PartAttachment.objects.all() + serializer_class = part_serializers.PartAttachmentSerializer + + permission_classes = [permissions.IsAuthenticated] + + filter_backends = [ + DjangoFilterBackend, + filters.OrderingFilter, + filters.SearchFilter, + ] + + filter_fields = [ + 'part', + ] + + class PartThumbs(generics.ListAPIView): """ API endpoint for retrieving information on available Part thumbnails """ @@ -617,34 +639,31 @@ class BomItemValidate(generics.UpdateAPIView): return Response(serializer.data) - -cat_api_urls = [ - - url(r'^(?P\d+)/?', CategoryDetail.as_view(), name='api-part-category-detail'), - - url(r'^$', CategoryList.as_view(), name='api-part-category-list'), -] - - -part_star_api_urls = [ - url(r'^(?P\d+)/?', PartStarDetail.as_view(), name='api-part-star-detail'), - - # Catchall - url(r'^.*$', PartStarList.as_view(), name='api-part-star-list'), -] - -part_param_api_urls = [ - url(r'^template/$', PartParameterTemplateList.as_view(), name='api-part-param-template-list'), - - url(r'^.*$', PartParameterList.as_view(), name='api-part-param-list'), -] - part_api_urls = [ url(r'^tree/?', PartCategoryTree.as_view(), name='api-part-tree'), - url(r'^category/', include(cat_api_urls)), - url(r'^star/', include(part_star_api_urls)), - url(r'^parameter/', include(part_param_api_urls)), + # Base URL for PartCategory API endpoints + url(r'^category/', include([ + url(r'^(?P\d+)/?', CategoryDetail.as_view(), name='api-part-category-detail'), + url(r'^$', CategoryList.as_view(), name='api-part-category-list'), + ])), + + # Base URL for PartAttachment API endpoints + url(r'attachment/', include([ + url(r'^$', PartAttachmentList.as_view(), name='api-part-attachment-list'), + ])), + + # Base URL for PartStar API endpoints + url(r'^star/', include([ + url(r'^(?P\d+)/?', PartStarDetail.as_view(), name='api-part-star-detail'), + url(r'^.*$', PartStarList.as_view(), name='api-part-star-list'), + ])), + + # Base URL for PartParameter API endpoints + url(r'^parameter/', include([ + url(r'^template/$', PartParameterTemplateList.as_view(), name='api-part-param-template-list'), + url(r'^.*$', PartParameterList.as_view(), name='api-part-param-list'), + ])), url(r'^thumbs/', PartThumbs.as_view(), name='api-part-thumbs'), @@ -653,16 +672,12 @@ part_api_urls = [ url(r'^.*$', PartList.as_view(), name='api-part-list'), ] -bom_item_urls = [ - - url(r'^validate/?', BomItemValidate.as_view(), name='api-bom-item-validate'), - - url(r'^.*$', BomDetail.as_view(), name='api-bom-item-detail'), -] - bom_api_urls = [ # BOM Item Detail - url(r'^(?P\d+)/', include(bom_item_urls)), + url(r'^(?P\d+)/', include([ + url(r'^validate/?', BomItemValidate.as_view(), name='api-bom-item-validate'), + url(r'^.*$', BomDetail.as_view(), name='api-bom-item-detail'), + ])), # Catch-all url(r'^.*$', BomList.as_view(), name='api-bom-list'), diff --git a/InvenTree/part/serializers.py b/InvenTree/part/serializers.py index 920e0486c3..74005dd5af 100644 --- a/InvenTree/part/serializers.py +++ b/InvenTree/part/serializers.py @@ -9,6 +9,7 @@ from .models import Part, PartStar from .models import PartCategory from .models import BomItem from .models import PartParameter, PartParameterTemplate +from .models import PartAttachment from decimal import Decimal @@ -39,6 +40,22 @@ class CategorySerializer(InvenTreeModelSerializer): ] +class PartAttachmentSerializer(InvenTreeModelSerializer): + """ + Serializer for the PartAttachment class + """ + + class Meta: + model = PartAttachment + + fields = [ + 'pk', + 'part', + 'attachment', + 'comment' + ] + + class PartThumbSerializer(serializers.Serializer): """ Serializer for the 'image' field of the Part model.