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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 240 - (hide annotations)
Tue Feb 26 14:14:15 2008 UTC (17 years ago) by teichmann
File MIME type: text/x-python
File size: 29153 byte(s)
XML import: implementes logic to create/update cases.


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