enforce plugin initializion comes before queries get fired
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Fri, 15 Nov 2013 11:21:49 +0000 (12:21 +0100)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Fri, 15 Nov 2013 11:21:49 +0000 (12:21 +0100)
unfold/page.py
unfold/plugin.py
unfold/prelude.py
unfold/templates/prelude.html

index 40446e6..7f071c0 100644 (file)
@@ -115,11 +115,11 @@ class Page:
     def expose_js_metadata (self):
         # expose global MANIFOLD_METADATA as a js variable
         # xxx this is fetched synchroneously..
-        self.add_js_chunks("var MANIFOLD_METADATA =" + self.get_metadata().to_json() + ";")
+        self.add_js_init_chunks("var MANIFOLD_METADATA =" + self.get_metadata().to_json() + ";")
 
     def expose_js_manifold_config (self):
         config=Config()
-        self.add_js_chunks(config.manifold_js_export())
+        self.add_js_init_chunks(config.manifold_js_export())
 
     #################### requirements/prelude management
     # just forward to self.prelude - see decorator above
@@ -128,6 +128,8 @@ class Page:
     @to_prelude
     def add_css_files (self):pass
     @to_prelude
+    def add_js_init_chunks (self):pass
+    @to_prelude
     def add_js_chunks (self):pass
     @to_prelude
     def add_css_chunks (self):pass
index 8dd03bb..229f196 100644 (file)
@@ -195,7 +195,8 @@ class Plugin:
             env ['settings_json' ] = self.settings_json()
             # compute plugin-specific initialization
             js_init = render_to_string ( 'plugin-init.js', env )
-            self.add_js_chunks (js_init)
+            # make sure this happens first in js
+            self.add_js_init_chunks (js_init)
         
         # interpret the result of requirements ()
         self.handle_requirements (request)
@@ -252,6 +253,8 @@ class Plugin:
     @to_prelude
     def add_css_files (self):pass
     @to_prelude
+    def add_js_init_chunks (self):pass
+    @to_prelude
     def add_js_chunks (self):pass
     @to_prelude
     def add_css_chunks (self):pass
index 8c90a19..03e6def 100644 (file)
@@ -2,17 +2,29 @@ from types import StringTypes, ListType
 
 from django.template.loader import render_to_string
 
-debug=True
+debug=False
 
+# the need for js_init_chunks is because we need to have the plugins initialized
+# before the queries fly
+# and when writing a view it is not very easy to remember in which order
+# all the js initialization will end up, so we use these 2 categories 
+# as a simple way to enforce this dependency
+# far from perfect but good enough for now
 class Prelude:
 
-    """A class for collecting dependencies on js/css files or fragments"""
+    """A class for collecting dependencies on js/css stuff
+    files are expected from your 'static' area, typically 'css/foo.css' or 'js/foo.js'
+    fragments (chunks) is for raw code
+    you can specify a string or a list of strings
+    js_init_chunks get collated with js_chunks but come first
+    """
 
-    keys=[ 'js_files','css_files','js_chunks', 'css_chunks' ]
-    def __init__ (self, js_files=None, css_files=None, js_chunks=None, css_chunks=None):
+    keys=[ 'js_files', 'css_files', 'js_init_chunks', 'js_chunks', 'css_chunks' ]
+    def __init__ (self, js_files=None, css_files=None, js_init_chunks=None, js_chunks=None, css_chunks=None):
         # it's tempting to use sets but sets are not ordered..
         self.js_files  = Prelude._normalize(js_files)
         self.css_files = Prelude._normalize(css_files)
+        self.js_init_chunks = Prelude._normalize(js_init_chunks)
         self.js_chunks = Prelude._normalize(js_chunks)
         self.css_chunks= Prelude._normalize(css_chunks)
 
@@ -29,6 +41,8 @@ class Prelude:
     def add_css_files (self, x):
         for i in Prelude._normalize (x):
             if i not in self.css_files: self.css_files.append(i)
+    def add_js_init_chunks (self, x):
+        self.js_init_chunks += Prelude._normalize (x)
     def add_js_chunks (self, x):
         self.js_chunks += Prelude._normalize (x)
     def add_css_chunks (self, x):
@@ -36,7 +50,7 @@ class Prelude:
 
     def inspect_string (self,msg):
         result =  'Prelude.inspect %s (%s) with '%(msg,self)
-        result += ",".join( [ "%s->%s"%(k,len(getattr(self,k))) for k in ['js_files','js_chunks','css_files','css_chunks'] ] )
+        result += ",".join( [ "%s->%s"%(k,len(getattr(self,k))) for k in Prelude.keys ] )
         return result
     def inspect (self,msg):
         print self.inspect_string(msg)
@@ -69,11 +83,11 @@ class Prelude:
         env={}
         env['js_urls'] = [ Prelude.full_url (js_file) for js_file in self.js_files ]
         env['css_urls'] = [ Prelude.full_url (css_file) for css_file in self.css_files ]
-        env['js_chunks']= self.js_chunks
+        env['all_js_chunks']= self.js_init_chunks + self.js_chunks
         env['css_chunks']=self.css_chunks
         if debug:
-            print "prelude has %d js_files, %d css files, %d js chunks and %d css_chunks"%\
-                (len(self.js_files),len(self.css_files),len(self.js_chunks),len(self.css_chunks),)
+            print "prelude has %d js_files, %d css files, (%d+%d) js chunks and %d css_chunks"%\
+                (len(self.js_files),len(self.css_files),len(self.js_init_chunks),len(self.js_chunks),len(self.css_chunks),)
         # render this with prelude.html and put the result in header_prelude
         header_prelude = render_to_string ('prelude.html',env)
         return { 'header_prelude' : header_prelude }
index 898624e..4e2fc20 100644 (file)
@@ -2,5 +2,5 @@
 {% endfor %}
 {% for css_url in css_urls %} <link rel='stylesheet' type='text/css' href='{{ css_url|safe }}' /> 
 {% endfor %}
-<script type="text/javascript"> {% for js_chunk in js_chunks %} {{ js_chunk|safe }} {% endfor %} </script>
+<script type="text/javascript"> {% for js_chunk in all_js_chunks %} {{ js_chunk|safe }} {% endfor %} </script>
 <style type="text/css"> {% for css_chunk in css_chunks %} {{ css_chunk|safe }} {% endfor %} </style>