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 = [] 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) self.subjects.append(subj_hierarchy) if save: self.save()
def map_preprints_to_custom_subjects(custom_provider): for preprint in PreprintService.objects.filter(provider=custom_provider): logger.info('Preparing to migrate preprint {}'.format(preprint.id)) old_hier = preprint.subject_hierarchy subject_ids_to_map = [hier[-1].id for hier in old_hier] aliased_subject_ids = set(Subject.objects.filter(bepress_subject__id__in=subject_ids_to_map, provider=custom_provider).values_list('id', flat=True)) 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_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_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_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_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_one_level_hierarchy(self): assert_equal(validate_subject_hierarchy(self.valid_one_level_hierarchy), None)