contentstack-management 1.10.2__tar.gz → 1.11.1__tar.gz

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.
Files changed (83) hide show
  1. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/PKG-INFO +1 -1
  2. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/__init__.py +1 -1
  3. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/entries/entry.py +27 -12
  4. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/entry_variants/entry_variants.py +118 -18
  5. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management.egg-info/PKG-INFO +1 -1
  6. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/LICENSE +0 -0
  7. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/README.md +0 -0
  8. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/_api_client.py +0 -0
  9. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/_constant.py +0 -0
  10. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/_errors.py +0 -0
  11. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/_messages.py +0 -0
  12. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/aliases/__init__.py +0 -0
  13. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/aliases/aliases.py +0 -0
  14. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/assets/__init__.py +0 -0
  15. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/assets/assets.py +0 -0
  16. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/auditlogs/__init__.py +0 -0
  17. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/auditlogs/auditlog.py +0 -0
  18. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/branches/__init__.py +0 -0
  19. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/branches/branches.py +0 -0
  20. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/bulk_operations/__init__.py +0 -0
  21. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/bulk_operations/bulk_operation.py +0 -0
  22. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/common.py +0 -0
  23. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/content_types/__init__.py +0 -0
  24. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/content_types/content_type.py +0 -0
  25. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/contentstack.py +0 -0
  26. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/delivery_token/__init__.py +0 -0
  27. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/delivery_token/delivery_token.py +0 -0
  28. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/endpoint.py +0 -0
  29. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/entries/__init__.py +0 -0
  30. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/entry_variants/__init__.py +0 -0
  31. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/environments/__init__.py +0 -0
  32. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/environments/environment.py +0 -0
  33. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/extensions/__init__.py +0 -0
  34. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/extensions/extension.py +0 -0
  35. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/global_fields/__init__.py +0 -0
  36. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/global_fields/global_fields.py +0 -0
  37. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/labels/__init__.py +0 -0
  38. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/labels/label.py +0 -0
  39. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/locale/__init__.py +0 -0
  40. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/locale/locale.py +0 -0
  41. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/management_token/__init__.py +0 -0
  42. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/management_token/management_token.py +0 -0
  43. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/metadata/__init__.py +0 -0
  44. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/metadata/metadata.py +0 -0
  45. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/oauth/__init__.py +0 -0
  46. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/oauth/oauth_handler.py +0 -0
  47. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/oauth/oauth_interceptor.py +0 -0
  48. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/organizations/__init__.py +0 -0
  49. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/organizations/organization.py +0 -0
  50. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/publish_queue/__init__.py +0 -0
  51. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/publish_queue/publish_queue.py +0 -0
  52. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/region_refresh.py +0 -0
  53. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/release_items/__init__.py +0 -0
  54. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/release_items/release_item.py +0 -0
  55. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/releases/__init__.py +0 -0
  56. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/releases/release.py +0 -0
  57. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/roles/__init__.py +0 -0
  58. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/roles/roles.py +0 -0
  59. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/stack/__init__.py +0 -0
  60. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/stack/stack.py +0 -0
  61. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/taxonomies/__init__.py +0 -0
  62. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/taxonomies/taxonomy.py +0 -0
  63. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/terms/__init__.py +0 -0
  64. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/terms/terms.py +0 -0
  65. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/user_session/__init__.py +0 -0
  66. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/user_session/user_session.py +0 -0
  67. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/users/__init__.py +0 -0
  68. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/users/user.py +0 -0
  69. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/variant_group/__init__.py +0 -0
  70. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/variant_group/variant_group.py +0 -0
  71. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/variants/__init__.py +0 -0
  72. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/variants/variants.py +0 -0
  73. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/webhooks/__init__.py +0 -0
  74. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/webhooks/webhook.py +0 -0
  75. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/workflows/__init__.py +0 -0
  76. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management/workflows/workflows.py +0 -0
  77. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management.egg-info/SOURCES.txt +0 -0
  78. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management.egg-info/dependency_links.txt +0 -0
  79. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management.egg-info/requires.txt +0 -0
  80. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/contentstack_management.egg-info/top_level.txt +0 -0
  81. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/setup.cfg +0 -0
  82. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/setup.py +0 -0
  83. {contentstack_management-1.10.2 → contentstack_management-1.11.1}/tests/test_contentstack.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: contentstack-management
3
- Version: 1.10.2
3
+ Version: 1.11.1
4
4
  Summary: Contentstack API Client Library for Python
5
5
  Home-page: https://github.com/contentstack/contentstack-management-python
6
6
  Author: dev-ex
@@ -102,7 +102,7 @@ __title__ = 'contentstack-management-python'
102
102
  __author__ = 'dev-ex'
103
103
  __status__ = 'debug'
104
104
  __region__ = 'na'
