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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 257 - (hide annotations)
Wed Mar 12 15:10:10 2008 UTC (16 years, 11 months ago) by torsten
File MIME type: text/x-python
File size: 29145 byte(s)
Updated import.cron

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     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 244 def find_first_relation(self, relation_name):
457     for relation in self.relations:
458     if relation.name == relation_name:
459     return relation
460     return None
461 teichmann 234
462 teichmann 233 class Relation:
463    
464 teichmann 244 def __init__(self, name, items = None):
465 teichmann 240 self.name = name
466 teichmann 244 if items is None: self.items = []
467     else: self.items = items
468 teichmann 240 self.uuid = None
469     self.fields = []
470 teichmann 233
471     def append(self, field):
472     self.fields.append(field)
473    
474 teichmann 240 def find_field(self, field_name):
475     for k, v in self.fields:
476     if k == field_name:
477     return v
478     return None
479    
480 teichmann 242 def set_field(self, field_name, value):
481     for i in xrange(len(self.fields)):
482     field = self.fields[i]
483     if field[0] == field_name:
484     field[1] = value
485     return
486     self.fields.append((field_name, value))
487    
488 teichmann 240 def update(self, cur):
489 teichmann 242 if self.uuid is None:
490     raise StandardError("UUID is not defined")
491 teichmann 234 sets = []
492     values = {}
493     for k, v in self.fields:
494     sets.append("%s = %%(%s)s" % (k, k))
495     values[k] = v
496    
497     values['uuid_id'] = self.uuid
498    
499 teichmann 242 if self.name != 'master': rel = "rg_%s" % self.name
500     else: rel = "master"
501    
502     sql = SQL_UPATE % (rel, ", ".join(sets))
503 teichmann 240 cur.execute(sql, values)
504 teichmann 234
505    
506 teichmann 233 class XMLHandler(DefaultHandler):
507    
508     def __init__(self, case_store):
509     DefaultHandler.__init__(self)
510     self.mode = EXPECT_CASES
511     self.ignore = 0
512     self.relation = None
513     self.chars = None
514     self.case_store = case_store
515     self.case = None
516    
517     def startElement(self, name, attrs):
518     if self.mode == EXPECT_CASES:
519     if name != "cases":
520     print >> sys.stderr, "ignore %s" % name
521     self.ignore += 1
522     else:
523     self.mode = EXPECT_CASE
524    
525     elif self.mode == EXPECT_CASE:
526     if name != "case":
527     print >> sys.stderr, "ignore %s" % name
528     self.ignore += 1
529     else:
530     self.case = Case()
531     self.mode = EXPECT_RELATION
532    
533     elif self.mode == EXPECT_RELATION:
534     rel = RELATIONS.get(name)
535     if rel is None:
536     print >> sys.stderr, "relation '%s' not found" % name
537     self.ignore += 1
538     else:
539     #print >> sys.stderr, "relation '%s' found" % name
540     self.relation = Relation(name, rel)
541     self.mode = EXPECT_FIELD
542    
543     elif self.mode == EXPECT_FIELD:
544     self.mode = EXPECT_CHARS
545     self.chars = ""
546    
547     elif self.mode == EXPECT_CHARS:
548     self.ignore += 1
549    
550     def endElement(self, name):
551     if self.ignore > 0:
552     self.ignore -= 1
553     return
554    
555     if self.mode == EXPECT_CHARS:
556     if name != "uuid_id":
557     converter = self.relation.items.get(name)
558     if converter is None:
559     print >> sys.stderr, "missing converter for %s" % name
560     else:
561     if not self.chars:
562 teichmann 242 self.relation.append([name, None])
563 teichmann 233 else:
564     #print >> sys.stderr, "convert %s" % name
565 teichmann 242 self.relation.append([name, converter(self.chars)])
566 teichmann 233 else:
567     self.relation.uuid = self.chars.strip()
568     #print >> sys.stderr, "uuid: %s" % self.relation.uuid
569    
570     self.mode = EXPECT_FIELD
571     self.chars = None
572    
573     if self.mode == EXPECT_FIELD:
574     if self.relation and self.relation.name == name:
575     self.case.append(self.relation)
576     self.relation = None
577     self.mode = EXPECT_RELATION
578     else:
579     pass
580    
581     elif self.mode == EXPECT_RELATION:
582     if name == "case":
583     self.case_store.store(self.case)
584     self.case = None
585     self.mode = EXPECT_CASE
586    
587     elif self.mode == EXPECT_CASE:
588     if name == "cases":
589     self.mode = EXPECT_CASES
590    
591     def characters(self, content):
592     if self.mode == EXPECT_CHARS:
593     self.chars += content
594    
595     class CaseStore:
596    
597 teichmann 241 def __init__(self, con, cur, fkz):
598 teichmann 240 self.con = con
599     self.cur = cur
600 teichmann 241 self.fkz = fkz
601 teichmann 233
602     def store(self, case):
603    
604 teichmann 244 success = False
605 teichmann 240 master_new = False
606 teichmann 244 kompetenz_new = False
607 teichmann 240 master_id = None
608 teichmann 244 cur = self.cur
609 teichmann 240
610     try:
611 teichmann 244 # find master
612     master = case.find_first_relation('master')
613    
614     if master is None:
615     # need to create one
616     master_id = create_master(cur)
617     master_new = True
618     if self.fkz:
619     master = Relation('master')
620     master.uuid = get_uuid(cur, 'master', master_id)
621     master.append(['fkz', self.fkz])
622     master.update(cur)
623     else:
624     # we have a master
625     if master.uuid is None:
626     # need to create new one
627     master_id = create_master(cur)
628     master_new = True
629     master.uuid = get_uuid(cur, 'master', master_id)
630     if self.fkz:
631     master.set_field('fkz', self.fkz)
632     else:
633     # we have a uuid
634     master_id = get_id_for_uuid(cur, 'master', master.uuid)
635     if master_id is None:
636     # does not exist -> create new
637     master_id = create_master(cur, master.uuid)
638     master_new = True
639     if self.fkz:
640     master.set_field('fkz', self.fkz)
641     # update the master
642     master.update(cur)
643    
644     # now handle the repeat groups
645 teichmann 240 for relation in case.relations:
646 teichmann 244 if relation.name == 'master':
647     # masters are already handled
648 teichmann 240 continue
649    
650 teichmann 244 if relation.uuid is None:
651     # need to create new
652     relation_id = create_repeat_group(cur, relation.name, master_id)
653     relation.uuid = get_uuid(cur, relation.name, relation_id)
654     if relation.name == 'kompetenzfeststellung':
655     kompetenz_new = True
656     else:
657     # we have a UUID. find out if we have this entry already in our database
658     m_id = get_id_for_uuid(cur, relation.name, relation.uuid)
659     if not m_id is None and m_id != master_id:
660     # exists but not the right master -> ignore
661     continue
662    
663     if m_id is None:
664 teichmann 242 # create new
665 teichmann 244 relation_id = create_repeat_group(cur, relation.name, master_id, relation.uuid)
666     if relation.name == 'kompetenzfeststellung':
667     kompetenz_new = True
668    
669     # update the relation
670 teichmann 240 relation.update(cur)
671    
672 teichmann 244 if master_new and kompetenz_new:
673 teichmann 240 # create at least one kompetenzfeststellung if there is a new master
674     create_repeat_group(cur, 'kompetenzfeststellung', master_id)
675    
676     success = True
677     self.con.commit()
678    
679     finally:
680     if not success:
681     self.con.rollback()
682    
683 teichmann 233 def main():
684 teichmann 241 try:
685     opts, args = getopt.getopt(sys.argv[1:], "d:p:h:u:f:w:", (
686     "database=",
687     "port=",
688     "host=",
689     "user=",
690     "fkz=",
691     "password="))
692     except getopt.GetoptError, err:
693     sys.stderr.write("error: %s\n" % str(err))
694     sys.exit(1)
695    
696     DBNAME = "ka_inte00002_db"
697     HOST = "localhost"
698     PORT = 5432
699     USER = "postgres"
700     FKZ = None
701     PASSWORD = ""
702    
703     for o, a in opts:
704     if o in ("d", "-d", "--database"):
705     DBNAME = a
706     elif o in ("p", "-p", "--port"):
707     PORT = int(a)
708     elif o in ("h", "-h", "--host"):
709     HOST = a
710     elif o in ("u", "-u", "--user"):
711     USER = a
712     elif o in ("f", "-f", "--fkz"):
713     FKZ = a
714     elif o in ("w", "-w", "--password"):
715     PASSWORD = a
716    
717 teichmann 240 con, cur = None, None
718     try:
719     con = dbapi.connect(
720     database = DBNAME,
721 torsten 257 #port = PORT,
722 teichmann 242 #host = HOST,
723     user = USER)
724     #password = PASSWORD)
725 teichmann 233
726 teichmann 240 cur = con.cursor()
727 teichmann 241 case_store = CaseStore(con, cur, FKZ)
728 teichmann 240
729     handler = XMLHandler(case_store)
730     parse(sys.stdin, handler)
731     finally:
732     if cur:
733     try: cur.close()
734     except: pass
735     if con:
736     try: con.close()
737     except: pass
738    
739 teichmann 233 if __name__ == '__main__':
740     main()
741    
742     # 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