Skip to content

Commit

Permalink
Merge branch 'master' into feature-1583-qa
Browse files Browse the repository at this point in the history
  • Loading branch information
teajaymars committed Jan 25, 2012
2 parents 46018fb + 1b64e9a commit 87a724c
Show file tree
Hide file tree
Showing 19 changed files with 378 additions and 119 deletions.
8 changes: 8 additions & 0 deletions ckan/config/routing.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ def make_map():
controller='api', action='list',
requirements=dict(register=register_list_str),
conditions=dict(method=['GET']))
map.connect('/api/{ver:1|2}/rest/{register}/{id}/:subregister',
controller='api', action='create',
requirements=dict(register=register_list_str),
conditions=dict(method=['POST']))
map.connect('/api/{ver:1|2}/rest/{register}/{id}/:subregister/{id2}',
controller='api', action='create',
requirements=dict(register=register_list_str),
Expand Down Expand Up @@ -135,6 +139,10 @@ def make_map():
controller='api', action='list',
requirements=dict(register=register_list_str),
conditions=dict(method=['GET']))
map.connect('/api/rest/{register}/{id}/:subregister',
controller='api', action='create',
requirements=dict(register=register_list_str),
conditions=dict(method=['POST']))
map.connect('/api/rest/{register}/{id}/:subregister/{id2}',
controller='api', action='create',
requirements=dict(register=register_list_str),
Expand Down
26 changes: 13 additions & 13 deletions ckan/controllers/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,17 +266,17 @@ def _represent_package(self, package):
def create(self, ver=None, register=None, subregister=None, id=None, id2=None):

action_map = {
('dataset', 'relationships'): get_action('package_relationship_create'),
('package', 'relationships'): get_action('package_relationship_create'),
('dataset', 'relationships'): get_action('package_relationship_create_rest'),
('package', 'relationships'): get_action('package_relationship_create_rest'),
'group': get_action('group_create_rest'),
'dataset': get_action('package_create_rest'),
'package': get_action('package_create_rest'),
'rating': get_action('rating_create'),
}

for type in model.PackageRelationship.get_all_types():
action_map[('dataset', type)] = get_action('package_relationship_create')
action_map[('package', type)] = get_action('package_relationship_create')
action_map[('dataset', type)] = get_action('package_relationship_create_rest')
action_map[('package', type)] = get_action('package_relationship_create_rest')

context = {'model': model, 'session': model.Session, 'user': c.user,
'api_version': ver}
Expand All @@ -296,6 +296,7 @@ def create(self, ver=None, register=None, subregister=None, id=None, id2=None):
return self._finish_bad_request(
gettext('Cannot create new entity of this type: %s %s') % \
(register, subregister))

try:
response_data = action(context, data_dict)
location = None
Expand Down Expand Up @@ -325,17 +326,16 @@ def create(self, ver=None, register=None, subregister=None, id=None, id2=None):
raise

def update(self, ver=None, register=None, subregister=None, id=None, id2=None):

action_map = {
('dataset', 'relationships'): get_action('package_relationship_update'),
('package', 'relationships'): get_action('package_relationship_update'),
('dataset', 'relationships'): get_action('package_relationship_update_rest'),
('package', 'relationships'): get_action('package_relationship_update_rest'),
'dataset': get_action('package_update_rest'),
'package': get_action('package_update_rest'),
'group': get_action('group_update_rest'),
}
for type in model.PackageRelationship.get_all_types():
action_map[('dataset', type)] = get_action('package_relationship_update')
action_map[('package', type)] = get_action('package_relationship_update')
action_map[('dataset', type)] = get_action('package_relationship_update_rest')
action_map[('package', type)] = get_action('package_relationship_update_rest')

context = {'model': model, 'session': model.Session, 'user': c.user,
'api_version': ver, 'id': id}
Expand Down Expand Up @@ -376,15 +376,15 @@ def update(self, ver=None, register=None, subregister=None, id=None, id2=None):

def delete(self, ver=None, register=None, subregister=None, id=None, id2=None):
action_map = {
('dataset', 'relationships'): get_action('package_relationship_delete'),
('package', 'relationships'): get_action('package_relationship_delete'),
('dataset', 'relationships'): get_action('package_relationship_delete_rest'),
('package', 'relationships'): get_action('package_relationship_delete_rest'),
'group': get_action('group_delete'),
'dataset': get_action('package_delete'),
'package': get_action('package_delete'),
}
for type in model.PackageRelationship.get_all_types():
action_map[('dataset', type)] = get_action('package_relationship_delete')
action_map[('package', type)] = get_action('package_relationship_delete')
action_map[('dataset', type)] = get_action('package_relationship_delete_rest')
action_map[('package', type)] = get_action('package_relationship_delete_rest')

context = {'model': model, 'session': model.Session, 'user': c.user,
'api_version': ver}
Expand Down
9 changes: 2 additions & 7 deletions ckan/lib/search/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from pylons import config

from common import SearchIndexError, make_connection
from ckan.model import PackageRelationship

log = logging.getLogger(__name__)

Expand All @@ -15,13 +16,7 @@
SOLR_FIELDS = [TYPE_FIELD, "res_url", "text", "urls", "indexed_ts", "site_id"]
RESERVED_FIELDS = SOLR_FIELDS + ["tags", "groups", "res_description",
"res_format", "res_url"]
# HACK: this is copied over from model.PackageRelationship
RELATIONSHIP_TYPES = [
(u'depends_on', u'dependency_of'),
(u'derives_from', u'has_derivation'),
(u'links_to', u'linked_from'),
(u'child_of', u'parent_of'),
]
RELATIONSHIP_TYPES = PackageRelationship.types

def clear_index():
conn = make_connection()
Expand Down
21 changes: 21 additions & 0 deletions ckan/logic/action/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from copy import deepcopy

def rename_keys(dict_, key_map, reverse=False, destructive=False):
'''Returns a dict that has particular keys renamed,
according to the key_map.
Rename is by default non-destructive, so if the intended new
key name already exists, it won\'t do that rename.
To reverse the change, set reverse=True.'''
new_dict = deepcopy(dict_)
for key, mapping in key_map.items():
if reverse:
key, mapping = (mapping, key)
if (not destructive) and new_dict.has_key(mapping):
continue
if dict_.has_key(key):
value = dict_[key]
new_dict[mapping] = value
del new_dict[key]
return new_dict
44 changes: 33 additions & 11 deletions ckan/logic/action/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,16 @@
user_dictize)


