def upload_book(request): """ Handles request and saves uploaded book. """ validate_api_secret_key(request.data.get('app_key')) request_serializer = UploadBookRequest(data=request.data) if request_serializer.is_valid(): with transaction.atomic(): user = get_object_or_404(TheUser, auth_token=request.data.get('user_token')) rel_objects = Book.get_related_objects_create_api( user, request.data) book = Book.objects.create(book_name=request.data.get('book_name'), id_author=rel_objects['author'], id_category=rel_objects['category'], description=request.data.get('about'), language=rel_objects['lang'], photo=request.data['photo'], book_file=request.data['book_file'], who_added=user, private_book=json.loads( request.data.get('private_book'))) AddedBook.objects.create(id_user=user, id_book=book) logger.info( "User '{}' uploaded book with id: '{}' and name: '{}' on category: '{}'." .format(user, book.id, book.book_name, rel_objects['category'])) compress_pdf_task.delay(book.book_file.path, book.id) return Response( { 'detail': 'successful', 'data': { 'book': BookSerializer(book).data } }, status=status.HTTP_200_OK) else: return invalid_data_response(request_serializer)