52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
"""Единые правила вычисления аудиторий документа."""
|
||
|
||
from django.contrib.auth import get_user_model
|
||
from django.db.models import Q, QuerySet
|
||
|
||
from .models import Document
|
||
|
||
|
||
Employee = get_user_model()
|
||
|
||
|
||
def document_access_audience(document: Document) -> QuerySet:
|
||
"""Активные сотрудники, которым документ адресован для просмотра."""
|
||
employees = Employee.objects.filter(is_active=True)
|
||
if document.sent_to_all:
|
||
return employees
|
||
|
||
return employees.filter(
|
||
Q(pk__in=document.recipients.values("pk"))
|
||
| Q(
|
||
departments_links__department__in=document.departments.all(),
|
||
departments_links__is_active=True,
|
||
)
|
||
).distinct()
|
||
|
||
|
||
def document_acknowledgement_audience(document: Document) -> QuerySet:
|
||
"""Активные сотрудники, обязанные ознакомиться с документом."""
|
||
access_audience = document_access_audience(document)
|
||
if not document.acknowledgement_required:
|
||
return access_audience.none()
|
||
if document.acknowledgement_for_all:
|
||
return access_audience
|
||
|
||
selected = Employee.objects.filter(is_active=True).filter(
|
||
Q(pk__in=document.acknowledgement_recipients.values("pk"))
|
||
| Q(
|
||
departments_links__department__in=(
|
||
document.acknowledgement_departments.all()
|
||
),
|
||
departments_links__is_active=True,
|
||
)
|
||
)
|
||
return selected.filter(pk__in=access_audience.values("pk")).distinct()
|
||
|
||
|
||
def user_requires_document_acknowledgement(document: Document, user) -> bool:
|
||
"""Нужно ли конкретному сотруднику подтверждать ознакомление."""
|
||
if not getattr(user, "is_authenticated", False):
|
||
return False
|
||
return document_acknowledgement_audience(document).filter(pk=user.pk).exists()
|