mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-29 12:06:44 +00:00
Separate API views into api.py
- Web views are still in views.py - Files were getting too cluttered and hard to grok
This commit is contained in:
parent
63f7fe640c
commit
1da6df0c5e
174
InvenTree/part/api.py
Normal file
174
InvenTree/part/api.py
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
from .serializers import PartSerializer
|
||||||
|
from .serializers import PartCategorySerializer
|
||||||
|
|
||||||
|
from rest_framework import generics, permissions
|
||||||
|
|
||||||
|
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
||||||
|
|
||||||
|
from .models import PartCategory, Part
|
||||||
|
|
||||||
|
class PartDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return detail on a single Part
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update data for a single Part
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a part from the database
|
||||||
|
|
||||||
|
"""
|
||||||
|
queryset = Part.objects.all()
|
||||||
|
serializer_class = PartSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
class PartParamFilter(FilterSet):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = PartParameter
|
||||||
|
fields = ['part']
|
||||||
|
|
||||||
|
class PartParamList(generics.ListCreateAPIView):
|
||||||
|
"
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all part parameters (with optional filters)
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new part parameter
|
||||||
|
""
|
||||||
|
|
||||||
|
queryset = PartParameter.objects.all()
|
||||||
|
serializer_class = PartParameterSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
|
filter_class = PartParamFilter
|
||||||
|
|
||||||
|
|
||||||
|
class PartParamDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Detail view of a single PartParameter
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update data for a PartParameter
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a PartParameter from the database
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
queryset = PartParameter.objects.all()
|
||||||
|
serializer_class = PartParameterSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
"""
|
||||||
|
|
||||||
|
class PartFilter(FilterSet):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Part
|
||||||
|
fields = ['category']
|
||||||
|
|
||||||
|
|
||||||
|
class PartList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
List of Parts, with optional filters
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new Part
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = Part.objects.all()
|
||||||
|
serializer_class = PartSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
|
filter_class = PartFilter
|
||||||
|
|
||||||
|
|
||||||
|
class PartCategoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return information on a single PartCategory
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a PartCategory
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a PartCategory
|
||||||
|
|
||||||
|
"""
|
||||||
|
queryset = PartCategory.objects.all()
|
||||||
|
serializer_class = PartCategorySerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
class PartCategoryList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all categories
|
||||||
|
(with optional filters)
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new PartCategory
|
||||||
|
"""
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
params = self.request.query_params
|
||||||
|
|
||||||
|
categories = PartCategory.objects.all()
|
||||||
|
|
||||||
|
categories = FilterChildren(categories, params.get('parent', None))
|
||||||
|
|
||||||
|
return categories
|
||||||
|
|
||||||
|
queryset = PartCategory.objects.filter(parent=None)
|
||||||
|
serializer_class = PartCategorySerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
class PartTemplateDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return detail on a single PartParameterTemplate object
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a PartParameterTemplate object
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a PartParameterTemplate object
|
||||||
|
|
||||||
|
""
|
||||||
|
|
||||||
|
queryset = PartParameterTemplate.objects.all()
|
||||||
|
serializer_class = PartTemplateSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
class PartTemplateList(generics.ListCreateAPIView):
|
||||||
|
""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all PartParameterTemplate objects
|
||||||
|
(with optional query filters)
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new PartParameterTemplate object
|
||||||
|
|
||||||
|
""
|
||||||
|
|
||||||
|
queryset = PartParameterTemplate.objects.all()
|
||||||
|
serializer_class = PartTemplateSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
"""
|
@ -6,6 +6,8 @@ from django.core.validators import MinValueValidator
|
|||||||
|
|
||||||
from InvenTree.models import InvenTreeTree
|
from InvenTree.models import InvenTreeTree
|
||||||
|
|
||||||
|
#from django.db.models.signals.pre_delete
|
||||||
|
#from django.dispatch import receiver
|
||||||
|
|
||||||
class PartCategory(InvenTreeTree):
|
class PartCategory(InvenTreeTree):
|
||||||
""" PartCategory provides hierarchical organization of Part objects.
|
""" PartCategory provides hierarchical organization of Part objects.
|
||||||
@ -19,6 +21,15 @@ class PartCategory(InvenTreeTree):
|
|||||||
def parts(self):
|
def parts(self):
|
||||||
return self.part_set.all()
|
return self.part_set.all()
|
||||||
|
|
||||||
|
"""
|
||||||
|
@receiver(pre_delete, sender=PartCategory)
|
||||||
|
def reset_tag(sender, **kwargs):
|
||||||
|
cat = kwargs['instance']
|
||||||
|
|
||||||
|
for book in books.filter(tag=tag):
|
||||||
|
book.tag = book.author.tags.first()
|
||||||
|
book.save()
|
||||||
|
"""
|
||||||
|
|
||||||
class Part(models.Model):
|
class Part(models.Model):
|
||||||
""" Represents an abstract part
|
""" Represents an abstract part
|
||||||
@ -36,7 +47,9 @@ class Part(models.Model):
|
|||||||
IPN = models.CharField(max_length=100, blank=True)
|
IPN = models.CharField(max_length=100, blank=True)
|
||||||
|
|
||||||
# Part category - all parts must be assigned to a category
|
# Part category - all parts must be assigned to a category
|
||||||
category = models.ForeignKey(PartCategory, on_delete=models.CASCADE, related_name='parts')
|
category = models.ForeignKey(PartCategory, related_name='parts',
|
||||||
|
null=True, blank=True,
|
||||||
|
on_delete=models.SET_NULL)
|
||||||
|
|
||||||
# Minimum "allowed" stock level
|
# Minimum "allowed" stock level
|
||||||
minimum_stock = models.PositiveIntegerField(default=0, validators=[MinValueValidator(0)])
|
minimum_stock = models.PositiveIntegerField(default=0, validators=[MinValueValidator(0)])
|
||||||
|
@ -2,6 +2,7 @@ from django.conf.urls import url, include
|
|||||||
from django.views.generic.base import RedirectView
|
from django.views.generic.base import RedirectView
|
||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
|
from . import api
|
||||||
|
|
||||||
app_nam='part'
|
app_nam='part'
|
||||||
|
|
||||||
@ -9,11 +10,11 @@ app_nam='part'
|
|||||||
part_cat_api_urls = [
|
part_cat_api_urls = [
|
||||||
|
|
||||||
# Part category detail
|
# Part category detail
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.PartCategoryDetail.as_view(), name='partcategory-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.PartCategoryDetail.as_view(), name='partcategory-detail'),
|
||||||
|
|
||||||
# List of top-level categories
|
# List of top-level categories
|
||||||
url(r'^\?*.*/?$', views.PartCategoryList.as_view()),
|
url(r'^\?*.*/?$', api.PartCategoryList.as_view()),
|
||||||
url(r'^$', views.PartCategoryList.as_view())
|
url(r'^$', api.PartCategoryList.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -21,11 +22,11 @@ part_cat_api_urls = [
|
|||||||
part_api_urls = [
|
part_api_urls = [
|
||||||
|
|
||||||
# Individual part
|
# Individual part
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.PartDetail.as_view(), name='part-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.PartDetail.as_view(), name='part-detail'),
|
||||||
|
|
||||||
# List parts with optional filters
|
# List parts with optional filters
|
||||||
url(r'^\?.*/?$', views.PartList.as_view()),
|
url(r'^\?.*/?$', api.PartList.as_view()),
|
||||||
url(r'^$', views.PartList.as_view()),
|
url(r'^$', api.PartList.as_view()),
|
||||||
]
|
]
|
||||||
|
|
||||||
part_detail_urls = [
|
part_detail_urls = [
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
|
||||||
|
|
||||||
# Template stuff (WIP)
|
# Template stuff (WIP)
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.template import loader
|
from django.template import loader
|
||||||
|
|
||||||
from rest_framework import generics, permissions
|
|
||||||
|
|
||||||
from InvenTree.models import FilterChildren
|
from InvenTree.models import FilterChildren
|
||||||
from .models import PartCategory, Part
|
from .models import PartCategory, Part
|
||||||
|
|
||||||
@ -14,22 +11,6 @@ from django.http import HttpResponseRedirect
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
from .serializers import PartSerializer
|
|
||||||
from .serializers import PartCategorySerializer
|
|
||||||
#from .serializers import PartParameterSerializer
|
|
||||||
#from .serializers import PartTemplateSerializer
|
|
||||||
|
|
||||||
"""
|
|
||||||
class IndexView(generic.ListView):
|
|
||||||
template_name = 'index.html'
|
|
||||||
context_object_name = 'parts'
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
"Return the last five published questions."
|
|
||||||
return Part.objects.all()
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
template = loader.get_template('part/index.html')
|
template = loader.get_template('part/index.html')
|
||||||
|
|
||||||
@ -79,174 +60,3 @@ def track(request, pk):
|
|||||||
|
|
||||||
return render(request, 'part/track.html', {'part': part})
|
return render(request, 'part/track.html', {'part': part})
|
||||||
|
|
||||||
|
|
||||||
#def results(request, question_id):
|
|
||||||
# response = "You're looking at the results of question %s."
|
|
||||||
# return HttpResponse(response % question_id)
|
|
||||||
|
|
||||||
|
|
||||||
class PartDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return detail on a single Part
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update data for a single Part
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a part from the database
|
|
||||||
|
|
||||||
"""
|
|
||||||
queryset = Part.objects.all()
|
|
||||||
serializer_class = PartSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
class PartParamFilter(FilterSet):
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = PartParameter
|
|
||||||
fields = ['part']
|
|
||||||
|
|
||||||
class PartParamList(generics.ListCreateAPIView):
|
|
||||||
"
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all part parameters (with optional filters)
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new part parameter
|
|
||||||
""
|
|
||||||
|
|
||||||
queryset = PartParameter.objects.all()
|
|
||||||
serializer_class = PartParameterSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
filter_backends = (DjangoFilterBackend,)
|
|
||||||
filter_class = PartParamFilter
|
|
||||||
|
|
||||||
|
|
||||||
class PartParamDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Detail view of a single PartParameter
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update data for a PartParameter
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a PartParameter from the database
|
|
||||||
|
|
||||||
"
|
|
||||||
|
|
||||||
queryset = PartParameter.objects.all()
|
|
||||||
serializer_class = PartParameterSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
"""
|
|
||||||
|
|
||||||
class PartFilter(FilterSet):
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = Part
|
|
||||||
fields = ['category']
|
|
||||||
|
|
||||||
|
|
||||||
class PartList(generics.ListCreateAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
List of Parts, with optional filters
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new Part
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = Part.objects.all()
|
|
||||||
serializer_class = PartSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
filter_backends = (DjangoFilterBackend,)
|
|
||||||
filter_class = PartFilter
|
|
||||||
|
|
||||||
|
|
||||||
class PartCategoryDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return information on a single PartCategory
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update a PartCategory
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a PartCategory
|
|
||||||
|
|
||||||
"""
|
|
||||||
queryset = PartCategory.objects.all()
|
|
||||||
serializer_class = PartCategorySerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
class PartCategoryList(generics.ListCreateAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all categories
|
|
||||||
(with optional filters)
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new PartCategory
|
|
||||||
"""
|
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
params = self.request.query_params
|
|
||||||
|
|
||||||
categories = PartCategory.objects.all()
|
|
||||||
|
|
||||||
categories = FilterChildren(categories, params.get('parent', None))
|
|
||||||
|
|
||||||
return categories
|
|
||||||
|
|
||||||
queryset = PartCategory.objects.filter(parent=None)
|
|
||||||
serializer_class = PartCategorySerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
class PartTemplateDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return detail on a single PartParameterTemplate object
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update a PartParameterTemplate object
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a PartParameterTemplate object
|
|
||||||
|
|
||||||
""
|
|
||||||
|
|
||||||
queryset = PartParameterTemplate.objects.all()
|
|
||||||
serializer_class = PartTemplateSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
class PartTemplateList(generics.ListCreateAPIView):
|
|
||||||
""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all PartParameterTemplate objects
|
|
||||||
(with optional query filters)
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new PartParameterTemplate object
|
|
||||||
|
|
||||||
""
|
|
||||||
|
|
||||||
queryset = PartParameterTemplate.objects.all()
|
|
||||||
serializer_class = PartTemplateSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
132
InvenTree/stock/api.py
Normal file
132
InvenTree/stock/api.py
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
||||||
|
from django_filters import NumberFilter
|
||||||
|
|
||||||
|
from rest_framework import generics, permissions, response
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# from InvenTree.models import FilterChildren
|
||||||
|
from .models import StockLocation, StockItem
|
||||||
|
from .serializers import StockItemSerializer, StockQuantitySerializer
|
||||||
|
from .serializers import LocationSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class StockDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a single StockItem object
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a StockItem
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a StockItem
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = StockItem.objects.all()
|
||||||
|
serializer_class = StockItemSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
class StockFilter(FilterSet):
|
||||||
|
min_stock = NumberFilter(name='quantity', lookup_expr='gte')
|
||||||
|
max_stock = NumberFilter(name='quantity', lookup_expr='lte')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = StockItem
|
||||||
|
fields = ['quantity', 'part', 'location']
|
||||||
|
|
||||||
|
|
||||||
|
class StockList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all StockItem objects
|
||||||
|
(with optional query filters)
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new StockItem
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = StockItem.objects.all()
|
||||||
|
serializer_class = StockItemSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
|
filter_class = StockFilter
|
||||||
|
|
||||||
|
|
||||||
|
class StockStocktakeEndpoint(generics.UpdateAPIView):
|
||||||
|
|
||||||
|
queryset = StockItem.objects.all()
|
||||||
|
serializer_class = StockQuantitySerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
def update(self, request, *args, **kwargs):
|
||||||
|
object = self.get_object()
|
||||||
|
object.stocktake(request.data['quantity'], request.user)
|
||||||
|
|
||||||
|
serializer = self.get_serializer(object)
|
||||||
|
|
||||||
|
return response.Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
class AddStockEndpoint(generics.UpdateAPIView):
|
||||||
|
|
||||||
|
queryset = StockItem.objects.all()
|
||||||
|
serializer_class = StockQuantitySerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
def update(self, request, *args, **kwargs):
|
||||||
|
object = self.get_object()
|
||||||
|
object.add_stock(request.data['quantity'])
|
||||||
|
|
||||||
|
serializer = self.get_serializer(object)
|
||||||
|
|
||||||
|
return response.Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
class LocationDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a single StockLocation object
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a StockLocation object
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a StockLocation object
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = StockLocation.objects.all()
|
||||||
|
serializer_class = LocationSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
class StockLocationFilter(FilterSet):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = StockLocation
|
||||||
|
fields = ['parent']
|
||||||
|
|
||||||
|
|
||||||
|
class LocationList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all StockLocation objects
|
||||||
|
(with optional query filter)
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new StockLocation
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = StockLocation.objects.all()
|
||||||
|
serializer_class = LocationSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
|
filter_class = StockLocationFilter
|
@ -1,13 +1,14 @@
|
|||||||
from django.conf.urls import url, include
|
from django.conf.urls import url, include
|
||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
|
from . import api
|
||||||
|
|
||||||
stock_endpoints = [
|
stock_endpoints = [
|
||||||
url(r'^$', views.StockDetail.as_view(), name='stockitem-detail'),
|
url(r'^$', api.StockDetail.as_view(), name='stockitem-detail'),
|
||||||
|
|
||||||
url(r'^stocktake/?$', views.StockStocktakeEndpoint.as_view(), name='stockitem-stocktake'),
|
url(r'^stocktake/?$', api.StockStocktakeEndpoint.as_view(), name='stockitem-stocktake'),
|
||||||
|
|
||||||
url(r'^add-stock/?$', views.AddStockEndpoint.as_view(), name='stockitem-add-stock'),
|
url(r'^add-stock/?$', api.AddStockEndpoint.as_view(), name='stockitem-add-stock'),
|
||||||
]
|
]
|
||||||
|
|
||||||
stock_urls = [
|
stock_urls = [
|
||||||
@ -15,14 +16,14 @@ stock_urls = [
|
|||||||
url(r'^(?P<pk>[0-9]+)/', include(stock_endpoints)),
|
url(r'^(?P<pk>[0-9]+)/', include(stock_endpoints)),
|
||||||
|
|
||||||
# List all stock items, with optional filters
|
# List all stock items, with optional filters
|
||||||
url(r'^\?.*/?$', views.StockList.as_view()),
|
url(r'^\?.*/?$', api.StockList.as_view()),
|
||||||
url(r'^$', views.StockList.as_view()),
|
url(r'^$', api.StockList.as_view()),
|
||||||
]
|
]
|
||||||
|
|
||||||
stock_loc_urls = [
|
stock_loc_urls = [
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.LocationDetail.as_view(), name='stocklocation-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.LocationDetail.as_view(), name='stocklocation-detail'),
|
||||||
|
|
||||||
url(r'^\?.*/?$', views.LocationList.as_view()),
|
url(r'^\?.*/?$', api.LocationList.as_view()),
|
||||||
|
|
||||||
url(r'^$', views.LocationList.as_view())
|
url(r'^$', api.LocationList.as_view())
|
||||||
]
|
]
|
||||||
|
@ -1,129 +0,0 @@
|
|||||||
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
|
||||||
from django_filters import NumberFilter
|
|
||||||
|
|
||||||
from rest_framework import generics, permissions, response
|
|
||||||
|
|
||||||
# from InvenTree.models import FilterChildren
|
|
||||||
from .models import StockLocation, StockItem
|
|
||||||
from .serializers import StockItemSerializer, StockQuantitySerializer
|
|
||||||
from .serializers import LocationSerializer
|
|
||||||
|
|
||||||
|
|
||||||
class StockDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a single StockItem object
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update a StockItem
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a StockItem
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = StockItem.objects.all()
|
|
||||||
serializer_class = StockItemSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
class StockFilter(FilterSet):
|
|
||||||
min_stock = NumberFilter(name='quantity', lookup_expr='gte')
|
|
||||||
max_stock = NumberFilter(name='quantity', lookup_expr='lte')
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = StockItem
|
|
||||||
fields = ['quantity', 'part', 'location']
|
|
||||||
|
|
||||||
|
|
||||||
class StockList(generics.ListCreateAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all StockItem objects
|
|
||||||
(with optional query filters)
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new StockItem
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = StockItem.objects.all()
|
|
||||||
serializer_class = StockItemSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
filter_backends = (DjangoFilterBackend,)
|
|
||||||
filter_class = StockFilter
|
|
||||||
|
|
||||||
|
|
||||||
class StockStocktakeEndpoint(generics.UpdateAPIView):
|
|
||||||
|
|
||||||
queryset = StockItem.objects.all()
|
|
||||||
serializer_class = StockQuantitySerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
def update(self, request, *args, **kwargs):
|
|
||||||
object = self.get_object()
|
|
||||||
object.stocktake(request.data['quantity'], request.user)
|
|
||||||
|
|
||||||
serializer = self.get_serializer(object)
|
|
||||||
|
|
||||||
return response.Response(serializer.data)
|
|
||||||
|
|
||||||
|
|
||||||
class AddStockEndpoint(generics.UpdateAPIView):
|
|
||||||
|
|
||||||
queryset = StockItem.objects.all()
|
|
||||||
serializer_class = StockQuantitySerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
def update(self, request, *args, **kwargs):
|
|
||||||
object = self.get_object()
|
|
||||||
object.add_stock(request.data['quantity'])
|
|
||||||
|
|
||||||
serializer = self.get_serializer(object)
|
|
||||||
|
|
||||||
return response.Response(serializer.data)
|
|
||||||
|
|
||||||
|
|
||||||
class LocationDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a single StockLocation object
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update a StockLocation object
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a StockLocation object
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = StockLocation.objects.all()
|
|
||||||
serializer_class = LocationSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
class StockLocationFilter(FilterSet):
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = StockLocation
|
|
||||||
fields = ['parent']
|
|
||||||
|
|
||||||
|
|
||||||
class LocationList(generics.ListCreateAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all StockLocation objects
|
|
||||||
(with optional query filter)
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new StockLocation
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = StockLocation.objects.all()
|
|
||||||
serializer_class = LocationSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
filter_backends = (DjangoFilterBackend,)
|
|
||||||
filter_class = StockLocationFilter
|
|
208
InvenTree/supplier/api.py
Normal file
208
InvenTree/supplier/api.py
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
||||||
|
|
||||||
|
from rest_framework import generics, permissions
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
class ManufacturerDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a single Manufacturer
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a Manufacturer
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a Manufacturer
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = Manufacturer.objects.all()
|
||||||
|
serializer_class = ManufacturerSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
class ManufacturerList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all Manufacturers
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new Manufacturer
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
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
|
@ -1,45 +1,46 @@
|
|||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
|
from . import api
|
||||||
|
|
||||||
cust_urls = [
|
cust_urls = [
|
||||||
# Customer detail
|
# Customer detail
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.CustomerDetail.as_view(), name='customer-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.CustomerDetail.as_view(), name='customer-detail'),
|
||||||
|
|
||||||
# List customers
|
# List customers
|
||||||
url(r'^\?.*/?$', views.CustomerList.as_view()),
|
url(r'^\?.*/?$', api.CustomerList.as_view()),
|
||||||
url(r'^$', views.CustomerList.as_view())
|
url(r'^$', api.CustomerList.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
manu_urls = [
|
manu_urls = [
|
||||||
# Manufacturer detail
|
# Manufacturer detail
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.ManufacturerDetail.as_view(), name='manufacturer-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.ManufacturerDetail.as_view(), name='manufacturer-detail'),
|
||||||
|
|
||||||
# List manufacturers
|
# List manufacturers
|
||||||
url(r'^\?.*/?$', views.ManufacturerList.as_view()),
|
url(r'^\?.*/?$', api.ManufacturerList.as_view()),
|
||||||
url(r'^$', views.ManufacturerList.as_view())
|
url(r'^$', api.ManufacturerList.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
supplier_part_urls = [
|
supplier_part_urls = [
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.SupplierPartDetail.as_view(), name='supplierpart-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.SupplierPartDetail.as_view(), name='supplierpart-detail'),
|
||||||
|
|
||||||
url(r'^\?.*/?$', views.SupplierPartList.as_view()),
|
url(r'^\?.*/?$', api.SupplierPartList.as_view()),
|
||||||
url(r'^$', views.SupplierPartList.as_view())
|
url(r'^$', api.SupplierPartList.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
price_break_urls = [
|
price_break_urls = [
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.SupplierPriceBreakDetail.as_view(), name='supplierpricebreak-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.SupplierPriceBreakDetail.as_view(), name='supplierpricebreak-detail'),
|
||||||
|
|
||||||
url(r'^\?.*/?$', views.SupplierPriceBreakList.as_view()),
|
url(r'^\?.*/?$', api.SupplierPriceBreakList.as_view()),
|
||||||
url(r'^$', views.SupplierPriceBreakList.as_view())
|
url(r'^$', api.SupplierPriceBreakList.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
supplier_urls = [
|
supplier_urls = [
|
||||||
|
|
||||||
# Display details of a supplier
|
# Display details of a supplier
|
||||||
url(r'^(?P<pk>[0-9]+)/$', views.SupplierDetail.as_view(), name='supplier-detail'),
|
url(r'^(?P<pk>[0-9]+)/$', api.SupplierDetail.as_view(), name='supplier-detail'),
|
||||||
|
|
||||||
# List suppliers
|
# List suppliers
|
||||||
url(r'^\?.*/?$', views.SupplierList.as_view()),
|
url(r'^\?.*/?$', api.SupplierList.as_view()),
|
||||||
url(r'^$', views.SupplierList.as_view())
|
url(r'^$', api.SupplierList.as_view())
|
||||||
]
|
]
|
||||||
|
@ -1,208 +0,0 @@
|
|||||||
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
|
||||||
|
|
||||||
from rest_framework import generics, permissions
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
class ManufacturerDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a single Manufacturer
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update a Manufacturer
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a Manufacturer
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = Manufacturer.objects.all()
|
|
||||||
serializer_class = ManufacturerSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
class ManufacturerList(generics.ListCreateAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all Manufacturers
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new Manufacturer
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
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
|
|
97
InvenTree/track/api.py
Normal file
97
InvenTree/track/api.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
||||||
|
from django_filters import NumberFilter
|
||||||
|
|
||||||
|
from rest_framework import generics, permissions
|
||||||
|
|
||||||
|
from .models import UniquePart, PartTrackingInfo
|
||||||
|
from .serializers import UniquePartSerializer, PartTrackingInfoSerializer
|
||||||
|
|
||||||
|
|
||||||
|
class UniquePartDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a single UniquePart
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a UniquePart
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a UniquePart
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = UniquePart.objects.all()
|
||||||
|
serializer_class = UniquePartSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
class UniquePartFilter(FilterSet):
|
||||||
|
# Filter based on serial number
|
||||||
|
min_sn = NumberFilter(name='serial', lookup_expr='gte')
|
||||||
|
max_sn = NumberFilter(name='serial', lookup_expr='lte')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = UniquePart
|
||||||
|
fields = ['serial', 'part', 'customer']
|
||||||
|
|
||||||
|
|
||||||
|
class UniquePartList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all UniqueParts
|
||||||
|
(with optional query filter)
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new UniquePart
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = UniquePart.objects.all()
|
||||||
|
serializer_class = UniquePartSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
|
filter_class = UniquePartFilter
|
||||||
|
|
||||||
|
|
||||||
|
class PartTrackingDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a single PartTrackingInfo object
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a PartTrackingInfo object
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a PartTrackingInfo object
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = PartTrackingInfo.objects.all()
|
||||||
|
serializer_class = PartTrackingInfoSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
|
class PartTrackingFilter(FilterSet):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = PartTrackingInfo
|
||||||
|
fields = ['part']
|
||||||
|
|
||||||
|
|
||||||
|
class PartTrackingList(generics.ListCreateAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a list of all PartTrackingInfo objects
|
||||||
|
(with optional query filter)
|
||||||
|
|
||||||
|
post:
|
||||||
|
Create a new PartTrackingInfo object
|
||||||
|
"""
|
||||||
|
|
||||||
|
queryset = PartTrackingInfo.objects.all()
|
||||||
|
serializer_class = PartTrackingInfoSerializer
|
||||||
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
|
filter_class = PartTrackingFilter
|
@ -3,18 +3,18 @@ from django.conf.urls import url
|
|||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
part_track_urls = [
|
part_track_urls = [
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.PartTrackingDetail.as_view(), name='parttrackinginfo-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.PartTrackingDetail.as_view(), name='parttrackinginfo-detail'),
|
||||||
|
|
||||||
url(r'^\?.*/?$', views.PartTrackingList.as_view()),
|
url(r'^\?.*/?$', api.PartTrackingList.as_view()),
|
||||||
url(r'^$', views.PartTrackingList.as_view())
|
url(r'^$', api.PartTrackingList.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
unique_urls = [
|
unique_urls = [
|
||||||
|
|
||||||
# Detail for a single unique part
|
# Detail for a single unique part
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.UniquePartDetail.as_view(), name='uniquepart-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', api.UniquePartDetail.as_view(), name='uniquepart-detail'),
|
||||||
|
|
||||||
# List all unique parts, with optional filters
|
# List all unique parts, with optional filters
|
||||||
url(r'^\?.*/?$', views.UniquePartList.as_view()),
|
url(r'^\?.*/?$', api.UniquePartList.as_view()),
|
||||||
url(r'^$', views.UniquePartList.as_view()),
|
url(r'^$', api.UniquePartList.as_view()),
|
||||||
]
|
]
|
||||||
|
@ -1,97 +0,0 @@
|
|||||||
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
|
||||||
from django_filters import NumberFilter
|
|
||||||
|
|
||||||
from rest_framework import generics, permissions
|
|
||||||
|
|
||||||
from .models import UniquePart, PartTrackingInfo
|
|
||||||
from .serializers import UniquePartSerializer, PartTrackingInfoSerializer
|
|
||||||
|
|
||||||
|
|
||||||
class UniquePartDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a single UniquePart
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update a UniquePart
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a UniquePart
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = UniquePart.objects.all()
|
|
||||||
serializer_class = UniquePartSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
class UniquePartFilter(FilterSet):
|
|
||||||
# Filter based on serial number
|
|
||||||
min_sn = NumberFilter(name='serial', lookup_expr='gte')
|
|
||||||
max_sn = NumberFilter(name='serial', lookup_expr='lte')
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = UniquePart
|
|
||||||
fields = ['serial', 'part', 'customer']
|
|
||||||
|
|
||||||
|
|
||||||
class UniquePartList(generics.ListCreateAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all UniqueParts
|
|
||||||
(with optional query filter)
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new UniquePart
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = UniquePart.objects.all()
|
|
||||||
serializer_class = UniquePartSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
filter_backends = (DjangoFilterBackend,)
|
|
||||||
filter_class = UniquePartFilter
|
|
||||||
|
|
||||||
|
|
||||||
class PartTrackingDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a single PartTrackingInfo object
|
|
||||||
|
|
||||||
post:
|
|
||||||
Update a PartTrackingInfo object
|
|
||||||
|
|
||||||
delete:
|
|
||||||
Remove a PartTrackingInfo object
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = PartTrackingInfo.objects.all()
|
|
||||||
serializer_class = PartTrackingInfoSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
|
|
||||||
|
|
||||||
class PartTrackingFilter(FilterSet):
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = PartTrackingInfo
|
|
||||||
fields = ['part']
|
|
||||||
|
|
||||||
|
|
||||||
class PartTrackingList(generics.ListCreateAPIView):
|
|
||||||
"""
|
|
||||||
|
|
||||||
get:
|
|
||||||
Return a list of all PartTrackingInfo objects
|
|
||||||
(with optional query filter)
|
|
||||||
|
|
||||||
post:
|
|
||||||
Create a new PartTrackingInfo object
|
|
||||||
"""
|
|
||||||
|
|
||||||
queryset = PartTrackingInfo.objects.all()
|
|
||||||
serializer_class = PartTrackingInfoSerializer
|
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
|
||||||
filter_backends = (DjangoFilterBackend,)
|
|
||||||
filter_class = PartTrackingFilter
|
|
Loading…
x
Reference in New Issue
Block a user