def get_by_id(self, request, id):
     item = next(
         (obj for obj in self.model.objects.values() if obj["id"] == id),
         None)
     if item:
         return create_commercetools_response(request, json=item)
     return create_commercetools_response(request, status_code=404)
 def get_by_key(self, request, key):
     obj = self.model.get_by_key(key)
     if obj:
         expanded_obj = self._expand(request, obj)
         content = schemas.ProductProjectionSchema().dumps(expanded_obj)
         return create_commercetools_response(request, text=content)
     return create_commercetools_response(request, status_code=404)
    def delete_by_key(self, request, key):
        obj = self.model.get_by_key(key)
        if obj:
            if self._verify_version:
                response = self._validate_resource_version(request, obj)
                if response is not None:
                    return response

            obj = self.model.delete_by_key(key)
            return create_commercetools_response(request, json=obj)
        return create_commercetools_response(request, status_code=404)
    def _update(self, request, obj):
        if not obj:
            return create_commercetools_response(request, status_code=404)

        update = self._schema_update().load(request.json())
        if update.actions:
            obj, err = self._apply_update_actions(obj, update)
            if err:
                return create_commercetools_response(
                    request, json=err, status_code=err["statusCode"])
        expanded_obj = self._expand(request, obj)
        return create_commercetools_response(request, json=expanded_obj)
 def get_by_container_key(self, request, container: str, key: str):
     item = next(
         (
             obj
             for obj in self.model.objects.values()
             if obj["container"] == container and obj["key"] == key
         ),
         None,
     )
     if item:
         return create_commercetools_response(request, json=item)
     else:
         return create_commercetools_response(request, status_code=404)
    def get_by_key(self, request, key):
        params = utils.parse_request_params(_ProductProjectionQuerySchema, request)
        obj = self.model.get_by_key(key)
        if obj:
            expanded_obj = self._expand(request, obj)
            product = ProductSchema().load(expanded_obj)

            result = self._convert_product_projection(product, params["staged"])
            if not result:
                return create_commercetools_response(request, status_code=404)
            content = ProductProjectionSchema().dumps(result)
            return create_commercetools_response(request, text=content)
        return create_commercetools_response(request, status_code=404)
 def _validate_resource_version(self, request, obj):
     update_version = self._get_version_from_request(request)
     if update_version != obj["version"]:
         data = self._create_version_error_response(obj["version"])
         return create_commercetools_response(request,
                                              json=data,
                                              status_code=409)
    def search(self, request):
        params = utils.parse_request_params(_ProductProjectionQuerySchema, request)

        limit = params.get("limit")

        results = []
        found = 0
        for obj in self.model.objects.values():
            expanded_obj = self._expand(request, obj)
            product = ProductSchema().load(expanded_obj)

            result = self._convert_product_projection(product, params["staged"])
            if result:
                results.append(results)
                found += 1

            if limit is not None and found == limit:
                break

        data = {
            "count": len(results),
            "total": len(results),  # FIXME
            "offset": 0,
            "results": results,
            "limit": limit,
        }
        content = ProductProjectionPagedQueryResponseSchema().dumps(data)
        return create_commercetools_response(request, text=content)
Beispiel #9
0
 def create(self, request):
     obj = self._schema_draft().loads(request.body)
     data = self.model.add(obj)
     expanded_data = self._expand(request, data)
     return create_commercetools_response(request,
                                          json=expanded_data,
                                          status_code=201)
    def search(self, request):
        params = utils.parse_request_params(ProductProjectionsQuerySchema,
                                            request)
        results = [
            self._convert_product_projection(product, params["staged"])
            for product in self.model.objects.values()
        ]
        results = [x for x in results if x]
        if params.get("limit"):
            results = results[:params["limit"]]

        if params.get("expand"):
            expanded_results = []
            for result in results:
                expanded_results.append(self._expand(request, result))
            results = expanded_results

        data = {
            "count": len(results),
            "total": len(results),
            "offset": 0,
            "results": results,
        }
        content = schemas.ProductProjectionPagedQueryResponseSchema().dumps(
            data)
        return create_commercetools_response(request, text=content)
    def _matcher(self, request, skip_port_check=False):
        if not skip_port_check and request.port != 443:
            return

        if request.hostname not in self.hostnames:
            return
            if not request.route_kwargs["path"]:
                request.route_kwargs["path"] = "/"

        match = re.match(self.path_prefix, request.path)
        if match:
            request.kwargs = match.groupdict()
            try:
                request_path = match.groupdict()["path"]
            except KeyError:
                request_path = ""

            for path, method, callback in self.urls():
                path_match = re.match(path, request_path)

                # Call the view
                if path_match and request.method == method:
                    response = callback(request, **path_match.groupdict())
                    if response is None:
                        raise NotImplementedError(
                            "No response returned by %r" % callback)
                    return response
            return create_commercetools_response(request, status_code=404)
