diff --git a/InvenTree/order/api.py b/InvenTree/order/api.py index 0f84d6bc32..cb48b4c11d 100644 --- a/InvenTree/order/api.py +++ b/InvenTree/order/api.py @@ -9,7 +9,7 @@ from django_filters.rest_framework import DjangoFilterBackend from rest_framework import generics, permissions from rest_framework import filters -from django.conf.urls import url +from django.conf.urls import url, include from InvenTree.helpers import str2bool @@ -17,10 +17,12 @@ from part.models import Part from company.models import SupplierPart from .models import PurchaseOrder, PurchaseOrderLineItem -from .serializers import POSerializer, POLineItemSerializer +from .models import PurchaseOrderAttachment +from .serializers import POSerializer, POLineItemSerializer, POAttachmentSerializer from .models import SalesOrder, SalesOrderLineItem -from .serializers import SalesOrderSerializer, SOLineItemSerializer +from .models import SalesOrderAttachment +from .serializers import SalesOrderSerializer, SOLineItemSerializer, SOAttachmentSerializer class POList(generics.ListCreateAPIView): @@ -198,6 +200,25 @@ class POLineItemDetail(generics.RetrieveUpdateAPIView): ] +class SOAttachmentList(generics.ListCreateAPIView): + """ + API endpoint for listing (and creating) a SalesOrderAttachment (file upload) + """ + + queryset = SalesOrderAttachment.objects.all() + serializer_class = SOAttachmentSerializer + + filter_backends = [ + DjangoFilterBackend, + filters.OrderingFilter, + filters.SearchFilter, + ] + + filter_fields = [ + 'order', + ] + + class SOList(generics.ListCreateAPIView): """ API endpoint for accessing a list of SalesOrder objects. @@ -378,10 +399,32 @@ class SOLineItemDetail(generics.RetrieveUpdateAPIView): permission_classes = [permissions.IsAuthenticated] +class POAttachmentList(generics.ListCreateAPIView): + """ + API endpoint for listing (and creating) a PurchaseOrderAttachment (file upload) + """ + + queryset = PurchaseOrderAttachment.objects.all() + serializer_class = POAttachmentSerializer + + filter_backends = [ + DjangoFilterBackend, + filters.OrderingFilter, + filters.SearchFilter, + ] + + filter_fields = [ + 'order', + ] + + order_api_urls = [ # API endpoints for purchase orders url(r'^po/(?P\d+)/$', PODetail.as_view(), name='api-po-detail'), - url(r'^po/$', POList.as_view(), name='api-po-list'), + url(r'po/attachment/', include([ + url(r'^.*$', POAttachmentList.as_view(), name='api-po-attachment-list'), + ])), + url(r'^po/.*$', POList.as_view(), name='api-po-list'), # API endpoints for purchase order line items url(r'^po-line/(?P\d+)/$', POLineItemDetail.as_view(), name='api-po-line-detail'), @@ -389,7 +432,11 @@ order_api_urls = [ # API endpoints for sales ordesr url(r'^so/(?P\d+)/$', SODetail.as_view(), name='api-so-detail'), - url(r'^so/$', SOList.as_view(), name='api-so-list'), + url(r'so/attachment/', include([ + url(r'^.*$', SOAttachmentList.as_view(), name='api-so-attachment-list'), + ])), + + url(r'^so/.*$', SOList.as_view(), name='api-so-list'), # API endpoints for sales order line items url(r'^so-line/(?P\d+)/$', SOLineItemDetail.as_view(), name='api-so-line-detail'), diff --git a/InvenTree/order/serializers.py b/InvenTree/order/serializers.py index e0ef57f802..c22a637c67 100644 --- a/InvenTree/order/serializers.py +++ b/InvenTree/order/serializers.py @@ -14,6 +14,7 @@ from company.serializers import CompanyBriefSerializer, SupplierPartSerializer from part.serializers import PartBriefSerializer from .models import PurchaseOrder, PurchaseOrderLineItem +from .models import PurchaseOrderAttachment, SalesOrderAttachment from .models import SalesOrder, SalesOrderLineItem from .models import SalesOrderAllocation @@ -106,6 +107,22 @@ class POLineItemSerializer(InvenTreeModelSerializer): ] +class POAttachmentSerializer(InvenTreeModelSerializer): + """ + Serializers for the PurchaseOrderAttachment model + """ + + class Meta: + model = PurchaseOrderAttachment + + fields = [ + 'pk', + 'order', + 'attachment', + 'comment', + ] + + class SalesOrderSerializer(InvenTreeModelSerializer): """ Serializers for the SalesOrder object @@ -231,3 +248,19 @@ class SOLineItemSerializer(InvenTreeModelSerializer): 'part', 'part_detail', ] + + +class SOAttachmentSerializer(InvenTreeModelSerializer): + """ + Serializers for the SalesOrderAttachment model + """ + + class Meta: + model = SalesOrderAttachment + + fields = [ + 'pk', + 'order', + 'attachment', + 'comment', + ] diff --git a/InvenTree/part/api.py b/InvenTree/part/api.py index a0ee9dcd0b..c0d79b15b5 100644 --- a/InvenTree/part/api.py +++ b/InvenTree/part/api.py @@ -646,12 +646,12 @@ part_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'), + 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'), + url(r'^.*$', PartAttachmentList.as_view(), name='api-part-attachment-list'), ])), # Base URL for PartStar API endpoints