mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-29 12:06:44 +00:00
Updated track API
This commit is contained in:
parent
d75ed57d48
commit
a139a00843
@ -7,7 +7,7 @@ from part.urls import part_urls, part_cat_urls, part_param_urls, part_param_temp
|
|||||||
from stock.urls import stock_urls, stock_loc_urls
|
from stock.urls import stock_urls, stock_loc_urls
|
||||||
from project.urls import prj_urls, prj_part_urls, prj_cat_urls
|
from project.urls import prj_urls, prj_part_urls, prj_cat_urls
|
||||||
from supplier.urls import cust_urls, manu_urls, supplier_part_urls, price_break_urls, supplier_urls
|
from supplier.urls import cust_urls, manu_urls, supplier_part_urls, price_break_urls, supplier_urls
|
||||||
import supplier
|
from track.urls import unique_urls, part_track_urls
|
||||||
|
|
||||||
admin.site.site_header = "InvenTree Admin"
|
admin.site.site_header = "InvenTree Admin"
|
||||||
|
|
||||||
@ -31,7 +31,8 @@ apipatterns = [
|
|||||||
url(r'^customer/', include(cust_urls)),
|
url(r'^customer/', include(cust_urls)),
|
||||||
|
|
||||||
# Tracking URLs
|
# Tracking URLs
|
||||||
url(r'^track/', include('track.urls')),
|
url(r'^track/', include(part_track_urls)),
|
||||||
|
url(r'^unique-part/', include(unique_urls)),
|
||||||
|
|
||||||
# Project URLs
|
# Project URLs
|
||||||
url(r'^project/', include(prj_urls)),
|
url(r'^project/', include(prj_urls)),
|
||||||
|
@ -4,7 +4,7 @@ from .models import UniquePart
|
|||||||
|
|
||||||
|
|
||||||
class UniquePartAdmin(admin.ModelAdmin):
|
class UniquePartAdmin(admin.ModelAdmin):
|
||||||
list_display = ('part', 'revision', 'serial', 'status', 'creation_date')
|
list_display = ('part', 'serial', 'status', 'creation_date')
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(UniquePart, UniquePartAdmin)
|
admin.site.register(UniquePart, UniquePartAdmin)
|
||||||
|
@ -8,29 +8,6 @@ from supplier.models import Customer
|
|||||||
from part.models import Part, PartRevision
|
from part.models import Part, PartRevision
|
||||||
|
|
||||||
|
|
||||||
class UniquePartManager(models.Manager):
|
|
||||||
""" Ensures UniqueParts are correctly handled
|
|
||||||
"""
|
|
||||||
|
|
||||||
def create(self, *args, **kwargs):
|
|
||||||
|
|
||||||
part_id = kwargs['part']
|
|
||||||
sn = kwargs.get('serial', None)
|
|
||||||
|
|
||||||
if not sn:
|
|
||||||
raise ValidationError(_("Serial number must be supplied"))
|
|
||||||
|
|
||||||
if not isinstance(sn, int):
|
|
||||||
raise ValidationError(_("Serial number must be integer"))
|
|
||||||
|
|
||||||
# Does a part already exists with this serial number?
|
|
||||||
parts = self.filter(part=part_id, serial=sn)
|
|
||||||
if len(parts) > 0:
|
|
||||||
raise ValidationError(_("Matching part and serial number found!"))
|
|
||||||
|
|
||||||
return super(UniquePartManager, self).create(*args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class UniquePart(models.Model):
|
class UniquePart(models.Model):
|
||||||
""" A unique instance of a Part object.
|
""" A unique instance of a Part object.
|
||||||
Used for tracking parts based on serial numbers,
|
Used for tracking parts based on serial numbers,
|
||||||
@ -41,15 +18,8 @@ class UniquePart(models.Model):
|
|||||||
# Cannot have multiple parts with same serial number
|
# Cannot have multiple parts with same serial number
|
||||||
unique_together = ('part', 'serial')
|
unique_together = ('part', 'serial')
|
||||||
|
|
||||||
objects = UniquePartManager()
|
|
||||||
|
|
||||||
part = models.ForeignKey(Part, on_delete=models.CASCADE)
|
part = models.ForeignKey(Part, on_delete=models.CASCADE)
|
||||||
|
|
||||||
revision = models.ForeignKey(PartRevision,
|
|
||||||
on_delete=models.CASCADE,
|
|
||||||
blank=True,
|
|
||||||
null=True)
|
|
||||||
|
|
||||||
creation_date = models.DateField(auto_now_add=True,
|
creation_date = models.DateField(auto_now_add=True,
|
||||||
editable=False)
|
editable=False)
|
||||||
serial = models.IntegerField()
|
serial = models.IntegerField()
|
||||||
|
@ -11,7 +11,6 @@ class UniquePartSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
model = UniquePart
|
model = UniquePart
|
||||||
fields = ['url',
|
fields = ['url',
|
||||||
'part',
|
'part',
|
||||||
'revision',
|
|
||||||
'creation_date',
|
'creation_date',
|
||||||
'serial',
|
'serial',
|
||||||
# 'createdBy',
|
# 'createdBy',
|
||||||
|
@ -2,15 +2,14 @@ from django.conf.urls import url, include
|
|||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
infopatterns = [
|
part_track_urls = [
|
||||||
url(r'^(?P<pk>[0-9]+)/?$', views.PartTrackingDetail.as_view(), name='parttrackinginfo-detail'),
|
url(r'^(?P<pk>[0-9]+)/?$', views.PartTrackingDetail.as_view(), name='parttrackinginfo-detail'),
|
||||||
|
|
||||||
url(r'^\?.*/?$', views.PartTrackingList.as_view()),
|
url(r'^\?.*/?$', views.PartTrackingList.as_view()),
|
||||||
url(r'^$', views.PartTrackingList.as_view())
|
url(r'^$', views.PartTrackingList.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
urlpatterns = [
|
unique_urls = [
|
||||||
url(r'info/', include(infopatterns)),
|
|
||||||
|
|
||||||
# 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]+)/?$', views.UniquePartDetail.as_view(), name='uniquepart-detail'),
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
import django_filters
|
import django_filters
|
||||||
|
from django_filters.rest_framework import FilterSet, DjangoFilterBackend
|
||||||
|
from django_filters import NumberFilter
|
||||||
|
|
||||||
from rest_framework import generics, permissions
|
from rest_framework import generics, permissions
|
||||||
|
|
||||||
@ -7,69 +9,95 @@ from .serializers import UniquePartSerializer, PartTrackingInfoSerializer
|
|||||||
|
|
||||||
|
|
||||||
class UniquePartDetail(generics.RetrieveUpdateDestroyAPIView):
|
class UniquePartDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a single UniquePart
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a UniquePart
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a UniquePart
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
queryset = UniquePart.objects.all()
|
queryset = UniquePart.objects.all()
|
||||||
serializer_class = UniquePartSerializer
|
serializer_class = UniquePartSerializer
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
class UniquePartFilter(django_filters.rest_framework.FilterSet):
|
class UniquePartFilter(FilterSet):
|
||||||
# Filter based on serial number
|
# Filter based on serial number
|
||||||
min_sn = django_filters.NumberFilter(name='serial', lookup_expr='gte')
|
min_sn = NumberFilter(name='serial', lookup_expr='gte')
|
||||||
max_sn = django_filters.NumberFilter(name='serial', lookup_expr='lte')
|
max_sn = NumberFilter(name='serial', lookup_expr='lte')
|
||||||
|
|
||||||
|
sn = NumberFilter(name='serial', lookup_expr='exact')
|
||||||
|
part = NumberFilter(name='part', lookup_expr='exact')
|
||||||
|
customer = NumberFilter(name='customer', lookup_expr='exact')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UniquePart
|
model = UniquePart
|
||||||
fields = ['serial', ]
|
fields = ['serial', 'part', 'customer']
|
||||||
|
|
||||||
|
|
||||||
class UniquePartList(generics.ListCreateAPIView):
|
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
|
serializer_class = UniquePartSerializer
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
|
filter_backends = (DjangoFilterBackend,)
|
||||||
filter_class = UniquePartFilter
|
filter_class = UniquePartFilter
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
parts = UniquePart.objects.all()
|
|
||||||
query = self.request.query_params
|
|
||||||
|
|
||||||
# Filter by associated part
|
|
||||||
part_id = query.get('part', None)
|
|
||||||
if part_id:
|
|
||||||
parts = parts.filter(part=part_id)
|
|
||||||
|
|
||||||
# Filter by serial number
|
|
||||||
sn = query.get('sn', None)
|
|
||||||
if sn:
|
|
||||||
parts = parts.filter(serial=sn)
|
|
||||||
|
|
||||||
# Filter by customer
|
|
||||||
customer = query.get('customer', None)
|
|
||||||
if customer:
|
|
||||||
parts = parts.filter(customer=customer)
|
|
||||||
|
|
||||||
return parts
|
|
||||||
|
|
||||||
|
|
||||||
class PartTrackingDetail(generics.RetrieveUpdateDestroyAPIView):
|
class PartTrackingDetail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""
|
||||||
|
|
||||||
|
get:
|
||||||
|
Return a single PartTrackingInfo object
|
||||||
|
|
||||||
|
post:
|
||||||
|
Update a PartTrackingInfo object
|
||||||
|
|
||||||
|
delete:
|
||||||
|
Remove a PartTrackingInfo object
|
||||||
|
"""
|
||||||
|
|
||||||
queryset = PartTrackingInfo.objects.all()
|
queryset = PartTrackingInfo.objects.all()
|
||||||
serializer_class = PartTrackingInfoSerializer
|
serializer_class = PartTrackingInfoSerializer
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
|
||||||
|
|
||||||
class PartTrackingList(generics.ListCreateAPIView):
|
class PartTrackingFilter(FilterSet):
|
||||||
|
part = NumberFilter(name='part', lookup_expr='exact')
|
||||||
|
|
||||||
|
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
|
serializer_class = PartTrackingInfoSerializer
|
||||||
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
|
||||||
|
filter_backends = (DjangoFilterBackend,)
|
||||||
def get_queryset(self):
|
filter_class = PartTrackingFilter
|
||||||
tracking = PartTrackingInfo.objects.all()
|
|
||||||
query = self.request.query_params
|
|
||||||
|
|
||||||
part_id = query.get('part', None)
|
|
||||||
if part_id:
|
|
||||||
tracking = tracking.filter(part=part_id)
|
|
||||||
|
|
||||||
return tracking
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user