コード例 #1
0
ファイル: views.py プロジェクト: acrooo/Adlibre-DMS
    def put(self, request, code, suggested_format=None):
        """Used to work with "update" sequence of DMS code.

        to update a code you need to send a PUT request here.
        PUT must contain:

        @param code: the DMS "code" of file to be updated. e.g.: ADL-0001
        @param suggested_format: format of file for code to be updated. To have ability to post files in certain format.
        """
        context = {'request': request}
        conten_type = request.content_type
        uploaded_obj = None
        if 'multipart/form-data' in conten_type:
            # We have a file upload encoded with multipart/form-data
            file_content = StringIO(request.body)
            parser = MultiPartParser()
            dnf = parser.parse(file_content, media_type=conten_type, parser_context=context)
            extra = dnf.data
            if 'file' in dnf.files:
                uploaded_obj = dnf.files['file']
        else:
            extra = request.QUERY_PARAMS
        # TODO: do we require SQL tagging logic in this API call?
        sql_tag_string = extra.get('tag_string', None)
        sql_remove_tag_string = extra.get('remove_tag_string', None)
        new_name = extra.get('new_name', None)
        new_type = extra.get('new_type', None)
        index_data = extra.get('indexing_data', None)
        if index_data:
            index_data = json.loads(index_data)
        processor = DocumentProcessor()
        options = {
            'tag_string': sql_tag_string,
            'remove_tag_string': sql_remove_tag_string,
            'extension': suggested_format,
            'new_name': new_name,
            'new_type': new_type,
            'new_indexes': index_data,
            'update_file': uploaded_obj,
            'user': request.user,
        }
        document = processor.update(code, options)
        if len(processor.errors) > 0:
            log.error('FileHandler.update manager errors %s' % processor.errors)
            if settings.DEBUG:
                print processor.errors
                raise Exception('FileHandler.update manager errors')
            else:
                return Response(status=status.HTTP_400_BAD_REQUEST)
        log.info('FileHandler.update request fulfilled for code: %s, extension: %s'
                 % (code, suggested_format))
        resp = DMSOBjectRevisionsData(document).data
        return Response(resp, status=status.HTTP_200_OK)
コード例 #2
0
 def test_request_POST_with_form_content(self):
     """
     Ensure request.POST returns content for POST request with form content.
     """
     data = {'qwerty': 'uiop'}
     request = Request(factory.post('/', data))
     request.parsers = (FormParser(), MultiPartParser())
     self.assertEqual(list(request.POST.items()), list(data.items()))
コード例 #3
0
 def test_post_accessed_in_put_method(self):
     django_request = self.factory.put('/', {'foo': 'bar'})
     request = Request(django_request,
                       parsers=[FormParser(),
                                MultiPartParser()])
     django_request.POST
     assert request.POST == {'foo': ['bar']}
     assert request.data == {'foo': ['bar']}
コード例 #4
0
 def test_standard_behaviour_determines_form_content_PUT(self):
     """
     Ensure request.DATA returns content for PUT request with form content.
     """
     data = {'qwerty': 'uiop'}
     request = Request(factory.put('/', data))
     request.parsers = (FormParser(), MultiPartParser())
     self.assertEqual(list(request.DATA.items()), list(data.items()))
コード例 #5
0
 def test_request_DATA_with_form_content(self):
     """
     Ensure request.data returns content for POST request with form content.
     """
     data = {'qwerty': 'uiop'}
     request = Request(factory.post('/', data))
     request.parsers = (FormParser(), MultiPartParser())
     assert list(request.data.items()) == list(data.items())
コード例 #6
0
 def test_request_POST_with_form_content_JSONField(self):
     data = b'-----------------------------20775962551482475149231161538\r\nContent-Disposition: form-data; name="json_field"\r\n\r\n{"a": true}\r\n-----------------------------20775962551482475149231161538--\r\n'
     content_type = 'multipart/form-data; boundary=---------------------------20775962551482475149231161538'
     wsgi_request = self.factory.generic('POST', '/', data, content_type)
     request = Request(wsgi_request)
     request.parsers = (FormParser(), MultiPartParser())
     serializer = self.Serializer(data=request.data)
     assert serializer.is_valid(raise_exception=True) == True
     assert dict(serializer.data)['json_field'] == {'a': True}
コード例 #7
0
 def test_request_POST_with_files(self):
     """
     Ensure request.POST returns no content for POST request with file content.
     """
     upload = SimpleUploadedFile("file.txt", b"file_content")
     request = Request(factory.post('/', {'upload': upload}))
     request.parsers = (FormParser(), MultiPartParser())
     assert list(request.POST.keys()) == []
     assert list(request.FILES.keys()) == ['upload']
コード例 #8
0
 def testupload(self):
     """
     Ensure request.POST returns no content for POST request with file content.
     """
     factory = APIRequestFactory()
     upload = SimpleUploadedFile("file.txt", b"file_content")
     request = Request(factory.post('App/upload', {'upload': upload}))
     request.parsers = (FormParser(), MultiPartParser())
     assert list(request.POST) == []
     assert list(request.FILES) == ['upload']
