Beispiel #1
0
def main():
    # Håndter upper- og lowercasing av strenger som inneholder norske
    # tegn.
    locale.setlocale(locale.LC_CTYPE, ('en_US', 'iso88591'))

    init_globals()

    fxml.start_xml_head()

    # Finn `account_id` -> account-data for alle brukere.
    acc2names = load_acc2name()
    # Spytt ut PERSON-elementene.
    for user in acc2names.itervalues():
        fxml.user_to_XML(user['NAME'],
                         # Som påpekt av HiA i en e-post til cerebrum-hia
                         # (<messsage-id:[email protected]), skal
                         # vi bruke STATUS_ADD (autentiseringsrutinene har
                         # endret seg og nå *skal* man levere dumpen med
                         # recstatus=1).
                         fronter_lib.Fronter.STATUS_ADD,
                         user)

    # Registrer en del semi-statiske strukturnoder.
    root_node_id = "STRUCTURE:ClassFronter structure root node"
    register_group('Universitetet i Agder', root_node_id, root_node_id)

    manuell_node_id = 'STRUCTURE:%s:manuell' % \
                      cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Manuell', manuell_node_id, root_node_id,
                   allow_room=True)

    auto_node_id = "STRUCTURE:%s:automatisk" % \
                   cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group("Automatisk", auto_node_id, root_node_id)

    emner_id = 'STRUCTURE:%s:fs:emner' % cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Emner', emner_id, auto_node_id)

    this_sem, next_sem = get_semester()
    emner_this_sem_id = emner_id + ':%s:%s' % tuple(this_sem)
    emner_next_sem_id = emner_id + ':%s:%s' % tuple(next_sem)
    register_group('Emner %s %s' % (this_sem[1].upper(), this_sem[0]),
                   emner_this_sem_id, emner_id)
    register_group('Emner %s %s' % (next_sem[1].upper(), next_sem[0]),
                   emner_next_sem_id, emner_id)

    emnerom_this_sem_id = emner_this_sem_id + ':emnerom'
    emnerom_next_sem_id = emner_next_sem_id + ':emnerom'
    register_group('Emnerom %s %s' % (this_sem[1].upper(), this_sem[0]),
                   emnerom_this_sem_id, emner_this_sem_id)
    register_group('Emnerom %s %s' % (next_sem[1].upper(), next_sem[0]),
                   emnerom_next_sem_id, emner_next_sem_id)

    for sem, sem_node_id in ((this_sem, emner_this_sem_id),
                             (next_sem, emner_next_sem_id)):
        for suffix, title in (
            ('student', 'Studenter %s %s' % (sem[1].upper(),
                                             sem[0])),
            ('foreleser', 'Forelesere %s %s' % (sem[1].upper(),
                                                sem[0])),
            ('studieleder', 'Studieledere %s %s' % (sem[1].upper(),
                                                    sem[0]))):
            node_id = sem_node_id + ':' + suffix
            register_group(title, node_id, sem_node_id)

    brukere_id= 'STRUCTURE:%s:fs:brukere' % cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Brukere', brukere_id, auto_node_id)

    fellesrom_id = 'STRUCTURE:%s:fs:fellesrom' % \
                   cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Fellesrom', fellesrom_id, auto_node_id)

    # Registrer statiske EVU-strukturnoder.
    # Ting blir litt enklere, hvis vi drar med oss institusjonsnummeret
    evu_node_id = 'STRUCTURE:%s:fs:%s:evu' % (cereconf.INSTITUTION_DOMAIN_NAME_LMS,
                                              cereconf.DEFAULT_INSTITUSJONSNR)
    register_group('EVU', evu_node_id, auto_node_id)
    for (suffix,
         title,
         allow_room) in (("kursrom", "EVU kursrom", True),
                         ("kursdeltaker", "EVU kursdeltaker", False),
                         ("foreleser", "EVU foreleser", False)):
        node_id = evu_node_id + ":" + suffix
        register_group(title, node_id, evu_node_id, allow_room)
    # od

    # Populer dicter for "emnekode -> emnenavn", "fakultet ->
    # [emnekode ...]" og "<evukurs> -> evukursnavn".
    emne_info = {}
    fakulteter = []
    def finn_emne_info(element, attrs):
        if element != 'undenhet':
            return
        emnekode = attrs['emnekode'].lower()
        faknr = int(attrs['faknr_kontroll'])
        emne_info[emnekode] = {'navn': attrs['emnenavn_bokmal'],
                               'fak': faknr}
        if faknr not in fakulteter:
            fakulteter.append(faknr)
    access_FS.underv_enhet_xml_parser(os.path.join(fs_dir, 'underv_enhet.xml'),
                                      finn_emne_info)

    stprog_info = {}
    def finn_stprog_info(element, attrs):
        if element != 'studprog':
            return
        stprog = attrs['studieprogramkode'].lower()
        faknr = int(attrs['faknr_studieansv'])
        stprog_info[stprog] = {'fak': faknr}
        if faknr not in fakulteter:
            fakulteter.append(faknr)
    access_FS.studieprog_xml_parser(os.path.join(fs_dir, 'studieprog.xml'),
                                    finn_stprog_info) 
    
    evukurs_info = {}
    def finn_evukurs_info(element, attrs):
        if element != "evukurs":
            return

        name = "%s (%s)" % (attrs.get("etterutdkursnavnkort", ""),
                            ", ".join(filter(None,
                                        (attrs.get("etterutdkurskode"),
                                         attrs.get("kurstidsangivelsekode"),
                                         attrs.get("emnekode")))))

        eukk, ktak = (attrs["etterutdkurskode"].lower(),
                      attrs["kurstidsangivelsekode"].lower())
        evukurs_info[eukk, ktak] = name
    # end finn_evukurs_info
    access_FS.evukurs_xml_parser(os.path.join(fs_dir, 'evu_kursinfo.xml'),
                                 finn_evukurs_info)
    
    # Henter ut ansatte per fakultet
    ans_dict = get_ans_fak(fakulteter, acc2names)
    # Opprett de forskjellige stedkode-korridorene.
    ou = Stedkode.Stedkode(db)
    for faknr in fakulteter:
        fak_sko = "%02d0000" % faknr
        ou.clear()
        try:
            ou.find_stedkode(faknr, 0, 0,
                             institusjon = cereconf.DEFAULT_INSTITUSJONSNR)
        except Errors.NotFoundError:
            logger.error("Finner ikke stedkode for fakultet %d", faknr)
            faknavn = '*Ikke registrert som fakultet i FS*'
        else:
            acronym = ou.get_name_with_language(name_variant=const.ou_name_acronym,
                                                name_language=const.language_nb,
                                                default="")
            short_name = ou.get_name_with_language(name_variant=const.ou_name_short,
                                                   name_language=const.language_nb,
                                                   default="")
            if acronym:
                faknavn = acronym
            else:
                faknavn = short_name
        fak_ans_id = "%s:sap:gruppe:%s:%s:ansatte" % \
                     (cereconf.INSTITUTION_DOMAIN_NAME_LMS,
                      cereconf.DEFAULT_INSTITUSJONSNR,
                      fak_sko)
        ans_title = "Ansatte ved %s" % faknavn
        register_group(ans_title, fak_ans_id, brukere_id,
                       allow_contact=True)
        ans_memb = ans_dict[int(faknr)]
        register_members(fak_ans_id, ans_memb, const.entity_account)
        for id_prefix, parent_id in ((emner_this_sem_id, emnerom_this_sem_id),
                                     (emner_next_sem_id, emnerom_next_sem_id)):
            fak_node_id = id_prefix + \
                          ":%s:%s" % (cereconf.DEFAULT_INSTITUSJONSNR,
                                      fak_sko)
            register_group(faknavn, fak_node_id, parent_id,
                           allow_room=True)
        brukere_sted_id = brukere_id + \
                          ":%s:%s" % (cereconf.DEFAULT_INSTITUSJONSNR,
                                      fak_sko)
        register_group(faknavn, brukere_sted_id, brukere_id)
        brukere_studenter_id = brukere_sted_id + ':student'
        register_group('Studenter ved %s' % faknavn,
                       brukere_studenter_id, brukere_sted_id)
        fellesrom_sted_id = fellesrom_id + ":%s:%s" % (
            cereconf.DEFAULT_INSTITUSJONSNR, fak_sko)
        register_group(faknavn, fellesrom_sted_id, fellesrom_id,
                       allow_room=True)

    register_spread_groups(emne_info, stprog_info, evukurs_info)

    output_group_xml()
    for room, data in new_rooms.iteritems():
        fxml.room_to_XML(data['CFid'], fronter_lib.Fronter.STATUS_ADD, data)

    for node, data in new_acl.iteritems():
        fxml.acl_to_XML(node, fronter_lib.Fronter.STATUS_ADD, data)

    for gname, members in new_groupmembers.iteritems():
        person_members = members.get(int(const.entity_account), ())
        group_members = members.get(int(const.entity_group), ())
        fxml.personmembers_to_XML(gname, fronter_lib.Fronter.STATUS_ADD,
                                  person_members)
        if group_members:
            # IVR 2008-01-29 Just to be sure...
            assert gname.split(':')[-1] == "student"
            fxml.groupmembers_to_XML(gname, fronter_lib.Fronter.STATUS_ADD,
                                     group_members)
    fxml.end()
