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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 241 - (hide annotations)
Tue Feb 26 15:38:42 2008 UTC (17 years ago) by teichmann
File MIME type: text/x-python
File size: 30174 byte(s)
XML import added support for getopt and fkz imforcement.

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