feature/#26_enhance_storage_stock_display #37
@@ -53,7 +53,7 @@ class AutoCompleteWidget(widgets.Input):
 | 
				
			|||||||
            'name_field_name': self.name_field_name,
 | 
					            'name_field_name': self.name_field_name,
 | 
				
			||||||
            'prepend': self.prepend,
 | 
					            'prepend': self.prepend,
 | 
				
			||||||
            'name': display_name,
 | 
					            'name': display_name,
 | 
				
			||||||
        } 
 | 
					        }
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AutocompleteForeingKeyField(forms.UUIDField):
 | 
					class AutocompleteForeingKeyField(forms.UUIDField):
 | 
				
			||||||
@@ -72,7 +72,7 @@ class AutocompleteForeingKeyField(forms.UUIDField):
 | 
				
			|||||||
                                         prepend)
 | 
					                                         prepend)
 | 
				
			||||||
        self.foreign_model = foreign_model
 | 
					        self.foreign_model = foreign_model
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def clean(self, value):
 | 
					    def clean(self, value):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            pre_cleaned_uuid = super().clean(value)
 | 
					            pre_cleaned_uuid = super().clean(value)
 | 
				
			||||||
@@ -113,15 +113,13 @@ class AddSubStorageForm(ChangeStorageForm):
 | 
				
			|||||||
