Exemplo n.º 1
0
 def top_level_subjects(self):
     if self.subjects.exists():
         return self.subjects.filter(parent__isnull=True)
     else:
         # TODO: Delet this when all PreprintProviders have a mapping
         from osf.models.subject import Subject
         if len(self.subjects_acceptable) == 0:
             return Subject.find(Q('parent', 'isnull', True))
         tops = set([sub[0][0] for sub in self.subjects_acceptable])
         return [Subject.load(sub) for sub in tops]
Exemplo n.º 2
0
 def all_subjects(self):
     q = []
     for rule in self.subjects_acceptable:
         if rule[1]:
             q.append(Q('parents', 'eq', Subject.load(rule[0][-1])))
             if len(rule[0]) == 1:
                 potential_parents = Subject.find(Q('parents', 'eq', Subject.load(rule[0][-1])))
                 for parent in potential_parents:
                     q.append(Q('parents', 'eq', parent))
         for sub in rule[0]:
             q.append(Q('_id', 'eq', sub))
     return Subject.find(reduce(lambda x, y: x | y, q)) if len(q) > 1 else (Subject.find(q[0]) if len(q) else Subject.find())
Exemplo n.º 3
0
def rules_to_subjects(rules):
    if not rules:
        return Subject.objects.filter(provider___id='osf')
    q = []
    for rule in rules:
        if rule[1]:
            q.append(Q('parent', 'eq', Subject.load(rule[0][-1])))
            if len(rule[0]) == 1:
                potential_parents = Subject.find(Q('parent', 'eq', Subject.load(rule[0][-1])))
                for parent in potential_parents:
                    q.append(Q('parent', 'eq', parent))
        for sub in rule[0]:
            q.append(Q('_id', 'eq', sub))
    return Subject.find(reduce(lambda x, y: x | y, q)) if len(q) > 1 else (Subject.find(q[0]) if len(q) else Subject.find())
Exemplo n.º 4
0
def rules_to_subjects(rules):
    if not rules:
        return Subject.objects.filter(provider___id='osf')
    q = []
    for rule in rules:
        if rule[1]:
            q.append(Q('parent', 'eq', Subject.load(rule[0][-1])))
            if len(rule[0]) == 1:
                potential_parents = Subject.find(Q('parent', 'eq', Subject.load(rule[0][-1])))
                for parent in potential_parents:
                    q.append(Q('parent', 'eq', parent))
        for sub in rule[0]:
            q.append(Q('_id', 'eq', sub))
    return Subject.find(reduce(lambda x, y: x | y, q)) if len(q) > 1 else (Subject.find(q[0]) if len(q) else Subject.find())
Exemplo n.º 5
0
 def all_subjects(self):
     if self.subjects.exists():
         return self.subjects.all()
     else:
         # TODO: Delet this when all PreprintProviders have a mapping
         from osf.models.subject import Subject
         q = []
         for rule in self.subjects_acceptable:
             if rule[1]:
                 q.append(Q('parent', 'eq', Subject.load(rule[0][-1])))
                 if len(rule[0]) == 1:
                     potential_parents = Subject.find(Q('parent', 'eq', Subject.load(rule[0][-1])))
                     for parent in potential_parents:
                         q.append(Q('parent', 'eq', parent))
             for sub in rule[0]:
                 q.append(Q('_id', 'eq', sub))
         return Subject.find(reduce(lambda x, y: x | y, q)) if len(q) > 1 else (Subject.find(q[0]) if len(q) else Subject.find())
Exemplo n.º 6
0
 def top_level_subjects(self):
     if self.subjects.exists():
         return self.subjects.filter(parent__isnull=True)
     else:
         # TODO: Delet this when all PreprintProviders have a mapping
         if len(self.subjects_acceptable) == 0:
             return Subject.objects.filter(parent__isnull=True, provider___id='osf')
         tops = set([sub[0][0] for sub in self.subjects_acceptable])
         return [Subject.load(sub) for sub in tops]
Exemplo n.º 7
0
 def top_level_subjects(self):
     if self.subjects.exists():
         return self.subjects.filter(parent__isnull=True)
     else:
         # TODO: Delet this when all PreprintProviders have a mapping
         if len(self.subjects_acceptable) == 0:
             return Subject.objects.filter(parent__isnull=True, provider___id='osf')
         tops = set([sub[0][0] for sub in self.subjects_acceptable])
         return [Subject.load(sub) for sub in tops]
Exemplo n.º 8
0
 def get_subjects(self):
     ret = []
     for subj_list in self.subjects:
         subj_hierarchy = []
         for subj_id in subj_list:
             subj = Subject.load(subj_id)
             if subj:
                 subj_hierarchy += ({'id': subj_id, 'text': subj.text}, )
         if subj_hierarchy:
             ret.append(subj_hierarchy)
     return ret
Exemplo n.º 9
0
    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')
        CollectionSubmission = apps.get_model('osf.CollectionSubmission')
        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, CollectionSubmission):
            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)
Exemplo n.º 10
0
def rules_to_subjects(rules):
    if not rules:
        return Subject.objects.filter(provider___id='osf')
    q = []
    for rule in rules:
        parent_from_rule = Subject.load(rule[0][-1])
        if rule[1]:
            q.append(models.Q(parent=parent_from_rule))
            if len(rule[0]) == 1:
                potential_parents = Subject.objects.filter(parent=parent_from_rule)
                for parent in potential_parents:
                    q.append(models.Q(parent=parent))
        for sub in rule[0]:
            q.append(models.Q(_id=sub))
    return Subject.objects.filter(reduce(lambda x, y: x | y, q)) if len(q) > 1 else (Subject.objects.filter(q[0]) if len(q) else Subject.objects.all())
Exemplo n.º 11
0
def rules_to_subjects(rules):
    if not rules:
        return Subject.objects.filter(provider___id='osf')
    q = []
    for rule in rules:
        parent_from_rule = Subject.load(rule[0][-1])
        if rule[1]:
            q.append(models.Q(parent=parent_from_rule))
            if len(rule[0]) == 1:
                potential_parents = Subject.objects.filter(parent=parent_from_rule)
                for parent in potential_parents:
                    q.append(models.Q(parent=parent))
        for sub in rule[0]:
            q.append(models.Q(_id=sub))
    return Subject.objects.filter(reduce(lambda x, y: x | y, q)) if len(q) > 1 else (Subject.objects.filter(q[0]) if len(q) else Subject.objects.all())
Exemplo n.º 12
0
    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()
Exemplo n.º 13
0
    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)
Exemplo n.º 14
0
 def top_level_subjects(self):
     if len(self.subjects_acceptable) == 0:
         return Subject.find(Q('parents', 'isnull', True))
     tops = set([sub[0][0] for sub in self.subjects_acceptable])
     return [Subject.load(sub) for sub in tops]