added feature to relocate stocks to a different storage
...had to deal with form prefixes at some places ...storage search does not work as expected yet :(
This commit is contained in:
parent
3ec11cf092
commit
aefcc472ea
@ -80,7 +80,7 @@ class StorageSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = parts_models.Storage
|
model = parts_models.Storage
|
||||||
fields = ['url', 'id', 'name', 'verbose_name', 'parent_storage', 'responsible', 'template', 'full_path']
|
fields = ['url', 'id', 'name', 'verbose_name', 'parent_storage', 'responsible', 'template', 'full_path', 'full_path_verbose']
|
||||||
|
|
||||||
class StorageSerializerStocksExpanded(StorageSerializer):
|
class StorageSerializerStocksExpanded(StorageSerializer):
|
||||||
ro_stocks = StockSerializerExpandComponent(many=True, read_only=True, source='stock_set')
|
ro_stocks = StockSerializerExpandComponent(many=True, read_only=True, source='stock_set')
|
||||||
|
@ -157,6 +157,17 @@ class EditLotForm(EditStockBaseForm):
|
|||||||
stock.lot = lot
|
stock.lot = lot
|
||||||
stock.save()
|
stock.save()
|
||||||
|
|
||||||
|
class RelocateStockForm(forms.ModelForm):
|
||||||
|
storage = AutocompleteForeingKeyField(api_search_url='storage-list',
|
||||||
|
foreign_model=parts_models.Storage,
|
||||||
|
name_field_name='full_path_verbose',
|
||||||
|
image_field_name=None,
|
||||||
|
required=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = parts_models.Stock
|
||||||
|
fields = ['storage']
|
||||||
|
|
||||||
class EditStockAmountForm(EditStockBaseForm):
|
class EditStockAmountForm(EditStockBaseForm):
|
||||||
amount = forms.IntegerField(min_value=0)
|
amount = forms.IntegerField(min_value=0)
|
||||||
|
|
||||||
|
@ -94,6 +94,14 @@ class Storage(models.Model):
|
|||||||
output = output + '/' + chain[i].name
|
output = output + '/' + chain[i].name
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
@property
|
||||||
|
def full_path_verbose(self):
|
||||||
|
full_path = f'{self.get_full_path()} ({self.id})'
|
||||||
|
|
||||||
|
if self.verbose_name:
|
||||||
|
full_path += f' ({self.verbose_name})'
|
||||||
|
return full_path
|
||||||
|
|
||||||
def get_qr_code(self):
|
def get_qr_code(self):
|
||||||
qrdata = '[stor_uuid]' + str(self.id)
|
qrdata = '[stor_uuid]' + str(self.id)
|
||||||
return qrdata
|
return qrdata
|
||||||
@ -108,8 +116,8 @@ class Storage(models.Model):
|
|||||||
return self.storage_set.all()
|
return self.storage_set.all()
|
||||||
|
|
||||||
def get_tree(self):
|
def get_tree(self):
|
||||||
self.sub_storages = list(self.storage_set.all())
|
self.sub_storages = [self]
|
||||||
for storage in self.sub_storages:
|
for storage in self.storage_set.all():
|
||||||
self.sub_storages += storage.get_tree()
|
self.sub_storages += storage.get_tree()
|
||||||
|
|
||||||
return self.sub_storages
|
return self.sub_storages
|
||||||
|
@ -121,14 +121,16 @@ class StockViewDetail(LoginRequiredMixin, BaseTemplateMixin, DetailView):
|
|||||||
context['storages'] = storage_paginator.get_page(storage_page)
|
context['storages'] = storage_paginator.get_page(storage_page)
|
||||||
stocks = stock_paginator.get_page(componente_stock_page)
|
stocks = stock_paginator.get_page(componente_stock_page)
|
||||||
context['stocks'] = stocks
|
context['stocks'] = stocks
|
||||||
|
context['stocks_with_forms'] = [{'object': s, 'relocate_form': RelocateStockForm(instance=s, prefix=str(s.id))} for s in stocks]
|
||||||
context['stock_search'] = stock_search_input
|
context['stock_search'] = stock_search_input
|
||||||
add_storage_form = AddSubStorageForm()
|
add_storage_form = AddSubStorageForm()
|
||||||
add_storage_form.fields['responsible'].initial = self.request.user.id
|
add_storage_form.fields['responsible'].initial = self.request.user.id
|
||||||
context['add_storage_form'] = add_storage_form
|
context['add_storage_form'] = add_storage_form
|
||||||
change_storage_form = ChangeStorageForm()
|
change_storage_form = ChangeStorageForm(prefix='change_storage')
|
||||||
change_storage_form.fields['storage_name'].initial = self.object.name
|
change_storage_form.fields['storage_name'].initial = self.object.name
|
||||||
change_storage_form.fields['verbose_name'].initial = self.object.verbose_name
|
change_storage_form.fields['verbose_name'].initial = self.object.verbose_name
|
||||||
change_storage_form.fields['responsible'].initial = self.object.responsible.id
|
change_storage_form.fields['responsible'].initial = self.object.responsible.id
|
||||||
|
change_storage_form.fields['expand_sub_storage_stocks'].initial = self.object.expand_sub_storage_stocks
|
||||||
change_storage_form.fields['is_template'].initial = self.object.is_template
|
change_storage_form.fields['is_template'].initial = self.object.is_template
|
||||||
context['change_storage_form'] = change_storage_form
|
context['change_storage_form'] = change_storage_form
|
||||||
context['delete_storage_error'] = None
|
context['delete_storage_error'] = None
|
||||||
@ -155,7 +157,7 @@ class StockViewDetail(LoginRequiredMixin, BaseTemplateMixin, DetailView):
|
|||||||
return self.render_to_response(context)
|
return self.render_to_response(context)
|
||||||
|
|
||||||
def handle_change_storage_post(self, request, **kwargs):
|
def handle_change_storage_post(self, request, **kwargs):
|
||||||
f = ChangeStorageForm(data=request.POST)
|
f = ChangeStorageForm(data=request.POST, prefix='change_storage')
|
||||||
if f.is_valid():
|
if f.is_valid():
|
||||||
try:
|
try:
|
||||||
self.object.name = f.cleaned_data['storage_name']
|
self.object.name = f.cleaned_data['storage_name']
|
||||||
@ -223,6 +225,17 @@ class StockViewDetail(LoginRequiredMixin, BaseTemplateMixin, DetailView):
|
|||||||
context = self.get_context_data(**kwargs)
|
context = self.get_context_data(**kwargs)
|
||||||
return self.render_to_response(context)
|
return self.render_to_response(context)
|
||||||
|
|
||||||
|
def handle_relocate_stock(self, request, **kwargs):
|
||||||
|
instance = Stock.objects.get(id=request.POST['prefix'])
|
||||||
|
edit_form = RelocateStockForm(instance=instance, data=request.POST, prefix=request.POST['prefix'])
|
||||||
|
if edit_form.is_valid():
|
||||||
|
edit_form.save()
|
||||||
|
else:
|
||||||
|
pass # Todo: Handle error
|
||||||
|
|
||||||
|
context = self.get_context_data(**kwargs)
|
||||||
|
return self.render_to_response(context)
|
||||||
|
|
||||||
def handle_amount_change_post(self, request, increase, **kwargs):
|
def handle_amount_change_post(self, request, increase, **kwargs):
|
||||||
edit_form = EditStockAmountForm(data=request.POST)
|
edit_form = EditStockAmountForm(data=request.POST)
|
||||||
if edit_form.is_valid():
|
if edit_form.is_valid():
|
||||||
@ -264,6 +277,8 @@ class StockViewDetail(LoginRequiredMixin, BaseTemplateMixin, DetailView):
|
|||||||
return self.handle_update_watermark(request, **kwargs)
|
return self.handle_update_watermark(request, **kwargs)
|
||||||
elif 'submit-edit-lot' in request.POST:
|
elif 'submit-edit-lot' in request.POST:
|
||||||
return self.handle_update_lot(request, **kwargs)
|
return self.handle_update_lot(request, **kwargs)
|
||||||
|
elif 'submit-relocate-stock' in request.POST:
|
||||||
|
return self.handle_relocate_stock(request, **kwargs)
|
||||||
elif 'submit-amount-reduce' in request.POST:
|
elif 'submit-amount-reduce' in request.POST:
|
||||||
return self.handle_amount_change_post(request, False, **kwargs)
|
return self.handle_amount_change_post(request, False, **kwargs)
|
||||||
elif 'submit-amount-increase' in request.POST:
|
elif 'submit-amount-increase' in request.POST:
|
||||||
|
@ -55,6 +55,12 @@ needs following context:
|
|||||||
<input type="submit" class="btn btn-primary" name="submit-edit-lot" value="Update Lot">
|
<input type="submit" class="btn btn-primary" name="submit-edit-lot" value="Update Lot">
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<form method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<input type="hidden" name="prefix" value="{{relocate_form.prefix}}">
|
||||||
|
{{ relocate_form|crispy }}
|
||||||
|
<input type="submit" class="btn btn-warning" name="submit-relocate-stock" value="Relocate Stock">
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -126,8 +126,8 @@
|
|||||||
{% include 'paginator.html' with paginator=stocks get_param='stock_page' aria_label='Stock Page Navigation' %}
|
{% include 'paginator.html' with paginator=stocks get_param='stock_page' aria_label='Stock Page Navigation' %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% for stock in stocks %}
|
{% for stock in stocks_with_forms %}
|
||||||
{% include 'parts/modals/update-stock-modal.html' with stock=stock form=change_stock_form %}
|
{% include 'parts/modals/update-stock-modal.html' with stock=stock.object form=change_stock_form relocate_form=stock.relocate_form %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<!-- Modal for adding a substorage-->
|
<!-- Modal for adding a substorage-->
|
||||||
{% with add_storage_form as form %}
|
{% with add_storage_form as form %}
|
||||||
|
Loading…
Reference in New Issue
Block a user