# -*- mode: python -*- # -*- coding: utf-8 -*- # Creation d'une formation ISCID à partir d'un xls listant les modules # XXX TODO : a tester et moderniser (ects, verifier champs, python 3, importer codes depuis ScoDoc ?) import os, sys, pdb, pprint from openpyxl import load_workbook # apt-get install python-openpyxl import jaxml SCO_ENCODING = 'utf-8' INPUT_FILENAME = "/tmp/Bachelor.xlsx" OUTPUT_FILENAME= os.path.splitext(INPUT_FILENAME)[0] + '.xml' FIRST_SHEET_IDX=1 # saute première feuille du classeur # Code de ScoDoc (sco_utils.py) UE_STANDARD = 0 # UE "fondamentale" UE_SPORT = 1 # bonus "sport" UE_STAGE_LP = 2 # ue "projet tuteuré et stage" dans les Lic. Pro. UE_ELECTIVE = 4 # UE "élective" dans certains parcours (UCAC?, ISCID) UE_PROFESSIONNELLE = 5 # UE "professionnelle" (ISCID, ...) # Code du fichier Excel: UE_TYPE2CODE = { u'UE F' : UE_STANDARD, u'UE E' : UE_ELECTIVE } # Lecture du fichier Excel UE = [] wb = load_workbook(filename=INPUT_FILENAME) #print wb.get_sheet_names() for sheet_name in wb.get_sheet_names()[FIRST_SHEET_IDX:]: print 'Importing sheet %s' % sheet_name sheet = wb.get_sheet_by_name(sheet_name) # Avance jusqu'à trouver le titre 'CODE' en premiere colonne i=0 while i < len(sheet.rows) and sheet.rows[i][0].value != 'CODE': i = i + 1 i = i + 1 ue = None while i < len(sheet.rows): code = sheet.rows[i][0].value type_ue = sheet.rows[i][2].value if type_ue in UE_TYPE2CODE: if ue: UE.append(ue) # creation UE acronyme = code # ici l'acronyme d'UE est le code du module if not acronyme and (i < len(sheet.rows)-1): acronyme = sheet.rows[i+1][0].value # code module sur ligne suivante #print acronyme if acronyme: # tres specifique: deduit l'acronyme d'UE du code module parts = acronyme.split(u'-') parts[-1] = parts[-1][-1] # ne garde que le dernier chiffre acronyme = u'-'.join(parts) # B1-LV1-EN1 -> B1-LV1-1 #print '->', acronyme if not acronyme: acronyme = sheet.rows[i][3].value # fallback: titre ue = { 'acronyme' : acronyme, 'titre' : sheet.rows[i][3].value, 'ects' : sheet.rows[i][5].value or u"", 'type' : UE_TYPE2CODE[type_ue], 'numero' : (sheet.rows[i][1].value or 0)*1000 + i*10, 'modules' : [] } i_ue = i if code: ue['modules'].append( { 'code' : code, 'heures_td' : sheet.rows[i_ue][4].value or u"", 'titre' : sheet.rows[i][3].value, 'semestre_id' : sheet.rows[i][1].value, 'numero' : i*10 } ) i += 1 # next line if ue: UE.append(ue) def sstr(s): if type(s) is type(u''): return s.encode(SCO_ENCODING) else: return str(s) # ----- Write to XML doc = jaxml.XML_document( encoding=SCO_ENCODING ) doc._push() doc.formation( acronyme="Bachelor ISCID", code_specialite="", type_parcours="1001", titre_officiel="Bachelor ISCID", formation_code="FCOD4", version="1", titre="Bachelor ISCID", formation_id="FORM115" ) for ue in UE: doc._push() doc.ue( acronyme=sstr(ue['acronyme']), ects=sstr(ue['ects']), titre=sstr(ue['titre']), numero=sstr(ue['numero']), type=sstr(ue['type']) ) doc._push() doc.matiere( titre=sstr(ue['titre']) ) # useless but necessary for m in ue['modules']: doc._push() doc.module( coefficient="1.0", code=sstr(m['code']), heures_td=sstr(m['heures_td']), titre=sstr(m['titre']), abbrev=sstr(m['titre']), semestre_id=sstr(m['semestre_id']), numero=sstr(m['numero']) ) doc._pop() # /module doc._pop() # /matiere doc._pop() # /ue doc._pop() # /formation #--- print 'Writing XML file: ', OUTPUT_FILENAME f = open(OUTPUT_FILENAME, 'w') f.write(str(doc)) f.close()