Skip to content

Commit 5734a1f

Browse files
Added find and fetch methods for variants
1 parent 4843091 commit 5734a1f

File tree

4 files changed

+116
-31
lines changed

4 files changed

+116
-31
lines changed

contentstack/contenttype.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from contentstack.entry import Entry
1515
from contentstack.query import Query
16+
from contentstack.variants import Variants
1617

1718
class ContentType:
1819
"""
@@ -125,17 +126,11 @@ def variants(self, variant_uid: str | list[str], params: dict = None):
125126
:param variant_uid: {str} -- variant_uid
126127
:return: Entry, so you can chain this call.
127128
"""
128-
headers = self.http_instance.headers.copy() # Create a local copy of headers
129-
if isinstance(variant_uid, str):
130-
headers['x-cs-variant-uid'] = variant_uid
131-
elif isinstance(variant_uid, list):
132-
headers['x-cs-variant-uid'] = ','.join(variant_uid)
133-
134-
if params is not None:
135-
self.local_param.update(params)
136-
137-
encoded_params = parse.urlencode(self.local_param)
138-
endpoint = self.http_instance.endpoint
139-
url = f'{endpoint}/content_types/{self.__content_type_uid}/entries?{encoded_params}'
140-
result = self.http_instance.get(url, headers=headers)
141-
return result
129+
return Variants(
130+
http_instance=self.http_instance,
131+
content_type_uid=self.__content_type_uid,
132+
entry_uid=None,
133+
variant_uid=variant_uid,
134+
params=params,
135+
logger=None
136+
)

contentstack/entry.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from contentstack.deep_merge_lp import DeepMergeMixin
1010
from contentstack.entryqueryable import EntryQueryable
11+
from contentstack.variants import Variants
1112

1213
class Entry(EntryQueryable):
1314
"""
@@ -229,19 +230,14 @@ def variants(self, variant_uid: str | list[str], params: dict = None):
229230
:param variant_uid: {str} -- variant_uid
230231
:return: Entry, so you can chain this call.
231232
"""
232-
headers = self.http_instance.headers.copy() # Create a local copy of headers
233-
if isinstance(variant_uid, str):
234-
headers['x-cs-variant-uid'] = variant_uid
235-
elif isinstance(variant_uid, list):
236-
headers['x-cs-variant-uid'] = ','.join(variant_uid)
237-
238-
if params is not None:
239-
self.entry_param.update(params)
240-
encoded_params = parse.urlencode(self.entry_param)
241-
endpoint = self.http_instance.endpoint
242-
url = f'{endpoint}/content_types/{self.content_type_id}/entries/{self.entry_uid}?{encoded_params}'
243-
result = self.http_instance.get(url, headers=headers)
244-
return result
233+
return Variants(
234+
http_instance=self.http_instance,
235+
content_type_uid=self.content_type_id,
236+
entry_uid=self.entry_uid,
237+
variant_uid=variant_uid,
238+
params=params,
239+
logger=None
240+
)
245241

246242

247243

