11import requests
2- from requests .auth import AuthBase
3- from typeform import exception
4- from typeform .enumerator import ErrorEnum
5- from typeform .clientauth import ClientAuth
6- import json
72
83class Client (object ):
9- _VALID_VERSIONS = ['v1' ]
4+ BASE_URL = 'https://api.typeform.com/'
5+ _VALID_VERSIONS = ['v1' , ]
106
11- def __init__ (self , api_key = None , access_token = None , version = None ):
12- self .access_token = access_token
7+ def __init__ (self , api_key , version = None ):
138 self .api_key = api_key
149 if version not in self ._VALID_VERSIONS :
1510 self .version = self ._VALID_VERSIONS [0 ]
16- if api_key :
17- self .auth = ClientAuth (api_key = api_key )
18- self .base_url = 'https://api.typeform.com/' + self ._VALID_VERSIONS [0 ]
19- elif access_token :
20- self .auth = ClientAuth (access_token = access_token )
21- self .base_url = 'https://api.typeform.com'
22- else :
23- raise exception .CredentialRequired ("You must provide either access_token or api_key" )
2411
25- def _get (self , endpoint , data = None ):
26- return self ._request ('GET' , endpoint , data = data )
27-
28- def _put (self , endpoint , data = None ):
29- return self ._request ('PUT' , endpoint , data = data )
30-
31- def _delete (self , endpoint , data = None ):
32- return self ._request ('DELETE' , endpoint , data = data )
33-
34- def _request (self , method , endpoint , data = None ):
35- url = '{0}/{1}' .format (self .base_url , endpoint )
36- response = requests .request (method , url , auth = self .auth , data = json .dumps (data ))
37- return self ._parse (response )
38-
39- def _parse (self , response ):
40- if not response .ok :
41- try :
42- data = response .json ()
43- if 'description' in data and 'code' in data :
44- message = data ['description' ]
45- code = data ['code' ]
46- except :
47- code = response .status_code
48- message = ""
49- try :
50- error_enum = ErrorEnum (response .status_code )
51- except Exception :
52- raise exception .UnexpectedError ('Error:{0}{1}.Message{2}' .format (code , response .status_code , message ))
53- if error_enum == ErrorEnum .Forbidden :
54- raise exception .Forbidden (message )
55- if error_enum == ErrorEnum .Not_Found :
56- raise exception .Not_Found (message )
57- if error_enum == ErrorEnum .Payment_Required :
58- raise exception .Payment_Required (message )
59- if error_enum == ErrorEnum .Internal_Server_Error :
60- raise exception .Internal_Server_Error (message )
61- if error_enum == ErrorEnum .Service_Unavailable :
62- raise exception .Service_Unavailable (message )
63- if error_enum == ErrorEnum .Bad_Request :
64- raise exception .Bad_Request (message )
65- if error_enum == ErrorEnum .Unauthorized :
66- raise exception .Unauthorized (message )
12+ def _get (self , endpoint , params = None ):
13+ return self ._request ('GET' , endpoint , params )
14+
15+ def _request (self , method , endpoint , params = None , data = None ):
16+ url = '{0}{1}/{2}' .format (self .BASE_URL , self .version , endpoint )
17+ print (url )
18+ response = requests .request (method , url , params = params , json = data )
19+ r = response .json ()
20+ if response .status_code in [403 , 404 ]:
21+ if 'message' in r :
22+ raise Exception (r ['message' ])
6723 else :
68- raise exception . BaseError ( 'Error: {0}{1}. Message {2}' . format ( code , response . status_code , message ))
69- return data
70- else :
71- return response
24+ if ' code' in r :
25+ raise Exception ( r [ 'description' ])
26+ raise Exception ( 'Unexpected error.' )
27+ return r
7228
7329 def get_form_uid (self , url_form ):
7430 """Returns addresses registered by the user.
7531 Args:
76- url_form: String, Url from the form (the method needs the uid or form)
32+ url_form:
7733 Returns:
7834 A string.
7935 """
@@ -84,7 +40,7 @@ def get_form_uid(self, url_form):
8440 def get_form_information (self , uid = None , url = None ):
8541 """Returns addresses registered by the user.
8642 Args:
87- uid: Unique ID for the form
43+ typeform_uid:
8844 Returns:
8945 A dict.
9046 """
@@ -93,87 +49,62 @@ def get_form_information(self, uid=None, url=None):
9349 raise Exception ('You must provide either an UID or Form URL.' )
9450 else :
9551 uid = self .get_form_uid (url )
96- return self ._get ('forms/{}' .format (uid )).json ()
52+ params = {'key' : self .api_key }
53+ return self ._get ('form/{}' .format (uid ), params = params )
54+
55+ def get_form_stats (self , uid = None , url = None , form = None ):
56+ """Returns stats of form.
57+ Args:
58+ uid:
59+ url:
60+ Returns:
61+ A dict.
62+ """
63+ if form is not None :
64+ return form ['stats' ]
65+ return self .get_form_information (uid = uid , url = url )['stats' ]
9766
9867 def get_form_questions (self , uid = None , url = None , form = None ):
9968 """Returns questions of form.
10069 Args:
101- uid: Unique ID for the form
102- url: String, Url from the form (the method needs the uid or form)
70+ uid:
71+ url:
10372 Returns:
10473 A dict.
10574 """
10675 if form is not None :
107- return form ['fields ' ]
108- return self .get_form_information (uid = uid , url = url )['fields ' ]
76+ return form ['questions ' ]
77+ return self .get_form_information (uid = uid , url = url )['questions ' ]
10978
110- def get_form_metadata (self , since , until , uid = None , url = None , form = None ):
111- """Returns metadata of form (include answers) .
79+ def get_form_metadata (self , uid = None , url = None , form = None ):
80+ """Returns metadata of form.
11281 Args:
113- uid: String, ID from the form
114- url: String, Url from the form (the method needs the uid or form)
115- form: String, A form
116- since: String, The since parameter is a string that uses ISO 8601 format,
117- Coordinated Universal Time (UTC), with "T" as a delimiter between the date and time.
118- July 10, 2017 at 12:00 a.m. UTC is expressed as 2017-07-10T00:00:00.
119- If you want to retrieve responses for yesterday, 2017-07-09, the value for your since query parameter
120- would be 2017-07-09T00:00:00
121- until: String, The until parameter is a string that uses ISO 8601 format,
122- Coordinated Universal Time (UTC), with "T" as a delimiter between the date and time.
123- July 10, 2017 at 12:00 a.m. UTC is expressed as 2017-07-10T00:00:00.
124- If you want to retrieve responses for yesterday, 2017-07-09, the value for your since query parameter
125- would be 2017-07-09T00:00:00
82+ uid:
83+ url:
12684 Returns:
12785 A dict.
12886 """
12987 if form is not None :
13088 return form ['responses' ]
131- data = {
132- 'since' : since ,
133- 'until' : until ,
134- }
135- return self ._get (endpoint = "forms/{0}/responses" .format (uid ), data = data ).json ()['items' ]
89+ return self .get_form_information (uid = uid , url = url )['responses' ]
13690
91+ def get_form_answers (self , uid = None , url = None , form = None ):
92+ """Returns answers of form.
93+ Args:
94+ uid:
95+ url:
96+ Returns:
97+ A list.
98+ """
99+ if form is None :
100+ form = self .get_form_information (uid = uid , url = url )
101+ return [answers ['answers' ] for answers in form ['responses' ]]
137102
138103 def get_forms (self ):
139104 """Returns all forms
140105 Args:
141106 Returns:
142107 A dict.
143108 """
144- return self ._get (endpoint = 'forms' ).json ()
145-
146- def create_webhook (self , url_webhook , tag_webhook , uid ):
147- """
148- :param url_webhook: String URL webhook request
149- :param tag_webhook: String
150- :param uid: String, Unique ID for the form
151- :return: dict
152- """
153- if self .access_token is not None :
154- data = {'url' :url_webhook , 'enabled' :True }
155- return self ._put (endpoint = 'forms/{1}/webhooks/{0}' .format (tag_webhook , uid ), data = data ).json ()
156- else :
157- raise exception .TokenRequired ("You need an access token for this method" )
158-
159- def view_webhook (self , tag_webhook , uid ):
160- """
161- :param tag_webhook: String
162- :param uid: String, Unique ID for the form
163- :return:
164- """
165- if self .access_token is not None :
166- return self ._get (endpoint = 'forms/{1}/webhooks/{0}' .format (tag_webhook , uid )).json ()
167- else :
168- raise exception .TokenRequired ("You need an access token for this method" )
169-
170- def delete_webhook (self , tag_webhook , uid ):
171- """
172- :param tag_webhook: String
173- :param uid: String, Unique ID for the form
174- :return:
175- """
176- if self .access_token is not None :
177- return self ._delete (endpoint = 'forms/{1}/webhooks/{0}' .format (tag_webhook , uid )).ok
178- else :
179- raise exception .TokenRequired ("You need an access token for this method" )
109+ params = {'key' : self .api_key }
110+ return self ._get ('forms?key={0}' .format (self .api_key ), params = params )
0 commit comments