Imitiating buttfly in being explicitly typed
[theonering] / src / location.py
index 1965255..32b5823 100644 (file)
@@ -1,32 +1,70 @@
+import logging
+
 import telepathy
 
+import util.misc as misc_utils
+import handle
+
+
+_moduleLogger = logging.getLogger(__name__)
+
 
-class LocationMixin(telepathy.server.ConnectionInterfaceLocation):
+#class LocationMixin(tp.ConnectionInterfaceLocation):
+class LocationMixin(object):
 
        def __init__(self):
-               telepathy.server.ConnectionInterfaceLocation.__init__(self)
+               #tp.ConnectionInterfaceLocation.__init__(self)
+               pass
 
        @property
-       def gvoice_backend(self):
+       def session(self):
                """
                @abstract
                """
-               raise NotImplementedError()
+               raise NotImplementedError("Abstract property called")
 
+       @misc_utils.log_exception(_moduleLogger)
        def GetLocations(self, contacts):
                """
                @returns {Contact: {Location Type: Location}}
                """
-               raise NotImplementedError()
+               contactLocation = (
+                       (contact, self._get_location(contact))
+                       for contact in contacts
+               )
+               return dict(
+                       (contact, location)
+                       for (contact, location) in contactLocation
+                       if location
+               )
 
+       @misc_utils.log_exception(_moduleLogger)
        def RequestLocation(self, contact):
                """
                @returns {Location Type: Location}
                """
-               raise NotImplementedError()
+               return self._get_location(contact)
 
+       @misc_utils.log_exception(_moduleLogger)
        def SetLocation(self, location):
                """
                Since presence is based off of phone numbers, not allowing the client to change it
                """
                raise telepathy.errors.PermissionDenied()
+
+       def _get_location(self, contact):
+               h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, contact)
+               if isinstance(h, handle.ConnectionHandle):
+                       number = self.session.backend.get_callback_number()
+               else:
+                       number = h.phoneNumber
+
+               rawData = self.session.location.request_location(number)
+               if rawData is None:
+                       return {}
+
+               data = {
+                       "country": rawData["country"],
+                       "city": rawData["city"],
+                       "region": rawData["region"],
+               }