def get_person_info(outfile): """ Henter info om alle personer i LT som er av interesse. Ettersom opplysningene samles fra flere datakilder, lagres de først i en dict persondta """ # Lag mapping fra stillingskodenr til titel (ala overing) skode2tittel = {} for t in LT.GetTitler(): skode2tittel[t['stillingkodenr']] = (t['tittel'], t['univstkatkode']) # od # Lag mapping fra univstkatkode til hovedkatkode (VIT etc.) kate2hovedkat = {} for t in LT.GetHovedkategorier(): kate2hovedkat[t['univstkatkode']] = t['hovedkatkode'] # od # Hent alle aktive tilsetninger tils = LT.GetTilsettinger() persondta = {} for t in tils: key = '-'.join(["%i" % x for x in [t['fodtdag'], t['fodtmnd'], t['fodtar'], t['personnr']]]) if not persondta.has_key(key): persondta[key] = {} # fi persondta[key]['tils'] = persondta[key].get('tils', []) + [t] # od # Hent alle reservasjoner res = LT.GetReservasjoner() reservasjoner = {} for r in res: key = '-'.join(["%i" % x for x in [r['fodtdag'], r['fodtmnd'], r['fodtar'], r['personnr']]]) if not reservasjoner.has_key(key): reservasjoner[key] = {} # fi reservasjoner[key]['res'] = reservasjoner[key].get('res', []) + [r] # od # Hent alle lønnsposteringer siste 30 dager. # # Tidligere cachet vi disse dataene slik at vi kunne søke over # færre dager, men det ser ikke ut til å være nødvendig da søket # ikke tar mer enn ca et minutt tid = time.strftime("%Y%m%d", time.gmtime(time.time() - (3600*24*30))) lonnspost = LT.GetLonnsPosteringer(tid) for lp in lonnspost: key = '-'.join(["%i" % x for x in [lp['fodtdag'], lp['fodtmnd'], lp['fodtar'], lp['personnr']]]) if not persondta.has_key(key): persondta[key] = {} # fi persondta[key]['bil'] = persondta[key].get('bil', []) + [lp] # od gjester = LT.GetGjester() for g in gjester: key = '-'.join(["%i" % x for x in [g['fodtdag'], g['fodtmnd'], g['fodtar'], g['personnr']]]) if not persondta.has_key(key): persondta[key] = {} # fi persondta[key]['gjest'] = persondta[key].get('gjest', []) + [g] # od permisjoner = LT.GetPermisjoner() for p in permisjoner: key = string.join([ str(x) for x in [p["fodtdag"], p["fodtmnd"], p["fodtar"], p["personnr"]] ], "-") if not persondta.has_key(key): persondta[key] = {} # fi if not persondta[key].has_key("permisjon"): persondta[key]["permisjon"] = {} # fi # Since LT.Permisjon(key, tilsnr) is the PK, this assignment will # never overwrite any information pkey = str(p.fields.tilsnr) if not persondta[key]["permisjon"].has_key(pkey): persondta[key]["permisjon"][pkey] = [] # fi persondta[key]["permisjon"][pkey].append(p) # od # Skriv ut informasjon om de personer vi allerede har hentet, og # hent noe tilleggsinformasjon om dem f = AtomicFileWriter(outfile, 'w') f.write(xml.xml_hdr + "<data>\n") for p in persondta.keys(): fodtdag, fodtmnd, fodtar, personnr = p.split('-') pi = LT.GetPersonInfo(fodtdag, fodtmnd, fodtar, personnr) picols = LT.get_column_names(pi) f.write( xml.xmlify_dbrow(pi[0], xml.conv_colnames(picols), 'person', 0, extra_attr={'fodtdag': fodtdag, 'fodtmnd':fodtmnd, 'fodtar':fodtar, 'personnr': personnr} ) + "\n") tlf = LT.GetArbTelefon(fodtdag, fodtmnd, fodtar, personnr) tlfcols = LT.get_column_names(tlf) for t in tlf: f.write(" "+xml.xmlify_dbrow( t, xml.conv_colnames(tlfcols), 'arbtlf') + "\n") # od komm = LT.GetPersKomm(fodtdag, fodtmnd, fodtar, personnr) kcols = LT.get_column_names(komm) for k in komm: f.write(" "+xml.xmlify_dbrow( k, xml.conv_colnames(kcols), 'komm') + "\n") # od roller = LT.GetPersonRoller(fodtdag, fodtmnd, fodtar, personnr) rcols = LT.get_column_names(roller) for r in roller: f.write(" "+xml.xmlify_dbrow( r, xml.conv_colnames(rcols), 'rolle') +"\n") # od permisjoner = persondta[p].get("permisjon", {}) for t in persondta[p].get("tils", ()): attr = dict([(key, t[key]) for key in ("fakultetnr_utgift", "instituttnr_utgift", "gruppenr_utgift", "prosent_tilsetting", "dato_fra", "dato_til", "tilsnr")]) key = "stillingkodenr_beregnet_sist" attr[key] = int(t[key]) sk = skode2tittel[t[key]] attr["hovedkat"] = kate2hovedkat[sk[1]] attr["tittel"] = sk[0] f.write(" " + xml.xmlify_dbrow(attr.values(), attr.keys(), "tils", close_tag=0) + "\n") formatted_leaves = output_leaves(t, permisjoner) for leave in formatted_leaves: attr = dict(leave) f.write(" " + xml.xmlify_dbrow(attr.values(), attr.keys(), "permisjon") + "\n") # od f.write("</tils>\n" ) # od if reservasjoner.has_key(p): for r in reservasjoner[p].get('res', ()): attr = dict([(key, r[key]) for key in ("katalogkode", "felttypekode", "resnivakode",)]) f.write(" " + xml.xmlify_dbrow(attr.values(), attr.keys(), "res") + "\n") # od # fi prev = None # Order by 'stedkode', then by reverse date persondta[p].get('bil', []).sort(lambda x, y: cmp(make_key(x), make_key(y)) or cmp(y["dato_oppgjor"], x["dato_oppgjor"])) for t in persondta[p].get('bil', []): if make_key(t) == make_key(prev): continue # fi attr = dict([(key, t[key]) for key in ("dato_oppgjor", "fakultetnr_kontering", "instituttnr_kontering", "gruppenr_kontering",)]) f.write(" " + xml.xmlify_dbrow(attr.values(), attr.keys(), "bilag") + "\n") prev = t # od for g in persondta[p].get('gjest', ()): attr = dict([(key, g[key]) for key in ("fakultetnr", "instituttnr", "gruppenr", "gjestetypekode", "dato_fra", "dato_til",)]) f.write(" " + xml.xmlify_dbrow(attr.values(), attr.keys(), "gjest") + "\n") # od f.write("</person>\n") f.write("</data>\n") f.close()