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())
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')
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
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']
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'], [])
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']
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)
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()
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())
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]
def get_queryset(self): return Subject.find(self.get_query_from_request())
def tearDown(self): super(TestTaxonomy, self).tearDown() Subject.remove()