Esempio n. 1
0
    def new_func(*args, **kwargs):
        response = func(*args, **kwargs)
        if response.headers['Content-Type'] == 'text/html':
            raise leancloud.LeanCloudError(-1, 'Bad Request')

        content = utils.response_to_json(response)

        if 'error' in content:
            raise leancloud.LeanCloudError(
                content.get('code', 1), content.get('error', 'Unknown Error'))

        return response
Esempio n. 2
0
    def new_func(*args, **kwargs):
        response = func(*args, **kwargs)
        assert isinstance(response, requests.Response)
        if response.headers.get('Content-Type') == 'text/html':
            raise leancloud.LeanCloudError(-1, 'Bad Request')

        content = response.json()

        if 'error' in content:
            raise leancloud.LeanCloudError(
                content.get('code', 1), content.get('error', 'Unknown Error'))

        return response
Esempio n. 3
0
    def new_func(*args, **kwargs):
        response = func(*args, **kwargs)
        assert isinstance(response, requests.Response)
        if response.headers.get("Content-Type") == "text/html":
            raise leancloud.LeanCloudError(-1, "Bad Request")

        content = response.json()

        if "error" in content:
            raise leancloud.LeanCloudError(
                content.get("code", 1), content.get("error", "Unknown Error"))

        return response
Esempio n. 4
0
    def destroy_all(cls, objs):
        """
        在一个请求中 destroy 多个 leancloud.Object 对象实例。

        :param objs: 需要 destroy 的对象
        :type objs: list
        """
        if not objs:
            return
        if any(x.is_new() for x in objs):
            raise ValueError("Could not destroy unsaved object")

        dumped_objs = []
        for obj in objs:
            dumped_obj = {
                'method': 'DELETE',
                'path': '/{0}/classes/{1}/{2}'.format(client.SERVER_VERSION, obj._class_name, obj.id),
                'body': obj._flags,
            }
            dumped_objs.append(dumped_obj)

        response = client.post('/batch', params={'requests': dumped_objs}).json()

        errors = []
        for idx, obj in enumerate(objs):
            content = response[idx]
            error = content.get('error')
            if error:
                errors.append(leancloud.LeanCloudError(error.get('code'), error.get('error')))

        if errors:
            # TODO: how to raise list of errors?
            # raise MultipleValidationErrors(errors)
            # add test
            raise errors[0]
Esempio n. 5
0
def _deep_save(self,
               unsaved_children,
               unsaved_files,
               exclude=None,
               ignore_failed=True):
    import leancloud
    from leancloud import client
    if exclude:
        # unsaved_children = [x for x in unsaved_children if x != exclude]
        unsaved_children = filter(lambda x: x != exclude, unsaved_children)

    for f in unsaved_files:
        f.save()

    if not unsaved_children:
        return
    dumped_objs = []
    for obj in unsaved_children:
        method = ('PUT', 'POST')[obj.id is None]
        path = '/{0}/classes/{1}'.format(client.SERVER_VERSION,
                                         obj._class_name)
        path += ("/{}".format(obj.id), "")[obj.id is None]
        body = obj._dump_save()
        dumped_obj = {
            'method': method,
            'path': path,
            'body': body,
        }
        dumped_objs.append(dumped_obj)

    response = client.post('/batch', params={'requests': dumped_objs}).json()

    errors = []
    for idx, obj in enumerate(unsaved_children):
        content = response[idx]
        if not content.get('success'):
            errors.append(
                leancloud.LeanCloudError(content.get('code'),
                                         content.get('error')))
        else:
            obj._update_data(content['success'])

        if errors:
            # TODO: how to raise list of errors?
            # raise MultipleValidationErrors(errors)
            # add test
            if ignore_failed:
                continue

            raise errors[0]
Esempio n. 6
0
    def _deep_save(self, unsaved_children, unsaved_files, exclude=None):
        if exclude:
            unsaved_children = [x for x in unsaved_children if x != exclude]

        for f in unsaved_files:
            f.save()

        if not unsaved_children:
            return
        dumped_objs = []
        for obj in unsaved_children:
            if obj.id is None:
                method = 'POST'
                path = '/{0}/classes/{1}'.format(client.SERVER_VERSION,
                                                 obj._class_name)
            else:
                method = 'PUT'
                path = '/{0}/classes/{1}/{2}'.format(client.SERVER_VERSION,
                                                     obj._class_name, obj.id)
            body = obj._dump_save()
            dumped_obj = {
                'method': method,
                'path': path,
                'body': body,
            }
            dumped_objs.append(dumped_obj)

        response = client.post('/batch', params={
            'requests': dumped_objs
        }).json()

        errors = []
        for idx, obj in enumerate(unsaved_children):
            content = response[idx]
            error = content.get('error')
            if error:
                errors.append(
                    leancloud.LeanCloudError(error.get('code'),
                                             error.get('error')))
            else:
                obj._update_data(content['success'])

        if errors:
            # TODO: how to raise list of errors?
            # raise MultipleValidationErrors(errors)
            # add test
            raise errors[0]
