Support for Unicode i Cerebrum

Cerebrum køyrer i dag, februar 2015, med latin-1. Dette er begrensande for importar og eksportar. Dette er difor ein beskrivelse av kva som trengs for å få Cerebrum over til å brkuke Unicode fullt ut.

1   Introduksjon

SAP-importen er i dag i UTF-8, og av og til dukker det opp teikn i personnamn som er utanfor området til Latin-1. Dette gjer at vi ikkje kan importere personen, sidan vi ikkje har definert noko konvertering for slike teikn.

Den riktige måten å rette denne feilen på, er å 1) konvertere Cerebrum til å bruke Unicode internt, 2) avklare konvertering for dei ulike systema, 3) fikse på eksportar og 4) fikse på importar. Dette ser vi på som ein stor jobb, men den kan delast opp i mindre faser.

2   User stories

Stories brutt ned i strukturen, med trepunktsestimering:

  1. Cerebrum skal handtere Unicode overalt, for enklare input/output og for kompabilitet med python3.

    1. Utviklar treng å få definert ein kodestandard for input/output som all ny kode skal følge, for å sikre at behandlinga av input/output vert koda likt.

      Estimert: 0.5 / 0.5 / 1

    2. Utviklar treng konverteringsreglar å følge, inkludert for feilbehandling. Dette så utviklarane veit kva som skal gjerast med importar/eksportar rundt konvertering til ulike teiknsett. Kva skal til dømes kinesiske teikn konverterast til?

      Nokon andre enn oss bør definere dette. Vi legg også til grunn at alle har samme konverteringsreglar, men ein konverteringsregel per encoding vi har behov for.

      Estimert å implementere (ikkje definere): 0.5 / 2 / uendelig (avhenger av antal encodings og kor komplekse reglane er).

    3. Utviklar treng at alle eksportar handterer bruk av Unicode, utan å feile. Dette for å unngå at unicode-teikn i databasen får eksportar til å krasje.

      1. Utviklar treng ein oversikt over alle eksportar som ikkje støtter Unicode, så vi kan estimere kor lang tid det vil ta å fikse alle eksportar til å takle Unicode. Finne potensielle utfordringar. Må for nokre system kanskje også snakke med systema om kva som kan tilpassast.

        Obs: Kan vere nokre avhengigheter mellom eksportar, td. NIS og AD, som kompliserer arbeidet.

        Estimert: 3 / 5 / 8

      2. Utviklar treng at AD2-synk handterer Unicode-teikn.

        Estimert: 0.5 / 1 / 2

      3. Utviklar treng at gamal AD-synk handterer Unicode-teikn. Må inkludere AD-servicen også.

        Estimert: 1 / 3 / 8

      4. Utviklar treng at LDAP-eksportar handterer Unicode-teikn.

        Estimert: 1 / 3 / 8

      5. Utviklar treng at alle resterande eksportar handterer Unicode-teikn utan å krasje. Avhenger av utredningsstory.

  2. Utviklar treng at Cerebrum-API-et tek i bruk Unicode internt.

    1. Utviklar treng at log-handteringa takler Unicode-teikn.

      Estimert: 0 / 0.5 / 3

    2. Utviklar treng at konfigurasjonen takler Unicode-teikn.

      Estimert: 0.5 / 0.5 / 1

    3. Utviklar treng at change_log takler Unicode-teikn. Td. bruk av pickle.

      Estimert: 0.5 / 0.5 / 1

    4. Utviklar treng at Cerebrum handterer bruk av transkriberte teikn for eksportar til system som ikkje takler Unicode. Til dømes oversetting av personnamn til Latin-1.

    5. Utviklar treng eigne attributtar for transkriberte namn, for å kunne eksportere til system som ikkje takler Unicode.

  3. ADS treng at SAPUiO-importen tek i bruk UTF-8.

  4. Utviklar treng at all Cerebrum-kode og hardkoda strenger gjerast om til Unicode, for enklare overgang til python3.

  5. Utviklar treng at alle klientar handterer Unicode.

    1. CIS
    2. bofhd
    3. TODO: Andre

TODO: Lim inn bildet frå arbeidsmøtet.

3   Status for i dag

It is preferred to use Unicode in Cerebrum.

The default instantiation of the database will yield str-objects that are restricted to the extended ASCII table (since the database-module will use extended ASCII by default).

Upon instantiation of the database, you can choose encoding. By choosing UTF-8 as the encoding, the database-module returns unicode-objects.

Instead of instantiating the database module like so:

db = Factory.get('Database')()

Do it like this:

db = Factory.get('Database')(client_encoding='UTF-8')

3.1   Modules using unicode by default

  • The new AD sync
  • The Xpand-integration

3.2   Pitfalls

3.2.1   Pickling

Pickle is used to store change parameters in the changelog module.

Pickle does not readily accept Unicode-objects, so it is neccesarry to do something like this when unpickling:

pickle.loads(str(ans['change_params']))

instead of:

pickle.loads(ans['change_params'])

This topic needs a more thorough discussion.

Av jsama, jokim
Publisert 13. mars 2015 13:04