unfold: better management of static files thanks to finders for plugins and third...
authorJordan Augé <jordan.auge@lip6.fr>
Thu, 8 Aug 2013 23:35:39 +0000 (01:35 +0200)
committerJordan Augé <jordan.auge@lip6.fr>
Thu, 8 Aug 2013 23:35:39 +0000 (01:35 +0200)
plugins: cleaned up plugin structure to better serve staticfiles

111 files changed:
myslice/settings.py
myslice/urls.py
plugins/active_filters/static/active_filters.html [moved from plugins/active_filters/active_filters.html with 100% similarity]
plugins/active_filters/static/css/active_filters.css [moved from plugins/active_filters/active_filters.css with 100% similarity]
plugins/active_filters/static/img/details_close.png [moved from plugins/active_filters/details_close.png with 100% similarity]
plugins/active_filters/static/img/details_open.png [moved from plugins/active_filters/details_open.png with 100% similarity]
plugins/active_filters/static/js/active_filters.js [moved from plugins/active_filters/active_filters.js with 100% similarity]
plugins/code_editor/static/code_editor.html [moved from plugins/code_editor/code_editor.html with 100% similarity]
plugins/code_editor/static/img/handle-h.png [moved from plugins/code_editor/img/handle-h.png with 100% similarity]
plugins/code_editor/static/img/handle-v.png [moved from plugins/code_editor/img/handle-v.png with 100% similarity]
plugins/code_editor/static/img/initializing.png [moved from plugins/code_editor/img/initializing.png with 100% similarity]
plugins/code_editor/static/js/Actions.js [moved from plugins/code_editor/Actions.js with 100% similarity]
plugins/code_editor/static/js/EditorCM.js [moved from plugins/code_editor/EditorCM.js with 100% similarity]
plugins/code_editor/static/js/LayoutCM.js [moved from plugins/code_editor/LayoutCM.js with 100% similarity]
plugins/code_editor/static/js/code_editor.js [moved from plugins/code_editor/code_editor.js with 100% similarity]
plugins/code_editor/static/js/moo-clientcide-1.3.js [moved from plugins/code_editor/moo-clientcide-1.3.js with 100% similarity]
plugins/debug_platform/static/css/debug_platform.css [moved from plugins/debug_platform/debug_platform.css with 100% similarity]
plugins/debug_platform/static/debug_platform.html [moved from plugins/debug_platform/debug_platform.html with 100% similarity]
plugins/debug_platform/static/js/debug_platform.js [moved from plugins/debug_platform/debug_platform.js with 100% similarity]
plugins/form/static/css/form.css [moved from plugins/form/form.css with 100% similarity]
plugins/form/static/form.html [moved from plugins/form/form.html with 100% similarity]
plugins/form/static/js/form.js [moved from plugins/form/form.js with 100% similarity]
plugins/form/static/js/jquery.validate.js [moved from plugins/form/jquery.validate.js with 100% similarity]
plugins/googlemap/static/css/googlemap.css [moved from plugins/googlemap/googlemap.css with 100% similarity]
plugins/googlemap/static/googlemap.html [moved from plugins/googlemap/googlemap.html with 100% similarity]
plugins/googlemap/static/js/googlemap.js [moved from plugins/googlemap/googlemap.js with 100% similarity]
plugins/googlemap/static/js/markerclusterer.js [moved from plugins/googlemap/markerclusterer.js with 100% similarity]
plugins/googlemap/static/js/markerclusterer_compiled.js [moved from plugins/googlemap/markerclusterer_compiled.js with 100% similarity]
plugins/googlemap/static/js/markerclusterer_packed.js [moved from plugins/googlemap/markerclusterer_packed.js with 100% similarity]
plugins/hazelnut/static/css/hazelnut.css [moved from plugins/hazelnut/hazelnut.css with 100% similarity]
plugins/hazelnut/static/hazelnut.html [moved from plugins/hazelnut/hazelnut.html with 100% similarity]
plugins/hazelnut/static/img/README [moved from plugins/hazelnut/img/README with 100% similarity]
plugins/hazelnut/static/img/tablesort-bullet1.png [moved from plugins/hazelnut/img/tablesort-bullet1.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-bullet2.png [moved from plugins/hazelnut/img/tablesort-bullet2.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-col-alt.png [moved from plugins/hazelnut/img/tablesort-col-alt.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-gradient.png [moved from plugins/hazelnut/img/tablesort-gradient.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-header-down.png [moved from plugins/hazelnut/img/tablesort-header-down.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-header-sortable.png [moved from plugins/hazelnut/img/tablesort-header-sortable.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-header-up.png [moved from plugins/hazelnut/img/tablesort-header-up.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-header.png [moved from plugins/hazelnut/img/tablesort-header.png with 100% similarity]
plugins/hazelnut/static/img/tablesort-td-alt.png [moved from plugins/hazelnut/img/tablesort-td-alt.png with 100% similarity]
plugins/hazelnut/static/img/toggle-hidden.png [moved from plugins/hazelnut/img/toggle-hidden.png with 100% similarity]
plugins/hazelnut/static/img/toggle-visible.png [moved from plugins/hazelnut/img/toggle-visible.png with 100% similarity]
plugins/hazelnut/static/js/hazelnut.js [moved from plugins/hazelnut/hazelnut.js with 100% similarity]
plugins/lists/static/css/simplelist.css [moved from plugins/lists/simplelist.css with 100% similarity]
plugins/lists/static/css/staticlist.css [moved from plugins/lists/staticlist.css with 100% similarity]
plugins/lists/static/js/simplelist.js [moved from plugins/lists/simplelist.js with 100% similarity]
plugins/lists/static/js/with-datatables.js [moved from plugins/lists/with-datatables.js with 100% similarity]
plugins/lists/static/simplelist.html [moved from plugins/lists/simplelist.html with 100% similarity]
plugins/lists/static/staticlist.html [moved from plugins/lists/staticlist.html with 100% similarity]
plugins/messages/static/css/messages.css [moved from plugins/messages/messages.css with 100% similarity]
plugins/messages/static/js/messages.js [moved from plugins/messages/messages.js with 100% similarity]
plugins/messages/static/messages.html [moved from plugins/messages/messages.html with 100% similarity]
plugins/myplugin/static/css/myplugin.css [moved from plugins/myplugin/myplugin.css with 100% similarity]
plugins/myplugin/static/js/myplugin.js [moved from plugins/myplugin/myplugin.js with 100% similarity]
plugins/myplugin/static/myplugin.html [moved from plugins/myplugin/myplugin.html with 100% similarity]
plugins/pres_view/static/css/jquery-ui.css [moved from plugins/pres_view/jquery-ui.css with 100% similarity]
plugins/pres_view/static/css/pres_view.css [moved from plugins/pres_view/pres_view.css with 100% similarity]
plugins/pres_view/static/js/MooTools.js [moved from plugins/pres_view/MooTools.js with 100% similarity]
plugins/pres_view/static/js/afficher_par_id.js [moved from plugins/pres_view/afficher_par_id.js with 100% similarity]
plugins/pres_view/static/js/config.js [moved from plugins/pres_view/config.js with 100% similarity]
plugins/pres_view/static/js/dynamic.js [moved from plugins/pres_view/dynamic.js with 100% similarity]
plugins/pres_view/static/js/initmap.js [moved from plugins/pres_view/initmap.js with 100% similarity]
plugins/pres_view/static/js/jquery-ui.min.js [moved from plugins/pres_view/jquery-ui.min.js with 100% similarity]
plugins/pres_view/static/js/jquery.min.js [moved from plugins/pres_view/jquery.min.js with 100% similarity]
plugins/pres_view/static/js/mootools-core.js [moved from plugins/pres_view/mootools-core.js with 100% similarity]
plugins/pres_view/static/js/pres_view.js [moved from plugins/pres_view/pres_view.js with 100% similarity]
plugins/pres_view/static/js/recup_data.js [moved from plugins/pres_view/recup_data.js with 100% similarity]
plugins/pres_view/static/js/recup_direct.js [moved from plugins/pres_view/recup_direct.js with 100% similarity]
plugins/pres_view/static/js/recup_liste.js [moved from plugins/pres_view/recup_liste.js with 100% similarity]
plugins/pres_view/static/js/recup_tout_sites.js [moved from plugins/pres_view/recup_tout_sites.js with 100% similarity]
plugins/pres_view/static/js/visible.js [moved from plugins/pres_view/visible.js with 100% similarity]
plugins/pres_view/static/pres_view.html [moved from plugins/pres_view/pres_view.html with 100% similarity]
plugins/query_editor/static/css/demo_page.css [moved from plugins/query_editor/demo_page.css with 100% similarity]
plugins/query_editor/static/css/demo_table.css [moved from plugins/query_editor/demo_table.css with 100% similarity]
plugins/query_editor/static/css/query_editor.css [moved from plugins/query_editor/query_editor.css with 100% similarity]
plugins/query_editor/static/filter_input_integer.html [moved from plugins/query_editor/filter_input_integer.html with 100% similarity]
plugins/query_editor/static/filter_input_others.html [moved from plugins/query_editor/filter_input_others.html with 100% similarity]
plugins/query_editor/static/filter_input_string.html [moved from plugins/query_editor/filter_input_string.html with 100% similarity]
plugins/query_editor/static/filter_input_string_values.html [moved from plugins/query_editor/filter_input_string_values.html with 100% similarity]
plugins/query_editor/static/img/details_close.png [new file with mode: 0644]
plugins/query_editor/static/img/myslice-icon-filter.png [moved from plugins/query_editor/images/myslice-icon-filter.png with 100% similarity]
plugins/query_editor/static/js/query_editor.js [moved from plugins/query_editor/query_editor.js with 99% similarity]
plugins/query_editor/static/query_editor.html [moved from plugins/query_editor/query_editor.html with 76% similarity]
plugins/querycode/static/css/querycode.css [moved from plugins/querycode/querycode.css with 100% similarity]
plugins/querycode/static/js/querycode.js [moved from plugins/querycode/querycode.js with 100% similarity]
plugins/querycode/static/querycode.html [moved from plugins/querycode/querycode.html with 100% similarity]
plugins/quickfilter/static/css/quickfilter.css [moved from plugins/quickfilter/quickfilter.css with 100% similarity]
plugins/quickfilter/static/js/quickfilter.js [moved from plugins/quickfilter/quickfilter.js with 100% similarity]
plugins/quickfilter/static/quickfilter.html [moved from plugins/quickfilter/quickfilter.html with 100% similarity]
plugins/resources_selected/static/css/resources_selected.css [moved from plugins/resources_selected/resources_selected.css with 100% similarity]
plugins/resources_selected/static/js/resources_selected.js [moved from plugins/resources_selected/resources_selected.js with 100% similarity]
plugins/resources_selected/static/resources_selected.html [moved from plugins/resources_selected/templates/resources_selected.html with 100% similarity]
plugins/senslabmap/static/css/senslabmap.css [moved from plugins/senslabmap/senslabmap.css with 100% similarity]
plugins/senslabmap/static/js/grenoble.js [moved from plugins/senslabmap/grenoble.js with 100% similarity]
plugins/senslabmap/static/js/senslabmap.js [moved from plugins/senslabmap/senslabmap.js with 100% similarity]
plugins/senslabmap/static/js/three.js [moved from plugins/senslabmap/three.js with 100% similarity]
plugins/senslabmap/static/js/viewer3D.js [moved from plugins/senslabmap/viewer3D.js with 100% similarity]
plugins/senslabmap/static/senslabmap.html [moved from plugins/senslabmap/senslabmap.html with 100% similarity]
plugins/stack/static/stack.html [moved from plugins/stack/stack.html with 100% similarity]
plugins/tabs/static/css/tabs.css [moved from plugins/tabs/tabs.css with 100% similarity]
plugins/tabs/static/js/tabs.js [moved from plugins/tabs/tabs.js with 100% similarity]
plugins/tabs/static/tabs.html [moved from plugins/tabs/tabs.html with 100% similarity]
plugins/updater/static/css/updater.css [moved from plugins/updater/updater.css with 100% similarity]
plugins/updater/static/js/updater.js [moved from plugins/updater/updater.js with 100% similarity]
plugins/updater/static/updater.html [moved from plugins/updater/updater.html with 100% similarity]
plugins/wizard/static/css/wizard.css [moved from plugins/wizard/wizard.css with 100% similarity]
plugins/wizard/static/js/wizard.js [moved from plugins/wizard/wizard.js with 100% similarity]
plugins/wizard/static/test.html [moved from plugins/wizard/test.html with 100% similarity]
plugins/wizard/static/wizard.html [moved from plugins/wizard/wizard.html with 100% similarity]
unfold/static.py [new file with mode: 0644]

index c9b3005..92bbf9c 100644 (file)
@@ -37,10 +37,6 @@ EMAIL_HOST = "localhost"
 EMAIL_PORT = 25
 EMAIL_USE_TLS = False
 
-
-
-
-
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
@@ -92,24 +88,43 @@ STATIC_ROOT = os.path.join(ROOT,'django-static')
 
 # URL prefix for static files.
 # Example: "http://media.lawrence.com/static/"
-STATIC_URL = '/all-static/'
+# thierry STATIC_URL = '/all-static/'
+STATIC_URL = '/static/'
 
 # Additional locations of static files
 STATICFILES_DIRS = (
     # Put strings here, like "/home/html/static" or "C:/www/django/static".
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
-    os.path.join(ROOT,'all-static'),
+    # thierry os.path.join(ROOT,'all-static'),
+    ('js', os.path.join(ROOT,'manifold/js')),
+    ('js', os.path.join(ROOT,'unfold/js')),
+    ('js', os.path.join(ROOT,'auth/js')),
+    ('css', os.path.join(ROOT,'manifold/css')),
+    ('css', os.path.join(ROOT,'unfold/css')),
+    ('css', os.path.join(ROOT,'views/css')),
+    ('img', os.path.join(ROOT,'views/img')),
 )
 
+# Needed by PluginFinder
+PLUGIN_DIR = os.path.join(ROOT,'plugins')
+# ThirdPartyFinder
+THIRDPARTY_DIR = os.path.join(ROOT, 'third-party')
+
 # List of finder classes that know how to find static files in
 # various locations.
 STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder',
     'django.contrib.staticfiles.finders.AppDirectoriesFinder',
+    'unfold.static.PluginFinder',
+    'unfold.static.ThirdPartyFinder',
 #    'django.contrib.staticfiles.finders.DefaultStorageFinder',
 )
 
+TEMPLATE_CONTEXT_PROCESSORS = (
+    'django.core.context_processors.static',
+)
+
 # Make this unique, and don't share it with anybody.
 SECRET_KEY = 't%n(3h)&amp;r^n8(+8)(sp29t^$c2#t(m3)e2!02l8w1#36tl#t27'
 
index b37ee50..8accdb5 100644 (file)
@@ -1,4 +1,5 @@
 from django.conf.urls import patterns, include, url
+from django.conf      import settings
 
 # Uncomment the next two lines to enable the admin:
 # from django.contrib import admin
@@ -51,5 +52,8 @@ urlpatterns = patterns(
     url(r'^portal/', include('portal.urls')),
     # Debug
     url(r'^debug/', include('debug_platform.urls')),
+    # Static files
+    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
+
 
 )
diff --git a/plugins/query_editor/static/img/details_close.png b/plugins/query_editor/static/img/details_close.png
new file mode 100644 (file)
index 0000000..fcc23c6
Binary files /dev/null and b/plugins/query_editor/static/img/details_close.png differ
similarity index 99%
rename from plugins/query_editor/query_editor.js
rename to plugins/query_editor/static/js/query_editor.js
index ff2136e..e065a65 100644 (file)
@@ -47,7 +47,7 @@
                 manifold.raise_event(self.options.query_uuid, this.checked?FIELD_ADDED:FIELD_REMOVED, this.value);
             });
 
-            /* The following code adds an expandable column for the table */
+            /* The following code adds an expandable column for the table
             // XXX Why isn't it done statically ?
             var nCloneTh = document.createElement( 'th' );
             var nCloneTd = document.createElement( 'td' );
@@ -62,6 +62,7 @@
             this.el('table tbody tr').each(function() {
                 this.insertBefore(nCloneTd.cloneNode( true ), this.childNodes[0]);
             });
+            */
          
             // We are currently using a DataTable display, but another browsing component could be better
             //jQuery('#'+this.options.plugin_uuid+'-table').dataTable...
@@ -71,7 +72,7 @@
                 bInfo       : false,
                 sScrollX    : '100%',         // Horizontal scrolling
                 sScrollY    : '200px',
-                bJQueryUI   : true,           // Use jQuery UI
+                //bJQueryUI   : true,           // Use jQuery UI
                 bProcessing : true,           // Loading
                 aaSorting   : [[ 1, "asc" ]], // sort by column fields on load
                 aoColumnDefs: [
similarity index 76%
rename from plugins/query_editor/query_editor.html
rename to plugins/query_editor/static/query_editor.html
index e366a64..930053c 100644 (file)
@@ -8,9 +8,10 @@ EOF;
 EOF; -->
 
 <div>
-  <table id='{{domid}}__table' class='display'>
+  <table id='{{domid}}__table' class='display' width='95%'>
     <thead>
       <tr>
+        <th class='center'>Info</th>
         <th class='center'>Field</th>
         <th class='center'>Resource</th>
         <th class='center'>Type</th>
@@ -24,10 +25,11 @@ EOF; -->
     {% for field in fields %}
 
       <tr>
-        <td class='center'><b> {{ field.name }}</b></td>
-        <td class='center'> {{ field.resource_type }}</td>
-        <td class='center'> {{ field.type }}</td>
-        <td class='center'> {{ field.filter_input }}</td>
+        <td class='center'><span class='ui-icon ui-icon-triangle-1-e' style='cursor:pointer'></span></td>
+        <td class='center'>{{ field.name }}</td>
+        <td class='center'>{{ field.resource_type }}</td>
+        <td class='center'>{{ field.type }}</td>
+        <td class='center'>{{ field.filter_input }}</td>
         <td class='center'>
           <input class='queryeditor-check' id='{{domid}}__check__{{ field.name }}' name='{{ field.header }}' type='checkbox' autocomplete='off' value='{{ field.name }}' {% if field.checked %} checked {% endif %}></input>
         </td>
@@ -38,4 +40,3 @@ EOF; -->
     </tbody>
   </table>
 </div>
-
diff --git a/unfold/static.py b/unfold/static.py
new file mode 100644 (file)
index 0000000..815e8e2
--- /dev/null
@@ -0,0 +1,101 @@
+import os
+from django.conf import settings
+from django.utils.datastructures import SortedDict
+from django.contrib.staticfiles.finders import BaseFinder, FileSystemFinder
+from django.core.files.storage import FileSystemStorage
+
+class PluginFinder(FileSystemFinder):
+    """
+    A static files finder that looks in the directory of each plugin as
+    specified in the source_dir attribute of the given storage class.
+    """
+    def __init__(self, *args, **kwargs):
+        # The list of plugins that are handled
+        self.locations = []
+        # Mapping of plugin module paths to storage instances
+        self.storages = SortedDict()
+        plugins_dir = self.get_immediate_subdirs(settings.PLUGIN_DIR)
+        for root in plugins_dir:
+            if not os.path.exists(root) or not os.path.isdir(root):
+                continue
+            if ('', root) not in self.locations:
+                self.locations.append(('', root))
+        for _, root in self.locations:
+            filesystem_storage = FileSystemStorage(location=root)
+            filesystem_storage.prefix = ''
+            self.storages[root] = filesystem_storage
+
+    def get_immediate_subdirs(self, dir):
+        return [os.path.join(dir, name, 'static') for name in os.listdir(dir) 
+                if os.path.isdir(os.path.join(dir, name))]
+
+class ThirdPartyFinder(BaseFinder):
+    """
+    A static files inder that looks in the directory of each third-party
+    resources and tries to preserve the location of each file
+    """
+    # third-party/MODULE/path/to/js
+    extensions = {
+        # PREFIX : EXTENSIONS
+        ''   : ('.html',),
+        'js' : ('.js',),
+        'css': ('.css',),
+        'img': ('.png', '.ico',),
+    }
+
+    def find(self, search_path, all=False):
+        """
+        Given a relative file path this ought to find an
+        absolute file path.
+
+        If the ``all`` parameter is ``False`` (default) only
+        the first found file path will be returned; if set
+        to ``True`` a list of all found files paths is returned.
+        """
+        matches = []
+        #all_extensions = reduce(lambda x,y : x + y, extensions.values())
+
+        for (path, dirs, files) in os.walk(settings.THIRDPARTY_DIR):
+            for file in files:
+                name, extension = os.path.splitext(file)
+
+                for type, extensions in self.extensions.items():
+                    if not extension in extensions:
+                        continue
+                    if search_path == os.path.join(type, file):
+                        matched_path = os.path.join(path, file) 
+                        if not all:
+                            return matched_path
+                        matches.append(matched_path)
+        return matches
+
+    def list(self, ignore_patterns):
+        """
+        Given an optional list of paths to ignore, this should return
+        a two item iterable consisting of the relative path and storage
+        instance.
+        """
+        for (path, dirs, files) in os.walk(settings.THIRDPARTY_DIR):
+            for file in files:
+                name, extension = os.path.splitext(file)
+
+                for type, extensions in self.extensions.items():
+                    if not extension in extensions:
+                        continue
+                    filesystem_storage = FileSystemStorage(location=path)
+                    filesystem_storage.prefix = type
+                    yield file, filesystem_storage
+
+class BaseFinder(object):
+    """
+    A base file finder to be used for custom staticfiles finder classes.
+    """
+
+    def list(self, ignore_patterns):
+        """
+        Given an optional list of paths to ignore, this should return
+        a two item iterable consisting of the relative path and storage
+        instance.
+        """
+        raise NotImplementedError()
+