Beispiel #2
0
def main():
    init_globals()

    # Opprett objekt for "internal:hia.no:fs:{supergroup}"
    fs_super = fs_supergroup()

    # Gå igjennom alle kjente undervisningsenheter; opprett
    # gruppe-objekter for disse.
    #
    # La fs-supergruppe-objektet ta seg av all logikk rundt hvor mange
    # nivåer gruppestrukturen skal ha for undervisningsenhet-grupper,
    # etc.
    def create_UE_helper(el_name, attrs):
        if el_name == 'undenhet':
            fs_super.add('undenh', attrs)

    logger.info("Leser XML-fil: underv_enhet.xml")
    access_FS.underv_enhet_xml_parser(
        os.path.join(dump_dir, 'underv_enhet.xml'),
        create_UE_helper)

    # Gå igjennom alle kjente EVU-kurs; opprett gruppeobjekter for disse.
    def create_evukurs_helper(el_name, attrs):
        if (el_name == "evukurs" and
            attrs.get("status_aktiv") == 'J' and
            attrs.get("status_nettbasert_und") == 'J'):
            
            if (immediate_evu_expire and
                mx.DateTime.strptime(attrs.get("dato_til"), "%Y-%m-%d") <
                mx.DateTime.now()):
                logger.debug("Kurs %s-%s ekspirerte",
                             attrs["etterutdkurskode"],
                             attrs["kurstidsangivelsekode"])
            else:
                fs_super.add("evu", attrs)
            # fi
        # fi
    # end create_evukurs_helper
    xmlfile = "evu_kursinfo.xml"
    logger.info("Leser XML-fil: %s", xmlfile)
    access_FS.evukurs_xml_parser(os.path.join(dump_dir, xmlfile),
                                 create_evukurs_helper)
    logger.info("Ferdig med %s", xmlfile)

    # Meld studenter inn i undervisningsenhet-gruppene
    def student_UE_helper(el_name, attrs):
        if el_name == 'student':
            for undenh in fs_super.list_matches_1('undenh', attrs,
                                                  'student'):
                undenh.add(attrs)

    logger.info("Leser XML-fil: student_undenh.xml")
    access_FS.student_undenh_xml_parser(
        os.path.join(dump_dir, 'student_undenh.xml'),
        student_UE_helper)

    # Meld EVU-kursdeltakere i de respektive EVU-kursgruppene.
    def EVU_deltaker_helper(el_name, attrs):
        if el_name == "person" and len(attrs.get("evu")) > 0:
            # Dette blir ikke fult så pent -- i merged_persons plasserer man
            # informasjonen om EVU-tilknytning i form av underelementer av
            # <person>. Dermed må ethvert EVU-underelement (de er samlet i en
            # liste av dict'er under nøkkelen "evu" under) "suppleres" med
            # fdato/pnr på eieren til det EVU-underelementet.
            tmp = { "fodselsdato" : attrs["fodselsdato"],
                    "personnr"  : attrs["personnr"], }
            for evuattrs in attrs["evu"]:
                evuattrs.update(tmp)
                for evukurs in fs_super.list_matches_1("evu", evuattrs,
                                                       "kursdeltaker"):
                    evukurs.add(evuattrs)
                # od
            # od
        # fi
    # end create_EVU_participant_helper
    xmlfile = "merged_persons.xml"
    logger.info("Leser XML-fil: %s", xmlfile)
    access_FS.deltaker_xml_parser(os.path.join(dump_dir, xmlfile),
                                  EVU_deltaker_helper)
    logger.info("Ferdig med %s", xmlfile)

    # Gå igjennom alle kjente studieprogrammer; opprett gruppeobjekter
    # for disse.
    def create_studieprog_helper(el_name, attrs):
        if el_name == 'studprog' and attrs.get('status_utgatt') != 'J':
            fs_super.add('studieprogram', attrs)
    logger.info("Leser XML-fil: studieprog.xml")
    access_FS.studieprog_xml_parser(
        os.path.join(dump_dir, 'studieprog.xml'),
        create_studieprog_helper)

    # Meld forelesere og studieledere inn i passende
    # undervisningsenhet/EVU-kurs -gruppene
    def rolle_helper(el_name, attrs):
        if el_name != 'rolle':
            return
        rolle = attrs['rollekode']
        target = attrs[access_FS.roles_xml_parser.target_key]
        if len(target) != 1:
            return
        target = target[0]
        if target in ('undenh', 'stprog'):
            if rolle == 'FORELESER':
                for ue_foreleser in fs_super.list_matches('undenh', attrs,
                                                          'foreleser'):
                    ue_foreleser.add(attrs)
            elif rolle in ('STUDILEDER', 'STUDKOORD'):
                for ue_studieleder in fs_super.list_matches('undenh', attrs,
                                                            'studieleder'):
                    ue_studieleder.add(attrs)
                for stpr_studieleder in fs_super.list_matches('studieprogram',
                                                              attrs,
                                                              'studieleder'):
                    stpr_studieleder.add(attrs)
            # fi
        elif target in ('evu',):
            if rolle == 'FORELESER':
                # Kan ett element tilhøre flere evukurs?
                for evu_foreleser in fs_super.list_matches('evu', attrs,
                                                           "foreleser"):
                    evu_foreleser.add(attrs)
                # od
            # fi
        # fi
    # end rolle_helper
            

    xmlfile = "roles.xml"
    logger.info("Leser XML-fil: %s", xmlfile)
    access_FS.roles_xml_parser(os.path.join(dump_dir, xmlfile),
                               rolle_helper)
    logger.info("Ferdig med %s", xmlfile)

    # Finn alle studenter 
    def student_studieprog_helper(el_name, attrs):
        if el_name == 'aktiv':
            for stpr in fs_super.list_matches_1('studieprogram', attrs,
                                                'student'):
                stpr.add(attrs)

    logger.info("Leser XML-fil: person.xml")
    access_FS.person_xml_parser(
        os.path.join(dump_dir, 'person.xml'),
        student_studieprog_helper)
    logger.info("Ferdig med XML-fil: person.xml")

    # Write back all changes to the database
    fs_super.sync()

    if dryrun:
        logger.info("rolling back all changes")
        db.rollback()
    else:
        logger.info("committing all changes")
        db.commit()
