From 058aa652cc50fcadacb75d7aad79ec69fba121f3 Mon Sep 17 00:00:00 2001 From: SDK Generator Bot Date: Tue, 14 Oct 2025 14:57:34 +0000 Subject: [PATCH 1/2] Generate stackitmarketplace --- .../stackit/stackitmarketplace/__init__.py | 12 +++ .../stackitmarketplace/models/__init__.py | 9 ++ .../stackitmarketplace/models/assets.py | 47 +++++++++- .../assets_end_user_license_agreement.py | 89 +++++++++++++++++++ .../models/assets_product_description.py | 89 +++++++++++++++++++ .../models/assets_service_level_agreement.py | 89 +++++++++++++++++++ .../models/error_response.py | 16 +++- 7 files changed, 348 insertions(+), 3 deletions(-) create mode 100644 services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_end_user_license_agreement.py create mode 100644 services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_product_description.py create mode 100644 services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_service_level_agreement.py diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py index 463421676..147b7aca2 100644 --- a/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/__init__.py @@ -31,6 +31,9 @@ "ApiException", "ApproveSubscriptionPayload", "Assets", + "AssetsEndUserLicenseAgreement", + "AssetsProductDescription", + "AssetsServiceLevelAgreement", "BecomeVendor", "CatalogPricingOptionHighlight", "CatalogProductDetail", @@ -92,6 +95,15 @@ ApproveSubscriptionPayload as ApproveSubscriptionPayload, ) from stackit.stackitmarketplace.models.assets import Assets as Assets +from stackit.stackitmarketplace.models.assets_end_user_license_agreement import ( + AssetsEndUserLicenseAgreement as AssetsEndUserLicenseAgreement, +) +from stackit.stackitmarketplace.models.assets_product_description import ( + AssetsProductDescription as AssetsProductDescription, +) +from stackit.stackitmarketplace.models.assets_service_level_agreement import ( + AssetsServiceLevelAgreement as AssetsServiceLevelAgreement, +) from stackit.stackitmarketplace.models.become_vendor import BecomeVendor as BecomeVendor from stackit.stackitmarketplace.models.catalog_pricing_option_highlight import ( CatalogPricingOptionHighlight as CatalogPricingOptionHighlight, diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py index aaa781e80..880fdfc47 100644 --- a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/__init__.py @@ -19,6 +19,15 @@ ApproveSubscriptionPayload, ) from stackit.stackitmarketplace.models.assets import Assets +from stackit.stackitmarketplace.models.assets_end_user_license_agreement import ( + AssetsEndUserLicenseAgreement, +) +from stackit.stackitmarketplace.models.assets_product_description import ( + AssetsProductDescription, +) +from stackit.stackitmarketplace.models.assets_service_level_agreement import ( + AssetsServiceLevelAgreement, +) from stackit.stackitmarketplace.models.become_vendor import BecomeVendor from stackit.stackitmarketplace.models.catalog_pricing_option_highlight import ( CatalogPricingOptionHighlight, diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets.py index 594ec205e..0461be18b 100644 --- a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets.py +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets.py @@ -21,6 +21,15 @@ from pydantic import BaseModel, ConfigDict, Field from typing_extensions import Self +from stackit.stackitmarketplace.models.assets_end_user_license_agreement import ( + AssetsEndUserLicenseAgreement, +) +from stackit.stackitmarketplace.models.assets_product_description import ( + AssetsProductDescription, +) +from stackit.stackitmarketplace.models.assets_service_level_agreement import ( + AssetsServiceLevelAgreement, +) from stackit.stackitmarketplace.models.service_certificate import ServiceCertificate @@ -29,8 +38,18 @@ class Assets(BaseModel): The assets associated with the product. """ # noqa: E501 + end_user_license_agreement: Optional[AssetsEndUserLicenseAgreement] = Field( + default=None, alias="endUserLicenseAgreement" + ) + product_description: Optional[AssetsProductDescription] = Field(default=None, alias="productDescription") service_certificate: Optional[ServiceCertificate] = Field(default=None, alias="serviceCertificate") - __properties: ClassVar[List[str]] = ["serviceCertificate"] + service_level_agreement: Optional[AssetsServiceLevelAgreement] = Field(default=None, alias="serviceLevelAgreement") + __properties: ClassVar[List[str]] = [ + "endUserLicenseAgreement", + "productDescription", + "serviceCertificate", + "serviceLevelAgreement", + ] model_config = ConfigDict( populate_by_name=True, @@ -69,9 +88,18 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) + # override the default output from pydantic by calling `to_dict()` of end_user_license_agreement + if self.end_user_license_agreement: + _dict["endUserLicenseAgreement"] = self.end_user_license_agreement.to_dict() + # override the default output from pydantic by calling `to_dict()` of product_description + if self.product_description: + _dict["productDescription"] = self.product_description.to_dict() # override the default output from pydantic by calling `to_dict()` of service_certificate if self.service_certificate: _dict["serviceCertificate"] = self.service_certificate.to_dict() + # override the default output from pydantic by calling `to_dict()` of service_level_agreement + if self.service_level_agreement: + _dict["serviceLevelAgreement"] = self.service_level_agreement.to_dict() return _dict @classmethod @@ -85,11 +113,26 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate( { + "endUserLicenseAgreement": ( + AssetsEndUserLicenseAgreement.from_dict(obj["endUserLicenseAgreement"]) + if obj.get("endUserLicenseAgreement") is not None + else None + ), + "productDescription": ( + AssetsProductDescription.from_dict(obj["productDescription"]) + if obj.get("productDescription") is not None + else None + ), "serviceCertificate": ( ServiceCertificate.from_dict(obj["serviceCertificate"]) if obj.get("serviceCertificate") is not None else None - ) + ), + "serviceLevelAgreement": ( + AssetsServiceLevelAgreement.from_dict(obj["serviceLevelAgreement"]) + if obj.get("serviceLevelAgreement") is not None + else None + ), } ) return _obj diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_end_user_license_agreement.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_end_user_license_agreement.py new file mode 100644 index 000000000..500978368 --- /dev/null +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_end_user_license_agreement.py @@ -0,0 +1,89 @@ +# 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 + +from __future__ import annotations + +import json +import pprint +from typing import Any, ClassVar, Dict, List, Optional, Set + +from pydantic import BaseModel, ConfigDict +from typing_extensions import Self + +from stackit.stackitmarketplace.models.localized_version import LocalizedVersion + + +class AssetsEndUserLicenseAgreement(BaseModel): + """ + The related end user license agreement of the (subscription) product. + """ # noqa: E501 + + version: Optional[LocalizedVersion] = None + __properties: ClassVar[List[str]] = ["version"] + + 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 AssetsEndUserLicenseAgreement 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, + ) + # override the default output from pydantic by calling `to_dict()` of version + if self.version: + _dict["version"] = self.version.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AssetsEndUserLicenseAgreement from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"version": LocalizedVersion.from_dict(obj["version"]) if obj.get("version") is not None else None} + ) + return _obj diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_product_description.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_product_description.py new file mode 100644 index 000000000..28c27e1f6 --- /dev/null +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_product_description.py @@ -0,0 +1,89 @@ +# 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 + +from __future__ import annotations + +import json +import pprint +from typing import Any, ClassVar, Dict, List, Optional, Set + +from pydantic import BaseModel, ConfigDict +from typing_extensions import Self + +from stackit.stackitmarketplace.models.localized_version import LocalizedVersion + + +class AssetsProductDescription(BaseModel): + """ + The related product description of the (subscription) product. + """ # noqa: E501 + + version: Optional[LocalizedVersion] = None + __properties: ClassVar[List[str]] = ["version"] + + 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 AssetsProductDescription 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, + ) + # override the default output from pydantic by calling `to_dict()` of version + if self.version: + _dict["version"] = self.version.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AssetsProductDescription from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"version": LocalizedVersion.from_dict(obj["version"]) if obj.get("version") is not None else None} + ) + return _obj diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_service_level_agreement.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_service_level_agreement.py new file mode 100644 index 000000000..7c5a9f475 --- /dev/null +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/assets_service_level_agreement.py @@ -0,0 +1,89 @@ +# 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 + +from __future__ import annotations + +import json +import pprint +from typing import Any, ClassVar, Dict, List, Optional, Set + +from pydantic import BaseModel, ConfigDict +from typing_extensions import Self + +from stackit.stackitmarketplace.models.localized_version import LocalizedVersion + + +class AssetsServiceLevelAgreement(BaseModel): + """ + The related service level agreement of the (subscription) product. + """ # noqa: E501 + + version: Optional[LocalizedVersion] = None + __properties: ClassVar[List[str]] = ["version"] + + 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 AssetsServiceLevelAgreement 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, + ) + # override the default output from pydantic by calling `to_dict()` of version + if self.version: + _dict["version"] = self.version.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AssetsServiceLevelAgreement from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate( + {"version": LocalizedVersion.from_dict(obj["version"]) if obj.get("version") is not None else None} + ) + return _obj diff --git a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/error_response.py b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/error_response.py index 007e6ffd0..37d82a26c 100644 --- a/services/stackitmarketplace/src/stackit/stackitmarketplace/models/error_response.py +++ b/services/stackitmarketplace/src/stackit/stackitmarketplace/models/error_response.py @@ -16,10 +16,11 @@ import json import pprint +import re # noqa: F401 from datetime import datetime from typing import Any, ClassVar, Dict, List, Optional, Set -from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, field_validator from typing_extensions import Self @@ -35,6 +36,19 @@ class ErrorResponse(BaseModel): time_stamp: datetime = Field(description="Timestamp at which the error occurred.", alias="timeStamp") __properties: ClassVar[List[str]] = ["error", "message", "path", "status", "timeStamp"] + @field_validator("time_stamp", mode="before") + def time_stamp_change_year_zero_to_one(cls, value): + """Workaround which prevents year 0 issue""" + if isinstance(value, str): + # Check for year "0000" at the beginning of the string + # This assumes common date formats like YYYY-MM-DDTHH:MM:SS+00:00 or YYYY-MM-DDTHH:MM:SSZ + if value.startswith("0000-01-01T") and re.match( + r"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\+\d{2}:\d{2}|Z)$", value + ): + # Workaround: Replace "0000" with "0001" + return "0001" + value[4:] # Take "0001" and append the rest of the string + return value + model_config = ConfigDict( populate_by_name=True, validate_assignment=True, From 8d593b45902890d8e39b2f236cc7663ac20905a8 Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Tue, 14 Oct 2025 17:15:12 +0200 Subject: [PATCH 2/2] Add changelogs Signed-off-by: Alexander Dahmen --- CHANGELOG.md | 2 ++ services/stackitmarketplace/CHANGELOG.md | 3 +++ services/stackitmarketplace/pyproject.toml | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49e761fc3..7b106a961 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ ## Release (2025-xx-xx) +- `stackitmarketplace`: [v1.15.0](services/stackitmarketplace/CHANGELOG.md#v1150) + - **Feature:** Add `EndUserLicenseAgreement`, `ProductDescription` and `ServiceLevelAgreement` attributes and add them to `Assets` struct - `postgresflex`: [v1.2.0](services/postgresflex/CHANGELOG.md#v120) - **Breaking Change:** The attribute type for `PartialUpdateInstancePayload` and `UpdateInstancePayload` changed from `Storage` to `StorageUpdate`. - **Deprecation:** `StorageUpdate`: updating the performance class field is not possible. diff --git a/services/stackitmarketplace/CHANGELOG.md b/services/stackitmarketplace/CHANGELOG.md index e53a9cff5..62a6ed3bc 100644 --- a/services/stackitmarketplace/CHANGELOG.md +++ b/services/stackitmarketplace/CHANGELOG.md @@ -1,3 +1,6 @@ +## v1.15.0 +- **Feature:** Add `EndUserLicenseAgreement`, `ProductDescription` and `ServiceLevelAgreement` attributes and add them to `Assets` struct + ## v1.14.0 - **Feature:** Add `has_private_plan_option` attribute to `CatalogProductDetail` model class diff --git a/services/stackitmarketplace/pyproject.toml b/services/stackitmarketplace/pyproject.toml index f14fb8d2e..03e603802 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.14.0" +version = "v1.15.0" authors = [ "STACKIT Developer Tools ", ]