Files
Document_editor/backend/app/services/access.py
2026-06-15 09:18:58 +03:00

67 lines
1.8 KiB
Python

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