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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 245 - (hide annotations)
Wed Feb 27 13:46:00 2008 UTC (17 years ago) by teichmann
File MIME type: text/x-python
File size: 29164 byte(s)
XML import: fixed bug in date conversion.

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 teichmann 245 return date(*[int(x) for x in s.split("-")])
24 teichmann 233
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 torsten 243 print cur.query
430 teichmann 240 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 244 def find_first_relation(self, relation_name):
458     for relation in self.relations:
459     if relation.name == relation_name:
460     return relation
461     return None
462 teichmann 234
463 teichmann 233 class Relation:
464    
465 teichmann 244 def __init__(self, name, items = None):
466 teichmann 240 self.name = name
467 teichmann 244 if items is None: self.items = []
468     else: self.items = items
469 teichmann 240 self.uuid = None
470     self.fields = []
471 teichmann 233
472     def append(self, field):
473     self.fields.append(field)
474    
475 teichmann 240 def find_field(self, field_name):
476     for k, v in self.fields:
477     if k == field_name:
478     return v
479     return None
480    
481 teichmann 242 def set_field(self, field_name, value):
482     for i in xrange(len(self.fields)):
483     field = self.fields[i]
484     if field[0] == field_name:
485     field[1] = value
486     return
487     self.fields.append((field_name, value))
488    
489 teichmann 240 def update(self, cur):
490 teichmann 242 if self.uuid is None:
491     raise StandardError("UUID is not defined")
492 teichmann 234 sets = []
493     values = {}
494     for k, v in self.fields:
495     sets.append("%s = %%(%s)s" % (k, k))
496     values[k] = v
497    
498     values['uuid_id'] = self.uuid
499    
500 teichmann 242 if self.name != 'master': rel = "rg_%s" % self.name
501     else: rel = "master"
502    
503     sql = SQL_UPATE % (rel, ", ".join(sets))
504 teichmann 240 cur.execute(sql, values)
505 teichmann 234
506    
507 teichmann 233 class XMLHandler(DefaultHandler):
508    
509     def __init__(self, case_store):
510     DefaultHandler.__init__(self)
511     self.mode = EXPECT_CASES
512     self.ignore = 0
513     self.relation = None
514     self.chars = None
515     self.case_store = case_store
516     self.case = None
517    
518     def startElement(self, name, attrs):
519     if self.mode == EXPECT_CASES:
520     if name != "cases":
521     print >> sys.stderr, "ignore %s" % name
522     self.ignore += 1
523     else:
524     self.mode = EXPECT_CASE
525    
526     elif self.mode == EXPECT_CASE:
527     if name != "case":
528     print >> sys.stderr, "ignore %s" % name
529     self.ignore += 1
530     else:
531     self.case = Case()
532     self.mode = EXPECT_RELATION
533    
534     elif self.mode == EXPECT_RELATION:
535     rel = RELATIONS.get(name)
536     if rel is None:
537     print >> sys.stderr, "relation '%s' not found" % name
538     self.ignore += 1
539     else:
540     #print >> sys.stderr, "relation '%s' found" % name
541     self.relation = Relation(name, rel)
542     self.mode = EXPECT_FIELD
543    
544     elif self.mode == EXPECT_FIELD:
545     self.mode = EXPECT_CHARS
546     self.chars = ""
547    
548     elif self.mode == EXPECT_CHARS:
549     self.ignore += 1
550    
551     def endElement(self, name):
552     if self.ignore > 0:
553     self.ignore -= 1
554     return
555    
556     if self.mode == EXPECT_CHARS:
557     if name != "uuid_id":
558     converter = self.relation.items.get(name)
559     if converter is None:
560     print >> sys.stderr, "missing converter for %s" % name
561     else:
562     if not self.chars:
563 teichmann 242 self.relation.append([name, None])
564 teichmann 233 else:
565     #print >> sys.stderr, "convert %s" % name
566 teichmann 242 self.relation.append([name, converter(self.chars)])
567 teichmann 233 else:
568     self.relation.uuid = self.chars.strip()
569     #print >> sys.stderr, "uuid: %s" % self.relation.uuid
570    
571     self.mode = EXPECT_FIELD
572     self.chars = None
573    
574     if self.mode == EXPECT_FIELD:
575     if self.relation and self.relation.name == name:
576     self.case.append(self.relation)
577     self.relation = None
578     self.mode = EXPECT_RELATION
579     else:
580     pass
581    
582     elif self.mode == EXPECT_RELATION:
583     if name == "case":
584     self.case_store.store(self.case)
585     self.case = None
586     self.mode = EXPECT_CASE
587    
588     elif self.mode == EXPECT_CASE:
589     if name == "cases":
590     self.mode = EXPECT_CASES
591    
592     def characters(self, content):
593     if self.mode == EXPECT_CHARS:
594     self.chars += content
595    
596     class CaseStore:
597    
598 teichmann 241 def __init__(self, con, cur, fkz):
599 teichmann 240 self.con = con
600     self.cur = cur
601 teichmann 241 self.fkz = fkz
602 teichmann 233
603     def store(self, case):
604    
605 teichmann 244 success = False
606 teichmann 240 master_new = False
607 teichmann 244 kompetenz_new = False
608 teichmann 240 master_id = None
609 teichmann 244 cur = self.cur
610 teichmann 240
611     try:
612 teichmann 244 # find master
613     master = case.find_first_relation('master')
614    
615     if master is None:
616     # need to create one
617     master_id = create_master(cur)
618     master_new = True
619     if self.fkz:
620     master = Relation('master')
621     master.uuid = get_uuid(cur, 'master', master_id)
622     master.append(['fkz', self.fkz])
623     master.update(cur)
624     else:
625     # we have a master
626     if master.uuid is None:
627     # need to create new one
628     master_id = create_master(cur)
629     master_new = True
630     master.uuid = get_uuid(cur, 'master', master_id)
631     if self.fkz:
632     master.set_field('fkz', self.fkz)
633     else:
634     # we have a uuid
635     master_id = get_id_for_uuid(cur, 'master', master.uuid)
636     if master_id is None:
637     # does not exist -> create new
638     master_id = create_master(cur, master.uuid)
639     master_new = True
640     if self.fkz:
641     master.set_field('fkz', self.fkz)
642     # update the master
643     master.update(cur)
644    
645     # now handle the repeat groups
646 teichmann 240 for relation in case.relations:
647 teichmann 244 if relation.name == 'master':
648     # masters are already handled
649 teichmann 240 continue
650    
651 teichmann 244 if relation.uuid is None:
652     # need to create new
653     relation_id = create_repeat_group(cur, relation.name, master_id)
654     relation.uuid = get_uuid(cur, relation.name, relation_id)
655     if relation.name == 'kompetenzfeststellung':
656     kompetenz_new = True
657     else:
658     # we have a UUID. find out if we have this entry already in our database
659     m_id = get_id_for_uuid(cur, relation.name, relation.uuid)
660     if not m_id is None and m_id != master_id:
661     # exists but not the right master -> ignore
662     continue
663    
664     if m_id is None:
665 teichmann 242 # create new
666 teichmann 244 relation_id = create_repeat_group(cur, relation.name, master_id, relation.uuid)
667     if relation.name == 'kompetenzfeststellung':
668     kompetenz_new = True
669    
670     # update the relation
671 teichmann 240 relation.update(cur)
672    
673 teichmann 244 if master_new and kompetenz_new:
674 teichmann 240 # 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 teichmann 242 #host = HOST,
724     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