"""
All database entries for inventory tracking - items and item_types go here.
"""
from dataclasses import dataclass
from datetime import datetime
from ResearchNotes.database import db
from ResearchNotes.database.mixins import SearchableMixin
[docs]@dataclass(init=False, eq=False)
class ItemType(db.Model): # type: ignore
"""
Defines the ItemType database scheme.
"""
__tablename__ = "item_type"
itype_id: int = db.Column(db.Integer, primary_key=True)
name: str = db.Column(db.String(50), nullable=False)
# One to many
# Group the measurement type is registered for
group_id: int = db.Column(db.Integer, db.ForeignKey("groups.id"))
# Backref
items = db.relationship("Items", backref="item_type", lazy="dynamic")
def __repr__(self) -> str:
"""
Representation string of the ItemType database scheme.
Returns
-------
str
Representation of the class.
"""
return f"ItemType ID:{self.itype_id}, ItemType name: {self.name}"
[docs]@dataclass(init=False, eq=False)
class Items(db.Model): # type: ignore
"""Defines the Item database scheme."""
__tablename__ = "items"
# __searchable__ = ["name", "identifier", "description", "vendor"]
item_id: int = db.Column(db.Integer, primary_key=True)
identifier: str = db.Column(db.String(80), unique=False, nullable=True)
name: str = db.Column(db.String(150), nullable=False)
vendor: str = db.Column(db.String(200), nullable=True)
catalog: str = db.Column(db.String(200), nullable=True)
description: str = db.Column(db.Text, nullable=True)
amount: float = db.Column(db.Float, nullable=False)
unite: str = db.Column(db.String(80), nullable=False)
amount_is_int: bool = db.Column(db.Boolean, nullable=False, default=False)
is_permanent: bool = db.Column(db.Boolean, nullable=False, default=False)
available: float = db.Column(db.Float, nullable=False)
creator: str = db.Column(db.String(80), nullable=False)
created: datetime = db.Column(db.DateTime, nullable=False, index=True, default=datetime.utcnow)
updated_by: int = db.Column(db.String(80), nullable=True)
updated: datetime = db.Column(
db.DateTime,
nullable=False,
index=True,
default=datetime.utcnow,
onupdate=datetime.utcnow,
)
# One to many
# Item type
itype_id: int = db.Column(db.Integer, db.ForeignKey("item_type.itype_id"))
# Group id of the item
group_id: int = db.Column(db.Integer, db.ForeignKey("groups.id"))
# Location
location_id = db.Column(db.Integer, db.ForeignKey("locations.id"), default=1)
item_user = db.relationship("ItemsCheckOut", back_populates="item")
def __repr__(self) -> str:
"""
Representation string of the item database scheme.
Returns
-------
str
Representation of the class.
"""
return f"Item ID:{self.item_id}, Item: {self.name}"
@property
def is_int(self) -> bool:
"""True if the amount should be an integer."""
return self.amount_is_int
@property
def user_list(self) -> set[int]:
"""Set of user IDs who checked out the item."""
return {u.user.id for u in self.item_user}
[docs] def item_by_user(self, user_id: int) -> int:
"""Return the ItemCheckOut entry for a given user of this item."""
return [u for u in self.item_user if u.user.id == user_id][0]
[docs]@dataclass(init=False, eq=False)
class ItemsCheckOut(db.Model): # type: ignore
"""Association table between item and user."""
__tablename__ = "items_checkout"
item_id: int = db.Column(db.Integer, db.ForeignKey("items.item_id"), primary_key=True)
user_id: int = db.Column(db.Integer, db.ForeignKey("users.id"), primary_key=True)
item = db.relationship("Items")
user = db.relationship("User")
amount: float = db.Column(db.Float, nullable=False)
[docs]@dataclass(init=False, eq=False)
class ItemsTemplate(db.Model): # type: ignore
"""Defines the item template database scheme."""
__tablename__ = "items_template"
tid: int = db.Column(db.Integer, primary_key=True)
tname: str = db.Column(db.String(150), nullable=False)
identifier: str = db.Column(db.String(80), nullable=False)
name: str = db.Column(db.String(150), nullable=False)
vendor: str = db.Column(db.String(200), nullable=True)
catalog: str = db.Column(db.String(200), nullable=True)
description: str = db.Column(db.Text, nullable=True)
unite: str = db.Column(db.String(80), nullable=False)
amount_is_int: bool = db.Column(db.Boolean, nullable=False)
creator: str = db.Column(db.String(80), nullable=False)
created: datetime = db.Column(db.DateTime, nullable=False, index=True, default=datetime.utcnow)
updated_by: int = db.Column(db.String(80), nullable=True)
updated: datetime = db.Column(
db.DateTime,
nullable=False,
index=True,
default=datetime.utcnow,
onupdate=datetime.utcnow,
)
# Group id of the item
group_id: int = db.Column(db.Integer, db.ForeignKey("groups.id"))
def __repr__(self) -> str:
"""
Representation string of the item template database scheme.
Returns
-------
str
Representation of the class.
"""
return f"Item template ID:{self.tid}, Item template: {self.tname}"