コード例 #1
0
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
コード例 #2
0
ファイル: importer.py プロジェクト: sfu-fas/coursys
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