Files
test_OgureNG/backend-django/backend/views/notation.py
2022-11-08 21:19:51 +01:00

147 lines
6.9 KiB
Python

from django.shortcuts import get_object_or_404
from django.db.models import Q
from numpy import True_
from rest_framework.permissions import IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from ..models import Decision, DecisionChoices, Notation, Poste
from ..paginations import HeavyDataPagination
from ..serializers.notation import NotationSerializer
from .commun import (GestionnairePermission, execution_time_viewset,
query_count_viewset)
@execution_time_viewset
@query_count_viewset
class NotationView(ModelViewSet):
"""
Cette classe est dédiée au vue des notations.
"""
permission_classes = [IsAuthenticated, GestionnairePermission]
serializer_class = NotationSerializer
queryset = Notation.objects.all()
pagination_class = HeavyDataPagination
def list(self, request: Request, pk=None) -> Response:
"""La fonction list envoie le classement des postes pour un administré particulier et inversement.
:type request: rest_framework.request.Request
:param request: Request contenant l'administre ou le poste.
:return: - **JsonResponse** (*JsonResponse*): Json contenant le classement.
"""
notations_list = []
counter = 10
if 'administre_id' in request.query_params:
q = 'poste_pam'
q1 = 'poste'
administre_id = request.query_params['administre_id']
administres_keys = (
'poste_pam__id',
'poste_pam__poste__p_id',
'poste_pam__poste__p_nf',
'poste_pam__poste__p_domaine',
'poste_pam__poste__p_filiere',
'poste_pam__poste__p_eip',
'poste_pam__poste__formation_emploi__fe_code',
'poste_pam__poste__p_notes_gestionnaire',
'poste_pam__poste__p_liste_id_marques',
'poste_pam__poste__p_code_fonction',
'poste_pam__p_avis_pam',
'poste_pam__poste__p_dep',
'poste_pam__poste__formation_emploi__fe_libelle',
'poste_pam__poste__p_fonction',
'poste_pam__poste__formation_emploi__fe_garnison_lieu',
'poste_pam__poste__formation_emploi__fe_code_postal',
'no_score_administre',
'no_flag_cple_ideal')
notation_qs = (Notation.objects.filter(Q(administre_pam_id=administre_id) & Q(poste_pam__decisions__isnull=True))
.order_by('-no_score_administre')
.select_related('poste_pams'))
notation_qs_matching_parfait = (Notation.objects.filter(administre_pam_id=administre_id,
no_flag_cple_ideal=True,
poste_pam__decisions__isnull=True)
.select_related('poste_pams'))
notation_qs.union(notation_qs_matching_parfait)
notation_qs = notation_qs | notation_qs_matching_parfait
notations_list = list(notation_qs.values(*administres_keys))
for notation in notations_list:
poste_id = notation['poste_pam__id']
topCounter = 0
allNotationsInvolved = Notation.objects.filter(poste_pam_id=poste_id)
for note in allNotationsInvolved:
topList = list(
Notation.objects.filter(no_id=note.no_id).order_by('-no_score_administre').values('poste_pam_id'))
topPostes = [poste['poste_pam_id'] for poste in topList]
if poste_id in topPostes:
topCounter += 1
notation['poste__nb_top'] = topCounter
if 'poste_id' in request.query_params:
q = "administre_pam"
q1 = 'administre'
poste_id = request.query_params['poste_id']
postes_keys = (
'administre_pam__id',
'administre_pam__administre__a_id_sap',
'administre_pam__administre__a_nom',
'administre_pam__administre__a_prenom',
'administre_pam__a_statut_pam_annee',
'administre_pam__administre__grade_id',
'administre_pam__administre__a_liste_id_marques',
'administre_pam__decision__de_decision',
'administre_pam__decision__de_date_decision',
'no_score_administre',
'no_flag_cple_ideal',
'administre_pam__notes_pam',
'administre_pam__administre__a_notes_gestionnaire',
'administre_pam__administre__a_fonction',
'administre_pam__administre__a_code_fonction',
'administre_pam__administre__a_liste_id_marques',
'administre_pam__decision__poste_id')
notation_qs = (Notation.objects.filter(Q(poste_pam_id=poste_id) & Q(administre_pam__decision__isnull=True))
.order_by('-no_score_administre')
.select_related('administre_pam'))
notation_qs_matching_parfait = (Notation.objects.filter(poste_pam_id=poste_id,
no_flag_cple_ideal=True,
administre_pam__decision__isnull=True)
.select_related('administre_pam'))
notation_qs.union(notation_qs_matching_parfait)
notations_list = list(
notation_qs.values(*postes_keys))
for notation in notations_list:
administre_id = notation['administre_pam__id']
topCounter = 0
allNotationsInvolved = Notation.objects.filter(administre_pam_id=administre_id)
for note in allNotationsInvolved:
topList = list(Notation.objects.filter(no_id=note.no_id)
.order_by('-no_score_administre')
.values('administre_pam_id'))
topAdministres = [administre['administre_pam_id'] for administre in topList]
if administre_id in topAdministres:
topCounter += 1
notation['administre__nb_top'] = topCounter
result = []
for notation in notations_list:
res_notation = {q1: {}}
for key in notation:
if (q + "__") in key:
res_notation[q1][key.replace(q + '__', '').replace(q1 + '__', '')] = notation[key]
else:
res_notation[key] = notation[key]
result.append(res_notation)
return Response(result)