Esempio n. 1
0
def package_update(context, data_dict):
    userobj = toolkit.c.userobj

    # Decide if we need notification
    # - deposited-datset AND
    # - not a test env AND
    # - just published
    notify = False
    if data_dict.get('type') == 'deposited-dataset' and hasattr(userobj, 'id'):
        dataset = toolkit.get_action('package_show')(context, {
            'id': data_dict['id']
        })
        if dataset.get('state') == 'draft' and data_dict.get(
                'state') == 'active':
            notify = True

    # Update dataset
    dataset = update_core.package_update(context, data_dict)

    # Send notification if needed
    if notify:
        dataset['url'] = toolkit.url_for('dataset_read',
                                         id=dataset.get('name'),
                                         qualified=True)
        curation = helpers.get_deposited_dataset_user_curation_status(
            dataset, userobj.id)
        subj = mailer.compose_curation_email_subj(dataset)
        body = mailer.compose_curation_email_body(dataset, curation,
                                                  userobj.display_name,
                                                  'deposit')
        mailer.mail_user_by_id(userobj.id, subj, body)

    return dataset
    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'])
Esempio n. 3
0
def assign(package_type, 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 = 'This action is not available for the dataset "%s"'
        toolkit.h.flash_error(message % dataset['title'])
        return toolkit.redirect_to('deposited-dataset.read', id=dataset['name'])
    context['ignore_auth'] = True

    # Update dataset
    curator_id = toolkit.request.form.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})
        create_curation_activity('curator_assigned', dataset['id'],
            dataset['name'], user_id, curator_name=curator['name'])
    else:
        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 = 'Dataset "%s" Curator updated'
    toolkit.h.flash_success(message % dataset['title'])
    return 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. 8
0
def reject(package_type, 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 'reject' not in curation['actions']:
        message = 'This action is not available for the dataset "%s"'
        toolkit.h.flash_error(message % dataset['title'])
        return toolkit.redirect_to('deposited-dataset.read', id=dataset['name'])
    context['ignore_auth'] = True

    # Delete rejected dataset, but first update its name so it can be reused
    new_name = _get_rejected_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.form.get('message')
    create_curation_activity('dataset_rejected', dataset['id'],
        dataset['name'], user_id, message=message)

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

    # Show flash message and redirect
    message = 'Dataset "%s" rejected'
    toolkit.h.flash_error(message % dataset['title'])
    return toolkit.redirect_to('data-container.read', id='data-deposit')