from sqlalchemy import or_ from sqlalchemy.orm import Query, Session from app.models.document import FilledDocument from app.models.template import DocumentTemplate from app.models.user import User, UserRole def is_admin(user: User) -> bool: return user.role == UserRole.admin def can_access_template(user: User, template: DocumentTemplate) -> bool: return ( is_admin(user) or template.owner_id == user.id or template.is_public ) def can_manage_template(user: User, template: DocumentTemplate) -> bool: return is_admin(user) or template.owner_id == user.id def can_access_document(user: User, document: FilledDocument) -> bool: return is_admin(user) or document.owner_id == user.id def accessible_templates_query(db: Session, user: User) -> Query: return db.query(DocumentTemplate).filter( or_( DocumentTemplate.owner_id == user.id, DocumentTemplate.is_public == True, ) ) def accessible_template( db: Session, user: User, template_id: int ) -> DocumentTemplate | None: template = db.query(DocumentTemplate).filter( DocumentTemplate.id == template_id ).first() if template and can_access_template(user, template): return template return None def manageable_template( db: Session, user: User, template_id: int ) -> DocumentTemplate | None: template = db.query(DocumentTemplate).filter( DocumentTemplate.id == template_id ).first() if template and can_manage_template(user, template): return template return None def accessible_document( db: Session, user: User, document_id: int ) -> FilledDocument | None: doc = db.query(FilledDocument).filter(FilledDocument.id == document_id).first() if doc and can_access_document(user, doc): return doc return None