"""ProjectMember model for cross-department project collaboration. This model tracks explicit project membership, allowing users from different departments to be granted access to projects they wouldn't normally have access to based on department isolation rules. """ import uuid from sqlalchemy import Column, String, ForeignKey, DateTime, UniqueConstraint from sqlalchemy.sql import func from sqlalchemy.orm import relationship from app.core.database import Base class ProjectMember(Base): """ Represents a user's membership in a project. This enables cross-department collaboration by explicitly granting project access to users regardless of their department. Roles: - member: Can view and edit tasks - admin: Can manage project settings and add other members """ __tablename__ = "pjctrl_project_members" id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) project_id = Column( String(36), ForeignKey("pjctrl_projects.id", ondelete="CASCADE"), nullable=False, index=True ) user_id = Column( String(36), ForeignKey("pjctrl_users.id", ondelete="CASCADE"), nullable=False, index=True ) role = Column(String(50), nullable=False, default="member") added_by = Column( String(36), ForeignKey("pjctrl_users.id"), nullable=False ) created_at = Column(DateTime, server_default=func.now(), nullable=False) # Unique constraint to prevent duplicate memberships __table_args__ = ( UniqueConstraint('project_id', 'user_id', name='uq_project_member'), ) # Relationships project = relationship("Project", back_populates="members") user = relationship("User", foreign_keys=[user_id], back_populates="project_memberships") added_by_user = relationship("User", foreign_keys=[added_by])