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()
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)

View File

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

View File

@ -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 '''
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