def makepretty(phonenumber):
"""
Function to take a phone number and return the pretty version
- pretty numbers:
+ pretty numbers:
if phonenumber begins with 0:
...-(...)-...-....
if phonenumber begins with 1: ( for gizmo callback numbers )
'123-4567'
>>> makepretty("2345678901")
'(234)-567-8901'
- >>> makepretty("12345678901")
+ >>> makepretty("12345678901")
'1 (234)-567-8901'
>>> makepretty("01234567890")
'+012-(345)-678-90'
elif len(phonenumber) <= 7:
prettynumber = "%s-%s" % (phonenumber[0:3], phonenumber[3:])
elif len(phonenumber) > 8 and phonenumber[0] == "1":
- prettynumber = "1 (%s)-%s-%s" %(phonenumber[1:4], phonenumber[4:7], phonenumber[7:])
+ prettynumber = "1 (%s)-%s-%s" % (phonenumber[1:4], phonenumber[4:7], phonenumber[7:])
elif len(phonenumber) > 7:
prettynumber = "(%s)-%s-%s" % (phonenumber[0:3], phonenumber[3:6], phonenumber[6:])
return prettynumber
callbackMapping = {
# Process signals from buttons
- "on_digit_clicked" : self._on_digit_clicked,
- "on_dial_clicked" : self._on_dial_clicked,
- "on_loginbutton_clicked" : self._on_loginbutton_clicked,
- "on_loginclose_clicked" : self._on_loginclose_clicked,
- "on_clearcookies_clicked" : self._on_clearcookies_clicked,
- "on_notebook_switch_page" : self._on_notebook_switch_page,
- "on_recentview_row_activated" : self._on_recentview_row_activated,
- "on_back_clicked" : self._on_backspace
+ "on_loginbutton_clicked": self._on_loginbutton_clicked,
+ "on_loginclose_clicked": self._on_loginclose_clicked,
+
+ "on_digit_clicked": self._on_digit_clicked,
+ "on_dial_clicked": self._on_dial_clicked,
+ "on_clearcookies_clicked": self._on_clearcookies_clicked,
+ "on_notebook_switch_page": self._on_notebook_switch_page,
+ "on_recentview_row_activated": self._on_recentview_row_activated,
+ "on_back_clicked": self._on_backspace
}
self._widgetTree.signal_autoconnect(callbackMapping)
self._widgetTree.get_widget("callbackcombo").get_child().connect("changed", self._on_callbackentry_changed)
def _init_grandcentral(self):
""" Deferred initalization of the grandcentral info """
-
+
if self._gcBackend.isAuthed():
if self._gcBackend.getCallbackNumber() is None:
self._gcBackend.setSaneCallback()
-
+
self.setAccountNumber()
print "exit init_gc"
return False
self._recenttime = 0.0
self._recentmodel.clear()
self._widgetTree.get_widget("callbackcombo").get_child().set_text("")
-
+
# re-run the inital grandcentral setup
self.attemptLogin(2)
gobject.idle_add(self._init_grandcentral)
self._recentmodel.clear()
self._recenttime = 0.0
-
+
def _on_paste(self, data=None):
contents = self._clipboard.wait_for_text()
phoneNumber = re.sub('\D', '', contents)
self.setNumber(phoneNumber)
-
+
def _on_digit_clicked(self, widget):
self.setNumber(self._phonenumber + widget.get_name()[5])
class DummyOptions(object):
+
def __init__(self):
self.test = False
from browser_emu import MozillaEmulator
+_validateRe = re.compile("^[0-9]{10,}$")
+
+
+def is_valid_syntax(number):
+ """
+ @returns If This number be called ( syntax validation only )
+ """
+ return _validateRe.match(number) is not None
+
+
class GCDialer(object):
"""
This class encapsulates all of the knowledge necessary to interace with the grandcentral servers
the functions include login, setting up a callback number, and initalting a callback
"""
- _gcDialingStrRe = re.compile("This may take a few seconds", re.M) # string from Grandcentral.com on successful dial
- _validateRe = re.compile("^[0-9]{10,}$")
- _accessTokenRe = re.compile(r"""<input type="hidden" name="a_t" [^>]*value="(.*)"/>""")
- _isLoginPageRe = re.compile(r"""<form method="post" action="https://www.grandcentral.com/mobile/account/login">""")
- _callbackRe = re.compile(r"""name="default_number" value="(\d+)" />\s+(.*)\s$""", re.M)
- _accountNumRe = re.compile(r"""<img src="/images/mobile/inbox_logo.gif" alt="GrandCentral" />\s*(.{14})\s* """, re.M)
- _inboxRe = re.compile(r"""<td>.*?(voicemail|received|missed|call return).*?</td>\s+<td>\s+<font size="2">\s+(.*?)\s+ \| \s+<a href="/mobile/contacts/.*?">(.*?)\s?</a>\s+<br/>\s+(.*?)\s?<a href=""", re.S)
+ _gcDialingStrRe = re.compile("This may take a few seconds", re.M) # string from Grandcentral.com on successful dial
+ _accessTokenRe = re.compile(r"""<input type="hidden" name="a_t" [^>]*value="(.*)"/>""")
+ _isLoginPageRe = re.compile(r"""<form method="post" action="https://www.grandcentral.com/mobile/account/login">""")
+ _callbackRe = re.compile(r"""name="default_number" value="(\d+)" />\s+(.*)\s$""", re.M)
+ _accountNumRe = re.compile(r"""<img src="/images/mobile/inbox_logo.gif" alt="GrandCentral" />\s*(.{14})\s* """, re.M)
+ _inboxRe = re.compile(r"""<td>.*?(voicemail|received|missed|call return).*?</td>\s+<td>\s+<font size="2">\s+(.*?)\s+ \| \s+<a href="/mobile/contacts/.*?">(.*?)\s?</a>\s+<br/>\s+(.*?)\s?<a href=""", re.S)
- _forwardselectURL = "http://www.grandcentral.com/mobile/settings/forwarding_select"
- _loginURL = "https://www.grandcentral.com/mobile/account/login"
- _setforwardURL = "http://www.grandcentral.com/mobile/settings/set_forwarding?from=settings"
- _clicktocallURL = "http://www.grandcentral.com/mobile/calls/click_to_call?a_t=%s&destno=%s"
- _inboxallURL = "http://www.grandcentral.com/mobile/messages/inbox?types=all"
+ _forwardselectURL = "http://www.grandcentral.com/mobile/settings/forwarding_select"
+ _loginURL = "https://www.grandcentral.com/mobile/account/login"
+ _setforwardURL = "http://www.grandcentral.com/mobile/settings/set_forwarding?from=settings"
+ _clicktocallURL = "http://www.grandcentral.com/mobile/calls/click_to_call?a_t=%s&destno=%s"
+ _inboxallURL = "http://www.grandcentral.com/mobile/messages/inbox?types=all"
def __init__(self, cookieFile = None):
# Important items in this function are the setup of the browser emulation and cookie file
self._msg = ""
# If the number is not valid throw exception
- if self.validate(number) is False:
+ if not is_valid_syntax(number):
raise ValueError('number is not valid')
# No point if we don't have the magic cookie
else:
self._msg = "Grand Central returned an error"
return False
-
+
self._msg = "Unknown Error"
return False
"""
return self._accountNum
- def validate(self, number):
- """
- @returns If This number be called ( syntax validation only )
- """
- return GCDialer._validateRe.match(number) is not None
-
def setSaneCallback(self):
"""
Try to set a sane default callback number on these preferences