88
99import logging
1010import requests
11- from urllib import parse
11+ from urllib . parse import urlencode
1212from contentstack import Error
1313from json import JSONDecodeError
1414from requests .exceptions import Timeout , HTTPError
@@ -18,44 +18,55 @@ class HTTPConnection(object):
1818
1919 def __init__ (self , url , query , stack_headers ):
2020
21- """
22- Initialises the HTTPConnection to make Http Request
23- :param url: url for the request to made
24- :param query: It will be executed to retrieve entries. This query should be in key value format.
25- :param stack_headers: It contains like API key of your stack, access token and others.
26- """
2721 if None not in (url , query , stack_headers ):
28- self .__url = url
22+ self .__payload = None
23+ self .__base_url = url
2924 self .__query_params = query
30- self .__stack_headers = stack_headers
31- self .__stack_headers .update (self .__user_agents ())
25+ self .__headers = stack_headers
26+ self .__headers .update (self .__user_agents ())
27+
28+ if 'environment' in self .__headers :
29+ environment = self .__headers ['environment' ]
30+ self .__query_params ['environment' ] = environment
3231
3332 def get_result (self , url : str , query : dict , headers : dict ):
33+
3434 if None not in (url , query , headers ):
35- if len (url ) > 0 and len (self .__stack_headers ) > 0 :
36- self .__url = url
37- self .__query_params = query
38- self .__stack_headers .update (headers )
39- else :
40- raise ValueError ('Kindly provide a valid input' )
41-
42- # Headers from locale
43- if 'environment' in self .__stack_headers :
44- environment = self .__stack_headers ['environment' ]
45- self .__query_params ['environment' ] = environment
46- logging .info ('Query Parameters ={}' .format (self .__query_params ))
47- logging .info ('Headers ={}' .format (self .__stack_headers ))
48- payload = parse .urlencode (query = self .__query_params , encoding = 'UTF-8' )
35+ if len (url ) > 0 and len (self .__headers ) > 0 :
36+ self .__base_url = url
37+ if len (headers ) > 0 :
38+ self .__headers .update (headers )
39+ self .__query_params .update (query )
40+
41+ # Case: If UIR Parameter contains entries
42+ if 'entries' in self .__base_url :
43+ self .__payload = self .__execute_entry ()
44+ # self.__payload = parse.urlencode(query=params, encoding='UTF-8')
45+ else :
46+ url_param = ''
47+ for (key , value ) in self .__query_params .items ():
48+ url_param = '{}&{}={}' .format (url_param , key , value )
49+ self .__payload = url_param
50+
4951 try :
50- response = requests .get (self .__url , verify = True , timeout = (10 , 8 ), params = payload ,
51- headers = self .__stack_headers )
52+ if self .__payload .startswith ("&" ):
53+ self .__payload = self .__payload [1 :]
54+ _url = '{}?{}' .format (self .__base_url , self .__payload )
55+ logging .info ('{}?{}' .format (self .__base_url , self .__payload ))
56+ response = requests .get (_url , verify = True , timeout = (10 , 8 ), headers = self .__headers )
57+
5258 if response .status_code == 200 :
5359 if response .raise_for_status () is None :
5460 return self .__parse_dict (response )
5561 else :
5662 err = response .json ()
5763 if err is not None :
58- return Error ()._config (err )
64+ error = Error ()
65+ error ._config (err )
66+ return error
67+
68+ logging .info ('\n \n request url => {}\n response={}' .format (response .url , response ))
69+
5970 except Timeout :
6071 raise TimeoutError ('The request timed out' )
6172 except ConnectionError :
@@ -65,46 +76,99 @@ def get_result(self, url: str, query: dict, headers: dict):
6576 except HTTPError :
6677 raise HTTPError ('Http Error Occurred' )
6778
79+ # def __check_for_valid_query(self):
80+ #
81+ # if 'include[]' in self.__query_params:
82+ # url_params = ''
83+ # params = self.__query_params['include[]']
84+ # for param in params:
85+ # url_params = '{}&include[]={}'.format(url_params, param)
86+ # del self.__query_params['include[]']
87+ # return self.__return_query(url_params)
88+ #
89+ # elif 'only[BASE][]' in self.__query_params:
90+ # url_params = ''
91+ # params = self.__query_params['only[BASE][]']
92+ # for param in params:
93+ # url_params = '{}&only[BASE][]={}'.format(url_params, param)
94+ # del self.__query_params['only[BASE][]']
95+ # return self.__return_query(url_params)
96+ #
97+ # elif 'except[BASE][]' in self.__query_params:
98+ # url_params = ''
99+ # params = self.__query_params['except[BASE][]']
100+ # for param in params:
101+ # url_params = '{}&except[BASE][]={}'.format(url_params, param)
102+ # del self.__query_params['except[BASE][]']
103+ # return self.__return_query(url_params)
104+ #
105+ # elif 'only' in self.__query_params:
106+ # url_params = ''
107+ # params = self.__query_params['only']
108+ # for param in params:
109+ # url_params = '{}&only={}'.format(url_params, param)
110+ # del self.__query_params['only']
111+ # return self.__return_query(url_params)
112+ #
113+ # elif 'except' in self.__query_params:
114+ # url_params = ''
115+ # params = self.__query_params['except']
116+ # for param in params:
117+ # url_params = '{}&except={}'.format(url_params, param)
118+ # del self.__query_params['except']
119+ # return self.__return_query(url_params)
120+ #
121+ # elif 'query' in self.__query_params:
122+ # url_params = ''
123+ # params = self.__query_params['query']
124+ # for param in params:
125+ # url_params = '{}&query={}'.format(url_params, param)
126+ # del self.__query_params['query']
127+ # return self.__return_query(url_params)
128+ # else:
129+ # pass
130+ #
131+ # def __return_query(self, url_params):
132+ # other_queries = ''
133+ # for key, value in self.__query_params.items():
134+ # other_queries = '{}&{}={}'.format(other_queries, key, value)
135+ # url_params = '{}{}'.format(other_queries, url_params)
136+ # self.__query_params.clear()
137+ # return url_params
138+
68139 def __parse_dict (self , response ):
69140 from contentstack .stack import SyncResult
70141 result = response .json ()
71- logging .info ('\n \n request url => {}\n response={}' .format (response .url , result ))
72142
73143 if 'stack' in result :
74144 return result ['stack' ]
75- # If result contains entry, return Entry
76145 if 'entry' in result :
77146 dict_entry = result ['entry' ]
78147 return self .__parse_entries (dict_entry )
79- # If result contains entries, return list[Entry]
80148 if 'entries' in result :
81149 entry_list = result ['entries' ]
82150 return self .__parse_entries (entry_list )
83- # If result contains asset, return Asset
84151 if 'asset' in result :
85152 dict_asset = result ['asset' ]
86153 return self .__parse_assets (dict_asset )
87- # If result contains assets, return list[Asset]
88154 if 'assets' in result :
89155 asset_list = result ['assets' ]
90156 return self .__parse_assets (asset_list )
91- # If result contains content_type,return content_type json
92157 if 'content_type' in result :
93158 return result ['content_type' ]
94- # If result contains content_types,return content_types json
95159 if 'content_types' in result :
96160 return result ['content_types' ]
97- # If result contains items, return SyncResult json
98161 if 'items' in result :
99- sync_result = SyncResult ()._configure (result )
162+ sync_result = SyncResult ()
163+ sync_result ._configure (result )
100164 return sync_result
101165
102166 return None
103167
104168 @staticmethod
105169 def __parse_entries (result ):
106170 from contentstack import Entry
107- entries : list [ Entry ] = []
171+ entries = []
108172 entry = Entry ()
109173 # if 'count' in result:
110174 # entry.count = result['count']
@@ -120,7 +184,7 @@ def __parse_entries(result):
120184 @staticmethod
121185 def __parse_assets (result ):
122186 from contentstack import Asset
123- assets : list [ Asset ] = []
187+ assets = []
124188 asset = Asset ()
125189
126190 if result is not None and len (result ) > 0 :
@@ -138,37 +202,51 @@ def __user_agents() -> dict:
138202 import contentstack
139203 import platform
140204
141- """
142- Contentstack-User-Agent.
143- """
144205 header = {'sdk' : dict (name = contentstack .__package__ , version = contentstack .__version__ )}
145- os_name = platform .system ()
146-
147- if os_name == 'Darwin' :
148- os_name = 'macOS'
149-
150- elif not os_name or os_name == 'Java' :
151- os_name = None
152-
153- elif os_name and os_name not in ['macOS' , 'Windows' ]:
154- os_name = 'Linux'
206+ os = platform .system ()
207+ if os == 'Darwin' :
208+ os = 'macOS'
209+ elif not os or os == 'Java' :
210+ os = None
211+ elif os and os not in ['macOS' , 'Windows' ]:
212+ os = 'Linux'
213+ header ['os' ] = {'name' : os , 'version' : platform .release ()}
214+ package = "contentstack-python, - {}" .format (contentstack .__version__ )
215+ local_headers = {'User-Agent' : str (header ), "Content-Type" : 'application/json' , "X-User-Agent" : package }
216+ return local_headers
155217
156- header ['os' ] = {
157- 'name' : os_name ,
158- 'version' : platform .release ()
159- }
218+ def __execute_entry (self ):
219+
220+ url_param = ''
221+
222+ for (key , value ) in self .__query_params .items ():
223+ if key == 'include[]' :
224+ if isinstance (value , list ):
225+ url_param = '{}&{}' .format (url_param , urlencode ({key : value }, doseq = True ))
226+ elif key == 'only[BASE][]' :
227+ if isinstance (value , list ):
228+ url_param = '{}&{}' .format (url_param , urlencode ({key : value }, doseq = True ))
229+ elif key == 'except[BASE][]' :
230+ if isinstance (value , list ):
231+ url_param = '{}&{}' .format (url_param , urlencode ({key : value }, doseq = True ))
232+ elif key == 'only' :
233+ for uid in value :
234+ inner_list = value [uid ]
235+ inner_key = 'only[{}][]' .format (uid )
236+ if isinstance (inner_list , list ):
237+ url_param = '{}&{}' .format (url_param , urlencode ({inner_key : inner_list }, doseq = True ))
238+ elif key == 'except' :
239+ for uid in value :
240+ inner_list = value [uid ]
241+ inner_key = 'except[{}][]' .format (uid )
242+ if isinstance (inner_list , list ):
243+ url_param = '{}&{}' .format (url_param , urlencode ({inner_key : inner_list }, doseq = True ))
244+ elif key == 'query' :
245+ query = urlencode ({key : value })
246+ url_param = '{}&{}' .format (url_param , query , doseq = True )
247+ else :
248+ url_param = '{}&{}={}' .format (url_param , key , value )
160249
161- local_headers = {'User-Agent' : str (header ),
162- "Content-Type" : 'application/json' ,
163- "X-User-Agent" : "contentstack-python, {}" .format (contentstack .__version__ )
164- }
165- return local_headers
250+ return url_param
166251
167- def __is_valid_json (self , json_string ):
168252
169- import json
170- try :
171- json .loads (json_string )
172- return True
173- except ValueError as e :
174- return False
0 commit comments