Beispiel #1
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())
Beispiel #2
0
def main():
    dry_run = '--dry' in sys.argv
    if not dry_run:
        script_utils.add_file_logger(logger, __file__)
    set_up_storage([Subject], storage.MongoStorage)
    with TokuTransaction():
        update_taxonomies('bepress_taxonomy.json')
        # Now that all subjects have been added to the db, compute and set
        # the 'children' field for every subject
        logger.info('Setting "children" field for each Subject')
        for subject in Subject.find():
            subject.children = Subject.find(Q('parents', 'eq', subject))
            subject.save()

        if dry_run:
            raise RuntimeError('Dry run, transaction rolled back')
Beispiel #3
0
 def _create(cls, target_class, text=None, parents=[], *args, **kwargs):
     try:
         subject = Subject.find_one(Q('text', 'eq', text))
     except NoResultsFound:
         subject = target_class(*args, **kwargs)
         subject.text = text
         subject.parents = parents
         subject.save()
     return subject
Beispiel #4
0
 def _create(cls, target_class, text=None, parents=[], *args, **kwargs):
     try:
         subject = Subject.find_one(Q('text', 'eq', text))
     except NoResultsFound:
         subject = target_class(*args, **kwargs)
         subject.text = text
         subject.parents = parents
         subject.save()
     return subject
Beispiel #5
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
    def setUp(self):
        super(TestTaxonomy, self).setUp()

        # Subject 1 has 3 children
        self.subject1 = SubjectFactory()
        self.subject1_child1 = SubjectFactory(parent=self.subject1)
        self.subject1_child2 = SubjectFactory(parent=self.subject1)

        self.subjects = Subject.find()
        self.url = '/{}taxonomies/'.format(API_BASE)
        self.res = self.app.get(self.url)
        self.data = self.res.json['data']
Beispiel #7
0
    def test_taxonomy_filter_top_level(self):
        top_level_subjects = Subject.find(Q('parents', 'eq', []))
        top_level_url = self.url + '?filter[parents]=null'

        res = self.app.get(top_level_url)
        assert_equal(res.status_code, 200)

        data = res.json['data']
        assert_equal(len(top_level_subjects), len(data))
        assert len(top_level_subjects) > 0
        for subject in data:
            assert_equal(subject['attributes']['parents'], [])
    def test_taxonomy_filter_top_level(self):
        top_level_subjects = Subject.find(
            Q('parents', 'eq', [])
        )
        top_level_url = self.url + '?filter[parents]=null'

        res = self.app.get(top_level_url)
        assert_equal(res.status_code, 200)

        data = res.json['data']
        assert_equal(len(top_level_subjects), len(data))
        assert len(top_level_subjects) > 0
        for subject in data:
            assert_equal(subject['attributes']['parents'], [])
Beispiel #9
0
    def setUp(self):
        super(TestTaxonomy, self).setUp()

        # Subject 1 has 3 children
        self.subject1 = SubjectFactory()
        self.subject1_child1 = SubjectFactory(parents=[self.subject1])
        self.subject1_child2 = SubjectFactory(parents=[self.subject1])

        # Subject 2 has a child whose parent is both subject 1 and subject 2
        self.subject2 = SubjectFactory()
        self.subject2_child1_subject1_child3 = SubjectFactory(parents=[self.subject1, self.subject2])

        self.subjects = Subject.find()
        self.url = '/{}taxonomies/'.format(API_BASE)
        self.res = self.app.get(self.url)
        self.data = self.res.json['data']
Beispiel #10
0
    def test_taxonomy_filter_by_parent(self):
        children_subjects = Subject.find(
            Q('parents', 'eq', self.subject1._id)
        )
        children_url = self.url + '?filter[parents]={}'.format(self.subject1._id)

        res = self.app.get(children_url)
        assert_equal(res.status_code, 200)

        data = res.json['data']
        assert_equal(len(children_subjects), len(data))

        for subject in data:
            parents_ids = []
            for parent in subject['attributes']['parents']:
                parents_ids.append(parent['id'])
            assert_in(self.subject1._id, parents_ids)
Beispiel #11
0
def update_taxonomies(filename):
    # Flat taxonomy is stored locally, read in here
    with open(
        os.path.join(
            settings.APP_PATH,
            'website', 'static', filename
        )
    ) as fp:
        taxonomy = json.load(fp)

        for subject_path in taxonomy.get('data'):
            subjects = subject_path.split('_')
            text = subjects[-1]

            # Search for parent subject, get id if it exists
            parent = None
            if len(subjects) > 1:
                try:
                    parent = Subject.find_one(Q('text', 'eq', subjects[-2]))
                except NoResultsFound:
                    pass

            try:
                subject = Subject.find_one(Q('text', 'eq', text))
                logger.info('Found existing Subject "{}":{}{}'.format(
                    subject.text,
                    subject._id,
                    u' with parent {}:{}'.format(parent.text, parent._id) if parent else ''
                ))
            except (NoResultsFound):
                # If subject does not yet exist, create it
                subject = Subject(
                    text=text,
                    parents=[parent] if parent else [],
                )
                logger.info(u'Creating Subject "{}":{}{}'.format(
                    subject.text,
                    subject._id,
                    u' with parent {}:{}'.format(parent.text, parent._id) if parent else ''
                ))
            else:
                # If subject does exist, append parent_id if not already added
                if parent and parent not in subject.parents:
                    subject.parents.append(parent)
                    logger.info(u'Adding parent "{}":{} to Subject "{}":{}'.format(
                        parent.text, parent._id,
                        subject.text, subject._id
                    ))

            subject.save()
Beispiel #12
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())
Beispiel #13
0
 def top_level_subjects(self):
     if len(self.subjects_acceptable) == 0:
         return Subject.find(Q('parents', 'eq', []))
     tops = set([sub[0][0] for sub in self.subjects_acceptable])
     return [Subject.load(sub) for sub in tops]
Beispiel #14
0
 def get_queryset(self):
     return Subject.find(self.get_query_from_request())
Beispiel #15
0
 def get_queryset(self):
     return Subject.find(self.get_query_from_request())
Beispiel #16
0
 def tearDown(self):
     super(TestTaxonomy, self).tearDown()
     Subject.remove()
Beispiel #17
0
 def top_level_subjects(self):
     if len(self.subjects_acceptable) == 0:
         return Subject.find(Q('parents', 'eq', []))
     tops = set([sub[0][0] for sub in self.subjects_acceptable])
     return [Subject.load(sub) for sub in tops]