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.')
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'])
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 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)
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'])
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)
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')