Beispiel #12
0
    def token(self, request):
        client_id, client_secret = self._get_api_client_credentials(request)
        if not client_id or not client_secret:
            response = create_commercetools_response(request, status_code=401)
            return response

        if self.model.is_valid(client_id, client_secret):
            scope = request.qs.get('scope', ['manage_project:todo'])[0]
            token = {
                "access_token": str(uuid.uuid4()),
                "expires_in": self._expire_time,
                "scope": scope,
                "token_type": "Bearer",
            }
            self.model.add_token(token)
            response = create_commercetools_response(request, json=token)
            return response
    def create(self, request):
        obj = self._schema_draft().loads(request.body)
        data = self.model.add(obj)

        # Convert to CustomerSignInResult
        data = {"customer": data, "cart": None}

        expanded_data = self._expand(request, data)
        return create_commercetools_response(request, json=expanded_data)
Beispiel #14
0
    def upload_image(self, request, id):
        obj = self.model.get_by_id(id)
        if not obj:
            return create_commercetools_response(request, status_code=404)

        obj = copy.deepcopy(obj)

        params = parse_request_params(UploadImageQuerySchema, request)
        target = _get_target_obj(obj, staged=params["staged"])
        filename = params["filename"]

        variant = _get_variant(target, sku=params["sku"])
        if not variant["images"]:
            variant["images"] = []
        image_schema = ImageSchema()
        variant["images"].append(
            image_schema.dump(
                types.Image(url=f"cdn.commercetools.local/detail-{filename}")))
        self.model.save(obj)
        return create_commercetools_response(request, json=obj)
 def get_by_container_key(self, request, container: str, key: str):
     id = (container, key)
     item = self.model.objects.get(id)
     if item:
         return create_commercetools_response(request, json=item)
     else:
         content = schemas.ErrorResponseSchema().dumps(
             types.ErrorResponse(
                 status_code=404,
                 message=f"The CustomObject with ID '({container},{key})'",
                 errors=[
                     types.InvalidSubjectError(
                         code="InvalidSubject",
                         message=
                         f"The CustomObject with ID '({container},{key}' was not found.",  # noqa E501
                     )
                 ],
             ))
         return create_commercetools_response(request,
                                              text=content,
                                              status_code=404)
    def introspect(self, request):
        client_id, client_secret = self._get_api_client_credentials(request)
        if not client_id or not client_secret:
            response = create_commercetools_response(request, status_code=401)
            return response

        if self.model.is_valid(client_id, client_secret):
            token = request.qs.get('token', [None])[0]
            stored_tokens = [
                token_object.get('access_token')
                for token_object in self.model.tokens
            ]
            if token in stored_tokens:
                status = {
                    "active": True,
                    "scope": "manage_project:todo",
                    "exp": self._expire_time
                }
            else:
                status = {"active": False}
            response = create_commercetools_response(request, json=status)
            return response
    def create(self, request):
        obj = self._schema_draft().loads(request.body)

        if isinstance(obj.destination, models.SqsDestination):
            dest = obj.destination
            message = (
                "A test message could not be delivered to this destination: "
                "SQS %r in %r for %r. "
                "Please make sure your destination is correctly configured."
            ) % (dest.queue_url, dest.region, dest.access_key)
            error = models.ErrorResponse(
                status_code=400,
                message=message,
                errors=[models.InvalidInputError(message=message)],
            )
            error_data = ErrorResponseSchema().dumps(error).encode("utf-8")
            return create_commercetools_response(request,
                                                 content=error_data,
                                                 status_code=400)

        data = self.model.add(obj)
        return create_commercetools_response(request, json=data)
Beispiel #18
0
    def introspect(self, request):
        client_id, client_secret = self._get_api_client_credentials(request)
        if not client_id or not client_secret:
            response = create_commercetools_response(request, status_code=401)
            return response

        if self.model.is_valid(client_id, client_secret):
            token = request.qs.get('token', [None])[0]
            stored_tokens = [(token_object.get('access_token'),
                              token_object.get('scope'))
                             for token_object in self.model.tokens]
            lookup_token = [item for item in stored_tokens if item[0] == token]
            if len(lookup_token) > 0 and token in [
                    x[0] for x in stored_tokens
            ]:
                status = {
                    "active": True,
                    "scope": lookup_token[0][1],
                    "exp": self._expire_time
                }
            else:
                status = {"active": False}
            response = create_commercetools_response(request, json=status)
            return response
Beispiel #19
0
    def query(self, request):
        params = utils.parse_request_params(self._schema_query_params, request)
        results = self.model.query(params.get("where"))
        total_count = len(results)
        if params.get("limit"):
            results = results[:params["limit"]]

        if params.get("expand"):
            expanded_results = []
            for result in results:
                expanded_results.append(self._expand(request, result))
            results = expanded_results

        data = {
            "count": len(results),
            "total": total_count,
            "offset": 0,
            "results": self.model._resource_schema().load(results, many=True),
        }
        content = self._schema_query_response().dumps(data)
        return create_commercetools_response(request, text=content)
 def get_by_container_key(self, request, container: str, key: str):
     item = self.model._get_by_container_key(container, key)
     if item:
         return create_commercetools_response(request, json=item)
     else:
         return create_commercetools_response(request, status_code=404)
 def health(self, request):
     response = create_commercetools_response(request, json={})
     return response
 def get_by_key(self, request, key):
     obj = self.model.get_by_key(key)
     if obj:
         expanded_data = self._expand(request, obj)
         return create_commercetools_response(request, json=expanded_data)
     return create_commercetools_response(request, status_code=404)