Source code for ResearchNotes.database.inventory

"""
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.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) 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}"