From 8162038f4030c3855d55572c53e9d2cecfd5be5d Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Mon, 23 Jun 2025 15:42:48 -0500 Subject: [PATCH] Enhance model constructors; add optional parameters for improved initialization across multiple modelsOh --- models/areas.py | 3 +++ models/brands.py | 3 +++ models/inventory.py | 19 +++++++++++++++++++ models/items.py | 4 ++++ models/room_functions.py | 3 +++ models/rooms.py | 5 +++++ models/users.py | 12 +++++++++++- models/work_log.py | 13 +++++++++++++ routes.py | 25 +++++++++++++++---------- templates/settings.html | 16 ++++++++++++++-- 10 files changed, 90 insertions(+), 13 deletions(-) diff --git a/models/areas.py b/models/areas.py index abb0906..40ef67a 100644 --- a/models/areas.py +++ b/models/areas.py @@ -15,6 +15,9 @@ class Area(db.Model): rooms: Mapped[List['Room']] = relationship('Room', back_populates='area') + def __init__(self, name: Optional[str] = None): + self.name = name + def __repr__(self): return f"" diff --git a/models/brands.py b/models/brands.py index 6eb5bf2..6363982 100644 --- a/models/brands.py +++ b/models/brands.py @@ -15,6 +15,9 @@ class Brand(db.Model): inventory: Mapped[List['Inventory']] = relationship('Inventory', back_populates='brand') + def __init__(self, name: Optional[str] = None): + self.name = name + def __repr__(self): return f"" diff --git a/models/inventory.py b/models/inventory.py index f487eb1..2028d96 100644 --- a/models/inventory.py +++ b/models/inventory.py @@ -39,6 +39,25 @@ class Inventory(db.Model): item: Mapped['Item'] = relationship('Item', back_populates='inventory') work_logs: Mapped[List['WorkLog']] = relationship('WorkLog', back_populates='work_item') + def __init__(self, timestamp: datetime.datetime, condition: str, needed: str, type_id: int, + inventory_name: Optional[str] = None, serial: Optional[str] = None, + model: Optional[str] = None, notes: Optional[str] = None, owner_id: Optional[int] = None, + brand_id: Optional[int] = None, location_id: Optional[str] = None, barcode: Optional[str] = None, + shared: bool = False): + self.timestamp = timestamp + self.condition = condition + self.needed = needed + self.type_id = type_id + self.inventory_name = inventory_name + self.serial = serial + self.model = model + self.notes = notes + self.owner_id = owner_id + self.brand_id = brand_id + self.location_id = location_id + self.barcode = barcode + self.shared = shared + def __repr__(self): parts = [f"id={self.id}"] diff --git a/models/items.py b/models/items.py index 447bee4..104c831 100644 --- a/models/items.py +++ b/models/items.py @@ -16,6 +16,10 @@ class Item(db.Model): inventory: Mapped[List['Inventory']] = relationship('Inventory', back_populates='item') + def __init__(self, description: Optional[str] = None, category: Optional[str] = None): + self.description = description + self.category = category + def __repr__(self): return f"" diff --git a/models/room_functions.py b/models/room_functions.py index e52b2f6..4a1bc06 100644 --- a/models/room_functions.py +++ b/models/room_functions.py @@ -15,6 +15,9 @@ class RoomFunction(db.Model): rooms: Mapped[List['Room']] = relationship('Room', back_populates='room_function') + def __init__(self, description: Optional[str] = None): + self.description = description + def __repr__(self): return f"" diff --git a/models/rooms.py b/models/rooms.py index 8af94b0..04676f4 100644 --- a/models/rooms.py +++ b/models/rooms.py @@ -23,6 +23,11 @@ class Room(db.Model): inventory: Mapped[List['Inventory']] = relationship('Inventory', back_populates='location') users: Mapped[List['User']] = relationship('User', back_populates='location') + def __init__(self, name: Optional[str] = None, area_id: Optional[int] = None, function_id: Optional[int] = None): + self.name = name + self.area_id = area_id + self.function_id = function_id + def __repr__(self): return f"" diff --git a/models/users.py b/models/users.py index 8c8df85..c667da0 100644 --- a/models/users.py +++ b/models/users.py @@ -17,7 +17,7 @@ class User(db.Model): active: Mapped[Optional[bool]] = mapped_column("Active", Boolean, server_default=text('((0))')) last_name: Mapped[Optional[str]] = mapped_column("Last", Unicode(255), nullable=True) first_name: Mapped[Optional[str]] = mapped_column("First", Unicode(255), nullable=True) - location_id: Mapped[Optional[str]] = mapped_column(ForeignKey("Rooms.ID")) + location_id: Mapped[Optional[str]] = mapped_column(ForeignKey("Rooms.ID"), nullable=True) supervisor_id: Mapped[Optional[int]] = mapped_column("Supervisor", Integer, ForeignKey("Users.ID")) supervisor: Mapped[Optional['User']] = relationship('User', remote_side='User.id', back_populates='subordinates') @@ -30,6 +30,16 @@ class User(db.Model): @property def full_name(self) -> str: return f"{self.first_name or ''} {self.last_name or ''}".strip() + + def __init__(self, first_name: Optional[str] = None, last_name: Optional[str] = None, + location_id: Optional[int] = None, supervisor_id: Optional[int] = None, + staff: Optional[bool] = False, active: Optional[bool] = False): + self.first_name = first_name + self.last_name = last_name + self.location_id = location_id + self.supervisor_id = supervisor_id + self.staff = staff + self.active = active def __repr__(self): return f"= 0: - return resolved_id - - index = abs(resolved_id + 1) if resolved_id is not None else 0 + raise ValueError(f"{label.title()} ID was not a valid integer: {raw_id}") + + if resolved_id >= 0: + # Try to validate this ID by checking if it appears in the map values + if resolved_id in id_map.values(): + return resolved_id + else: + raise ValueError(f"{label.title()} ID {resolved_id} not found in known {label}s.") + + # It's a negative ID = created on frontend. Resolve from fallback list + index = abs(resolved_id + 1) try: entry = fallback_list[index] key = entry["name"] if isinstance(entry, dict) else str(entry).strip() - except (IndexError, KeyError, TypeError): - raise ValueError(f"Invalid {label} index or format at index {index}: {entry}") - + except (IndexError, KeyError, TypeError) as e: + raise ValueError(f"Invalid {label} index or format at index {index}: {entry if entry else 'UNKNOWN'}") from e + final_id = id_map.get(key) if not final_id: raise ValueError(f"Unresolved {label}: {key}") diff --git a/templates/settings.html b/templates/settings.html index adede4f..7c1d1fc 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -190,8 +190,12 @@ submit_button=True saveButton.addEventListener('click', () => { const name = document.getElementById('roomName').value.trim(); - const section = document.getElementById('roomSection').value; - const func = document.getElementById('roomFunction').value; + const sectionVal = document.getElementById('roomSection').value; + const funcVal = document.getElementById('roomFunction').value; + + const section = sectionVal !== "" ? parseInt(sectionVal) : null; + const func = funcVal !== "" ? parseInt(funcVal) : null; + if (!name) { alert('Please enter a room name.'); @@ -208,6 +212,14 @@ submit_button=True // Add to select box visibly const option = ComboBoxWidget.createOption(name); + + if (section !== null) { + option.dataset.sectionId = section; + } + if (func !== null) { + option.dataset.functionId = func; + } + roomList.appendChild(option); ComboBoxWidget.sortOptions(roomList);