67 lines
1.8 KiB
Python
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
|