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:
		@@ -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 %}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user