from django.conf import settings
from django.db.models import F
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets, mixins
from rest_framework.authentication import SessionAuthentication
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.generics import get_object_or_404
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from auth_and_perms.organization_utils import user_is_allowed_on_organization
from laboratory.models import OrganizationStructure
from sga.forms import ValidateReviewSubstanceForm
from sga.models import ReviewSubstance
from . import serializers
from .filterset import ReviewSubstanceFilterSet
[documentos]class ReviewSubstanceViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
authentication_classes = [SessionAuthentication]
permission_classes = [IsAuthenticated]
serializer_class = serializers.ReviewSubstanceDataTableSerializer
queryset = ReviewSubstance.objects.using(settings.READONLY_DATABASE)
pagination_class = LimitOffsetPagination
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
search_fields = ["created_by__username", "comercial_name"]
filterset_class = ReviewSubstanceFilterSet
ordering_fields = ["creation_date", "created_by"]
ordering = ("creation_date",)
[documentos] def get_queryset(self):
queryset = super().get_queryset()
return queryset.annotate(comercial_name=F("substance__comercial_name"))
[documentos] def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
form = ValidateReviewSubstanceForm(self.request.GET)
if form.is_valid():
showapprove = form.cleaned_data["showapprove"] or False
else:
return queryset.none()
filter_data = {
"substance__organization": self.organization,
"is_approved": showapprove,
}
return queryset.filter(**filter_data)
def list(self, request, org_pk, *args, **kwargs):
self.organization = get_object_or_404(
OrganizationStructure.objects.using(settings.READONLY_DATABASE), pk=org_pk
)
user_is_allowed_on_organization(request.user, self.organization)
query_total = self.get_queryset()
queryset = self.filter_queryset(query_total)
data = self.paginate_queryset(queryset)
response = {
"data": data,
"recordsTotal": query_total.count(),
"recordsFiltered": queryset.count(),
"draw": self.request.GET.get("draw", 1),
}
return Response(self.get_serializer(response).data)