Plugin now has __repr__
[unfold.git] / unfold / composite.py
index 409b1bc..ffa6de9 100644 (file)
@@ -1,27 +1,42 @@
 from unfold.plugin import Plugin
 
+# this is a simple base class for plugins that contain/arrange a set of other plugins
+# sons is expected to be a list of the contained plugins, and 
+# active_domid is the domid for the one son that should be displayed as active
+# some subclasses of Composite, like e.g. Tabs, will not behave as expected 
+# if a valid active_domid is not be provided
+
 class Composite (Plugin):
 
-    def __init__ (self, sons=[], active=None, *args, **kwds):
+    def __init__ (self, sons=[], active_domid=None, *args, **kwds):
         Plugin.__init__ (self, *args, **kwds)
         self.sons=sons
-        self.active=active
+        self.active_domid=active_domid
+        # make sure this is valid, unset otherwise, so we always have exactly one active
+        self.check_active_domid()
+        
+    def check_active_domid(self):
+        matches= [ son for son in self.sons if son.domid==self.active_domid ]
+        if len(matches)!=1: 
+            print "WARNING: %s has %d valid son(s) for being active - expecting 1, resetting"%\
+                (self,len(matches))
+            self.active_domid=None
         
     def insert (self, plugin):
         self.sons.append(plugin)
 
-    # xxx currently there is no guarantee that exactly one son will be active
     def template_env (self, request):
         # this is designed so as to support a template like
         # {% for son in sons %} {{ son.rendered }} ...
-        def is_active (son):
-#            print 'comparing >%s< and >%s<'%(son.domid,self.active)
-            return son.domid==self.active
+        def is_active (son,rank):
+            # if active_domid is not specified, make the first one active
+            if not self.active_domid: return rank==0
+            return son.domid==self.active_domid
         ranks=range(len(self.sons))
         env = { 'sons':
                  [ { 'rendered': son.render(request),
                      'rank': rank,
-                     'active': is_active(son),
+                     'is_active': is_active(son,rank),
                      'title': son.title,
                      'domid': son.domid,
                      'classname': son.classname,