From 2427830678a8605ab8bcce9a632fd94eb8acc1b6 Mon Sep 17 00:00:00 2001 From: sologoub Date: Sun, 26 Feb 2012 12:43:08 -0800 Subject: [PATCH 1/2] Added list_numpages method to the following classes in order to make paging easier: Recordings, Notifications, Calls, CallerIds, PhoneNumbers, SmsMessages, ShortCodes, Conferences, Accounts. In all classes, this method takes same parameters as the list method and returns the corresponding number of pages in the result set. --- twilio/rest/resources.py | 292 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 280 insertions(+), 12 deletions(-) diff --git a/twilio/rest/resources.py b/twilio/rest/resources.py index a3e8e6f577..908bbe661f 100644 --- a/twilio/rest/resources.py +++ b/twilio/rest/resources.py @@ -365,6 +365,35 @@ def load_instance(self, data): instance.load(data) instance.load_subresources() return instance + + def numpages(self, params=None, page=None, page_size=None): + """ + Query the list resource for a list of InstanceResources. + + Raises a TwilioRestException if requesting a page of results that does + not exist. + + :param dict params: List of URL parameters to be included in request + :param int page: The page of results to retrieve (most recent at 0) + :param int page_size: The number of results to be returned. + + :returns: -- number of pages in the result + """ + + params = params or {} + + if page is not None: + params["Page"] = page + + if page_size is not None: + params["PageSize"] = page_size + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] class AvailablePhoneNumber(InstanceResource): @@ -468,8 +497,8 @@ class Recordings(ListResource): @normalize_dates def list(self, call_sid=None, before=None, after=None, **kwargs): """ - Returns a page of :class:`Recording` resources as a list. - For paging information see :class:`ListResource`. + Returns a page of :class:`Recording` resources as a list. For paging + informtion see method 'list_numpages'. :param date after: Only list recordings logged after this datetime :param date before: Only list recordings logger before this datetime @@ -481,6 +510,30 @@ def list(self, call_sid=None, before=None, after=None, **kwargs): "DateCreated>": after, }) return self.get_instances(params=params) + + @normalize_dates + def list_numpages(self, call_sid=None, before=None, after=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list Recording + resources for paging. + + :param date after: Only list recordings logged after this datetime + :param date before: Only list recordings logger before this datetime + :param call_sid: Only list recordings from this :class:`Call` + """ + params = transform_params({ + "CallSid": call_sid, + "DateCreated<": before, + "DateCreated>": after, + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] + def delete(self, sid): """ @@ -506,8 +559,8 @@ class Notifications(ListResource): @normalize_dates def list(self, before=None, after=None, log_level=None, **kwargs): """ - Returns a page of :class:`Notification` resources as a list. - For paging informtion see :class:`ListResource`. + Returns a page of :class:`Notification` resources as a list. For paging + informtion see method 'list_numpages'. **NOTE**: Due to the potentially voluminous amount of data in a notification, the full HTTP request and response data is only returned @@ -523,6 +576,30 @@ def list(self, before=None, after=None, log_level=None, **kwargs): "LogLevel": log_level, }) return self.get_instances(params=params, **kwargs) + + @normalize_dates + def list_numpages(self, call_sid=None, before=None, after=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list Notification + resources for paging. + + :param date after: Only list notifications logged after this datetime + :param date before: Only list notifications logger before this datetime + :param log_level: If 1, only shows errors. If 0, only show warnings + """ + params = transform_params({ + "MessageDate<": before, + "MessageDate>": after, + "LogLevel": log_level, + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] + def delete(self, sid): """ @@ -629,7 +706,7 @@ def list(self, to=None, from_=None, status=None, ended_after=None, started_after=None, started=None, **kwargs): """ Returns a page of :class:`Call` resources as a list. For paging - informtion see :class:`ListResource` + informtion see method 'list_numpages'. :param date after: Only list calls started after this datetime :param date before: Only list calls started before this datetime @@ -647,6 +724,37 @@ def list(self, to=None, from_=None, status=None, ended_after=None, }) return self.get_instances(params=params, **kwargs) + @normalize_dates + def list_numpages(self, to=None, from_=None, status=None, ended_after=None, + ended_before=None, ended=None, started_before=None, + started_after=None, started=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list Call + resources for paging. + + :param date after: Only list calls started after this datetime + :param date before: Only list calls started before this datetime + """ + params = transform_params({ + "To": to, + "From": from_, + "Status": status, + "StartTime<": started_before, + "StartTime>": started_after, + "StartTime": parse_date(started), + "EndTime<": ended_before, + "EndTime>": ended_after, + "EndTime": parse_date(ended), + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] + + def create(self, to, from_, url, method=None, fallback_url=None, fallback_method=None, status_callback=None, status_method=None, if_machine=None, send_digits=None, timeout=None, @@ -759,6 +867,9 @@ def delete(self, sid): def list(self, phone_number=None, friendly_name=None, **kwargs): """ + Returns a page of :class:`CallerId` resources as a list. For paging + informtion see method 'list_numpages'. + :param phone_number: Show caller ids with this phone number. :param friendly_name: Show caller ids with this friendly name. """ @@ -767,6 +878,30 @@ def list(self, phone_number=None, friendly_name=None, **kwargs): "FrienldyName": friendly_name, }) return self.get_instances(params=params, **kwargs) + + @normalize_dates + def list_numpages(self, to=None, from_=None, status=None, ended_after=None, + ended_before=None, ended=None, started_before=None, + started_after=None, started=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list CallerId + resources for paging. + + :param phone_number: Show caller ids with this phone number. + :param friendly_name: Show caller ids with this friendly name. + """ + params = transform_params({ + "PhoneNumber": phone_number, + "FrienldyName": friendly_name, + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] + def update(self, sid, friendly_name=None): """ @@ -878,6 +1013,9 @@ def delete(self, sid): def list(self, phone_number=None, friendly_name=None, **kwargs): """ + Returns a page of :class:`PhoneNumber` resources as a list. For paging + informtion see method 'list_numpages'. + :param phone_number: Show phone numbers that match this pattern. :param friendly_name: Show phone numbers with this friendly name @@ -888,6 +1026,28 @@ def list(self, phone_number=None, friendly_name=None, **kwargs): "FriendlyName": friendly_name, }) return self.get_instances(params=params, **kwargs) + + def list_numpages(self, phone_number=None, friendly_name=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list PhoneNumber + resources for paging. + + :param phone_number: Show phone numbers that match this pattern. + :param friendly_name: Show phone numbers with this friendly name + + You can specify partial numbers and use '*' as a wildcard. + """ + params = transform_params({ + "PhoneNumber": phone_number, + "FriendlyName": friendly_name, + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] def purchase(self, phone_number=None, area_code=None, voice_url=None, voice_method=None, voice_fallback_url=None, @@ -1059,13 +1219,13 @@ def create(self, to=None, from_=None, body=None, status_callback=None, "ApplicationSid": application_sid, }) return self.create_instance(params) - + @normalize_dates def list(self, to=None, from_=None, before=None, after=None, date_sent=None, **kwargs): """ - Returns a page of :class:`SMSMessage` resources as a list. For - paging informtion see :class:`ListResource`. + Returns a page of :class:`SmsMessage` resources as a list. For paging + informtion see method 'list_numpages'. :param to: Only show SMS messages to this phone number. :param from_: Only show SMS messages from this phone number. @@ -1084,6 +1244,37 @@ def list(self, to=None, from_=None, before=None, after=None, "DateSent": parse_date(date_sent), }) return self.get_instances(params=params, **kwargs) + + @normalize_dates + def list_numpages(self, to=None, from_=None, before=None, after=None, + date_sent=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list SMSMessage + resources for paging. + + :param to: Only show SMS messages to this phone number. + :param from_: Only show SMS messages from this phone number. + :param date after: Only list SMS messages sent after this date. + :param date before: Only list SMS message sent before this date. + :param date date_sent: Only list SMS message sent on this date. + :param `from_`: Only show SMS messages from this phone number. + :param date after: Only list recordings logged after this datetime + :param date before: Only list recordings logged before this datetime + """ + params = transform_params({ + "To": to, + "From": from_, + "DateSent<": before, + "DateSent>": after, + "DateSent": parse_date(date_sent), + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] class ShortCode(InstanceResource): @@ -1100,8 +1291,8 @@ class ShortCodes(ListResource): def list(self, short_code=None, friendly_name=None, **kwargs): """ - Returns a page of :class:`ShortCode` resources as a list. For - paging information see :class:`ListResource`. + Returns a page of :class:`ShortCode` resources as a list. For paging + informtion see method 'list_numpages'. :param short_code: Only show the ShortCode resources that match this pattern. You can specify partial numbers and use '*' @@ -1114,6 +1305,29 @@ def list(self, short_code=None, friendly_name=None, **kwargs): "FriendlyName": friendly_name, }) return self.get_instances(params=params, **kwargs) + + def list_numpages(self, short_code=None, friendly_name=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list ShortCode + resources for paging. + + :param short_code: Only show the ShortCode resources that match this + pattern. You can specify partial numbers and use '*' + as a wildcard for any digit. + :param friendly_name: Only show the ShortCode resources with friendly + names that exactly match this name. + """ + params = transform_params({ + "ShortCode": short_code, + "FriendlyName": friendly_name, + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] def update(self, sid, friendly_name=None, api_version=None, url=None, method=None, fallback_url=None, fallback_method=None): @@ -1236,7 +1450,8 @@ def list(self, status=None, friendly_name=None, updated_before=None, updated_after=None, created_after=None, created_before=None, updated=None, created=None, **kwargs): """ - Return a list of :class:`Conference` resources + Returns a page of :class:`Conference` resources as a list. For paging + informtion see method 'list_numpages'. :param status: Show conferences with this status :param frienldy_name: Show conferences with this exact frienldy_name @@ -1256,6 +1471,39 @@ def list(self, status=None, friendly_name=None, updated_before=None, "DateCreated": parse_date(created), }) return self.get_instances(params=params, **kwargs) + + @normalize_dates + def list_numpages(self, status=None, friendly_name=None, updated_before=None, + updated_after=None, created_after=None, created_before=None, + updated=None, created=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list Conference + resources for paging. + + :param status: Show conferences with this status + :param frienldy_name: Show conferences with this exact frienldy_name + :param date updated_after: List conferences updated after this date + :param date updated_before: List conferences updated before this date + :param date created_after: List conferences created after this date + :param date created_before: List conferences created before this date + """ + params = transform_params({ + "Status": status, + "FriendlyName": friendly_name, + "DateUpdated<": updated_before, + "DateUpdated>": updated_after, + "DateUpdated": parse_date(updated), + "DateCreated<": created_before, + "DateCreated>": created_after, + "DateCreated": parse_date(created), + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] class Application(InstanceResource): @@ -1454,7 +1702,7 @@ class Accounts(ListResource): def list(self, friendly_name=None, status=None, **kwargs): """ Returns a page of :class:`Account` resources as a list. For paging - informtion see :class:`ListResource` + informtion see method 'list_numpages'. :param date friendly_name: Only list accounts with this friendly name :param date status: Only list accounts with this status @@ -1464,6 +1712,26 @@ def list(self, friendly_name=None, status=None, **kwargs): "Status": status, }) return self.get_instances(params=params, **kwargs) + + def list_numpages(self, friendly_name=None, status=None, **kwargs): + """ + Returns number of pages associated with a filtered request to list Account + resources for paging. + + :param date friendly_name: Only list accounts with this friendly name + :param date status: Only list accounts with this status + """ + params = transform_params({ + "FriendlyName": friendly_name, + "Status": status, + }) + + resp, page = self.request("GET", self.uri, params=params) + + if self.key not in page: + raise TwilioException("Key %s not present in response" % self.key) + + return page["num_pages"] def update(self, sid, friendly_name=None, status=None): """ From d2de14486b0e312914685a192c88050ae494446d Mon Sep 17 00:00:00 2001 From: sologoub Date: Sun, 26 Feb 2012 12:50:19 -0800 Subject: [PATCH 2/2] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e242c7d93f..0da9db3a6d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +NOTE: Forked from https://github.com/twilio/twilio-python. Added "list_numpages" method classes in REST helper to make paging easier. + A module for using the Twilio REST API and generating valid [TwiML](http://www.twilio.com/docs/api/twiml/ "TwiML - Twilio Markup Language"). [Click here to read the full