Exemple #1
0
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
Exemple #2
0
 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))
Exemple #3
0
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
Exemple #4
0
 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))
Exemple #5
0
 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))
Exemple #6
0
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)