diff --git a/CHANGELOG.md b/CHANGELOG.md index 515d8d18..f48d723c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,11 @@ - **Feature:** Delete Project labels using the new method `DeleteProjectLabels` - **Feature:** List folders using the new method `ListFolders` - **Feature:** Partial Update Organization using the new method `PartialUpdateOrganization` -- `stackitmarketplace`: [v1.2.0](services/stackitmarketplace/CHANGELOG.md#v120-2025-06-06) - - **Fix:** Fixed types for `VendorId`, `ProjectId`, `OrganizationId` and `SubscriptionId` +- `stackitmarketplace`: + - [v1.3.0](services/stackitmarketplace/CHANGELOG.md#v130-2025-06-10) + - **Feature:** Add new field `facets` in `ListCatalogProductsResponse` + - [v1.2.0](services/stackitmarketplace/CHANGELOG.md#v120-2025-06-06) + - **Fix:** Fixed types for `VendorId`, `ProjectId`, `OrganizationId` and `SubscriptionId` ## Release (2025-06-03) diff --git a/services/stackitmarketplace/CHANGELOG.md b/services/stackitmarketplace/CHANGELOG.md index 7f86bdda..d6060db7 100644 --- a/services/stackitmarketplace/CHANGELOG.md +++ b/services/stackitmarketplace/CHANGELOG.md @@ -1,4 +1,7 @@ -# v1.2.0 (2025-06-06) +## v1.3.0 (2025-06-10) +- **Feature:** Add new field `facets` in `ListCatalogProductsResponse` + +## v1.2.0 (2025-06-06) - **Fix:** Fixed types for `VendorId`, `ProjectId`, `OrganizationId` and `SubscriptionId` ## v1.1.3 (2025-06-02) diff --git a/services/stackitmarketplace/pyproject.toml b/services/stackitmarketplace/pyproject.toml index 92e1d1b2..2e0baa11 100644 --- a/services/stackitmarketplace/pyproject.toml +++ b/services/stackitmarketplace/pyproject.toml @@ -3,7 +3,7 @@ name = "stackit-stackitmarketplace" [tool.poetry] name = "stackit-stackitmarketplace" -version = "v1.2.0" +version = "v1.3.0" authors = [ "STACKIT Developer Tools ", ] diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py index 54614c3c..63fcf65b 100644 --- a/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py @@ -47,6 +47,9 @@ from stackit.stackitmarketplace.models.catalog_product_details_vendor import ( CatalogProductDetailsVendor, ) +from stackit.stackitmarketplace.models.catalog_product_facets_value_inner import ( + CatalogProductFacetsValueInner, +) from stackit.stackitmarketplace.models.catalog_product_highlight import ( CatalogProductHighlight, ) diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py index 7f3ca99b..da02d096 100644 --- a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py @@ -28,6 +28,9 @@ from stackit.stackitmarketplace.models.catalog_product_details_vendor import ( CatalogProductDetailsVendor, ) +from stackit.stackitmarketplace.models.catalog_product_facets_value_inner import ( + CatalogProductFacetsValueInner, +) from stackit.stackitmarketplace.models.catalog_product_highlight import ( CatalogProductHighlight, ) diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/catalog_product_facets_value_inner.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/catalog_product_facets_value_inner.py new file mode 100644 index 00000000..4f43790a --- /dev/null +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/catalog_product_facets_value_inner.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + STACKIT Marketplace API + + API to manage STACKIT Marketplace. + + The version of the OpenAPI document: 1 + Contact: marketplace@stackit.cloud + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 docstring might be too long + +from __future__ import annotations + +import json +import pprint +from typing import Any, ClassVar, Dict, List, Optional, Set + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing_extensions import Self + + +class CatalogProductFacetsValueInner(BaseModel): + """ + CatalogProductFacetsValueInner + """ + + count: StrictInt = Field(description="The number of items associated with this facet value.") + value: StrictStr = Field(description="The value of the facet.") + __properties: ClassVar[List[str]] = ["count", "value"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of CatalogProductFacetsValueInner from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of CatalogProductFacetsValueInner from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({"count": obj.get("count"), "value": obj.get("value")}) + return _obj diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/list_catalog_products_response.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/list_catalog_products_response.py index 33aeb97f..68c6af11 100644 --- a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/list_catalog_products_response.py +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/list_catalog_products_response.py @@ -21,6 +21,9 @@ from pydantic import BaseModel, ConfigDict, Field, StrictStr from typing_extensions import Annotated, Self +from stackit.stackitmarketplace.models.catalog_product_facets_value_inner import ( + CatalogProductFacetsValueInner, +) from stackit.stackitmarketplace.models.catalog_product_overview import ( CatalogProductOverview, ) @@ -34,11 +37,14 @@ class ListCatalogProductsResponse(BaseModel): cursor: StrictStr = Field( description="A pagination cursor that represents a position in the dataset. If given, results will be returned from the item after the cursor. If not given, results will be returned from the beginning." ) + facets: Optional[Dict[str, List[CatalogProductFacetsValueInner]]] = Field( + default=None, description="A collection of facets, where each key represents a facet category." + ) items: List[CatalogProductOverview] limit: Union[ Annotated[float, Field(le=100, strict=True, ge=0)], Annotated[int, Field(le=100, strict=True, ge=0)] ] = Field(description="Limit for returned Objects.") - __properties: ClassVar[List[str]] = ["cursor", "items", "limit"] + __properties: ClassVar[List[str]] = ["cursor", "facets", "items", "limit"] model_config = ConfigDict( populate_by_name=True, @@ -77,6 +83,13 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) + # override the default output from pydantic by calling `to_dict()` of each value in facets (dict of array) + _field_dict_of_array = {} + if self.facets: + for _key in self.facets: + if self.facets[_key] is not None: + _field_dict_of_array[_key] = [_item.to_dict() for _item in self.facets[_key]] + _dict["facets"] = _field_dict_of_array # override the default output from pydantic by calling `to_dict()` of each item in items (list) _items = [] if self.items: @@ -98,6 +111,10 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate( { "cursor": obj.get("cursor"), + "facets": dict( + (_k, [CatalogProductFacetsValueInner.from_dict(_item) for _item in _v] if _v is not None else None) + for _k, _v in obj.get("facets", {}).items() + ), "items": ( [CatalogProductOverview.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None