feature/#26_enhance_storage_stock_display #37

Merged
sst merged 18 commits from feature/#26_enhance_storage_stock_display into develop 2025-02-03 22:20:05 +01:00
6 changed files with 47 additions and 7 deletions
Showing only changes of commit aefcc472ea - Show all commits

View File

@ -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')

View File

@ -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)

View File

@ -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

View File

@ -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:

View File

@ -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>

View File

@ -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 %}