[setup] tidy up
--- a/README.rst
+++ b/README.rst
@@ -12,6 +12,8 @@
* A custom Pylons controller for overriding some core CKAN behaviour
* A custom Package edit form
+
+* A custom Group edit form
* A plugin that allows for custom forms to be used for datasets based on
their "type".
--- a/ckanext/example/forms.py
+++ b/ckanext/example/forms.py
@@ -7,6 +7,7 @@
from ckan.logic import NotFound, NotAuthorized, ValidationError
from ckan.logic import tuplize_dict, clean_dict, parse_params
import ckan.logic.schema as default_schema
+from ckan.logic.schema import group_form_schema
from ckan.logic.schema import package_form_schema
import ckan.logic.validators as val
from ckan.lib.base import BaseController, render, c, model, abort, request
@@ -16,7 +17,7 @@
from ckan.lib.navl.dictization_functions import Invalid
from ckan.lib.navl.dictization_functions import validate, missing
from ckan.lib.navl.dictization_functions import DataError, flatten_dict, unflatten
-from ckan.plugins import IDatasetForm, IConfigurer
+from ckan.plugins import IDatasetForm, IGroupForm, IConfigurer
from ckan.plugins import implements, SingletonPlugin
from ckan.lib.navl.validators import (ignore_missing,
@@ -29,15 +30,17 @@
log = logging.getLogger(__name__)
class ExampleGroupForm(SingletonPlugin):
- """This plugin demonstrates how a theme packaged as a CKAN
- extension might extend CKAN behaviour.
-
- In this case, we implement twos extension interfaces to provide custom
+ """This plugin demonstrates how a class packaged as a CKAN
+ extension might extend CKAN behaviour by providing custom forms
+ based on the type of a Group.
+
+ In this case, we implement two extension interfaces to provide custom
forms for specific types of group.
- ``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
@@ -65,6 +68,19 @@
"""
return 'forms/group_form.html'
+ def group_types(self):
+ """
+ Returns an iterable of group type strings.
+
+ If a request involving a group of one of those types is made, then
+ this plugin instance will be delegated to.
+
+ There must only be one plugin registered to each group type. Any
+ attempts to register more than one plugin instance to a given group
+ type will raise an exception at startup.
+ """
+ return ["testgroup"]
+
def is_fallback(self):
"""
Returns true iff this provides the fallback behaviour, when no other
@@ -75,7 +91,31 @@
"""
return False
-
+ def form_to_db_schema(self):
+ """
+ Returns the schema for mapping group data from a form to a format
+ suitable for the database.
+ """
+ return group_form_schema()
+
+ def db_to_form_schema(self):
+ """
+ Returns the schema for mapping group data from the database into a
+ format suitable for the form (optional)
+ """
+ return {}
+
+ def check_data_dict(self, data_dict):
+ """
+ Check if the return data is correct.
+
+ raise a DataError if not.
+ """
+
+ def setup_template_variables(self, context, data_dict):
+ """
+ Add variables to c just prior to the template being rendered.
+ """
class ExampleDatasetForm(SingletonPlugin):
@@ -135,7 +175,7 @@
attempts to register more than one plugin instance to a given package
type will raise an exception at startup.
"""
- return ["example"]
+ return ["example_dataset_form"]
def setup_template_variables(self, context, data_dict=None):
"""
@@ -161,7 +201,6 @@
schema = {
'title': [not_empty, unicode],
'name': [not_empty, unicode, val.name_validator, val.package_name_validator],
- 'notes': [not_empty, unicode],
'date_released': [date_to_db, convert_to_extras],
'date_updated': [date_to_db, convert_to_extras],
--- a/ckanext/example/plugin.py
+++ b/ckanext/example/plugin.py
@@ -21,9 +21,11 @@
found in the ``ini``-file. Here we use it to specify the site
title, and to tell CKAN to look in this package for templates
and resources that customise the core look and feel.
+
- ``IGenshiStreamFilter`` allows us to filter and transform the
HTML stream just before it is rendered. In this case we use
it to rename "frob" to "foobar"
+
- ``IRoutes`` allows us to add new URLs, or override existing
URLs. In this example we use it to override the default
``/register`` behaviour with a custom controller
--- a/ckanext/example/theme/templates/forms/dataset_form.html
+++ b/ckanext/example/theme/templates/forms/dataset_form.html
@@ -12,7 +12,7 @@
</ul>
</div>
-<fieldset>
+<fieldset id='section-basic-information'>
<legend>Basic information</legend>
<dl>
<dt><label class="field_req" for="title">Title *</label></dt>
@@ -37,7 +37,7 @@
</dl>
</fieldset>
-<fieldset>
+<fieldset id='section-further-information'>
<legend>Details</legend>
<dl>
<dt><label class="field_opt" for="date_released">Date released</label></dt>
@@ -95,7 +95,7 @@
<dd class="field_error" py:if="errors.get('taxonomy_url', '')">${errors.get('taxonomy_url', '')}</dd>
</dl>
</fieldset>
-<fieldset>
+<fieldset id='section-resources'>
<legend>Resources</legend>
<table class="flexitable">
<thead>
@@ -125,7 +125,7 @@
<div class="field_error" py:if="errors.get('resources', '')">Package resource(s) incomplete.</div>
</fieldset>
-<fieldset>
+<fieldset id='section-more-details'>
<legend>More details</legend>
<dl>
<dt><label class="field_req" for="published_by">Published by *</label></dt>
--- a/ckanext/example/theme/templates/forms/group_form.html
+++ b/ckanext/example/theme/templates/forms/group_form.html
@@ -14,7 +14,7 @@
<fieldset id="basic-information">
<dl>
- <dt><label class="field_opt" for="name">Title</label></dt>
+ <dt><label class="field_opt" for="name">The Title</label></dt>
<dd><input class="js-title" id="title" name="title" type="text" value="${data.get('title', '')}"/></dd>
<dt><label class="field_opt" for="title">Url</label></dt>
--- a/ckanext/example/theme/templates/home/index.html
+++ b/ckanext/example/theme/templates/home/index.html
@@ -22,6 +22,7 @@
<p id="examplething">
Here is the frob
</p>
+ ${select("*")}
</div>
<xi:include href="layout.html" />
--- a/ckanext/example/theme/templates/layout.html
+++ b/ckanext/example/theme/templates/layout.html
@@ -9,9 +9,10 @@
<!-- ! a custom primary nav -->
<py:match path="//div[@class='menu']">
<div class="menu">
- ${h.nav_link(c, _('Home'), controller='home', action='index', id=None)}
- ${h.nav_link(c, _('Data'), controller='package', action='index', id=None)}
- ${h.nav_link(c, _('New dataset'), controller='package', action='new', id=None)}
+ ${h.nav_link(c, _('Home'), controller='home', action='index')}
+ ${h.nav_link(c, _('Data'), controller='package', action='index')}
+ ${h.nav_link(c, _('New dataset'), controller='package', action='new')}
+ ${h.nav_link(c, _('New group'), controller='group', action='new')}
</div>
</py:match>
--- a/setup.py
+++ b/setup.py
@@ -1,14 +1,12 @@
from setuptools import setup, find_packages
-import sys, os
version = '0.2'
setup(
name='ckanext-example',
version=version,
- description="Example extension for customising CKAN",
- long_description="""\
- """,
+ description='Example extension for customising CKAN',
+ long_description='',
classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
keywords='',
author='Seb Bacon',