InvenTree/InvenTree/stock/views.py

241 lines
6.7 KiB
Python
Raw Normal View History

2018-04-27 15:16:47 +00:00
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
2018-04-15 15:02:17 +00:00
from django.shortcuts import get_object_or_404
from django.views.generic import DetailView, ListView
2018-04-27 12:59:08 +00:00
from InvenTree.views import AjaxUpdateView, AjaxDeleteView, AjaxCreateView
from part.models import Part
from .models import StockItem, StockLocation
from .forms import EditStockLocationForm
2018-04-29 15:00:18 +00:00
from .forms import CreateStockItemForm
from .forms import EditStockItemForm
2018-04-29 15:00:18 +00:00
from .forms import MoveStockItemForm
2018-04-30 11:03:25 +00:00
from .forms import StocktakeForm
2018-04-15 15:02:17 +00:00
2019-04-13 23:23:24 +00:00
class StockIndex(ListView):
2019-04-13 23:23:24 +00:00
"""
StockIndex view loads all StockLocation and StockItem object
"""
model = StockItem
2018-05-04 09:28:28 +00:00
template_name = 'stock/location.html'
2018-04-27 12:59:08 +00:00
context_obect_name = 'locations'
def get_context_data(self, **kwargs):
context = super(StockIndex, self).get_context_data(**kwargs).copy()
2018-04-27 12:59:08 +00:00
# Return all top-level locations
locations = StockLocation.objects.filter(parent=None)
context['locations'] = locations
2018-04-27 12:59:08 +00:00
context['items'] = StockItem.objects.all()
return context
2018-04-15 15:02:17 +00:00
class StockLocationDetail(DetailView):
2019-04-13 23:23:24 +00:00
"""
Detailed view of a single StockLocation object
"""
2019-04-13 23:39:01 +00:00
context_object_name = 'location'
template_name = 'stock/location.html'
queryset = StockLocation.objects.all()
model = StockLocation
class StockItemDetail(DetailView):
2019-04-13 23:23:24 +00:00
"""
Detailed view of a single StockItem object
"""
context_object_name = 'item'
template_name = 'stock/item.html'
queryset = StockItem.objects.all()
model = StockItem
2018-04-27 12:59:08 +00:00
class StockLocationEdit(AjaxUpdateView):
2019-04-13 23:23:24 +00:00
"""
View for editing details of a StockLocation.
This view is used with the EditStockLocationForm to deliver a modal form to the web view
"""
model = StockLocation
form_class = EditStockLocationForm
template_name = 'stock/location_edit.html'
context_object_name = 'location'
2018-04-27 12:59:08 +00:00
ajax_template_name = 'modal_form.html'
ajax_form_title = 'Edit Stock Location'
2018-04-27 12:59:08 +00:00
class StockItemEdit(AjaxUpdateView):
2019-04-13 23:23:24 +00:00
"""
View for editing details of a single StockItem
"""
model = StockItem
form_class = EditStockItemForm
2019-04-16 12:32:43 +00:00
# template_name = 'stock/item_edit.html'
context_object_name = 'item'
2019-04-16 12:32:43 +00:00
ajax_template_name = 'modal_form.html'
2018-04-27 12:59:08 +00:00
ajax_form_title = 'Edit Stock Item'
2018-04-27 12:59:08 +00:00
class StockLocationCreate(AjaxCreateView):
2019-04-13 23:23:24 +00:00
"""
View for creating a new StockLocation
A parent location (another StockLocation object) can be passed as a query parameter
"""
model = StockLocation
form_class = EditStockLocationForm
template_name = 'stock/location_create.html'
context_object_name = 'location'
2018-04-27 12:59:08 +00:00
ajax_template_name = 'modal_form.html'
ajax_form_title = 'Create new Stock Location'
def get_initial(self):
initials = super(StockLocationCreate, self).get_initial().copy()
loc_id = self.request.GET.get('location', None)
if loc_id:
initials['parent'] = get_object_or_404(StockLocation, pk=loc_id)
return initials
2018-04-27 12:59:08 +00:00
class StockItemCreate(AjaxCreateView):
2019-04-13 23:23:24 +00:00
"""
View for creating a new StockItem
Parameters can be pre-filled by passing query items:
- part: The part of which the new StockItem is an instance
- location: The location of the new StockItem
"""
model = StockItem
2018-04-29 15:00:18 +00:00
form_class = CreateStockItemForm
template_name = 'stock/item_create.html'
context_object_name = 'item'
2018-04-27 12:59:08 +00:00
ajax_template_name = 'modal_form.html'
ajax_form_title = 'Create new Stock Item'
def get_initial(self):
initials = super(StockItemCreate, self).get_initial().copy()
part_id = self.request.GET.get('part', None)
loc_id = self.request.GET.get('location', None)
if part_id:
part = get_object_or_404(Part, pk=part_id)
if part:
initials['part'] = get_object_or_404(Part, pk=part_id)
initials['location'] = part.default_location
initials['supplier_part'] = part.default_supplier
if loc_id:
initials['location'] = get_object_or_404(StockLocation, pk=loc_id)
return initials
2018-04-27 12:59:08 +00:00
class StockLocationDelete(AjaxDeleteView):
2019-04-13 23:23:24 +00:00
"""
View to delete a StockLocation
Presents a deletion confirmation form to the user
"""
model = StockLocation
success_url = '/stock'
template_name = 'stock/location_delete.html'
context_object_name = 'location'
2018-04-27 12:59:08 +00:00
ajax_form_title = 'Delete Stock Location'
2018-04-27 12:59:08 +00:00
class StockItemDelete(AjaxDeleteView):
2019-04-13 23:23:24 +00:00
"""
View to delete a StockItem
Presents a deletion confirmation form to the user
"""
model = StockItem
success_url = '/stock/'
template_name = 'stock/item_delete.html'
context_object_name = 'item'
2018-04-27 12:59:08 +00:00
ajax_form_title = 'Delete Stock Item'
2018-04-29 15:00:18 +00:00
class StockItemMove(AjaxUpdateView):
2019-04-13 23:23:24 +00:00
"""
View to move a StockItem from one location to another
Performs some data validation to prevent illogical stock moves
"""
2018-04-29 15:00:18 +00:00
model = StockItem
template_name = 'modal_form.html'
context_object_name = 'item'
ajax_form_title = 'Move Stock Item'
form_class = MoveStockItemForm
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, instance=self.get_object())
if form.is_valid():
obj = self.get_object()
try:
loc_id = form['location'].value()
if loc_id:
loc = StockLocation.objects.get(pk=form['location'].value())
if str(loc.pk) == str(obj.pk):
form.errors['location'] = ['Item is already in this location']
else:
obj.move(loc, form['note'].value(), request.user)
else:
form.errors['location'] = ['Cannot move to an empty location']
except StockLocation.DoesNotExist:
form.errors['location'] = ['Location does not exist']
data = {
'form_valid': form.is_valid() and len(form.errors) == 0,
}
return self.renderJsonResponse(request, form, data)
2018-04-29 15:00:18 +00:00
2018-04-30 11:03:25 +00:00
class StockItemStocktake(AjaxUpdateView):
2019-04-13 23:23:24 +00:00
"""
View to perform stocktake on a single StockItem
Updates the quantity, which will also create a new StockItemTracking item
"""
2018-04-30 11:03:25 +00:00
model = StockItem
template_name = 'modal_form.html'
context_object_name = 'item'
ajax_form_title = 'Item stocktake'
form_class = StocktakeForm
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, instance=self.get_object())
if form.is_valid():
obj = self.get_object()
2018-04-30 11:03:25 +00:00
obj.stocktake(form.data['quantity'], request.user)
2018-04-30 11:03:25 +00:00
data = {
'form_valid': form.is_valid()
}
return self.renderJsonResponse(request, form, data)