From f3a672c9451884a75c3686c157f76aecfc6b0645 Mon Sep 17 00:00:00 2001 From: Ross Jones Date: Tue, 7 Aug 2012 14:59:25 +0100 Subject: [PATCH] Removed old internal ckanext-organizations --- ckanext/organizations/__init__.py | 6 - ckanext/organizations/controllers.py | 173 ---------- ckanext/organizations/forms.py | 271 --------------- .../email/join_publisher_request.txt | 12 - .../templates/organization_apply.html | 15 - .../templates/organization_apply_form.html | 49 --- .../templates/organization_form.html | 156 --------- .../templates/organization_history.html | 59 ---- .../templates/organization_index.html | 24 -- .../templates/organization_layout.html | 44 --- .../templates/organization_new.html | 14 - .../templates/organization_package_form.html | 324 ------------------ .../templates/organization_read.html | 81 ----- .../templates/organization_users.html | 16 - .../templates/organization_users_form.html | 72 ---- 15 files changed, 1316 deletions(-) delete mode 100644 ckanext/organizations/__init__.py delete mode 100644 ckanext/organizations/controllers.py delete mode 100644 ckanext/organizations/forms.py delete mode 100644 ckanext/organizations/templates/email/join_publisher_request.txt delete mode 100644 ckanext/organizations/templates/organization_apply.html delete mode 100644 ckanext/organizations/templates/organization_apply_form.html delete mode 100644 ckanext/organizations/templates/organization_form.html delete mode 100644 ckanext/organizations/templates/organization_history.html delete mode 100644 ckanext/organizations/templates/organization_index.html delete mode 100644 ckanext/organizations/templates/organization_layout.html delete mode 100644 ckanext/organizations/templates/organization_new.html delete mode 100644 ckanext/organizations/templates/organization_package_form.html delete mode 100644 ckanext/organizations/templates/organization_read.html delete mode 100644 ckanext/organizations/templates/organization_users.html delete mode 100644 ckanext/organizations/templates/organization_users_form.html diff --git a/ckanext/organizations/__init__.py b/ckanext/organizations/__init__.py deleted file mode 100644 index 9472ce03e3b..00000000000 --- a/ckanext/organizations/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -'''Organization form - -Provides a form for organization creation -''' -__version__ = '0.1' - diff --git a/ckanext/organizations/controllers.py b/ckanext/organizations/controllers.py deleted file mode 100644 index fbe6e25e464..00000000000 --- a/ckanext/organizations/controllers.py +++ /dev/null @@ -1,173 +0,0 @@ -import logging - -from ckan.lib.base import BaseController, c, model, request, render, h, g -from ckan.lib.base import ValidationException, abort, gettext -from pylons.i18n import get_lang, _ -from ckan.lib.alphabet_paginate import AlphaPage -from ckan.lib.dictization.model_dictize import package_dictize - -import ckan.forms -import ckan.authz as authz -import ckan.lib.dictization.model_save as model_save -import ckan.lib.mailer as mailer -import ckan.lib.navl.dictization_functions as dict_func -import ckan.logic as logic -import ckan.logic.action as action -import ckan.logic.schema as schema -import ckan.model as model - -import pylons.config as config -from ckan.lib.navl.validators import (ignore_missing, - not_empty, - empty, - ignore, - keep_extras,) - -class OrganizationController(BaseController): - - def _send_application( self, group, reason ): - from genshi.template.text import NewTextTemplate - - if not reason: - h.flash_error(_("There was a problem with your submission, \ - please correct it and try again")) - errors = {"reason": ["No reason was supplied"]} - return self.apply(group.id, errors=errors, - error_summary=action.error_summary(errors)) - - admins = group.members_of_type( model.User, 'admin' ).all() - recipients = [(u.fullname,u.email) for u in admins] if admins else \ - [(config.get('ckan.admin.name', "CKAN Administrator"), - config.get('ckan.admin.email', None), )] - - if not recipients: - h.flash_error(_("There is a problem with the system configuration")) - errors = {"reason": ["No group administrator exists"]} - return self.apply(group.id, data=data, errors=errors, - error_summary=action.error_summary(errors)) - - extra_vars = { - 'group' : group, - 'requester': c.userobj, - 'reason' : reason - } - email_msg = render("email/join_publisher_request.txt", extra_vars=extra_vars, - loader_class=NewTextTemplate) - - try: - for (name,recipient) in recipients: - mailer.mail_recipient(name, - recipient, - "Publisher request", - email_msg) - except: - h.flash_error(_("There is a problem with the system configuration")) - errors = {"reason": ["No mail server was found"]} - return self.apply(group.id, errors=errors, - error_summary=action.error_summary(errors)) - - h.flash_success(_("Your application has been submitted")) - h.redirect_to( 'publisher_read', id=group.name) - - def apply(self, id=None, data=None, errors=None, error_summary=None): - """ - A user has requested access to this publisher and so we will send an - email to any admins within the publisher. - """ - if 'parent' in request.params and not id: - id = request.params['parent'] - - if id: - c.group = model.Group.get(id) - if 'save' in request.params and not errors: - return self._send_application(c.group, request.params.get('reason', None)) - - self._add_publisher_list() - data = data or {} - errors = errors or {} - error_summary = error_summary or {} - - data.update(request.params) - - vars = {'data': data, 'errors': errors, 'error_summary': error_summary} - c.form = render('organization_apply_form.html', extra_vars=vars) - return render('organization_apply.html') - - def _add_users( self, group, parameters ): - if not group: - h.flash_error(_("There was a problem with your submission, \ - please correct it and try again")) - errors = {"reason": ["No reason was supplied"]} - return self.apply(group.id, errors=errors, - error_summary=action.error_summary(errors)) - - data_dict = logic.clean_dict(dict_func.unflatten( - logic.tuplize_dict(logic.parse_params(request.params)))) - data_dict['id'] = group.id - - # Temporary fix for strange caching during dev - l = data_dict['users'] - for d in l: - d['capacity'] = d.get('capacity','editor') - - context = { - "group" : group, - "schema": schema.default_group_schema(), - "model": model, - "session": model.Session - } - - # Temporary cleanup of a capacity being sent without a name - users = [d for d in data_dict['users'] if len(d) == 2] - data_dict['users'] = users - - model.repo.new_revision() - model_save.group_member_save(context, data_dict, 'users') - model.Session.commit() - - h.redirect_to( controller='group', action='edit', id=group.name) - - - def users(self, id, data=None, errors=None, error_summary=None): - c.group = model.Group.get(id) - - if not c.group: - abort(404, _('Group not found')) - - context = { - 'model': model, - 'session': model.Session, - 'user': c.user or c.author, - 'group': c.group } - - try: - logic.check_access('group_update',context) - except logic.NotAuthorized, e: - abort(401, _('User %r not authorized to edit %s') % (c.user, id)) - - if 'save' in request.params and not errors: - return self._add_users(c.group, request.params) - - data = data or {} - errors = errors or {} - error_summary = error_summary or {} - - data['users'] = [] - data['users'].extend( { "name": user.name, - "capacity": "admin" } - for user in c.group.members_of_type( model.User, "admin" ).all() ) - data['users'].extend( { "name": user.name, - "capacity": "editor" } - for user in c.group.members_of_type( model.User, 'editor' ).all() ) - - vars = {'data': data, 'errors': errors, 'error_summary': error_summary} - c.form = render('organization_users_form.html', extra_vars=vars) - - return render('organization_users.html') - - def _add_publisher_list(self): - c.possible_parents = model.Session.query(model.Group).\ - filter(model.Group.state == 'active').\ - filter(model.Group.type == 'organization').\ - order_by(model.Group.title).all() - diff --git a/ckanext/organizations/forms.py b/ckanext/organizations/forms.py deleted file mode 100644 index de60afb03d5..00000000000 --- a/ckanext/organizations/forms.py +++ /dev/null @@ -1,271 +0,0 @@ -import os, logging - -import ckan.authz as authz -from ckan.logic import NotAuthorized -from ckan.logic.schema import group_form_schema, default_package_schema -from ckan.lib import base -from ckan.lib.base import c, model, abort, request -from ckan.lib.base import redirect, _, config, h -from ckan.lib.navl.dictization_functions import DataError -from ckan.plugins import IGroupForm, IDatasetForm, IConfigurer, IRoutes -from ckan.plugins import implements, SingletonPlugin -from ckan.logic import check_access - -from ckan.lib.navl.validators import (ignore_missing, - not_empty, - empty, - ignore, - keep_extras, - ) - -log = logging.getLogger(__name__) - -class OrganizationForm(SingletonPlugin): - """ - This plugin implements an IGroupForm for form associated with a - organization group. ``IConfigurer`` is used to add the local template - path and the IGroupForm supplies the custom form. - """ - implements(IGroupForm, inherit=True) - implements(IConfigurer, inherit=True) - implements(IRoutes) - implements(IConfigurer) - - def before_map(self, map): - controller = 'ckanext.organizations.controllers:OrganizationController' - map.connect('/organization/users/{id}', controller=controller, action='users') - map.connect('/organization/apply/{id}', controller=controller, action='apply') - map.connect('/organization/apply', controller=controller, action='apply') - map.connect('/organization/edit/{id}', controller='group', action='edit') - map.connect('/organization/new', controller='group', action='new') - map.connect('/organization/{id}', controller='group', action='read') - map.connect('/organization', controller='group', action='index') - map.redirect('/organizations', '/organization') - return map - - def after_map(self, map): - return map - - def update_config(self, config): - """ - This IConfigurer implementation causes CKAN to look in the - ```templates``` directory when looking for the group_form() - """ - here = os.path.dirname(__file__) - rootdir = os.path.dirname(os.path.dirname(here)) - template_dir = os.path.join(rootdir, 'ckanext', - 'organizations', 'templates') - config['extra_template_paths'] = ','.join([template_dir, - config.get('extra_template_paths', '')]) - - # Override /group/* as the default groups urls - config['ckan.default.group_type'] = 'organization' - - def new_template(self): - """ - Returns a string representing the location of the template to be - rendered for the new page - """ - return 'organization_new.html' - - def index_template(self): - """ - Returns a string representing the location of the template to be - rendered for the index page - """ - return 'organization_index.html' - - - def read_template(self): - """ - Returns a string representing the location of the template to be - rendered for the read page - """ - return 'organization_read.html' - - def history_template(self): - """ - Returns a string representing the location of the template to be - rendered for the read page - """ - return 'organization_history.html' - - - def group_form(self): - """ - Returns a string representing the location of the template to be - rendered. e.g. "forms/group_form.html". - """ - return 'organization_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 ["organization"] - - def is_fallback(self): - """ - 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 - we were wanting to act as the fallback, we'd return True - """ - 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 group_form_schema() - - 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. We should - use the available groups for the current user, but should be optional - in case this is a top level group - """ - c.user_groups = c.userobj.get_groups('organization') - local_ctx = {'model': model, 'session': model.Session, - 'user': c.user or c.author} - - try: - check_access('group_create', local_ctx) - c.is_superuser_or_groupadmin = True - except NotAuthorized: - c.is_superuser_or_groupadmin = False - - if 'group' in context: - group = context['group'] - # Only show possible groups where the current user is a member - c.possible_parents = c.userobj.get_groups('organization', 'admin') - - c.parent = None - grps = group.get_groups('organization') - if grps: - c.parent = grps[0] - c.users = group.members_of_type(model.User) - -class OrganizationDatasetForm(SingletonPlugin): - - implements(IDatasetForm, inherit=True) - - def is_fallback(self): - return True - - def package_types(self): - return ['dataset'] - - def new_template(self): - """ - Returns a string representing the location of the template to be - rendered for the new page - """ - return 'package/new.html' - - def comments_template(self): - """ - Returns a string representing the location of the template to be - rendered for the comments page - """ - return 'package/comments.html' - - def search_template(self): - """ - Returns a string representing the location of the template to be - rendered for the search page (if present) - """ - return 'package/search.html' - - def read_template(self): - """ - Returns a string representing the location of the template to be - rendered for the read page - """ - return 'package/read.html' - - def history_template(self): - """ - Returns a string representing the location of the template to be - rendered for the history page - """ - return 'package/history.html' - - def package_form(self): - return 'organization_package_form.html' - - - def db_to_form_schema(self): - '''This is an interface to manipulate data from the database - into a format suitable for the form (optional)''' - #schema = default_package_schema() - #schema['groups']['capacity'] = [ ignore_missing, unicode ] - #return schema - - def form_to_db_schema(self): - schema = default_package_schema() - schema['groups']['capacity'] = [ ignore_missing, unicode ] - return schema - - def check_data_dict(self, data_dict, schema=None): - '''Check if the return data is correct, mostly for checking out - if spammers are submitting only part of the form''' - - # Resources might not exist yet (eg. Add Dataset) - surplus_keys_schema = ['__extras', '__junk', 'state', 'groups', - 'extras_validation', 'save', 'return_to', - 'resources', 'type'] - -# if not schema: -# schema = self.form_to_db_schema() -# schema_keys = schema.keys() -# keys_in_schema = set(schema_keys) - set(surplus_keys_schema) - -# missing_keys = keys_in_schema - set(data_dict.keys()) -# if missing_keys: -# log.info('incorrect form fields posted, missing %s' % missing_keys) -# raise DataError(data_dict) - - def setup_template_variables(self, context, data_dict): - from pylons import config - - data_dict.update({'available_only':True}) - - c.groups_available = c.userobj and c.userobj.get_groups('organization') or [] - c.licences = [('', '')] + base.model.Package.get_license_options() - c.is_sysadmin = authz.Authorizer().is_sysadmin(c.user) - - ## This is messy as auths take domain object not data_dict - context_pkg = context.get('package', None) - pkg = context_pkg or c.pkg - if pkg: - try: - if not context_pkg: - context['package'] = pkg - check_access('package_change_state', context) - c.auth_for_change_state = True - except NotAuthorized: - c.auth_for_change_state = False diff --git a/ckanext/organizations/templates/email/join_publisher_request.txt b/ckanext/organizations/templates/email/join_publisher_request.txt deleted file mode 100644 index c15b46e0c54..00000000000 --- a/ckanext/organizations/templates/email/join_publisher_request.txt +++ /dev/null @@ -1,12 +0,0 @@ -Dear administrator, - -A request has been made for membership of your organization $group.title by $requester.name {% if requester.fullname %}( $requester.fullname ){% end %} - -The reason given for the request was: - -"$reason" - -Please contact the user to verify and then if you would like to add this user you can do so by visiting ${h.url_for(controller='ckanext.organizers.controllers:OrganizationController', action='users', id=group.name, qualified=True) } - -If you do not wish to add this user you can safely disregard this email. - diff --git a/ckanext/organizations/templates/organization_apply.html b/ckanext/organizations/templates/organization_apply.html deleted file mode 100644 index e4450a52a89..00000000000 --- a/ckanext/organizations/templates/organization_apply.html +++ /dev/null @@ -1,15 +0,0 @@ - - - Apply - Apply for membership - - -
- ${Markup(c.form)} -
- - - - diff --git a/ckanext/organizations/templates/organization_apply_form.html b/ckanext/organizations/templates/organization_apply_form.html deleted file mode 100644 index 4799eb96536..00000000000 --- a/ckanext/organizations/templates/organization_apply_form.html +++ /dev/null @@ -1,49 +0,0 @@ - -
- -
-

