Data fetching from server now done in separate thread.
authorpropeller <propeller@propeller-laptop.localdomain>
Wed, 27 May 2009 15:46:07 +0000 (18:46 +0300)
committerpropeller <propeller@propeller-laptop.localdomain>
Wed, 27 May 2009 15:46:07 +0000 (18:46 +0300)
canola-rtm/rtm/model.py

index 27f8b51..0034237 100644 (file)
 # permission to convey the resulting work.
 
 import logging
+import urllib2
+import socket
 
 from terra.core.manager import Manager
 from terra.core.task import Task
 from terra.core.model import ModelFolder, Model
+from terra.core.threaded_func import ThreadedFunction
 
 from client import Client
 
@@ -57,22 +60,61 @@ class RTMTaskModel(Model):
 class ServiceModelFolder(ModelFolder):
     terra_type = "Model/Folder/Task/Apps/RTM/Service"
 
+    threaded_search = True
     empty_msg = "No tasks found"
 
     def __init__(self, name, parent):
         ModelFolder.__init__(self, name, parent)
+        self.callback_notify = None
         # TODO change token
         self.client = Client('1e6e489de9374b43ba280ab9741d290c', 'c7197d30f722247d', '1f4c8846175f4bafcf70f7742f4670e41b0ab046')
 
     def do_load(self):
         self.search()
 
-    def search(self):
+    def search(self, end_callback=None):
         del self.children[:]
 
-        for c in self.do_search():
-            self.children.append(c)
-        return
+        if not self.threaded_search:
+            for item in self.do_search():
+                self.children.append(item)
+            return
+
+        def refresh():
+            return self.do_search()
+
+        def refresh_finished(exception, retval):
+            if not self.is_loading:
+                log.info("model is not loading")
+                return
+
+            if exception is not None:
+                if type(exception) is socket.gaierror or \
+                        type(exception) is urllib2.URLError:
+                    emsg = "Unable to connect to server.<br>" + \
+                        "Check your connection and try again."
+                else:
+                    emsg = "An unknown error has occured."
+
+                log.error(exception)
+
+                if self.callback_notify:
+                    self.callback_notify(CanolaError(emsg))
+
+            if retval is None:
+                self.inform_loaded()
+                return
+
+            for item in retval:
+                self.children.append(item)
+
+            if end_callback:
+                end_callback()
+
+            self.inform_loaded()
+
+        self.is_loading = True
+        ThreadedFunction(refresh_finished, refresh).start()
 
     def do_search(self):
         raise NotImplementedError("must be implemented by subclasses")