Introduksjon
Formålet med dette notatet er å beskrive utrulling av utvidelser for å støtte Cristin-eksporten, samt testingforslag til (deler av) den nye funksjonaliteten.
I grove trekk består utvidelsene av følgende komponenter:
mod_employment.sql -- SQL-utvidelsen (1 tabell)
Cerebrum/modules/PersonEmployment.py -- Person-mixin for interaksjon med mod_employment.sql.
Den nødvendige utvidelsen av jobbene som populerer mod_employment.sql:
- For UiA/HiØf - process_SAP_affiliations.py
- For UiO - import_HR_person.py
Selve Cristin-eksporten -- contrib/no/generate-cristin-export.py.
DB-skjema
Vi trenger bare en tabell for å understøtte Cristin-eksporten. Opprinnelig var planen å bruke konstantobjektene for å merke stillingene (hovedsaklig den 4-siffrede stillingskoden samt beskrivelsen), men det vil koste for mye arbeid (herunder dobbeltarbeid) å administrere dette all den tid vi ikke har en autoritativ kilde for stillingskodene/beskrivelsene.
Det er også litt uheldig å la et slikt ikke-kontrollert felt være en del av primærnøkkelen (menneskebeskrivelsen er det), men det er ingen annen utvei, all den tid vi ikke har en institusjonsuavhengig kilde for stillingsbeskrivelsene.
Testing
Bare laste opp modulen:
$ python makedb.py design/mod_employment.sql
Det kreves ingen andre inngrep.
API-utvidelsen
Den opprinnelige tanken var å bruke tilknytninger som finnes alt og utvide litegrann tabellene. Det koster imidlertid mer enn hva gevinsten av å oppdatere hele core er, så vi valgte å bruke egen mixin til Person. I utgangspunktet er planen å lage det minste API-et vi trenger for å administrere tilsettingsoppføringer samt støtte søk som Cristin-eksporten vil trenge.
Man kan essensielt gjøre populering av person_employment på 2 måter: enten via et populate()-aktig grensesnitt (flere populate()-kall etterfulgt av write_db()) eller vha add/remove-<doohickey> (der de aktuelle kallene står selv ansvarlige for insert, update eller delete av de rette radene).
Testing
For kvikk klipp-og-lim:
import cerebrum_path, cereconf from Cerebrum.Utils import Factory db = Factory.get("Database")() db.cl_init(change_program="testhack") p = Factory.get("Person")(db) ou = Factory.get("OU")(db) co = Factory.get("Constants")()
Sjekke at Person-mixin er med:
print cereconf.CLASS_PERSON import inspect print inspect.getmro(p.__class__)
Deretter kan man leke litt med å legge til/slette oppføringer:
p.find(20905) list(p.search_employment(person_id=p.entity_id))
La oss legge et par:
import cerebrum_path, cereconf from Cerebrum.Utils import Factory db = Factory.get("Database")() p = Factory.get("Person")(db) ou = Factory.get("OU")(db) co = Factory.get("Constants")() p.find(20905) ou.find_stedkode(33, 15, 20, 185) p.add_employment(ou.entity_id, "Overingeniør", co.system_sap, 100, "2007-12-01", "9999-12-31", "1087", True) p.add_employment(ou.entity_id, "Overingeniør", co.system_sap, 99, "2007-12-01", "9999-12-31", "1087", True)
Den siste en en oppdatering av det foregående.
La oss fjerne også et par:
import cerebrum_path, cereconf from Cerebrum.Utils import Factory db = Factory.get("Database")() p = Factory.get("Person")(db) ou = Factory.get("OU")(db) co = Factory.get("Constants")() p.find(20905) ou.find_stedkode(33, 15, 20, 185) p.add_employment(ou.entity_id, "Overingeniør", co.system_sap, 100, "2007-12-01", "9999-12-31", "1087", True) p.delete_employment(ou.entity_id, "Overingeniør", co.system_sap)
Prodsetting
Dette kan bli litt komplisert, siden UiA/HiØ henger etter på db- skjemaoppgraderingsfronten. Her er det litt viktig å ikke ødelegge andre jobber. F.eks. oppgraderingen av mod_sap.sql vil medføre at en del kode under contrib/no/hia/ vil måtte oppgraderes og at scheduled_jobs.py vil måtte rettes for de aktuelle jobbene.
- mod_sap må oppgraderes til 1.1
- mod_employment må rulles ut
For ordens skyld: HEAD virker ikke mot mod_sap.sql 1.0. Jeg anbefaler å pause job_runner.py mens man syssler med dette.
Oppgradere til HEAD
- Cerebrum/modules/no/{hia,hiof}/
- contrib/no/hia/<SAP-relaterte-jobber>
- Cerebrum/modules/no/PersonEmployment.py
- design/mod_employment.sql
- design/mod_sap.sql
- design/migrate
- contrib/migrate_cerebrum_database.py
Tvinge mod_sap til 1.0
Mulig dette skrittet ikke er nødvendig, dersom migrate_cerebrum_database.py --info sier at sap-modulen er allerede i 1.0:
import cerebrum_path, cereconf from Cerebrum.Utils import Factory from Cerebrum import Metainfo db = Factory.get("Database")() db.cl_init(change_program='manual hack') meta = Metainfo.Metainfo(db) meta.set_metainfo("sqlmodule_sap", "1.0") db.commit()
Oppgradere mod_sap til 1.1
Migrere skjema o.l.:
python contrib/migrate_cerebrum_database.py \ --component sap --from sap_1_0 \ --makedb-path $(pwd) \ --design-path $(pwd)/design python makedb.py --update-codes
Sjekk at:
python contrib/migrate_cerebrum_database.py --info
spytter ut fornuftige ting.
Laste opp mod_employment
Slik:
python makedb.py design/mod_employment.sql python makedb.py --update-codes
Oppgradere core til 0.9.15
API-et er nemlig basert på at EntityContact har contact_alias-kolonnen (som vi trengte for 5-siffrede numrene til voip-utvidelsen). Hvis API-et bruker denne, må databasen også gjøre det. Jeg tester her ting mot HEAD, og da er det et krav. Dersom Entity.py er gammel nok, vil man antageligvis kunne glemme denne oppgraderingen:
python contrib/migrate_cerebrum_database.py \ --from rel_0_9_13 --makedb-path $(pwd) \ --design-path $(pwd)/design
Justering av cereconf
Siden vi nettopp har oppgradert masse filer, kan det være på sin plass å justere litt variablene i cereconf:
CLASS_PERSON = ("Cerebrum.modules.no.PersonEmployment/PersonEmploymentMixin", 'Cerebrum.modules.Email/PersonEmailMixin', 'Cerebrum.modules.no.Person/PersonFnrMixin',) CLASS_OU=('Cerebrum.modules.no.Stedkode/Stedkode',)
Ymse importer for å teste at ting henger sammen
Siden man endret på mod_sap (og introduserte mod_employment), er det nettopp disse man skal teste virker. Alle importer anbefales å kjøres med dryrun først, for å unngå å herpe ting opp:
export FSDIR=/cerebrum/uia/dumps/FS/ export SAPDIR=/cerebrum/uia/dumps/SAP/ python contrib/no/hia/import_SAP_OU_id.py \ --ou-file system_fs:$FSDIR/ou.xml \ --dryrun \ --logger-name console
Deretter burde man se masse SAP OU-ider (slik de står i stedkode_konv i ou.xml) i tabellen entity_external_id. Deretter tar vi personinfo:
python contrib/no/hia/import_SAP_person.py \ --with-fok \ -s $SAPDIR/feide_persondata.txt \ --logger-name console \ --dryrun 2>&1 | tee sap-person.log
Deretter kan vi populere tilknytninger OG person_employment i en jafs:
python contrib/no/hia/process_SAP_affiliations.py \ -e $SAPDIR/feide_persti.txt \ -p $SAPDIR/feide_persondata.txt \ --with-employment \ --with-fok \ --logger-name console 2>&1 \ --dryrun | tee sap-aff-emp.log
Sist, men ikke minst, selve Cristin-dumpen. Den prøver å være litt smart og foreslår ting man kan skrive når man ikke vet de rette verdiene. "-p" er perspective (for å finne ut av OU-hierarkiet), -s er kildesystem for tilsettingsdata (SAP for alle), "-r" er root-OU. root- OU sitt akronym bør ligne på institusjonen. Hvis man ikke aner hva root-OU-en skal være, skriv noe vås, så vil skriptet foreslå selv hvilke OU-er er forelderløse (aka potensielle root-OU-er) og sjekk at akronymet som vises er fornuftig. "-r" tar i mot enten sko eller ou_id. Heldig nok er 00-00-00 root-OU-en både for UiA og HiØ:
python contrib/no/generate-cristin-export.py \ -o cristin.xml \ -r 00-00-00 \ -p FS \ -s SAP \ --logger-name console 2>&1 | tee cristin.log
Justering av scheduled_jobs
Alle jobbene som er nevnt her bør være justert. Jeg tror jeg fikset og committet alle, men det er sikkert lurt å kaste et blikk på resultatet.