mirror of
https://github.com/inventree/InvenTree.git
synced 2025-06-14 19:15:41 +00:00
Implemented API to move multiple items at once
- Added ability to override request method in inventreeUpdate - Added inventree/script/stock.js to handle stock API js - Added StockMove API endpoint
This commit is contained in:
@ -13,6 +13,12 @@ from .serializers import LocationSerializer
|
||||
from InvenTree.views import TreeSerializer
|
||||
from InvenTree.serializers import DraftRUDView
|
||||
|
||||
from rest_framework.serializers import ValidationError
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import authentication, permissions
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
class StockCategoryTree(TreeSerializer):
|
||||
title = 'Stock'
|
||||
model = StockLocation
|
||||
@ -45,6 +51,54 @@ class StockFilter(FilterSet):
|
||||
fields = ['quantity', 'part', 'location']
|
||||
|
||||
|
||||
class StockMove(APIView):
|
||||
|
||||
permission_classes = [
|
||||
permissions.IsAuthenticatedOrReadOnly,
|
||||
]
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
|
||||
data = request.data
|
||||
|
||||
if not u'location' in data:
|
||||
raise ValidationError({'location': 'Destination must be specified'})
|
||||
|
||||
loc_id = data.get(u'location')
|
||||
|
||||
try:
|
||||
location = StockLocation.objects.get(pk=loc_id)
|
||||
except StockLocation.DoesNotExist:
|
||||
raise ValidationError({'location': 'Location does not exist'})
|
||||
|
||||
if not u'parts[]' in data:
|
||||
raise ValidationError({'parts[]': 'Parts list must be specified'})
|
||||
|
||||
part_list = data.getlist(u'parts[]')
|
||||
|
||||
parts = []
|
||||
|
||||
errors = []
|
||||
|
||||
for pid in part_list:
|
||||
try:
|
||||
part = StockItem.objects.get(pk=pid)
|
||||
parts.append(part)
|
||||
except StockItem.DoesNotExist:
|
||||
errors.append({'part': 'Part {id} does not exist'.format(id=part_id)})
|
||||
|
||||
if len(errors) > 0:
|
||||
raise ValidationError(errors)
|
||||
|
||||
for part in parts:
|
||||
part.move(location, request.user)
|
||||
|
||||
return Response({'success': 'Moved {n} parts to {loc}'.format(
|
||||
n=len(parts),
|
||||
loc=location.name
|
||||
)})
|
||||
|
||||
|
||||
class StockLocationList(generics.ListCreateAPIView):
|
||||
|
||||
queryset = StockLocation.objects.all()
|
||||
@ -167,6 +221,8 @@ stock_api_urls = [
|
||||
|
||||
url(r'location/(?P<pk>\d+)/', include(location_endpoints)),
|
||||
|
||||
url(r'move/?', StockMove.as_view(), name='api-stock-move'),
|
||||
|
||||
url(r'^tree/?', StockCategoryTree.as_view(), name='api-stock-tree'),
|
||||
|
||||
url(r'^.*$', StockList.as_view(), name='api-stock-list'),
|
||||
|
@ -192,6 +192,23 @@ class StockItem(models.Model):
|
||||
|
||||
track.save()
|
||||
|
||||
@transaction.atomic
|
||||
def move(self, location, user):
|
||||
|
||||
if location == self.location:
|
||||
return
|
||||
|
||||
note = "Moved to {loc}".format(loc=location.name)
|
||||
|
||||
self.location = location
|
||||
self.save()
|
||||
|
||||
self.add_transaction_note('Transfer',
|
||||
user,
|
||||
notes=note,
|
||||
system=True)
|
||||
|
||||
|
||||
@transaction.atomic
|
||||
def stocktake(self, count, user):
|
||||
""" Perform item stocktake.
|
||||
|
@ -61,6 +61,7 @@
|
||||
{% block js_load %}
|
||||
{{ block.super }}
|
||||
<script type='text/javascript' src="{% static 'script/inventree/api.js' %}"></script>
|
||||
<script type='text/javascript' src="{% static 'script/inventree/stock.js' %}"></script>
|
||||
<script type='text/javascript' src="{% static 'script/modal_form.js' %}"></script>
|
||||
{% endblock %}
|
||||
{% block js_ready %}
|
||||
@ -125,9 +126,12 @@
|
||||
|
||||
var items = selectedStock();
|
||||
|
||||
alert('Moving ' + items.length + ' items');
|
||||
|
||||
return false;
|
||||
moveStock(items,
|
||||
{
|
||||
success: function() {
|
||||
$("#stock-table").bootstrapTable('refresh');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#multi-item-delete").click(function() {
|
||||
|
Reference in New Issue
Block a user