[Mpuls-commits] r317 - in wasko/trunk: . waskaweb/controllers waskaweb/lib waskaweb/model waskaweb/templates

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Tue Mar 3 12:31:44 CET 2009


Author: teichmann
Date: 2009-03-03 12:31:22 +0100 (Tue, 03 Mar 2009)
New Revision: 317

Added:
   wasko/trunk/waskaweb/lib/uuid.py
   wasko/trunk/waskaweb/lib/xmlhelper.py
   wasko/trunk/waskaweb/model/casexml.py
Modified:
   wasko/trunk/ChangeLog.txt
   wasko/trunk/waskaweb/controllers/case.py
   wasko/trunk/waskaweb/lib/xmlimport.py
   wasko/trunk/waskaweb/templates/main.mako
Log:
Initial code to import XML documents.


Modified: wasko/trunk/ChangeLog.txt
===================================================================
--- wasko/trunk/ChangeLog.txt	2009-02-27 11:28:47 UTC (rev 316)
+++ wasko/trunk/ChangeLog.txt	2009-03-03 11:31:22 UTC (rev 317)
@@ -1,3 +1,24 @@
+2009-03-03	Sascha L. Teichmann	<teichmann at intevation.de>
+
+	Initial code to import XML documents. Parses the documents
+	correctly but does not write it to the database. TODO:
+	Apply rules to loaded cases to check for inconsistencies.
+
+	* waskaweb/model/casexml.py: New. Parses incoming XML files.
+
+	* waskaweb/controllers/case.py: Use new XML import model.
+
+	* waskaweb/lib/xmlimport.py: Removed WASKA dictionaries.
+	  !!!This module is deprecated now!!!
+
+	* waskaweb/lib/xmlhelper.py: New. From Offline Client.
+	  Various functions to make parsing the XML documents easier.
+
+	* waskaweb/lib/uuid.py: New. Fake UUID lib because Python 2.4
+	  lacks that library.
+	
+	* waskaweb/templates/main.mako: Enable XML import again.
+
 2009-02-27	Sascha L. Teichmann <teichmann at intevation.de>
 
 	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po: Tagged as '0.2-preview'

Modified: wasko/trunk/waskaweb/controllers/case.py
===================================================================
--- wasko/trunk/waskaweb/controllers/case.py	2009-02-27 11:28:47 UTC (rev 316)
+++ wasko/trunk/waskaweb/controllers/case.py	2009-03-03 11:31:22 UTC (rev 317)
@@ -74,8 +74,10 @@
 from waskaweb.model.phase_transition import symbol_phase, phase_neighbors
 
 from waskaweb.lib.db        import db
-from waskaweb.lib.xmlimport import importFromXML
+#from waskaweb.lib.xmlimport import importFromXML
 
+from waskaweb.model.casexml import import_xml
+
 from waskaweb.controllers.appointment import DELETE_APPOINT_NOTIFICATION_SUCCESS, \
                                              DELETE_APPOINT_NOTIFICATION_FAILED, \
                                              DELETE_APPOINT_NOTIFICATION_TEXT_SUCCESS, \
@@ -448,11 +450,11 @@
     def importXMLAction(self):
         factory = CaseFactory()
         try:
-            xml = request.POST['xmlfile']
+            xml  = request.POST['xmlfile']
             conn = None
             try:
                 conn = db.getConnection()
-                importFromXML(xml.file, conn)
+                import_xml(xml.file, g.formedTree)
             finally:
                 db.recycleConnection(conn)
 
@@ -462,6 +464,8 @@
             c.url_ok       = h.url_for(controller="/case_overview")
             return render('/casemanagement/dialogs/success_xml_import.mako')
         except:
+            import traceback, sys
+            traceback.print_exc(file = sys.stderr)
             c.failed_for  = IMPORTS_FAILED
             c.failed_text = IMPORTS_FAILED_TEXT
             c.url_ok = "/case/importCase"

Added: wasko/trunk/waskaweb/lib/uuid.py
===================================================================
--- wasko/trunk/waskaweb/lib/uuid.py	2009-02-27 11:28:47 UTC (rev 316)
+++ wasko/trunk/waskaweb/lib/uuid.py	2009-03-03 11:31:22 UTC (rev 317)
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright 2007, 2008, 2009 Intevation GmbH, Germany, <info at intevation.de>
+#
+# This file is part of mpuls WASKA (CoMPUter-based case fiLeS -
+# Web-Anwendungs-Server fuer Kompetenzagenturen).
+#
+# mpuls WASKA is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# mpuls WASKA is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Affero General Public
+# License along with mpuls WASKA. If not, see <http://www.gnu.org/licenses/>.
+#
+# mpuls WASKA has been developed on behalf of the
+# Projekttraeger im Deutschen Zentrum fuer Luft- und Raumfahrt e.V. (PT-DLR)
+# within the programme Kompetenzagenturen (Durchfuehrungsphase) funded by
+# the Bundesministerium fuer Familie, Senioren, Frauen und Jugend and
+# European Social Fund resources.
+#
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+import os
+
+class UUID(object):
+
+    def __init__(self, bytes):
+
+        if len(bytes) != 16:
+            raise ValueError('bytes is not a 16-char string')
+
+        self.int = long(('%02x'*16) % tuple(map(ord, bytes)), 16)
+
+    def __str__(self):
+        hex = '%032x' % self.int
+        return '%s-%s-%s-%s-%s' % (
+            hex[:8], hex[8:12], hex[12:16], hex[16:20], hex[20:])
+
+def uuid4():
+    try:
+        return UUID(bytes=os.urandom(16), version=4)
+    except:
+        import random
+        bytes = [chr(random.randrange(256)) for i in range(16)]
+        return UUID(bytes=bytes, version=4)
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 enc=utf-8 :

