from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin from django.db.models import Q from django.shortcuts import get_object_or_404, redirect from django.views.generic import ListView from .models import Document, DocumentAcknowledgement class DocumentListView(LoginRequiredMixin, ListView): model = Document template_name = "documents/document_list.html" context_object_name = "documents" paginate_by = 20 def get_queryset(self): user = self.request.user return ( Document.objects.filter(Q(sent_to_all=True) | Q(recipients=user)) .distinct() .order_by("-uploaded_at") ) def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) user = self.request.user # получаем id документов, с которыми пользователь уже ознакомился acked = DocumentAcknowledgement.objects.filter(user=user).values_list( "document_id", flat=True ) ctx["acked_ids"] = set(acked) return ctx @login_required def acknowledge_document(request, pk): doc = get_object_or_404(Document, pk=pk) DocumentAcknowledgement.objects.get_or_create(document=doc, user=request.user) return redirect("documents:document_list")