/[formed]/trunk/tools/anonym/xmlimport.py
ViewVC logotype

Contents of /trunk/tools/anonym/xmlimport.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 243 - (show annotations)
Wed Feb 27 08:54:46 2008 UTC (17 years ago) by torsten
File MIME type: text/x-python
File size: 30578 byte(s)
Tried to fix the xml import. Cases get now created at least

1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 # (c) 2008 by Intevation GmbH
4 # author: Sascha L. Teichmann
5 #
6 import sys
7 from datetime import date
8
9 import getopt
10
11 from xml.sax.saxutils import DefaultHandler
12 from xml.sax import parse
13
14 import psycopg2 as dbapi
15
16 def _int_converter(s):
17 return int(s)
18
19 def _bool_converter(s):
20 return int(s)
21
22 def _date_converter(s):
23 return date(*s.split("-"))
24
25 def _choice_converter(s):
26 return int(s)
27
28 def _radio_converter(s):
29 return int(s)
30
31 def _text_converter(s):
32 return s
33
34 RELATIONS = {
35 'master': {
36 "einverstaendniserklaerung": _bool_converter,
37 "fkz": _text_converter,
38 "name_kompetenzagentur": _text_converter,
39 "vorname": _text_converter,
40 "name": _text_converter,
41 "erstgespraech": _date_converter,
42 "zugang_kompetenzagentur": _choice_converter,
43 "kundennummer": _text_converter,
44 "schulpflichtig": _bool_converter,
45 "noch_schueler": _bool_converter,
46 "bei_eintritt_ist_der_jugendliche": _choice_converter,
47 "rechtlicher_kontext": _choice_converter,
48 "schnittstelle_zu": _choice_converter,
49 "kontaktdaten_arge": _text_converter,
50 "kundennummer_arge": _text_converter,
51 "kontaktdaten_agentur_fuer_arbeit": _text_converter,
52 "kundennummer_agentur_fuer_arbeit": _text_converter,
53 "kundennummer_jugendamt": _text_converter,
54 "kontaktdaten_jugendamt": _text_converter,
55 "kontaktdaten_schule": _text_converter,
56 "schulname": _text_converter,
57 "kontaktdaten_gerichtshilfe": _text_converter,
58 "kundennummer_gerichtshilfe": _text_converter,
59 "kontaktdaten_weitere_institutionen": _text_converter,
60 "vorname_1": _text_converter,
61 "name_1": _text_converter,
62 "geschlecht": _choice_converter,
63 "geburtsdatum": _date_converter,
64 "familienstand": _choice_converter,
65 "strasse": _text_converter,
66 "plz": _text_converter,
67 "wohnort": _text_converter,
68 "groesse_wohnort": _choice_converter,
69 "vorwahl": _text_converter,
70 "telefon_1": _text_converter,
71 "mobiltelefon": _text_converter,
72 "email": _text_converter,
73 "telefon_sonstige": _text_converter,
74 "zweiter_wohnort": _text_converter,
75 "geburtsland": _choice_converter,
76 "geburtsland_sonstige_nennung": _text_converter,
77 "muttersprache": _choice_converter,
78 "muttersprache_sonstige_nennung": _text_converter,
79 "staatsangehoerigkeit": _choice_converter,
80 "staatsangehoerigkeit_sonstige_nennung": _text_converter,
81 "aufenthaltsstatus": _choice_converter,
82 "aufenthaltsdauer": _int_converter,
83 "vater": _choice_converter,
84 "mutter": _choice_converter,
85 "familiaere_situation_1": _choice_converter,
86 "vorname_2": _text_converter,
87 "name_2": _text_converter,
88 "vorwahl_1": _text_converter,
89 "telefon_1_1": _text_converter,
90 "mobiltelefon_1": _text_converter,
91 "email_1": _text_converter,
92 "geschwister": _int_converter,
93 "anzahl_kinder": _int_converter,
94 "haushalt_jugendlicher": _int_converter,
95 "alleinerziehend": _choice_converter,
96 "familie_selbststaendig": _bool_converter,
97 "familie_staatliche_unterstuetzung": _bool_converter,
98 "jugendlicher_selbststaendig": _bool_converter,
99 "jugendlicher_staatliche_unterstuetzung": _bool_converter,
100 "jugendlicher_unterstuetzung_soziales_umfeld": _bool_converter,
101 "wohnaufenthalt": _choice_converter,
102 "arzt_gutachten_physisch": _bool_converter,
103 "physische_beeintraechtigungen": _choice_converter,
104 "physische_beeintraechtigungen_text": _text_converter,
105 "arzt_gutachten_psychisch": _bool_converter,
106 "psychische_beeintraechtigungen": _choice_converter,
107 "psychische_beeintraechtigungen_text": _text_converter,
108 "mutter_2": _bool_converter,
109 "vater_2": _bool_converter,
110 "grosseltern": _bool_converter,
111 "geschwister_2": _bool_converter,
112 "pflegefamilie_1": _bool_converter,
113 "stiefmutter": _bool_converter,
114 "stiefvater": _bool_converter,
115 "verwandte_1": _bool_converter,
116 "partner": _bool_converter,
117 "heimbetreuerin": _bool_converter,
118 "betreuerin": _bool_converter,
119 "lehrerin": _bool_converter,
120 "mitbewohner": _bool_converter,
121 "partner_mutter": _bool_converter,
122 "partner_vater": _bool_converter,
123 "freund": _bool_converter,
124 "keine_bezugsperson": _bool_converter,
125 "hobbies_1": _choice_converter,
126 "hobbies_text": _text_converter,
127 "mitarbeit_organisationen": _choice_converter,
128 "organisationen_vereine_text": _text_converter,
129 "sonstiges_1": _choice_converter,
130 "sonstiges_text": _text_converter,
131 "clique": _bool_converter,
132 "freundin": _bool_converter,
133 "parterin": _bool_converter,
134 "schule_2": _choice_converter,
135 "klassenstufe": _int_converter,
136 "klassenwiederholung": _choice_converter,
137 "abgang": _int_converter,
138 "nicht_anwesende_tage": _int_converter,
139 "unentschuldigte_tage": _int_converter,
140 "schulabschluss_1": _choice_converter,
141 "schulabschlusserwerbsland": _choice_converter,
142 "schulabschlusserwerbsland_sonstige_nennung": _text_converter,
143 "abschluss_betriebliche_ausbildung": _choice_converter,
144 "abschluss_im_ausbildungsberuf": _text_converter,
145 "ausbildungsdauer": _int_converter,
146 "wann_abgeschlossen": _date_converter,
147 "weitere_ausbildungen": _int_converter,
148 "weitere_ausbildungen_text": _text_converter,
149 "dauer_weitere_ausbildungen": _int_converter,
150 "abgebrochene_ausbildungen": _int_converter,
151 "abgebrochene_ausbildungen_text": _text_converter,
152 "abschluss_ausserbetriebliche_ausbildung": _choice_converter,
153 "abschluss_im_ausbildungsberuf_1": _text_converter,
154 "ausbildungsdauer_1": _int_converter,
155 "wann_abgeschlossen_1": _date_converter,
156 "weitere_ausbildungen_1": _int_converter,
157 "weitere_ausbildungen_text_1": _text_converter,
158 "dauer_weitere_ausbildungen_1": _int_converter,
159 "abgebrochene_ausbildungen_1": _int_converter,
160 "abgebrochene_ausbildungen_text_1": _text_converter,
161 "massnahmeteilnahme": _choice_converter,
162 "letzte_massnahme": _text_converter,
163 "finanzierung": _text_converter,
164 "austrittsdatum": _date_converter,
165 "dauer": _int_converter,
166 "weitere_massnahmen": _choice_converter,
167 "massnahme_1": _text_converter,
168 "massnahme1_finanzierung": _text_converter,
169 "massnahme_2": _text_converter,
170 "massnahme2_finanzierung": _text_converter,
171 "massnahme_3": _text_converter,
172 "massnahme3_finanzierung": _text_converter,
173 "abgebrochene_massnahmen": _int_converter,
174 "erwerbstaetigkeit_job": _choice_converter,
175 "letzte_taetigkeit": _text_converter,
176 "dauer_1": _int_converter,
177 "austrittsdatum_1": _date_converter,
178 "weitere_taetigkeiten": _int_converter,
179 "weitere_jobs_text": _text_converter,
180 "dauer_weitere_taetigkeiten": _int_converter,
181 "arbeitslosigkeit_1": _choice_converter,
182 "anzahl_arbeitslosigkeit": _int_converter,
183 "dauer_nach_letzter_beschaeftigung": _int_converter,
184 "dauer_insgesamt": _int_converter,
185 "wehrpflicht_zivildienst_freiwilligenjahr_1": _choice_converter,
186 "art_des_dienstes": _choice_converter,
187 "dauer_2": _int_converter,
188 "mutterschutz_erziehungsurlaub": _choice_converter,
189 "anzahl": _int_converter,
190 "dauer_letzter_erziehungsurlaub": _int_converter,
191 "dauer_insgesamt_1": _int_converter,
192 "kompetenzfeststellung": _choice_converter,
193 "zielsetzung": _choice_converter,
194 "begleitung": _choice_converter,
195 "welche_vermittlung_nennung": _text_converter,
196 "freie_dokumentation": _text_converter,
197 "bildender_bereich": _bool_converter,
198 "bereich_berufliche_qualifizierung": _bool_converter,
199 "bereich_berufsvorbereitung": _bool_converter,
200 "bereich_lebensbewaeltigung": _bool_converter,
201 "sonstiger_foerderbedarf": _bool_converter,
202 "sonstiger_foerderbedarf_nennung": _text_converter,
203 "foerderzeitraum_start": _date_converter,
204 "foerderzeitraum_ende": _date_converter,
205 "dokumentation_zum_foerderplan": _text_converter,
206 "anzahl_kontakte_termine": _int_converter,
207 "anzahl_der_stunden": _int_converter,
208 "zeitraum_fallmanagement": _int_converter,
209 "beendigung_5": _date_converter,
210 "art_beendigung": _choice_converter,
211 "abbruch_durch": _choice_converter,
212 "gruende_abbruch": _choice_converter,
213 "gruende_sonstiges_nennung_4": _text_converter,
214 "vermittlung": _choice_converter,
215 "vermittlung_nennung": _text_converter,
216 "veraenderungen_rechtskreis": _choice_converter,
217 "allgemein_bildender_schulabschluss": _choice_converter,
218 "allgemein_bildender_schulabschluss_sonstiges_nennung": _text_converter,
219 "massnahmeabschluss": _choice_converter,
220 "schulart": _choice_converter,
221 "schule_sonstiges_nennung": _text_converter,
222 "klassenstufe_1": _int_converter,
223 "ausbildung": _choice_converter,
224 "ausbildung_sonstiges_nennung": _text_converter,
225 "umschulung": _choice_converter,
226 "umschulung_nennung": _text_converter,
227 "arbeitstaetigkeit": _text_converter,
228 "erwerbstatus": _choice_converter,
229 "erwerbsstatus_sonstiges_nennung": _text_converter,
230 "beschaeftigungsumfang": _choice_converter,
231 "kategorien_nichterwerbsarbeit_nichtausbildung": _choice_converter,
232 "kategorien_sonstiges_nennung": _text_converter,
233 "zeitraum_nachbetreuung": _choice_converter,
234 "verbleib_nachbetreuung": _choice_converter,
235 "mitgliedschaft_organisationen_vereinen": _choice_converter,
236 "intensitaet_mitgliedschaft": _choice_converter,
237 "nutzung_kulturangeboten": _choice_converter,
238 "haeufigkeit": _choice_converter,
239 "soziales_engagement": _text_converter,
240 "unternehmungen_freunden": _choice_converter,
241 "unternehmungen_familie": _choice_converter,
242 "peergroup": _choice_converter,
243 "familie_1": _choice_converter,
244 "beziehung": _choice_converter,
245 "arbeit_schule": _choice_converter,
246 "bester_freund_freundin": _choice_converter,
247 "einschaetzung_zielerreichung": _choice_converter,
248 "erreichte_qualifikation": _choice_converter,
249 "integration_ist_nachhaltig": _choice_converter,
250 "selbststaendige_berufswegplanung": _choice_converter,
251 "eigenstaendige_lebensgestaltung": _choice_converter,
252 "soziale_bezugssysteme": _choice_converter,
253 "teilnahme_gesellschaftliches_leben": _choice_converter,
254 "freie_dokumentation_abschlussbewertung": _text_converter
255 },
256 'kompetenzfestellung': {
257 "verfahren_kompetenzfeststellung": _choice_converter,
258 "externeranbieter": _text_converter,
259 "assessment_center": _bool_converter,
260 "interview": _bool_converter,
261 "biografieorientierte_methoden": _bool_converter,
262 "selbsttest_selbstbeurteilung": _bool_converter,
263 "sonstiges_2": _bool_converter,
264 "artdesverfahrens_nennung_sonstiges": _text_converter,
265 "testverfahren": _bool_converter,
266 "intelligenztest": _bool_converter,
267 "intelligenztest_nennung": _text_converter,
268 "schultest": _bool_converter,
269 "schultest_nennung": _text_converter,
270 "leistungstest": _bool_converter,
271 "leistungstest_nennung": _text_converter,
272 "persoenlichkeitstest": _bool_converter,
273 "persoenlichkeitstest_nennung": _text_converter,
274 "einstellungs_interessentest": _bool_converter,
275 "einstellungs_interessentest_nennung": _text_converter,
276 "dauer_des_verfahrens": _choice_converter,
277 "rechenfaehigkeit": _choice_converter,
278 "raeumliches_vorstellungsvermoegen": _choice_converter,
279 "grundverstaendnis_naturwissenschaftlicher_zusammenhaenge": _choice_converter,
280 "logisches_denken": _choice_converter,
281 "wirtschaftliche_grundkenntnisse": _choice_converter,
282 "allgemeine_pc_kenntnisse": _choice_converter,
283 "spezielle_pc_kenntnisse_grafikbearbeitung_musikbearbeitung": _choice_converter,
284 "internet_anwendungen_und_e_mail_kenntnisse": _choice_converter,
285 "andere_medien": _choice_converter,
286 "hand_fingergeschick": _choice_converter,
287 "formauffassung": _choice_converter,
288 "umgang_maschinen_werkzeugen": _choice_converter,
289 "gestalterische_fantasie": _choice_converter,
290 "methoden_der_informationsgewinnung": _choice_converter,
291 "methoden_der_informationsverarbeitung": _choice_converter,
292 "einsatz_lern_und_arbeitstechniken": _choice_converter,
293 "problemloesungsorientierung": _choice_converter,
294 "texte_lesen_und_verstehen": _choice_converter,
295 "texte_schreiben_und_formulieren": _choice_converter,
296 "deutsche_sprache": _choice_converter,
297 "sprache1": _choice_converter,
298 "sprache1_sonstige_nennung": _text_converter,
299 "beherrschung_sprache1": _choice_converter,
300 "sprache2": _choice_converter,
301 "sprache2_sonstige_nennung": _text_converter,
302 "beherrschung_sprache2": _choice_converter,
303 "sprache3": _choice_converter,
304 "sprache3_sonstige_nennung": _text_converter,
305 "beherrschung_sprache3": _choice_converter,
306 "kommunikationsfaehigkeit": _choice_converter,
307 "kritikfaehigkeit": _choice_converter,
308 "konfliktfaehigkeit": _choice_converter,
309 "kreativitaet": _choice_converter,
310 "team_und_kooperationsfaehigkeit": _choice_converter,
311 "solidarisches_verhalten": _choice_converter,
312 "selbstaendiges_lernen_arbeiten": _choice_converter,
313 "selbstreflexion_selbsteinschaetzung": _choice_converter,
314 "verantwortungsuebernahme": _choice_converter,
315 "zielorientierung": _choice_converter,
316 "zuverlaessigkeit": _choice_converter,
317 "altersgerechter_entwicklungsstand": _choice_converter,
318 "gesundheitliche_voraussetzungen": _choice_converter,
319 "konzentration": _choice_converter,
320 "ausdauer": _choice_converter,
321 "durchhaltevermoegen": _choice_converter,
322 "merkfaehigkeit": _choice_converter,
323 "bearbeitungsgeschwindigkeit": _choice_converter,
324 "befaehigung_zu_daueraufmerksamkeit": _choice_converter,
325 "leistungsbereitschaft": _choice_converter,
326 "sorgfalt": _choice_converter,
327 "umgangsformen": _choice_converter,
328 "dokumentation_kompetenzfeststellung": _text_converter
329 },
330 'angebote_bildenden_bereich': {
331 "angebotsform": _choice_converter,
332 "art_der_unterstuetzung": _text_converter,
333 "durchfuehrende_institution": _text_converter,
334 "unterstuetzung_start": _date_converter,
335 "unterstuetzung_ende": _date_converter,
336 "zeitlicher_umfang_unterstuetzung": _int_converter,
337 "beendigung_1": _choice_converter,
338 "beendigung_durch": _choice_converter,
339 "gruende_vorzeitige_beendigung": _choice_converter,
340 "gruende_sonstiges_nennung": _text_converter,
341 "nachweis_bescheinigung": _choice_converter,
342 "sonstiges_nachweis_bescheinigung": _text_converter
343 },
344 'angebote_berufsvorbereitung': {
345 "angebotsform_1": _choice_converter,
346 "art_der_unterstuetzung_1": _choice_converter,
347 "unterstuetzung_sonstiges_nennung": _text_converter,
348 "durchfuehrende_institution_1": _text_converter,
349 "unterstuetzung_start_1": _date_converter,
350 "unterstuetzung_ende_1": _date_converter,
351 "zeitlicher_umfang_unterstuetzung_1": _int_converter,
352 "beendigung_2": _choice_converter,
353 "beendigung_durch_1": _choice_converter,
354 "gruende_vorzeitige_beendigung_1": _choice_converter,
355 "gruende_sonstiges_nennung_1": _text_converter,
356 "nachweis_bescheinigung_1": _choice_converter,
357 "sonstiges_nachweis_bescheinigung_1": _text_converter
358 },
359 'angebote_berufliche_qualifizierung': {
360 "angebotsform_2": _choice_converter,
361 "angebote_im_bereich": _choice_converter,
362 "unterstuetzung_sonstiges_nennung_1": _text_converter,
363 "durchfuehrende_institution_2": _text_converter,
364 "unterstuetzung_start_2": _date_converter,
365 "unterstuetzung_ende_2": _date_converter,
366 "zeitlicher_umfang_unterstuetzung_2": _int_converter,
367 "beendigung_3": _choice_converter,
368 "beendigung_durch_2": _choice_converter,
369 "gruende_vorzeitige_beendigung_2": _choice_converter,
370 "gruende_sonstiges_nennung_2": _text_converter,
371 "nachweis_bescheinigung_2": _choice_converter,
372 "sonstiges_nachweis_bescheinigung_2": _text_converter
373 },
374 'angebote_lebensbewaeltigung': {
375 "angebotsform_3": _choice_converter,
376 "unterstuetzung_angebotsform_sonstiges_nennung": _text_converter,
377 "art_der_unterstuetzung_2": _choice_converter,
378 "unterstuetzung_sonstiges_nennung_2": _text_converter,
379 "durchfuehrende_institution_3": _text_converter,
380 "unterstuetzung_start_3": _date_converter,
381 "unterstuetzung_ende_3": _date_converter,
382 "zeitlicher_umfang_unterstuetzung_3": _int_converter,
383 "beendigung_4": _choice_converter,
384 "beendigung_durch_3": _choice_converter,
385 "gruende_vorzeitige_beendigung_3": _choice_converter,
386 "gruende_sonstiges_nennung_3": _text_converter,
387 "nachweis_bescheinigung_3": _choice_converter,
388 "sonstiges_nachweis_bescheinigung_3": _text_converter
389 }
390 }
391
392 CREATE_FUNCTIONS = {
393 'kompetenzfestellung': 'create_rg_kompetenz_ds',
394 'angebote_bildenden_bereich': 'create_rg_bilden_ds',
395 'angebote_berufsvorbereitung': 'create_rg_beruf_ds',
396 'angebote_berufliche_qualifizierung': 'create_rg_quali_ds',
397 'angebote_lebensbewaeltigung': 'create_rg_leben_ds'
398 }
399
400 EXPECT_CASES = 0
401 EXPECT_CASE = 1
402 EXPECT_RELATION = 2
403 EXPECT_FIELD = 3
404 EXPECT_CHARS = 4
405
406 SQL_UPATE = """UPDATE %s_tbl_view SET %s WHERE uuid_id = %%(uuid_id)s"""
407
408 SQL_GET_MASTER_ID = \
409 """SELECT get_masterid_from_uuid(%(relation_name)s, %(uuid)s)"""
410
411 SQL_CREATE_MASTER_DS = \
412 """SELECT create_master_ds(%(uuid)s)"""
413
414 SQL_SELECT_UUID_FROM_RELATION = \
415 """SELECT uuid_id FROM %s_tbl_view WHERE id = %%(id)s"""
416
417 SQL_CREATE_REPEAT_GROUP = \
418 """SELECT %s(%%(master_id)s, %%(uuid)s)"""
419
420 def get_id_for_uuid(cur, relation_name, uuid):
421 cur.execute(SQL_GET_MASTER_ID, {
422 'relation_name': relation_name, 'uuid': uuid })
423 row = cur.next()
424 if not row: return None
425 return row[0]
426
427 def create_master(cur, uuid=None):
428 cur.execute(SQL_CREATE_MASTER_DS, { 'uuid': uuid })
429 print cur.query
430 row = cur.next()
431 if not row: return None
432 return row[0]
433
434 def create_repeat_group(cur, relation_name, master_id, uuid=None):
435 relation_name = CREATE_FUNCTIONS.get(relation_name)
436 if relation_name is None: return None
437 sql = SQL_CREATE_REPEAT_GROUP % relation_name
438 cur.execute(sql, { 'master_id': master_id, 'uuid': uuid })
439 row = cur.next()
440 if not row: return None
441 return row[0]
442
443 def get_uuid(cur, relation_name, ds_id):
444 sql = SQL_SELECT_UUID_FROM_RELATION % relation_name
445 cur.execute(sql, { 'id': ds_id })
446 row = cur.next()
447 if not row: return None
448 return row[0]
449
450 class Case:
451 def __init__(self):
452 self.relations = []
453
454 def append(self, relation):
455 self.relations.append(relation)
456
457 def find_relations(self, relation_name):
458 return [relation for relation in self.relations
459 if relation.name == relation_name]
460
461 class Relation:
462
463 def __init__(self, name, items):
464 self.name = name
465 self.items = items
466 self.uuid = None
467 self.fields = []
468 self.already = False
469
470 def append(self, field):
471 self.fields.append(field)
472
473 def find_field(self, field_name):
474 for k, v in self.fields:
475 if k == field_name:
476 return v
477 return None
478
479 def set_field(self, field_name, value):
480 for i in xrange(len(self.fields)):
481 field = self.fields[i]
482 if field[0] == field_name:
483 field[1] = value
484 return
485 self.fields.append((field_name, value))
486
487 def update(self, cur):
488 if self.uuid is None:
489 raise StandardError("UUID is not defined")
490 sets = []
491 values = {}
492 for k, v in self.fields:
493 sets.append("%s = %%(%s)s" % (k, k))
494 values[k] = v
495
496 values['uuid_id'] = self.uuid
497
498 if self.name != 'master': rel = "rg_%s" % self.name
499 else: rel = "master"
500
501 sql = SQL_UPATE % (rel, ", ".join(sets))
502 cur.execute(sql, values)
503
504
505 class XMLHandler(DefaultHandler):
506
507 def __init__(self, case_store):
508 DefaultHandler.__init__(self)
509 self.mode = EXPECT_CASES
510 self.ignore = 0
511 self.relation = None
512 self.chars = None
513 self.case_store = case_store
514 self.case = None
515
516 def startElement(self, name, attrs):
517 if self.mode == EXPECT_CASES:
518 if name != "cases":
519 print >> sys.stderr, "ignore %s" % name
520 self.ignore += 1
521 else:
522 self.mode = EXPECT_CASE
523
524 elif self.mode == EXPECT_CASE:
525 if name != "case":
526 print >> sys.stderr, "ignore %s" % name
527 self.ignore += 1
528 else:
529 self.case = Case()
530 self.mode = EXPECT_RELATION
531
532 elif self.mode == EXPECT_RELATION:
533 rel = RELATIONS.get(name)
534 if rel is None:
535 print >> sys.stderr, "relation '%s' not found" % name
536 self.ignore += 1
537 else:
538 #print >> sys.stderr, "relation '%s' found" % name
539 self.relation = Relation(name, rel)
540 self.mode = EXPECT_FIELD
541
542 elif self.mode == EXPECT_FIELD:
543 self.mode = EXPECT_CHARS
544 self.chars = ""
545
546 elif self.mode == EXPECT_CHARS:
547 self.ignore += 1
548
549 def endElement(self, name):
550 if self.ignore > 0:
551 self.ignore -= 1
552 return
553
554 if self.mode == EXPECT_CHARS:
555 if name != "uuid_id":
556 converter = self.relation.items.get(name)
557 if converter is None:
558 print >> sys.stderr, "missing converter for %s" % name
559 else:
560 if not self.chars:
561 self.relation.append([name, None])
562 else:
563 #print >> sys.stderr, "convert %s" % name
564 self.relation.append([name, converter(self.chars)])
565 else:
566 self.relation.uuid = self.chars.strip()
567 #print >> sys.stderr, "uuid: %s" % self.relation.uuid
568
569 self.mode = EXPECT_FIELD
570 self.chars = None
571
572 if self.mode == EXPECT_FIELD:
573 if self.relation and self.relation.name == name:
574 self.case.append(self.relation)
575 self.relation = None
576 self.mode = EXPECT_RELATION
577 else:
578 pass
579
580 elif self.mode == EXPECT_RELATION:
581 if name == "case":
582 self.case_store.store(self.case)
583 self.case = None
584 self.mode = EXPECT_CASE
585
586 elif self.mode == EXPECT_CASE:
587 if name == "cases":
588 self.mode = EXPECT_CASES
589
590 def characters(self, content):
591 if self.mode == EXPECT_CHARS:
592 self.chars += content
593
594 class CaseStore:
595
596 def __init__(self, con, cur, fkz):
597 self.con = con
598 self.cur = cur
599 self.fkz = fkz
600
601 def store(self, case):
602 success = False
603
604 master_new = False
605 kompetenz_new = 0
606 master_id = None
607 cur = self.cur
608
609 try:
610 for relation in case.relations:
611 if relation.already:
612 # do not process a already processed one
613 # this may happen if a master relation
614 # is behind the repeat groups
615 continue
616 relation.already = True
617
618 uuid = relation.uuid
619 if uuid:
620 # we have a uuid. find out if we have this entry already in our
621 # database
622 master_id = get_id_for_uuid(cur, relation.name, uuid)
623 if master_id is None:
624 # has no master_id -> new entry
625 if relation.name == 'master':
626 # force in fkz
627 if self.fkz:
628 relation.set_field('fkz', self.fkz)
629 # create new
630 master_id = create_master(cur, uuid)
631 master_new = True
632 relation.uuid = get_uuid(cur, 'master', master_id)
633 else:
634 # its a repeat group
635 # new repeat groups need master id
636 if master_id is None:
637 # no master yet
638 masters = case.find_relations('master')
639 if masters is None:
640 # no masters -> create new
641 master_id = create_master(cur)
642 master_new = True
643 # TODO: force in fkz
644 else:
645 # have a least one master
646 master = masters[0]
647 uuid = master.uuid
648 if uuid is None:
649 # master needs to be created
650 master_id = create_master(cur)
651 master.uuid = get_uuid(cur, 'master', master_id)
652 master_new = True
653 # TODO: force in fkz
654 else:
655 # have uuid try to find it
656 master_id = get_id_for_uuid(cur, 'master', uuid)
657 if master_id is None:
658 # -> create new
659 master_id = create_master(cur, uuid)
660 master_new = True
661 # update the master
662 master.update(cur)
663 master.already = True # mark as already processed
664 # now we have a master
665 uuid = relation.uuid
666 if uuid is None:
667 # need to create new repeat group
668 relation_id = create_repeat_group(cur, relation.name, master_id)
669 uuid = get_id_for_uuid(cur, relation.name, relation_id)
670 relation.uuid = uuid
671 if relation.name == 'kompetenzfeststellung': kompetenz_new += 1
672 else:
673 # have uuid for repeat group, try to fetch id
674 relation_id = get_id_for_uuid(cur, relation.name, uuid)
675 if relation_id is None:
676 # create new one
677 relation_id = create_repeat_group(cur, relation.name, master_id, uuid)
678 if relation.name == 'kompetenzfeststellung': kompetenz_new += 1
679 else:
680 print >> sys.stderr, "Hier ist doof: %s" % relation.name
681 relation.update(cur)
682
683 if master_new and kompetenz_new == 0:
684 # create at least one kompetenzfeststellung if there is a new master
685 create_repeat_group(cur, 'kompetenzfeststellung', master_id)
686
687 success = True
688 self.con.commit()
689
690 finally:
691 if not success:
692 print >> sys.stderr, "Alles fuer die Katz"
693 self.con.rollback()
694
695 def main():
696 try:
697 opts, args = getopt.getopt(sys.argv[1:], "d:p:h:u:f:w:", (
698 "database=",
699 "port=",
700 "host=",
701 "user=",
702 "fkz=",
703 "password="))
704 except getopt.GetoptError, err:
705 sys.stderr.write("error: %s\n" % str(err))
706 sys.exit(1)
707
708 DBNAME = "ka_inte00002_db"
709 HOST = "localhost"
710 PORT = 5432
711 USER = "postgres"
712 FKZ = None
713 PASSWORD = ""
714
715 for o, a in opts:
716 if o in ("d", "-d", "--database"):
717 DBNAME = a
718 elif o in ("p", "-p", "--port"):
719 PORT = int(a)
720 elif o in ("h", "-h", "--host"):
721 HOST = a
722 elif o in ("u", "-u", "--user"):
723 USER = a
724 elif o in ("f", "-f", "--fkz"):
725 FKZ = a
726 elif o in ("w", "-w", "--password"):
727 PASSWORD = a
728
729 con, cur = None, None
730 try:
731 con = dbapi.connect(
732 database = DBNAME,
733 port = PORT,
734 #host = HOST,
735 user = USER)
736 #password = PASSWORD)
737
738 cur = con.cursor()
739 #cur.execute("SET ROLE ka_inte00002_waskaservice")
740 cur.execute("SELECT getuserid()")
741 row = cur.next()
742 print >> sys.stderr, "uid: %s" % repr(row)
743 case_store = CaseStore(con, cur, FKZ)
744
745 handler = XMLHandler(case_store)
746 parse(sys.stdin, handler)
747 finally:
748 if cur:
749 try: cur.close()
750 except: pass
751 if con:
752 try: con.close()
753 except: pass
754
755 if __name__ == '__main__':
756 main()
757
758 # vim:set ts=4 sw=4 si et sta sts=4:

Properties

Name Value
svn:executable *

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26