Beispiel #3
0
def main():
    init_globals()

    # Opprett objekt for "internal:hia.no:fs:{supergroup}"
    fs_super = fs_supergroup()

    # Gå igjennom alle kjente undervisningsenheter; opprett
    # gruppe-objekter for disse.
    #
    # La fs-supergruppe-objektet ta seg av all logikk rundt hvor mange
    # nivåer gruppestrukturen skal ha for undervisningsenhet-grupper,
    # etc.
    def create_UE_helper(el_name, attrs):
        if el_name == 'undenhet':
            fs_super.add('undenh', attrs)

    logger.info("Leser XML-fil: underv_enhet.xml")
    access_FS.underv_enhet_xml_parser(
        os.path.join(dump_dir, 'underv_enhet.xml'), create_UE_helper)

    # Gå igjennom alle kjente EVU-kurs; opprett gruppeobjekter for disse.
    def create_evukurs_helper(el_name, attrs):
        if (el_name == "evukurs" and attrs.get("status_aktiv") == 'J'
                and attrs.get("status_nettbasert_und") == 'J'):

            if (immediate_evu_expire and mx.DateTime.strptime(
                    attrs.get("dato_til"), "%Y-%m-%d") < mx.DateTime.now()):
                logger.debug("Kurs %s-%s ekspirerte",
                             attrs["etterutdkurskode"],
                             attrs["kurstidsangivelsekode"])
            else:
                fs_super.add("evu", attrs)
            # fi
        # fi

    # end create_evukurs_helper
    xmlfile = "evu_kursinfo.xml"
    logger.info("Leser XML-fil: %s", xmlfile)
    access_FS.evukurs_xml_parser(os.path.join(dump_dir, xmlfile),
                                 create_evukurs_helper)
    logger.info("Ferdig med %s", xmlfile)

    # Meld studenter inn i undervisningsenhet-gruppene
    def student_UE_helper(el_name, attrs):
        if el_name == 'student':
            for undenh in fs_super.list_matches_1('undenh', attrs, 'student'):
                undenh.add(attrs)

    logger.info("Leser XML-fil: student_undenh.xml")
    access_FS.student_undenh_xml_parser(
        os.path.join(dump_dir, 'student_undenh.xml'), student_UE_helper)

    # Meld EVU-kursdeltakere i de respektive EVU-kursgruppene.
    def EVU_deltaker_helper(el_name, attrs):
        if el_name == "person" and len(attrs.get("evu")) > 0:
            # Dette blir ikke fult så pent -- i merged_persons plasserer man
            # informasjonen om EVU-tilknytning i form av underelementer av
            # <person>. Dermed må ethvert EVU-underelement (de er samlet i en
            # liste av dict'er under nøkkelen "evu" under) "suppleres" med
            # fdato/pnr på eieren til det EVU-underelementet.
            tmp = {
                "fodselsdato": attrs["fodselsdato"],
                "personnr": attrs["personnr"],
            }
            for evuattrs in attrs["evu"]:
                evuattrs.update(tmp)
                for evukurs in fs_super.list_matches_1("evu", evuattrs,
                                                       "kursdeltaker"):
                    evukurs.add(evuattrs)
                # od
            # od
        # fi

    # end create_EVU_participant_helper
    xmlfile = "merged_persons.xml"
    logger.info("Leser XML-fil: %s", xmlfile)
    access_FS.deltaker_xml_parser(os.path.join(dump_dir, xmlfile),
                                  EVU_deltaker_helper)
    logger.info("Ferdig med %s", xmlfile)

    # Gå igjennom alle kjente studieprogrammer; opprett gruppeobjekter
    # for disse.
    def create_studieprog_helper(el_name, attrs):
        if el_name == 'studprog' and attrs.get('status_utgatt') != 'J':
            fs_super.add('studieprogram', attrs)

    logger.info("Leser XML-fil: studieprog.xml")
    access_FS.studieprog_xml_parser(os.path.join(dump_dir, 'studieprog.xml'),
                                    create_studieprog_helper)

    # Meld forelesere og studieledere inn i passende
    # undervisningsenhet/EVU-kurs -gruppene
    def rolle_helper(el_name, attrs):
        if el_name != 'rolle':
            return
        rolle = attrs['rollekode']
        target = attrs[access_FS.roles_xml_parser.target_key]
        if len(target) != 1:
            return
        target = target[0]
        if target in ('undenh', 'stprog'):
            if rolle == 'FORELESER':
                for ue_foreleser in fs_super.list_matches(
                        'undenh', attrs, 'foreleser'):
                    ue_foreleser.add(attrs)
            elif rolle in ('STUDILEDER', 'STUDKOORD'):
                for ue_studieleder in fs_super.list_matches(
                        'undenh', attrs, 'studieleder'):
                    ue_studieleder.add(attrs)
                for stpr_studieleder in fs_super.list_matches(
                        'studieprogram', attrs, 'studieleder'):
                    stpr_studieleder.add(attrs)
            # fi
        elif target in ('evu', ):
            if rolle == 'FORELESER':
                # Kan ett element tilhøre flere evukurs?
                for evu_foreleser in fs_super.list_matches(
                        'evu', attrs, "foreleser"):
                    evu_foreleser.add(attrs)
                # od
            # fi
        # fi

    # end rolle_helper

    xmlfile = "roles.xml"
    logger.info("Leser XML-fil: %s", xmlfile)
    access_FS.roles_xml_parser(os.path.join(dump_dir, xmlfile), rolle_helper)
    logger.info("Ferdig med %s", xmlfile)

    # Finn alle studenter
    def student_studieprog_helper(el_name, attrs):
        if el_name == 'aktiv':
            for stpr in fs_super.list_matches_1('studieprogram', attrs,
                                                'student'):
                stpr.add(attrs)

    logger.info("Leser XML-fil: person.xml")
    access_FS.person_xml_parser(os.path.join(dump_dir, 'person.xml'),
                                student_studieprog_helper)
    logger.info("Ferdig med XML-fil: person.xml")

    # Write back all changes to the database
    fs_super.sync()

    if dryrun:
        logger.info("rolling back all changes")
        db.rollback()
    else:
        logger.info("committing all changes")
        db.commit()
