def set_subjects(self, preprint_subjects, auth, log=True): if not self.has_permission(auth.user, 'write'): raise PermissionsError('Must have admin or write permissions to change a preprint\'s subjects.') old_subjects = list(self.subjects.values_list('id', flat=True)) self.subjects.clear() for subj_list in preprint_subjects: subj_hierarchy = [] for s in subj_list: subj_hierarchy.append(s) if subj_hierarchy: validate_subject_hierarchy(subj_hierarchy) for s_id in subj_hierarchy: self.subjects.add(Subject.load(s_id)) if log: self.add_log( action=PreprintLog.SUBJECTS_UPDATED, params={ 'subjects': list(self.subjects.values('_id', 'text')), 'old_subjects': list(Subject.objects.filter(id__in=old_subjects).values('_id', 'text')), 'preprint': self._id }, auth=auth, save=False, ) self.save(old_subjects=old_subjects)
def set_subjects(self, preprint_subjects, auth, save=False): if not self.node.has_permission(auth.user, ADMIN): raise PermissionsError('Only admins can change a preprint\'s subjects.') self.subjects.clear() for subj_list in preprint_subjects: subj_hierarchy = [] for s in subj_list: subj_hierarchy.append(s) if subj_hierarchy: validate_subject_hierarchy(subj_hierarchy) for s_id in subj_hierarchy: self.subjects.add(Subject.load(s_id)) if save: self.save()
def set_subjects(self, preprint_subjects, auth): if not self.node.has_permission(auth.user, ADMIN): raise PermissionsError('Only admins can change a preprint\'s subjects.') old_subjects = list(self.subjects.values_list('id', flat=True)) self.subjects.clear() for subj_list in preprint_subjects: subj_hierarchy = [] for s in subj_list: subj_hierarchy.append(s) if subj_hierarchy: validate_subject_hierarchy(subj_hierarchy) for s_id in subj_hierarchy: self.subjects.add(Subject.load(s_id)) self.save(old_subjects=old_subjects)
def set_subjects(self, new_subjects, auth, add_log=True): """ Helper for setting M2M subjects field from list of hierarchies received from UI. Only authorized admins may set subjects. :param list[list[Subject._id]] new_subjects: List of subject hierarchies to be validated and flattened :param Auth auth: Auth object for requesting user :param bool add_log: Whether or not to add a log (if called on a Loggable object) :return: None """ AbstractNode = apps.get_model('osf.AbstractNode') PreprintService = apps.get_model('osf.PreprintService') CollectedGuidMetadata = apps.get_model('osf.CollectedGuidMetadata') if getattr(self, 'is_registration', False): raise PermissionsError('Registrations may not be modified.') if isinstance(self, (AbstractNode, PreprintService)): if not self.has_permission(auth.user, ADMIN): raise PermissionsError('Only admins can change subjects.') elif isinstance(self, CollectedGuidMetadata): if not self.guid.referent.has_permission(auth.user, ADMIN) and not auth.user.has_perms(self.collection.groups[ADMIN], self.collection): raise PermissionsError('Only admins can change subjects.') old_subjects = list(self.subjects.values_list('id', flat=True)) self.subjects.clear() for subj_list in new_subjects: subj_hierarchy = [] for s in subj_list: subj_hierarchy.append(s) if subj_hierarchy: validate_subject_hierarchy(subj_hierarchy) for s_id in subj_hierarchy: self.subjects.add(Subject.load(s_id)) if add_log and hasattr(self, 'add_log'): self.add_log( action=NodeLog.SUBJECTS_UPDATED, params={ 'subjects': list(self.subjects.values('_id', 'text')), 'old_subjects': list(Subject.objects.filter(id__in=old_subjects).values('_id', 'text')) }, auth=auth, save=False, ) self.save(old_subjects=old_subjects)
def map_preprints_to_custom_subjects(custom_provider, merge_dict): for preprint in PreprintService.objects.filter(provider=custom_provider): logger.info('Preparing to migrate preprint {}'.format(preprint.id)) old_hier = preprint.subject_hierarchy subjects_to_map = [hier[-1] for hier in old_hier] merged_subject_ids = set(Subject.objects.filter(provider=custom_provider, text__in=[merge_dict[k] for k in set(merge_dict.keys()) & set([s.text for s in subjects_to_map])]).values_list('id', flat=True)) subject_ids_to_map = set(s.id for s in subjects_to_map if s.text not in merge_dict.keys()) aliased_subject_ids = set(Subject.objects.filter(bepress_subject__id__in=subject_ids_to_map, provider=custom_provider).values_list('id', flat=True)) | merged_subject_ids aliased_hiers = [s.object_hierarchy for s in Subject.objects.filter(id__in=aliased_subject_ids)] preprint.subjects.clear() for hier in aliased_hiers: validate_subject_hierarchy([s._id for s in hier]) for s in hier: preprint.subjects.add(s) preprint.save() preprint.reload() new_hier = [s.object_hierarchy for s in preprint.subjects.exclude(children__in=preprint.subjects.all())] logger.info('Successfully migrated preprint {}.\n\tOld hierarchy:{}\n\tNew hierarchy:{}'.format(preprint.id, old_hier, new_hier))
def test_validation_one_level_hierarchy(self): assert_equal(validate_subject_hierarchy(self.valid_one_level_hierarchy), None)
def test_invalidation_invalid_ids(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.invalid_ids) assert_in('could not be found', e.exception.message)
def test_invalidation_invalid_root_leaf(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.invalid_root_leaf) assert_in('Invalid subject hierarchy', e.exception.message)
def test_invalidation_invalid_child_leaf(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.invalid_child_leaf) assert_in('Invalid subject hierarchy', e.exception.message)
def test_invalidation_no_root(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.no_root) assert_in('Unable to find root', e.exception.message)
def test_validation_root_only(self): assert_equal(validate_subject_hierarchy(self.valid_root), None)
def test_validation_partial_hierarchy(self): assert_equal(validate_subject_hierarchy(self.valid_partial_hierarchy), None)
def test_validation_one_level_hierarchy(self): assert_equal( validate_subject_hierarchy(self.valid_one_level_hierarchy), None)
def test_invalidation_invalid_ids(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.invalid_ids) assert_in('could not be found', e.exception.message)
def test_validation_partial_hierarchy(self): assert_equal(validate_subject_hierarchy(self.valid_partial_hierarchy), None)
def test_validation_root_only(self): assert_equal(validate_subject_hierarchy(self.valid_root), None)
def test_invalidation_no_root(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.no_root) assert_in('Unable to find root', e.exception.message)
def test_invalidation_no_parent(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.no_parent) assert_in('Invalid subject hierarchy', e.exception.message)
def test_invalidation_no_parent(self): with assert_raises(ValidationValueError) as e: validate_subject_hierarchy(self.no_parent) assert_in('Invalid subject hierarchy', e.exception.message)