Exemplo n.º 1
0
def send_summary_emails(verbose):
    if not toolkit.asbool(
            toolkit.config.get('ckanext.unhcr.send_summary_emails', False)):
        click.echo(
            'ckanext.unhcr.send_summary_emails is False. Not sending anything.'
        )
        return

    recipients = get_summary_email_recipients()
    subject = '[UNHCR RIDL] Weekly Summary'

    for recipient in recipients:
        if recipient['email']:
            email = compose_summary_email_body(recipient)

            if email['total_events'] == 0:
                click.echo('SKIPPING summary email to: {}'.format(
                    recipient['email']))
                continue

            click.echo('SENDING summary email to: {}'.format(
                recipient['email']))
            if verbose > 0:
                click.echo(email['body'])
                click.echo('')

            mail_user_by_id(recipient['id'], subject, email['body'])

    click.echo('Sent weekly summary emails.')
Exemplo n.º 2
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
Exemplo n.º 3
0
    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'])
Exemplo n.º 4
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'])
Exemplo n.º 5
0
    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'])
Exemplo n.º 6
0
def membership_add():
    form_data = _parse_form(toolkit.request.form)
    context = {'model': model, 'user': toolkit.c.user}
    username = form_data.get('username')
    contnames = form_data.get('contnames')
    if type(contnames) != list:
        contnames = [contnames]
    role = form_data.get('role')

    # Check access
    try:
        toolkit.check_access('sysadmin', context)
    except toolkit.NotAuthorized:
        message = 'Not authorized to add membership'
        return toolkit.abort(403, message)

    # Add membership
    containers = []
    for contname in contnames:
        try:
            container = toolkit.get_action('organization_show')(context, {
                'id': contname
            })
            data_dict = {
                'id': contname,
                'username': username,
                'role': role,
                'not_notify': True
            }
            toolkit.get_action('organization_member_create')(context,
                                                             data_dict)
            containers.append(container)
        except (toolkit.ObjectNotFound, toolkit.ValidationError):
            message = 'User "%s" NOT added to the following data container: "%s"'
            toolkit.h.flash_error(message % (username, contname))

    # Notify by flash
    titles = ['"%s"' % cont.get('title', cont['name']) for cont in containers]
    message = 'User "%s" added to the following data containers: %s'
    toolkit.h.flash_success(message % (username, ', '.join(titles)))

    # Notify by email
    user = toolkit.get_action('user_show')(context, {'id': username})
    subj = mailer.compose_membership_email_subj(
        {'title': 'multiple containers'})
    body = mailer.compose_membership_email_body(containers, user,
                                                'create_multiple')
    mailer.mail_user_by_id(username, subj, body)

    # Redirect
    return toolkit.redirect_to('unhcr_data_container.membership',
                               username=username)
Exemplo n.º 7
0
    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'])
Exemplo n.º 8
0
    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')
Exemplo n.º 9
0
    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'])
Exemplo n.º 10
0
def organization_member_delete(context, data_dict):

    if not data_dict.get('not_notify'):

        # Get container/user
        container = toolkit.get_action('organization_show')(
            context, {
                'id': data_dict['id']
            })
        user = toolkit.get_action('user_show')(context, {
            'id': data_dict['user_id']
        })

        # Notify the user
        subj = mailer.compose_membership_email_subj(container)
        body = mailer.compose_membership_email_body(container, user, 'delete')
        mailer.mail_user_by_id(user['id'], subj, body)

    return delete_core.organization_member_delete(context, data_dict)
Exemplo n.º 11
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')