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