Beispiel #4
0
def main():
    # Håndter upper- og lowercasing av strenger som inneholder norske
    # tegn.
    locale.setlocale(locale.LC_CTYPE, ('en_US', 'iso88591'))

    init_globals()

    fxml.start_xml_head()

    # Finn `account_id` -> account-data for alle brukere.
    acc2names = load_acc2name()
    # Spytt ut PERSON-elementene.
    for user in acc2names.itervalues():
        fxml.user_to_XML(
            user['NAME'],
            # Som påpekt av HiA i en e-post til cerebrum-hia
            # (<messsage-id:[email protected]), skal
            # vi bruke STATUS_ADD (autentiseringsrutinene har
            # endret seg og nå *skal* man levere dumpen med
            # recstatus=1).
            fronter_lib.Fronter.STATUS_ADD,
            user)

    # Registrer en del semi-statiske strukturnoder.
    root_node_id = "STRUCTURE:ClassFronter structure root node"
    register_group('Universitetet i Agder', root_node_id, root_node_id)

    manuell_node_id = 'STRUCTURE:%s:manuell' % \
                      cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Manuell', manuell_node_id, root_node_id, allow_room=True)

    auto_node_id = "STRUCTURE:%s:automatisk" % \
                   cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group("Automatisk", auto_node_id, root_node_id)

    emner_id = 'STRUCTURE:%s:fs:emner' % cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Emner', emner_id, auto_node_id)

    this_sem, next_sem = get_semester()
    emner_this_sem_id = emner_id + ':%s:%s' % tuple(this_sem)
    emner_next_sem_id = emner_id + ':%s:%s' % tuple(next_sem)
    register_group('Emner %s %s' % (this_sem[1].upper(), this_sem[0]),
                   emner_this_sem_id, emner_id)
    register_group('Emner %s %s' % (next_sem[1].upper(), next_sem[0]),
                   emner_next_sem_id, emner_id)

    emnerom_this_sem_id = emner_this_sem_id + ':emnerom'
    emnerom_next_sem_id = emner_next_sem_id + ':emnerom'
    register_group('Emnerom %s %s' % (this_sem[1].upper(), this_sem[0]),
                   emnerom_this_sem_id, emner_this_sem_id)
    register_group('Emnerom %s %s' % (next_sem[1].upper(), next_sem[0]),
                   emnerom_next_sem_id, emner_next_sem_id)

    for sem, sem_node_id in ((this_sem, emner_this_sem_id),
                             (next_sem, emner_next_sem_id)):
        for suffix, title in (('student',
                               'Studenter %s %s' % (sem[1].upper(), sem[0])),
                              ('foreleser',
                               'Forelesere %s %s' % (sem[1].upper(), sem[0])),
                              ('studieleder', 'Studieledere %s %s' %
                               (sem[1].upper(), sem[0]))):
            node_id = sem_node_id + ':' + suffix
            register_group(title, node_id, sem_node_id)

    brukere_id = 'STRUCTURE:%s:fs:brukere' % cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Brukere', brukere_id, auto_node_id)

    fellesrom_id = 'STRUCTURE:%s:fs:fellesrom' % \
                   cereconf.INSTITUTION_DOMAIN_NAME_LMS
    register_group('Fellesrom', fellesrom_id, auto_node_id)

    # Registrer statiske EVU-strukturnoder.
    # Ting blir litt enklere, hvis vi drar med oss institusjonsnummeret
    evu_node_id = 'STRUCTURE:%s:fs:%s:evu' % (
        cereconf.INSTITUTION_DOMAIN_NAME_LMS, cereconf.DEFAULT_INSTITUSJONSNR)
    register_group('EVU', evu_node_id, auto_node_id)
    for (suffix, title, allow_room) in (("kursrom", "EVU kursrom", True),
                                        ("kursdeltaker", "EVU kursdeltaker",
                                         False), ("foreleser", "EVU foreleser",
                                                  False)):
        node_id = evu_node_id + ":" + suffix
        register_group(title, node_id, evu_node_id, allow_room)
    # od

    # Populer dicter for "emnekode -> emnenavn", "fakultet ->
    # [emnekode ...]" og "<evukurs> -> evukursnavn".
    emne_info = {}
    fakulteter = []

    def finn_emne_info(element, attrs):
        if element != 'undenhet':
            return
        emnekode = attrs['emnekode'].lower()
        faknr = int(attrs['faknr_kontroll'])
        emne_info[emnekode] = {'navn': attrs['emnenavn_bokmal'], 'fak': faknr}
        if faknr not in fakulteter:
            fakulteter.append(faknr)

    access_FS.underv_enhet_xml_parser(os.path.join(fs_dir, 'underv_enhet.xml'),
                                      finn_emne_info)

    stprog_info = {}

    def finn_stprog_info(element, attrs):
        if element != 'studprog':
            return
        stprog = attrs['studieprogramkode'].lower()
        faknr = int(attrs['faknr_studieansv'])
        stprog_info[stprog] = {'fak': faknr}
        if faknr not in fakulteter:
            fakulteter.append(faknr)

    access_FS.studieprog_xml_parser(os.path.join(fs_dir, 'studieprog.xml'),
                                    finn_stprog_info)

    evukurs_info = {}

    def finn_evukurs_info(element, attrs):
        if element != "evukurs":
            return

        name = "%s (%s)" % (attrs.get("etterutdkursnavnkort", ""), ", ".join(
            filter(
                None,
                (attrs.get("etterutdkurskode"),
                 attrs.get("kurstidsangivelsekode"), attrs.get("emnekode")))))

        eukk, ktak = (attrs["etterutdkurskode"].lower(),
                      attrs["kurstidsangivelsekode"].lower())
        evukurs_info[eukk, ktak] = name

    # end finn_evukurs_info
    access_FS.evukurs_xml_parser(os.path.join(fs_dir, 'evu_kursinfo.xml'),
                                 finn_evukurs_info)

    # Henter ut ansatte per fakultet
    ans_dict = get_ans_fak(fakulteter, acc2names)
    # Opprett de forskjellige stedkode-korridorene.
    ou = Stedkode.Stedkode(db)
    for faknr in fakulteter:
        fak_sko = "%02d0000" % faknr
        ou.clear()
        try:
            ou.find_stedkode(faknr,
                             0,
                             0,
                             institusjon=cereconf.DEFAULT_INSTITUSJONSNR)
        except Errors.NotFoundError:
            logger.error("Finner ikke stedkode for fakultet %d", faknr)
            faknavn = '*Ikke registrert som fakultet i FS*'
        else:
            acronym = ou.get_name_with_language(
                name_variant=const.ou_name_acronym,
                name_language=const.language_nb,
                default="")
            short_name = ou.get_name_with_language(
                name_variant=const.ou_name_short,
                name_language=const.language_nb,
                default="")
            if acronym:
                faknavn = acronym
            else:
                faknavn = short_name
        fak_ans_id = "%s:sap:gruppe:%s:%s:ansatte" % \
                     (cereconf.INSTITUTION_DOMAIN_NAME_LMS,
                      cereconf.DEFAULT_INSTITUSJONSNR,
                      fak_sko)
        ans_title = "Ansatte ved %s" % faknavn
        register_group(ans_title, fak_ans_id, brukere_id, allow_contact=True)
        ans_memb = ans_dict[int(faknr)]
        register_members(fak_ans_id, ans_memb, const.entity_account)
        for id_prefix, parent_id in ((emner_this_sem_id, emnerom_this_sem_id),
                                     (emner_next_sem_id, emnerom_next_sem_id)):
            fak_node_id = id_prefix + \
                          ":%s:%s" % (cereconf.DEFAULT_INSTITUSJONSNR,
                                      fak_sko)
            register_group(faknavn, fak_node_id, parent_id, allow_room=True)
        brukere_sted_id = brukere_id + \
                          ":%s:%s" % (cereconf.DEFAULT_INSTITUSJONSNR,
                                      fak_sko)
        register_group(faknavn, brukere_sted_id, brukere_id)
        brukere_studenter_id = brukere_sted_id + ':student'
        register_group('Studenter ved %s' % faknavn, brukere_studenter_id,
                       brukere_sted_id)
        fellesrom_sted_id = fellesrom_id + ":%s:%s" % (
            cereconf.DEFAULT_INSTITUSJONSNR, fak_sko)
        register_group(faknavn,
                       fellesrom_sted_id,
                       fellesrom_id,
                       allow_room=True)

    register_spread_groups(emne_info, stprog_info, evukurs_info)

    output_group_xml()
    for room, data in new_rooms.iteritems():
        fxml.room_to_XML(data['CFid'], fronter_lib.Fronter.STATUS_ADD, data)

    for node, data in new_acl.iteritems():
        fxml.acl_to_XML(node, fronter_lib.Fronter.STATUS_ADD, data)

    for gname, members in new_groupmembers.iteritems():
        person_members = members.get(int(const.entity_account), ())
        group_members = members.get(int(const.entity_group), ())
        fxml.personmembers_to_XML(gname, fronter_lib.Fronter.STATUS_ADD,
                                  person_members)
        if group_members:
            # IVR 2008-01-29 Just to be sure...
            assert gname.split(':')[-1] == "student"
            fxml.groupmembers_to_XML(gname, fronter_lib.Fronter.STATUS_ADD,
                                     group_members)
    fxml.end()