Implement (basic) JSON API for company model

- Pagination
- Search company name and description
- Filter by is_customer and is_supplier
This commit is contained in:
Oliver 2018-04-23 19:36:46 +10:00
parent 97f05f85de
commit 6c1784b5b9
5 changed files with 44 additions and 244 deletions

View File

@ -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'

View File

@ -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)),

View File

@ -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'),
]

View File

@ -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)

View File

@ -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']