From 89889c9f408cca039de446e9828f5b536476cdf4 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 30 Aug 2024 09:42:48 +0300 Subject: [PATCH] B: Fix error response to invalid file type --- rsconcept/backend/apps/rsform/views/rsforms.py | 16 ++++++++++++++++ rsconcept/backend/shared/messages.py | 4 ++++ rsconcept/backend/shared/utility.py | 14 +++++++++----- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/rsconcept/backend/apps/rsform/views/rsforms.py b/rsconcept/backend/apps/rsform/views/rsforms.py index 1565da34..37d0b222 100644 --- a/rsconcept/backend/apps/rsform/views/rsforms.py +++ b/rsconcept/backend/apps/rsform/views/rsforms.py @@ -361,6 +361,11 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr model = self._get_item() load_metadata = input_serializer.validated_data['load_metadata'] data = utility.read_zipped_json(request.FILES['file'].file, utils.EXTEOR_INNER_FILENAME) + if data is None: + return Response( + status=c.HTTP_400_BAD_REQUEST, + data={'file': msg.exteorFileCorrupted()} + ) data['id'] = model.pk serializer = s.RSFormTRSSerializer( @@ -486,11 +491,17 @@ class TrsImportView(views.APIView): request=s.FileSerializer, responses={ c.HTTP_201_CREATED: LibraryItemSerializer, + c.HTTP_400_BAD_REQUEST: None, c.HTTP_403_FORBIDDEN: None } ) def post(self, request: Request) -> HttpResponse: data = utility.read_zipped_json(request.FILES['file'].file, utils.EXTEOR_INNER_FILENAME) + if data is None: + return Response( + status=c.HTTP_400_BAD_REQUEST, + data={'file': msg.exteorFileCorrupted()} + ) owner = cast(User, self.request.user) _prepare_rsform_data(data, request, owner) serializer = s.RSFormTRSSerializer( @@ -526,6 +537,11 @@ def create_rsform(request: Request) -> HttpResponse: ) data = utility.read_zipped_json(request.FILES['file'].file, utils.EXTEOR_INNER_FILENAME) + if data is None: + return Response( + status=c.HTTP_400_BAD_REQUEST, + data={'file': msg.exteorFileCorrupted()} + ) _prepare_rsform_data(data, request, owner) serializer_rsform = s.RSFormTRSSerializer(data=data, context={'load_meta': True}) serializer_rsform.is_valid(raise_exception=True) diff --git a/rsconcept/backend/shared/messages.py b/rsconcept/backend/shared/messages.py index 2c228051..9729c7b2 100644 --- a/rsconcept/backend/shared/messages.py +++ b/rsconcept/backend/shared/messages.py @@ -14,6 +14,10 @@ def operationNotInOSS(title: str): return f'Операция не принадлежит ОСС: {title}' +def exteorFileCorrupted(): + return 'Файл Экстеор не соответствует ожидаемому формату. Попробуйте сохранить файл в новой версии' + + def previousResultMissing(): return 'Отсутствует результат предыдущей операции' diff --git a/rsconcept/backend/shared/utility.py b/rsconcept/backend/shared/utility.py index 5591f095..73fa23e6 100644 --- a/rsconcept/backend/shared/utility.py +++ b/rsconcept/backend/shared/utility.py @@ -1,13 +1,17 @@ ''' Utility functions. ''' import json from io import BytesIO -from zipfile import ZipFile +from typing import Optional +from zipfile import BadZipFile, ZipFile -def read_zipped_json(data, json_filename: str) -> dict: - ''' Read JSON from zipped data ''' - with ZipFile(data, 'r') as archive: - json_data = archive.read(json_filename) +def read_zipped_json(data, json_filename: str) -> Optional[dict]: + ''' Read JSON from zipped data. ''' + try: + with ZipFile(data, 'r') as archive: + json_data = archive.read(json_filename) + except BadZipFile: + return None result: dict = json.loads(json_data) return result