contentstack/variants.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import logging
2+
from urllib import parse
3+
4+
from contentstack.deep_merge_lp import DeepMergeMixin
5+
from contentstack.entryqueryable import EntryQueryable
6+
7+
class Variants(EntryQueryable, ):
8+
"""
9+
An entry is the actual piece of content that you want to publish.
10+
Entries can be created for one of the available content types.
11+
12+
Entry works with
13+
version={version_number}
14+
environment={environment_name}
15+
locale={locale_code}
16+
"""
17+
18+
def __init__(self,
19+
http_instance=None,
20+
content_type_uid=None,
21+
entry_uid=None,
22+
variant_uid=None,
23+
params=None,
24+
logger=None):
25+
26+
super().__init__()
27+
EntryQueryable.__init__(self)
28+
self.entry_param = {}
29+
self.http_instance = http_instance
30+
self.content_type_id = content_type_uid
31+
self.entry_uid = entry_uid
32+
self.variant_uid = variant_uid
33+
self.logger = logger or logging.getLogger(__name__)
34+
self.entry_param = params or {}
35+
36+
def find(self, params=None):
37+
"""
38+
find the variants of the entry of a particular content type
39+
:param self.variant_uid: {str} -- self.variant_uid
40+
:return: Entry, so you can chain this call.
41+
"""
42+
headers = self.http_instance.headers.copy() # Create a local copy of headers
43+
if isinstance(self.variant_uid, str):
44+
headers['x-cs-variant-uid'] = self.variant_uid
45+
elif isinstance(self.variant_uid, list):
46+
headers['x-cs-variant-uid'] = ','.join(self.variant_uid)
47+
48+
if params is not None:
49+
self.entry_param.update(params)
50+
encoded_params = parse.urlencode(self.entry_param)
51+
endpoint = self.http_instance.endpoint
52+
url = f'{endpoint}/content_types/{self.content_type_id}/entries?{encoded_params}'
53+
self.http_instance.headers.update(headers)
54+
result = self.http_instance.get(url)
55+
self.http_instance.headers.pop('x-cs-variant-uid', None)
56+
return result
57+
58+
def fetch(self, params=None):
59+
"""
60+
This method is useful to fetch variant entries of a paticular content type and entries of the of the stack.
61+
:return:dict -- contentType response
62+
------------------------------
63+
Example:
64+
65+
>>> import contentstack
66+
>>> stack = contentstack.Stack('api_key', 'delivery_token', 'environment')
67+
>>> content_type = stack.content_type('content_type_uid')
68+
>>> some_dict = {'abc':'something'}
69+
>>> response = content_type.fetch(some_dict)
70+
------------------------------
71+
"""
72+
"""
73+
Fetches the variants of the entry
74+
:param self.variant_uid: {str} -- self.variant_uid
75+
:return: Entry, so you can chain this call.
76+
"""
77+
if self.entry_uid is None:
78+
raise ValueError("entry_uid is required")
79+
else:
80+
headers = self.http_instance.headers.copy() # Create a local copy of headers
81+
if isinstance(self.variant_uid, str):
82+
headers['x-cs-variant-uid'] = self.variant_uid
83+
elif isinstance(self.variant_uid, list):
84+
headers['x-cs-variant-uid'] = ','.join(self.variant_uid)
85+
86+
if params is not None:
87+
self.entry_param.update(params)
88+
encoded_params = parse.urlencode(self.entry_param)
89+
endpoint = self.http_instance.endpoint
90+
url = f'{endpoint}/content_types/{self.content_type_id}/entries/{self.entry_uid}?{encoded_params}'
91+
self.http_instance.headers.update(headers)
92+
result = self.http_instance.get(url)
93+
self.http_instance.headers.pop('x-cs-variant-uid', None)
94+
return result

tests/test_entry.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,22 +137,22 @@ def test_22_entry_include_metadata(self):
137137

138138
def test_23_content_type_variants(self):
139139
content_type = self.stack.content_type('faq')
140-
entry = content_type.variants(VARIANT_UID)
140+
entry = content_type.variants(VARIANT_UID).find()
141141
self.assertIn('variants', entry['entries'][0]['publish_details'])
142142

143143
def test_24_entry_variants(self):
144144
content_type = self.stack.content_type('faq')
145-
entry = content_type.entry(FAQ_UID).variants(VARIANT_UID)
145+
entry = content_type.entry(FAQ_UID).variants(VARIANT_UID).fetch()
146146
self.assertIn('variants', entry['entry']['publish_details'])
147147

148148
def test_25_content_type_variants_with_has_hash_variant(self):
149149
content_type = self.stack.content_type('faq')
150-
entry = content_type.variants([VARIANT_UID])
150+
entry = content_type.variants([VARIANT_UID]).find()
151151
self.assertIn('variants', entry['entries'][0]['publish_details'])
152152

153153
def test_25_content_type_entry_variants_with_has_hash_variant(self):
154154
content_type = self.stack.content_type('faq').entry(FAQ_UID)
155-
entry = content_type.variants([VARIANT_UID])
155+
entry = content_type.variants([VARIANT_UID]).fetch()
156156
self.assertIn('variants', entry['entry']['publish_details'])
157157

158158

0 commit comments

Comments
 (0)