def import_offering(subject, number, section, strm, crse_id, class_nbr, component, title, campus, enrl_cap, enrl_tot, wait_tot, cancel_dt, acad_org, instr_mode, rqmnt_designtn, units, create_units=False): """ Import one offering. Returns CourseOffering or None. Arguments must be in the same order as CLASS_TBL_FIELDS. """ global REQ_DES if not REQ_DES: REQ_DES = get_reqmnt_designtn() semester = Semester.objects.get(name=strm) graded = True # non-graded excluded in with "class_type='E'" in query # make sure the data is as we expect: if not CAMPUSES.has_key(campus): raise KeyError, "Unknown campus: %r." % (campus) if not COMPONENTS.has_key(component): raise KeyError, "Unknown course component: %r." % (component) if not INSTR_MODE.has_key(instr_mode): raise KeyError, "Unknown instructional mode: %r." % (instr_mode) if cancel_dt is not None: # mark cancelled sections component = "CAN" if section == 'G': section = 'G100' # fix broken data somebody entered owner = get_unit(acad_org, create=create_units) # search for existing offerings both possible ways and make sure we're consistent c_old1 = CourseOffering.objects.filter(subject=subject, number=number, section=section, semester=semester).select_related('course') c_old2 = CourseOffering.objects.filter(class_nbr=class_nbr, semester=semester) c_old = list(set(c_old1) | set(c_old2)) if len(c_old)>1: raise KeyError, "Already duplicate courses: %r %r" % (c_old1, c_old2) elif len(c_old)==1: # already in DB: update things that might have changed c = c_old[0] else: # new record: create. c = CourseOffering(subject=subject, number=number, section=section, semester=semester) c.section = section c.crse_id = crse_id c.class_nbr = class_nbr c.component = component c.graded = graded c.title = title c.campus = campus c.enrl_cap = enrl_cap c.enrl_tot = enrl_tot c.wait_tot = wait_tot c.owner = owner c.instr_mode = instr_mode c.units = units c.slug = c.autoslug() # rebuild slug in case section changes for some reason # set the WQB flags flags = REQMNT_DESIGNTN_FLAGS[REQ_DES.get(rqmnt_designtn, '')] for pos, key in enumerate(c.flags.keys()): c.flags.set_bit(pos, key in flags) c.save_if_dirty() crs = c.course if crs.title != c.title: crs.title = c.title crs.save() return c
def import_offering(subject, number, section, strm, crse_id, class_nbr, component, title, campus, enrl_cap, enrl_tot, wait_tot, cancel_dt, acad_org, instr_mode, rqmnt_designtn, units, create_units=False): """ Import one offering. Returns CourseOffering or None. Arguments must be in the same order as CLASS_TBL_FIELDS. """ global REQ_DES if not REQ_DES: REQ_DES = get_reqmnt_designtn() semester = Semester.objects.get(name=strm) graded = True # non-graded excluded in with "class_type='E'" in query # make sure the data is as we expect: if campus not in CAMPUSES: raise KeyError("Unknown campus: %r." % (campus)) if component not in COMPONENTS: raise KeyError("Unknown course component: %r." % (component)) if instr_mode not in INSTR_MODE: raise KeyError("Unknown instructional mode: %r." % (instr_mode)) if cancel_dt is not None: # mark cancelled sections component = "CAN" if section == 'G': section = 'G100' # fix broken data somebody entered if section == 'R': section = 'G100' # fix different broken data somebody entered owner = get_unit(acad_org, create=create_units) # search for existing offerings both possible ways and make sure we're consistent c_old1 = CourseOffering.objects.filter(subject=subject, number=number, section=section, semester=semester).select_related('course') c_old2 = CourseOffering.objects.filter(class_nbr=class_nbr, semester=semester) c_old = list(set(c_old1) | set(c_old2)) if len(c_old)>1: raise KeyError("Already duplicate courses: %r %r" % (c_old1, c_old2)) elif len(c_old)==1: # already in DB: update things that might have changed c = c_old[0] else: # new record: create. c = CourseOffering(subject=subject, number=number, section=section, semester=semester) c.section = section c.crse_id = crse_id c.class_nbr = class_nbr c.component = component c.graded = graded c.title = title c.campus = campus c.enrl_cap = enrl_cap c.enrl_tot = enrl_tot c.wait_tot = wait_tot c.owner = owner c.instr_mode = instr_mode c.units = units c.slug = c.autoslug() # rebuild slug in case section changes for some reason # set the WQB flags flags = REQMNT_DESIGNTN_FLAGS[REQ_DES.get(rqmnt_designtn, '')] for pos, key in enumerate(c.flags.keys()): c.flags.set_bit(pos, key in flags) c.save_if_dirty() crs = c.course if crs.title != c.title: crs.title = c.title crs.save() EnrolmentHistory.from_offering(c, save=True) return c