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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 242 - (hide annotations)
Wed Feb 27 07:13:31 2008 UTC (17 years ago) by teichmann
File MIME type: text/x-python
File size: 30345 byte(s)
Various bug fixes for XML import of anonymous cases.

1 teichmann 242 #!/usr/bin/python
2 teichmann 233 # -*- coding: utf-8 -*-
3     # (c) 2008 by Intevation GmbH
4     # author: Sascha L. Teichmann
5     #
6 teichmann 240 import sys
7 teichmann 233 from datetime import date
8    
9 teichmann 241 import getopt
10    
11 teichmann 233 from xml.sax.saxutils import DefaultHandler
12     from xml.sax import parse
13    
14 teichmann 240 import psycopg2 as dbapi
15 teichmann 233
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 teichmann 240 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 teichmann 233 EXPECT_CASES = 0
401     EXPECT_CASE = 1
402     EXPECT_RELATION = 2
403     EXPECT_FIELD = 3
404     EXPECT_CHARS = 4
405    
406 teichmann 234 SQL_UPATE = """UPDATE %s_tbl_view SET %s WHERE uuid_id = %%(uuid_id)s"""
407    
408 teichmann 240 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 teichmann 242 def get_id_for_uuid(cur, relation_name, uuid):
421 teichmann 240 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     row = cur.next()
430     if not row: return None
431     return row[0]
432    
433     def create_repeat_group(cur, relation_name, master_id, uuid=None):
434     relation_name = CREATE_FUNCTIONS.get(relation_name)
435     if relation_name is None: return None
436     sql = SQL_CREATE_REPEAT_GROUP % relation_name
437     cur.execute(sql, { 'master_id': master_id, 'uuid': uuid })
438     row = cur.next()
439     if not row: return None
440     return row[0]
441    
442     def get_uuid(cur, relation_name, ds_id):
443     sql = SQL_SELECT_UUID_FROM_RELATION % relation_name
444     cur.execute(sql, { 'id': ds_id })
445     row = cur.next()
446     if not row: return None
447     return row[0]
448    
449 teichmann 233 class Case:
450     def __init__(self):
451     self.relations = []
452    
453     def append(self, relation):
454     self.relations.append(relation)
455    
456 teichmann 240 def find_relations(self, relation_name):
457     return [relation for relation in self.relations
458     if relation.name == relation_name]
459 teichmann 234
460 teichmann 233 class Relation:
461    
462     def __init__(self, name, items):
463 teichmann 240 self.name = name
464     self.items = items
465     self.uuid = None
466     self.fields = []
467     self.already = False
468 teichmann 233
469     def append(self, field):
470     self.fields.append(field)
471    
472 teichmann 240 def find_field(self, field_name):
473     for k, v in self.fields:
474     if k == field_name:
475     return v
476     return None
477    
478 teichmann 242 def set_field(self, field_name, value):
479     for i in xrange(len(self.fields)):
480     field = self.fields[i]
481     if field[0] == field_name:
482     field[1] = value
483     return
484     self.fields.append((field_name, value))
485    
486 teichmann 240 def update(self, cur):
487 teichmann 242 if self.uuid is None:
488     raise StandardError("UUID is not defined")
489 teichmann 234 sets = []
490     values = {}
491     for k, v in self.fields:
492     sets.append("%s = %%(%s)s" % (k, k))
493     values[k] = v
494    
495     values['uuid_id'] = self.uuid
496    
497 teichmann 242 if self.name != 'master': rel = "rg_%s" % self.name
498     else: rel = "master"
499    
500     sql = SQL_UPATE % (rel, ", ".join(sets))
501 teichmann 240 cur.execute(sql, values)
502 teichmann 234
503    
504 teichmann 233 class XMLHandler(DefaultHandler):
505    
506     def __init__(self, case_store):
507     DefaultHandler.__init__(self)
508     self.mode = EXPECT_CASES
509     self.ignore = 0
510     self.relation = None
511     self.chars = None
512     self.case_store = case_store
513     self.case = None
514    
515     def startElement(self, name, attrs):
516     if self.mode == EXPECT_CASES:
517     if name != "cases":
518     print >> sys.stderr, "ignore %s" % name
519     self.ignore += 1
520     else:
521     self.mode = EXPECT_CASE
522    
523     elif self.mode == EXPECT_CASE:
524     if name != "case":
525     print >> sys.stderr, "ignore %s" % name
526     self.ignore += 1
527     else:
528     self.case = Case()
529     self.mode = EXPECT_RELATION
530    
531     elif self.mode == EXPECT_RELATION:
532     rel = RELATIONS.get(name)
533     if rel is None:
534     print >> sys.stderr, "relation '%s' not found" % name
535     self.ignore += 1
536     else:
537     #print >> sys.stderr, "relation '%s' found" % name
538     self.relation = Relation(name, rel)
539     self.mode = EXPECT_FIELD
540    
541     elif self.mode == EXPECT_FIELD:
542     self.mode = EXPECT_CHARS
543     self.chars = ""
544    
545     elif self.mode == EXPECT_CHARS:
546     self.ignore += 1
547    
548     def endElement(self, name):
549     if self.ignore > 0:
550     self.ignore -= 1
551     return
552    
553     if self.mode == EXPECT_CHARS:
554     if name != "uuid_id":
555     converter = self.relation.items.get(name)
556     if converter is None:
557     print >> sys.stderr, "missing converter for %s" % name
558     else:
559     if not self.chars:
560 teichmann 242 self.relation.append([name, None])
561 teichmann 233 else:
562     #print >> sys.stderr, "convert %s" % name
563 teichmann 242 self.relation.append([name, converter(self.chars)])
564 teichmann 233 else:
565     self.relation.uuid = self.chars.strip()
566     #print >> sys.stderr, "uuid: %s" % self.relation.uuid
567    
568     self.mode = EXPECT_FIELD
569     self.chars = None
570    
571     if self.mode == EXPECT_FIELD:
572     if self.relation and self.relation.name == name:
573     self.case.append(self.relation)
574     self.relation = None
575     self.mode = EXPECT_RELATION
576     else:
577     pass
578    
579     elif self.mode == EXPECT_RELATION:
580     if name == "case":
581     self.case_store.store(self.case)
582     self.case = None
583     self.mode = EXPECT_CASE
584    
585     elif self.mode == EXPECT_CASE:
586     if name == "cases":
587     self.mode = EXPECT_CASES
588    
589     def characters(self, content):
590     if self.mode == EXPECT_CHARS:
591     self.chars += content
592    
593     class CaseStore:
594    
595 teichmann 241 def __init__(self, con, cur, fkz):
596 teichmann 240 self.con = con
597     self.cur = cur
598 teichmann 241 self.fkz = fkz
599 teichmann 233
600     def store(self, case):
601 teichmann 240 success = False
602 teichmann 233
603 teichmann 240 master_new = False
604     kompetenz_new = 0
605     master_id = None
606 teichmann 242 cur = self.cur
607 teichmann 240
608     try:
609     for relation in case.relations:
610     if relation.already:
611     # do not process a already processed one
612     # this may happen if a master relation
613     # is behind the repeat groups
614     continue
615     relation.already = True
616    
617 teichmann 242 uuid = relation.uuid
618 teichmann 240 if uuid is None:
619     # has no UUID -> new entry
620     if relation.name == 'master':
621 teichmann 241 # force in fkz
622 teichmann 242 if self.fkz:
623     relation.set_field('fkz', self.fkz)
624 teichmann 240 # new master
625     if master_id:
626     # already have a master -> ignore
627     continue
628 teichmann 242 # create new
629     master_id = create_master(cur)
630     master_new = True
631     relation.uuid = get_uuid(cur, 'master', master_id)
632 teichmann 240 else:
633     # its a repeat group
634     # new repeat groups need master id
635     if master_id is None:
636     # no master yet
637     masters = case.find_relations('master')
638     if masters is None:
639     # no masters -> create new
640     master_id = create_master(cur)
641     master_new = True
642 teichmann 242 # TODO: force in fkz
643 teichmann 240 else:
644     # have a least one master
645     master = masters[0]
646 teichmann 242 uuid = master.uuid
647 teichmann 240 if uuid is None:
648     # master needs to be created
649     master_id = create_master(cur)
650 teichmann 242 master.uuid = get_uuid(cur, 'master', master_id)
651 teichmann 240 master_new = True
652 teichmann 242 # TODO: force in fkz
653 teichmann 240 else:
654     # have uuid try to find it
655 teichmann 242 master_id = get_id_for_uuid(cur, 'master', uuid)
656 teichmann 240 if master_id is None:
657     # -> create new
658     master_id = create_master(cur, uuid)
659     master_new = True
660     # update the master
661     master.update(cur)
662     master.already = True # mark as already processed
663     # now we have a master
664 teichmann 242 uuid = relation.uuid
665 teichmann 240 if uuid is None:
666     # need to create new repeat group
667 teichmann 242 relation_id = create_repeat_group(cur, relation.name, master_id)
668     uuid = get_id_for_uuid(cur, relation.name, relation_id)
669     relation.uuid = uuid
670     if relation.name == 'kompetenzfeststellung': kompetenz_new += 1
671 teichmann 240 else:
672     # have uuid for repeat group, try to fetch id
673 teichmann 242 relation_id = get_id_for_uuid(cur, relation.name, uuid)
674 teichmann 240 if relation_id is None:
675     # create new one
676     relation_id = create_repeat_group(cur, relation.name, master_id, uuid)
677     if relation.name == 'kompetenzfeststellung': kompetenz_new += 1
678     relation.update(cur)
679    
680     if master_new and kompetenz_new == 0:
681     # create at least one kompetenzfeststellung if there is a new master
682     create_repeat_group(cur, 'kompetenzfeststellung', master_id)
683    
684     success = True
685     self.con.commit()
686    
687     finally:
688     if not success:
689     self.con.rollback()
690    
691 teichmann 233 def main():
692 teichmann 241 try:
693     opts, args = getopt.getopt(sys.argv[1:], "d:p:h:u:f:w:", (
694     "database=",
695     "port=",
696     "host=",
697     "user=",
698     "fkz=",
699     "password="))
700     except getopt.GetoptError, err:
701     sys.stderr.write("error: %s\n" % str(err))
702     sys.exit(1)
703    
704     DBNAME = "ka_inte00002_db"
705     HOST = "localhost"
706     PORT = 5432
707     USER = "postgres"
708     FKZ = None
709     PASSWORD = ""
710    
711     for o, a in opts:
712     if o in ("d", "-d", "--database"):
713     DBNAME = a
714     elif o in ("p", "-p", "--port"):
715     PORT = int(a)
716     elif o in ("h", "-h", "--host"):
717     HOST = a
718     elif o in ("u", "-u", "--user"):
719     USER = a
720     elif o in ("f", "-f", "--fkz"):
721     FKZ = a
722     elif o in ("w", "-w", "--password"):
723     PASSWORD = a
724    
725 teichmann 240 con, cur = None, None
726     try:
727     con = dbapi.connect(
728     database = DBNAME,
729     port = PORT,
730 teichmann 242 #host = HOST,
731     user = USER)
732     #password = PASSWORD)
733 teichmann 233
734 teichmann 240 cur = con.cursor()
735 teichmann 242 #cur.execute("SET ROLE ka_inte00002_waskaservice")
736     cur.execute("SELECT getuserid()")
737     row = cur.next()
738     print >> sys.stderr, "uid: %s" % repr(row)
739 teichmann 241 case_store = CaseStore(con, cur, FKZ)
740 teichmann 240
741     handler = XMLHandler(case_store)
742     parse(sys.stdin, handler)
743     finally:
744     if cur:
745     try: cur.close()
746     except: pass
747     if con:
748     try: con.close()
749     except: pass
750    
751 teichmann 233 if __name__ == '__main__':
752     main()
753    
754     # 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