B: Fix error response to invalid file type

This commit is contained in:
Ivan 2024-08-30 09:42:48 +03:00
parent 091b79f19b
commit 89889c9f40
3 changed files with 29 additions and 5 deletions

View File

@ -361,6 +361,11 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr
model = self._get_item() model = self._get_item()
load_metadata = input_serializer.validated_data['load_metadata'] load_metadata = input_serializer.validated_data['load_metadata']
data = utility.read_zipped_json(request.FILES['file'].file, utils.EXTEOR_INNER_FILENAME) 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 data['id'] = model.pk
serializer = s.RSFormTRSSerializer( serializer = s.RSFormTRSSerializer(
@ -486,11 +491,17 @@ class TrsImportView(views.APIView):
request=s.FileSerializer, request=s.FileSerializer,
responses={ responses={
c.HTTP_201_CREATED: LibraryItemSerializer, c.HTTP_201_CREATED: LibraryItemSerializer,
c.HTTP_400_BAD_REQUEST: None,
c.HTTP_403_FORBIDDEN: None c.HTTP_403_FORBIDDEN: None
} }
) )
def post(self, request: Request) -> HttpResponse: def post(self, request: Request) -> HttpResponse:
data = utility.read_zipped_json(request.FILES['file'].file, utils.EXTEOR_INNER_FILENAME) 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) owner = cast(User, self.request.user)
_prepare_rsform_data(data, request, owner) _prepare_rsform_data(data, request, owner)
serializer = s.RSFormTRSSerializer( 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) 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) _prepare_rsform_data(data, request, owner)
serializer_rsform = s.RSFormTRSSerializer(data=data, context={'load_meta': True}) serializer_rsform = s.RSFormTRSSerializer(data=data, context={'load_meta': True})
serializer_rsform.is_valid(raise_exception=True) serializer_rsform.is_valid(raise_exception=True)

View File

@ -14,6 +14,10 @@ def operationNotInOSS(title: str):
return f'Операция не принадлежит ОСС: {title}' return f'Операция не принадлежит ОСС: {title}'
def exteorFileCorrupted():
return 'Файл Экстеор не соответствует ожидаемому формату. Попробуйте сохранить файл в новой версии'
def previousResultMissing(): def previousResultMissing():
return 'Отсутствует результат предыдущей операции' return 'Отсутствует результат предыдущей операции'

View File

@ -1,13 +1,17 @@
''' Utility functions. ''' ''' Utility functions. '''
import json import json
from io import BytesIO 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: def read_zipped_json(data, json_filename: str) -> Optional[dict]:
''' Read JSON from zipped data ''' ''' Read JSON from zipped data. '''
with ZipFile(data, 'r') as archive: try:
json_data = archive.read(json_filename) with ZipFile(data, 'r') as archive:
json_data = archive.read(json_filename)
except BadZipFile:
return None
result: dict = json.loads(json_data) result: dict = json.loads(json_data)
return result return result