from ckan.logic.schema import default_create_package_schema, default_resource_schema
from ckan.logic.schema import default_create_package_schema, default_resource_schema, default_create_relationship_schema

from ckan.logic.schema import default_group_schema, default_user_schema
from ckan.lib.navl.dictization_functions import validate
from ckan.logic.action.update import (_update_package_relationship,
package_error_summary,
group_error_summary)
group_error_summary,
relationship_error_summary)
from ckan.logic.action import rename_keys

log = logging.getLogger(__name__)

def package_create(context, data_dict):
Expand Down Expand Up @@ -107,25 +110,31 @@ def package_relationship_create(context, data_dict):

model = context['model']
user = context['user']
id = data_dict["id"]
id2 = data_dict["id2"]
rel_type = data_dict["rel"]
schema = context.get('schema') or default_create_relationship_schema()
api = context.get('api_version') or '1'
ref_package_by = 'id' if api == '2' else 'name'

# Create a Package Relationship.
id = data_dict['subject']
id2 = data_dict['object']
rel_type = data_dict['type']
comment = data_dict.get('comment', u'')

pkg1 = model.Package.get(id)
pkg2 = model.Package.get(id2)
if not pkg1:
raise NotFound('First package named in address was not found.')
raise NotFound('Subject package %r was not found.' % id)
if not pkg2:
return NotFound('Second package named in address was not found.')
return NotFound('Object package %r was not found.' % id2)

check_access('package_relationship_create', context, data_dict)
data, errors = validate(data_dict, schema, context)

##FIXME should have schema
comment = data_dict.get('comment', u'')
if errors:
model.Session.rollback()
raise ValidationError(errors, relationship_error_summary(errors))

check_access('package_relationship_create', context, data_dict)