105
- __version__ = '1.10.2'
105
+ __version__ = '1.11.1'
106
106
  __host__ = 'api.contentstack.io'
107
107
  __protocol__ = 'https://'
108
108
  __api_version__ = 'v3'
@@ -423,13 +423,15 @@ class Entry(Parameter):
423
423
  data = json.dumps(data)
424
424
  return self.client.post(url, headers = self.client.headers, data = data, params = self.params)
425
425
 
426
- def variants(self, variant_uid: str = None):
426
+ def variants(self, *args):
427
427
  """
428
428
  Returns an EntryVariants instance for managing variant entries.
429
-
430
- :param variant_uid: The `variant_uid` parameter is a string that represents the unique identifier of
431
- the variant. It is used to specify which variant to work with
432
- :type variant_uid: str
429
+
430
+ Pass no arguments when no ``branch`` header is required, one positional argument for the
431
+ branch UID only (sent as the ``branch`` request header), or two
432
+ arguments ``(variant_uid, branch)`` for a specific variant on a branch.
433
+
434
+ :param args: ``()`` | ``(branch,)`` | ``(variant_uid, branch)``
433
435
  :return: EntryVariants instance for managing variant entries
434
436
  -------------------------------
435
437
  [Example:]
@@ -438,13 +440,26 @@ class Entry(Parameter):
438
440
  >>> client = contentstack_management.Client(authtoken='your_authtoken')
439
441
  >>> # Get all variant entries
440
442
  >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().query().find().json()
441
- >>> # Get specific variant entry
442
- >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid').fetch().json()
443
-
444
- -------------------------------
445
- """
446
-
447
- return EntryVariants(self.client, self.content_type_uid, self.entry_uid, variant_uid)
443
+ >>> # Variant operations on a branch (branch header only)
444
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('branch_uid').query().find().json()
445
+ >>> # Specific variant on a branch
446
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid', 'branch_uid').fetch().json()
447
+
448
+ -------------------------------
449
+ """
450
+ variant_uid = None
451
+ branch = None
452
+ if len(args) == 1:
453
+ branch = args[0]
454
+ elif len(args) == 2:
455
+ variant_uid, branch = args[0], args[1]
456
+ elif len(args) > 2:
457
+ raise TypeError(
458
+ f"variants() takes at most 2 positional arguments ({len(args)} given)"
459
+ )
460
+ return EntryVariants(
461
+ self.client, self.content_type_uid, self.entry_uid, variant_uid, branch
462
+ )
448
463
 
449
464
  def includeVariants(self, include_variants: str = 'true', variant_uid: str = None, params: dict = None):
450
465
  """
@@ -1,28 +1,49 @@
1
1
  """This class takes a base URL as an argument when it's initialized,
2
2
  which is the endpoint for the RESTFUL API that we'll be interacting with.
3
- The query(), create(), fetch(), delete(), update(), versions(), and includeVariants() methods each correspond to
3
+ The query(), create(), fetch(), delete(), update(), versions(), includeVariants(), publish(), and unpublish() methods each correspond to
4
4
  the operations that can be performed on the API """
5
5
 
6
6
  import json
7
7
  from ..common import Parameter
8
8
  from .._errors import ArgumentException
9
- from .._messages import ENTRY_VARIANT_CONTENT_TYPE_UID_REQUIRED, ENTRY_VARIANT_ENTRY_UID_REQUIRED, ENTRY_VARIANT_UID_REQUIRED
9
+ from .._messages import (
10
+ ENTRY_BODY_REQUIRED,
11
+ ENTRY_VARIANT_CONTENT_TYPE_UID_REQUIRED,
12
+ ENTRY_VARIANT_ENTRY_UID_REQUIRED,
13
+ ENTRY_VARIANT_UID_REQUIRED,
14
+ )
10
15
 
11
16
  class EntryVariants(Parameter):
12
17
  """
13
18
  This class takes a base URL as an argument when it's initialized,
14
19
  which is the endpoint for the RESTFUL API that
15
- we'll be interacting with. The query(), create(), fetch(), delete(), update(), versions(), and includeVariants()
16
- methods each correspond to the operations that can be performed on the API """
20
+ we'll be interacting with. The query(), create(), fetch(), delete(), update(), versions(),
21
+ includeVariants(), publish(), and unpublish() methods each correspond to the operations that can be
22
+ performed on the API. Optional ``branch`` scopes requests to a stack branch via the ``branch`` header. """
17
23
 
18
- def __init__(self, client, content_type_uid: str, entry_uid: str, variant_uid: str = None):
24
+ def __init__(
25
+ self,
26
+ client,
27
+ content_type_uid: str,
28
+ entry_uid: str,
29
+ variant_uid: str = None,
30
+ branch: str = None,
31
+ ):
19
32
  self.client = client
20
33
  self.content_type_uid = content_type_uid
21
34
  self.entry_uid = entry_uid
22
35
  self.variant_uid = variant_uid
36
+ self.branch = branch if branch else None
23
37
  super().__init__(self.client)
24
38
  self.path = f"content_types/{content_type_uid}/entries/{entry_uid}/variants"
25
39
 
40
+ def _headers(self):
41
+ """Merge optional branch into request headers without mutating the client."""
42
+ if not self.branch:
43
+ return self.client.headers
44
+ headers = dict(self.client.headers)
45
+ headers["branch"] = self.branch
46
+ return headers
26
47
 
27
48
  def find(self, params: dict = None):
28
49
  """
