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'])
示例#2
0
    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']},
            )
示例#3
0
 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',
     })