# Create a Package Relationship.
existing_rels = pkg1.get_relationships_with(pkg2, rel_type)
if existing_rels:
return _update_package_relationship(existing_rels[0],
Expand All @@ -136,6 +145,8 @@ def package_relationship_create(context, data_dict):
rel = pkg1.add_relationship(rel_type, pkg2, comment=comment)
if not context.get('defer_commit'):
model.repo.commit_and_remove()
context['relationship'] = rel

relationship_dicts = rel.as_dict(ref_package_by=ref_package_by)
return relationship_dicts

Expand Down Expand Up @@ -278,3 +289,14 @@ def group_create_rest(context, data_dict):

return group_dict

def package_relationship_create_rest(context, data_dict):
# rename keys
key_map = {'id': 'subject',
'id2': 'object',
'rel': 'type'}
# Don't be destructive to enable parameter values for
# object and type to override the URL parameters.
data_dict = rename_keys(data_dict, key_map, destructive=False)

relationship_dict = package_relationship_create(context, data_dict)
return relationship_dict
31 changes: 23 additions & 8 deletions ckan/logic/action/delete.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from ckan.logic import NotFound
from ckan.lib.base import _
from ckan.logic import check_access
from ckan.logic.action import rename_keys

from ckan.plugins import PluginImplementations, IGroupController, IPackageController

Expand Down Expand Up @@ -32,18 +33,16 @@ def package_relationship_delete(context, data_dict):

model = context['model']
user = context['user']
id = data_dict['id']
id2 = data_dict['id2']
rel = data_dict['rel']
id = data_dict['subject']
id2 = data_dict['object']
rel = data_dict['type']

pkg1 = model.Package.get(id)
pkg2 = model.Package.get(id2)
if not pkg1:
raise NotFound('First package named in address was not found.')
raise NotFound('Subject package %r was not found.' % id)
if not pkg2:
return NotFound('Second package named in address was not found.')

check_access('package_relationship_delete', context, data_dict)
return NotFound('Object package %r was not found.' % id2)

existing_rels = pkg1.get_relationships_with(pkg2, rel)
if not existing_rels:
Expand All @@ -53,7 +52,7 @@ def package_relationship_delete(context, data_dict):
revisioned_details = 'Package Relationship: %s %s %s' % (id, rel, id2)

context['relationship'] = relationship
check_access('relationship_delete', context, data_dict)
check_access('package_relationship_delete', context, data_dict)

rev = model.repo.new_revision()
rev.author = user
Expand Down Expand Up @@ -103,3 +102,19 @@ def task_status_delete(context, data_dict):

entity.delete()
model.Session.commit()

def package_relationship_delete_rest(context, data_dict):

# rename keys
key_map = {'id': 'subject',
'id2': 'object',
'rel': 'type'}
# We want 'destructive', so that the value of the subject,
# object and rel in the URI overwrite any values for these
# in params. This is because you are not allowed to change
# these values.
data_dict = rename_keys(data_dict, key_map, destructive=True)

package_relationship_delete(context, data_dict)


45 changes: 40 additions & 5 deletions ckan/logic/action/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,11 @@
default_update_package_schema,
default_update_user_schema,
default_update_resource_schema,
default_update_relationship_schema,
default_task_status_schema)
from ckan.lib.navl.dictization_functions import validate
from ckan.logic.action import rename_keys

log = logging.getLogger(__name__)

def prettify(field_name):
Expand Down Expand Up @@ -80,6 +83,12 @@ def task_status_error_summary(error_dict):
error_summary[_(prettify(key))] = error[0]
return error_summary

def relationship_error_summary(error_dict):
error_summary = {}
for key, error in error_dict.iteritems():
error_summary[_(prettify(key))] = error[0]
return error_summary

def _make_latest_rev_active(context, q):

session = context['model'].Session
Expand Down Expand Up @@ -278,18 +287,26 @@ def package_relationship_update(context, data_dict):

model = context['model']
user = context['user']
id = data_dict["id"]
id2 = data_dict["id2"]
rel = data_dict["rel"]
schema = context.get('schema') or default_update_relationship_schema()
api = context.get('api_version') or '1'

id = data_dict['subject']
id2 = data_dict['object']
rel = data_dict['type']
ref_package_by = 'id' if api == '2' else 'name'

pkg1 = model.Package.get(id)
pkg2 = model.Package.get(id2)
if not pkg1:
raise NotFound('First package named in address was not found.')
raise NotFound('Subject package %r was not found.' % id)
if not pkg2:
return NotFound('Second package named in address was not found.')
return NotFound('Object package %r was not found.' % id2)

data, errors = validate(data_dict, schema, context)

if errors:
model.Session.rollback()
raise ValidationError(errors, relationship_error_summary(errors))

check_access('package_relationship_update', context, data_dict)

Expand All @@ -298,6 +315,7 @@ def package_relationship_update(context, data_dict):
raise NotFound('This relationship between the packages was not found.')
entity = existing_rels[0]
comment = data_dict.get('comment', u'')
context['relationship'] = entity
return _update_package_relationship(entity, comment, context)

def group_update(context, data_dict):
Expand Down Expand Up @@ -470,3 +488,20 @@ def group_update_rest(context, data_dict):
group_dict = group_to_api2(group, context)

return group_dict

def package_relationship_update_rest(context, data_dict):

# rename keys
key_map = {'id': 'subject',
'id2': 'object',
'rel': 'type'}

# We want 'destructive', so that the value of the subject,
# object and rel in the URI overwrite any values for these
# in params. This is because you are not allowed to change
# these values.
data_dict = rename_keys(data_dict, key_map, destructive=True)

relationship_dict = package_relationship_update(context, data_dict)

return relationship_dict
4 changes: 2 additions & 2 deletions ckan/logic/auth/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ def package_relationship_create(context, data_dict):
model = context['model']
user = context['user']

id = data_dict['id']
id2 = data_dict['id2']
id = data_dict['subject']
id2 = data_dict['object']
pkg1 = model.Package.get(id)
pkg2 = model.Package.get(id2)

Expand Down
7 changes: 4 additions & 3 deletions ckan/logic/auth/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ def package_delete(context, data_dict):
return {'success': True}

def package_relationship_delete(context, data_dict):
return package_relationship_create(context, data_dict)

def relationship_delete(context, data_dict):
can_edit_this_relationship = package_relationship_create(context, data_dict)
if not can_edit_this_relationship['success']:
return can_edit_this_relationship

model = context['model']
user = context['user']
relationship = context['relationship']
Expand Down

0 comments on commit 87a724c

Please sign in to comment.