diff --git a/crudkit/core/service.py b/crudkit/core/service.py index fd8c953..07514ce 100644 --- a/crudkit/core/service.py +++ b/crudkit/core/service.py @@ -653,9 +653,13 @@ class CRUDService(Generic[T]): session = self.session obj = self.model(**data) session.add(obj) + + session.flush() + + self._log_version("create", obj, actor, commit=commit) + if commit: session.commit() - self._log_version("create", obj, actor, commit=commit) return obj def update(self, id: int, data: dict, actor=None, *, commit: bool = True) -> T: diff --git a/inventory/models/inventory.py b/inventory/models/inventory.py index 0e01a94..1425a0e 100644 --- a/inventory/models/inventory.py +++ b/inventory/models/inventory.py @@ -2,7 +2,7 @@ from typing import List, Optional from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Unicode, case, cast, func from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, mapped_column, relationship, synonym from sqlalchemy.sql import expression as sql from crudkit.core.base import Base, CRUDMixin @@ -21,13 +21,14 @@ class Inventory(Base, CRUDMixin): model: Mapped[Optional[str]] = mapped_column(Unicode(255)) notes: Mapped[Optional[str]] = mapped_column(Unicode(255)) shared: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, server_default=sql.false()) - timestamp: Mapped[DateTime] = mapped_column(DateTime) + timestamp: Mapped[DateTime] = mapped_column(DateTime, default=func.now(), nullable=False) brand: Mapped[Optional['Brand']] = relationship('Brand', back_populates='inventory') brand_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey('brand.id'), nullable=True, index=True) device_type: Mapped[Optional['DeviceType']] = relationship('DeviceType', back_populates='inventory') type_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("item.id"), nullable=True, index=True) + device_type_id = synonym("type_id") image: Mapped[Optional['Image']] = relationship('Image', back_populates='inventory', passive_deletes=True) image_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey('images.id', ondelete='SET NULL'), nullable=True, index=True) diff --git a/inventory/routes/entry.py b/inventory/routes/entry.py index d51136f..ef56e1c 100644 --- a/inventory/routes/entry.py +++ b/inventory/routes/entry.py @@ -240,6 +240,14 @@ def init_entry_routes(app): updates = payload.pop("updates", []) or [] payload.pop("delete_update_ids", None) # irrelevant on create + if model == "inventory": + if "device_type_id" in payload and "type_id" not in payload: + payload["type_id"] = payload.pop("device_type_id") + for k in ("brand_id", "type_id", "owner_id", "location_id", "image_id"): + if payload.get(k) == "": + payload[k] = None + # payload["timestamp"] = datetime.now() + if model == "worklog": if "contact" in payload and "contact_id" not in payload: payload["contact_id"] = payload.pop("contact") @@ -279,7 +287,28 @@ def init_entry_routes(app): params = {} if model == "inventory": - pass + if "device_type_id" in payload: + payload["type_id"] = payload.pop("device_type_id") + for k in ("brand_id", "type_id", "owner_id", "location_id", "image_id"): + if payload.get(k) == "": + payload[k] = None + params = { + "fields": [ + "barcode", + "name", + "serial", + "condition", + "model", + "notes", + "shared", + "timestamp", + "brand_id", + "type_id", + "image_id", + "location_id", + "owner_id", + ] + } elif model == "user": params = { "fields": [ diff --git a/inventory/templates/inventory_note.html b/inventory/templates/inventory_note.html index f2006a4..d2c5088 100644 --- a/inventory/templates/inventory_note.html +++ b/inventory/templates/inventory_note.html @@ -1,7 +1,7 @@