X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fgvoice%2Fbackend.py;h=19275f887b7bf2110683dfa42d029a6928086413;hb=143205c6b83d3ba4ca82d799838c629dafa194c7;hp=251cfa53f0f2b7a28f8f5c5b104b729fd6ac27f5;hpb=6c40cd8e38418993c6efcbaf51d0c57bae81d268;p=theonering diff --git a/src/gvoice/backend.py b/src/gvoice/backend.py index 251cfa5..19275f8 100755 --- a/src/gvoice/backend.py +++ b/src/gvoice/backend.py @@ -48,7 +48,7 @@ except ImportError: import browser_emu -_moduleLogger = logging.getLogger("gvoice.backend") +_moduleLogger = logging.getLogger(__name__) class NetworkError(RuntimeError): @@ -364,12 +364,16 @@ class GVoiceBackend(object): ) self._parse_with_validation(page) - def send_sms(self, phoneNumber, message): - phoneNumber = self._send_validation(phoneNumber) + def send_sms(self, phoneNumbers, message): + validatedPhoneNumbers = [ + self._send_validation(phoneNumber) + for phoneNumber in phoneNumbers + ] + flattenedPhoneNumbers = ",".join(validatedPhoneNumbers) page = self._get_page_with_token( self._sendSmsURL, { - 'phoneNumber': phoneNumber, + 'phoneNumber': flattenedPhoneNumbers, 'text': message }, ) @@ -437,6 +441,7 @@ class GVoiceBackend(object): @param callbacknumber should be a proper 10 digit number """ self._callbackNumber = callbacknumber + _moduleLogger.info("Callback number changed: %r" % self._callbackNumber) return True def get_callback_number(self): @@ -476,22 +481,21 @@ class GVoiceBackend(object): if contactId != "0": yield contactId, contactDetails - def get_conversations(self): + def get_voicemails(self): voicemailPage = self._get_page(self._XML_VOICEMAIL_URL) voicemailHtml = self._grab_html(voicemailPage) voicemailJson = self._grab_json(voicemailPage) parsedVoicemail = self._parse_voicemail(voicemailHtml) voicemails = self._merge_conversation_sources(parsedVoicemail, voicemailJson) + return voicemails + def get_texts(self): smsPage = self._get_page(self._XML_SMS_URL) smsHtml = self._grab_html(smsPage) smsJson = self._grab_json(smsPage) parsedSms = self._parse_sms(smsHtml) smss = self._merge_conversation_sources(parsedSms, smsJson) - decoratedSms = self._decorate_sms(smss) - - allConversations = itertools.chain(voicemails, decoratedSms) - return allConversations + return smss def mark_message(self, messageId, asRead): postData = { @@ -546,10 +550,6 @@ class GVoiceBackend(object): raise ValueError('Number is not valid: "%s"' % number) elif not self.is_authed(): raise RuntimeError("Not Authenticated") - - if len(number) == 11 and number[0] == 1: - # Strip leading 1 from 11 digit dialing - number = number[1:] return number def _parse_history(self, historyHtml): @@ -557,7 +557,7 @@ class GVoiceBackend(object): for messageId, messageHtml in itergroup(splitVoicemail[1:], 2): exactTimeGroup = self._exactVoicemailTimeRegex.search(messageHtml) exactTime = exactTimeGroup.group(1).strip() if exactTimeGroup else "" - exactTime = datetime.datetime.strptime(exactTime, "%m/%d/%y %I:%M %p") + exactTime = google_strptime(exactTime) relativeTimeGroup = self._relativeVoicemailTimeRegex.search(messageHtml) relativeTime = relativeTimeGroup.group(1).strip() if relativeTimeGroup else "" locationGroup = self._voicemailLocationRegex.search(messageHtml) @@ -605,7 +605,7 @@ class GVoiceBackend(object): exactTimeGroup = self._exactVoicemailTimeRegex.search(messageHtml) exactTimeText = exactTimeGroup.group(1).strip() if exactTimeGroup else "" - conv.time = datetime.datetime.strptime(exactTimeText, "%m/%d/%y %I:%M %p") + conv.time = google_strptime(exactTimeText) relativeTimeGroup = self._relativeVoicemailTimeRegex.search(messageHtml) conv.relTime = relativeTimeGroup.group(1).strip() if relativeTimeGroup else "" locationGroup = self._voicemailLocationRegex.search(messageHtml) @@ -655,7 +655,7 @@ class GVoiceBackend(object): exactTimeGroup = self._exactVoicemailTimeRegex.search(messageHtml) exactTimeText = exactTimeGroup.group(1).strip() if exactTimeGroup else "" - conv.time = datetime.datetime.strptime(exactTimeText, "%m/%d/%y %I:%M %p") + conv.time = google_strptime(exactTimeText) relativeTimeGroup = self._relativeVoicemailTimeRegex.search(messageHtml) conv.relTime = relativeTimeGroup.group(1).strip() if relativeTimeGroup else "" conv.location = "" @@ -682,9 +682,6 @@ class GVoiceBackend(object): yield conv - def _decorate_sms(self, parsedTexts): - return parsedTexts - @staticmethod def _merge_conversation_sources(parsedMessages, json): for message in parsedMessages: @@ -725,6 +722,19 @@ class GVoiceBackend(object): return json +def google_strptime(time): + """ + Hack: Google always returns the time in the same locale. Sadly if the + local system's locale is different, there isn't a way to perfectly handle + the time. So instead we handle implement some time formatting + """ + abbrevTime = time[:-3] + parsedTime = datetime.datetime.strptime(abbrevTime, "%m/%d/%y %I:%M") + if time[-2] == "PN": + parsedTime += datetime.timedelta(hours=12) + return parsedTime + + def itergroup(iterator, count, padValue = None): """ Iterate in groups of 'count' values. If there @@ -804,13 +814,13 @@ def validate_response(response): def guess_phone_type(number): - if number.startswith("747") or number.startswith("1747"): + if number.startswith("747") or number.startswith("1747") or number.startswith("+1747"): return GVoiceBackend.PHONE_TYPE_GIZMO else: return GVoiceBackend.PHONE_TYPE_MOBILE -def set_sane_callback(backend): +def get_sane_callback(backend): """ Try to set a sane default callback number on these preferences 1) 1747 numbers ( Gizmo ) @@ -821,7 +831,9 @@ def set_sane_callback(backend): numbers = backend.get_callback_numbers() priorityOrderedCriteria = [ + ("\+1747", None), ("1747", None), + ("747", None), (None, "gizmo"), (None, "computer"), (None, "sip"), @@ -829,13 +841,31 @@ def set_sane_callback(backend): ] for numberCriteria, descriptionCriteria in priorityOrderedCriteria: + numberMatcher = None + descriptionMatcher = None + if numberCriteria is not None: + numberMatcher = re.compile(numberCriteria) + elif descriptionCriteria is not None: + descriptionMatcher = re.compile(descriptionCriteria, re.I) + for number, description in numbers.iteritems(): - if numberCriteria is not None and re.compile(numberCriteria).match(number) is None: + if numberMatcher is not None and numberMatcher.match(number) is None: continue - if descriptionCriteria is not None and re.compile(descriptionCriteria).match(description) is None: + if descriptionMatcher is not None and descriptionMatcher.match(description) is None: continue - backend.set_callback_number(number) - return + return number + + +def set_sane_callback(backend): + """ + Try to set a sane default callback number on these preferences + 1) 1747 numbers ( Gizmo ) + 2) anything with gizmo in the name + 3) anything with computer in the name + 4) the first value + """ + number = get_sane_callback(backend) + backend.set_callback_number(number) def _is_not_special(name):