Starting to recreate models.

This commit is contained in:
Yaro Kasear 2025-09-04 09:47:36 -05:00
parent e420110fb3
commit 388472742e
11 changed files with 132 additions and 4 deletions

23
inventory/__init__.py Normal file
View file

@ -0,0 +1,23 @@
from __future__ import annotations
import os
from flask import Flask
from .db import init_db, create_all_tables
def create_app() -> Flask:
app = Flask(__name__)
app.config["DATABASE_URL"] = os.getenv("DATABASE_URL", "sqlite:///inventory.db")
init_db(app.config["DATABASE_URL"])
from . import models as _models
create_all_tables()
@app.get("/")
def index():
return {"status": "ok"}
return app

28
inventory/db.py Normal file
View file

@ -0,0 +1,28 @@
from __future__ import annotations
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from crudkit.core.base import Base
_engine = None
SessionLocal = None
def init_db(database_url: str) -> None:
global _engine, SessionLocal
connect_args = {}
if database_url.startswith("sqlite:///"):
connect_args["check_same_thread"] = False
_engine = create_engine(database_url, future=True, echo=False, connect_args=connect_args)
SessionLocal = scoped_session(sessionmaker(bind=_engine, autoflush=False, autocommit=False, future=True))
def get_session():
if SessionLocal is None:
raise RuntimeError("DB not initialized. Call init_db() first.")
return SessionLocal()
def create_all_tables() -> None:
if _engine is None:
raise RuntimeError("DB engine not initialized.")
Base.metadata.create_all(bind=_engine)

View file

@ -0,0 +1,6 @@
from typing import Optional
from sqlalchemy import Integer, Unicode
from sqlalchemy.orm import Mapped, mapped_column
from crudkit.core.base import Base, CRUDMixin

View file

@ -1,8 +1,18 @@
from sqlalchemy import Column, Unicode
from typing import List, Optional
from sqlalchemy import Boolean, Unicode
from sqlalchemy.orm import Mapped, mapped_column, relationship
from crudkit.core.base import Base, CRUDMixin
class Area(Base, CRUDMixin):
__tablename__ = "area"
name = Column(Unicode(255), nullable=True)
name: Mapped[Optional[str]] = mapped_column(Unicode(255), nullable=True)
rooms: Mapped[List['Room']] = relationship('Room', back_populates='area')
is_deleted: Mapped[Boolean] = mapped_column(Boolean, nullable=False, default=False)
def __repr__(self):
return f"<Area(id={self.id}, name={repr(self.name)})>"

18
inventory/models/brand.py Normal file
View file

@ -0,0 +1,18 @@
from typing import List
from sqlalchemy import Boolean, Unicode
from sqlalchemy.orm import Mapped, mapped_column, relationship
from crudkit.core.base import Base, CRUDMixin
class Brand(Base, CRUDMixin):
__tablename__ = "brand"
name: Mapped[str] = mapped_column(Unicode(255), nullable=False)
inventory: Mapped[List['Inventory']] = relationship('Inventory', back_populates='brand')
is_deleted: Mapped[Boolean] = mapped_column(Boolean, nullable=False, default=False)
def __repr__(self) -> str:
return f"<Brand(id={self.id}, name={repr(self.name)})>"4

20
inventory/models/image.py Normal file
View file

@ -0,0 +1,20 @@
from typing import List, Optional
from sqlalchemy import DateTime, Unicode, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from crudkit.core.base import Base, CRUDMixin
class Image(Base, CRUDMixin):
__tablename__ = "images"
filename: Mapped[str] = mapped_column(Unicode(512))
caption: Mapped[str] = mapped_column(Unicode(255), default="")
timestamp: Mapped[DateTime] = mapped_column(DateTime, default=func.now(), server_default=func.now())
inventory: Mapped[Optional['Inventory']] = relationship('Inventory', back_populates='images')
user: Mapped[Optional['User']] = relationship('User', back_populates='image')
worklogs: Mapped[List['WorkLog']] = relationship('WorkLog', secondary=worklog_images, back_populates='images')
def __repr__(self):
return f"<Image(id={self.id}, filename={self.filename})>"

View file

@ -0,0 +1,18 @@
from typing import Optional
from sqlalchemy import DateTime, ForeignKey, Index, Integer, Unicode
from sqlalchemy.orm import Mapped, mapped_column
from crudkit.core.base import Base, CRUDMixin
class Inventory(Base, CRUDMixin):
__tablename__ = "inventory"
name: Mapped[Optional[str]] = mapped_column(Unicode(255))
serial: Mapped[Optional[str]] = mapped_column(Unicode(255))
timestamp: Mapped[DateTime] = mapped_column(DateTime)
condition: Mapped[str] = mapped_column(Unicode(255))
device_type_id: Mapped[Optional[int]] = mapped_column('type_id', Integer, ForeignKey("item.id"), nullable=True, index=True)
device_type: Mapped[Optional['DeviceType']]

2
inventory/wsgi.py Normal file
View file

@ -0,0 +1,2 @@
from . import create_app
app = create_app