mpt-extension-sdk 4.4.0__py3-none-any.whl → 4.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,6 +21,13 @@ class MPTClient(Session):
21
21
  pool_maxsize=36,
22
22
  ),
23
23
  )
24
+ self.mount(
25
+ "https://",
26
+ HTTPAdapter(
27
+ max_retries=retries,
28
+ pool_maxsize=36,
29
+ ),
30
+ )
24
31
  self.headers.update(
25
32
  {
26
33
  "User-Agent": USER_AGENT,
@@ -102,7 +102,15 @@ def set_processing_template(mpt_client, order_id, template):
102
102
 
103
103
 
104
104
  @wrap_mpt_http_error
105
- def create_asset(mpt_client, order_id, asset):
105
+ def create_asset(mpt_client, asset):
106
+ """Create a new asset."""
107
+ response = mpt_client.post("/commerce/assets", json=asset)
108
+ response.raise_for_status()
109
+ return response.json()
110
+
111
+
112
+ @wrap_mpt_http_error
113
+ def create_order_asset(mpt_client, order_id, asset):
106
114
  """Create a new asset for an order."""
107
115
  response = mpt_client.post(f"/commerce/orders/{order_id}/assets", json=asset)
108
116
  response.raise_for_status()
@@ -110,13 +118,57 @@ def create_asset(mpt_client, order_id, asset):
110
118
 
111
119
 
112
120
  @wrap_mpt_http_error
113
- def update_asset(mpt_client, order_id, asset_id, **kwargs):
121
+ def update_asset(mpt_client, asset_id, **kwargs):
122
+ """Update an asset."""
123
+ response = mpt_client.put(f"/commerce/assets/{asset_id}", json=kwargs)
124
+ response.raise_for_status()
125
+ return response.json()
126
+
127
+
128
+ @wrap_mpt_http_error
129
+ def update_order_asset(mpt_client, order_id, asset_id, **kwargs):
114
130
  """Update an order asset."""
115
131
  response = mpt_client.put(f"/commerce/orders/{order_id}/assets/{asset_id}", json=kwargs)
116
132
  response.raise_for_status()
117
133
  return response.json()
118
134
 
119
135
 
136
+ @wrap_mpt_http_error
137
+ def get_agreement_asset_by_external_id(mpt_client, agreement_id, asset_external_id):
138
+ """Retrieve an agreement asset by external ID."""
139
+ response = mpt_client.get(
140
+ f"/commerce/assets?eq(externalIds.vendor,{asset_external_id})"
141
+ f"&eq(agreement.id,{agreement_id})"
142
+ f"&eq(status,Active)"
143
+ f"&select=agreement.id&limit=1"
144
+ )
145
+ response.raise_for_status()
146
+ assets = response.json()
147
+ return assets["data"][0] if assets["data"] else None
148
+
149
+
150
+ @wrap_mpt_http_error
151
+ def get_asset_by_id(mpt_client, asset_id):
152
+ """Get an asset by ID."""
153
+ response = mpt_client.get(f"/commerce/assets/{asset_id}")
154
+ response.raise_for_status()
155
+ return response.json()
156
+
157
+
158
+ @wrap_mpt_http_error
159
+ def get_order_asset_by_external_id(mpt_client, order_id, asset_external_id):
160
+ """Retrieve an order asset by its external ID."""
161
+ response = mpt_client.get(
162
+ f"/commerce/orders/{order_id}/assets?eq(externalIds.vendor,{asset_external_id})&limit=1",
163
+ )
164
+ response.raise_for_status()
165
+ assets = response.json()
166
+ if assets["$meta"]["pagination"]["total"] == 1:
167
+ return assets["data"][0]
168
+
169
+ return None
170
+
171
+
120
172
  @wrap_mpt_http_error
121
173
  def create_subscription(mpt_client, order_id, subscription):
122
174
  response = mpt_client.post(
@@ -188,6 +240,18 @@ def get_template_by_name(mpt_client, product_id, template_name):
188
240
  return templates["data"][0]
189
241
 
190
242
 
243
+ @wrap_mpt_http_error
244
+ def get_asset_template_by_name(mpt_client, product_id, template_name):
245
+ """Retrieve an asset template by name."""
246
+ rql_filter = f"and(eq(type,Asset),eq(name,{template_name}))"
247
+ url = f"/catalog/products/{product_id}/templates?{rql_filter}&limit=1"
248
+ response = mpt_client.get(url)
249
+ response.raise_for_status()
250
+
251
+ templates = response.json()
252
+ return templates["data"][0] if templates["data"] else None
253
+
254
+
191
255
  @wrap_mpt_http_error
192
256
  def update_agreement(mpt_client, agreement_id, **kwargs):
193
257
  response = mpt_client.put(
@@ -277,21 +341,23 @@ def get_product_items_by_period(
277
341
 
278
342
 
279
343
  def get_agreements_by_ids(mpt_client, ids):
344
+ """Retrieve agreements by their IDs."""
345
+ ids_str = ",".join(ids)
280
346
  rql_query = (
281
- f"and(in(id,({','.join(ids)})),eq(status,Active))"
282
- "&select=lines,parameters,subscriptions,product,listing"
347
+ f"and(in(id,({ids_str})),eq(status,Active))"
348
+ "&select=assets,lines,parameters,subscriptions,product,listing"
283
349
  )
284
350
  return get_agreements_by_query(mpt_client, rql_query)
285
351
 
286
352
 
287
- def get_all_agreements(
288
- mpt_client,
289
- ):
290
- product_condition = f"in(product.id,({','.join(settings.MPT_PRODUCTS_IDS)}))"
353
+ def get_all_agreements(mpt_client):
354
+ """Retrieve all active agreements for specific products."""
355
+ product_ids_str = ",".join(settings.MPT_PRODUCTS_IDS)
356
+ product_condition = f"in(product.id,({product_ids_str}))"
291
357
 
292
358
  return get_agreements_by_query(
293
359
  mpt_client,
294
- f"and(eq(status,Active),{product_condition})&select=lines,parameters,subscriptions,product,listing",
360
+ f"and(eq(status,Active),{product_condition})&select=assets,lines,parameters,subscriptions,product,listing",
295
361
  )
296
362
 
297
363
 
@@ -2,12 +2,17 @@ import json
2
2
  from functools import wraps
3
3
 
4
4
  from requests import HTTPError, JSONDecodeError
5
+ from requests.exceptions import RetryError
5
6
 
6
7
 
7
8
  class MPTError(Exception):
8
9
  pass
9
10
 
10
11
 
12
+ class MPTMaxRetryError(MPTError):
13
+ pass
14
+
15
+
11
16
  class MPTHttpError(MPTError):
12
17
  def __init__(self, status_code: int, content: str):
13
18
  self.status_code = status_code
@@ -46,6 +51,8 @@ def wrap_mpt_http_error(func):
46
51
  raise MPTAPIError(e.response.status_code, e.response.json())
47
52
  except JSONDecodeError:
48
53
  raise MPTHttpError(e.response.status_code, e.response.content.decode())
54
+ except RetryError as e:
55
+ raise MPTMaxRetryError(str(e))
49
56
 
50
57
  return _wrapper
51
58
 
@@ -1,14 +1,16 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: mpt-extension-sdk
3
- Version: 4.4.0
3
+ Version: 4.6.0
4
4
  Summary: Extensions SDK for SoftwareONE Marketplace Platform
5
5
  License: Apache-2.0
6
+ License-File: LICENSE
6
7
  Author: SoftwareOne AG
7
8
  Requires-Python: >=3.12,<4
8
9
  Classifier: License :: OSI Approved :: Apache Software License
9
10
  Classifier: Programming Language :: Python :: 3
10
11
  Classifier: Programming Language :: Python :: 3.12
11
12
  Classifier: Programming Language :: Python :: 3.13
13
+ Classifier: Programming Language :: Python :: 3.14
12
14
  Requires-Dist: azure-identity (>=1.21.0,<2.0.0)
13
15
  Requires-Dist: azure-keyvault-secrets (>=4.9.0,<5.0.0)
14
16
  Requires-Dist: azure-monitor-opentelemetry-exporter (==1.0.0b25)
@@ -15,10 +15,10 @@ mpt_extension_sdk/flows/pipeline.py,sha256=3BO5X3jvuYnRTWrXRzImjVCVOCut8dSvkT2LZ
15
15
  mpt_extension_sdk/key_vault/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  mpt_extension_sdk/key_vault/base.py,sha256=RVG_Wiq-MrPyngJ4gfUd8oxoh1LUop1SvtCM2xdlx8M,3361
17
17
  mpt_extension_sdk/mpt_http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- mpt_extension_sdk/mpt_http/base.py,sha256=3qgo9BW-uTRAbex26urMvLZU0fwnYnBprDRIJCHvTOk,1284
19
- mpt_extension_sdk/mpt_http/mpt.py,sha256=xmEu6zDJO03j4iC1NYfi0XHXLLZkz6ORydIJvi1copA,14236
18
+ mpt_extension_sdk/mpt_http/base.py,sha256=8-yZZMBXAPcTqODUlcMQ3JroeRxLbjl5irLco9w3pHs,1448
19
+ mpt_extension_sdk/mpt_http/mpt.py,sha256=LI-GL0X57-nT28Bzh0dZ5DCbdZQ4nOuiv_YbU0v63Ho,16483
20
20
  mpt_extension_sdk/mpt_http/utils.py,sha256=3wJTT84CXYGjZw6FksNDX8tIHijkL3Wcmld9r6Iz0xc,95
21
- mpt_extension_sdk/mpt_http/wrap_http_error.py,sha256=j8K6Ddx7NiM-FPRMQi25vuULAW8LXxzZ4EwuIJufxis,1801
21
+ mpt_extension_sdk/mpt_http/wrap_http_error.py,sha256=_f366ZFEJ59hyWYVj_RjkVv-fe5sM0XvJBAy6iQCvqc,1964
22
22
  mpt_extension_sdk/runtime/__init__.py,sha256=PQSAz9qvXHbxrn4KvuXSHB8y-A4Jpgbm6ZV-wPiNPyw,194
23
23
  mpt_extension_sdk/runtime/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  mpt_extension_sdk/runtime/commands/django.py,sha256=j0UC9WKhaTi-sxwV4F-ZF3SE-657-Ucu_jEG0mIzJU4,1229
@@ -46,8 +46,8 @@ mpt_extension_sdk/runtime/workers.py,sha256=8KdI6neBEiMcc0zha8toCsZutvK2BhEXxb8N
46
46
  mpt_extension_sdk/swo_rql/__init__.py,sha256=QrvRDYhpK-Pd3OF-U2aMeazuKm_kbvXwLRIjd9Mm6ok,104
47
47
  mpt_extension_sdk/swo_rql/constants.py,sha256=39BZ78OzdU_dIQtoy-Z_5utXqEXRweIFvM9Zfxg9j5M,171
48
48
  mpt_extension_sdk/swo_rql/query_builder.py,sha256=XAoMYV1jaAouYjpqrh8nMaDNzD0as-BhMx8rsvdeZ0k,10500
49
- mpt_extension_sdk-4.4.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
50
- mpt_extension_sdk-4.4.0.dist-info/METADATA,sha256=fo481WyKgGnxl0zVaFc7gqZ0EDLyXOAmLPuo0CQUnTo,1635
51
- mpt_extension_sdk-4.4.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
52
- mpt_extension_sdk-4.4.0.dist-info/entry_points.txt,sha256=8uZQihFseK4Kp5XWHl9EDYneg-CLS8BFO-ygp0h34nc,143
53
- mpt_extension_sdk-4.4.0.dist-info/RECORD,,
49
+ mpt_extension_sdk-4.6.0.dist-info/METADATA,sha256=OwtVphzLngqSj0g-zrmKlHiab6YwKa1ZhkyQGHf469c,1708
50
+ mpt_extension_sdk-4.6.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
51
+ mpt_extension_sdk-4.6.0.dist-info/entry_points.txt,sha256=8uZQihFseK4Kp5XWHl9EDYneg-CLS8BFO-ygp0h34nc,143
52
+ mpt_extension_sdk-4.6.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
53
+ mpt_extension_sdk-4.6.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any