[forms, commands, templates] Add extended example vocabs and tags to paster command and reintegrate with form
[ckanext-datagovau.git] / ckanext / example / forms.py
blob:a/ckanext/example/forms.py -> blob:b/ckanext/example/forms.py
--- a/ckanext/example/forms.py
+++ b/ckanext/example/forms.py
@@ -7,8 +7,10 @@
 from ckan.logic.schema import package_form_schema, group_form_schema
 from ckan.lib.base import c, model
 from ckan.plugins import IDatasetForm, IGroupForm, IConfigurer
+from ckan.plugins import IGenshiStreamFilter
 from ckan.plugins import implements, SingletonPlugin
-from ckan.lib.navl.validators import ignore_missing, keep_extras
+from ckan.lib.navl.validators import ignore_missing, keep_extras, not_empty
+import ckan.lib.plugins
 
 log = logging.getLogger(__name__)
 
@@ -27,15 +29,15 @@
       - ``IConfigurer`` allows us to override configuration normally
         found in the ``ini``-file.  Here we use it to specify where the
         form templates can be found.
-        
+
       - ``IGroupForm`` allows us to provide a custom form for a dataset
-        based on the 'type' that may be set for a group.  Where the 
-        'type' matches one of the values in group_types then this 
-        class will be used. 
+        based on the 'type' that may be set for a group.  Where the
+        'type' matches one of the values in group_types then this
+        class will be used.
     """
     implements(IGroupForm, inherit=True)
     implements(IConfigurer, inherit=True)
-    
+
     def update_config(self, config):
         """
         This IConfigurer implementation causes CKAN to look in the
@@ -47,7 +49,7 @@
                                     'example', 'theme', 'templates')
         config['extra_template_paths'] = ','.join([template_dir,
                 config.get('extra_template_paths', '')])
-            
+
     def group_form(self):
         """
         Returns a string representing the location of the template to be
@@ -73,11 +75,11 @@
         Returns true iff this provides the fallback behaviour, when no other
         plugin instance matches a group's type.
 
-        As this is not the fallback controller we should return False.  If 
+        As this is not the fallback controller we should return False.  If
         we were wanting to act as the fallback, we'd return True
         """
-        return False                
-                
+        return False
+
     def form_to_db_schema(self):
         """
         Returns the schema for mapping group data from a form to a format
@@ -91,7 +93,7 @@
         format suitable for the form (optional)
         """
         return {}
-        
+
     def check_data_dict(self, data_dict):
         """
         Check if the return data is correct.
@@ -102,10 +104,10 @@
     def setup_template_variables(self, context, data_dict):
         """
         Add variables to c just prior to the template being rendered.
-        """                
-                
-
-class ExampleDatasetForm(SingletonPlugin):
+        """
+
+
+class ExampleDatasetForm(SingletonPlugin, ckan.lib.plugins.DefaultDatasetForm):
     """This plugin demonstrates how a theme packaged as a CKAN
     extension might extend CKAN behaviour.
 
@@ -120,8 +122,9 @@
         class will be used.
     """
     implements(IDatasetForm, inherit=True)
-    implements(IConfigurer, inherit=True)    
-    
+    implements(IConfigurer, inherit=True)
+    implements(IGenshiStreamFilter, inherit=True)
+
     def update_config(self, config):
         """
         This IConfigurer implementation causes CKAN to look in the
@@ -198,7 +201,7 @@
             'composer_tags': [ignore_missing, convert_to_tags(COMPOSER_VOCAB)]
         })
         return schema
-    
+
     def db_to_form_schema(self):
         """
         Returns the schema for mapping package data from the database into a
@@ -217,6 +220,10 @@
             ],
             'published_by': [convert_from_extras, ignore_missing],
         })
+        schema['groups'].update({
+            'name': [not_empty, unicode],
+            'title': [ignore_missing]
+        })
         return schema
 
     def check_data_dict(self, data_dict):
@@ -225,26 +232,37 @@
         """
         return
 
-    # def filter(self, stream):
-    #     # Add vocab tags to the bottom of the sidebar.
-    #     from pylons import request
-    #     from genshi.filters import Transformer
-    #     from genshi.input import HTML
-    #     routes = request.environ.get('pylons.routes_dict')
-    #     if routes.get('controller') == 'package' \
-    #         and routes.get('action') == 'read':
-    #             for vocab in (self.genre_vocab, self.composer_vocab):
-    #                 vocab_tags = [tag for tag in c.pkg_dict.get('tags', [])
-    #                         if tag.get('vocabulary_id') == vocab.id]
-    #                 if not vocab_tags:
-    #                     continue
-    #                 html = '<li class="sidebar-section">'
-    #                 html = html + '<h3>%s</h3>' % vocab.name
-    #                 html = html + '<ul class="tags clearfix">'
-    #                 for tag in vocab_tags:
-    #                     html = html + '<li>%s</li>' % tag.get('name')
-    #                 html = html + "</ul></li>"
-    #                 stream = stream | Transformer("//div[@id='sidebar']")\
-    #                     .append(HTML(html))
-    #     return stream
-
+    def filter(self, stream):
+        # Add vocab tags to the bottom of the sidebar.
+        from pylons import request
+        from genshi.filters import Transformer
+        from genshi.input import HTML
+        routes = request.environ.get('pylons.routes_dict')
+        context = {'model': model}
+        if routes.get('controller') == 'package' \
+            and routes.get('action') == 'read':
+                for vocab in (GENRE_VOCAB, COMPOSER_VOCAB):
+                    try:
+                        vocab = get_action('vocabulary_show')(context, {'id': vocab})
+                        vocab_tags = [t for t in c.pkg_dict.get('tags', [])
+                                      if t.get('vocabulary_id') == vocab['id']]
+                    except NotFound:
+                        vocab_tags = None
+
+                    if not vocab_tags:
+                        continue
+
+                    html = '<li class="sidebar-section">'
+                    if vocab['name'] == GENRE_VOCAB:
+                        html = html + '<h3>Musical Genre</h3>'
+                    elif vocab['name'] == COMPOSER_VOCAB:
+                        html = html + '<h3>Composer</h3>'
+                    html = html + '<ul class="tags clearfix">'
+                    for tag in vocab_tags:
+                        html = html + '<li>%s</li>' % tag['name']
+                    html = html + "</ul></li>"
+                    stream = stream | Transformer(
+                        "//div[@id='sidebar']//ul[@class='widget-list']"
+                    ).append(HTML(html))
+        return stream
+