Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

## Content Management SDK For Python
---
## v1.4.0

#### Date: 26 May 2025

- Release 2.0 support.
---
## v1.3.3

#### Date: 12 May 2025
Expand Down
2 changes: 1 addition & 1 deletion contentstack_management/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
__author__ = 'dev-ex'
__status__ = 'debug'
__region__ = 'na'
__version__ = '1.3.3'
__version__ = '1.4.0'
__host__ = 'api.contentstack.io'
__protocol__ = 'https://'
__api_version__ = 'v3'
Expand Down
2 changes: 0 additions & 2 deletions contentstack_management/auditlogs/auditlog.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
The create(), read(), update(), and delete() methods each correspond to
the CRUD operations that can be performed on the API """

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class Auditlog(Parameter):
Expand Down
92 changes: 92 additions & 0 deletions contentstack_management/bulk_operations/bulk_operation.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,96 @@ def update(self, data: dict):
data = json.dumps(data)
return self.client.post(url, headers = self.client.headers, data = data, params=self.params)

def add_items(self, data: dict, headers: dict = None):
"""
The Add items to bulk operation request allows you to add multiple entries and assets to a bulk operation.

:return: The `add_items` method is returning the result of the `post` request made by the
`client.post` method.
-------------------------------
[Example:]
>>> data = {
>>> "release": "release_uid"
>>> "action": "publish",
>>> "locale": ["en-us", "hi-in"]
>>> "reference": true
>>> "items": [
>>> {
>>> "uid": "blt63177c0f00f20b61",
>>> "content_type_uid": "my_blog"
>>> }
>>> ]
>>> }
>>> import contentstack_management
>>> client = contentstack_management.Client(authtoken='your_authtoken')
>>> result = client.stack('api_key').bulk_operation().add_items(data).json()

-------------------------------
"""
if headers is not None:
self.client.headers.update(headers)
url = f"{self.path}/release/items"
data = json.dumps(data)
return self.client.post(url, headers = self.client.headers, data = data, params=self.params)

def update_items(self, data: dict, headers: dict = None):
"""
The update items to bulk operation request allows you to update multiple entries and assets to a bulk operation.

:return: The `update_items` method is returning the result of the `put` request made by the
`client.post` method.
-------------------------------
[Example:]
>>> data = {
>>> "release": "release_uid",
>>> "items": [
>>> {
>>> "uid": "entry_uid",
>>> "locale": "en-us"
>>> },
>>> {
>>> "uid": "entry_uid",
>>> "locale": "en-us",
>>> "variant_id": "entry_variant_id"
>>> }
>>> ]
>>> or
>>> [ '$all' ]
>>> }
>>> import contentstack_management
>>> client = contentstack_management.Client(authtoken='your_authtoken')
>>> result = client.stack('api_key').bulk_operation().update_items(data).json()

-------------------------------
"""
if headers is not None:
self.client.headers.update(headers)
url = f"{self.path}/release/update_items"
data = json.dumps(data)
return self.client.put(url, headers = self.client.headers, data = data, params=self.params)

def job_status(self, job_uid: str, headers: dict = None):
"""
The Job status request allows you to get the status of a bulk operation job.

:param job_uid: The `job_uid` parameter is a string that represents the unique identifier of the job
whose status you want to retrieve
:type job_uid: str
:return: The `job_status` method is returning the result of the `get` request made by the
`client.get` method.
-------------------------------
[Example:]
>>> import contentstack_management
>>> client = contentstack_management.Client(authtoken='your_authtoken')
>>> result = client.stack('api_key').bulk_operation().job_status('job_uid').json()

-------------------------------
"""
if job_uid is None:
raise ArgumentException("job_uid", "job_uid cannot be None")
if headers is not None:
self.client.headers.update(headers)
url = f"{self.path}/jobs/{quote(job_uid)}"
return self.client.get(url, headers = self.client.headers, params=self.params)


2 changes: 1 addition & 1 deletion contentstack_management/content_types/content_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ def imports(self, file_path):
>>> response = content_type.imports()
--------------------------------
"""
url = f"content_types/import"
url = "content_types/import"
self.client.headers['Content-Type'] = "multipart/form-data"
files = {'content_type': open(f"{file_path}", 'rb')}
return self.client.post(url, headers=self.client.headers, params=self.params, files=files)
Expand Down
1 change: 0 additions & 1 deletion contentstack_management/contentstack.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import contentstack_management
from enum import Enum
from ._api_client import _APIClient
from contentstack_management.organizations import organization
Expand Down
1 change: 0 additions & 1 deletion contentstack_management/delivery_token/delivery_token.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class DeliveryToken(Parameter):
Expand Down
1 change: 0 additions & 1 deletion contentstack_management/environments/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class Environment(Parameter):
Expand Down
1 change: 0 additions & 1 deletion contentstack_management/extensions/extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException
from requests_toolbelt.multipart.encoder import MultipartEncoder

