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 assign(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 'assign' not in curation['actions']:
            message = 'Not authorized to assign Curator to dataset "%s"'
            return toolkit.abort(403, message % dataset_id)
        context['ignore_auth'] = True

        # Update dataset
        curator_id = toolkit.request.params.get('curator_id')
        if curator_id:
            dataset['curator_id'] = curator_id
        else:
            dataset.pop('curator_id', None)
        try:
            dataset = toolkit.get_action('package_update')(context, dataset)
        except toolkit.ValidationError:
            message = 'Curator is invalid'
            return toolkit.abort(403, message)

        # Update activity stream
        if curator_id:
            context = _get_context(ignore_auth=True)
            curator = toolkit.get_action('user_show')(context, {'id': curator_id})
            helpers.create_curation_activity('curator_assigned', dataset['id'],
                dataset['name'], user_id, curator_name=curator['name'])
        else:
            helpers.create_curation_activity('curator_removed', dataset['id'],
                dataset['name'], user_id)

        # Send notification email
        recipient = None
        if curator_id:
            action = 'assign'
            recipient = {'name': curator['id'], 'title': curator['display_name']}
        elif curation['contacts']['curator']:
            action = 'assign_remove'
            recipient = curation['contacts']['curator']
        if recipient:
            subj = mailer.compose_curation_email_subj(dataset)
            body = mailer.compose_curation_email_body(
                dataset, curation, recipient['title'], action)
            mailer.mail_user_by_id(recipient['name'], subj, body)

        # Show flash message and redirect
        message = 'Datasest "%s" Curator updated'
        toolkit.h.flash_success(message % dataset['title'])
        toolkit.redirect_to('deposited-dataset_read', id=dataset['name'])
    def request_changes(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 'request_changes' 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
        if dataset['curation_state'] == 'review':
            dataset['curation_state'] = 'submitted'
        else:
            dataset['curation_state'] = 'draft'
        dataset = toolkit.get_action('package_update')(context, dataset)

        # Update activity stream
        message = toolkit.request.params.get('message')
        helpers.create_curation_activity('changes_requested',
                                         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'],
                                                      'request_changes',
                                                      message=message)
            mailer.mail_user_by_id(recipient['name'], subj, body)

        # Show flash message and redirect
        message = 'Dataset "%s" changes requested'
        toolkit.h.flash_success(message % dataset['title'])
        toolkit.redirect_to('deposited-dataset_read', id=dataset['name'])
    def request_review(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 'request_review' 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
        dataset['curation_state'] = 'review'
        dataset = toolkit.get_action('package_update')(context, dataset)

        # Update activity stream
        message = toolkit.request.params.get('message')
        context = _get_context(ignore_auth=True)
        depositor = toolkit.get_action('user_show')(
            context, {
                'id': dataset['creator_user_id']
            })
        helpers.create_curation_activity('final_review_requested',
                                         dataset['id'],
                                         dataset['name'],
                                         user_id,
                                         message=message,
                                         depositor_name=depositor['name'])

        # Send notification email
        message = toolkit.request.params.get('message')
        depositor = curation['contacts']['depositor']
        subj = mailer.compose_curation_email_subj(dataset)
        body = mailer.compose_curation_email_body(dataset,
                                                  curation,
                                                  depositor['title'],
                                                  'request_review',
                                                  message=message)
        mailer.mail_user_by_id(depositor['name'], subj, body)

        # Show flash message and redirect
        message = 'Dataset "%s" review requested'
        toolkit.h.flash_success(message % dataset['title'])
        toolkit.redirect_to('deposited-dataset_read', id=dataset['name'])
    def withdraw(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 'withdraw' 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

        # Delete withdrawn dataset, but first update its name so it can be reused
        new_name = _get_withdrawn_dataset_name(dataset['name'])
        toolkit.get_action('package_patch')(context, {
            'id': dataset_id,
            'name': new_name
        })
        toolkit.get_action('package_delete')(context, {'id': dataset_id})

        # Update activity stream
        message = toolkit.request.params.get('message')
        helpers.create_curation_activity('dataset_withdrawn',
                                         dataset['id'],
                                         dataset['name'],
                                         user_id,
                                         message=message)

        # Send notification email
        message = toolkit.request.params.get('message')
        for user in helpers.get_data_curation_users():
            subj = mailer.compose_curation_email_subj(dataset)
            body = mailer.compose_curation_email_body(dataset,
                                                      curation,
                                                      user['display_name'],
                                                      'withdraw',
                                                      message=message)
            mailer.mail_user_by_id(user['id'], subj, body)

        # Show flash message and redirect
        message = 'Dataset "%s" withdrawn'
        toolkit.h.flash_error(message % dataset['title'])
        toolkit.redirect_to('data-container_read', id='data-deposit')
    def submit(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 'submit' 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
        dataset['curation_state'] = 'submitted'
        dataset = toolkit.get_action('package_update')(context, dataset)

        # Update activity stream
        message = toolkit.request.params.get('message')
        helpers.create_curation_activity('dataset_submitted',
                                         dataset['id'],
                                         dataset['name'],
                                         user_id,
                                         message=message)

        # Send notification email
        message = toolkit.request.params.get('message')
        curator = curation['contacts']['curator']
        # We don't bother all curators if someone is already assigned
        users = [curator] if curator else helpers.get_data_curation_users()
        for user in users:
            subj = mailer.compose_curation_email_subj(dataset)
            body = mailer.compose_curation_email_body(dataset,
                                                      curation,
                                                      user['display_name'],
                                                      'submit',
                                                      message=message)
            mailer.mail_user_by_id(user['id'], subj, body)

        # Show flash message and redirect
        message = 'Dataset "%s" submitted'
        toolkit.h.flash_success(message % dataset['title'])
        toolkit.redirect_to('deposited-dataset_read', id=dataset['name'])
Esempio n. 7
0
    def after_create(self, context, data_dict):
        if not context.get('job'):
            toolkit.enqueue_job(jobs.process_dataset_on_create,
                                [data_dict['id']])

        if data_dict.get('type') == 'deposited-dataset':
            user_id = None
            if context.get('auth_user_obj'):
                user_id = context['auth_user_obj'].id
            elif context.get('user'):
                user = toolkit.get_action('user_show')({
                    'ignore_auth': True
                }, {
                    'id': context['user']
                })
                user_id = user['id']
            if user_id:
                helpers.create_curation_activity('dataset_deposited',
                                                 data_dict['id'],
                                                 data_dict['name'], user_id)