@@ -47,7 +68,7 @@ class EntryVariants(Parameter):
47
68
  self.validate_entry_uid()
48
69
  if params is not None:
49
70
  self.params.update(params)
50
- return self.client.get(self.path, headers = self.client.headers, params = self.params)
71
+ return self.client.get(self.path, headers=self._headers(), params=self.params)
51
72
 
52
73
  def create(self, data: dict):
53
74
  """
@@ -79,7 +100,7 @@ class EntryVariants(Parameter):
79
100
  self.validate_content_type_uid()
80
101
  self.validate_entry_uid()
81
102
  data = json.dumps(data)
82
- return self.client.post(self.path, headers = self.client.headers, data=data, params = self.params)
103
+ return self.client.post(self.path, headers=self._headers(), data=data, params=self.params)
83
104
 
84
105
  def fetch(self, variant_uid: str = None, params: dict = None):
85
106
  """
@@ -96,9 +117,11 @@ class EntryVariants(Parameter):
96
117
 
97
118
  >>> import contentstack_management
98
119
  >>> client = contentstack_management.Client(authtoken='your_authtoken')
99
- >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid').fetch().json()
120
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().fetch('variant_uid').json()
100
121
  >>> # With parameters
101
- >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid').fetch(params={'include_count': True}).json()
122
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().fetch('variant_uid', params={'include_count': True}).json()
123
+ >>> # On a branch
124
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid', 'branch_uid').fetch().json()
102
125
 
103
126
  -------------------------------
104
127
  """
@@ -112,7 +135,7 @@ class EntryVariants(Parameter):
112
135
  if params is not None:
113
136
  self.params.update(params)
114
137
  url = f"{self.path}/{self.variant_uid}"
115
- return self.client.get(url, headers = self.client.headers, params = self.params)
138
+ return self.client.get(url, headers=self._headers(), params=self.params)
116
139
 
117
140
  def delete(self, variant_uid: str = None):
118
141
  """
@@ -128,7 +151,7 @@ class EntryVariants(Parameter):
128
151
 
129
152
  >>> import contentstack_management
130
153
  >>> client = contentstack_management.Client(authtoken='your_authtoken')
131
- >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid').delete().json()
154
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().delete('variant_uid').json()
132
155
 
133
156
  -------------------------------
134
157
  """
@@ -138,7 +161,7 @@ class EntryVariants(Parameter):
138
161
  self.validate_entry_uid()
139
162
  self.validate_variant_uid()
140
163
  url = f"{self.path}/{self.variant_uid}"
141
- return self.client.delete(url, headers = self.client.headers, params = self.params)
164
+ return self.client.delete(url, headers=self._headers(), params=self.params)
142
165
 
143
166
  def update(self, data: dict, variant_uid: str = None):
144
167
  """
@@ -167,7 +190,7 @@ class EntryVariants(Parameter):
167
190
  >>> }
168
191
  >>> import contentstack_management
169
192
  >>> client = contentstack_management.Client(authtoken='your_authtoken')
170
- >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid').update(data).json()
193
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().update(data, 'variant_uid').json()
171
194
 
172
195
  -------------------------------
173
196
  """
@@ -178,7 +201,7 @@ class EntryVariants(Parameter):
178
201
  self.validate_variant_uid()
179
202
  url = f"{self.path}/{self.variant_uid}"
180
203
  data = json.dumps(data)
181
- return self.client.put(url, headers = self.client.headers, data=data, params = self.params)
204
+ return self.client.put(url, headers=self._headers(), data=data, params=self.params)
182
205
 
183
206
  def versions(self, variant_uid: str = None, params: dict = None):
184
207
  """
@@ -195,9 +218,9 @@ class EntryVariants(Parameter):
195
218
 
196
219
  >>> import contentstack_management
197
220
  >>> client = contentstack_management.Client(authtoken='your_authtoken')
198
- >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid').versions().json()
221
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().versions('variant_uid').json()
199
222
  >>> # With parameters
200
- >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants('variant_uid').versions(params={'limit': 10}).json()
223
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().versions('variant_uid', params={'limit': 10}).json()
201
224
 
202
225
  -------------------------------
