import pandas as pd from django.db.transaction import atomic from django.http import Http404 from rest_framework.exceptions import APIException from rest_framework.permissions import IsAdminUser, IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from ..serializers.alimentation import AlimentationZoneGeographiqueSerializer from ..utils.alimentation_decorators import (data_perf_logger_factory, get_data_logger) from ..utils.decorators import execution_time, query_count from ..utils_extraction import (DataFrameTypes, FileTypes, read_files_by_type, to_table_zone_geographique) from ..utils_insertion import insert_ZoneGeographique class AlimentationZoneGeographiqueView(APIView): """ Vue pour alimenter la base à partir de référentiels """ permission_classes = [IsAuthenticated, IsAdminUser] serializer_class = AlimentationZoneGeographiqueSerializer def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.logger = get_data_logger(self) def get(self, request): return Response("Formulaire d'alimentation d'OGURE NG pour les zones geographiques") @atomic @execution_time(logger_factory=data_perf_logger_factory) @query_count(logger_factory=data_perf_logger_factory) def post(self, request): """ Charge le(s) fichier(s) et met à jour la base. :param request: requête, contient les fichiers :type request: class:`rest_framework.request.Request` :raises: class:`rest_framework.exceptions.APIException` :return: réponse :rtype: class:`rest_framework.response.Response` """ try: validator = self.serializer_class(data=request.data) validator.is_valid(raise_exception=True) ref_zones_geo_df = read_files_by_type({ FileTypes.REF_GEO: validator.validated_data.get('ref_zones_geo') }).get(DataFrameTypes.REF_GEO) if ref_zones_geo_df is not None: df = to_table_zone_geographique(ref_zones_geo_df) self.logger.info('Extraction des données du référentiel ------> Succès') insert_ZoneGeographique(df) self.logger.info('Mise à jour du référentiel ------> Succès') else: self.logger.info('Mise à jour ignorée : zones géographiques (nécessite %s)', DataFrameTypes.REF_GEO.value[1]) return Response({'Insertion réussie'}) except (Http404, APIException): raise except BaseException: message = "Impossible d'alimenter le(s) référentiel(s)" self.logger.exception(message) raise APIException(message)