From 28887f9fc021152954dd7629dbf89ff49b5232d4 Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Tue, 22 Dec 2020 03:15:49 +0100 Subject: [PATCH] Add item size property to disallow "add" action if container is full --- inventory/migrations/0003_item_size.py | 18 ++++++++++++++++++ inventory/models/item.py | 1 + inventory/views/box.py | 22 ++++++++++++++-------- 3 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 inventory/migrations/0003_item_size.py diff --git a/inventory/migrations/0003_item_size.py b/inventory/migrations/0003_item_size.py new file mode 100644 index 0000000..6eaae16 --- /dev/null +++ b/inventory/migrations/0003_item_size.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.4 on 2020-12-22 00:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0002_base_data'), + ] + + operations = [ + migrations.AddField( + model_name='item', + name='size', + field=models.PositiveIntegerField(default=1), + ), + ] diff --git a/inventory/models/item.py b/inventory/models/item.py index ceaa103..8682d0a 100644 --- a/inventory/models/item.py +++ b/inventory/models/item.py @@ -7,6 +7,7 @@ from .container import CanBeContained class Item(CanBeContained): name = models.TextField(max_length=255) description = models.CharField(max_length=4096) + size = models.PositiveIntegerField(default=1, help_text="Number of sub-compartments this item takes up") created_at = models.DateTimeField(auto_now_add=True) changed_at = models.DateTimeField(auto_now=True) diff --git a/inventory/views/box.py b/inventory/views/box.py index 089e7d8..8790332 100644 --- a/inventory/views/box.py +++ b/inventory/views/box.py @@ -1,4 +1,4 @@ -from typing import cast, Union +from typing import cast, Union, List, Any from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views.generic import ListView, DetailView @@ -30,16 +30,22 @@ class BoxView(DetailView): idx = new_idx else: instances = obj.filter(index=idx) - if instances.count() == 1: - result.append(instances.first()) - elif instances.count() > 1: - sub = list(instances) - result.append(sub) - else: - result.append({ + items: List[dict[str, Any]] = [] + + # Add all items to the layout container + if instances.count() > 0: + items.extend(list(instances)) + + # Append "Add one more entry" if we do not exceed the maximum number + # of items yet + size = sum([item.size for item in items]) + if size < sublayout: + items.append({ "index": idx, "container_id": self.object.pk }) + + result.append(items) idx += 1 return result, idx