From 9242ce6eab12d718b65d487f279c6cc1830f1591 Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Tue, 22 Jul 2025 13:04:31 -0500 Subject: [PATCH] Refactor brand and item models to introduce 'identifier' property for consistency; update dropdown rendering in templates to utilize new properties and improve input handling. --- inventory/models/brands.py | 10 ++- inventory/models/inventory.py | 1 + inventory/models/items.py | 17 ++-- .../fragments/_dropdown_fragment.html | 2 +- inventory/templates/inventory.html | 80 ++++++++----------- 5 files changed, 52 insertions(+), 58 deletions(-) diff --git a/inventory/models/brands.py b/inventory/models/brands.py index 3f1f4e9..00fd14a 100644 --- a/inventory/models/brands.py +++ b/inventory/models/brands.py @@ -23,13 +23,13 @@ class Brand(ValidatableMixin, db.Model): def __repr__(self): return f"" - + def serialize(self): return { 'id': self.id, 'name': self.name } - + @classmethod def sync_from_state(cls, submitted_items: list[dict]) -> dict[str, int]: submitted_clean = [] @@ -93,7 +93,7 @@ class Brand(ValidatableMixin, db.Model): if not isinstance(item, dict): errors.append(f"Area entry #{index + 1} is not a valid object.") continue - + name = item.get('name') if not name or not str(name).strip(): errors.append(f"Area entry #{index + 1} is missing a name.") @@ -107,3 +107,7 @@ class Brand(ValidatableMixin, db.Model): errors.append(f"Area entry #{index + 1} has invalid ID: {raw_id}") return errors + + @property + def identifier(self) -> str: + return self.name if self.name else f"ID: {self.id}" diff --git a/inventory/models/inventory.py b/inventory/models/inventory.py index b77c422..5a92a4d 100644 --- a/inventory/models/inventory.py +++ b/inventory/models/inventory.py @@ -42,6 +42,7 @@ class Inventory(db.Model, ImageAttachable): item: Mapped['Item'] = relationship('Item', back_populates='inventory') work_logs: Mapped[List['WorkLog']] = relationship('WorkLog', back_populates='work_item') image: Mapped[Optional['Image']] = relationship('Image', back_populates='inventory', passive_deletes=True) + type: Mapped[Optional['Item']] = relationship('Item', back_populates='inventory') def __init__(self, timestamp: datetime.datetime, condition: str, type_id: Optional[int] = None, name: Optional[str] = None, serial: Optional[str] = None, diff --git a/inventory/models/items.py b/inventory/models/items.py index db44e1d..5380f5a 100644 --- a/inventory/models/items.py +++ b/inventory/models/items.py @@ -1,6 +1,6 @@ from typing import List, Optional, TYPE_CHECKING if TYPE_CHECKING: - from .inventory import Inventory + from .inventory import Inventory from sqlalchemy import Identity, Integer, Unicode from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -20,18 +20,21 @@ class Item(ValidatableMixin, db.Model): def __init__(self, description: Optional[str] = None, category: Optional[str] = None): self.description = description - self.category = category def __repr__(self): - return f"" - + return f"" + def serialize(self): return { 'id': self.id, 'name': self.description, 'category': self.category } - + + @property + def identifier(self): + return self.description if self.description else f"Item {self.id}" + @classmethod def sync_from_state(cls, submitted_items: list[dict]) -> dict[str, int]: submitted_clean = [] @@ -84,7 +87,7 @@ class Item(ValidatableMixin, db.Model): **{str(temp): real for temp, real in temp_id_map.items()} } return id_map - + @classmethod def validate_state(cls, submitted_items: list[dict]) -> list[str]: errors = [] @@ -93,7 +96,7 @@ class Item(ValidatableMixin, db.Model): if not isinstance(item, dict): errors.append(f"Area entry #{index + 1} is not a valid object.") continue - + name = item.get('name') if not name or not str(name).strip(): errors.append(f"Area entry #{index + 1} is missing a name.") diff --git a/inventory/templates/fragments/_dropdown_fragment.html b/inventory/templates/fragments/_dropdown_fragment.html index 2a1b381..46583af 100644 --- a/inventory/templates/fragments/_dropdown_fragment.html +++ b/inventory/templates/fragments/_dropdown_fragment.html @@ -10,7 +10,7 @@
- - + {{ dropdowns.render_dropdown( + id='brand', + list=brands, + label='Brand', + current_item=item.brand, + enabled=item.condition not in ["Removed", "Disposed"] + ) }}
@@ -185,45 +182,34 @@ %} disabled{% endif %}>
- - + {{ dropdowns.render_dropdown( + id='type', + list=types, + label='Category', + current_item=item.type, + enabled=item.condition not in ["Removed", "Disposed"] + ) }}
- - + {{ dropdowns.render_dropdown( + id='owner', + list=users, + label='Contact', + current_item=item.owner, + entry_link='user', + enabled=item.condition not in ["Removed", "Disposed"] + ) }}
- - + {{ dropdowns.render_dropdown( + id='room', + list=rooms, + label='Location', + current_item=item.location, + enabled=item.condition not in ["Removed", "Disposed"] + ) }}