def makeEvent(term_start, term_end, section, meeting_time, uid): event = icalendar.Event() event.add('uid', uid) event.add('summary', '%s %s' % (section['course_code'], section['section'])) first_day = firstOccurrence(term_start, meeting_time['days']) event.add('dtstart', replaceTime(first_day, meeting_time['start'])) event.add('dtend', replaceTime(first_day, meeting_time['end'])) event.add('dtstamp', section['user_updated']) event.add('categories', 'CLASS') rrule = icalendar.vRecur( freq='weekly', byday=icalDaysOfWeek(meeting_time['days']), until=term_end, ) event.add('rrule', rrule) descr = io.StringIO() descr.write(section['course_name']) if 'type' in meeting_time: descr.write('\n' + meeting_time['type']) if section['instructors']: descr.write('\n\nInstructor') if len(section['instructors']) > 1: descr.write('s') descr.write(': ') descr.write(', '.join( util.name(instr) for instr in section['instructors'])) event.add('description', descr.getvalue()) if meeting_time.get('building') or meeting_time.get('room'): loc = '%s %s' % (meeting_time.get('building', ''), meeting_time.get('room', '')) event.add('location', loc.strip()) return event
def test_name(self): user = {'first': None, 'middle': None, 'last': None} self.assertEqual('', util.name(user)) user['first'] = 'John' self.assertEqual('John', util.name(user)) user['last'] = 'Public' self.assertEqual('John Public', util.name(user)) user['middle'] = 'Q.' self.assertEqual('John Q. Public', util.name(user)) user['last'] = None self.assertEqual('John Q.', util.name(user)) user['first'] = '' self.assertEqual('Q.', util.name(user)) user['middle'] = None user['last'] = 'Public' self.assertEqual('Public', util.name(user))
def _add_derived(type_, change, old): new = change['new'] if old is None: complete = new else: complete = old.copy() complete.update(new) is_create = change['action'] == 'create' derived = {} if type_ == 'instructor': if 'first' in new or 'middle' in new or 'last' in new: name = util.name({field: complete[field] for field in ('first', 'middle', 'last')}) derived['name'] = name derived['searchable_name'] = util.make_searchable(name) elif type_ == 'course': if is_create: derived['sections'] = [] if 'name' in new: derived['searchable_name'] = util.make_searchable(new['name']) if 'code' in new: derived['searchable_code'] = util.make_searchable(new['code']) if 'description' in new: derived['searchable_description'] = util.make_searchable( new['description']) elif type_ == 'section': if 'details' in new: derived['searchable_details'] = util.make_searchable( new['details']) elif type_ == 'term' and is_create: derived['subjects'] = [] elif type_ == 'subject': if 'name' in new: derived['searchable_name'] = util.make_searchable(new['name']) if 'abbreviation' in new: derived['searchable_abbreviation'] = util.make_searchable( new['abbreviation']) if derived: change['derived'] = derived return True else: return False
def test_course(self): with test_data.Database.WithTestData() as data: response = self.app.get( '/api/courses/%s/%s/%s' % (data.school['fragment'], data.term['fragment'], data.course['fragment'])) self.assertEqual(response.status_code, 200) section = util.encode_my_id(data.course_section) instructor = util.project_instructor(data.instructor) instructor['name'] = util.name(instructor) section['instructors'] = [instructor] expect = data.course expect['term'] = data.term del expect['term']['subjects'] expect['subjects'] = [data.subject] del data.subject['segments'] expect['sections'] = [section] expect['other_terms'] = [] expect['requirements'] = [data.requirement['id']] self.assertEqual(expect, json.loads(response.data))
def test_instructor(self): with test_data.Database.WithTestData() as data: response = self.app.get( '/api/instructors/%s/%s' % (data.school['fragment'], data.instructor['fragment'])) c = mongo.SchoolCollections(data.school['fragment']) self.assertEqual(response.status_code, 200) # TODO(eitan): this test would be more meaningful with multiple terms & # multiple sections/term expect = util.project_instructor(data.instructor) expect['name'] = util.name(expect) term = util.project_term(data.term) cs = util.formatCourseSection(c, term, data.course, data.course_section, instructors=False) term['course_sections'] = [cs] # TODO(eitan): better to have an IS term['independent_studies'] = [] expect['terms'] = [term] self.assertEqual(expect, json.loads(response.data))
def instructor(school, instructor): app.mongo.db.schools.find_one_or_404({'fragment': school}, {'_id': True}) c = mongo.SchoolCollections(school) get_term = lambda course: course['term'] instructor = c.instructor.find_one_or_404({'fragment': instructor}, util.project_instructor.mongo()) instructor['name'] = util.name(instructor) courses = c.course.find({'sections.instructors': instructor['id']}, {'_id': False}) terms = [] courses = sorted(courses, key=get_term) for term_id, course_iter in itertools.groupby(courses, get_term): term = c.term.find_one({'id': term_id}, util.project_term.mongo()) assert term term['course_sections'] = [] term['independent_studies'] = [] for course in course_iter: for section in course['sections']: if instructor['id'] not in section['instructors']: continue section = util.formatCourseSection(c, term, course, section, instructors=False) if course['independent_study']: term['independent_studies'].append(section) else: term['course_sections'].append(section) for to_sort in (term['course_sections'], term['independent_studies']): to_sort.sort(key=lambda (section): natsort.natsort_key( section['course_code'], number_type=None)) terms.append(term) terms.sort(key=operator.itemgetter('start', 'end'), reverse=True) out = instructor out['terms'] = terms return json.jsonify(out)