Esempio n. 7
0
    def _deep_save(self, unsaved_children, unsaved_files, exclude=None):
        if exclude:
            unsaved_children = [x for x in unsaved_children if x != exclude]

        for f in unsaved_files:
            f.save()

        if not unsaved_children:
            return
        dumped_objs = []
        for obj in unsaved_children:
            if obj.id is None:
                method = "POST"
                path = "/{0}/classes/{1}".format(client.SERVER_VERSION,
                                                 obj._class_name)
            else:
                method = "PUT"
                path = "/{0}/classes/{1}/{2}".format(client.SERVER_VERSION,
                                                     obj._class_name, obj.id)
            body = obj._dump_save()
            dumped_obj = {
                "method": method,
                "path": path,
                "body": body,
            }
            dumped_objs.append(dumped_obj)

        response = client.post("/batch", params={
            "requests": dumped_objs
        }).json()

        errors = []
        for idx, obj in enumerate(unsaved_children):
            content = response[idx]
            error = content.get("error")
            if error:
                errors.append(
                    leancloud.LeanCloudError(error.get("code"),
                                             error.get("error")))
            else:
                obj._update_data(content["success"])

        if errors:
            # TODO: how to raise list of errors?
            # raise MultipleValidationErrors(errors)
            # add test
            raise errors[0]
Esempio n. 8
0
    def destroy_all(cls, objs):
        """
        在一个请求中 destroy 多个 leancloud.Object 对象实例。

        :param objs: 需要 destroy 的对象
        :type objs: list
        """
        if not objs:
            return
        if any(x.is_new() for x in objs):
            raise ValueError("Could not destroy unsaved object")

        dumped_objs = []
        for obj in objs:
            dumped_obj = {
                "method":
                "DELETE",
                "path":
                "/{0}/classes/{1}/{2}".format(client.SERVER_VERSION,
                                              obj._class_name, obj.id),
                "body":
                obj._flags,
            }
            dumped_objs.append(dumped_obj)

        response = client.post("/batch", params={
            "requests": dumped_objs
        }).json()

        errors = []
        for idx in range(len(objs)):
            content = response[idx]
            error = content.get("error")
            if error:
                errors.append(
                    leancloud.LeanCloudError(error.get("code"),
                                             error.get("error")))

        if errors:
            # TODO: how to raise list of errors?
            # raise MultipleValidationErrors(errors)
            # add test
            raise errors[0]
Esempio n. 9
0
    def _deep_save(self, unsaved_children, unsaved_files, exclude=None):
        if exclude:
            unsaved_children = [x for x in unsaved_children if x != exclude]

        for f in unsaved_files:
            f.save()

        if not unsaved_children:
            return
        dumped_objs = []
        for obj in unsaved_children:
            obj._start_save()
            method = 'POST' if obj.id is None else 'PUT'
            path = '/{0}/classes/{1}'.format(client.SERVER_VERSION,
                                             obj._class_name)
            body = obj._dump_save()
            dumped_obj = {
                'method': method,
                'path': path,
                'body': body,
            }
            dumped_objs.append(dumped_obj)

        response = client.post('/batch', params={
            'requests': dumped_objs
        }).json()

        errors = []
        for idx, obj in enumerate(unsaved_children):
            content = response[idx]
            if not content.get('success'):
                errors.append(
                    leancloud.LeanCloudError(content.get('code'),
                                             content.get('error')))
                obj._cancel_save()
            else:
                result = obj.parse(content['success'])
                obj._finish_save(result)

            if errors:
                # TODO: how to raise list of errors?
                # http://stackoverflow.com/questions/9875660/idiomatic-way-to-collect-report-multiple-exceptions-in-python
                raise errors[0]
Esempio n. 10
0
    def _deep_save(self, exclude=None):
        # TODO: chunk
        unsaved_children = []
        unsaved_files = []
        self._find_unsaved_children(self.attributes, unsaved_children, unsaved_files)

        if exclude:
            unsaved_children = [x for x in unsaved_children if x != exclude]

        for f in unsaved_files:
            f.save()

        dumped_objs = []
        for obj in unsaved_children:
            obj._start_save()
            method = 'POST' if obj.id is None else 'PUT'
            path = '/{0}/classes/{1}'.format(client.SERVER_VERSION, obj._class_name)
            body = obj._dump_save()
            dumped_obj = {
                'method': method,
                'path': path,
                'body': body,
            }
            dumped_objs.append(dumped_obj)

        response = utils.response_to_json(client.post('/batch', params={'requests': dumped_objs}))

        errors = []
        for idx, obj in enumerate(unsaved_children):
            content = response[idx]
            if not content.get('success'):
                errors.append(leancloud.LeanCloudError(content.get('code'), content.get('error')))
                obj._cancel_save()
            else:
                result = obj.parse(content['success'])
                obj._finish_save(result)

            if errors:
                # TODO: how to raise list of errors?
                raise errors[0]