Added: wasko/trunk/waskaweb/lib/xmlhelper.py
===================================================================
--- wasko/trunk/waskaweb/lib/xmlhelper.py	2009-02-27 11:28:47 UTC (rev 316)
+++ wasko/trunk/waskaweb/lib/xmlhelper.py	2009-03-03 11:31:22 UTC (rev 317)
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+#
+# (c) 2008 by Intevation GmbH
+# This is Free software under the GPLv3. 
+# See LICENSE comming with the source of 'mpuls offline'
+# for details.
+#
+# author: Sascha L. Teichmann <sascha.teichmann at intevation.de>
+#
+
+from xml.sax.handler import ContentHandler
+
+from datetime import datetime, date
+
+import re
+
+NO_NUMBER  = re.compile("[^0-9\-]")
+INT_NUMBER = re.compile("(-?[0-9]+)")
+DATE       = re.compile("([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})")
+
+def iso_time_string(d):
+    ''' datetime.strftime() dislikes years before 1900. '''
+    return "%04d-%02d-%02dT%02d:%02d:%02d" % (
+        d.year, d.month, d.day, d.hour, d.minute, d.second)
+
+def string_iso_time(s):
+    return datetime.datetime.strptime(s.replace("-", ""), "%Y%m%dT%H:%M:%S")
+    
+
+def decode_int(s):
+    s = NO_NUMBER.sub("", s)
+    m = INT_NUMBER.match(s)
+    if not m: return None
+    return int(m.group(1))
+
+def decode_date(s):
+    s = NO_NUMBER.sub("", s)
+    m = DATE.match(s)
+    if not m: return None
+    return date(int(m.group(1)), int(m.group(2)), int(m.group(3)))
+
+def decode_iso_datetime(s):
+    if not s: return None
+    try:
+        return string_iso_time(s)
+    except:
+        return None
+
+def iso_datetime_string(d):
+    return iso_time_string(d)
+
+class StackedLoader(ContentHandler):
+
+    def __init__(self):
+        ContentHandler.__init__(self)
+        self.factories    = {}
+        self.current      = None
+        self.depth        = 0
+        self.entry_levels = None
+        self.stack        = None
+
+    def add_factories(self, tag, factories, default):
+        self.factories[tag] = (factories, default)
+
+    def activate_factories(self, tag):
+        self.current = self.factories.get(tag)
+        
+    def startElement(self, name, attrs):
+        new_factories = self.factories.get(name)
+
+        if new_factories:
+            self.entry_levels.append(self.depth)
+            self.current = new_factories
+
+        if self.current:
+            start, end = self.current[0].get(name, self.current[1])
+            start(name, attrs)
+        else:
+            end = None
+
+        self.stack.append((end, attrs, []))
+
+        self.depth += 1
+
+    def endElement(self, name):
+
+        t = self.stack.pop()
+
+        if t[0]: t[0](name, t[1], u"".join(t[2]))
+
+        self.depth -= 1
+        if self.entry_levels and self.entry_levels[-1] == self.depth:
+            self.entry_levels.pop()
+
+    def activate_factories(self, tag):
+        try:
+            self.current = self.factories[tag]
+        except KeyError:
+            pass
+
+    def characters(self, chars):
+        self.stack[-1][2].append(chars)
+
+    def startDocument(self):
+        self.depth        = 0
+        self.entry_levels = []
+        self.stack        = []
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

