def approve(self, dataset_id): user_id = getattr(toolkit.c.userobj, 'id', None) # Get curation data try: context, dataset, curation = _get_curation_data( dataset_id, user_id) except (toolkit.ObjectNotFound, toolkit.NotAuthorized): message = 'Not authorized to read dataset "%s"' return toolkit.abort(403, message % dataset_id) # Authorize context if 'approve' not in curation['actions']: message = 'This action is not available for the dataset "%s"' toolkit.h.flash_error(message % dataset['title']) toolkit.redirect_to('deposited-dataset_read', id=dataset['name']) context['ignore_auth'] = True # Update dataset try: # We also set type in context to allow type switching by ckan patch dataset = helpers.convert_deposited_dataset_to_regular_dataset( dataset) dataset = toolkit.get_action('package_update')( dict(context.items() + {'type': dataset['type']}.items()), dataset) except toolkit.ValidationError as error: message = 'Deposited dataset "%s" is invalid\n(validation error summary: %s)' return toolkit.abort(403, message % (id, error.error_summary)) # Update activity stream message = toolkit.request.params.get('message') helpers.create_curation_activity('dataset_approved', dataset['id'], dataset['name'], user_id, message=message) # Send notification email message = toolkit.request.params.get('message') if curation['state'] == 'submitted': recipient = curation['contacts']['depositor'] elif curation['state'] == 'review': recipient = curation['contacts']['curator'] if recipient: subj = mailer.compose_curation_email_subj(dataset) body = mailer.compose_curation_email_body(dataset, curation, recipient['title'], 'approve', message=message) mailer.mail_user_by_id(recipient['name'], subj, body) # Show flash message and redirect message = 'Dataset "%s" approved and moved to the destination data container' toolkit.h.flash_success(message % dataset['title']) toolkit.redirect_to('deposited-dataset_read', id=dataset['name'])
def test_external_user_approved_deposit(self): sysadmin = core_factories.Sysadmin() external_user = factories.ExternalUser() target = factories.DataContainer( id='data-target', name='data-target', ) deposit = factories.DataContainer(id='data-deposit', name='data-deposit') deposited_dataset = factories.DepositedDataset( name='dataset1', owner_org='data-deposit', owner_org_dest='data-target', user=external_user) tmp = deposited_dataset.copy() tmp.update({ 'unit_of_measurement': 'individual', 'keywords': ['3', '4'], 'archived': 'False', 'data_collector': ['acf'], 'data_collection_technique': 'f2f', 'external_access_level': 'open_access', 'geographies': [DEFAULT_GEOGRAPHY_CODE] }) deposited_dataset = helpers.call_action('package_update', {'user': sysadmin['name']}, **tmp) # While the dataset is in deposited state, external_user can view it assert (True == toolkit.check_access( 'package_show', {'user': external_user['name']}, {'id': deposited_dataset['id']}, )) # Approve the dataset approved_dataset = convert_deposited_dataset_to_regular_dataset( deposited_dataset) approved_dataset = helpers.call_action('package_update', context={ 'user': sysadmin['name'], 'type': approved_dataset['type'] }, **approved_dataset) # Now that the dataset has moved out of the data-deposit, # external_user can not view it anymore with pytest.raises(toolkit.NotAuthorized): toolkit.check_access( 'package_show', context={'user': external_user['name']}, data_dict={'id': approved_dataset['id']}, )
def test_convert_deposited_dataset_to_regular_dataset(self): deposited = { 'type': 'deposited-dataset', 'owner_org': 'id-data-deposit', 'owner_org_dest': 'id-data-target', } regular = helpers.convert_deposited_dataset_to_regular_dataset( deposited) assert_equals(regular, { 'type': 'dataset', 'owner_org': 'id-data-target', })