Errors in form

-

The form contains invalid entries:

-
    -
  • ${"%s: %s" % (key, error)}
  • -
-
- - - -
-
-
- -
-
- -
- - -
-
- -
- Please explain to the owner your reasons for wishing to become an editor of this organization -
-
-
- - -
- - - - -
-
diff --git a/ckanext/organizations/templates/organization_form.html b/ckanext/organizations/templates/organization_form.html deleted file mode 100644 index 5a1dc6abe96..00000000000 --- a/ckanext/organizations/templates/organization_form.html +++ /dev/null @@ -1,156 +0,0 @@ -
- - - -
-

Errors in form

-

The form contains invalid entries:

-
    -
  • ${"%s: %s" % (key if not key=='Name' else 'URL', error)}
  • -
-
- -
-
- -
- -
-
-
- -
-
- ${h.url(controller='group', action='index')+'/'} - -
-

 

-

Warning: URL is very long. Consider changing it to something shorter.

-

2+ characters, lowercase, using only 'a-z0-9' and '-_'

-

${errors.get('name', '')}

-
-
-
- -
- ${markdown_editor('description', data.get('description'), 'notes', _('Start with a summary sentence ...'))} -
-
-
- -
- -

The URL for the image that is associated with this organization.

-
-
-
- -
- -
-
-
- -
- -
- - ${ c.parent.title } - - - No parent organization - -
-
- -
-
- - -
-