Expand Down
1 change: 0 additions & 1 deletion contentstack_management/labels/label.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class Label(Parameter):
Expand Down
1 change: 0 additions & 1 deletion contentstack_management/locale/locale.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class Locale(Parameter):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class ManagementToken(Parameter):
Expand Down
1 change: 0 additions & 1 deletion contentstack_management/metadata/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class Metadata(Parameter):
Expand Down
2 changes: 0 additions & 2 deletions contentstack_management/publish_queue/publish_queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
The create(), read(), update(), and delete() methods each correspond to
the CRUD operations that can be performed on the API """

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class PublishQueue(Parameter):
Expand Down
45 changes: 43 additions & 2 deletions contentstack_management/release_items/release_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class ReleaseItems(Parameter):
Expand All @@ -16,11 +15,13 @@ class ReleaseItems(Parameter):
methods each correspond to the CRUD
operations that can be performed on the API """

def __init__(self, client, release_uid: str):
def __init__(self, client, release_uid: str, headers: dict = None):
self.client = client
self.release_uid = release_uid
super().__init__(self.client)
self.path = f"releases/{self.release_uid}"
if headers:
self.add_header_dict(headers)

def find(self):
"""
Expand Down Expand Up @@ -204,6 +205,46 @@ def delete_multiple(self, data: dict):
data = json.dumps(data)
return self.client.delete(url, headers = self.client.headers, data=data, params = self.params)

def move(self, data: dict):
"""
The "Move items to a different Release" request allows you to move one or more items (entries and/or assets) from one Release to another Release.

:param data: The `data` parameter is a dictionary that contains the data to be sent in the
request body. It will be converted to a JSON string using the `json.dumps()` function before
being sent in the request
:type data: dict
:return: the result of the `post` method call on the `self.client` object.

-------------------------------
[Example:]
>>> data ={
>>> "release_uid": "targe_release_uid",
>>> "item": [
>>> {
>>> "uid": "entry_uid",
>>> "locale": "en-us"
>>> },
>>> {
>>> "uid": "entry_uid",
>>> "locale": "en-us",
>>> "variant_id": "entry_variant_id"
>>> }
>>> ]
>>> }
>>> import contentstack_management
>>> client = contentstack_management.Client(authtoken='your_authtoken')
>>> result = result = client.stack('api_key').releases('release_uid').item().move(data)

-------------------------------
"""

self.validate_release_uid()
url = f"{self.path}/items/move"
data = json.dumps(data)
return self.client.post(url, headers = self.client.headers, data=data, params = self.params)



def validate_release_uid(self):
if self.release_uid is None or '':
raise ArgumentException('Releases Uid is required')
Expand Down
10 changes: 6 additions & 4 deletions contentstack_management/releases/release.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException
from ..release_items.release_item import ReleaseItems

Expand All @@ -14,11 +13,14 @@ class Releases(Parameter):
You can define a “Release” as a set of entries and assets that needs to be deployed (published or unpublished) all at once to a particular environment.
"""

def __init__(self, client, release_uid: str):
def __init__(self, client, release_uid: str, headers: dict = None):
self.client = client
self.release_uid = release_uid
super().__init__(self.client)
self.path = "releases"
if headers:
self.add_header_dict(headers)


def find(self):
"""
Expand Down Expand Up @@ -192,8 +194,8 @@ def validate_uid(self):
if self.release_uid is None or '':
raise ArgumentException("Releases Uid is required")

def item(self):
def item(self, headers: dict = None):
self.validate_uid()
return ReleaseItems(self.client, self.release_uid)
return ReleaseItems(self.client, self.release_uid, headers)


1 change: 0 additions & 1 deletion contentstack_management/roles/roles.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class Roles(Parameter):
Expand Down
5 changes: 2 additions & 3 deletions contentstack_management/stack/stack.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import json
from .._errors import ArgumentException
from ..aliases.aliases import Alias
from ..assets.assets import Assets
from ..branches.branches import Branch
Expand Down Expand Up @@ -341,8 +340,8 @@ def label(self, label_uid: str = None):
def bulk_operation(self):
return BulkOperation(self.client)

def releases(self, release_uid: str = None):
return Releases(self.client, release_uid)
def releases(self, release_uid: str = None, headers: dict = None):
return Releases(self.client, release_uid, headers)

def delivery_token(self, delivery_token: str = None):
return DeliveryToken(self.client, delivery_token)
Expand Down
1 change: 0 additions & 1 deletion contentstack_management/taxonomies/taxonomy.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException
from ..terms.terms import Terms

Expand Down
1 change: 0 additions & 1 deletion contentstack_management/terms/terms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote
from .._errors import ArgumentException

class Terms(Parameter):
Expand Down
3 changes: 1 addition & 2 deletions contentstack_management/webhooks/webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote

class Webhook(Parameter):
"""
Expand All @@ -20,7 +19,7 @@ def __init__(self, client, webhook_uid):
self.webhook_uid = webhook_uid
super().__init__(self.client)

self.path = f"webhooks"
self.path = "webhooks"

def find(self):
"""
Expand Down
5 changes: 2 additions & 3 deletions contentstack_management/workflows/workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import json
from ..common import Parameter
from urllib.parse import quote

class Workflows(Parameter):
"""
Expand All @@ -20,7 +19,7 @@ def __init__(self, client, workflow_uid):
self.workflow_uid = workflow_uid
super().__init__(self.client)

self.path = f"workflows"
self.path = "workflows"

def find(self):
"""
Expand Down Expand Up @@ -593,7 +592,7 @@ def fetch_tasks(self):

-------------------------------
"""
url = f"user/assignments"
url = "user/assignments"
return self.client.get(url, headers = self.client.headers, params = self.params)


Expand Down
Loading