コード例 #9
0
def update(request, pk):
    try:
        recipe = Recipe.objects.get(id=pk)
    except Recipe.DoesNotExist:
        return JsonResponse({'error': 'choose a valid Recipe'})
    parser = MultiPartParser(request.META, request, request.upload_handlers)
    POST, FILES = parser.parse()
    data = {}
    data['header'] = POST.get('header')
    data['serves'] = POST.get('serves')
    data['url'] = POST.get('url')
    data['description'] = POST.get('description')
    data['ingredients'] = json.loads(POST.get('ingredients'))
    data['instructions'] = json.loads(POST.get('instructions'))
    if not FILES.get('image'):
        data['image'] = POST.get('image')
    else:
        data['image'] = FILES.get('image')
    recipe = Recipe.objects.updateRecipeData(recipe, data, data['image'])
    return redirect('/recipe/' + str(pk))
コード例 #10
0
 def test_request_read_before_parsing(self):
     django_request = self.factory.put('/', {'foo': 'bar'})
     request = Request(django_request,
                       parsers=[FormParser(),
                                MultiPartParser()])
     django_request.read()
     with pytest.raises(RawPostDataException):
         request.POST
     with pytest.raises(RawPostDataException):
         request.POST
         request.data
コード例 #11
0
    def test_standard_behaviour_determines_form_content_PUT(self):
        """
        Ensure request.DATA returns content for PUT request with form content.
        """
        data = {'qwerty': 'uiop'}

        from django import VERSION

        if VERSION >= (1, 5):
            from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
            request = Request(factory.put('/', encode_multipart(BOUNDARY, data),
                                  content_type=MULTIPART_CONTENT))
        else:
            request = Request(factory.put('/', data))

        request.parsers = (FormParser(), MultiPartParser())
        self.assertEqual(list(request.DATA.items()), list(data.items()))
コード例 #12
0
ファイル: api.py プロジェクト: yohn-dezmon/karrot-backend
    def parse(self, stream, media_type=None, parser_context=None):
        data = {}
        parsed = MultiPartParser.parse(self, stream, media_type, parser_context)

        # Find any JSON content first
        for name, content in parsed.files.items():
            if content.content_type != 'application/json':
                continue
            data.update(**json.load(content.file))

        # Now get any other content
        for name, content in parsed.files.items():
            if content.content_type == 'application/json':
                continue
            # name is the path into the object to assign
            glom.assign(data, name, content)

        return data
コード例 #13
0
    def create(self, request, *args, **kwargs):
        try:
            req_params = MultiPartParser().parse(request)
            compiler = req_params.pop("compiler")
            tex_source = req_params.pop("tex_source")
            tex_key = req_params.pop("tex_key", None)
            field_str = req_params.pop("fields", None)
        except Exception:
            from traceback import print_exc
            print_exc()
            tp, e, __ = sys.exc_info()
            error = "%s: %s" % (tp.__name__, str(e))
            return Response({"error": error},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        if field_str and tex_key:
            cached_result = (get_cached_results_from_field_and_tex_key(
                tex_key, field_str, request))
            if cached_result:
                return Response(cached_result, status=status.HTTP_200_OK)

        data_url = None
        error = None

        try:
            _converter = unzipped_folder_to_pdf_converter(
                compiler, tex_source, image_format, tex_key, **req_params)
        except Exception as e:
            from traceback import print_exc
            print_exc()
            tp, e, __ = sys.exc_info()
            error = "%s: %s" % (tp.__name__, str(e))
            return Response({"error": error},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        qs = LatexPdf.objects.filter(
            project__zip_file_hash=_converter.zip_file_hash)
        if qs.count():
            instance = qs[0]
            image_serializer = self.get_serializer(instance, fields=field_str)
            return Response(image_serializer.data, status=status.HTTP_200_OK)

        try:
            data_url = _converter.get_converted_data_url()
        except Exception as e:
            if isinstance(e, LatexCompileError):
                error = "%s: %s" % (type(e).__name__, str(e))
            else:
                from traceback import print_exc
                print_exc()
                tp, e, __ = sys.exc_info()
                error = "%s: %s" % (tp.__name__, str(e))
                return Response({"error": error},
                                status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        assert not all([data_url is None, error is None])

        data = {"tex_key": _converter.zip_file_hash}
        if data_url is not None:
            data["data_url"] = data_url
        else:
            data["compile_error"] = error

        data["creator"] = self.request.user.pk

        image_serializer = self.get_serializer(data=data)

        if image_serializer.is_valid():
            instance = image_serializer.save()
            return Response(self.get_serializer(instance,
                                                fields=field_str).data,
                            status=status.HTTP_201_CREATED)
        return Response(
            # For example, tex_key already exists.
            image_serializer.errors,
            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
コード例 #14
0
    def select_parser(self, request, parsers):
        if request.method == 'POST':
            parsers = [FormParser(), MultiPartParser()]

        return super(ConditionalContentNegotiation,
                     self).select_parser(request, parsers)
コード例 #15
0
def meta(request):
    data = MultiPartParser.parse(request)
    print(data)
    res = write_from_meta()
    return Response(AudioSerializer(Audio.objects.all(), many=True).data)
コード例 #16
0
ファイル: test_drf.py プロジェクト: mkurnikov/tipsi_tools
 def request(self, *args, **kwargs):
     return Request(super().request(*args, **kwargs),
                    parsers=[MultiPartParser(),
                             JSONParser()])
コード例 #17
0
ファイル: apis.py プロジェクト: docgi/docgi
 def get_parsers(self):
     if self.request.method in ["PUT", "PATCH"]:
         return [MultiPartParser()]
     return super().get_parsers()