From 6c1784b5b99267f6c9fc4e91b03e55d5d4c023e9 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 23 Apr 2018 19:36:46 +1000 Subject: [PATCH] Implement (basic) JSON API for company model - Pagination - Search company name and description - Filter by is_customer and is_supplier --- InvenTree/InvenTree/settings.py | 4 +- InvenTree/InvenTree/urls.py | 15 ++- InvenTree/company/api.py | 221 +++++-------------------------- InvenTree/company/models.py | 2 +- InvenTree/company/serializers.py | 46 +------ 5 files changed, 44 insertions(+), 244 deletions(-) diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 8fcb2cb470..91f0a66730 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -85,7 +85,9 @@ TEMPLATES = [ print(os.path.join(BASE_DIR, 'templates')) REST_FRAMEWORK = { - 'EXCEPTION_HANDLER': 'InvenTree.utils.api_exception_handler' + 'EXCEPTION_HANDLER': 'InvenTree.utils.api_exception_handler', + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'PAGE_SIZE': 50, } WSGI_APPLICATION = 'InvenTree.wsgi.application' diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 35d17add38..212a206da5 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -11,6 +11,7 @@ from stock.urls import stock_urls # from supplier.urls import supplier_api_urls, supplier_api_part_urls from company.urls import company_urls +from company.api import company_api_urls from build.urls import build_urls @@ -27,19 +28,21 @@ from users.urls import user_urls admin.site.site_header = "InvenTree Admin" apipatterns = [ + url(r'^company/', include(company_api_urls)), + # Stock URLs - url(r'^stock/', include(stock_api_urls)), - url(r'^stock-location/', include(stock_api_loc_urls)), + #url(r'^stock/', include(stock_api_urls)), + #url(r'^stock-location/', include(stock_api_loc_urls)), # Part URLs - url(r'^part/', include(part_api_urls)), - url(r'^part-category/', include(part_cat_api_urls)), + #url(r'^part/', include(part_api_urls)), + #url(r'^part-category/', include(part_cat_api_urls)), # url(r'^part-param/', include(part_param_urls)), # url(r'^part-param-template/', include(part_param_template_urls)), # Part BOM URLs - url(r'^bom/', include(bom_api_urls)), + #url(r'^bom/', include(bom_api_urls)), # Supplier URLs # url(r'^supplier/', include(supplier_api_urls)), @@ -64,7 +67,7 @@ apipatterns = [ urlpatterns = [ # API URL - # url(r'^api/', include(apipatterns)), + url(r'^api/', include(apipatterns)), # url(r'^api-doc/', include_docs_urls(title='InvenTree API')), url(r'^part/', include(part_urls)), diff --git a/InvenTree/company/api.py b/InvenTree/company/api.py index 8f9b43e03a..668c241294 100644 --- a/InvenTree/company/api.py +++ b/InvenTree/company/api.py @@ -1,208 +1,47 @@ from django_filters.rest_framework import FilterSet, DjangoFilterBackend +from rest_framework import filters from rest_framework import generics, permissions +from django.conf.urls import url -from .models import Supplier, SupplierPart, SupplierPriceBreak -from .models import Manufacturer, Customer -from .serializers import SupplierSerializer -from .serializers import SupplierPartSerializer -from .serializers import SupplierPriceBreakSerializer -from .serializers import ManufacturerSerializer -from .serializers import CustomerSerializer +from .models import Company +from .serializers import CompanySerializer -class ManufacturerDetail(generics.RetrieveUpdateDestroyAPIView): - """ - get: - Return a single Manufacturer - post: - Update a Manufacturer +class CompanyList(generics.ListCreateAPIView): - delete: - Remove a Manufacturer + serializer_class = CompanySerializer + queryset = Company.objects.all() + permission_classes = [ + permissions.IsAuthenticatedOrReadOnly, + ] - """ + filter_backends = [ + DjangoFilterBackend, + filters.SearchFilter, + ] - queryset = Manufacturer.objects.all() - serializer_class = ManufacturerSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) + filter_fields = [ + 'name', + 'is_customer', + 'is_supplier', + ] + search_fields = [ + 'name', + 'description', + ] -class ManufacturerList(generics.ListCreateAPIView): - """ + ordering_fields = [ + 'name', + ] - get: - Return a list of all Manufacturers + ordering = 'name' - post: - Create a new Manufacturer - """ +company_api_urls = [ - queryset = Manufacturer.objects.all() - serializer_class = ManufacturerSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - -class CustomerDetail(generics.RetrieveUpdateDestroyAPIView): - """ - - get: - Return a single Customer - - post: - Update a Customer - - delete: - Remove a Customer - - """ - - queryset = Customer.objects.all() - serializer_class = CustomerSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - -class CustomerList(generics.ListCreateAPIView): - """ - - get: - Return a list of all Cutstomers - - post: - Create a new Customer - - """ - - queryset = Customer.objects.all() - serializer_class = CustomerSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - -class SupplierDetail(generics.RetrieveUpdateDestroyAPIView): - """ - - get: - Return a single Supplier - - post: - Update a supplier - - delete: - Remove a supplier - - """ - - queryset = Supplier.objects.all() - serializer_class = SupplierSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - -class SupplierList(generics.ListCreateAPIView): - """ - - get: - Return a list of all Suppliers - - post: - Create a new Supplier - - """ - - queryset = Supplier.objects.all() - serializer_class = SupplierSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - -class SupplierPartDetail(generics.RetrieveUpdateDestroyAPIView): - """ - - get: - Return a single SupplierPart - - post: - Update a SupplierPart - - delete: - Remove a SupplierPart - - """ - - queryset = SupplierPart.objects.all() - serializer_class = SupplierPartSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - -class SupplierPartFilter(FilterSet): - - class Meta: - model = SupplierPart - fields = ['supplier', 'part', 'manufacturer'] - - -class SupplierPartList(generics.ListCreateAPIView): - """ - - get: - List all SupplierParts - (with optional query filters) - - post: - Create a new SupplierPart - - """ - - queryset = SupplierPart.objects.all() - serializer_class = SupplierPartSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - filter_backends = (DjangoFilterBackend,) - filter_class = SupplierPartFilter - - -class SupplierPriceBreakDetail(generics.RetrieveUpdateDestroyAPIView): - """ - - get: - Return a single SupplierPriceBreak - - post: - Update a SupplierPriceBreak - - delete: - Remove a SupplierPriceBreak - - """ - - queryset = SupplierPriceBreak.objects.all() - serializer_class = SupplierPriceBreakSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - -class PriceBreakFilter(FilterSet): - - class Meta: - model = SupplierPriceBreak - fields = ['part'] - - -class SupplierPriceBreakList(generics.ListCreateAPIView): - """ - - get: - Return a list of all SupplierPriceBreaks - (with optional query filters) - - post: - Create a new SupplierPriceBreak - - """ - - queryset = SupplierPriceBreak.objects.all() - serializer_class = SupplierPriceBreakSerializer - permission_classes = (permissions.IsAuthenticatedOrReadOnly,) - - filter_backends = (DjangoFilterBackend,) - filter_class = PriceBreakFilter + url(r'^.*$', CompanyList.as_view(), name='api-company-list'), +] \ No newline at end of file diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 468c8d41ea..f1a635018f 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -28,7 +28,7 @@ def rename_company_image(instance, filename): class Company(models.Model): name = models.CharField(max_length=100, unique=True, - help_text='Company naem') + help_text='Company name') description = models.CharField(max_length=500) diff --git a/InvenTree/company/serializers.py b/InvenTree/company/serializers.py index 313ecc5600..0b67ac80de 100644 --- a/InvenTree/company/serializers.py +++ b/InvenTree/company/serializers.py @@ -2,54 +2,10 @@ from rest_framework import serializers from part.models import Part -from .models import Company, SupplierPart, SupplierPriceBreak - +from .models import Company class CompanySerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Company fields = '__all__' - - -class SupplierPartSerializer(serializers.ModelSerializer): - - price_breaks = serializers.HyperlinkedRelatedField(many=True, - read_only=True, - view_name='supplierpricebreak-detail') - - part = serializers.HyperlinkedRelatedField(view_name='part-detail', - queryset=Part.objects.all()) - - supplier = serializers.HyperlinkedRelatedField(view_name='supplier-detail', - queryset=Supplier.objects.all()) - - manufacturer = serializers.HyperlinkedRelatedField(view_name='manufacturer-detail', - queryset=Manufacturer.objects.all()) - - class Meta: - model = SupplierPart - fields = ['url', - 'part', - 'supplier', - 'SKU', - 'manufacturer', - 'MPN', - 'URL', - 'description', - 'single_price', - 'packaging', - 'multiple', - 'minimum', - 'price_breaks', - 'lead_time'] - - -class SupplierPriceBreakSerializer(serializers.HyperlinkedModelSerializer): - - class Meta: - model = SupplierPriceBreak - fields = ['url', - 'part', - 'quantity', - 'cost']