class DeleteStockForm(forms.Form):
 | 
					class DeleteStockForm(forms.Form):
 | 
				
			||||||
    stock_uuid = forms.UUIDField()
 | 
					    stock_uuid = forms.UUIDField()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class EditWatermarkForm(forms.Form):
 | 
					class EditStockBaseForm(forms.Form):
 | 
				
			||||||
    stock_uuid = forms.UUIDField()
 | 
					    stock_uuid = forms.UUIDField()
 | 
				
			||||||
    watermark_active = forms.BooleanField(required=False) #If it is false, the webbrowser won't send it at all. Therefore we have to set it to required=False
 | 
					 | 
				
			||||||
    watermark = forms.IntegerField(min_value=0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def clean(self):
 | 
					    def clean(self):
 | 
				
			||||||
        cleaned_data = super().clean()
 | 
					        cleaned_data = super().clean()
 | 
				
			||||||
        id = cleaned_data.get("stock_uuid")
 | 
					        id = cleaned_data.get("stock_uuid")
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if not id:
 | 
					        if not id:
 | 
				
			||||||
            raise ValidationError("No stock UUID given")
 | 
					            raise ValidationError("No stock UUID given")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -134,6 +132,10 @@ class EditWatermarkForm(forms.Form):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return cleaned_data
 | 
					        return cleaned_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EditWatermarkForm(EditStockBaseForm):
 | 
				
			||||||
 | 
					    watermark_active = forms.BooleanField(required=False) #If it is false, the webbrowser won't send it at all. Therefore we have to set it to required=False
 | 
				
			||||||
 | 
					    watermark = forms.IntegerField(min_value=0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def save(self):
 | 
					    def save(self):
 | 
				
			||||||
        stock = self.cleaned_data['stock']
 | 
					        stock = self.cleaned_data['stock']
 | 
				
			||||||
        active = self.cleaned_data['watermark_active']
 | 
					        active = self.cleaned_data['watermark_active']
 | 
				
			||||||
@@ -145,32 +147,26 @@ class EditWatermarkForm(forms.Form):
 | 
				
			|||||||
        stock.watermark = watermark
 | 
					        stock.watermark = watermark
 | 
				
			||||||
        stock.save()
 | 
					        stock.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class EditStockAmountForm(forms.Form):
 | 
					class EditLotForm(EditStockBaseForm):
 | 
				
			||||||
 | 
					    lot = forms.IntegerField(min_value=0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def save(self):
 | 
				
			||||||
 | 
					        stock = self.cleaned_data['stock']
 | 
				
			||||||
 | 
					        lot = self.cleaned_data['lot']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        stock.lot = lot
 | 
				
			||||||
 | 
					        stock.save()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EditStockAmountForm(EditStockBaseForm):
 | 
				
			||||||
    stock_uuid = forms.UUIDField()
 | 
					    stock_uuid = forms.UUIDField()
 | 
				
			||||||
    amount = forms.IntegerField(min_value=0)
 | 
					    amount = forms.IntegerField(min_value=0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def clean(self):
 | 
					 | 
				
			||||||
        cleaned_data = super().clean()
 | 
					 | 
				
			||||||
        id = cleaned_data.get("stock_uuid")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if not id:
 | 
					 | 
				
			||||||
            raise ValidationError("No stock UUID given")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        stock = None
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            stock = parts_models.Stock.objects.get(id=id)
 | 
					 | 
				
			||||||
        except:
 | 
					 | 
				
			||||||
            raise ValidationError("Stock with uuid %s does not exist" % (id))
 | 
					 | 
				
			||||||
        cleaned_data['stock'] = stock
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return cleaned_data
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def save(self, increase: bool):
 | 
					    def save(self, increase: bool):
 | 
				
			||||||
        stock = self.cleaned_data['stock']
 | 
					        stock = self.cleaned_data['stock']
 | 
				
			||||||
        amount = self.cleaned_data['amount']
 | 
					        amount = self.cleaned_data['amount']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if not increase:
 | 
					        if not increase:
 | 
				
			||||||
            amount = -amount 
 | 
					            amount = -amount
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return stock.atomic_increment(amount)
 | 
					        return stock.atomic_increment(amount)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -195,7 +191,7 @@ class AddStockForm(forms.Form):
 | 
				
			|||||||
        cleaned_data['component'] = component
 | 
					        cleaned_data['component'] = component
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return cleaned_data
 | 
					        return cleaned_data
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def save(self, storage):
 | 
					    def save(self, storage):
 | 
				
			||||||
        component = self.cleaned_data.get('component')
 | 
					        component = self.cleaned_data.get('component')
 | 
				
			||||||
        amount = self.cleaned_data.get('amount')
 | 
					        amount = self.cleaned_data.get('amount')
 | 
				
			||||||
@@ -254,7 +250,7 @@ class DistributorNumberDeleteForm(forms.Form):
 | 
				
			|||||||
class ComponentParameterDeleteForm(forms.Form):
 | 
					class ComponentParameterDeleteForm(forms.Form):
 | 
				
			||||||
    param_num = forms.UUIDField(required=True)
 | 
					    param_num = forms.UUIDField(required=True)
 | 
				
			||||||
    model = parts_models.ComponentParameter
 | 
					    model = parts_models.ComponentParameter
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def clean_param_num(self):
 | 
					    def clean_param_num(self):
 | 
				
			||||||
        my_uuid = self.cleaned_data['param_num']
 | 
					        my_uuid = self.cleaned_data['param_num']
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
@@ -323,7 +319,7 @@ class ComponentParameterCreateForm(forms.Form):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if not ptype:
 | 
					        if not ptype:
 | 
				
			||||||
            raise ValidationError('No valid parameter type selected')
 | 
					            raise ValidationError('No valid parameter type selected')
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if not value:
 | 
					        if not value:
 | 
				
			||||||
            raise ValidationError('No valid parameter value')
 | 
					            raise ValidationError('No valid parameter value')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -335,7 +331,7 @@ class ComponentParameterCreateForm(forms.Form):
 | 
				
			|||||||
            data['number_value'] = number
 | 
					            data['number_value'] = number
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    def save(self, component):
 | 
					    def save(self, component):
 | 
				
			||||||
        param_type = self.cleaned_data['parameter_type']
 | 
					        param_type = self.cleaned_data['parameter_type']
 | 
				
			||||||
        if param_type.parameter_type == 'F':
 | 
					        if param_type.parameter_type == 'F':
 | 
				
			||||||
@@ -364,6 +360,6 @@ class QrSearchForm(forms.Form):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def __init__(self, *args, **kwargs):
 | 
					    def __init__(self, *args, **kwargs):
 | 
				
			||||||
        super().__init__(*args, **kwargs)
 | 
					        super().__init__(*args, **kwargs)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qr_search = forms.CharField(label='qr_search', validators=[my_qr_validator])
 | 
					    qr_search = forms.CharField(label='qr_search', validators=[my_qr_validator])
 | 
				
			||||||
@@ -213,6 +213,16 @@ 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_update_lot(self, request, **kwargs):
 | 
				
			||||||
 | 
					        edit_form = EditLotForm(data=request.POST)
 | 
				
			||||||
 | 
					        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():
 | 
				
			||||||
@@ -252,6 +262,8 @@ class StockViewDetail(LoginRequiredMixin, BaseTemplateMixin, DetailView):
 | 
				
			|||||||
            return self.handle_del_stock_post(request, **kwargs)
 | 
					            return self.handle_del_stock_post(request, **kwargs)
 | 
				
			||||||
        elif 'submit-edit-watermark' in request.POST:
 | 
					        elif 'submit-edit-watermark' in request.POST:
 | 
				
			||||||
            return self.handle_update_watermark(request, **kwargs)
 | 
					            return self.handle_update_watermark(request, **kwargs)
 | 
				
			||||||
 | 
					        elif 'submit-edit-lot' in request.POST:
 | 
				
			||||||
 | 
					            return self.handle_update_lot(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:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ needs following context:
 | 
				
			|||||||
                    <form method="post">
 | 
					                    <form method="post">
 | 
				
			||||||
                        {% csrf_token %}
 | 
					                        {% csrf_token %}
 | 
				
			||||||
                        <input type="hidden" name="stock_uuid" value="{{stock.id}}">
 | 
					                        <input type="hidden" name="stock_uuid" value="{{stock.id}}">
 | 
				
			||||||
                        <div class="input-group mb-3">    
 | 
					                        <div class="input-group mb-3">
 | 
				
			||||||
                            <div class="input-group-text">
 | 
					                            <div class="input-group-text">
 | 
				
			||||||
                                <input type="checkbox" class="form-check-input mt-0" name="watermark_active" id="ch-stk-watermark-act-{{stock.id}}" {% if stock.watermark >= 0 %}checked{%endif%}>
 | 
					                                <input type="checkbox" class="form-check-input mt-0" name="watermark_active" id="ch-stk-watermark-act-{{stock.id}}" {% if stock.watermark >= 0 %}checked{%endif%}>
 | 
				
			||||||
                            </div>
 | 
					                            </div>
 | 
				
			||||||
@@ -47,7 +47,16 @@ needs following context:
 | 
				
			|||||||
                            <input type="submit" class="btn btn-primary" name="submit-edit-watermark" value="Update Watermark">
 | 
					                            <input type="submit" class="btn btn-primary" name="submit-edit-watermark" value="Update Watermark">
 | 
				
			||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
                    </form>
 | 
					                    </form>
 | 
				
			||||||
 | 
					                    <form method="post">
 | 
				
			||||||
 | 
					                        {% csrf_token %}
 | 
				
			||||||
 | 
					                        <input type="hidden" name="stock_uuid" value="{{stock.id}}">
 | 
				
			||||||
 | 
					                        <div class="input-group mb-3">
 | 
				
			||||||
 | 
					                            <input type="text" name="lot" id="ch-stk-lot-{{stock.id}}" class="form-control" value="{{stock.lot}}" required>
 | 
				
			||||||
 | 
					                            <input type="submit" class="btn btn-primary" name="submit-edit-lot" value="Update Lot">
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </form>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user