def create_fake_semester(strm): """ Create a close-enough Semester object for testing """ strm = str(strm) if Semester.objects.filter(name=strm): return s = Semester(name=strm) yr = int(strm[0:3]) + 1900 if strm[3] == '1': mo = 1 elif strm[3] == '4': mo = 5 elif strm[3] == '7': mo = 9 s.start = datetime.date(yr, mo, 5) s.end = datetime.date(yr, mo + 3, 1) s.save() sw = SemesterWeek(semester=s, week=1) mon = s.start while mon.weekday() != 0: mon -= datetime.timedelta(days=1) sw.monday = mon sw.save() return s
def create_fake_semester(strm): """ Create a close-enough Semester object for testing """ strm = str(strm) if Semester.objects.filter(name=strm): return s = Semester(name=strm) yr = int(strm[0:3]) + 1900 if strm[3] == '1': mo = 1 elif strm[3] == '4': mo = 5 elif strm[3] == '7': mo = 9 s.start = datetime.date(yr,mo,5) s.end = datetime.date(yr,mo+3,1) s.save() sw = SemesterWeek(semester=s, week=1) mon = s.start while mon.weekday() != 0: mon -= datetime.timedelta(days=1) sw.monday = mon sw.save() return s
def get_or_create_semester(strm): if not (isinstance(strm, basestring) and strm.isdigit() and len(strm)==4): raise ValueError, "Bad strm: " + repr(strm) oldsem = Semester.objects.filter(name=strm) if oldsem: return oldsem[0] db = SIMSConn() db.execute("SELECT strm, term_begin_dt, term_end_dt FROM ps_term_tbl WHERE strm=%s", (strm,)) row = db.fetchone() if row is None: raise ValueError, "Not Found: %r" % (strm) strm, st, en = row # create Semester object st = datetime.datetime.strptime(st, "%Y-%m-%d").date() en = datetime.datetime.strptime(en, "%Y-%m-%d").date() sem = Semester(name=strm, start=st, end=en) sem.save() # also create SemesterWeek object for the first week first_monday = st while first_monday.weekday() != 0: first_monday += datetime.timedelta(days=1) wk = SemesterWeek(semester=sem, week=1, monday=first_monday) wk.save() return sem
def old_semester_test_data( ): sems = [{'start': datetime.date(1990, 1, 1), 'end': datetime.date(1990, 4, 30), 'name': '0901'}, {'start': datetime.date(1991, 1, 1), 'end': datetime.date(1991, 4, 30), 'name': '0911'}, {'start': datetime.date(1991, 9, 1), 'end': datetime.date(1991, 12, 31), 'name': '0917'}, {'start': datetime.date(1992, 1, 1), 'end': datetime.date(1992, 4, 30), 'name': '0921'}, {'start': datetime.date(1992, 9, 1), 'end': datetime.date(1992, 12, 31), 'name': '0927'}, {'start': datetime.date(1993, 1, 1), 'end': datetime.date(1993, 4, 30), 'name': '0931'}, {'start': datetime.date(1993, 9, 1), 'end': datetime.date(1993, 12, 31), 'name': '0937'}, {'start': datetime.date(1994, 1, 1), 'end': datetime.date(1994, 4, 30), 'name': '0941'}, {'start': datetime.date(1994, 5, 1), 'end': datetime.date(1994, 8, 31), 'name': '0944'}, {'start': datetime.date(1994, 9, 1), 'end': datetime.date(1994, 12, 31), 'name': '0947'}, {'start': datetime.date(1995, 1, 1), 'end': datetime.date(1995, 4, 30), 'name': '0951'}, {'start': datetime.date(1995, 5, 1), 'end': datetime.date(1995, 8, 31), 'name': '0954'}, {'start': datetime.date(1995, 9, 1), 'end': datetime.date(1995, 12, 31), 'name': '0957'}, {'start': datetime.date(1996, 1, 1), 'end': datetime.date(1996, 4, 30), 'name': '0961'}, {'start': datetime.date(1996, 5, 1), 'end': datetime.date(1996, 8, 31), 'name': '0964'}, {'start': datetime.date(1996, 9, 1), 'end': datetime.date(1996, 12, 31), 'name': '0967'}, {'start': datetime.date(1997, 1, 1), 'end': datetime.date(1997, 4, 30), 'name': '0971'}, {'start': datetime.date(1997, 5, 1), 'end': datetime.date(1997, 8, 31), 'name': '0974'}, {'start': datetime.date(1997, 9, 1), 'end': datetime.date(1997, 12, 31), 'name': '0977'}, {'start': datetime.date(1998, 1, 1), 'end': datetime.date(1998, 4, 30), 'name': '0981'}, {'start': datetime.date(1998, 5, 1), 'end': datetime.date(1998, 8, 31), 'name': '0984'}, {'start': datetime.date(1998, 9, 1), 'end': datetime.date(1998, 12, 31), 'name': '0987'}, {'start': datetime.date(1999, 1, 1), 'end': datetime.date(1999, 4, 30), 'name': '0991'}, {'start': datetime.date(1999, 5, 1), 'end': datetime.date(1999, 8, 31), 'name': '0994'}, {'start': datetime.date(1999, 9, 1), 'end': datetime.date(1999, 12, 31), 'name': '0997'}, {'start': datetime.date(2000, 1, 1), 'end': datetime.date(2000, 4, 30), 'name': '1001'}, {'start': datetime.date(2000, 5, 1), 'end': datetime.date(2000, 8, 31), 'name': '1004'}, {'start': datetime.date(2000, 9, 1), 'end': datetime.date(2000, 12, 31), 'name': '1007'}, {'start': datetime.date(2001, 1, 1), 'end': datetime.date(2001, 4, 30), 'name': '1011'}, {'start': datetime.date(2001, 5, 1), 'end': datetime.date(2001, 8, 31), 'name': '1014'}, {'start': datetime.date(2001, 9, 1), 'end': datetime.date(2001, 12, 31), 'name': '1017'}, {'start': datetime.date(2002, 1, 3), 'end': datetime.date(2002, 4, 30), 'name': '1021'}, {'start': datetime.date(2002, 5, 6), 'end': datetime.date(2002, 8, 31), 'name': '1024'}, {'start': datetime.date(2002, 9, 1), 'end': datetime.date(2002, 12, 31), 'name': '1027'}, {'start': datetime.date(2003, 1, 1), 'end': datetime.date(2003, 4, 30), 'name': '1031'}, {'start': datetime.date(2003, 5, 1), 'end': datetime.date(2003, 8, 31), 'name': '1034'}, {'start': datetime.date(2003, 9, 1), 'end': datetime.date(2003, 12, 31), 'name': '1037'}, {'start': datetime.date(2004, 1, 1), 'end': datetime.date(2004, 4, 30), 'name': '1041'}, {'start': datetime.date(2004, 5, 1), 'end': datetime.date(2004, 8, 31), 'name': '1044'}, {'start': datetime.date(2004, 9, 1), 'end': datetime.date(2004, 12, 31), 'name': '1047'}, {'start': datetime.date(2005, 1, 10), 'end': datetime.date(2005, 4, 30), 'name': '1051'}, {'start': datetime.date(2005, 5, 2), 'end': datetime.date(2005, 8, 31), 'name': '1054'}, {'start': datetime.date(2005, 9, 6), 'end': datetime.date(2005, 12, 31), 'name': '1057'}, {'start': datetime.date(2006, 1, 9), 'end': datetime.date(2006, 4, 30), 'name': '1061'}, {'start': datetime.date(2006, 5, 8), 'end': datetime.date(2006, 8, 31), 'name': '1064'}, {'start': datetime.date(2006, 9, 5), 'end': datetime.date(2006, 12, 31), 'name': '1067'}, {'start': datetime.date(2007, 1, 8), 'end': datetime.date(2007, 4, 30), 'name': '1071'}, {'start': datetime.date(2007, 5, 7), 'end': datetime.date(2007, 8, 31), 'name': '1074'}, {'start': datetime.date(2007, 9, 4), 'end': datetime.date(2007, 12, 31), 'name': '1077'}, {'start': datetime.date(2008, 1, 7), 'end': datetime.date(2008, 4, 30), 'name': '1081'}, {'start': datetime.date(2008, 5, 5), 'end': datetime.date(2008, 8, 31), 'name': '1084'}, {'start': datetime.date(2008, 9, 2), 'end': datetime.date(2008, 12, 31), 'name': '1087'}, {'start': datetime.date(2009, 1, 5), 'end': datetime.date(2009, 4, 30), 'name': '1091'}, {'start': datetime.date(2009, 5, 4), 'end': datetime.date(2009, 8, 4), 'name': '1094'}, {'start': datetime.date(2009, 9, 8), 'end': datetime.date(2009, 12, 7), 'name': '1097'}, {'start': datetime.date(2010, 1, 4), 'end': datetime.date(2010, 4, 16), 'name': '1101'}, {'start': datetime.date(2010, 5, 12), 'end': datetime.date(2010, 8, 11), 'name': '1104'}, {'start': datetime.date(2010, 9, 7), 'end': datetime.date(2010, 12, 6), 'name': '1107'}, {'start': datetime.date(2011, 1, 4), 'end': datetime.date(2011, 4, 7), 'name': '1111'}, {'start': datetime.date(2011, 5, 9), 'end': datetime.date(2011, 8, 8), 'name': '1114'}, {'start': datetime.date(2011, 9, 6), 'end': datetime.date(2011, 12, 5), 'name': '1117'}, {'start': datetime.date(2012, 1, 5), 'end': datetime.date(2012, 4, 11), 'name': '1121'}, {'start': datetime.date(2012, 5, 7), 'end': datetime.date(2012, 8, 3), 'name': '1124'}, {'start': datetime.date(2012, 9, 4), 'end': datetime.date(2012, 12, 3), 'name': '1127'}, {'start': datetime.date(2013, 1, 7), 'end': datetime.date(2013, 4, 12), 'name': '1131'}, {'start': datetime.date(2013, 5, 6), 'end': datetime.date(2013, 8, 2), 'name': '1134'}, {'start': datetime.date(2013, 9, 1), 'end': datetime.date(2013, 12, 31), 'name': '1137'}, {'start': datetime.date(2014, 1, 1), 'end': datetime.date(2014, 4, 30), 'name': '1141'}, {'start': datetime.date(2014, 5, 1), 'end': datetime.date(2014, 8, 30), 'name': '1144'}, {'start': datetime.date(2014, 9, 1), 'end': datetime.date(2014, 12, 30), 'name': '1147'}, {'start': datetime.date(2015, 1, 1), 'end': datetime.date(2015, 4, 30), 'name': '1151'}, {'start': datetime.date(2015, 5, 1), 'end': datetime.date(2015, 8, 30), 'name': '1154'}, {'start': datetime.date(2015, 9, 1), 'end': datetime.date(2015, 12, 30), 'name': '1157'}, {'start': datetime.date(2016, 1, 1), 'end': datetime.date(2016, 4, 30), 'name': '1161'}, {'start': datetime.date(2016, 5, 1), 'end': datetime.date(2016, 8, 30), 'name': '1164'}, {'start': datetime.date(2016, 9, 1), 'end': datetime.date(2016, 12, 30), 'name': '1167'}, {'start': datetime.date(2017, 1, 1), 'end': datetime.date(2017, 4, 30), 'name': '1171'}, {'start': datetime.date(2017, 5, 1), 'end': datetime.date(2017, 8, 30), 'name': '1174'}, {'start': datetime.date(2017, 9, 1), 'end': datetime.date(2017, 12, 30), 'name': '1177'}] for sem in sems: try: s = Semester.objects.get(name=sem['name']) except Semester.DoesNotExist: s = Semester(name=sem['name'], start=sem['start'], end=sem['end']) print('Creating ', s) s.save()
def setUp(self): p1 = Person(emplid=210012345, userid="test1", last_name="Lname", first_name="Fname", pref_first_name="Fn", middle_name="M") p1.save() s = Semester(name="1077", start=date(2007, 9, 4), end=date(2007, 12, 3)) s.save() unit = Unit.objects.get(label="CMPT") self.co1 = CourseOffering(owner=unit, subject="CMPT", number="120", section="D100", semester=s, component="LEC", graded=True, crse_id=11111, class_nbr=22222, campus='BRNBY', title="Computer Stuff", enrl_cap=100, enrl_tot=99, wait_tot=2) self.co2 = CourseOffering(owner=unit, subject="CMPT", number="165", section="D100", semester=s, component="LEC", graded=True, crse_id=22222, class_nbr=11111, campus='SURRY', title="Web Stuff", enrl_cap=85, enrl_tot=80, wait_tot=4) self.co1.save() self.co2.save()
def setUp(self): p1 = Person(emplid=210012345, userid="test1", last_name="Lname", first_name="Fname", pref_first_name="Fn", middle_name="M") p1.save() s = Semester(name="1077", start=date(2007,9,4), end=date(2007,12,3)) s.save() unit = Unit.objects.get(label="CMPT") self.co1 = CourseOffering(owner=unit, subject="CMPT", number="120", section="D100", semester=s, component="LEC", graded=True, crse_id=11111, class_nbr=22222, campus='BRNBY', title="Computer Stuff", enrl_cap=100, enrl_tot=99, wait_tot=2) self.co2 = CourseOffering(owner=unit, subject="CMPT", number="165", section="D100", semester=s, component="LEC", graded=True, crse_id=22222, class_nbr=11111, campus='SURRY', title="Web Stuff", enrl_cap=85, enrl_tot=80, wait_tot=4) self.co1.save() self.co2.save()
def create_semester(): s = Semester(name="1077", start=date(2007, 9, 4), end=date(2007, 12, 3)) s.save() return s
def create_semesters(): semester_1124 = Semester(name="1124", start=date(2012, 4, 4), end=date(2012, 9, 3)) semester_1124.save() semester_1127 = Semester(name="1127", start=date(2012, 9, 4), end=date(2012, 12, 3)) semester_1127.save() semester_1131 = Semester(name="1131", start=date(2013, 1, 4), end=date(2013, 4, 3)) semester_1131.save() semester_1134 = Semester(name="1134", start=date(2013, 4, 4), end=date(2013, 9, 3)) semester_1134.save() semester_1137 = Semester(name="1137", start=date(2013, 9, 4), end=date(2013, 12, 3)) semester_1137.save() semester_1141 = Semester(name="1141", start=date(2014, 1, 4), end=date(2014, 4, 3)) semester_1141.save() semester_1144 = Semester(name="1144", start=date(2014, 4, 4), end=date(2014, 9, 3)) semester_1144.save() semester_1147 = Semester(name="1147", start=date(2014, 9, 4), end=date(2014, 12, 3)) semester_1147.save() semester_1151 = Semester(name="1151", start=date(2015, 1, 4), end=date(2015, 4, 3)) semester_1151.save() semester_1154 = Semester(name="1154", start=date(2015, 4, 4), end=date(2015, 9, 3)) semester_1154.save() semester_1157 = Semester(name="1157", start=date(2015, 9, 4), end=date(2015, 12, 3)) semester_1157.save() semester_1161 = Semester(name="1161", start=date(2016, 1, 4), end=date(2016, 4, 3)) semester_1161.save() semester_1164 = Semester(name="1164", start=date(2016, 4, 4), end=date(2016, 9, 3)) semester_1164.save() semester_1167 = Semester(name="1167", start=date(2016, 9, 4), end=date(2016, 12, 3)) semester_1167.save()
def setUp(self): """ Build a TACategory, TAContract, and two TACourses """ unit = Unit(label="TEST", name="A Fake Unit for Testing") unit.save() person = Person(emplid="300000000", userid="testy", first_name="Testy", last_name="Testerson") person.save() semester = Semester(name="1147", start=datetime.date.today(), end=datetime.date.today()) semester.save() course1 = Course(subject="TEST", number="100", title="Intro to Testing") course1.save() course2 = Course(subject="TEST", number="200", title="Advanced Testing") course2.save() courseoffering1 = CourseOffering(subject="TEST", number="100", section="D100", semester=semester, component="LEC", owner=unit, title="Intro to Testing", campus="BRNBY", enrl_cap=100, enrl_tot=100, wait_tot=50, course=course1) courseoffering1.save() courseoffering2 = CourseOffering(subject="TEST", number="200", section="D200", semester=semester, component="LEC", owner=unit, title="Advanced Testing", campus="BRNBY", enrl_cap=100, enrl_tot=100, wait_tot=50, course=course2) courseoffering2.save() account = Account(unit=unit, account_number=1337, position_number=5, title="A Fake Account for Testing") account.save() four_weeks_later = datetime.date.today() + datetime.timedelta(days=28) hiring_semester = HiringSemester(semester=semester, unit=unit, deadline_for_acceptance=datetime.date.today(), pay_start=datetime.date.today(), pay_end=four_weeks_later, payperiods=2.5) hiring_semester.save() category = TACategory(account=account, hiring_semester=hiring_semester, code="TST", title="Test Contract Category", hours_per_bu=decimal.Decimal("42"), holiday_hours_per_bu=decimal.Decimal("1.1"), pay_per_bu=decimal.Decimal("125.00"), scholarship_per_bu=decimal.Decimal("25.00"), bu_lab_bonus=decimal.Decimal("0.17")) category.save() contract = TAContract(category=category, person=person, status="NEW", sin="123456789", deadline_for_acceptance=datetime.date.today(), pay_start=datetime.date.today(), pay_end=datetime.date.today() + datetime.timedelta(days=10), payperiods=2.5, appointment="INIT", conditional_appointment=True, created_by="classam", tssu_appointment=True) contract.save() tacourse = TACourse(course=courseoffering1, contract=contract, bu=decimal.Decimal('3.0'), labtut=True) tacourse.save() tacourse2 = TACourse(course=courseoffering2, contract=contract, bu=decimal.Decimal('2.0'), labtut=False) tacourse2.save()
def create_semester(): s = Semester(name="1077", start=date(2007,9,4), end=date(2007,12,3)) s.save() return s
def create_semesters(): semester_1124 = Semester(name="1124", start=date(2012,4,4), end=date(2012,9,3)) semester_1124.save() semester_1127 = Semester(name="1127", start=date(2012,9,4), end=date(2012,12,3)) semester_1127.save() semester_1131 = Semester(name="1131", start=date(2013,1,4), end=date(2013,4,3)) semester_1131.save() semester_1134 = Semester(name="1134", start=date(2013,4,4), end=date(2013,9,3)) semester_1134.save() semester_1137 = Semester(name="1137", start=date(2013,9,4), end=date(2013,12,3)) semester_1137.save() semester_1141 = Semester(name="1141", start=date(2014,1,4), end=date(2014,4,3)) semester_1141.save() semester_1144 = Semester(name="1144", start=date(2014,4,4), end=date(2014,9,3)) semester_1144.save() semester_1147 = Semester(name="1147", start=date(2014,9,4), end=date(2014,12,3)) semester_1147.save() semester_1151 = Semester(name="1151", start=date(2015,1,4), end=date(2015,4,3)) semester_1151.save() semester_1154 = Semester(name="1154", start=date(2015,4,4), end=date(2015,9,3)) semester_1154.save() semester_1157 = Semester(name="1157", start=date(2015,9,4), end=date(2015,12,3)) semester_1157.save() semester_1161 = Semester(name="1161", start=date(2016,1,4), end=date(2016,4,3)) semester_1161.save() semester_1164 = Semester(name="1164", start=date(2016,4,4), end=date(2016,9,3)) semester_1164.save() semester_1167 = Semester(name="1167", start=date(2016,9,4), end=date(2016,12,3)) semester_1167.save()
def import_semester_info(verbose=False, dry_run=False, long_long_ago=False, bootstrap=False): """ Update information on Semester objects from SIMS Finding the reference is tricky. Try Googling 'sfu calendar {{year}} "academic dates"' long_long_ago: import from the beginning of time bootstrap: don't assume Semester.current() will work, for bootstrapping test data creation """ output = [] semester_start = semester_first_day() semester_end = semester_last_day() sims_holidays = [(datetime.datetime.strptime(d, "%Y-%m-%d").date(), h) for d,h in all_holidays()] if not bootstrap: # we want semesters 5 years into the future: that's a realistic max horizon for grad promises current = Semester.current() strms = [current.offset_name(i) for i in range(15)] else: strms = [] if long_long_ago: strms = sorted(list(set(strms) | set(semester_start.keys()))) semesters = dict((s.name, s) for s in Semester.objects.filter(name__in=strms)) semester_weeks = itertools.groupby( SemesterWeek.objects.filter(semester__name__in=strms).select_related('semester'), lambda sw: sw.semester.name) semester_weeks = dict((k,list(v)) for k,v in semester_weeks) holidays = itertools.groupby( Holiday.objects.filter(semester__name__in=strms, holiday_type='FULL').select_related('semester'), lambda h: h.semester.name) holidays = dict((k,list(v)) for k,v in holidays) for strm in strms: url = settings.BASE_ABS_URL + reverse('sysadmin:edit_semester', kwargs={'semester_name': strm}) # Semester object try: semester = semesters[strm] except KeyError: semester = Semester(name=strm) semesters[strm] = semester output.append("Creating %s." % (strm,)) # class start and end dates try: start = datetime.datetime.strptime(semester_start[strm], "%Y-%m-%d").date() except KeyError: # No data found about this semester: if there's a date already around, honour it # Otherwise, guess "same day as this semester last year" which is probably wrong but close. start = semester.start if not semester.start: lastyr = semesters[semester.offset_name(-3)] start = lastyr.start.replace(year=lastyr.start.year+1) output.append("Guessing start date for %s." % (strm,)) try: end = datetime.datetime.strptime(semester_end[strm], "%Y-%m-%d").date() except KeyError: # no classes scheduled yet? Assume 13 weeks exactly end = start + datetime.timedelta(days=91) if semester.start != start: output.append("Changing start date for %s from %s to %s." % (strm, semester.start, start)) semester.start = start if semester.end != end: output.append("Changing end date for %s from %s to %s." % (strm, semester.end, end)) semester.end = end if not dry_run: semester.save() # SemesterWeeks weeks = semester_weeks.get(strm, []) if not weeks: sw = SemesterWeek(semester=semester, week=1, monday=first_monday(start)) weeks.append(sw) assert sw.monday.weekday() == 0 output.append("Creating week 1 for %s on %s." % (strm, sw.monday)) if not dry_run: sw.save() elif weeks[0].monday != first_monday(start): sw = weeks[0] sw.monday = first_monday(start) output.append("Changing first Monday of %s to %s." % (strm, sw.monday)) if not dry_run: sw.save() length = semester.end - semester.start if not bootstrap and length > datetime.timedelta(days=92) and len(weeks) < 2 \ and semester.start - datetime.date.today() < datetime.timedelta(days=365): # semester is longer than 13 weeks: insist that the user specify reading week reasonably-soon before the semester starts message = "Semester %s is long (%s) but has no reading week specified. Please have a look here: %s\n\nYou probably want to enter the Monday of week 5/6/7/8 as the Monday after reading week, a week later than it would otherwise be." % (strm, length, url) if verbose: output.append('*** ' + message) else: import_admin_email(source='coredata.importer.import_semester_info', message=message) elif not bootstrap: # also check that the last day of classes is at a coherent time. Might reveal problems with reading week specification. endweek,_ = semester.week_weekday(semester.end, weeks=weeks) if endweek not in [12, 13, 14]: message = "Semester %s ends in week %i (should be 13 or 14). That's weird. Have a look here to see if things are coherent: %s" % (strm, endweek, url) if verbose: output.append('*** ' + message) else: import_admin_email(source='coredata.importer.import_semester_info', message=message) # Holidays hs = holidays.get(strm, []) h_start, h_end = Semester.start_end_dates(semester) for dt, desc in [(d,h) for d,h in sims_holidays if h_start <= d <= h_end]: existing = [h for h in hs if h.date == dt] if existing: holiday = existing[0] else: holiday = Holiday(semester=semester, date=dt, holiday_type='FULL') output.append("Adding holiday %s on %s." % (desc, dt)) holiday.description = desc if not dry_run: holiday.save() if verbose: print '\n'.join(output)
def setUp(self): """ Build a TACategory, TAContract, and two TACourses """ unit = Unit(label="TEST", name="A Fake Unit for Testing") unit.save() person = Person(emplid="300000000", userid="testy", first_name="Testy", last_name="Testerson") person.save() semester = Semester(name="1147", start=datetime.date.today(), end=datetime.date.today()) semester.save() course1 = Course(subject="TEST", number="100", title="Intro to Testing") course1.save() course2 = Course(subject="TEST", number="200", title="Advanced Testing") course2.save() courseoffering1 = CourseOffering(subject="TEST", number="100", section="D100", semester=semester, component="LEC", owner=unit, title="Intro to Testing", campus="BRNBY", enrl_cap=100, enrl_tot=100, wait_tot=50, course=course1) courseoffering1.save() courseoffering2 = CourseOffering(subject="TEST", number="200", section="D200", semester=semester, component="LEC", owner=unit, title="Advanced Testing", campus="BRNBY", enrl_cap=100, enrl_tot=100, wait_tot=50, course=course2) courseoffering2.save() account = Account(unit=unit, account_number=1337, position_number=5, title="A Fake Account for Testing") account.save() four_weeks_later = datetime.date.today() + datetime.timedelta(days=28) hiring_semester = HiringSemester(semester=semester, unit=unit, deadline_for_acceptance=datetime.date.today(), pay_start=datetime.date.today(), pay_end=four_weeks_later, payperiods=2.5) hiring_semester.save() category = TACategory(account=account, hiring_semester=hiring_semester, code="TST", title="Test Contract Category", hours_per_bu=decimal.Decimal("42"), holiday_hours_per_bu=decimal.Decimal("1.1"), pay_per_bu=decimal.Decimal("100.00"), scholarship_per_bu=decimal.Decimal("25.00"), bu_lab_bonus=decimal.Decimal("0.17")) category.save() contract = TAContract(category=category, person=person, status="NEW", sin="123456789", deadline_for_acceptance=datetime.date.today(), pay_start=datetime.date.today(), pay_end=datetime.date.today() + datetime.timedelta(days=10), payperiods=2.5, appointment="INIT", conditional_appointment=True, created_by="classam", tssu_appointment=True) contract.save() tacourse = TACourse(course=courseoffering1, contract=contract, bu=decimal.Decimal('3.0'), labtut=True) tacourse.save() tacourse2 = TACourse(course=courseoffering2, contract=contract, bu=decimal.Decimal('2.0'), labtut=False) tacourse2.save()
def import_semester_info(verbose=False, dry_run=False, long_long_ago=False, bootstrap=False): """ Update information on Semester objects from SIMS Finding the reference is tricky. Try Googling 'sfu calendar {{year}} "academic dates"' long_long_ago: import from the beginning of time bootstrap: don't assume Semester.current() will work, for bootstrapping test data creation """ output = [] semester_start = semester_first_day() semester_end = semester_last_day() sims_holidays = all_holidays() if not bootstrap: # we want semesters 5 years into the future: that's a realistic max horizon for grad promises current = Semester.current() strms = [current.offset_name(i) for i in range(15)] else: strms = [] if long_long_ago: strms = sorted(list(set(strms) | set(semester_start.keys()))) semesters = dict((s.name, s) for s in Semester.objects.filter(name__in=strms)) semester_weeks = itertools.groupby( SemesterWeek.objects.filter(semester__name__in=strms).select_related('semester'), lambda sw: sw.semester.name) semester_weeks = dict((k,list(v)) for k,v in semester_weeks) holidays = itertools.groupby( Holiday.objects.filter(semester__name__in=strms, holiday_type='FULL').select_related('semester'), lambda h: h.semester.name) holidays = dict((k,list(v)) for k,v in holidays) for strm in strms: url = settings.BASE_ABS_URL + reverse('sysadmin:edit_semester', kwargs={'semester_name': strm}) # Semester object try: semester = semesters[strm] except KeyError: semester = Semester(name=strm) semesters[strm] = semester output.append("Creating %s." % (strm,)) # class start and end dates try: start = semester_start[strm] except KeyError: # No data found about this semester: if there's a date already around, honour it # Otherwise, guess "same day as this semester last year" which is probably wrong but close. start = semester.start if not semester.start: lastyr = semesters[semester.offset_name(-3)] start = lastyr.start.replace(year=lastyr.start.year+1) output.append("Guessing start date for %s." % (strm,)) try: end = semester_end[strm] except KeyError: # no classes scheduled yet? Assume 13 weeks exactly end = start + datetime.timedelta(days=91) if semester.start != start: output.append("Changing start date for %s from %s to %s." % (strm, semester.start, start)) semester.start = start if semester.end != end: output.append("Changing end date for %s from %s to %s." % (strm, semester.end, end)) semester.end = end if not dry_run: semester.save() # SemesterWeeks weeks = semester_weeks.get(strm, []) if not weeks: sw = SemesterWeek(semester=semester, week=1, monday=first_monday(start)) weeks.append(sw) assert sw.monday.weekday() == 0 output.append("Creating week 1 for %s on %s." % (strm, sw.monday)) if not dry_run: sw.save() elif weeks[0].monday != first_monday(start): sw = weeks[0] sw.monday = first_monday(start) output.append("Changing first Monday of %s to %s." % (strm, sw.monday)) if not dry_run: sw.save() length = semester.end - semester.start if not bootstrap and length > datetime.timedelta(days=92) and len(weeks) < 2 \ and semester.start - datetime.date.today() < datetime.timedelta(days=365): # semester is longer than 13 weeks: insist that the user specify reading week reasonably-soon before the semester starts message = "Semester %s is long (%s) but has no reading week specified. Please have a look here: %s\n\nYou probably want to enter the Monday of week 5/6/7/8 as the Monday after reading week, a week later than it would otherwise be." % (strm, length, url) if verbose: output.append('*** ' + message) else: import_admin_email(source='coredata.importer.import_semester_info', message=message) elif not bootstrap: # also check that the last day of classes is at a coherent time. Might reveal problems with reading week specification. endweek,_ = semester.week_weekday(semester.end, weeks=weeks) if endweek not in [12, 13, 14]: message = "Semester %s ends in week %i (should be 13 or 14). That's weird. Have a look here to see if things are coherent: %s" % (strm, endweek, url) if verbose: output.append('*** ' + message) else: import_admin_email(source='coredata.importer.import_semester_info', message=message) # Holidays hs = holidays.get(strm, []) h_start, h_end = Semester.start_end_dates(semester) for dt, desc in [(d,h) for d,h in sims_holidays if h_start <= d <= h_end]: existing = [h for h in hs if h.date == dt] if existing: holiday = existing[0] else: holiday = Holiday(semester=semester, date=dt, holiday_type='FULL') output.append("Adding holiday %s on %s." % (desc, dt)) holiday.description = desc if not dry_run: holiday.save() if verbose: print('\n'.join(output))