Add Photo model and establish relationships with Inventory and User; create worklog_photos association table

This commit is contained in:
Yaro Kasear 2025-07-10 16:15:29 -05:00
parent 54efd370ff
commit 2a8e1710b3
4 changed files with 38 additions and 2 deletions

View file

@ -4,6 +4,7 @@ if TYPE_CHECKING:
from .items import Item from .items import Item
from .work_log import WorkLog from .work_log import WorkLog
from .rooms import Room from .rooms import Room
from .photo import Photo
from sqlalchemy import Boolean, ForeignKey, Identity, Index, Integer, Unicode, DateTime, text from sqlalchemy import Boolean, ForeignKey, Identity, Index, Integer, Unicode, DateTime, text
from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.orm import Mapped, mapped_column, relationship
@ -27,16 +28,17 @@ class Inventory(db.Model):
notes: Mapped[Optional[str]] = mapped_column(Unicode(255)) notes: Mapped[Optional[str]] = mapped_column(Unicode(255))
owner_id = mapped_column(Integer, ForeignKey('users.id')) owner_id = mapped_column(Integer, ForeignKey('users.id'))
brand_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("brand.id")) brand_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("brand.id"))
# Photo: Mapped[Optional[str]] = mapped_column(String(8000)) Will be replacing with something that actually works.
location_id: Mapped[Optional[str]] = mapped_column(ForeignKey("rooms.id")) location_id: Mapped[Optional[str]] = mapped_column(ForeignKey("rooms.id"))
barcode: Mapped[Optional[str]] = mapped_column(Unicode(255)) barcode: Mapped[Optional[str]] = mapped_column(Unicode(255))
shared: Mapped[Optional[bool]] = mapped_column(Boolean, server_default=text('((0))')) shared: Mapped[Optional[bool]] = mapped_column(Boolean, server_default=text('((0))'))
photo_id: Mapped[Optional[int]] = mapped_column(ForeignKey('photos.id'), nullable=True)
location: Mapped[Optional['Room']] = relationship('Room', back_populates='inventory') location: Mapped[Optional['Room']] = relationship('Room', back_populates='inventory')
owner = relationship('User', back_populates='inventory') owner = relationship('User', back_populates='inventory')
brand: Mapped[Optional['Brand']] = relationship('Brand', back_populates='inventory') brand: Mapped[Optional['Brand']] = relationship('Brand', back_populates='inventory')
item: Mapped['Item'] = relationship('Item', back_populates='inventory') item: Mapped['Item'] = relationship('Item', back_populates='inventory')
work_logs: Mapped[List['WorkLog']] = relationship('WorkLog', back_populates='work_item') work_logs: Mapped[List['WorkLog']] = relationship('WorkLog', back_populates='work_item')
photo: Mapped[Optional['Photo']] = relationship('Photo', back_populates='inventory')
def __init__(self, timestamp: datetime.datetime, condition: str, type_id: Optional[int] = None, def __init__(self, timestamp: datetime.datetime, condition: str, type_id: Optional[int] = None,
name: Optional[str] = None, serial: Optional[str] = None, name: Optional[str] = None, serial: Optional[str] = None,

25
inventory/models/photo.py Normal file
View file

@ -0,0 +1,25 @@
from typing import Optional, TYPE_CHECKING
if TYPE_CHECKING:
from .inventory import Inventory
from .users import User
import datetime
from sqlalchemy import Integer, Unicode, DateTime, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from . import db
class Photo(db.Model):
__tablename__ = 'photos'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
filename: Mapped[str] = mapped_column(Unicode(512))
caption: Mapped[str] = mapped_column(Unicode(255), default="")
timestamp: Mapped[datetime.datetime] = mapped_column(DateTime, default=datetime.datetime.now(), server_default=func.now())
inventory: Mapped[Optional['Inventory']] = relationship('Inventory', back_populates='photo')
user: Mapped[Optional['User']] = relationship('User', back_populates='photo')
def __repr__(self):
return f"<Photo(id={self.id}, filename={self.filename})>"

View file

@ -0,0 +1,7 @@
from .. import db
worklog_photos = db.Table(
'worklog_photos',
db.Column('worklog_id', db.Integer, db.ForeignKey('work_log.id'), primary_key=True),
db.Column('photo_id', db.Integer, db.ForeignKey('photos.id'), primary_key=True),
)

View file

@ -3,6 +3,7 @@ if TYPE_CHECKING:
from .inventory import Inventory from .inventory import Inventory
from .rooms import Room from .rooms import Room
from .work_log import WorkLog from .work_log import WorkLog
from .photo import Photo
from sqlalchemy import Boolean, ForeignKey, Identity, Integer, Unicode, text from sqlalchemy import Boolean, ForeignKey, Identity, Integer, Unicode, text
from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.orm import Mapped, mapped_column, relationship
@ -19,13 +20,14 @@ class User(db.Model):
first_name: Mapped[Optional[str]] = mapped_column(Unicode(255), nullable=True) first_name: Mapped[Optional[str]] = mapped_column(Unicode(255), nullable=True)
location_id: Mapped[Optional[int]] = mapped_column(ForeignKey("rooms.id"), nullable=True) location_id: Mapped[Optional[int]] = mapped_column(ForeignKey("rooms.id"), nullable=True)
supervisor_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("users.id")) supervisor_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("users.id"))
photo_id: Mapped[Optional[int]] = mapped_column(ForeignKey('photos.id'), nullable=True)
supervisor: Mapped[Optional['User']] = relationship('User', remote_side='User.id', back_populates='subordinates') supervisor: Mapped[Optional['User']] = relationship('User', remote_side='User.id', back_populates='subordinates')
subordinates: Mapped[List['User']] = relationship('User', back_populates='supervisor') subordinates: Mapped[List['User']] = relationship('User', back_populates='supervisor')
work_logs: Mapped[List['WorkLog']] = relationship('WorkLog', back_populates='contact') work_logs: Mapped[List['WorkLog']] = relationship('WorkLog', back_populates='contact')
location: Mapped[Optional['Room']] = relationship('Room', back_populates='users') location: Mapped[Optional['Room']] = relationship('Room', back_populates='users')
inventory: Mapped[List['Inventory']] = relationship('Inventory', back_populates='owner') inventory: Mapped[List['Inventory']] = relationship('Inventory', back_populates='owner')
photo: Mapped[Optional['Photo']] = relationship('Photo', back_populates='user')
@property @property
def full_name(self) -> str: def full_name(self) -> str: