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 56bba8f30e6..00000000000
--- a/ckanext/organizations/controllers.py
+++ /dev/null
@@ -1,174 +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("organizations/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('organizations/apply_form.html', extra_vars=vars)
- return render('organizations/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('organizations/users_form.html', extra_vars=vars)
-
- return render('organizations/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 a9542973b46..00000000000
--- a/ckanext/organizations/forms.py
+++ /dev/null
@@ -1,274 +0,0 @@
-import os
-import logging
-
-import ckan.authz as authz
-from ckan.logic import NotAuthorized
-from ckan.logic.schema import group_form_schema, form_to_db_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
-import ckan.plugins as p
-
-from ckan.plugins import IGroupForm, IDatasetForm, IConfigurer, IRoutes
-from ckan.plugins import implements, SingletonPlugin
-from ckan.logic import check_access
-from ckan.logic.validators import tag_string_convert
-from ckan.lib.navl.validators import (ignore_missing,
- not_empty,
- empty,
- ignore,
- keep_extras)
-
-log = logging.getLogger(__name__)
-
-
-def group_required(key, data, errors, context):
- """ We want at least a group in the data we are provided """
- has_group = ('groups', 0, 'id') in data
- if not has_group:
- errors[('Organizations', '')] = \
- [_('Please choose an organization to add the dataset to')]
-
-
-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()
- """
- templates = 'templates'
- if p.toolkit.asbool(config.get('ckan.legacy_templates', False)):
- templates = 'templates_legacy'
- p.toolkit.add_template_directory(config, templates)
- p.toolkit.add_public_directory(config, 'public')
-
- # 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 'organizations/new.html'
-
- def index_template(self):
- """
- Returns a string representing the location of the template to be
- rendered for the index page
- """
- return 'organizations/index.html'
-
- def read_template(self):
- """
- Returns a string representing the location of the template to be
- rendered for the read page
- """
- return 'organizations/read.html'
-
- def history_template(self):
- """
- Returns a string representing the location of the template to be
- rendered for the read page
- """
- return 'organizations/history.html'
-
- def edit_template(self):
- """
- Returns a string representing the location of the template to be
- rendered for the edit page
- """
- return 'organization_edit.html'
-
- def group_form(self):
- """
- Returns a string representing the location of the template to be
- rendered. e.g. "forms/group_form.html".
- """
- return 'organizations/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 'organizations/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)'''
-
- def form_to_db_schema(self):
- schema = form_to_db_package_schema()
- schema['groups']['capacity'] = [ignore_missing, unicode]
- schema['__after'] = [group_required]
- 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'''
-
- 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_edit.html b/ckanext/organizations/templates/organization_edit.html
deleted file mode 100644
index 224d0733463..00000000000
--- a/ckanext/organizations/templates/organization_edit.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- {{ _('There are currently no organizations for this site') }}. - {% if h.check_access('package_create') %} - {% link_for _('How about creating one?'), controller='group', action='new' %}. - {% endif %} -
- {% endif %} -Organizations allow you to add both users and datasets to it in order to control who can access and manage your datasets
- {% endtrans %} -An organization can be set-up to specify which users have permission to add or - remove datasets from it.
- {% endtrans %} -You searched for "${c.q}". ${c.page.item_count} datasets found.
- ${c.page.pager()} - ${package_list_from_dict(c.page.items)} - ${c.page.pager()} -