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