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