Extras

-
- - -
- -
- - - -
-
-
-
- -
- -
- - -
-
-
-
-
-
- - -
-

Users (${len(c.users.all())})

-Manage users - -
- -
- - - - -
-
-
-

There are no users currently in this publisher.

-
- - -
- - - - -
- diff --git a/ckanext/organizations/templates/organization_history.html b/ckanext/organizations/templates/organization_history.html deleted file mode 100644 index acf10d1db35..00000000000 --- a/ckanext/organizations/templates/organization_history.html +++ /dev/null @@ -1,59 +0,0 @@ - - - History: ${c.group.display_name} - History: ${c.group.display_name} - -
-

- Revisions - -

-
- -

- Error: ${c.error} -

- - - - - - - - - - - - - - - - -
RevisionTimestampAuthorLog Message
- ${h.radio("selected1", revision_dict['id'], checked=(index == 0))} - ${h.radio("selected2", revision_dict['id'], checked=(index == len(c.group_revisions)-1))} - - ${revision_dict['id']} - ${revision_dict['timestamp']}${h.linked_user(revision_dict['author'])}${revision_dict['message']}
- -
-
- - - - - - - diff --git a/ckanext/organizations/templates/organization_index.html b/ckanext/organizations/templates/organization_index.html deleted file mode 100644 index f5b200f48d0..00000000000 --- a/ckanext/organizations/templates/organization_index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Organizations - Organizations - - -
  • -

    What Are Organizations?

    - Whilst tags are great at collecting datasets together, there are occasions when you want to restrict users from editing a collection. An organization can be set-up to specify which users have permission to add or remove datasets from it. -
  • -
    - - -
    - ${c.page.pager()} - ${group_list_from_dict(c.page.items)} - ${c.page.pager()} -
    - - - diff --git a/ckanext/organizations/templates/organization_layout.html b/ckanext/organizations/templates/organization_layout.html deleted file mode 100644 index 0e4c8c4a431..00000000000 --- a/ckanext/organizations/templates/organization_layout.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - diff --git a/ckanext/organizations/templates/organization_new.html b/ckanext/organizations/templates/organization_new.html deleted file mode 100644 index 06a155136db..00000000000 --- a/ckanext/organizations/templates/organization_new.html +++ /dev/null @@ -1,14 +0,0 @@ - - - Add an organization - Add an organization - -
    - ${Markup(c.form)} -
    - - - - diff --git a/ckanext/organizations/templates/organization_package_form.html b/ckanext/organizations/templates/organization_package_form.html deleted file mode 100644 index e5cd0ece3a7..00000000000 --- a/ckanext/organizations/templates/organization_package_form.html +++ /dev/null @@ -1,324 +0,0 @@ -
    - -
    -

    Errors in form

    -

    The form contains invalid entries:

    -
      -
    • ${"%s: %s" % (key if not key=='Name' else 'URL', error)} - -
        - -
      • - Resource ${idx}: -
          -
        • ${thiskey}: ${errorinfo};
        • -
        -
      • -
        -
      -
      -
    • - -
    -
    - -
    -
    - -
    - -

    ${errors.get('title', '')}

    -
    -
    - -
    - -
    -
    - ${h.url(controller='package', action='search')+'/'} - -
    -

     

    -

    Warning: URL is very long. Consider changing it to something shorter.

    -

    2+ characters, lowercase, using only 'a-z0-9' and '-_'

    -

    ${errors.get('name', '')}

    -
    -
    - -
    - -
    - -

    The URL for the web page describing the data (not the data itself).

    -

    e.g. http://www.example.com/growth-figures.html

    -

    ${errors.get('url', '')}

    -
    -
    - -
    - -
    - -

    (Don't worry if you don't know which license the data has been released under).

    -
    -
    - - -
    - -
    -
    -
      -
    • -
    • -
    - - - You can use Markdown formatting here. -
    -
    -
    - -
    - -
    - - - - - - - - - - ${organization.get('title', '')} - - Cannot add any organizations. -
    -
    - -
    - -
    - -

    Comma-separated terms that may link this dataset to similar ones. For more information on conventions, see this wiki page.

    -

    e.g. pollution, rivers, water quality

    -

    ${errors.get('tag_string', '')}

    -
    -
    -
    - -
    - Add Resources -
    -

    Upload or link data files, APIs and other materials related to your dataset.

    -
    -
    - -
    - -
    -
    - -
    - - - - - - -
    -
    - -
    -
    - -
    - -

    The name of the main contact, for enquiries about this particular dataset, using the e-mail address in the following field.

    -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -

    If there is another important contact person (in addition to the person in the Author field) then provide details here.

    -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -

    A number representing the version (if applicable)

    -

    e.g. 1.2.0

    -
    -
    -
    - -
    -

    Adding custom fields to the dataset such as "location:uk" can help users find it in the search engine. This data will also appear under Additional Information when viewing the dataset.

    - - -
    - -
    - - - -
    -
    -
    -
    - -
    - -
    - - -
    -
    -
    -
    -
    - -
    -
    -
    Delete
    -
    -

    Do you really want to change the state of this dataset?   

    - - This dataset is   - - -
    -
    -
    - -
    -
    - -
    -

    Briefly describe the changes you have made...

    - -
    -
    -
    - - -
    - -

    - Since you have not signed in this will just be your IP address. - Click here to sign in before saving (opens in new window). -

    -
    - -
    - - - - -

    - Important: By submitting content, you agree to release your contributions under the Open Database License. Please refrain from editing this page if you are not happy to do this. -

    -
    -
    - - -
    diff --git a/ckanext/organizations/templates/organization_read.html b/ckanext/organizations/templates/organization_read.html deleted file mode 100644 index f7f9a1a48e8..00000000000 --- a/ckanext/organizations/templates/organization_read.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - ${c.group_dict.display_name} - ${c.group_dict.display_name} - - ${c.group.image_url} - - - - - - - -
  • -
      - -
    • -

      Administrators

      -
        -
      • ${h.linked_user(admin)}
      • -
      -
    • -
      - -
    • -

      Members

      -
        -
      • ${h.linked_user(editor)}
      • -
      -
    • -
      -
    -
  • - ${facet_div('tags', 'Tags')} - ${facet_div('res_format', 'Resource Formats')} -
    - - -

    State: ${c.group['state']}

    -
    -
    - ${c.description_formatted} -
    -
    - -
    -
    -

    Datasets

    - - - ${field_list()} - -

    You searched for "${c.q}". ${c.page.item_count} datasets found.

    - ${c.page.pager()} - ${package_list_from_dict(c.page.items)} - ${c.page.pager()} -
    -
    - - - diff --git a/ckanext/organizations/templates/organization_users.html b/ckanext/organizations/templates/organization_users.html deleted file mode 100644 index 21ae7cfecea..00000000000 --- a/ckanext/organizations/templates/organization_users.html +++ /dev/null @@ -1,16 +0,0 @@ - - - Users: ${c.group.display_name} - Users: ${c.group.display_name} - - -
    - ${Markup(c.form)} -
    - - - - - diff --git a/ckanext/organizations/templates/organization_users_form.html b/ckanext/organizations/templates/organization_users_form.html deleted file mode 100644 index cc9ff15e0bf..00000000000 --- a/ckanext/organizations/templates/organization_users_form.html +++ /dev/null @@ -1,72 +0,0 @@ -
    - -
    -

    Errors in form

    -

    The form contains invalid entries:

    -
      -
    • ${"%s: %s" % (key, error)}
    • -
    -
    - - - -
    -

    Users

    -
    - -
    - - - -
    - Admin - Editor - - -
    -
    -
    -
    -

    There are no users currently in this organization.

    - -

    Add users

    -
    -
    - -
    -
    -
    - - -
    - - - - -
    - - - -
    -