no change, just formatted long lines
[myslice.git] / unfold / plugin.py
index 9189e71..bcc03aa 100644 (file)
@@ -17,11 +17,13 @@ from unfold.prelude import Prelude
 
 DEBUG= False
 #DEBUG= [ 'SimpleList' ]
-DEBUG=True
+#DEBUG=True
 
 # decorator to deflect calls on Plugin to its Prelude through self.page.prelude
 def to_prelude (method):
     def actual (self, *args, **kwds):
+        if not self.page: # jordan
+            return None
         prelude_method=Prelude.__dict__[method.__name__]
         return prelude_method(self.page.prelude,*args, **kwds)
     return actual
@@ -32,10 +34,14 @@ class Plugin:
     # we just need this to be unique in a page
     domid=0
 
-    @staticmethod
-    def newdomid():
+    # when a domid is not set by the caller, we name plugins after their respective class as well, 
+    # so as to limit name clashes between different views
+    # this has to see with the UI storing the last-seen status of plugins based on their id
+    # put it more bluntly it is recommended that a domid should be set 
+    # and maybe xxx we should just enforce that...
+    def newdomid(self):
         Plugin.domid += 1
-        return "plugin-%d"%Plugin.domid
+        return "plugin-%s-%d"%(self.__class__.__name__.lower(),Plugin.domid)
 
     ########## 
     # Constructor
@@ -65,19 +71,22 @@ class Plugin:
     # p=Plugin(foo='bar')
     # which will result in 'foo' being accessible to the template engine
     # 
-    def __init__ (self, page, title, domid=None,
-                  visible=True, togglable=True, toggled=None, **settings):
+    def __init__ (self, page, title=None, domid=None,
+                  visible=True, togglable=None, toggled=None, **settings):
         self.page = page
-        self.title=title
         # callers can provide their domid for css'ing 
-        if not domid: domid=Plugin.newdomid()
+        if not domid: domid=self.newdomid()
         self.domid=domid
+        # title is shown when togglable
+        #if not title: title="Plugin title for %s"%domid
+        self.title=title
         self.classname=self._py_classname()
         self.plugin_classname=self._js_classname()
         self.visible=visible
-        self.togglable=togglable
-        if toggled is not None: self.toggled=toggled
-        else:                   self.toggled=self.default_toggled()
+        if togglable is None:   self.togglable=self.default_togglable()
+        else:                   self.togglable=togglable
+        if toggled is None:     self.toggled=self.default_toggled()
+        else:                   self.toggled=toggled
         # what comes from subclasses
         for (k,v) in settings.iteritems():
             setattr(self,k,v)
@@ -88,7 +97,8 @@ class Plugin:
             for (k,v) in self.__dict__.items(): print "dbg %s:%s"%(k,v)
             print "%s init dbg .... END"%self.classname
         # do this only once the structure is fine
-        self.page.record_plugin(self)
+        if self.page: # I assume we can have a None page (Jordan)
+            self.page.record_plugin(self)
 
     def __repr__ (self):
         return "[%s]:%s"%(self.classname,self.domid)
@@ -156,17 +166,19 @@ class Plugin:
         self.need_spin=self.start_with_spin()
         env.update(self.__dict__)
         # translate high-level 'toggled' into 4 different booleans
-        print "domid",self.domid,"toggled",self.toggled
+        self.need_toggle = False
         if self.toggled=='persistent':
             # start with everything turned off and let the js callback do its job
-            env.update({'persistent_toggle':True,'display_hide_button':False,'display_show_button':False,'display_body':False})
+            env.update({'persistent_toggle':True,'display_hide_button':False,
+                        'display_show_button':False,'display_body':False})
         elif self.toggled==False:
-            env.update({'persistent_toggle':False,'display_hide_button':False,'display_show_button':True,'display_body':False})
+            env.update({'persistent_toggle':False,'display_hide_button':False,
+                        'display_show_button':True,'display_body':False})
         else:
-            env.update({'persistent_toggle':False,'display_hide_button':True,'display_show_button':False,'display_body':True})
+            env.update({'persistent_toggle':False,'display_hide_button':True,
+                        'display_show_button':False,'display_body':True})
         if self.need_debug(): 
             print "rendering plugin.html with env keys %s"%env.keys()
-            print "rendering plugin.html with env"
             for (k,v) in env.items(): 
                 if "display" in k or "persistent" in k: print k,'->',v
         result = render_to_string ('plugin.html',env)
@@ -251,6 +263,7 @@ class Plugin:
     def template_file (self):           return "undefined_template"
     def template_env (self, request):   return {}
 
+    def default_togglable (self):       return False
     def default_toggled (self):         return 'persistent'
 
 #    # tell the framework about requirements (for the document <header>)