203
226
  """
@@ -209,7 +232,7 @@ class EntryVariants(Parameter):
209
232
  if params is not None:
210
233
  self.params.update(params)
211
234
  url = f"{self.path}/{self.variant_uid}/versions"
212
- return self.client.get(url, headers = self.client.headers, params = self.params)
235
+ return self.client.get(url, headers=self._headers(), params=self.params)
213
236
 
214
237
  def includeVariants(self, include_variants: str = 'true', variant_uid: str = None, params: dict = None):
215
238
  """
@@ -243,8 +266,85 @@ class EntryVariants(Parameter):
243
266
  self.params.update(params)
244
267
  self.params['include_variants'] = include_variants
245
268
  url = f"content_types/{self.content_type_uid}/entries/{self.entry_uid}"
246
- return self.client.get(url, headers = self.client.headers, params = self.params)
269
+ return self.client.get(url, headers=self._headers(), params=self.params)
247
270
 
271
+ def publish(self, data: dict):
272
+ """
273
+ Publish the entry for this content type and entry UID (CMA ``.../entries/{entry_uid}/publish``).
274
+
275
+ For entry variants, the body typically includes ``entry.environments``, ``entry.locales``,
276
+ ``entry.variants`` (list of ``{"uid", "version"}`` per variant), optional ``entry.variant_rules``,
277
+ and top-level ``locale`` (and optional scheduling fields supported by the API).
278
+
279
+ :param data: Publish payload dict (serialized as JSON).
280
+ :return: Response from the publish request.
281
+ -------------------------------
282
+ [Example:]
283
+
284
+ >>> data = {
285
+ >>> "entry": {
286
+ >>> "environments": ["production"],
287
+ >>> "locales": ["en-us"],
288
+ >>> "variants": [
289
+ >>> {"uid": "variant_uid", "version": 1}
290
+ >>> ],
291
+ >>> "variant_rules": {
292
+ >>> "publish_latest_base": False,
293
+ >>> "publish_latest_base_conditionally": True
294
+ >>> }
295
+ >>> },
296
+ >>> "locale": "en-us"
297
+ >>> }
298
+ >>> import contentstack_management
299
+ >>> client = contentstack_management.Client(authtoken='your_authtoken')
300
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().publish(data).json()
301
+
302
+ -------------------------------
303
+ """
304
+ self.validate_content_type_uid()
305
+ self.validate_entry_uid()
306
+ if data is None:
307
+ raise Exception(ENTRY_BODY_REQUIRED)
308
+ url = f"content_types/{self.content_type_uid}/entries/{self.entry_uid}/publish"
309
+ data = json.dumps(data)
310
+ return self.client.post(url, headers=self._headers(), data=data, params=self.params)
311
+
312
+ def unpublish(self, data: dict):
313
+ """
314
+ Unpublish the entry for this content type and entry UID (CMA ``.../entries/{entry_uid}/unpublish``).
315
+
316
+ For entry variants, the body typically includes ``entry.environments``, ``entry.locales``,
317
+ ``entry.variants`` (list of ``{"uid", "version"}`` per variant), and top-level ``locale``.
318
+
319
+ :param data: Unpublish payload dict (serialized as JSON).
320
+ :return: Response from the unpublish request.
321
+ -------------------------------
322
+ [Example:]
323
+
324
+ >>> data = {
325
+ >>> "entry": {
326
+ >>> "environments": ["environment_uid"],
327
+ >>> "locales": ["en-us"],
328
+ >>> "variants": [
329
+ >>> {"uid": "variant_uid", "version": 1}
330
+ >>> ]
331
+ >>> },
332
+ >>> "locale": "en-us"
333
+ >>> }
334
+ >>> import contentstack_management
335
+ >>> client = contentstack_management.Client(authtoken='your_authtoken')
336
+ >>> result = client.stack('api_key').content_types('content_type_uid').entry('entry_uid').variants().unpublish(data).json()
337
+
338
+ -------------------------------
339
+ """
340
+ self.validate_content_type_uid()
341
+ self.validate_entry_uid()
342
+ if data is None:
343
+ raise Exception(ENTRY_BODY_REQUIRED)
344
+ url = f"content_types/{self.content_type_uid}/entries/{self.entry_uid}/unpublish"
345
+ data = json.dumps(data)
346
+ return self.client.post(url, headers=self._headers(), data=data, params=self.params)
347
+
248
348
  def validate_content_type_uid(self):
249
349
  """
250
350
  The function checks if the content_type_uid is None or an empty string and raises an ArgumentException
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: contentstack-management
3
- Version: 1.10.2
3
+ Version: 1.11.1
4
4
  Summary: Contentstack API Client Library for Python
5
5
  Home-page: https://github.com/contentstack/contentstack-management-python
6
6
  Author: dev-ex