Modified: wasko/trunk/waskaweb/lib/xmlimport.py
===================================================================
--- wasko/trunk/waskaweb/lib/xmlimport.py	2009-02-27 11:28:47 UTC (rev 316)
+++ wasko/trunk/waskaweb/lib/xmlimport.py	2009-03-03 11:31:22 UTC (rev 317)
@@ -56,421 +56,6 @@
 UUID_RE = re.compile(r"^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$")
 
 RELATIONS = {
-    'master': {
-        "einverstaendniserklaerung": _bool_converter,
-        "phase": _choice_converter,
-        "fkz": _text_converter,
-        "name_kompetenzagentur": _text_converter,
-        "vorname": _text_converter,
-        "name": _text_converter,
-        "erstgespraech": _date_converter,
-        "war_cm_kunde": _bool_converter,
-        "war_sw_kunde": _bool_converter,
-        "zugang_kompetenzagentur": _choice_converter,
-        "kundennummer": _text_converter,
-        "schulpflichtig": _bool_converter,
-        "noch_schueler": _bool_converter,
-        "bei_eintritt_ist_der_jugendliche": _choice_converter,
-        "rechtlicher_kontext": _choice_converter,
-        "schnittstelle_zu": _choice_converter,
-        "kontaktdaten_arge": _text_converter,
-        "kundennummer_arge": _text_converter,
-        "kontaktdaten_agentur_fuer_arbeit": _text_converter,
-        "kundennummer_agentur_fuer_arbeit": _text_converter,
-        "kundennummer_jugendamt": _text_converter,
-        "kontaktdaten_jugendamt": _text_converter,
-        "kontaktdaten_schule": _text_converter,
-        "schulname": _text_converter,
-        "kontaktdaten_gerichtshilfe": _text_converter,
-        "kundennummer_gerichtshilfe": _text_converter,
-        "kontaktdaten_weitere_institutionen": _text_converter,
-        "vorname_1": _text_converter,
-        "name_1": _text_converter,
-        "geschlecht": _choice_converter,
-        "geburtsdatum": _date_converter,
-        "familienstand": _choice_converter,
-        "strasse": _text_converter,
-        "plz": _text_converter,
-        "wohnort": _text_converter,
-        "groesse_wohnort": _choice_converter,
-        "vorwahl": _text_converter,
-        "telefon_1": _text_converter,
-        "mobiltelefon": _text_converter,
-        "email": _text_converter,
-        "telefon_sonstige": _text_converter,
-        "zweiter_wohnort": _text_converter,
-        "geburtsland": _choice_converter,
-        "geburtsland_sonstige_nennung": _text_converter,
-        "muttersprache": _choice_converter,
-        "muttersprache_sonstige_nennung": _text_converter,
-        "staatsangehoerigkeit": _choice_converter,
-        "staatsangehoerigkeit_sonstige_nennung": _text_converter,
-        "aufenthaltsstatus": _choice_converter,
-        "aufenthaltsdauer": _int_converter,
-        "vater": _choice_converter,
-        "mutter": _choice_converter,
-        "familiaere_situation_1": _choice_converter,
-        "vorname_2": _text_converter,
-        "name_2": _text_converter,
-        "vorwahl_1": _text_converter,
-        "telefon_1_1": _text_converter,
-        "mobiltelefon_1": _text_converter,
-        "email_1": _text_converter,
-        "geschwister": _int_converter,
-        "anzahl_kinder": _int_converter,
-        "haushalt_jugendlicher": _int_converter,
-        "alleinerziehend": _choice_converter,
-        "familie_selbststaendig": _bool_converter,
-        "familie_staatliche_unterstuetzung": _bool_converter,
-        "jugendlicher_selbststaendig": _bool_converter,
-        "jugendlicher_staatliche_unterstuetzung": _bool_converter,
-        "jugendlicher_unterstuetzung_soziales_umfeld": _bool_converter,
-        "wohnaufenthalt": _choice_converter,
-        "arzt_gutachten_physisch": _bool_converter,
-        "physische_beeintraechtigungen": _choice_converter,
-        "physische_beeintraechtigungen_text": _text_converter,
-        "arzt_gutachten_psychisch": _bool_converter,
-        "psychische_beeintraechtigungen": _choice_converter,
-        "psychische_beeintraechtigungen_text": _text_converter,
-        "anerkannte_behinderung": _choice_converter,
-        "mutter_2": _bool_converter,
-        "vater_2": _bool_converter,
-        "grosseltern": _bool_converter,
-        "geschwister_2": _bool_converter,
-        "pflegefamilie_1": _bool_converter,
-        "stiefmutter": _bool_converter,
-        "stiefvater": _bool_converter,
-        "verwandte_1": _bool_converter,
-        "partner": _bool_converter,
-        "heimbetreuerin": _bool_converter,
-        "betreuerin": _bool_converter,
-        "lehrerin": _bool_converter,
-        "mitbewohner": _bool_converter,
-        "partner_mutter": _bool_converter,
-        "partner_vater": _bool_converter,
-        "freund": _bool_converter,
-        "keine_bezugsperson": _bool_converter,
-        "hobbies_1": _choice_converter,
-        "hobbies_text": _text_converter,
-        "mitarbeit_organisationen": _choice_converter,
-        "organisationen_vereine_text": _text_converter,
-        "sonstiges_1": _choice_converter,
-        "sonstiges_text": _text_converter,
-        "clique": _bool_converter,
-        "freundin": _bool_converter,
-        "parterin": _bool_converter,
-        "schule_2": _choice_converter,
-        "klassenstufe": _int_converter,
-        "klassenwiederholung": _choice_converter,
-        "abgang": _int_converter,
-        "nicht_anwesende_tage": _int_converter,
-        "unentschuldigte_tage": _int_converter,
-        "schulabschluss_1": _choice_converter,
-        "schulabschlusserwerbsland": _choice_converter,
-        "schulabschlusserwerbsland_sonstige_nennung": _text_converter,
-        "abschluss_betriebliche_ausbildung": _choice_converter,
-        "abschluss_im_ausbildungsberuf": _text_converter,
-        "ausbildungsdauer": _int_converter,
-        "wann_abgeschlossen": _date_converter,
-        "weitere_ausbildungen": _int_converter,
-        "weitere_ausbildungen_text": _text_converter,
-        "dauer_weitere_ausbildungen": _int_converter,
-        "abgebrochene_ausbildungen": _int_converter,
-        "abgebrochene_ausbildungen_text": _text_converter,
-        "abschluss_ausserbetriebliche_ausbildung": _choice_converter,
-        "abschluss_im_ausbildungsberuf_1": _text_converter,
-        "ausbildungsdauer_1": _int_converter,
-        "wann_abgeschlossen_1": _date_converter,
-        "weitere_ausbildungen_1": _int_converter,
-        "weitere_ausbildungen_text_1": _text_converter,
-        "dauer_weitere_ausbildungen_1": _int_converter,
-        "abgebrochene_ausbildungen_1": _int_converter,
-        "abgebrochene_ausbildungen_text_1": _text_converter,
-        "massnahmeteilnahme": _choice_converter,
-        "letzte_massnahme": _text_converter,
-        "finanzierung": _text_converter,
-        "austrittsdatum": _date_converter,
-        "dauer": _int_converter,
-        "weitere_massnahmen": _choice_converter,
-        "massnahme_1": _text_converter,
-        "massnahme1_finanzierung": _text_converter,
-        "massnahme_2": _text_converter,
-        "massnahme2_finanzierung": _text_converter,
-        "massnahme_3": _text_converter,
-        "massnahme3_finanzierung": _text_converter,
-        "abgebrochene_massnahmen": _int_converter,
-        "erwerbstaetigkeit_job": _choice_converter,
-        "letzte_taetigkeit": _text_converter,
-        "dauer_1": _int_converter,
-        "austrittsdatum_1": _date_converter,
-        "weitere_taetigkeiten": _int_converter,
-        "weitere_jobs_text": _text_converter,
-        "dauer_weitere_taetigkeiten": _int_converter,
-        "arbeitslosigkeit_1": _choice_converter,
-        "anzahl_arbeitslosigkeit": _int_converter,
-        "dauer_nach_letzter_beschaeftigung": _int_converter,
-        "dauer_insgesamt": _int_converter,
-        "bezug_alg1": _choice_converter,
-        "bezug_alg2": _choice_converter,
-        "wehrpflicht_zivildienst_freiwilligenjahr_1": _choice_converter,
-        "art_des_dienstes": _choice_converter,
-        "dauer_2": _int_converter,
-        "mutterschutz_erziehungsurlaub": _choice_converter,
-        "anzahl": _int_converter,
-        "dauer_letzter_erziehungsurlaub": _int_converter,
-        "dauer_insgesamt_1": _int_converter,
-        "kompetenzfeststellung": _choice_converter,
-        "datum_feststellung": _date_converter,
-        "zielsetzung": _choice_converter,
-        "begleitung": _choice_converter,
-        "welche_vermittlung_nennung": _text_converter,
-        "beratungsfortsetzung": _text_converter,
-        "datum_ende_beratung": _date_converter,
-        "freie_dokumentation": _text_converter,
-        "vereinbarung_foerderplan": _date_converter,
-        "bildender_bereich": _bool_converter,
-        "bereich_berufliche_qualifizierung": _bool_converter,
-        "bereich_berufsvorbereitung": _bool_converter,
-        "bereich_lebensbewaeltigung": _bool_converter,
-        "sonstiger_foerderbedarf": _bool_converter,
-        "sonstiger_foerderbedarf_nennung": _text_converter,
-        "foerderzeitraum_start": _date_converter,
-        "foerderzeitraum_ende": _date_converter,
-        "dokumentation_zum_foerderplan": _text_converter,
-        "anzahl_kontakte_termine": _int_converter,
-        "anzahl_der_stunden": _int_converter,
-        "zeitraum_fallmanagement": _int_converter,
-        "beendigung_5": _date_converter,
-        "art_beendigung": _choice_converter,
-        "abbruch_durch": _choice_converter,
-        "gruende_abbruch": _choice_converter,
-        "gruende_sonstiges_nennung_4": _text_converter,
-        "vermittlung": _choice_converter,
-        "vermittlung_nennung": _text_converter,
-        "veraenderungen_rechtskreis": _choice_converter,
-        "allgemein_bildender_schulabschluss": _choice_converter,
-        "allgemein_bildender_schulabschluss_sonstiges_nennung": _text_converter,
-        "massnahmeabschluss": _choice_converter,
-        "schulart": _choice_converter,
-        "schule_sonstiges_nennung": _text_converter,
-        "klassenstufe_1": _int_converter,
-        "ausbildung": _choice_converter,
-        "ausbildung_sonstiges_nennung": _text_converter,
-        "umschulung": _choice_converter,
-        "umschulung_nennung": _text_converter,
-        "arbeitstaetigkeit": _text_converter,
-        "erwerbstatus": _choice_converter,
-        "erwerbsstatus_sonstiges_nennung": _text_converter,
-        "beschaeftigungsumfang": _choice_converter,
-        "kategorien_nichterwerbsarbeit_nichtausbildung": _choice_converter,
-        "kategorien_sonstiges_nennung": _text_converter,
-        "beendigung_nachbetreuung": _date_converter,
-        "zeitraum_nachbetreuung": _choice_converter,
-        "verbleib_nachbetreuung": _choice_converter,
-        "mitgliedschaft_organisationen_vereinen": _choice_converter,
-        "intensitaet_mitgliedschaft": _choice_converter,
-        "nutzung_kulturangeboten": _choice_converter,
-        "haeufigkeit": _choice_converter,
-        "soziales_engagement": _text_converter,
-        "unternehmungen_freunden": _choice_converter,
-        "unternehmungen_familie": _choice_converter,
-        "peergroup": _choice_converter,
-        "familie_1": _choice_converter,
-        "beziehung": _choice_converter,
-        "arbeit_schule": _choice_converter,
-        "bester_freund_freundin": _choice_converter,
-        "einhaltungtermine": _choice_converter,
-        "eigenstaendigeamtsgaenge": _choice_converter,
-        "entwurflebensplaene": _choice_converter,
-        "umgangmitproblemen": _choice_converter,
-        "einschaetzung_zielerreichung": _choice_converter,
-        "erreichte_qualifikation": _choice_converter,
-        "integration_ist_nachhaltig": _choice_converter,
-        "selbststaendige_berufswegplanung": _choice_converter,
-        "eigenstaendige_lebensgestaltung": _choice_converter,
-        "soziale_bezugssysteme": _choice_converter,
-        "teilnahme_gesellschaftliches_leben": _choice_converter,
-        "freie_dokumentation_abschlussbewertung": _text_converter
-    },
-    'kompetenzfestellung': {
-        "verfahren_kompetenzfeststellung": _choice_converter,
-        "externeranbieter": _text_converter,
-        "assessment_center": _bool_converter,
-        "interview": _bool_converter,
-        "biografieorientierte_methoden": _bool_converter,
-        "selbsttest_selbstbeurteilung": _bool_converter,
-        "sonstiges_2": _bool_converter,
-        "artdesverfahrens_nennung_sonstiges": _text_converter,
-        "testverfahren": _bool_converter,
-        "intelligenztest": _bool_converter,
-        "intelligenztest_nennung": _text_converter,
-        "schultest": _bool_converter,
-        "schultest_nennung": _text_converter,
-        "leistungstest": _bool_converter,
-        "leistungstest_nennung": _text_converter,
-        "persoenlichkeitstest": _bool_converter,
-        "persoenlichkeitstest_nennung": _text_converter,
-        "einstellungs_interessentest": _bool_converter,
-        "einstellungs_interessentest_nennung": _text_converter,
-        "beginn_des_verfahrens": _date_converter,
-        "dauer_des_verfahrens": _choice_converter,
-        "rechenfaehigkeit": _choice_converter,
-        "raeumliches_vorstellungsvermoegen": _choice_converter,
-        "grundverstaendnis_naturwissenschaftlicher_zusammenhaenge": _choice_converter,
-        "logisches_denken": _choice_converter,
-        "wirtschaftliche_grundkenntnisse": _choice_converter,
-        "allgemeine_pc_kenntnisse": _choice_converter,
-        "spezielle_pc_kenntnisse_grafikbearbeitung_musikbearbeitung": _choice_converter,
-        "internet_anwendungen_und_e_mail_kenntnisse": _choice_converter,
-        "andere_medien": _choice_converter,
-        "hand_fingergeschick": _choice_converter,
-        "formauffassung": _choice_converter,
-        "umgang_maschinen_werkzeugen": _choice_converter,
-        "gestalterische_fantasie": _choice_converter,
-        "methoden_der_informationsgewinnung": _choice_converter,
-        "methoden_der_informationsverarbeitung": _choice_converter,
-        "einsatz_lern_und_arbeitstechniken": _choice_converter,
-        "problemloesungsorientierung": _choice_converter,
-        "texte_lesen_und_verstehen": _choice_converter,
-        "texte_schreiben_und_formulieren": _choice_converter,
-        "deutsche_sprache": _choice_converter,
-        "sprache1": _choice_converter,
-        "sprache1_sonstige_nennung": _text_converter,
-        "beherrschung_sprache1": _choice_converter,
-        "sprache2": _choice_converter,
-        "sprache2_sonstige_nennung": _text_converter,
-        "beherrschung_sprache2": _choice_converter,
-        "sprache3": _choice_converter,
-        "sprache3_sonstige_nennung": _text_converter,
-        "beherrschung_sprache3": _choice_converter,
-        "kommunikationsfaehigkeit": _choice_converter,
-        "kritikfaehigkeit": _choice_converter,
-        "konfliktfaehigkeit": _choice_converter,
-        "kreativitaet": _choice_converter,
-        "team_und_kooperationsfaehigkeit": _choice_converter,
-        "solidarisches_verhalten": _choice_converter,
-        "selbstaendiges_lernen_arbeiten": _choice_converter,
-        "selbstreflexion_selbsteinschaetzung": _choice_converter,
-        "verantwortungsuebernahme": _choice_converter,
-        "zielorientierung": _choice_converter,
-        "zuverlaessigkeit": _choice_converter,
-        "altersgerechter_entwicklungsstand": _choice_converter,
-        "gesundheitliche_voraussetzungen": _choice_converter,
-        "konzentration": _choice_converter,
-        "ausdauer": _choice_converter,
-        "durchhaltevermoegen": _choice_converter,
-        "merkfaehigkeit": _choice_converter,
-        "bearbeitungsgeschwindigkeit": _choice_converter,
-        "befaehigung_zu_daueraufmerksamkeit": _choice_converter,
-        "leistungsbereitschaft": _choice_converter,
-        "sorgfalt": _choice_converter,
-        "umgangsformen": _choice_converter,
-        "dokumentation_kompetenzfeststellung": _text_converter
-    },
-    'angebote_bildenden_bereich': {
-        "angebotsform": _choice_converter,
-        "art_der_unterstuetzung": _text_converter,
-        "durchfuehrende_institution": _text_converter,
-        "zielsetzungangebot": _text_converter,
-        "indikator_1": _text_converter,
-        "bewertung_manager_1": _choice_converter,
-        "bewertung_jugendlicher_1": _choice_converter,
-        "indikator_2": _text_converter,
-        "bewertung_manager_2": _choice_converter,
-        "bewertung_jugendlicher_2": _choice_converter,
-        "indikator_3": _text_converter,
-        "bewertung_manager_3": _choice_converter,
-        "bewertung_jugendlicher_3": _choice_converter,
-        "zielerreichung": _text_converter,
-        "unterstuetzung_start": _date_converter,
-        "unterstuetzung_ende": _date_converter,
-        "zeitlicher_umfang_unterstuetzung": _int_converter,
-        "beendigung_1": _choice_converter,
-        "beendigung_durch": _choice_converter,
-        "gruende_vorzeitige_beendigung": _choice_converter,
-        "gruende_sonstiges_nennung": _text_converter,
-        "nachweis_bescheinigung": _choice_converter,
-        "sonstiges_nachweis_bescheinigung": _text_converter
-    },
-    'angebote_berufsvorbereitung': {
-        "angebotsform_1": _choice_converter,
-        "art_der_unterstuetzung_1": _choice_converter,
-        "unterstuetzung_sonstiges_nennung": _text_converter,
-        "durchfuehrende_institution_1": _text_converter,
-        "zielsetzungangebot": _text_converter,
-        "indikator_1": _text_converter,
-        "bewertung_manager_1": _choice_converter,
-        "bewertung_jugendlicher_1": _choice_converter,
-        "indikator_2": _text_converter,
-        "bewertung_manager_2": _choice_converter,
-        "bewertung_jugendlicher_2": _choice_converter,
-        "indikator_3": _text_converter,
-        "bewertung_manager_3": _choice_converter,
-        "bewertung_jugendlicher_3": _choice_converter,
-        "zielerreichung": _text_converter,
-        "unterstuetzung_start_1": _date_converter,
-        "unterstuetzung_ende_1": _date_converter,
-        "zeitlicher_umfang_unterstuetzung_1": _int_converter,
-        "beendigung_2": _choice_converter,
-        "beendigung_durch_1": _choice_converter,
-        "gruende_vorzeitige_beendigung_1": _choice_converter,
-        "gruende_sonstiges_nennung_1": _text_converter,
-        "nachweis_bescheinigung_1": _choice_converter,
-        "sonstiges_nachweis_bescheinigung_1": _text_converter
-    },
-    'angebote_berufliche_qualifizierung': {
-        "angebotsform_2": _choice_converter,
-        "angebote_im_bereich": _choice_converter,
-        "unterstuetzung_sonstiges_nennung_1": _text_converter,
-        "durchfuehrende_institution_2": _text_converter,
-        "zielsetzungangebot": _text_converter,
-        "indikator_1": _text_converter,
-        "bewertung_manager_1": _choice_converter,
-        "bewertung_jugendlicher_1": _choice_converter,
-        "indikator_2": _text_converter,
-        "bewertung_manager_2": _choice_converter,
-        "bewertung_jugendlicher_2": _choice_converter,
-        "indikator_3": _text_converter,
-        "bewertung_manager_3": _choice_converter,
-        "bewertung_jugendlicher_3": _choice_converter,
-        "zielerreichung": _text_converter,
-        "unterstuetzung_start_2": _date_converter,
-        "unterstuetzung_ende_2": _date_converter,
-        "zeitlicher_umfang_unterstuetzung_2": _int_converter,
-        "beendigung_3": _choice_converter,
-        "beendigung_durch_2": _choice_converter,
-        "gruende_vorzeitige_beendigung_2": _choice_converter,
-        "gruende_sonstiges_nennung_2": _text_converter,
-        "nachweis_bescheinigung_2": _choice_converter,
-        "sonstiges_nachweis_bescheinigung_2": _text_converter
-    },
-    'angebote_lebensbewaeltigung': {
-        "angebotsform_3": _choice_converter,
-        "unterstuetzung_angebotsform_sonstiges_nennung": _text_converter,
-        "art_der_unterstuetzung_2": _choice_converter,
-        "unterstuetzung_sonstiges_nennung_2": _text_converter,
-        "durchfuehrende_institution_3": _text_converter,
-        "zielsetzungangebot": _text_converter,
-        "indikator_1": _text_converter,
-        "bewertung_manager_1": _choice_converter,
-        "bewertung_jugendlicher_1": _choice_converter,
-        "indikator_2": _text_converter,
-        "bewertung_manager_2": _choice_converter,
-        "bewertung_jugendlicher_2": _choice_converter,
-        "indikator_3": _text_converter,
-        "bewertung_manager_3": _choice_converter,
-        "bewertung_jugendlicher_3": _choice_converter,
-        "zielerreichung": _text_converter,
-        "unterstuetzung_start_3": _date_converter,
-        "unterstuetzung_ende_3": _date_converter,
-        "zeitlicher_umfang_unterstuetzung_3": _int_converter,
-        "beendigung_4": _choice_converter,
-        "beendigung_durch_3": _choice_converter,
-        "gruende_vorzeitige_beendigung_3": _choice_converter,
-        "gruende_sonstiges_nennung_3": _text_converter,
-        "nachweis_bescheinigung_3": _choice_converter,
-        "sonstiges_nachweis_bescheinigung_3": _text_converter
-    }
 }
 
 CREATE_FUNCTIONS = {

Added: wasko/trunk/waskaweb/model/casexml.py
===================================================================
--- wasko/trunk/waskaweb/model/casexml.py	2009-02-27 11:28:47 UTC (rev 316)
+++ wasko/trunk/waskaweb/model/casexml.py	2009-03-03 11:31:22 UTC (rev 317)
@@ -0,0 +1,289 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright 2007, 2008, 2009 Intevation GmbH, Germany, <info at intevation.de>
+#
+# This file is part of mpuls WASKA (CoMPUter-based case fiLeS -
+# Web-Anwendungs-Server fuer Kompetenzagenturen).
+#
+# mpuls WASKA is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the
+# Free Software Foundation, either version 3 of the License, or (at your
+# option) any later version.
+#
+# mpuls WASKA is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Affero General Public
+# License along with mpuls WASKA. If not, see <http://www.gnu.org/licenses/>.
+#
+# mpuls WASKA has been developed on behalf of the
+# Projekttraeger im Deutschen Zentrum fuer Luft- und Raumfahrt e.V. (PT-DLR)
+# within the programme Kompetenzagenturen (Durchfuehrungsphase) funded by
+# the Bundesministerium fuer Familie, Senioren, Frauen und Jugend and
+# European Social Fund resources.
+#
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from waskaweb.lib.uuid import uuid4
+
+from waskaweb.lib.xmlhelper import \
+    decode_int,                    \
+    decode_date,                   \
+    decode_iso_datetime,           \
+    StackedLoader
+
+import waskaweb.model.data as data
+
+from xml.sax          import make_parser
+from xml.sax.saxutils import escape
+
+import sys
+
+VERSION = 2
+
+DECODERS = {
+    data.RadioNode:    decode_int,
+    data.TextAreaLeaf: lambda s: s,
+    data.TextLeaf:     lambda s: s,
+    data.ChoiceNode:   decode_int,
+    data.IntLeaf:      decode_int,
+    data.DateLeaf:     decode_date
+}
+
+class LogbookEntry(object):
+
+    def __init__(self, uuid = None):
+        self.uuid       = uuid
+        self.datum      = None
+        self.art        = None
+        self.bearbeiter = None
+        self.kurz_notiz = None
+        self.notiz      = None
+        self.dauer      = None
+
+    def getUUID(self):
+        if not self.uuid:
+            self.uuid = str(uuid4())
+        return self.uuid
+
+    def setUUID(self, uuid):
+        self.uuid = uuid
+
+    def setDate(self, datum):
+        self.datum = datum
+
+    def getDate(self):
+        return dd_mm_YYYY(self.datum)
+
+    def getTime(self):
+        return HH_MM(self.datum)
+
+    def setEditor(self, editor):
+        self.bearbeiter = editor
+
+    def getEditor(self):
+        if self.bearbeiter is None: return u""
+        return self.bearbeiter
+
+    def getType(self):
+        return self.art
+
+    def setType(self, art):
+        self.art = art
+
+    def getDuration(self):
+        if self.dauer is None: return u""
+        return "%d" % self.dauer
+
+    def setDuration(self, duration):
+        self.dauer = duration
+
+    def getShortNotice(self):
+        if self.kurz_notiz is None: return u""
+        return self.kurz_notiz
+
+    def setShortNotice(self, short_notice):
+        self.kurz_notiz = short_notice
+
+    def getNotice(self):
+        if self.notiz is None: return u""
+        return self.notiz
+
+    def setNotice(self, notice):
+        self.notiz = notice
+
+    def to_xml(self, out):
+        out.append(u'<tagebuch-eintrag>')
+
+        if not self.uuid is None:
+            out.append(u'<uuid_id>%s</uuid_id>' % self.uuid)
+
+        if not self.datum is None:
+            out.append(u'<tagebuch-datum>%s</tagebuch-datum>' % \
+                iso_datetime_string(self.datum))
+
+        if not self.bearbeiter is None:
+            out.append(u'<tagebuch-bearbeiter>%s</tagebuch-bearbeiter>' % \
+                escape(self.bearbeiter))
+
+        if not self.art is None:
+            out.append(u'<tagebuch-art>%d</tagebuch-art>' % \
+                self.art)
+
+        if not self.kurz_notiz is None:
+            out.append(u'<tagebuch-sonstiges>%s</tagebuch-sonstiges>' % \
+                escape(self.kurz_notiz))
+
+        if not self.notiz is None:
+            out.append(u'<tagebuch-notiz>%s</tagebuch-notiz>' % \
+                escape(self.notiz))
+
+        if not self.dauer is None:
+            out.append(u'<tagebuch-dauer>%d</tagebuch-dauer>' % self.dauer)
+
+        out.append(u'</tagebuch-eintrag>')
+
+class Logbook(object):
+
+    def __init__(self):
+        self.entries = []
+
+    def to_xml(self):
+        if not self.entries: return u""
+        out = [u"<tagebuch>"]
+        for entry in self.entries:
+            entry.to_xml(out)
+        out.append(u"</tagebuch>")
+        return u"".join(out)
+
+    def add_entry(self, entry):
+        self.entries.append(entry)
+
+class LogbookLoader(object):
+
+    def __init__(self):
+        self.logbook = Logbook()
+        self.entry   = None
+
+    def register_loader(self, loader):
+
+        factories = {
+            u"tagebuch":            (self.default_start, self.default_end),
+            u"tagebuch-eintrag":    (self.eintrag_start, self.eintrag_end),
+            u"uuid_id":             (self.default_start, self.uuid_end),
+            u'tagebuch-datum':      (self.default_start, self.datum_end),
+            u'tagebuch-art':        (self.default_start, self.art_end),
+            u'tagebuch-sonstiges':  (self.default_start, self.kurz_end),
+            u'tagebuch-bearbeiter': (self.default_start, self.bearbeiter_end),
+            u'tagebuch-notiz':      (self.default_start, self.notiz_end),
+            u'tagebuch-dauer':      (self.default_start, self.dauer_end),
+        }
+
+        loader.add_factories(
+            u"tagebuch",
+            factories,
+            (self.default_start, self.default_end))
+
+    def art_end(self, name, attrs, value):
+        if self.entry:
+            value = decode_int(value)
+            if not value is None: self.entry.setType(value)
+
+    def dauer_end(self, name, attrs, value):
+        if self.entry: self.entry.dauer = decode_int(value)
+
+    def bearbeiter_end(self, name, attrs, value):
+        if self.entry: self.entry.bearbeiter = value
+
+    def notiz_end(self, name, attrs, value):
+        if self.entry: self.entry.notiz = value
+
+    def kurz_end(self, name, attrs, value):
+        if self.entry: self.entry.kurz_notiz = value
+
+    def datum_end(self, name, attrs, value):
+        if self.entry:
+            self.entry.datum = decode_iso_datetime(value.strip())
+
+    def eintrag_start(self, name, attrs):
+        self.entry = LogbookEntry()
+
+    def eintrag_end(self, name, attrs, value):
+        if not self.entry.uuid:
+            self.entry.uuid = str(uuid4())
+        self.logbook.entries.append(self.entry)
+        self.entry = None
+
+    def uuid_end(self, name, attrs, value):
+        if self.entry: self.entry.uuid = value.strip()
+
+    def default_start(self, name, attrs):
+        pass
+
+    def default_end(self, name, attrs, value):
+        pass
+
+
+class MasterHandler(object):
+
+    def __init__(self, formed):
+        self.formed  = formed
+        self.version = 1
+        self.uuid    = None
+        self.data    = []
+
+    def element_start(self, name, attrs):
+        if name == u"cases":
+            try:
+                self.version = int(attrs[u'version'])
+            except (KeyError, ValueError):
+                pass
+
+            if self.version > VERSION:
+                raise Exception(
+                    "Cannot load files of version %d." % version)
+
+    def element_end(self, name, attrs, value):
+        print >> sys.stderr, "looking for '%s'" % repr(name)
+
+        try:
+            widget = self.formed.widgets[name]
+        except KeyError:
+            if name == u'uuid_id':
+                self.uuid = value
+            return
+
+        self.data.append((name, DECODERS.get(widget.__class__, lambda s: s)(value)))
+
+def import_xml(f, formed):
+
+    master_handler = MasterHandler(formed)
+
+    loader = StackedLoader()
+
+    loader.add_factories(
+        'master',
+        {},
+        (master_handler.element_start, master_handler.element_end))
+    loader.activate_factories('master') # for backwards compat
+
+    logbook_loader = LogbookLoader()
+
+    logbook_loader.register_loader(loader)
+
+    parser = make_parser()
+    parser.setContentHandler(loader)
+    parser.parse(f)
+
+    #print >> sys.stderr, repr(master_handler.data)
+
+    logbook = logbook_loader.logbook
+
+    #print >> sys.stderr, repr(logbook.to_xml())
+
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 enc=utf-8 :

Modified: wasko/trunk/waskaweb/templates/main.mako
===================================================================
--- wasko/trunk/waskaweb/templates/main.mako	2009-02-27 11:28:47 UTC (rev 316)
+++ wasko/trunk/waskaweb/templates/main.mako	2009-03-03 11:31:22 UTC (rev 317)
@@ -68,7 +68,7 @@
         <li><a href="${h.url_for(controller='/case_overview', action='overview', reset=1)}"> ${_('menu_cm_link_overview')}</a> </li>
         % if h.hasRole(['cm_ka']):
           <li><a href="${h.url_for(controller='/case', action='new')}"> ${_('menu_cm_link_new')}</a> </li>
-          ##<li><a href="${h.url_for(controller='/case', action='importCase')}"> ${_('menu_cm_link_import')}</a> </li>
+          <li><a href="${h.url_for(controller='/case', action='importCase')}"> ${_('menu_cm_link_import')}</a> </li>
         % endif
         <li><a href="${h.url_for(controller='/evaluate', action='evaluateAdele')}">Zwischenbericht</a></li>
         ##<li><a href="${h.url_for(controller='/evaluate', action='evaluate', id=1, reset=1)}"> ${_('cm_actions_link_evaluate')}</a></li>



More information about the Mpuls-commits mailing list