[Mpuls-commits] r2 - in trunk: . docs ez_setup formed waskaweb waskaweb/config waskaweb/controllers waskaweb/i18n waskaweb/i18n/de waskaweb/i18n/de/LC_MESSAGES waskaweb/lib waskaweb/model waskaweb/model/io waskaweb/public waskaweb/public/images waskaweb/public/images/icons waskaweb/public/js waskaweb/public/styles waskaweb/public/styles/old_css waskaweb/templates waskaweb/templates/administration waskaweb/templates/administration/dialogs waskaweb/templates/appointments waskaweb/templates/appointments/beta waskaweb/templates/appointments/dialogs waskaweb/templates/casemanagement waskaweb/templates/casemanagement/dialogs waskaweb/templates/casemanagement/static_form waskaweb/templates/dialogs waskaweb/templates/documents waskaweb/templates/documents/dialogs waskaweb/templates/start waskaweb/templates/statement waskaweb/templates/statement/dialogs waskaweb/templates/tests waskaweb/templates/usersettings waskaweb/templates/usersettings/dialogs waskaweb/tests waskaweb/tests/functional waskaweb.egg-info

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Wed Aug 13 15:01:17 CEST 2008


Author: thomas
Date: 2008-08-13 15:01:12 +0200 (Wed, 13 Aug 2008)
New Revision: 2

Added:
   trunk/ChangeLog
   trunk/Changelog.txt
   trunk/MANIFEST.in
   trunk/README.txt
   trunk/development.ini
   trunk/development_wsgi.ini
   trunk/docs/
   trunk/docs/index.txt
   trunk/ez_setup/
   trunk/ez_setup/README.txt
   trunk/ez_setup/__init__.py
   trunk/formed/
   trunk/formed/aid_plan_statement.html
   trunk/formed/formedtree_web.xml
   trunk/formed/laender.xml
   trunk/formed/privacy_statement.html
   trunk/formed/sprachen.xml
   trunk/formed/staatsangehoerigkeit.xml
   trunk/formed/waska-hilfetexte.xhtml
   trunk/production_wsgi.ini
   trunk/setup.cfg
   trunk/setup.py
   trunk/test.ini
   trunk/waskaweb.egg-info/
   trunk/waskaweb.egg-info/PKG-INFO
   trunk/waskaweb.egg-info/SOURCES.txt
   trunk/waskaweb.egg-info/dependency_links.txt
   trunk/waskaweb.egg-info/entry_points.txt
   trunk/waskaweb.egg-info/paste_deploy_config.ini_tmpl
   trunk/waskaweb.egg-info/paster_plugins.txt
   trunk/waskaweb.egg-info/requires.txt
   trunk/waskaweb.egg-info/top_level.txt
   trunk/waskaweb/
   trunk/waskaweb/__init__.py
   trunk/waskaweb/config/
   trunk/waskaweb/config/__init__.py
   trunk/waskaweb/config/environment.py
   trunk/waskaweb/config/middleware.py
   trunk/waskaweb/config/routing.py
   trunk/waskaweb/controllers/
   trunk/waskaweb/controllers/__init__.py
   trunk/waskaweb/controllers/administration.py
   trunk/waskaweb/controllers/appointment.py
   trunk/waskaweb/controllers/case.py
   trunk/waskaweb/controllers/document.py
   trunk/waskaweb/controllers/error.py
   trunk/waskaweb/controllers/evaluate.py
   trunk/waskaweb/controllers/statement.py
   trunk/waskaweb/controllers/template.py
   trunk/waskaweb/controllers/usersettings.py
   trunk/waskaweb/controllers/waska.py
   trunk/waskaweb/i18n/
   trunk/waskaweb/i18n/de/
   trunk/waskaweb/i18n/de/LC_MESSAGES/
   trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po
   trunk/waskaweb/i18n/waskaweb.pot
   trunk/waskaweb/lib/
   trunk/waskaweb/lib/__init__.py
   trunk/waskaweb/lib/app_globals.py
   trunk/waskaweb/lib/base.py
   trunk/waskaweb/lib/casedata.py
   trunk/waskaweb/lib/db_factory.py
   trunk/waskaweb/lib/evaluation.py
   trunk/waskaweb/lib/filters.py
   trunk/waskaweb/lib/formular_help.py
   trunk/waskaweb/lib/helpers.py
   trunk/waskaweb/lib/pdfimporter.py
   trunk/waskaweb/lib/renderer.py
   trunk/waskaweb/lib/security.py
   trunk/waskaweb/lib/template.py
   trunk/waskaweb/lib/validators.py
   trunk/waskaweb/model/
   trunk/waskaweb/model/__init__.py
   trunk/waskaweb/model/agency.py
   trunk/waskaweb/model/data.py
   trunk/waskaweb/model/document.py
   trunk/waskaweb/model/expr.py
   trunk/waskaweb/model/forms.py
   trunk/waskaweb/model/help.py
   trunk/waskaweb/model/io/
   trunk/waskaweb/model/io/__init__.py
   trunk/waskaweb/model/io/document.py
   trunk/waskaweb/model/io/factories.py
   trunk/waskaweb/model/io/parser.py
   trunk/waskaweb/model/navigation.py
   trunk/waskaweb/model/nodecomponents.py
   trunk/waskaweb/model/semantic.py
   trunk/waskaweb/model/statement.py
   trunk/waskaweb/model/user.py
   trunk/waskaweb/model/view.py
   trunk/waskaweb/public/
   trunk/waskaweb/public/images/
   trunk/waskaweb/public/images/BMFSFJ_C_M_web.jpg
   trunk/waskaweb/public/images/alert.png
   trunk/waskaweb/public/images/error_small.png
   trunk/waskaweb/public/images/eu_logo_4c_pos_web2.jpg
   trunk/waskaweb/public/images/icons/
   trunk/waskaweb/public/images/icons/arrow3_e.gif
   trunk/waskaweb/public/images/icons/form_help.png
   trunk/waskaweb/public/images/icons/trash.png
   trunk/waskaweb/public/images/icons/view.png
   trunk/waskaweb/public/images/logo_dlr.png
   trunk/waskaweb/public/images/logo_intevation.png
   trunk/waskaweb/public/images/logo_ka_75.png
   trunk/waskaweb/public/images/question.png
   trunk/waskaweb/public/js/
   trunk/waskaweb/public/js/check.js
   trunk/waskaweb/public/styles/
   trunk/waskaweb/public/styles/all.css
   trunk/waskaweb/public/styles/color3.css
   trunk/waskaweb/public/styles/ie6.css
   trunk/waskaweb/public/styles/old_css/
   trunk/waskaweb/public/styles/old_css/all.css
   trunk/waskaweb/public/styles/old_css/color3.css
   trunk/waskaweb/public/styles/old_css/print.css
   trunk/waskaweb/public/styles/old_css/screen.css
   trunk/waskaweb/public/styles/print.css
   trunk/waskaweb/public/styles/screen.css
   trunk/waskaweb/templates/
   trunk/waskaweb/templates/administration/
   trunk/waskaweb/templates/administration/account_deactivated.mako
   trunk/waskaweb/templates/administration/dialogs/
   trunk/waskaweb/templates/administration/dialogs/confirm_deleteuser.mako
   trunk/waskaweb/templates/administration/dialogs/confirm_resetpassword.mako
   trunk/waskaweb/templates/administration/dialogs/notificate_deleteuser.mako
   trunk/waskaweb/templates/administration/edit_settings.mako
   trunk/waskaweb/templates/administration/edit_user.mako
   trunk/waskaweb/templates/administration/new_user.mako
   trunk/waskaweb/templates/administration/new_user_result.mako
   trunk/waskaweb/templates/administration/overview_user.mako
   trunk/waskaweb/templates/administration/reset_password.mako
   trunk/waskaweb/templates/administration/settings.mako
   trunk/waskaweb/templates/administration/show_settings.mako
   trunk/waskaweb/templates/administration/show_user.mako
   trunk/waskaweb/templates/administration/show_user_body.mako
   trunk/waskaweb/templates/administration/userform_body.mako
   trunk/waskaweb/templates/appointments/
   trunk/waskaweb/templates/appointments/appointment_form.mako
   trunk/waskaweb/templates/appointments/beta/
   trunk/waskaweb/templates/appointments/beta/show_1.mako
   trunk/waskaweb/templates/appointments/beta/show_10.mako
   trunk/waskaweb/templates/appointments/beta/show_2.mako
   trunk/waskaweb/templates/appointments/beta/show_3.mako
   trunk/waskaweb/templates/appointments/beta/show_4.mako
   trunk/waskaweb/templates/appointments/beta/show_5.mako
   trunk/waskaweb/templates/appointments/beta/show_6.mako
   trunk/waskaweb/templates/appointments/beta/show_7.mako
   trunk/waskaweb/templates/appointments/beta/show_8.mako
   trunk/waskaweb/templates/appointments/beta/show_9.mako
   trunk/waskaweb/templates/appointments/dialogs/
   trunk/waskaweb/templates/appointments/dialogs/confirm.mako
   trunk/waskaweb/templates/appointments/dialogs/notificate_delete_appointment.mako
   trunk/waskaweb/templates/appointments/new.mako
   trunk/waskaweb/templates/appointments/overview.mako
   trunk/waskaweb/templates/appointments/overview_body.mako
   trunk/waskaweb/templates/appointments/show.mako
   trunk/waskaweb/templates/casemanagement/
   trunk/waskaweb/templates/casemanagement/appointments.mako
   trunk/waskaweb/templates/casemanagement/create_export_scheme.mako
   trunk/waskaweb/templates/casemanagement/dialogs/
   trunk/waskaweb/templates/casemanagement/dialogs/alert.mako
   trunk/waskaweb/templates/casemanagement/dialogs/confirm.mako
   trunk/waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako
   trunk/waskaweb/templates/casemanagement/dialogs/notificate_printall.mako
   trunk/waskaweb/templates/casemanagement/digest.mako
   trunk/waskaweb/templates/casemanagement/evaluation.mako
   trunk/waskaweb/templates/casemanagement/evaluation_result.mako
   trunk/waskaweb/templates/casemanagement/export.mako
   trunk/waskaweb/templates/casemanagement/formular.mako
   trunk/waskaweb/templates/casemanagement/help.mako
   trunk/waskaweb/templates/casemanagement/main.mako
   trunk/waskaweb/templates/casemanagement/new.mako
   trunk/waskaweb/templates/casemanagement/new_appointment.mako
   trunk/waskaweb/templates/casemanagement/organisation.mako
   trunk/waskaweb/templates/casemanagement/overview.mako
   trunk/waskaweb/templates/casemanagement/rg_aid_overview.mako
   trunk/waskaweb/templates/casemanagement/static_form.mako
   trunk/waskaweb/templates/casemanagement/static_form/
   trunk/waskaweb/templates/casemanagement/static_form/statement.mako
   trunk/waskaweb/templates/casemanagement/static_form/statement_print.mako
   trunk/waskaweb/templates/casemanagement/upload.mako
   trunk/waskaweb/templates/dialogs/
   trunk/waskaweb/templates/dialogs/alert.mako
   trunk/waskaweb/templates/dialogs/confirm.mako
   trunk/waskaweb/templates/dialogs/notification.mako
   trunk/waskaweb/templates/documents/
   trunk/waskaweb/templates/documents/case_new.mako
   trunk/waskaweb/templates/documents/case_overview.mako
   trunk/waskaweb/templates/documents/dialogs/
   trunk/waskaweb/templates/documents/dialogs/confirm.mako
   trunk/waskaweb/templates/documents/global_overview.mako
   trunk/waskaweb/templates/documents/global_upload.mako
   trunk/waskaweb/templates/documents/upload_body.mako
   trunk/waskaweb/templates/login.mako
   trunk/waskaweb/templates/logout.mako
   trunk/waskaweb/templates/main.mako
   trunk/waskaweb/templates/main_login.mako
   trunk/waskaweb/templates/start/
   trunk/waskaweb/templates/start/help.mako
   trunk/waskaweb/templates/start/responsible.mako
   trunk/waskaweb/templates/start/start.mako
   trunk/waskaweb/templates/statement/
   trunk/waskaweb/templates/statement/default_statement.mako
   trunk/waskaweb/templates/statement/dialogs/
   trunk/waskaweb/templates/statement/dialogs/confirm.mako
   trunk/waskaweb/templates/statement/dialogs/missing_statement.mako
   trunk/waskaweb/templates/statement/edit.mako
   trunk/waskaweb/templates/tests/
   trunk/waskaweb/templates/tests/forms.mako
   trunk/waskaweb/templates/tests/trace.mako
   trunk/waskaweb/templates/usersettings/
   trunk/waskaweb/templates/usersettings/change_password.mako
   trunk/waskaweb/templates/usersettings/change_password_login.mako
   trunk/waskaweb/templates/usersettings/dialogs/
   trunk/waskaweb/templates/usersettings/dialogs/notificate_setpassword.mako
   trunk/waskaweb/templates/usersettings/edit_standin.mako
   trunk/waskaweb/templates/usersettings/show_settings.mako
   trunk/waskaweb/tests/
   trunk/waskaweb/tests/__init__.py
   trunk/waskaweb/tests/functional/
   trunk/waskaweb/tests/functional/__init__.py
   trunk/waskaweb/tests/functional/test_administration.py
   trunk/waskaweb/tests/functional/test_appointment.py
   trunk/waskaweb/tests/functional/test_case.py
   trunk/waskaweb/tests/functional/test_document.py
   trunk/waskaweb/tests/functional/test_usersettings.py
   trunk/waskaweb/tests/functional/test_waska.py
   trunk/waskaweb/tests/test_models.py
   trunk/waskaweb/websetup.py
Log:
Load d58ebb2bf674 into trunk.


Added: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/ChangeLog	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,26 @@
+2007-10-21      Frank Koormann <frank.koormann at intevation.de>
+
+	* waskaweb/lib/helpers.py:
+	(getLogin): New, return login name from session
+	(getRole): New, return role from session (with translation)
+
+	* waskaweb/templates/main.mako:
+	Use getLogin and getRole to display status information
+
+2007-10-21      Frank Koormann <frank.koormann at intevation.de>
+
+	* waskaweb/templates/start/responsible.mako: 
+	Tippfehler korrigiert.
+
+2007-10-21      Frank Koormann <frank.koormann at intevation.de>
+
+	* waskaweb/templates/start/responsible.mako: 
+	Intevation Kontakt umgestellt, Tippfehler korrigiert.
+
+	* waskaweb/public/images/logo_intevation.png: Auf nontransparent 
+	antialiased aktualisiert, passt zu anderen Logos und sieht 
+	gefälliger aus.
+
+2007-10-21      Frank Koormann <frank.koormann at intevation.de>
+
+	* ChangeLog: ChangeLog angelegt

Added: trunk/Changelog.txt
===================================================================

Added: trunk/MANIFEST.in
===================================================================
--- trunk/MANIFEST.in	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/MANIFEST.in	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,2 @@
+recursive-include waskaweb/public *
+recursive-include waskaweb/templates *

Added: trunk/README.txt
===================================================================
--- trunk/README.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/README.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,19 @@
+This file is for you to describe the waskaweb application. Typically
+you would include information such as the information below:
+
+Installation and Setup
+======================
+
+Install ``waskaweb`` using easy_install::
+
+    easy_install waskaweb
+
+Make a config file as follows::
+
+    paster make-config waskaweb config.ini
+
+Tweak the config file as appropriate and then setup the application::
+
+    paster setup-app config.ini
+
+Then you are ready to go.

Added: trunk/development.ini
===================================================================
--- trunk/development.ini	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/development.ini	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,77 @@
+#
+# waskaweb - Pylons development environment configuration
+#
+# The %(here)s variable will be replaced with the parent directory of this file
+#
+[DEFAULT]
+debug = true
+# Uncomment and replace with the address which should receive any error reports
+#email_to = you at yourdomain.com
+smtp_server = localhost
+error_email_from = paste at localhost
+
+[server:main]
+use = egg:Paste#http
+host = 0.0.0.0
+port = 5001
+
+[app:main]
+use = egg:waskaweb
+lang = de 
+full_stack = true
+cache_dir = %(here)s/data
+beaker.session.key = waskaweb
+beaker.session.secret = somesecret
+
+# If you'd like to fine-tune the individual locations of the cache data dirs
+# for the Cache data, or the Session saves, un-comment the desired settings
+# here:
+#beaker.cache.data_dir = %(here)s/data/cache
+#beaker.session.data_dir = %(here)s/data/sessions
+
+# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
+# Debug mode will enable the interactive debugging tool, allowing ANYONE to
+# execute malicious code after an exception is raised.
+#set debug = false 
+
+#Authkit
+#authkit.setup.method = form, cookie
+#authkit.form.authenticate.user.data = anton:admin
+#authkit.cookie.secret = random string
+#authkit.cookie.secret = c040503178d7eca202b416398671a50f75afa86be6e1938a5e75b55a52d14026 
+#authkit.cookie.params = {expires:'10'}
+#authkit.form.template.obj = waskaweb.lib.template:make_template
+#authkit.cookie.signoutpath = /waska/logout 
+
+#authkit.method.formauthenticate.function = waskaweb.lib.security:checkLogin
+#authkit.form.authenticate.function = waskaweb.lib.security:checkLogin
+
+# Logging configuration
+[loggers]
+keys = root, waskaweb
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_waskaweb]
+level = DEBUG
+handlers =
+qualname = waskaweb
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
+

Added: trunk/development_wsgi.ini
===================================================================
--- trunk/development_wsgi.ini	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/development_wsgi.ini	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,95 @@
+#
+# waskaweb - Pylons development environment configuration
+#
+# The %(here)s variable will be replaced with the parent directory of this file
+#
+[DEFAULT]
+debug = true
+# Uncomment and replace with the address which should receive any error reports
+#email_to = you at yourdomain.com
+smtp_server = localhost
+error_email_from = paste at localhost
+formed_tree = ../../formed/formedtree_web.xml
+upload_dir = /uploads
+maintenance_db = waska_maintenance
+
+# for connections to PostgeSQL database
+# db_database: %s will be replaced by certificate value
+# db_user:     first %s -> database name, second %s -> user
+db_database = ka_%s_db
+db_user     = ka_%s_%s
+db_host     = 192.168.11.17
+db_port     = 5434
+
+# for connections to PDF2XFA server
+pdf2xfa_host = 192.168.11.17
+pdf2xfa_port = 1111
+
+[server:main]
+use = egg:Paste#http
+host = 0.0.0.0
+port = 5001
+
+[app:main]
+use = egg:waskaweb
+lang = de 
+full_stack = true
+cache_dir = /usr/local/wsgi/waska_data
+beaker.session.key = waskaweb
+beaker.session.secret = somesecret
+beaker.session.timeout = 1800 
+#beaker.session.type = memory 
+#beaker.session.invalidate_corrupt = True
+
+# If you'd like to fine-tune the individual locations of the cache data dirs
+# for the Cache data, or the Session saves, un-comment the desired settings
+# here:
+#beaker.cache.data_dir = %(here)s/data/cache
+#beaker.session.data_dir = %(here)s/data/sessions
+
+# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
+# Debug mode will enable the interactive debugging tool, allowing ANYONE to
+# execute malicious code after an exception is raised.
+#set debug = false 
+
+#Authkit
+#authkit.setup.method = form, cookie
+#authkit.form.authenticate.user.data = anton:admin
+#authkit.cookie.secret = random string
+#authkit.cookie.secret = c040503178d7eca202b416398671a50f75afa86be6e1938a5e75b55a52d14026 
+#authkit.cookie.params = {expires:'10'}
+#authkit.form.template.obj = waskaweb.lib.template:make_template
+#authkit.cookie.signoutpath = /waska/logout 
+
+#authkit.method.formauthenticate.function = waskaweb.lib.security:checkLogin
+#authkit.form.authenticate.function = waskaweb.lib.security:checkLogin
+
+# Logging configuration
+[loggers]
+keys = root, waskaweb
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_waskaweb]
+level = DEBUG
+handlers =
+qualname = waskaweb
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
+

Added: trunk/docs/index.txt
===================================================================
--- trunk/docs/index.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/docs/index.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,12 @@
+waskaweb
+++++++++
+
+This is the main index page of your documentation. It should be written in
+`reStructuredText format <http://docutils.sourceforge.net/rst.html>`_.
+
+You can generate your documentation in HTML format by running this command::
+
+    setup.py pudge
+
+For this to work you will need to download and install ``buildutils`` and
+``pudge``.

Added: trunk/ez_setup/README.txt
===================================================================
--- trunk/ez_setup/README.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/ez_setup/README.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,15 @@
+This directory exists so that Subversion-based projects can share a single
+copy of the ``ez_setup`` bootstrap module for ``setuptools``, and have it
+automatically updated in their projects when ``setuptools`` is updated.
+
+For your convenience, you may use the following svn:externals definition::
+
+    ez_setup svn://svn.eby-sarna.com/svnroot/ez_setup
+
+You can set this by executing this command in your project directory::
+
+    svn propedit svn:externals .
+
+And then adding the line shown above to the file that comes up for editing.
+Then, whenever you update your project, ``ez_setup`` will be updated as well.
+

Added: trunk/ez_setup/__init__.py
===================================================================
--- trunk/ez_setup/__init__.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/ez_setup/__init__.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,234 @@
+#!python
+"""Bootstrap setuptools installation
+
+If you want to use setuptools in your package's setup.py, just include this
+file in the same directory with it, and add this to the top of your setup.py::
+
+    from ez_setup import use_setuptools
+    use_setuptools()
+
+If you want to require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, you can do so by supplying
+the appropriate options to ``use_setuptools()``.
+
+This file can also be run as a script to install or upgrade setuptools.
+"""
+import sys
+DEFAULT_VERSION = "0.6c7"
+DEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
+
+md5_data = {
+    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
+    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
+    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
+    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
+    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
+    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
+    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
+    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
+    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
+    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
+    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
+    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
+    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
+    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
+    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
+    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
+    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
+    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
+    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
+    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
+    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
+    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
+    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
+    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
+    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
+    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
+    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
+}
+
+import sys, os
+
+def _validate_md5(egg_name, data):
+    if egg_name in md5_data:
+        from md5 import md5
+        digest = md5(data).hexdigest()
+        if digest != md5_data[egg_name]:
+            print >>sys.stderr, (
+                "md5 validation of %s failed!  (Possible download problem?)"
+                % egg_name
+            )
+            sys.exit(2)
+    return data
+
+
+def use_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    download_delay=15
+):
+    """Automatically find/download setuptools and make it available on sys.path
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end with
+    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
+    it is not already available.  If `download_delay` is specified, it should
+    be the number of seconds that will be paused before initiating a download,
+    should one be required.  If an older version of setuptools is installed,
+    this routine will print a message to ``sys.stderr`` and raise SystemExit in
+    an attempt to abort the calling script.
+    """
+    try:
+        import setuptools
+        if setuptools.__version__ == '0.0.1':
+            print >>sys.stderr, (
+            "You have an obsolete version of setuptools installed.  Please\n"
+            "remove it from your system entirely before rerunning this script."
+            )
+            sys.exit(2)
+    except ImportError:
+        egg = download_setuptools(version, download_base, to_dir, download_delay)
+        sys.path.insert(0, egg)
+        import setuptools; setuptools.bootstrap_install_from = egg
+
+    import pkg_resources
+    try:
+        pkg_resources.require("setuptools>="+version)
+
+    except pkg_resources.VersionConflict, e:
+        # XXX could we install in a subprocess here?
+        print >>sys.stderr, (
+            "The required version of setuptools (>=%s) is not available, and\n"
+            "can't be installed while this script is running. Please install\n"
+            " a more recent version first.\n\n(Currently using %r)"
+        ) % (version, e.args[0])
+        sys.exit(2)
+
+def download_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    delay = 15
+):
+    """Download setuptools from a specified location and return its filename
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end
+    with a '/'). `to_dir` is the directory where the egg will be downloaded.
+    `delay` is the number of seconds to pause before an actual download attempt.
+    """
+    import urllib2, shutil
+    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
+    url = download_base + egg_name
+    saveto = os.path.join(to_dir, egg_name)
+    src = dst = None
+    if not os.path.exists(saveto):  # Avoid repeated downloads
+        try:
+            from distutils import log
+            if delay:
+                log.warn("""
+---------------------------------------------------------------------------
+This script requires setuptools version %s to run (even to display
+help).  I will attempt to download it for you (from
+%s), but
+you may need to enable firewall access for this script first.
+I will start the download in %d seconds.
+
+(Note: if this machine does not have network access, please obtain the file
+
+   %s
+
+and place it in this directory before rerunning this script.)
+---------------------------------------------------------------------------""",
+                    version, download_base, delay, url
+                ); from time import sleep; sleep(delay)
+            log.warn("Downloading %s", url)
+            src = urllib2.urlopen(url)
+            # Read/write all in one block, so we don't create a corrupt file
+            # if the download is interrupted.
+            data = _validate_md5(egg_name, src.read())
+            dst = open(saveto,"wb"); dst.write(data)
+        finally:
+            if src: src.close()
+            if dst: dst.close()
+    return os.path.realpath(saveto)
+
+def main(argv, version=DEFAULT_VERSION):
+    """Install or upgrade setuptools and EasyInstall"""
+
+    try:
+        import setuptools
+    except ImportError:
+        egg = None
+        try:
+            egg = download_setuptools(version, delay=0)
+            sys.path.insert(0,egg)
+            from setuptools.command.easy_install import main
+            return main(list(argv)+[egg])   # we're done here
+        finally:
+            if egg and os.path.exists(egg):
+                os.unlink(egg)
+    else:
+        if setuptools.__version__ == '0.0.1':
+            # tell the user to uninstall obsolete version
+            use_setuptools(version)
+
+    req = "setuptools>="+version
+    import pkg_resources
+    try:
+        pkg_resources.require(req)
+    except pkg_resources.VersionConflict:
+        try:
+            from setuptools.command.easy_install import main
+        except ImportError:
+            from easy_install import main
+        main(list(argv)+[download_setuptools(delay=0)])
+        sys.exit(0) # try to force an exit
+    else:
+        if argv:
+            from setuptools.command.easy_install import main
+            main(argv)
+        else:
+            print "Setuptools version",version,"or greater has been installed."
+            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
+
+
+
+def update_md5(filenames):
+    """Update our built-in md5 registry"""
+
+    import re
+    from md5 import md5
+
+    for name in filenames:
+        base = os.path.basename(name)
+        f = open(name,'rb')
+        md5_data[base] = md5(f.read()).hexdigest()
+        f.close()
+
+    data = ["    %r: %r,\n" % it for it in md5_data.items()]
+    data.sort()
+    repl = "".join(data)
+
+    import inspect
+    srcfile = inspect.getsourcefile(sys.modules[__name__])
+    f = open(srcfile, 'rb'); src = f.read(); f.close()
+
+    match = re.search("\nmd5_data = {\n([^}]+)}", src)
+    if not match:
+        print >>sys.stderr, "Internal error!"
+        sys.exit(2)
+
+    src = src[:match.start(1)] + repl + src[match.end(1):]
+    f = open(srcfile,'w')
+    f.write(src)
+    f.close()
+
+
+if __name__=='__main__':
+    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
+        update_md5(sys.argv[2:])
+    else:
+        main(sys.argv[1:])
+
+
+
+
+

Added: trunk/formed/aid_plan_statement.html
===================================================================
--- trunk/formed/aid_plan_statement.html	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/formed/aid_plan_statement.html	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>Förderplan</title>
+<meta name="generator" content="Bluefish 1.0.7">
+<meta name="date" content="2007-11-15T22:10:58+0100">
+<meta name="copyright" content="Intevation GmbH">
+<meta name="keywords" content="">
+<meta name="description" content="">
+<meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8">
+<meta http-equiv="content-style-type" content="text/css">
+<meta http-equiv="expires" content="0">
+<link href="/styles/all.css" media="all" rel="stylesheet" type="text/css">
+<link href="/styles/print.css'" media="screen" rel="stylesheet" type="text/css">
+<link href="/styles/print.css}" media="print" rel="stylesheet" type="text/css">
+<style type="text/css">
+.statement_content {
+	margin-bottom: 5em;
+}
+.statement_signs {
+	margin: 4em 0;
+}
+</style>
+<script type="text/javascript">
+<!--
+
+// -->
+</script>
+<body>
+<h1>Förderplan</h1>
+<div class="statement_content">
+<p>Die im folgenden aufgeführten Unterstützungsangebote sind gemeinsam vereinbart worden.<br>
+Beide Seiten bemühen sich um bestmögliche Umsetzung des Förderplans.</p>
+</div>
+<div class="statement_content">
+$ANGEBOTE
+</div>
+<div class="statement_signs">
+<table cellspacing=5 cellpadding=0 width="100%" border=0>
+  <tbody>
+  <tr>
+    <td style="text-align: left; border:0">_________________, den __.__.____</td>
+    <td style="text-align: right; border:0">________________, den __.__.____</td>
+  </tr>
+  <tr>
+    <td style="height: 5em; vertical-align: bottom;  text-align: left; border:0">(
+    $VORNAME $NACHNAME )</td>
+    <td style="height: 5em; vertical-align: bottom; text-align: right; border:0">( MitarbeiterIn der KA )</td>
+   </tr>
+  </tbody>
+</table>
+</div>
+</body>
+</html>

Added: trunk/formed/formedtree_web.xml
===================================================================
--- trunk/formed/formedtree_web.xml	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/formed/formedtree_web.xml	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,1562 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document>
+  <page name="page_einverstaendnis" containers="a">
+    <bool formularname="Optionsfeldliste" description="Einverständniserklärung liegt vor" name="einverstaendniserklaerung" target="a"/>
+  </page>
+  <page formularname="Zuständigkeiten" description="Zuständigkeiten, Eingangsdaten" name="page_0" containers="a,b">
+    <info value="Zuständigkeiten, Eingangsdaten" name="info-0" target="a" invisible="1"/>
+    <group description="Zuständigkeiten, Eingangsdaten" name="zustaendigkeiteneingangsdaten" target="b" invisible="1" containers="a,b,c,d,e,f,g,h">
+      <text formularname="FKZ" description="Förderkennzeichen der Kompetenzagentur" maxlength="60" name="fkz" target="a" size="50"/>
+      <text formularname="Name_Kompetenzagentur" description="Name der Kompetenzagentur" maxlength="60" name="name_kompetenzagentur" target="b" size="50"/>
+      <group description="Name des zuständigen Mitarbeiters in der Kompetenzagentur" name="namedeszustaendigenmitarbeitersinderkompetenzagentur" target="c">
+        <text formularname="Vorname" description="Vorname" maxlength="60" name="vorname" size="50"/>
+        <text formularname="Name" description="Name" maxlength="255" name="name" size="40"/>
+      </group>
+      <date formularname="Erstgespräch" description="Datum des Erstgespräches mit dem Jugendlichen" name="erstgespraech" target="d"/>
+      <choice formularname="Zugang_Kompetenzagentur" description="Zugang des Jugendlichen zur Kompetenzagentur" name="zugang_kompetenzagentur" target="e" size="1">
+        <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+        <bool description="eigenständiger Zugang des Jugendlichen" value="0" name="eigenstaendigerzugangdesjugendlichen"/>
+        <bool description="Familie" value="1" name="familie"/>
+        <bool description="Verwandte" value="2" name="verwandte"/>
+        <bool description="Freunde" value="3" name="freunde"/>
+        <bool description="Lehrer/Lehrerin" value="4" name="lehrerlehrerin"/>
+        <bool description="andere Menschen aus dem sozialen Umfeld des Jugendlichen" value="5" name="anderemenschenausdemsozialenumfelddesjugendlichen"/>
+        <bool description="Agentur für Arbeit" value="6" name="agenturfuerarbeit"/>
+        <bool description="SGB II -Träger" value="7" name="sgbii_traeger"/>
+        <bool description="Jugendamt" value="8" name="jugendamt"/>
+        <bool description="Jugendhilfeeinrichtung" value="9" name="jugendhilfeeinrichtung"/>
+        <bool description="Schule" value="10" name="schule"/>
+        <bool description="Streetwork" value="11" name="streetwork"/>
+        <bool description="Beratungsstelle" value="12" name="beratungsstelle"/>
+        <bool description="Unternehmen" value="13" name="unternehmen"/>
+        <bool description="Kompetenzagentur" value="14" name="kompetenzagentur"/>
+        <bool description="Sonstiges" value="-2" name="sonstiges"/>
+      </choice>
+      <text formularname="Kundennummer" description="Kundennummer bei der Kompetenzagentur" maxlength="100" name="kundennummer" target="f" size="50" modes="-mode1.1anon"/>
+      <group description="Bei Eintritt ist der Jugendliche (Mehrfachantworten möglich)" name="beieintrittistderjugendlichemehrfachantwortenmoeglich" target="g" containers="a,b">
+        <bool formularname="schulpflichtig" description="schulpflichtig" name="schulpflichtig" target="a"/>
+        <bool formularname="noch_Schüler" description="noch Schülerin/Schüler" name="noch_schueler" target="a"/>
+        <choice formularname="Bei_Eintritt_ist_der_Jugendliche" description=" " name="bei_eintritt_ist_der_jugendliche" target="b" size="1">
+          <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="in der Schule" value="0" name="inderschule"/>
+          <bool description="in der Ausbildung" value="1" name="inderausbildung"/>
+          <bool description="in Arbeit" value="2" name="inarbeit"/>
+          <bool description="arbeitslos" value="3" name="arbeitslos"/>
+          <bool description="in der Erziehungszeit" value="4" name="indererziehungszeit"/>
+        </choice>
+      </group>
+      <choice formularname="Rechtlicher_Kontext" description="Rechtlicher Kontext" name="rechtlicher_kontext" target="h" size="1">
+        <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+        <bool description="SGB II" value="0" name="sgbii"/>
+        <bool description="SGB III" value="1" name="sgbiii"/>
+        <bool description="SGB VIII" value="2" name="sgbviii"/>
+        <bool description="ungeklärt" value="3" name="ungeklaert"/>
+      </choice>
+      <choice formularname="Schnittstelle_zu" description="Schnittstelle zu" name="schnittstelle_zu" target="h" size="1">
+        <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+        <bool description="SGB II" value="0" name="sgbii"/>
+        <bool description="SGB III" value="1" name="sgbiii"/>
+        <bool description="SGB VIII" value="2" name="sgbviii"/>
+        <bool description="ungeklärt" value="3" name="ungeklaert"/>
+      </choice>
+    </group>
+  </page>
+  <group formularname="rg_kontakte" description="Kontaktdaten" name="rg_kontakte">
+    <page formularname="page_25" description="Kontaktdaten" name="page_25" containers="0,a,b,c,d,e,f">
+      <info description="Kontaktdaten" value="Kontaktdaten" name="info-28" target="0" invisible="s"/>
+      <text formularname="Kontaktdaten_ARGE" description="Kontaktdaten ARGE/Optionskommune" maxlength="100" name="kontaktdaten_arge" target="a" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kundennummer_ARGE" description="Kundennummer ARGE/Optionskommune" maxlength="100" name="kundennummer_arge" target="a" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kontaktdaten_Agentur_für_Arbeit" description="Kontaktdaten Agentur für Arbeit" maxlength="100" name="kontaktdaten_agentur_fuer_arbeit" target="b" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kundennummer_Agentur_für_Arbeit" description="Kundennummer Agentur für Arbeit" maxlength="100" name="kundennummer_agentur_fuer_arbeit" target="b" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kundennummer_Jugendamt" description="Kontaktdaten Jugendamt" maxlength="100" name="kundennummer_jugendamt" target="c" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kontaktdaten_Jugendamt" description="Kundennummer Jugendamt" maxlength="100" name="kontaktdaten_jugendamt" target="c" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kontaktdaten_Schule" description="Kontaktdaten Schule" maxlength="100" name="kontaktdaten_schule" target="d" size="50" modes="-mode1.1anon"/>
+      <text formularname="Schulname" description="Schulname" maxlength="100" name="schulname" target="d" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kontaktdaten_Gerichtshilfe" description="Kontaktdaten Gerichtshilfe" maxlength="100" name="kontaktdaten_gerichtshilfe" target="e" size="50" modes="-mode1.1anon"/>
+      <text formularname="Kundennummer_Gerichtshilfe" description="Kundennummer Gerichtshilfe" maxlength="30" name="kundennummer_gerichtshilfe" target="e" size="20" modes="-mode1.1anon"/>
+      <textarea rows="7" formularname="Kontaktdaten_weitere_Institutionen" description="Kontaktdaten weitere Institutionen" cols="80" name="kontaktdaten_weitere_institutionen" target="f" modes="-mode1.1anon"/>
+    </page>
+  </group>
+  <page formularname="Personenangaben" description="Angaben zur Person" name="page_1" containers="a,b">
+    <info value="Angaben zur Person" name="info-1" target="a" invisible="s"/>
+    <group description="Angaben  zur Person" name="angabenzurperson" target="b" invisible="s" containers="a,b,c,d">
+      <group description="Persönliche Daten" name="persoenlichedaten" target="a" containers="a,b,c">
+        <text formularname="Vorname" description="Vorname" maxlength="60" name="vorname_1" target="a" size="40" modes="-mode1.1anon"/>
+        <text formularname="Name" description="Name" maxlength="60" name="name_1" target="a" size="40" modes="-mode1.1anon"/>
+        <choice formularname="Geschlecht" description="Geschlecht" name="geschlecht" target="b" size="1">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="weiblich" value="0" name="weiblich"/>
+          <bool description="männlich" value="1" name="maennlich"/>
+          <bool description="intersexuell" value="2" name="intersexuell"/>
+        </choice>
+        <date formularname="Geburtsdatum" description="Geburtsdatum" name="geburtsdatum" target="b" modes="-mode1.1anon"/>
+        <choice formularname="Familienstand" description="Familienstand" name="familienstand" size="1">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="ledig" value="0" name="ledig"/>
+          <bool description="verheiratet" value="1" name="verheiratet"/>
+          <bool description="geschieden" value="2" name="geschieden"/>
+          <bool description="verwitwet" value="3" name="verwitwet"/>
+          <bool description="getrennt lebend" value="4" name="getrenntlebend"/>
+        </choice>
+      </group>
+      <group description="Anschrift" name="anschrift" target="b" containers="a,b,c">
+        <text formularname="Straße" description="Straße und Nummer" maxlength="200" name="strasse" target="a" size="50" modes="-mode1.1anon"/>
+        <text formularname="PLZ" description="PLZ" maxlength="60" name="plz" target="b:25" size="10"/>
+        <text formularname="Wohnort" description="Wohnort" maxlength="60" name="wohnort" target="b:75" size="40" modes="-mode1.1anon"/>
+        <choice formularname="Groesse_Wohnort" description="Größe des Wohnortes" name="groesse_wohnort" target="c" size="1">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="Großstadt (&gt; 100.000 Einwohner)" value="0" name="grossstadt100000einwohner"/>
+          <bool description="Mittelstadt (20.000 - 100.000 Einwohner)" value="1" name="mittelstadt20000_100000einwohner"/>
+          <bool description="Kleinstadt (&lt; 20.000 Einwohner)" value="2" name="kleinstadt20000einwohner"/>
+          <bool description="Ländliche Region" value="3" name="laendlicheregion"/>
+        </choice>
+      </group>
+      <group description=" Telefonnummern / Email" name="telefonnummernemail" target="c" containers="a,b,c" modes="-mode1.1anon">
+        <text formularname="Vorwahl" description="Ortswahl" maxlength="60" name="vorwahl" target="a:25" size="20"/>
+        <text formularname="Telefon_1" description="Telefonnr." maxlength="60" name="telefon_1" target="a:25" size="20"/>
+        <text formularname="Mobiltelefon" description="Mobiltelefon" maxlength="120" name="mobiltelefon" target="a:50" size="40"/>
+        <text formularname="Email" description="E-Mail" maxlength="120" name="email" target="b" size="60"/>
+        <textarea rows="5" formularname="telefon_sonstige" description="weitere Telefonnummern" cols="80" name="telefon_sonstige" target="c"/>
+      </group>
+      <group description="Sonstige Angaben" name="sonstigeangaben" target="d" containers="a,b,c,d,e,f">
+        <text formularname="Zweiter_Wohnort" description="Zweiter Wohnort (Anschrift)" maxlength="120" name="zweiter_wohnort" target="a" size="100" modes="-mode1.1anon"/>
+        <choice formularname="Geburtsland" description="Geburtsland" name="geburtsland" target="b:50" size="1">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <external-choice value="laender.xml" name="external-choice-1"/>
+          <bool description="Sonstiges" value="-2" name="sonstiges"/>
+        </choice>
+        <text formularname="Geburtsland_sonstige_nennung" description="Nennung sonstiges Geburtsland" maxlength="60" name="geburtsland_sonstige_nennung" target="b" size="40" modes="default"/>
+        <choice formularname="Muttersprache" description="Muttersprache" name="muttersprache" target="c:50" size="1">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <external-choice value="sprachen.xml" name="external-choice-0"/>
+          <bool description="Sonstige" value="-2" name="sonstige"/>
+        </choice>
+        <text formularname="Muttersprache_sonstige_nennung" description="Nennung sonstige Muttersprache" maxlength="60" name="muttersprache_sonstige_nennung" target="c" size="40" modes="default"/>
+        <choice formularname="Staatsangehörigkeit" description="Staatsangehörigkeit" name="staatsangehoerigkeit" target="d:50" size="1">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <external-choice value="staatsangehoerigkeit.xml" name="external-choice-9"/>
+          <bool description="Sonstige" value="-2" name="sonstige"/>
+        </choice>
+        <text formularname="Staatsangehörigkeit_sonstige_nennung" description="Nennung sonstige Staatsangehörigkeit" maxlength="60" name="staatsangehoerigkeit_sonstige_nennung" target="c" size="40" modes="default"/>
+        <choice formularname="Aufenthaltsstatus" description="Aufenthaltsstatus" name="aufenthaltsstatus" target="d:50" size="1">
+          <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="Aufenthaltserlaubnis" value="0" name="aufenthaltserlaubnis"/>
+          <bool description="Niederlassungserlaubnis" value="1" name="niederlassungserlaubnis"/>
+          <bool description="Aufenthaltsgestattung" value="2" name="aufenthaltsgestattung"/>
+          <bool description="Duldung" value="3" name="duldung"/>
+          <bool description="Aufenthaltserlaubnis - EG" value="4" name="aufenthaltserlaubnis_eg"/>
+          <bool description="Visum" value="5" name="visum"/>
+          <bool description="keine" value="6" name="keine"/>
+          <bool description="unbekannt" value="7" name="unbekannt"/>
+        </choice>
+        <int formularname="Aufenthaltsdauer" description="Aufenthalt in Deutschland (Jahr)" maxvalue="0" name="aufenthaltsdauer" target="d" minvalue="9999"/>
+        <choice formularname="Vater" description="Ist der Vater des Jugendlichen in Deutschland geboren worden?" name="vater" target="e" size="1" modes="-mode1.1,-mode1.0">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="Ja" value="1" name="Ja"/>
+          <bool description="Nein" value="0" name="Nein"/>
+        </choice>
+        <choice formularname="Mutter" description="Ist die Mutter des Jugendlichen in Deutschland geboren worden?" name="mutter" target="f" size="1" modes="-mode1.1,-mode1.0">
+          <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="Ja" value="1" name="Ja"/>
+          <bool description="Nein" value="0" name="Nein"/>
+        </choice>
+      </group>
+    </group>
+  </page>
+  <group description="Biographische Daten" name="3biographischedaten">
+    <page description="Familiäre Situation" name="page_2" containers="a,b">
+      <info value="Biografische Daten" name="info-2" target="a" invisible="s"/>
+      <group formularname="Familiäre_Situation" description="Familiäre Situation" name="familiaere_situation" target="b" invisible="s" containers="b,c,d,e">
+        <info value="Familiäre Situation" name="info-3" invisible="s"/>
+        <group description="Sorgeberechtigte  (nur bei Minderjährigen erfassen)" name="sorgeberechtigtenurbeiminderjaehrigenerfassen" target="b" containers="a,b,c,d,e">
+          <choice formularname="Familiäre_Situation" description="Sorgeberechtigte" name="familiaere_situation_1" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool formularname="Mutter_Vater" description="Mutter und Vater" value="0" name="mutter_vater" alternative="Mutter_Vater"/>
+            <bool formularname="Mutter" description="Mutter" value="1" name="mutter_1" alternative="Mutter"/>
+            <bool formularname="Vater" description="Vater" value="2" name="vater_1" alternative="Vater"/>
+            <bool formularname="Amtsvormund" description="Amtsvormund" value="3" name="amtsvormund" alternative="Amtsvormund"/>
+            <bool formularname="andere_Verwandte" description="andere Verwandte" value="4" name="andere_verwandte" alternative="andere_Verwandte"/>
+            <bool formularname="Pflegefamilie" description="Pflegefamilie" value="5" name="pflegefamilie" alternative="Pflegefamilie"/>
+          </choice>
+          <group description="Angaben zu einem Sorgeberechtigten" name="angabenzueinemsorgeberechtigten" target="b" containers="a,b,c" modes="-mode1.1anon">
+            <text formularname="Vorname" description="Vorname" maxlength="60" name="vorname_2" target="a" size="40"/>
+            <text formularname="Name" description="Name" maxlength="60" name="name_2" target="a" size="40"/>
+            <text formularname="Vorwahl_1" description="Ortsvorwahl" maxlength="60" name="vorwahl_1" target="b:25" size="20"/>
+            <text formularname="Telefon_1" description="Telefonnr." maxlength="60" name="telefon_1_1" target="b:25" size="20"/>
+            <text formularname="Mobiltelefon" description="Mobiltelefon" maxlength="60" name="mobiltelefon_1" target="b:50" size="40"/>
+            <text formularname="Email" description="E-Mail" maxlength="120" name="email_1" target="c" size="40"/>
+          </group>
+        </group>
+        <group description="Angaben zu Geschwistern" name="angabenzugeschwistern" target="c">
+          <int formularname="Geschwister" description="Anzahl der Geschwister" maxvalue="99" name="geschwister" minvalue="0"/>
+        </group>
+        <group formularname="Kinder" description="Eigene Kinder des Jugendlichen" name="kinder" target="d" containers="a,b">
+          <int formularname="Anzahl_Kinder" description="Anzahl der eigenen Kinder des Jugendlichen" maxvalue="99" name="anzahl_kinder" target="a" minvalue="0"/>
+          <int formularname="Haushalt_Jugendlicher" description="Wie viele leben im Haushalt des Jugendlichen?" maxvalue="99" name="haushalt_jugendlicher" target="a" minvalue="0"/>
+          <choice formularname="Alleinerziehend" description="Alleinerziehend" name="alleinerziehend" target="b" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+        </group>
+        <group formularname="Sozioökonomische_Lage" description="Sozioökonomische Lage" name="soziooekonomische_lage" target="e" containers="a,b,c" modes="-mode1.0">
+          <group description="Familieneinkommen durch" name="familieneinkommendurch" target="a">
+            <bool formularname="Familie_selbstständig" description="erwerbstätig/selbständig" value="1" name="familie_selbststaendig"/>
+            <bool formularname="Familie_staatliche_Unterstützung" description="staatliche Unterstützungsleistungen (z.B. Arbeitslosengeld I, II)" value="0" name="familie_staatliche_unterstuetzung"/>
+          </group>
+          <group formularname="Einkommen des Jugendlichen durch" description="Einkommen des Jugendlichen durch" name="einkommendesjugendlichendurch" target="b">
+            <bool formularname="Jugendlicher_selbstständig" description="erwerbstätig/selbständig" value="0" name="jugendlicher_selbststaendig"/>
+            <bool formularname="Jugendlicher_staatliche_Unterstützung" description="staatliche Unterstützungsleistungen (z.B. Arbeitslosengeld I, II)" value="1" name="jugendlicher_staatliche_unterstuetzung"/>
+            <bool formularname="Jugendlicher_Unterstützung_soziales_Umfeld" description="Unterstützung durch Personen im sozialem Umfeld (z.B. Eltern, Partner)" value="2" name="jugendlicher_unterstuetzung_soziales_umfeld"/>
+          </group>
+          <choice formularname="Wohnaufenthalt" description="Wohnaufenthalt überwiegend" name="wohnaufenthalt" target="c" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="im elterlichen Haushalt" value="0" name="imelterlichenhaushalt"/>
+            <bool description="bei Geschwistern" value="1" name="beigeschwistern"/>
+            <bool description="bei anderen Verwandten" value="2" name="beianderenverwandten"/>
+            <bool description="bei Eltern von Partnerin/Partner" value="3" name="beielternvonpartnerinpartner"/>
+            <bool description="bei Freunden/Bekannten" value="4" name="beifreundenbekannten"/>
+            <bool description="in eigener Wohnung" value="5" name="ineigenerwohnung"/>
+            <bool description="in eigener Wohnung mit Partnerin/Partner" value="6" name="ineigenerwohnungmitpartnerinpartner"/>
+            <bool description="in Wohnung von Partnerin/Partner" value="7" name="inwohnungvonpartnerinpartner"/>
+            <bool description="in Wohngemeinschaft" value="8" name="inwohngemeinschaft"/>
+            <bool description="im Wohnheim/Internat" value="9" name="imwohnheiminternat"/>
+            <bool description="betreute Wohnform" value="10" name="betreutewohnform"/>
+            <bool description="obdachlos/auf der Strasse" value="11" name="obdachlosaufderstrasse"/>
+            <bool description="Sonstiges" value="-2" name="sonstiges"/>
+          </choice>
+        </group>
+      </group>
+    </page>
+    <page description="Gesundheitliche Situation" name="page_3">
+      <group formularname="GesundheitlicheSittuation" description="Gesundheitliche Situation" name="gesundheitlichesittuation" invisible="s" containers="b,c">
+        <info value="Gesundheitliche Situation" name="info-4" invisible="s"/>
+        <group description="physische Beeinträchtigungen" name="physischebeeintraechtigungen" target="b">
+          <bool formularname="arzt_gutachten_physisch" description="Ärztliches Gutachten oder Ähnliches liegt vor (§28 Abs. 7 BDSG)" name="arzt_gutachten_physisch" modes="default"/>
+          <choice formularname="physische_Beeinträchtigungen" description="physische Beeinträchtigungen" name="physische_beeintraechtigungen" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <text formularname="physische_Beeinträchtigungen_text" description="Sonstige physische Beeinträchtigungen" maxlength="60" name="physische_beeintraechtigungen_text" size="40"/>
+        </group>
+        <group description="psychische Beeinträchtigungen" name="psychischebeeintraechtigungen" target="c">
+          <bool formularname="arzt_gutachten_psychisch" description="Ärztliches Gutachten oder Ähnliches liegt vor (§28 Abs. 7 BDSG)" name="arzt_gutachten_psychisch" modes="default"/>
+          <choice formularname="psychische_Beeinträchtigungen" description="psychische Beeinträchtigungen" name="psychische_beeintraechtigungen" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <text formularname="psychische_Beeinträchtigungen_text" description="Sonstige psychische Beeinträchtigungen" maxlength="60" name="psychische_beeintraechtigungen_text" size="40"/>
+        </group>
+      </group>
+    </page>
+    <page description="Soziale Lage" name="page_4">
+      <group formularname="SozialeLage" description="Soziale Lage" name="sozialelage" invisible="s" containers="a,b,c,d">
+        <info value="Soziale Lage" name="info-27" target="a" invisible="s"/>
+        <group description="Bezugspersonen (Mehrfachantwort möglich)" name="bezugspersonenmehrfachantwortmoeglich" target="b">
+          <bool formularname="Mutter" description="Mutter" name="mutter_2"/>
+          <bool formularname="Vater" description="Vater" name="vater_2"/>
+          <bool formularname="Großeltern" description="Großeltern" name="grosseltern"/>
+          <bool description="Geschwister" name="geschwister_2"/>
+          <bool formularname="Pflegefamilie" description="Pflegefamilie" name="pflegefamilie_1"/>
+          <bool formularname="Stiefmutter" description="Stiefmutter" name="stiefmutter"/>
+          <bool formularname="Stiefvater" description="Stiefvater" name="stiefvater"/>
+          <bool formularname="Verwandte" description="Verwandte" name="verwandte_1"/>
+          <bool formularname="Partner" description="Partnerin/Partner" name="partner"/>
+          <bool formularname="HeimbetreuerIn" description="Betreuerin/Betreuer im Heim" name="heimbetreuerin"/>
+          <bool formularname="BetreuerIn" description="Betreuerin/Betreuer" name="betreuerin"/>
+          <bool description="Lehrerin/Lehrer" name="lehrerin"/>
+          <bool formularname="Mitbewohner" description="Mitbewohnerin/Mitbewohner" name="mitbewohner"/>
+          <bool formularname="Partner_Mutter" description="Lebensgefährte der Mutter" name="partner_mutter"/>
+          <bool formularname="Partner_Vater" description="Lebensgefährtin des Vaters" name="partner_vater"/>
+          <bool formularname="Freund" description="beste Freundin/bester Freund" name="freund"/>
+          <bool formularname="keine_Bezugsperson" description="keine Bezugsperson" name="keine_bezugsperson"/>
+        </group>
+        <group description="Aktivitäten des Jugendlichen" name="aktivitaetendesjugendlichen" target="c">
+          <group description="Hobbies" name="hobbies">
+            <choice formularname="Hobbies" description="Hobbies" name="hobbies_1" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="Ja" value="1" name="Ja"/>
+              <bool description="Nein" value="0" name="Nein"/>
+            </choice>
+            <text formularname="Hobbies_text" description="Nennung Hobbies" maxlength="60" name="hobbies_text" size="40"/>
+          </group>
+          <group description="Mitarbeit in Organisationen und Vereinen" name="mitarbeitinorganisationenundvereinen">
+            <choice formularname="Mitarbeit_Organisationen" description="Mitarbeit Organisationen und Vereinen" name="mitarbeit_organisationen" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="Ja" value="1" name="Ja"/>
+              <bool description="Nein" value="0" name="Nein"/>
+            </choice>
+            <text formularname="Organisationen_Vereine_text" description="Nennung Mitarbeit" maxlength="60" name="organisationen_vereine_text" size="40"/>
+          </group>
+          <group description="Sonstiges" name="sonstiges">
+            <choice formularname="Sonstiges" description="Sonstiges" name="sonstiges_1" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="Ja" value="1" name="Ja"/>
+              <bool description="Nein" value="0" name="Nein"/>
+            </choice>
+            <text formularname="Sonstiges_text" description="Nennung Sonstiges" maxlength="60" name="sonstiges_text" size="40"/>
+          </group>
+        </group>
+        <group description="Beziehungen zu Gleichaltrigen (Mehrfachantwort möglich)" name="beziehungenzugleichaltrigenmehrfachantwortmoeglich" target="d">
+          <bool formularname="Clique" description="Zugehörigkeit zu einer festen Gruppe von Gleichaltrigen (Clique)" name="clique"/>
+          <bool formularname="FreundIn" description="beste Freundin/bester Freund" name="freundin"/>
+          <bool formularname="ParterIn" description="feste Partnerin/fester Partner" name="parterin"/>
+        </group>
+      </group>
+    </page>
+    <page description="Schule" name="page_5">
+      <group formularname="Schule" description="Schule" name="schule_1" invisible="s" containers="a,b,c,d,e">
+        <info value="Schule" name="info-5" target="a" invisible="s"/>
+        <choice formularname="Schule" description="Derzeit bzw. zuletzt besuchte Schule" name="schule_2" target="b" size="1">
+          <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="Sonderschule/Förderschule" value="0" name="sonderschulefoerderschule"/>
+          <bool description="Hauptschule" value="1" name="hauptschule"/>
+          <bool description="Gesamtschule" value="2" name="gesamtschule"/>
+          <bool description="Realschule" value="3" name="realschule"/>
+          <bool description="Gymnasium" value="4" name="gymnasium"/>
+          <bool description="Berufschule" value="5" name="berufschule"/>
+          <bool description="sonstige Schule" value="6" name="sonstigeschule"/>
+          <bool description="keine Schule" value="7" name="keineschule"/>
+        </choice>
+        <int formularname="Klassenstufe" description="Klassenstufe" maxvalue="13" name="klassenstufe" target="b" minvalue="0"/>
+        <choice formularname="Klassenwiederholung" description="Klassenwiederholung" name="klassenwiederholung" target="c" size="1">
+          <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+          <bool description="Nein" value="0" name="Nein"/>
+          <bool description="einmal" value="1" name="einmal"/>
+          <bool description="mehrmals" value="2" name="mehrmals"/>
+        </choice>
+        <int formularname="Abgang" description="Abgang Klassenstufe" maxvalue="13" name="abgang" target="c" minvalue="0"/>
+        <group description="Im aktuellen Schuljahr nicht anwesende Tage" name="fehlstunden" target="d">
+          <int formularname="nicht_anwesende_Tage" description="Anzahl" maxvalue="365" name="nicht_anwesende_tage" minvalue="0"/>
+          <int formularname="unentschuldigte_Tage" description="davon unentschuldigt" maxvalue="365" name="unentschuldigte_tage" minvalue="0"/>
+        </group>
+        <group description="Schulabschluss" name="schulabschluss" target="e" containers="a,b" modes="default">
+          <choice formularname="Schulabschluss" description="Höchster Schulabschluss (Art)" name="schulabschluss_1" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Noch Schüler/-in in allgemein bildender Schule" value="0" name="nochschueler_ininallgemeinbildenderschule"/>
+            <bool description="Kein Schulabschluss" value="1" name="keinschulabschluss"/>
+            <bool description="Sonderschulabschluss (Bezeichnung je nach Bundesland)" value="2" name="sonderschulabschluss"/>
+            <bool description="Hauptschulabschluss (HSA)" value="3" name="hauptschulabschlusshsa"/>
+            <bool description="Erweiterter/Qualifizierter HSA" value="4" name="erweiterterqualifizierterhsa"/>
+            <bool description="Realschulabschluss/Mittlere Reife" value="5" name="realschulabschlussmittlerereife"/>
+            <bool description="Fachhochschulreife/Abitur" value="6" name="fachhochschulreifeabitur"/>
+            <bool description="Anderer Schulabschluss" value="7" name="andererschulabschluss"/>
+          </choice>
+          <choice formularname="Schulabschlusserwerbsland" description="Schulabschluss erworben in" name="schulabschlusserwerbsland" target="b" size="1">
+            <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+            <external-choice value="laender.xml" name="external-choice-2-0"/>
+            <bool description="Sonstiges" value="-2" name="sonstiges"/>
+          </choice>
+          <text formularname="Schulabschlusserwerbsland_sonstige_nennung" description="Nennung sonstiges Erwerbsland" maxlength="60" name="schulabschlusserwerbsland_sonstige_nennung" target="b" size="40"/>
+        </group>
+      </group>
+    </page>
+    <page description="Ausbildung und Arbeit" name="page_6">
+      <group description="Ausbildung und Arbeit" name="ausbildungundarbeit" invisible="s" containers="a,b,c,d,e,f,g,h">
+        <info value="Ausbildung und Arbeit" name="info-6" target="a" invisible="s"/>
+        <group formularname="betrieblicheAusbildung" description="betriebliche Ausbildung" name="betrieblicheausbildung" target="b" containers="a,b,c,d,e,f,g,h">
+          <choice formularname="Abschluss_betriebliche_Ausbildung" description="Abschluss vorhanden" name="abschluss_betriebliche_ausbildung" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <text formularname="Abschluss_im_Ausbildungsberuf" description="Abschluss im Ausbildungsberuf" maxlength="60" name="abschluss_im_ausbildungsberuf" target="b" size="40"/>
+          <int formularname="Ausbildungsdauer" description="Ausbildungsdauer (in Monaten)" maxvalue="84" name="ausbildungsdauer" target="c" minvalue="0"/>
+          <date formularname="Wann_abgeschlossen" description="Wann abgeschlossen?" name="wann_abgeschlossen" target="c"/>
+          <int formularname="weitere_Ausbildungen" description="Anzahl weiterer Ausbildungen" maxvalue="20" name="weitere_ausbildungen" target="d" minvalue="0"/>
+          <textarea rows="5" formularname="weitere_Ausbildungen_text" description="Welche weiteren Ausbildungen?" cols="80" name="weitere_ausbildungen_text" target="e"/>
+          <int formularname="Dauer_weitere_Ausbildungen" description="Dauer der weiteren Ausbildungen insgesamt? (in Monaten)" maxvalue="84" name="dauer_weitere_ausbildungen" target="f" minvalue="0"/>
+          <int formularname="abgebrochene_Ausbildungen" description="Anzahl der abgebrochenen Ausbildungen" maxvalue="20" name="abgebrochene_ausbildungen" target="g" minvalue="0"/>
+          <textarea rows="5" formularname="abgebrochene_ausbildungen_text" description="Welche abgebrochenen Ausbildungen?" cols="80" name="abgebrochene_ausbildungen_text" target="h"/>
+        </group>
+        <group formularname="außerbetrieblicheAusbildung" description="außerbetriebliche Ausbildung" name="ausserbetrieblicheausbildung" target="c" containers="a,b,c,d,e,f,g,h">
+          <choice formularname="Abschluss_außerbetriebliche_Ausbildung" description="Abschluss vorhanden" name="abschluss_ausserbetriebliche_ausbildung" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <text formularname="Abschluss_im_Ausbildungsberuf" description="Abschluss im Ausbildungsberuf" maxlength="60" name="abschluss_im_ausbildungsberuf_1" target="b" size="40"/>
+          <int formularname="Ausbildungsdauer" description="Ausbildungsdauer (in Monaten)" maxvalue="84" name="ausbildungsdauer_1" target="c" minvalue="0"/>
+          <date formularname="Wann_abgeschlossen" description="Wann abgeschlossen?" name="wann_abgeschlossen_1" target="c"/>
+          <int formularname="weitere_Ausbildungen" description="Anzahl weiterer Ausbildungen" maxvalue="20" name="weitere_ausbildungen_1" target="d" minvalue="0"/>
+          <textarea rows="5" formularname="weitere_Ausbildungen_text" description="Welche weiteren Ausbildungen?" cols="80" name="weitere_ausbildungen_text_1" target="e"/>
+          <int formularname="Dauer_weitere_Ausbildungen" description="Dauer der weiteren Ausbildungen insgesamt? (in Monaten)" maxvalue="84" name="dauer_weitere_ausbildungen_1" target="f" minvalue="0"/>
+          <int formularname="abgebrochene_Ausbildungen" description="Anzahl der abgebrochenen Ausbildungen" maxvalue="20" name="abgebrochene_ausbildungen_1" target="g" minvalue="0"/>
+          <textarea rows="5" formularname="abgebrochene_ausbildungen_text_1" description="Welche abgebrochenen Ausbildungen?" cols="80" name="abgebrochene_ausbildungen_text_1" target="h"/>
+        </group>
+        <group formularname="Maßnahmen" description="Maßnahmen" name="massnahmen" target="d" containers="a,b,c,d,e,f,g,h">
+          <choice formularname="Maßnahmeteilnahme" description="Maßnahmeteilnahme" name="massnahmeteilnahme" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <text formularname="Letzte_Maßnahme" description="Letzte Maßnahme" maxlength="60" name="letzte_massnahme" target="b:25" size="40"/>
+          <text formularname="Finanzierung" description="Von wem wurde die Maßnahme finanziert?" maxlength="60" name="finanzierung" target="b:75" size="40"/>
+          <date formularname="Austrittsdatum" description="Austrittsdatum" name="austrittsdatum" target="c:25"/>
+          <int formularname="Dauer" description="Dauer (in Monaten)" name="dauer" target="c:75"/>
+          <choice formularname="weitere_Maßnahmen" description="Weitere Maßnahmen?" name="weitere_massnahmen" target="d" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <group formularname="massnahme_1" description="Maßnahme 1" name="massnahme_1" target="e">
+            <text formularname="Maßnahme1" description="Nennung" maxlength="60" name="massnahme_1" size="40"/>
+            <text formularname="Maßnahme1_Finanzierung" description="Von wem finanziert?" maxlength="60" name="massnahme1_finanzierung" size="40"/>
+          </group>
+          <group formularname="massnahme_2" description="Maßnahme 2" name="massnahme_2" target="f">
+            <text formularname="Maßnahme2" description="Nennung" maxlength="60" name="massnahme_2" size="40"/>
+            <text formularname="Maßnahme2_Finanzierung" description="Von wem finanziert?" maxlength="60" name="massnahme2_finanzierung" size="40"/>
+          </group>
+          <group formularname="massnahme_3" description="Maßnahme 3" name="massnahme_3" target="g">
+            <text formularname="Maßnahme3" description="Nennung" maxlength="60" name="massnahme_3" size="40"/>
+            <text formularname="Maßnahme3_Finanzierung" description="Von wem finanziert?" maxlength="60" name="massnahme3_finanzierung" size="40"/>
+          </group>
+          <int formularname="abgebrochene_Maßnahmen" description="Anzahl der abgebrochenen Maßnahmen" maxvalue="20" name="abgebrochene_massnahmen" target="h" minvalue="0"/>
+        </group>
+        <group formularname="Erwerbsarbeit_Jobs" description="Erwerbsarbeit/Jobs" name="erwerbsarbeit_jobs" target="e" containers="a,b,c,d,e">
+          <choice formularname="Erwerbstätigkeit_Job" description="Erwerbstätigkeit/Job" name="erwerbstaetigkeit_job" target="a" size="1">
+            <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <text formularname="Letzte_Tätigkeit" description="Letzte/derzeitige Tätigkeit" maxlength="60" name="letzte_taetigkeit" target="b" size="40"/>
+          <int formularname="Dauer" description="Dauer der letzten Tätigkeit (in Monaten):" maxvalue="240" name="dauer_1" target="c" minvalue="0"/>
+          <date formularname="Austrittsdatum" description="Austrittsdatum" name="austrittsdatum_1" target="c"/>
+          <int formularname="weitere_Tätigkeiten" description="Anzahl weiterer Tätigkeiten/Jobs" maxvalue="20" name="weitere_taetigkeiten" target="d" minvalue="0"/>
+          <textarea rows="5" formularname="weitere_Jobs_text" description="Welche weiteren Tätigkeiten/Jobs?" cols="80" name="weitere_jobs_text" target="e"/>
+          <int formularname="Dauer_weitere_Tätigkeiten" description="Dauer der weiteren Tätigkeiten/Jobs insgesamt? (in Monaten)" maxvalue="240" name="dauer_weitere_taetigkeiten" target="f" minvalue="0"/>
+        </group>
+        <group formularname="Arbeitslosigkeit" description="Arbeitslosigkeit" name="arbeitslosigkeit" target="f" containers="a,b">
+          <choice formularname="Arbeitslosigkeit" description="Arbeitslosigkeit" name="arbeitslosigkeit_1" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <int formularname="Anzahl_Arbeitslosigkeit" description="Anzahl der Arbeitslosigkeitsperioden" maxvalue="99" name="anzahl_arbeitslosigkeit" target="a" minvalue="0"/>
+          <int formularname="Dauer_nach_letzter_Beschäftigung" description="Dauer Arbeitslosigkeit nach der letzten Beschäftigung (in Monaten)" maxvalue="99" name="dauer_nach_letzter_beschaeftigung" target="b" minvalue="0"/>
+          <int formularname="Dauer_insgesamt" description="Dauer der Arbeitslosigkeit insgesamt (in Monaten)" maxvalue="99" name="dauer_insgesamt" target="b" minvalue="0"/>
+        </group>
+        <group formularname="Wehrpflicht_Zivildienst_Freiwilligenjahr" description="Wehrpflicht/Zivildienst/Freiwilligenjahr" name="wehrpflicht_zivildienst_freiwilligenjahr" target="g">
+          <choice formularname="Wehrpflicht_Zivildienst_Freiwilligenjahr" description="Wehrpflicht/Zivildienst/Freiwilligenjahr" name="wehrpflicht_zivildienst_freiwilligenjahr_1" size="1">
+            <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <choice formularname="Art_des_Dienstes" description="Art des Dienstes" name="art_des_dienstes" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Wehrpflicht" value="0" name="wehrpflicht"/>
+            <bool description="Zivildienst" value="1" name="zivildienst"/>
+            <bool description="Freiwilligenjahr" value="2" name="freiwilligenjahr"/>
+          </choice>
+          <int formularname="Dauer" description="Dauer (in Monaten)" maxvalue="99" name="dauer_2" minvalue="0"/>
+        </group>
+        <group formularname="Erziehungsurlaub_Elternzeit" description="Erziehungsurlaub/Elternzeit" name="erziehungsurlaub_elternzeit" target="h" containers="a,b">
+          <choice formularname="Mutterschutz_Erziehungsurlaub" description="Erziehungsurlaub/Elternzeit" name="mutterschutz_erziehungsurlaub" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <int formularname="Anzahl" description="Anzahl" maxvalue="10" name="anzahl" target="a" minvalue="0"/>
+          <int formularname="Dauer_letzter_Erziehungsurlaub" description="Dauer des letzten Erziehungsurlaubes (in Monaten)" maxvalue="50" name="dauer_letzter_erziehungsurlaub" target="b" minvalue="0"/>
+          <int formularname="Dauer_insgesamt" description="Dauer insgesamt (in Monaten)" maxvalue="120" name="dauer_insgesamt_1" target="b" minvalue="0"/>
+        </group>
+      </group>
+    </page>
+    <page description="Weiterer Verlauf" name="page_7">
+      <group formularname="Beratungsbedarf" description="Weiterer Verlauf" name="beratungsbedarf" invisible="s" containers="a,b,c">
+        <info value="Weiterer Verlauf" name="info-7" target="a" invisible="s"/>
+        <group description="Ãœbernahme ins Case-Management" name="uebernahmeinscase_management" target="b" containers="a,b,c">
+          <choice formularname="Kompetenzfeststellung" description="Besteht die Notwendigkeit zur Ãœbernahme ins Case-Management?" name="kompetenzfeststellung" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ja" value="1" name="Ja"/>
+            <bool description="Nein" value="0" name="Nein"/>
+          </choice>
+          <choice formularname="Zielsetzung" description="Kompetenzfestellung ist erforderlich mit folgender primärer Zielsetzung" name="zielsetzung" target="b" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Ermittlung von schulischen Kompetenzen" value="0" name="ermittlungvonschulischenkompetenzen"/>
+            <bool description="Ermittlung von ausbildungsbezogenen Kompetenzen" value="1" name="ermittlungvonausbildungsbezogenenkompetenzen"/>
+            <bool description="Ermittlung von arbeitsweltbezogenen Kompetenzen" value="2" name="ermittlungvonarbeitsweltbezogenenkompetenzen"/>
+            <bool description="Hilfe bei der Berufswahl/Berufsorientierung" value="3" name="hilfebeiderberufswahlberufsorientierung"/>
+            <bool description="Ermittlung von Sozial- und Selbstkompetenzen" value="4" name="ermittlungvonsozialundselbstkompetenzen"/>
+          </choice>
+          <group description="Eine weitere Begleitung des Jugendlichen (Kompetenzfeststellung und evtl. weitere Schritte des Case-Managements) ist nicht erforderlich, weil der Jugendliche" name="enwtrbgltngdsjgndlchnkmptnzfststllngndvtlwtrschrttdscs_mngmntsstnchtrfrdrlchwldrjgndlch" target="c" invisible="s" containers="a,b" modes="-mode1.2">
+            <choice formularname="Begleitung" description="Eine Ãœbernahme ins Case-Management ist nicht erforderlich, weil der Jugendliche" name="begleitung" target="a" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="in der Lage ist, selbständig zu handeln" value="0" name="inderlageistselbstaendigzuhandeln" alternative="Maßnahme"/>
+              <bool description="in eine Maßnahme vermittelt wurde" value="1" name="ineinemassnahmevermitteltwurde" alternative="selbständig"/>
+              <bool description="in eine Ausbildung vermittelt wurde" value="2" name="ineineausbildungvermitteltwurde" alternative="Ausbildung"/>
+              <bool description="in die Arbeit vermittelt wurde" value="3" name="indiearbeitvermitteltwurde" alternative="Arbeit"/>
+            </choice>
+            <text formularname="welche_vermittlung_nennung" description="Nennung Vermittlung" maxlength="60" name="welche_vermittlung_nennung" target="b" size="40" modes="default"/>
+          </group>
+        </group>
+        <textarea rows="20" formularname="Freie_Dokumentation" description="Freie Dokumentation" cols="80" name="freie_dokumentation" target="c" modes="-mode1.1anon"/>
+      </group>
+    </page>
+  </group>
+  <group description="Case-Management" name="4case_management">
+    <group repeat="true" formularname="rg_kompetenzfestellung" description="Kompetenzfestellung" name="rg_kompetenzfestellung">
+      <page description="Verfahren" name="page_8" containers="a,b">
+        <info value="Case-Management" name="info-8" target="a" invisible="1"/>
+        <group description="Kompetenzfeststellung" name="kompetenzfeststellung" target="b" invisible="s" containers="a,b">
+          <info value="Kompetenzfeststellung" name="info-9" target="a" invisible="1"/>
+          <group formularname="Verfahren" description="Verfahren" name="verfahren" target="b" invisible="s" containers="a,b,c,d">
+            <info value="Verfahren" name="info-10" target="a" invisible="1"/>
+            <group description="Entwicklung und Durchführung des Verfahrens zur Kompetenzfeststellung" name="entwicklungunddurchfuehrungdesverfahrenszurkompetenzfeststellung" target="b" containers="a,b">
+              <choice formularname="Verfahren_Kompetenzfeststellung" description="Verfahren Kompetenzfeststellung" name="verfahren_kompetenzfeststellung" target="a" size="1">
+                <bool description="keine Angaben" value="-1" name="keineangaben"/>
+                <bool formularname="intern und extern" description="interne Verfahrensentwicklung und -durchführung" value="0" name="interneverfahrensentwicklungund_durchfuehrung" alternative="intern und extern"/>
+                <bool formularname="intern" description="interne Durchführung eines extern entwickelten Verfahrens" value="1" name="internedurchfuehrungeinesexternentwickeltenverfahrens" alternative="intern"/>
+                <bool formularname="extern" description="externe Verfahrensentwicklung und -durchführung" value="2" name="externeverfahrensentwicklungund_durchfuehrung" alternative="extern"/>
+              </choice>
+              <text formularname="externer_Anbieter" description="externer Anbieter" maxlength="100" name="externeranbieter" target="b" size="50"/>
+            </group>
+            <group description="Art des Verfahrens" name="artdesverfahrens" target="c" containers="a,b,c,d,e,f,g,h">
+              <bool formularname="Assessment-Center" description="Assessment-Center" name="assessment_center" target="a"/>
+              <bool formularname="Interview" description="Interview" name="interview" target="b"/>
+              <bool formularname="biografieorientierte_Methoden" description="Biographische Methoden" name="biografieorientierte_methoden" target="c"/>
+              <bool formularname="Selbsttest_Selbstbeurteilung" description="Selbsttest und Selbstbeurteilung" name="selbsttest_selbstbeurteilung" target="d"/>
+              <bool formularname="Sonstiges" description="Sonstiges Verfahren" name="sonstiges_2" target="e"/>
+              <text formularname="Sonstiges_Nennung" description="Nennung sonstiges Verfahren" maxlength="100" name="artdesverfahrens_nennung_sonstiges" target="f" size="50"/>
+              <bool formularname="Testverfahren" description="Testverfahren" name="testverfahren" target="g"/>
+              <group description="Art des Testverfahrens" name="testverfahren" target="h" containers="a,b,c,d,e">
+                <group name="group-0" target="a" invisible="s">
+                  <bool formularname="Intelligenztest" description="Intelligenztest" name="intelligenztest" target="a"/>
+                </group>
+                <text formularname="Intelligenztest_Nennung" description=" Nennung Intelligenztest" maxlength="100" name="intelligenztest_nennung" target="a" size="50"/>
+                <group name="group-1" target="b" invisible="s">
+                  <bool formularname="Schultest" description="Schulttest" name="schultest" target="b"/>
+                </group>
+                <text formularname="Schultest_Nennung" description="Nennung Schultest" maxlength="100" name="schultest_nennung" target="b" size="50"/>
+                <group name="group-2" target="c" invisible="s">
+                  <bool formularname="Leistungstest" description="Leistungstest" name="leistungstest" target="c"/>
+                </group>
+                <text formularname="Leistungstest_Nennung" description="Nennung Leistungstest" maxlength="100" name="leistungstest_nennung" target="c" size="50"/>
+                <group name="group-3" target="d" invisible="s">
+                  <bool formularname="Persönlichkeitstest" description="Persönlichkeitstest" name="persoenlichkeitstest" target="d"/>
+                </group>
+                <text formularname="Persönlichkeitstest_Nennung" description="Nennung Persönlichkeitstest" maxlength="100" name="persoenlichkeitstest_nennung" target="d" size="50"/>
+                <group name="group-4" target="e" invisible="s">
+                  <bool formularname="Einstellungs_Interessentest" description="Einstellungs- und Interessentest" name="einstellungs_interessentest" target="e"/>
+                </group>
+                <text formularname="Einstellungs_Interessentest_Nennung" description="Nennung Einstellungs- und Interessentest" maxlength="100" name="einstellungs_interessentest_nennung" target="e" size="50"/>
+              </group>
+            </group>
+            <choice formularname="Dauer_des_Verfahrens" description="Dauer des Verfahrens" name="dauer_des_verfahrens" target="d" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="1 Tag" value="0" name="1tag"/>
+              <bool description="2 bis 3 Tage" value="1" name="2bis3tage"/>
+              <bool description="4 Tage und länger" value="2" name="4tageundlaenger"/>
+            </choice>
+          </group>
+        </group>
+      </page>
+      <page description="Ergebnisse der Kompetenzfestellung" name="page_9" containers="a">
+        <group description="Kompetenzfeststellung" name="kompetenzfeststellung" target="a" invisible="s" containers="a,b">
+          <group description="Ergebnisse der Kompetenzfeststellung" name="ergebnissederkompetenzfeststellung" target="a" invisible="s" containers="a,b,c">
+            <info value="Ergebnisse der Kompetenzfeststellung" name="info-11" target="a" invisible="s"/>
+            <group description="Ausbildungs- und berufsbezogene Kompetenzen (Fach- und Methodenkompetenzen)" name="asbldngs_ndbrfsbzgnkmptnznfch_ndmthdnkmptnzn" target="b" invisible="s" containers="a,b,c">
+              <info value="Ausbildungs- und berufsbezogene Kompetenzen (Fach- und Methodenkompetenzen)" name="info-13" target="a"/>
+              <group description="Fachkompetenzen" name="fachkompetenzen" target="b" invisible="s" containers="a,b,c,d">
+                <group formularname="Fachkompetenzen_Naturwissenschaften" description="Fachkompetenzen im naturwissenschaftlich-technischen und wirtschaftlichen Bereich" name="fachkompetenzen_naturwissenschaften" target="a" containers="a,b,c,d,e">
+                  <choice formularname="Rechenfähigkeit" description="rechnerisches Denken (Rechenfähigkeit)" name="rechenfaehigkeit" target="a" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="räumliches_Vorstellungsvermögen" description="räumliches Vorstellungsvermögen" name="raeumliches_vorstellungsvermoegen" target="b" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="Grundverständnis_naturwissenschaftlicher_Zusammenhänge" description="Grundverständnis von naturwissenschaftlichen Zusammenhängen" name="grundverstaendnis_naturwissenschaftlicher_zusammenhaenge" target="c" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="logisches_Denken" description="logisches (schlussfolgerndes) Denken" name="logisches_denken" target="d" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="wirtschaftliche_grundkenntnisse" description="wirtschaftliche Grundkenntnisse" name="wirtschaftliche_grundkenntnisse" target="e" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                </group>
+                <group formularname="Fachkompetenzen_Medienbereich" description="Fachkompetenzen im Medienbereich" name="fachkompetenzen_medienbereich" target="b" containers="a,b,c,d">
+                  <choice formularname="allgemeine_PC-Kenntnisse" description="allgemeine PC-Kenntnisse" name="allgemeine_pc_kenntnisse" target="a" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="spezielle_PC-Kenntnisse_Grafikbearbeitung_Musikbearbeitung" description="spezielle PC-Kenntnisse (Grafikbearbeitung, Musikbearbeitung)" name="spezielle_pc_kenntnisse_grafikbearbeitung_musikbearbeitung" target="b" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="Internet-Anwendungen_und_E-mail-Kenntnisse" description="Internet-Anwendungen und E-Mail-Kenntnisse" name="internet_anwendungen_und_e_mail_kenntnisse" target="c" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="andere_Medien" description="Beherrschung anderer Medien (z.B. Kamera)" name="andere_medien" target="d" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                </group>
+                <group formularname="Fachkompetenzen_Bereich_Sprachen_Kommunikation" description="Fachkompetenzen im Bereich Sprachen und Kommunikation" name="fachkompetenzen_bereich_sprachen_kommunikation" target="c" containers="a,b,c,d,e,f">
+                  <choice formularname="Texte_lesen_und_verstehen" description="Fähigkeit, Texte zu lesen und zu verstehen" name="texte_lesen_und_verstehen" target="a" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="Texte_schreiben_und_formulieren" description="Fähigkeit, Texte fehlerfrei zu schreiben und verständlich zu formulieren" name="texte_schreiben_und_formulieren" target="b" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="deutsche_Sprache" description="Fähigkeit, sich in der deutschen Sprache verständlich und adressatengerecht auszudrücken und mündliche Aussagen zu verstehen" name="deutsche_sprache" target="c" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <group formularname="beherrschung_sprache1" description="Beherrschung der Sprache 1" name="beherrschung_sprache1" target="d" containers="a">
+                    <choice formularname="Sprache1" description="welche" name="sprache1" target="a" size="1">
+                      <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+                      <external-choice value="sprachen.xml" name="external-choice-3"/>
+                      <bool description="Sonstige" value="-2" name="sonstige"/>
+                    </choice>
+                    <text formularname="Sprache1_sonstige_nennung" description="Nennung Sonstige" maxlength="60" value="a" name="sprache1_sonstige_nennung" size="40"/>
+                    <choice formularname="Beherrschung_Sprache_1" description="Beherrschung der Sprache 1" name="beherrschung_sprache1" target="a" size="1">
+                      <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                      <bool description="sehr gut" value="0" name="sehrgut"/>
+                      <bool description="gut" value="1" name="gut"/>
+                      <bool description="mittelmäßig" value="2" name="mittelmaessig"/>
+                      <bool description="nur Grundkenntnisse" value="3" name="nurgrundkenntnisse"/>
+                    </choice>
+                  </group>
+                  <group formularname="beherrschung_sprache2" description="Beherrschung der Sprache 2" name="beherrschung_sprache2" target="e" containers="a">
+                    <choice formularname="Sprache2" description="welche" name="sprache2" target="a" size="1">
+                      <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+                      <external-choice value="sprachen.xml" name="external-choice-3"/>
+                      <bool description="Sonstige" value="-2" name="sonstige"/>
+                    </choice>
+                    <text formularname="Sprache2_sonstige_nennung" description="Nennung Sonstige" maxlength="60" value="a" name="sprache2_sonstige_nennung" size="40"/>
+                    <choice formularname="Beherrschung_Sprache_2" description="Beherrschung der Sprache 2" name="beherrschung_sprache2" target="a" size="1">
+                      <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                      <bool description="sehr gut" value="0" name="sehrgut"/>
+                      <bool description="gut" value="1" name="gut"/>
+                      <bool description="mittelmäßig" value="2" name="mittelmaessig"/>
+                      <bool description="nur Grundkenntnisse" value="3" name="nurgrundkenntnisse"/>
+                    </choice>
+                  </group>
+                  <group formularname="beherrschung_sprache3" description="Beherrschung der Sprache 3" name="beherrschung_sprache3" target="f" containers="a">
+                    <choice formularname="Sprache3" description="welche" name="sprache3" target="a" size="1">
+                      <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+                      <external-choice value="sprachen.xml" name="external-choice-3"/>
+                      <bool description="Sonstige" value="-2" name="sonstige"/>
+                    </choice>
+                    <text formularname="Sprache3_sonstige_nennung" description="Nennung Sonstige" maxlength="60" value="a" name="sprache3_sonstige_nennung" size="40"/>
+                    <choice formularname="Beherrschung_Sprache_3" description="Beherrschung der Sprache 3" name="beherrschung_sprache3" target="a" size="1">
+                      <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                      <bool description="sehr gut" value="0" name="sehrgut"/>
+                      <bool description="gut" value="1" name="gut"/>
+                      <bool description="mittelmäßig" value="2" name="mittelmaessig"/>
+                      <bool description="nur Grundkenntnisse" value="3" name="nurgrundkenntnisse"/>
+                    </choice>
+                  </group>
+                </group>
+                <group formularname="Fachkompetenzen_handwerklicher_Bereich" description="Fachkompetenzen im handwerklichen Bereich" name="fachkompetenzen_handwerklicher_bereich" target="d" containers="a,b,c,d">
+                  <choice formularname="Hand-_Fingergeschick" description="Hand- und Fingergeschick" name="hand_fingergeschick" target="a" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="Formauffassung" description="Formauffassung" name="formauffassung" target="b" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="Umgang_Maschinen_Werkzeugen" description="Umgang mit Maschinen und Werkzeugen" name="umgang_maschinen_werkzeugen" target="c" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                  <choice formularname="gestalterische_Fantasie" description="gestalterische Fantasie" name="gestalterische_fantasie" target="d" size="1">
+                    <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                    <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                    <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                    <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                    <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                  </choice>
+                </group>
+              </group>
+              <group formularname="Methodenkompetenz" description="Methodenkompetenzen" name="methodenkompetenz" target="c" containers="a,b,c,d">
+                <choice formularname="Methoden_der_Informationsgewinnung" description="Methoden der Informationsgewinnung" name="methoden_der_informationsgewinnung" target="a" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Methoden_der_Informationsverarbeitung" description="Methoden der Informationsverarbeitung" name="methoden_der_informationsverarbeitung" target="b" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Einsatz_Lern-und_Arbeitstechniken" description="Einsatz von Lern- und Arbeitstechniken" name="einsatz_lern_und_arbeitstechniken" target="c" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Problemlösungsorientierung" description="Problemlösungsorientierung" name="problemloesungsorientierung" target="d" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+              </group>
+            </group>
+            <group description="Soziale und personale Kompetenzen (Sozial- und Selbstkompetenzen)" name="sozialeundpersonalekompetenzensozial_undselbstkompetenzen" target="c" invisible="s" containers="a,b,c,d">
+              <info value="Soziale und personale Kompetenzen (Sozial- und Selbstkompetenzen)" name="info-12" target="a"/>
+              <group formularname="Sozialkompetenzen" description="Sozialkompetenzen" name="sozialkompetenzen" target="b" containers="a,b,c,d,e,f">
+                <choice formularname="Kommunikationsfähigkeit" description="Kommunikationsfähigkeit" name="kommunikationsfaehigkeit" target="a" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Kritikfähigkeit" description="Kritikfähigkeit" name="kritikfaehigkeit" target="b" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Konfliktfähigkeit" description="Konfliktfähigkeit" name="konfliktfaehigkeit" target="c" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Kreativität" description="Kreativität" name="kreativitaet" target="d" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Team-und_Kooperationsfähigkeit" description="Team- und Kooperationsfähigkeit" name="team_und_kooperationsfaehigkeit" target="e" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="solidarisches_Verhalten" description="solidarisches Verhalten" name="solidarisches_verhalten" target="f" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+              </group>
+              <group formularname="Selbstkompetenz" description="Selbstkompetenzen" name="selbstkompetenz" target="c" containers="a,b,c,d,e">
+                <choice formularname="selbständiges_Lernen_Arbeiten" description="selbstständiges Lernen und Arbeiten" name="selbstaendiges_lernen_arbeiten" target="a" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Selbstreflexion_Selbsteinschätzung" description="Selbstreflexion und Selbsteinschätzung" name="selbstreflexion_selbsteinschaetzung" target="b" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Verantwortungsübernahme" description="Verantwortungsübernahme" name="verantwortungsuebernahme" target="c" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Zielorientierung" description="Zielorientierung" name="zielorientierung" target="d" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Zuverlässigkeit" description="Zuverlässigkeit" name="zuverlaessigkeit" target="e" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+              </group>
+              <group formularname="psychische_physische_Persönlichkeitsmerkmale" description="psychische und physische Persönlichkeits- und Leistungsmerkmale" name="psychische_physische_persoenlichkeitsmerkmale" target="d" containers="a,b,c,d,e,f,g,h,i,j,k">
+                <choice formularname="altersgerechter_Entwicklungsstand" description="altersgerechter Entwicklungsstand" name="altersgerechter_entwicklungsstand" target="a" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="gesundheitliche_Voraussetzungen" description="gesundheitliche Voraussetzungen" name="gesundheitliche_voraussetzungen" target="b" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Konzentration" description="Konzentration" name="konzentration" target="c" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Ausdauer" description="Ausdauer" name="ausdauer" target="d" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Durchhaltevermögen" description="Durchhaltevermögen" name="durchhaltevermoegen" target="e" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Merkfähigkeit" description="Merkfähigkeit" name="merkfaehigkeit" target="f" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Bearbeitungsgeschwindigkeit" description="Bearbeitungsgeschwindigkeit" name="bearbeitungsgeschwindigkeit" target="g" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Befähigung_zu_Daueraufmerksamkeit" description="Befähigung zu Daueraufmerksamkeit" name="befaehigung_zu_daueraufmerksamkeit" target="h" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Leistungsbereitschaft" description="Leistungsbereitschaft" name="leistungsbereitschaft" target="i" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Sorgfalt" description="Sorgfalt" name="sorgfalt" target="j" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+                <choice formularname="Umgangsformen" description="Umgangsformen" name="umgangsformen" target="k" size="1">
+                  <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="stark ausgeprägt" value="0" name="starkausgepraegt"/>
+                  <bool description="ausgeprägt" value="1" name="ausgepraegt"/>
+                  <bool description="schwach ausgeprägt" value="2" name="schwachausgepraegt"/>
+                  <bool description="sehr schwach ausgeprägt" value="3" name="sehrschwachausgepraegt"/>
+                </choice>
+              </group>
+            </group>
+          </group>
+          <textarea rows="20" formularname="Dokumentation_Kompetenzfeststellung" description="Dokumentation zur Kompetenzfeststellung" cols="80" name="dokumentation_kompetenzfeststellung" target="b" modes="-mode1.1anon"/>
+        </group>
+      </page>
+    </group>
+    <page description="Förderplanung" name="page_10">
+      <group description="Förderplanung" name="foerderplanung" invisible="s" containers="a,b">
+        <info value="Förderplanung" name="info-14" target="a" invisible="s"/>
+        <group description="Förderbedarf" name="foerderbedarf" target="b">
+          <bool formularname="bildender_Bereich" description="im allgemein bildenden Bereich" name="bildender_bereich"/>
+          <bool formularname="Bereich_berufliche_Qualifizierung" description="im Bereich der beruflichen Qualifizierung" name="bereich_berufliche_qualifizierung"/>
+          <bool formularname="Bereich_Berufsvorbereitung" description="im Bereich der Berufsvorbereitung" name="bereich_berufsvorbereitung"/>
+          <bool formularname="Bereich_Lebensbewältigung" description="im Bereich der Lebensbewältigung" name="bereich_lebensbewaeltigung"/>
+          <bool formularname="Sonstiger_Förderbedarf" description="Sonstige" name="sonstiger_foerderbedarf"/>
+          <text formularname="Sonstiger_Förderbedarf_Nennung" description="Nennung Sonstige" maxlength="120" name="sonstiger_foerderbedarf_nennung" size="70"/>
+          <group description="Förderzeittraum" name="foerderzeittraum" containers="a">
+            <date formularname="Förderzeitraum_start" description="von" name="foerderzeitraum_start" target="a"/>
+            <date formularname="Förderzeitraum_ende" description="bis" name="foerderzeitraum_ende" target="a"/>
+          </group>
+        </group>
+      </group>
+    </page>
+    <group description="Förderplanung" name="42foerderplanung" invisible="s">
+      <group description="Unterstützungsangebote im allgemein bildenden Bereich" name="421unterstuetzungsangeboteimallgemeinbildendenbereich">
+        <group repeat="true" formularname="rg_angebote_bildenden_bereich" description="Übersicht Unterstützungsangebote" name="rg_angebote_bildenden_bereich" target="b" invisible="s" containers="a,b,c,d,e,f">
+          <page name="page_21">
+            <info value="Unterstützungsangebot im allgemein bildenden Bereich" name="info-15" target="a" invisible="s"/>
+            <choice formularname="Angebotsform" description="Angebotsform" name="angebotsform" target="a" size="1">
+              <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="schulisch" value="0" name="schulisch"/>
+              <bool description="maßnahmeförmig" value="1" name="massnahmefoermig"/>
+              <bool description="betrieblich-erster Arbeitsmarkt" value="2" name="betrieblich_ersterarbeitsmarkt" alternative="betrieblich-erster Arreitsmarkt"/>
+              <bool description="betrieblich-zweiter Arbeitsmarkt" value="3" name="betrieblich_zweiterarbeitsmarkt"/>
+              <bool description="sozialpädagogisch unterstützend" value="4" name="sozialpaedagogischunterstuetzend"/>
+              <bool description="therapeutisch beratend" value="5" name="therapeutischberatend"/>
+            </choice>
+            <text formularname="Art_der_Unterstützung" description="Art der Unterstützung" maxlength="120" name="art_der_unterstuetzung" target="b" size="80"/>
+            <text formularname="durchführende_Institution" description="Durchführende Institution" maxlength="120" name="durchfuehrende_institution" target="c" size="80"/>
+            <group description="Beginn und voraussichtliches Ende der Unterstützung" name="beginnundvoraussichtlichesendederunterstuetzung" target="d" containers="a,b">
+              <date formularname="Unterstützung_start" description="von" name="unterstuetzung_start" target="a"/>
+              <date formularname="Unterstützung_ende" description="bis" name="unterstuetzung_ende" target="a"/>
+              <int formularname="zeitlicher_Umfang_Unterstützung" description="Zeitlicher Umfang der Unterstützung (Stundenzahl)" maxvalue="9999" name="zeitlicher_umfang_unterstuetzung" target="b" minvalue="0"/>
+            </group>
+            <group description="Beendigung" name="beendigung" target="e" containers="a,b">
+              <choice formularname="Beendigung" description="Beendigung" name="beendigung_1" target="a" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="regulär" value="0" name="regulaer"/>
+                <bool description="vorzeitig" value="1" name="vorzeitig"/>
+              </choice>
+              <choice formularname="Beendigung_durch" description="vorzeitige Beendingung durch" name="beendigung_durch" target="a" size="1">
+                <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Jugendliche" value="0" name="jugendliche"/>
+                <bool description="Bildungsträger/Schule" value="1" name="bildungstraegerschule"/>
+                <bool description="Förderstelle/Finanzier" value="2" name="foerderstellefinanzier"/>
+                <bool description="Kompetenzagentur" value="3" name="kompetenzagentur"/>
+                <bool description="Sorgeberechtigte/r" value="4" name="sorgeberechtigter"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <choice formularname="Gründe_vorzeitige_Beendigung" description="Gründe für vorzeitige Beendigung" name="gruende_vorzeitige_beendigung" target="b" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Zieländerung, Wechsel in anderes Angebot" value="0" name="zielaenderungwechselinanderesangebot"/>
+                <bool description="Ziel vorzeitig erreicht" value="1" name="zielvorzeitigerreicht"/>
+                <bool description="Wohnortwechsel" value="2" name="wohnortwechsel"/>
+                <bool description="Krankheit" value="3" name="krankheit"/>
+                <bool description="Konflikte" value="4" name="konflikte"/>
+                <bool description="Haft/U-Haft" value="5" name="haftu_haft"/>
+                <bool description="Fehlzeiten" value="6" name="fehlzeiten"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Gründe_Sonstiges_Nennung" description="Nennung Sonstige" maxlength="120" name="gruende_sonstiges_nennung" target="b" size="60"/>
+            </group>
+            <group description="Nachweise" name="nachweise" target="f" containers="a">
+              <choice formularname="Nachweis_Bescheinigung" description="Nachweis / Bescheinigung" name="nachweis_bescheinigung" target="a" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Schulzeugnis" value="0" name="schulzeugnis"/>
+                <bool description="Zertifikat (bewertete Leistung)" value="1" name="zertifikatbewerteteleistung"/>
+                <bool description="Teilnahmebescheinigung" value="2" name="teilnahmebescheinigung"/>
+                <bool description="keine Bescheinigung" value="3" name="keinebescheinigung"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Sonstiges_Nachweis_Bescheinigung" description="Nennung Sonstiges" maxlength="120" name="sonstiges_nachweis_bescheinigung" target="a" size="60"/>
+            </group>
+          </page>
+        </group>
+      </group>
+      <group description="Unterstützungsangebote im Bereich der Berufsvorbereitung" name="422unterstuetzungsangeboteimbereichderberufsvorbereitung">
+        <group repeat="true" formularname="rg_angebote_berufsvorbereitung" description="Unterstützungsangebot 1" name="rg_angebote_berufsvorbereitung" target="b" invisible="s" containers="a,b,c,d">
+          <page name="page_22" target="a">
+            <info value="Unterstützungsangebot im Bereich der Berufsvorbereitung" name="info-16" target="a" invisible="s"/>
+            <choice formularname="Angebotsform" description="Angebotsform" name="angebotsform_1" target="a" size="1">
+              <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="schulisch" value="0" name="schulisch"/>
+              <bool description="maßnahmeförmig" value="1" name="massnahmefoermig"/>
+              <bool description="betrieblich-erster Arbeitsmarkt" value="2" name="betrieblich_ersterarbeitsmarkt" alternative="betrieblich-erster Arreitsmarkt"/>
+              <bool description="betrieblich-zweiter Arbeitsmarkt" value="3" name="betrieblich_zweiterarbeitsmarkt"/>
+              <bool description="sozialpädagogisch unterstützend" value="4" name="sozialpaedagogischunterstuetzend"/>
+              <bool description="therapeutisch beratend" value="5" name="therapeutischberatend"/>
+            </choice>
+            <choice formularname="Art_der_Unterstützung" description="Art der Unterstützung" name="art_der_unterstuetzung_1" target="b" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="Schnupperlehre/Praktikum im Betrieb" value="0" name="schnupperlehrepraktikumimbetrieb"/>
+              <bool description="Trainings-/Fördermaßnahme" value="1" name="trainings_foerdermassnahme"/>
+              <bool description="BGJ (Berufsgrundschuljahr)" value="2" name="bgjberufsgrundschuljahr"/>
+              <bool description="BVJ (Berufsvorbereitungsjahr)" value="3" name="bvjberufsvorbereitungsjahr"/>
+              <bool description="BvB" value="4" name="bvb"/>
+              <bool description="Einstiegsqualifizierung (Hartz IV)" value="5" name="einstiegsqualifizierunghartziv"/>
+              <bool description="Qualifizierungsbaustein" value="6" name="qualifizierungsbaustein"/>
+              <bool description="Sonstiges" value="-2" name="sonstiges"/>
+            </choice>
+            <text formularname="Unterstützung_Sonstiges_Nennung" description="Nennung Sonstiges" maxlength="255" name="unterstuetzung_sonstiges_nennung" target="b" size="40"/>
+            <text formularname="durchführende_Institution" description="Durchführende Institution" maxlength="120" name="durchfuehrende_institution_1" target="c" size="80"/>
+            <group description="Beginn und voraussichtliches Ende der Unterstützung" name="beginnundvoraussichtlichesendederunterstuetzung" target="d" containers="a,b,c,d">
+              <date formularname="Unterstützung_start" description="von" name="unterstuetzung_start_1" target="a"/>
+              <date formularname="Unterstützung_ende" description="bis" name="unterstuetzung_ende_1" target="a"/>
+              <int formularname="zeitlicher_Umfang_Unterstützung" description="Zeitlicher Umfang der Unterstützung (Stundenzahl)" maxvalue="9999" name="zeitlicher_umfang_unterstuetzung_1" target="b" minvalue="0"/>
+              <group description="Beendigung" name="beendigung" target="c" containers="a,b">
+                <choice formularname="Beendigung" description="Beendigung" name="beendigung_2" target="a" size="1">
+                  <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="regulär" value="0" name="regulaer"/>
+                  <bool description="vorzeitig" value="1" name="vorzeitig"/>
+                </choice>
+                <choice formularname="Beendigung_durch" description="Beendigung durch" name="beendigung_durch_1" target="a" size="1">
+                  <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="Jugendliche" value="0" name="jugendliche"/>
+                  <bool description="Bildungsträger/Schule" value="1" name="bildungstraegerschule"/>
+                  <bool description="Förderstelle/Finanzier" value="2" name="foerderstellefinanzier"/>
+                  <bool description="Kompetenzagentur" value="3" name="kompetenzagentur"/>
+                  <bool description="Sorgeberechtigte/r" value="4" name="sorgeberechtigter"/>
+                  <bool description="Sonstiges" value="-2" name="sonstiges"/>
+                </choice>
+                <choice formularname="Gründe_vorzeitige_Beendigung" description="Gründe für vorzeitige Beendigung" name="gruende_vorzeitige_beendigung_1" target="b" size="1">
+                  <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="Zieländerung, Wechsel in anderes Angebot" value="0" name="zielaenderungwechselinanderesangebot"/>
+                  <bool description="Ziel vorzeitig erreicht" value="1" name="zielvorzeitigerreicht"/>
+                  <bool description="Wohnortwechsel" value="2" name="wohnortwechsel"/>
+                  <bool description="Konflikte" value="3" name="konflikte"/>
+                  <bool description="Krankheit" value="4" name="krankheit"/>
+                  <bool description="Haft/U-Haft" value="5" name="haftu_haft"/>
+                  <bool description="Fehlzeiten" value="6" name="fehlzeiten"/>
+                  <bool description="Sonstiges" value="-2" name="sonstiges"/>
+                </choice>
+                <text formularname="Gründe_Sonstiges_Nennung" description="Nennung Sonstiges" maxlength="120" name="gruende_sonstiges_nennung_1" target="b" size="60"/>
+              </group>
+              <group description="Nachweis/Bescheinigung" name="nachweisbescheinigung" target="d" containers="a">
+                <choice formularname="Nachweis_Bescheinigung" description="Nachweis / Bescheinigung" name="nachweis_bescheinigung_1" target="a" size="1">
+                  <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                  <bool description="Schulzeugnis" value="0" name="schulzeugnis"/>
+                  <bool description="Zertifikat (bewertete Leistung)" value="1" name="zertifikatbewerteteleistung"/>
+                  <bool description="Teilnahmebescheinigung" value="2" name="teilnahmebescheinigung"/>
+                  <bool description="keine Bescheinigung" value="3" name="keinebescheinigung"/>
+                  <bool description="Sonstiges" value="-2" name="sonstiges"/>
+                </choice>
+                <text formularname="Sonstiges_Nachweis_Bescheinigung" description="Nennung Sonstiges" maxlength="120" name="sonstiges_nachweis_bescheinigung_1" target="a" size="60"/>
+              </group>
+            </group>
+          </page>
+        </group>
+      </group>
+      <group description="Unterstützungsangebote im Bereich der beruflichen Qualifizierung" name="423unterstuetzungsangeboteimbereichderberuflichenqualifizierung">
+        <group repeat="true" formularname="rg_angebote_berufliche_qualifizierung" description="Unterstützungsangebot 1" name="rg_angebote_berufliche_qualifizierung" target="b" invisible="s" containers="a,b,c,d,e,f">
+          <page name="page_23" target="a">
+            <info description="Unterstützungsangebot im Bereich der beruflichen Qualifizierung" value="Unterstützungsangebot im Bereich der beruflichen Qualifizierung" name="423unterstuetzungsangeboteimbereichderberuflichenqualifizierung" target="a" invisible="s"/>
+            <choice formularname="Angebotsform" description="Angebotsform" name="angebotsform_2" target="a" size="1">
+              <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="schulisch" value="0" name="schulisch"/>
+              <bool description="maßnahmeförmig" value="1" name="massnahmefoermig"/>
+              <bool description="betrieblich-erster Arbeitsmarkt" value="2" name="betrieblich_ersterarbeitsmarkt" alternative="betrieblich-erster Arreitsmarkt"/>
+              <bool description="betrieblich-zweiter Arbeitsmarkt" value="3" name="betrieblich_zweiterarbeitsmarkt"/>
+              <bool description="sozialpädagogisch unterstützend" value="4" name="sozialpaedagogischunterstuetzend"/>
+              <bool description="therapeutisch beratend" value="5" name="therapeutischberatend"/>
+            </choice>
+            <choice formularname="Angebote_im_Bereich" description="Angebote im Bereich" name="angebote_im_bereich" target="b" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="EDV/Medien" value="0" name="edvmedien"/>
+              <bool description="Maschinenbedienung/Handwerk" value="1" name="maschinenbedienunghandwerk"/>
+              <bool description="Erziehung/Betreuung/Pflege/Gesundheit" value="2" name="erziehungbetreuungpflegegesundheit"/>
+              <bool description="Ökologie/Umwelt" value="3" name="oekologieumwelt"/>
+              <bool description="Dienstleistung/Service" value="4" name="dienstleistungservice"/>
+              <bool description="Sport/Kultur" value="5" name="sportkultur"/>
+              <bool description="Arbeitsgelegenheiten/1-Euro-Job (Hartz IV)" value="6" name="arbeitsgelegenheiten1_euro_jobhartziv"/>
+              <bool description="Sonstiges" value="-2" name="sonstiges"/>
+            </choice>
+            <text formularname="Unterstützung_Sonstiges_Nennung" description="Nennung Sonstiges" maxlength="255" name="unterstuetzung_sonstiges_nennung_1" target="b" size="40"/>
+            <text formularname="durchführende_Institution" description="Durchführende Institution" maxlength="120" name="durchfuehrende_institution_2" target="c" size="80"/>
+            <group description="Beginn und voraussichtliches Ende der Unterstützung" name="beginnundvoraussichtlichesendederunterstuetzung" target="d" containers="a,b">
+              <date formularname="Unterstützung_start" description="von" name="unterstuetzung_start_2" target="a"/>
+              <date formularname="Unterstützung_ende" description="bis" name="unterstuetzung_ende_2" target="a"/>
+              <int formularname="zeitlicher_Umfang_Unterstützung" description="Zeitlicher Umfang der Unterstützung (Stundenzahl)" maxvalue="9999" name="zeitlicher_umfang_unterstuetzung_2" target="b" minvalue="0"/>
+            </group>
+            <group description="Beendigung" name="beendigung" target="e" containers="a,b">
+              <choice formularname="Beendigung" description="Beendigung" name="beendigung_3" target="a" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="regulär" value="0" name="regulaer"/>
+                <bool description="vorzeitig" value="1" name="vorzeitig"/>
+              </choice>
+              <choice formularname="Beendigung_durch" description="vorzeitige Beendigung durch" name="beendigung_durch_2" target="a" size="1">
+                <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Jugendliche" value="0" name="jugendliche"/>
+                <bool description="Bildungsträger/Schule" value="1" name="bildungstraegerschule"/>
+                <bool description="Förderstelle/Finanzier" value="2" name="foerderstellefinanzier"/>
+                <bool description="Kompetenzagentur" value="3" name="kompetenzagentur"/>
+                <bool description="Sorgeberechtigte/r" value="4" name="sorgeberechtigter"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <choice formularname="Gründe_vorzeitige_Beendigung" description="Gründe für vorzeitige Beendigung" name="gruende_vorzeitige_beendigung_2" target="b" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Zieländerung, Wechsel in anderes Angebot" value="0" name="zielaenderungwechselinanderesangebot"/>
+                <bool description="Ziel vorzeitig erreicht" value="1" name="zielvorzeitigerreicht"/>
+                <bool description="Wohnortwechsel" value="2" name="wohnortwechsel"/>
+                <bool description="Krankheit" value="3" name="krankheit"/>
+                <bool description="Konflikte" value="4" name="konflikte"/>
+                <bool description="Haft/U-Haft" value="5" name="haftu_haft"/>
+                <bool description="Fehlzeiten" value="6" name="fehlzeiten"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Gründe_Sonstiges_Nennung" description="Nennung Sonstiges" maxlength="120" name="gruende_sonstiges_nennung_2" target="b" size="60"/>
+            </group>
+            <group description="Nachweis/Bescheinigung" name="nachweisbescheinigung" target="f" containers="a">
+              <choice formularname="Nachweis_Bescheinigung" description="Nachweis / Bescheinigung" name="nachweis_bescheinigung_2" size="1" containers="a">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="zertifizierter Qualifizierungsbaustein" value="0" name="zertifizierterqualifizierungsbaustein"/>
+                <bool description="Zertifikat/Leistungsnachweis" value="1" name="zertifikatleistungsnachweis"/>
+                <bool description="Teilnahmebescheinigung" value="2" name="teilnahmebescheinigung"/>
+                <bool description="keine Bescheinigung" value="3" name="keinebescheinigung"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Sonstiges_Nachweis_Bescheinigung" description="Nennung Sonstiges" maxlength="120" name="sonstiges_nachweis_bescheinigung_2" target="b" size="60"/>
+            </group>
+          </page>
+        </group>
+      </group>
+      <group description="Unterstützungsangebote im Bereich der Lebensbewältigung" name="424unterstuetzungsangeboteimbereichderlebensbewaeltigung">
+        <group repeat="true" formularname="rg_angebote_lebensbewaeltigung" description="Unterstützungsangebot 1" name="rg_angebote_lebensbewaeltigung" target="b" invisible="s" containers="a,b,c,d,e,f">
+          <page name="page_24" target="a">
+            <info description="Unterstützungsangebot im Bereich der Lebensbewältigung" value="Unterstützungsangebote im Bereich der Lebensbewältigung" name="424unterstuetzungsangeboteimbereichderlebensbewaeltigung" target="a" invisible="s"/>
+            <choice formularname="Angebotsform" description="Angebotsform" name="angebotsform_3" target="a" size="1">
+              <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="maßnahmeförmig" value="0" name="massnahmefoermig"/>
+              <bool description="sozialpädagogisch unterstützend" value="2" name="sozialpaedagogischunterstuetzend"/>
+              <bool description="therapeutisch beratend" value="3" name="therapeutischberatend"/>
+              <bool description="Sonstiges" value="-2" name="sonstiges"/>
+            </choice>
+            <text description="Nennung Sonstiges" maxlength="60" name="unterstuetzung_angebotsform_sonstiges_nennung" target="a" size="40"/>
+            <choice formularname="Art_der_Unterstützung" description="Art der Unterstützung" name="art_der_unterstuetzung_2" target="b" size="1">
+              <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="Training sozialer Kompetenzen" value="0" name="trainingsozialerkompetenzen"/>
+              <bool description="Therapie/Selbsthilfegruppe" value="1" name="therapieselbsthilfegruppe"/>
+              <bool description="Beratung (z.B. Drogen, Schulden)" value="2" name="beratungzbdrogenschulden"/>
+              <bool description="Freizeit/Kultur/Sport" value="3" name="freizeitkultursport"/>
+              <bool description="Hilfen zur Erziehung" value="4" name="hilfenzurerziehung"/>
+              <bool description="Sonstiges" value="-2" name="sonstiges"/>
+            </choice>
+            <text formularname="Unterstützung_Sonstiges_Nennung" description="Nennung Sonstiges" maxlength="60" name="unterstuetzung_sonstiges_nennung_2" target="b" size="40"/>
+            <text formularname="durchführende_Institution" description="Durchführende Institution" maxlength="120" name="durchfuehrende_institution_3" target="c" size="80"/>
+            <group description="Beginn und voraussichtliches Ende der Unterstützung" name="beginnundvoraussichtlichesendederunterstuetzung" target="d">
+              <date formularname="Unterstützung_start" description="von" name="unterstuetzung_start_3"/>
+              <date formularname="Unterstützung_ende" description="bis" name="unterstuetzung_ende_3"/>
+              <int formularname="zeitlicher_Umfang_Unterstützung" description="Zeitlicher Umfang der Unterstützung (Stundenzahl)" maxvalue="9999" name="zeitlicher_umfang_unterstuetzung_3" minvalue="0"/>
+            </group>
+            <group description="Beendigung" name="beendigung" target="e" containers="a,b">
+              <choice formularname="Beendigung" description="Beendigung" name="beendigung_4" target="a" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="regulär" value="0" name="regulaer"/>
+                <bool description="vorzeitig" value="1" name="vorzeitig"/>
+              </choice>
+              <choice formularname="Beendigung_durch" description="Vorzeitige Beendigung durch" name="beendigung_durch_3" target="a" size="1">
+                <bool description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Jugendliche" value="0" name="jugendliche"/>
+                <bool description="Bildungsträger/Schule" value="1" name="bildungstraegerschule"/>
+                <bool description="Förderstelle/Finanzier" value="2" name="foerderstellefinanzier"/>
+                <bool description="Kompetenzagentur" value="3" name="kompetenzagentur"/>
+                <bool description="Sorgeberechtigte/r" value="4" name="sorgeberechtigter"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <choice formularname="Gründe_vorzeitige_Beendigung" description="Gründe für vorzeitige Beendigung" name="gruende_vorzeitige_beendigung_3" target="b" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Zieländerung, Wechsel in anderes Angebot" value="0" name="zielaenderungwechselinanderesangebot"/>
+                <bool description="Ziel vorzeitig erreicht" value="1" name="zielvorzeitigerreicht"/>
+                <bool description="Wohnortwechsel" value="2" name="wohnortwechsel"/>
+                <bool description="Krankheit" value="3" name="krankheit"/>
+                <bool description="Konflikte" value="4" name="konflikte"/>
+                <bool description="Haft/U-Haft" value="5" name="haftu_haft"/>
+                <bool description="Fehlzeiten" value="6" name="fehlzeiten"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Gründe_Sonstiges_Nennung" description="Nennung Sonstiges" maxlength="120" name="gruende_sonstiges_nennung_3" target="b" size="60"/>
+            </group>
+            <group description="Nachweis/Bescheinigung" name="nachweisbescheinigung" target="f" containers="a">
+              <choice formularname="Nachweis_Bescheinigung" description="Nachweis/Bescheinigung" name="nachweis_bescheinigung_3" target="a" size="1">
+                <bool checked="true" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Teilnahmebescheinigung" value="0" name="teilnahmebescheinigung"/>
+                <bool description="keine Bescheinigung" value="1" name="keinebescheinigung"/>
+                <bool description="Bestätigung" value="2" name="bestaetigung"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Sonstiges_Nachweis_Bescheinigung" description="Sonstiges" maxlength="120" name="sonstiges_nachweis_bescheinigung_3" target="a" size="60"/>
+            </group>
+          </page>
+        </group>
+      </group>
+      <page description="Freie Dokumentation" name="page_15">
+        <group description="Förderplanung" name="foerderplanung" invisible="s" containers="a,b">
+          <info value="Förderplanung" name="info-19" target="a" invisible="s"/>
+          <textarea rows="40" formularname="Dokumentation_zum_Förderplan" description="Freie Dokumentation zum Förderplan" cols="80" name="dokumentation_zum_foerderplan" target="b" modes="-mode1.1anon"/>
+        </group>
+      </page>
+    </group>
+  </group>
+  <group description="Abschlussbewertung" name="5abschlussbewertung">
+    <page description="Angaben zum Verlauf und Beendigung des CM" name="page_16" containers="a,b">
+      <info value="Abschlussbewertung" name="info-20" target="a" invisible="s"/>
+      <group formularname="Angaben_Verlauf_Beendigung_CM" description="Angaben zum Verlauf und Beendigung des CM" name="angaben_verlauf_beendigung_cm" target="b" invisible="s" containers="a,b,c,d">
+        <info value="Angaben zu Verlauf und Beendigung des CM" name="info-21" target="a" invisible="s"/>
+        <group description="Angaben zum Verlauf des CM" name="angabenzumverlaufdescm" target="b" containers="a,b">
+          <int formularname="Anzahl_Kontakte_Termine" description="Anzahl der Kontakte/Termine" maxvalue="99" name="anzahl_kontakte_termine" target="a" minvalue="0"/>
+          <int formularname="Anzahl_der_Stunden" description="Anzahl der Stunden" maxvalue="99" name="anzahl_der_stunden" target="a" minvalue="0"/>
+          <int formularname="Zeitraum_Fallmanagement" description="Zeitraum Fallmanagement (in Wochen)" maxvalue="250" name="zeitraum_fallmanagement" target="b" minvalue="0"/>
+        </group>
+        <group description="Angaben zur Beendigung des CM" name="angabenzurbeendigungdescm" target="c" containers="a,b,c">
+          <date formularname="Beendigung" description="Beendigung" name="beendigung_5" target="a"/>
+          <choice formularname="Art_Beendigung" description="Art der Beendigung" name="art_beendigung" target="a" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="regulär" value="0" name="regulaer"/>
+            <bool description="Abbruch" value="1" name="abbruch"/>
+          </choice>
+          <choice formularname="Abbruch_durch" description="Abbruch durch" name="abbruch_durch" target="b" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="Jugendliche" value="0" name="jugendliche"/>
+            <bool description="Kompetenzagentur" value="1" name="kompetenzagentur"/>
+            <bool description="Sorgeberechtigte" value="2" name="sorgeberechtigte"/>
+          </choice>
+          <choice formularname="Gründe_Abbruch" description="Gründe für den Abbruch" name="gruende_abbruch" target="c" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="persönliche Gründe" value="0" name="persoenlichegruende"/>
+            <bool description="Umzug" value="1" name="umzug"/>
+            <bool description="Krankheit" value="2" name="krankheit"/>
+            <bool description="Altersüberschreitung" value="3" name="altersueberschreitung"/>
+            <bool description="mangelnde Mitarbeit des Jugendlichen" value="4" name="mangelndemitarbeitdesjugendlichen"/>
+            <bool description="Konflikte" value="5" name="konflikte"/>
+            <bool description="Haft/U-Haft" value="6" name="haftu_haft"/>
+            <bool description="Sonstiges" value="-2" name="sonstiges"/>
+          </choice>
+          <text formularname="Gründe_Sonstiges_Nennung" description="Nennung Sonstiges" maxlength="60" name="gruende_sonstiges_nennung_4" target="c" size="40"/>
+        </group>
+        <group description="Angaben zur Vermittlung nach dem CM" name="angabenzurvermittlungnachdemcm" target="d" containers="a,b">
+          <group description="Nach der Beendigung des CM wurde der Jugendliche vermittelt" name="nachderbeendigungdescmwurdederjugendlichevermittelt" target="a" invisible="s" containers="a" modes="-mode1.2">
+            <choice formularname="Vermittlung" description="Nach der Beendigung des CM wurde der Jugendliche vermittelt" name="vermittlung" target="a" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="in die Schule" value="0" name="indieschule"/>
+              <bool description="in eine Maßnahme" value="1" name="ineinemassnahme"/>
+              <bool description="in die Ausbildung" value="2" name="indieausbildung"/>
+              <bool description="in die Arbeit" value="3" name="indiearbeit"/>
+              <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              <bool description="gar nicht vermittelt" value="4" name="garnichtvermittelt"/>
+            </choice>
+            <text formularname="Vermittlung_Nennung" description="Vermittlung Nennung" maxlength="100" name="vermittlung_nennung" target="a" size="40"/>
+          </group>
+          <choice formularname="Veränderungen_Rechtskreis" description="Veränderungen im Rechtskreis" name="veraenderungen_rechtskreis" target="b" size="1">
+            <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+            <bool description="SGB II" value="0" name="sgbii"/>
+            <bool description="SGB III" value="1" name="sgbiii"/>
+            <bool description="SGB VIII" value="2" name="sgbviii"/>
+          </choice>
+        </group>
+      </group>
+    </page>
+    <group description="Erreichte Ziele" name="52erreichteziele">
+      <page description="Berufliche Integration" name="page_17">
+        <group description="Erreichte Ziele" name="erreichteziele" invisible="s" containers="a,b">
+          <info value="Erreichte Ziele" name="info-23" target="a" invisible="s"/>
+          <group formularname="Berufliche_Integration" description="Berufliche Integration" name="berufliche_integration" target="b" invisible="s" containers="a,b,c,d">
+            <info value="Berufliche Integration" name="info-22" target="a" invisible="s"/>
+            <group description="erworbene Abschlüsse" name="erworbeneabschluesse" target="b" containers="a,b">
+              <choice formularname="allgemein_bildender_Schulabschluss" description="allgemein bildender Schulabschluss" name="allgemein_bildender_schulabschluss" target="a" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="kein Abschluss" value="0" name="keinabschluss"/>
+                <bool description="Abschluss Sonderschule" value="1" name="abschlusssonderschule"/>
+                <bool description="Hauptschulabschluss (HSA)" value="2" name="hauptschulabschlusshsa"/>
+                <bool description="erweiterter/qualifizierter HSA" value="3" name="erweiterterqualifizierterhsa"/>
+                <bool description="Realschulabschluss/Mittlere Reife" value="4" name="realschulabschlussmittlerereife"/>
+                <bool description="Fachhochschulreife" value="5" name="fachhochschulreife"/>
+                <bool description="Abitur" value="6" name="abitur"/>
+                <bool description="anderer Schulabschluss" value="7" name="andererschulabschluss"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="allgemein_bildender_Schulabschluss_Sonstiges_Nennung" description="Sonstiges" maxlength="255" name="allgemein_bildender_schulabschluss_sonstiges_nennung" target="a" size="40"/>
+              <choice formularname="Maßnahmeabschluss" description="Maßnahmeabschluss" name="massnahmeabschluss" target="b" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="BGJ (Berufsgrundschuljahr)" value="0" name="bgjberufsgrundschuljahr"/>
+                <bool description="BVJ (Berufsvorbereitungsjahr)" value="1" name="bvjberufsvorbereitungsjahr"/>
+                <bool description="Berufsfachschule ohne Abschluss" value="2" name="berufsfachschuleohneabschluss"/>
+                <bool description="Grundausbildungslehrgang G" value="3" name="grundausbildungslehrgangg"/>
+                <bool description="Testen Informieren Probieren Tip" value="4" name="testeninformierenprobierentip"/>
+                <bool description="Förderlehrgang F" value="5" name="foerderlehrgangf"/>
+                <bool description="Jugend ABM" value="6" name="jugendabm"/>
+                <bool description="Arbeiten und Lernen" value="7" name="arbeitenundlernen"/>
+                <bool description="Arbeit statt Sozialhilfe" value="8" name="arbeitstattsozialhilfe"/>
+                <bool description="Sonderprogramme (JUMP, FSTJ, BQF)" value="9" name="sonderprogrammejumpfstjbqf"/>
+                <bool description="EQJ" value="10" name="eqj"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+            </group>
+            <group description="erzielter Ãœbergang" name="erzielteruebergang" target="c" containers="a,b,c,d,e,f,g,h">
+              <choice formularname="Schulart" description="Schulart" name="schulart" target="a" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Sonderschule/Förderschule" value="0" name="sonderschulefoerderschule"/>
+                <bool description="Hauptschule" value="1" name="hauptschule"/>
+                <bool description="Gesamtschule" value="2" name="gesamtschule"/>
+                <bool description="Realschule" value="3" name="realschule"/>
+                <bool description="Gymnasium" value="4" name="gymnasium"/>
+                <bool description="Berufsfachschule" value="5" name="berufsfachschule"/>
+                <bool description="sonstige Schule" value="6" name="sonstigeschule"/>
+              </choice>
+              <text formularname="Schule_Sonstiges_Nennung" description="Sonstiges" maxlength="100" name="schule_sonstiges_nennung" target="a" size="40"/>
+              <int formularname="Klassenstufe" description="Klassenstufe" maxvalue="13" name="klassenstufe_1" target="b" minvalue="0" modes="-mode1.1anon"/>
+              <choice formularname="Ausbildung" description="Ausbildung" name="ausbildung" target="c" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="betrieblich" value="0" name="betrieblich"/>
+                <bool description="Verbundausbildung" value="1" name="verbundausbildung"/>
+                <bool description="außerbetrieblich" value="2" name="ausserbetrieblich"/>
+                <bool description="schulisch" value="3" name="schulisch"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Ausbildung_Sonstiges_Nennung" description="Sonstiges" maxlength="60" name="ausbildung_sonstiges_nennung" target="c" size="40"/>
+              <choice formularname="Umschulung" description="Umschulung" name="umschulung" target="d" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Ja" value="1" name="Ja"/>
+                <bool description="Nein" value="0" name="Nein"/>
+              </choice>
+              <text formularname="Umschulung_Nennung" description="Nennung" maxlength="255" name="umschulung_nennung" target="d" size="40"/>
+              <text formularname="Arbeitstätigkeit" description="Arbeitstätigkeit" maxlength="255" name="arbeitstaetigkeit" target="e" size="40"/>
+              <choice formularname="Erwerbstatus" description="Erwerbstatus" name="erwerbstatus" target="f" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="festangestellt unbefristet" value="0" name="festangestelltunbefristet"/>
+                <bool description="festangestellt befristet" value="1" name="festangestelltbefristet"/>
+                <bool description="freiberuflich" value="2" name="freiberuflich"/>
+                <bool description="selbstständig" value="3" name="selbststaendig"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Erwerbsstatus_Sonstiges_Nennung" description="Sonstiges" maxlength="255" name="erwerbsstatus_sonstiges_nennung" target="f" size="40"/>
+              <choice formularname="Beschäftigungsumfang" description="Beschäftigungsumfang" name="beschaeftigungsumfang" target="g" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="teilzeitbeschäftigt" value="0" name="teilzeitbeschaeftigt"/>
+                <bool description="vollzeitbeschäftigt" value="1" name="vollzeitbeschaeftigt"/>
+                <bool description="geringfügig beschäftigt" value="2" name="geringfuegigbeschaeftigt"/>
+              </choice>
+              <choice formularname="Kategorien_Nichterwerbsarbeit_Nichtausbildung" description="Kategorien Nichterwerbsarbeit und Nichtausbildung" name="kategorien_nichterwerbsarbeit_nichtausbildung" target="h" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Arbeitslosigkeit" value="0" name="arbeitslosigkeit"/>
+                <bool description="Hausarbeit/Familienarbeit/Kindererziehung" value="1" name="hausarbeitfamilienarbeitkindererziehung"/>
+                <bool description="Wehr-/Zivildienst" value="2" name="wehr_zivildienst"/>
+                <bool description="Freiwilliges Soziales Jahr und ähnliches" value="3" name="freiwilligessozialesjahrundaehnliches"/>
+                <bool description="Strafvollzug" value="4" name="strafvollzug"/>
+                <bool description="Verlassen der BRD" value="5" name="verlassenderbrd"/>
+                <bool description="noch offen" value="6" name="nochoffen"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+              </choice>
+              <text formularname="Kategorien_Sonstiges_Nennung" description="Sonstiges" maxlength="60" name="kategorien_sonstiges_nennung" target="h" size="40"/>
+            </group>
+            <group description="Eingliederung" name="eingliederung" target="d" containers="a">
+              <choice formularname="Zeitraum_Nachbetreuung" description="Zeitraum der Nachbetreuung" name="zeitraum_nachbetreuung" target="a" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="bis zu 1 Monat" value="0" name="biszu1monat"/>
+                <bool description="bis zu 3 Monaten" value="1" name="biszu3monaten"/>
+                <bool description="bis zu 6 Monaten" value="2" name="biszu6monaten"/>
+                <bool description="mehr als 6 Monate" value="3" name="mehrals6monate"/>
+              </choice>
+              <choice formularname="Verbleib_Nachbetreuung" description="Verbleib nach Nachbetreuung" name="verbleib_nachbetreuung" target="a" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Schule" value="0" name="schule"/>
+                <bool description="Ausbildung" value="1" name="ausbildung"/>
+                <bool description="Erwerbsarbeit" value="2" name="erwerbsarbeit"/>
+                <bool description="Lehrgänge/Maßnahmen" value="3" name="lehrgaengemassnahmen"/>
+                <bool description="Umschulung" value="4" name="umschulung"/>
+                <bool description="Arbeitslosigkeit" value="5" name="arbeitslosigkeit"/>
+                <bool description="Hausarbeit/Familienarbeit/Kindererziehung" value="6" name="hausarbeitfamilienarbeitkindererziehung"/>
+                <bool description="Wehr-/Zivildienst" value="7" name="wehr_zivildienst"/>
+                <bool description="Freiwilliges Soziales Jahr und Ähnliches" value="8" name="freiwilligessozialesjahrundaehnliches"/>
+                <bool description="Strafvollzug" value="9" name="strafvollzug"/>
+                <bool description="Verlassen der BRD" value="10" name="verlassenderbrd"/>
+                <bool description="Sonstiges" value="-2" name="sonstiges"/>
+                <bool description="unbekannt" value="12" name="unbekannt"/>
+              </choice>
+            </group>
+          </group>
+        </group>
+      </page>
+      <page description="Soziale Integration" name="page_18">
+        <group description="Erreichte Ziele" name="erreichteziele" invisible="s">
+          <group formularname="Soziale_Integration" description="Soziele Integration" name="soziale_integration" invisible="s" containers="a,b,c">
+            <info value="Soziale Integration" name="info-24" target="a" invisible="s"/>
+            <group description="gesellschaftliche Bezugssysteme" name="gesellschaftlichebezugssysteme" target="b" containers="a,b,c,d">
+              <choice formularname="Mitgliedschaft_Organisationen_Vereinen" description="Mitgliedschaft in Organisationen und Vereinen" name="mitgliedschaft_organisationen_vereinen" target="a" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Ja" value="1" name="Ja"/>
+                <bool description="Nein" value="0" name="Nein"/>
+              </choice>
+              <choice formularname="Intensität_Mitgliedschaft" description="Intensität der Mitgliedschaft" name="intensitaet_mitgliedschaft" target="a" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr aktiv" value="0" name="sehraktiv"/>
+                <bool description="aktiv" value="1" name="aktiv"/>
+                <bool description="passiv" value="2" name="passiv"/>
+              </choice>
+              <choice formularname="Nutzung_Kulturangeboten" description="Nutzung von Kulturangeboten" name="nutzung_kulturangeboten" target="b" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="Ja" value="1" name="Ja"/>
+                <bool description="Nein" value="0" name="Nein"/>
+              </choice>
+              <choice formularname="Häufigkeit" description="Häufigkeit" name="haeufigkeit" target="b" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr häufig" value="0" name="sehrhaeufig"/>
+                <bool description="häufig" value="1" name="haeufig"/>
+                <bool description="selten" value="2" name="selten"/>
+                <bool description="nie" value="3" name="nie"/>
+              </choice>
+              <text formularname="soziales_Engagement" description="soziales Engagement" maxlength="255" name="soziales_engagement" target="c" size="40"/>
+              <choice formularname="Unternehmungen_Freunden" description="gemeinsame Unternehmungen mit Freunden" name="unternehmungen_freunden" target="d" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr häufig" value="0" name="sehrhaeufig"/>
+                <bool description="häufig" value="1" name="haeufig"/>
+                <bool description="selten" value="2" name="selten"/>
+                <bool description="nie" value="3" name="nie"/>
+              </choice>
+              <choice formularname="Unternehmungen_Familie" description="gemeinsame Unternehmungen mit Familie" name="unternehmungen_familie" target="d" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr häufig" value="0" name="sehrhaeufig"/>
+                <bool description="häufig" value="1" name="haeufig"/>
+                <bool description="selten" value="2" name="selten"/>
+                <bool description="nie" value="3" name="nie"/>
+              </choice>
+            </group>
+            <group description="persönliche Bezugssysteme" name="persoenlichebezugssysteme" target="c" containers="a,b,c,d,e">
+              <choice formularname="Peergroup" description="Stabilität der Beziehungen zur Peergroup" name="peergroup" target="a" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr stabil" value="0" name="sehrstabil"/>
+                <bool description="stabil" value="1" name="stabil"/>
+                <bool description="weniger stabil" value="2" name="wenigerstabil"/>
+                <bool description="nicht vorhanden" value="3" name="nichtvorhanden"/>
+              </choice>
+              <choice formularname="Familie" description="Stabilität der familiären Beziehungen oder Beziehungen zu einzelnen Familienmitgliedern" name="familie_1" target="b" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr stabil" value="0" name="sehrstabil"/>
+                <bool description="stabil" value="1" name="stabil"/>
+                <bool description="weniger stabil" value="2" name="wenigerstabil"/>
+                <bool description="nicht vorhanden" value="3" name="nichtvorhanden"/>
+              </choice>
+              <choice formularname="Beziehung" description="Stabilität der partnerschaftlichen Beziehung" name="beziehung" target="c" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr stabil" value="0" name="sehrstabil"/>
+                <bool description="stabil" value="1" name="stabil"/>
+                <bool description="weniger stabil" value="2" name="wenigerstabil"/>
+                <bool description="nicht vorhanden" value="3" name="nichtvorhanden"/>
+              </choice>
+              <choice formularname="Arbeit_Schule" description="Soziale Kontakte im Arbeitskollegium/Schulklasse" name="arbeit_schule" target="d" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr stabil" value="0" name="sehrstabil"/>
+                <bool description="stabil" value="1" name="stabil"/>
+                <bool description="weniger stabil" value="2" name="wenigerstabil"/>
+                <bool description="nicht vorhanden" value="3" name="nichtvorhanden"/>
+              </choice>
+              <choice formularname="bester_Freund_Freundin" description="Stabilität der Beziehung zur besten Freundin/zum besten Freund" name="bester_freund_freundin" target="e" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="sehr stabil" value="0" name="sehrstabil"/>
+                <bool description="stabil" value="1" name="stabil"/>
+                <bool description="weniger stabil" value="2" name="wenigerstabil"/>
+                <bool description="nicht vorhanden" value="3" name="nichtvorhanden"/>
+              </choice>
+            </group>
+          </group>
+        </group>
+      </page>
+      <page description="Einschätzung des Case-Managers" name="page_19">
+        <group description="Erreichte Ziele" name="erreichteziele" invisible="s" containers="a,b">
+          <info value="Einschätzung des Case-Managers" name="info-25" target="a" invisible="s"/>
+          <group formularname="Einschätzung_Case-Managers" description="Einschätzung des Case-Managers" name="einschaetzung_case_managers" target="b" invisible="s" containers="a,b,c">
+            <choice formularname="Einschätzung_Zielerreichung" description="Einschätzung der Zielerreichung" name="einschaetzung_zielerreichung" target="a" size="1">
+              <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+              <bool description="voll erreicht" value="0" name="vollerreicht"/>
+              <bool description="eher erreicht" value="1" name="ehererreicht"/>
+              <bool description="eher nicht erreicht" value="2" name="ehernichterreicht"/>
+              <bool description="überhaupt nicht erreicht" value="3" name="ueberhauptnichterreicht"/>
+            </choice>
+            <group description="Einschätzung zur beruflichen Integration" name="einschaetzungzurberuflichenintegration" target="b">
+              <choice formularname="erreichte_Qualifikation" description="Die erreichte Qualifizierung entspricht den Vorstellungen und Fähigkeiten des Jugendlichen" name="erreichte_qualifikation" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="trifft vollkommen zu" value="0" name="trifftvollkommenzu"/>
+                <bool description="trifft eher zu" value="1" name="triffteherzu"/>
+                <bool description="trifft eher nicht zu" value="2" name="trifftehernichtzu"/>
+                <bool description="trifft nicht zu" value="3" name="trifftnichtzu"/>
+              </choice>
+              <choice formularname="Integration_ist_nachhaltig" description="Die berufliche Integration des Jugendlichen ist nachhaltig" name="integration_ist_nachhaltig" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="trifft vollkommen zu" value="0" name="trifftvollkommenzu"/>
+                <bool description="trifft eher zu" value="1" name="triffteherzu"/>
+                <bool description="trifft eher nicht zu" value="2" name="trifftehernichtzu"/>
+                <bool description="trifft nicht zu" value="3" name="trifftnichtzu"/>
+              </choice>
+              <choice formularname="selbstständige_Berufswegplanung" description="Durch berufliche Integration wurde der Jugendliche zur selbstständigen Berufswegplanung befähigt" name="selbststaendige_berufswegplanung" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="trifft vollkommen zu" value="0" name="trifftvollkommenzu"/>
+                <bool description="trifft eher zu" value="1" name="triffteherzu"/>
+                <bool description="trifft eher nicht zu" value="2" name="trifftehernichtzu"/>
+                <bool description="trifft nicht zu" value="3" name="trifftnichtzu"/>
+              </choice>
+            </group>
+            <group description="Einschätzung zur sozialen Integration" name="einschaetzungzursozialenintegration" target="c">
+              <choice formularname="eigenständige_Lebensgestaltung" description="Der Jugendliche ist zur eigenständigen Lebensgestaltung befähigt" name="eigenstaendige_lebensgestaltung" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="trifft vollkommen zu" value="0" name="trifftvollkommenzu"/>
+                <bool description="trifft eher zu" value="1" name="triffteherzu"/>
+                <bool description="trifft eher nicht zu" value="2" name="trifftehernichtzu"/>
+                <bool description="trifft nicht zu" value="3" name="trifftnichtzu"/>
+              </choice>
+              <choice formularname="soziale_Bezugssysteme" description="Der Jugendliche ist nachhaltig in soziale Bezugssysteme integriert" name="soziale_bezugssysteme" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="trifft vollkommen zu" value="0" name="trifftvollkommenzu"/>
+                <bool description="trifft eher zu" value="1" name="triffteherzu"/>
+                <bool description="trifft eher nicht zu" value="2" name="trifftehernichtzu"/>
+                <bool description="trifft nicht zu" value="3" name="trifftnichtzu"/>
+              </choice>
+              <choice formularname="Teilnahme_gesellschaftliches_Leben" description="Der Jugendliche hat nachhaltig Teilhabe am gesellschaftlichen Leben" name="teilnahme_gesellschaftliches_leben" size="1">
+                <bool checked="s" description="Keine Angabe" value="-1" name="keineangabe"/>
+                <bool description="trifft vollkommen zu" value="0" name="trifftvollkommenzu"/>
+                <bool description="trifft eher zu" value="1" name="triffteherzu"/>
+                <bool description="trifft eher nicht zu" value="2" name="trifftehernichtzu"/>
+                <bool description="trifft nicht zu" value="3" name="trifftnichtzu"/>
+              </choice>
+            </group>
+          </group>
+        </group>
+      </page>
+    </group>
+    <page description="Freie Dokumentation" name="page_20">
+      <group description="Freie Dokumentation zur Abschlussbewertung" name="freiedokumentationzurabschlussbewertung" invisible="s" containers="a,b">
+        <info value="Abschlussbewertung" name="info-26" target="a" invisible="s"/>
+        <textarea rows="40" formularname="Freie_Dokumentation_Abschlussbewertung" description="Freie Dokumentation zur Abschlussbewertung" cols="80" name="freie_dokumentation_abschlussbewertung" target="b" modes="-mode1.1anon"/>
+      </group>
+    </page>
+  </group>
+</document>

Added: trunk/formed/laender.xml
===================================================================
--- trunk/formed/laender.xml	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/formed/laender.xml	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document xmlns:tmp="http://www.xfa.org/schema/xfa-template/2.5/"><choice><bool value="0" description="Afghanistan"/><bool value="1" description="Albanien"/><bool value="2" description="Algerien"/><bool value="3" description="Andorra"/><bool value="4" description="Angola"/><bool value="5" description="Antigua und Barbuda"/><bool value="6" description="Argentinien"/><bool value="7" description="Armenien"/><bool value="8" description="Aserbaidschan"/><bool value="9" description="Australien"/><bool value="10" description="Bahamas"/><bool value="11" description="Bahrain"/><bool value="12" description="Bangladesch"/><bool value="13" description="Barbados"/><bool value="14" description="Belgien"/><bool value="15" description="Belize"/><bool value="16" description="Benin"/><bool value="17" description="Bhutan"/><bool value="18" description="Bolivien"/><bool value="19" description="Bosnien und Herzegowina"/><bool value="20" description="Botsuana"/><bool value="21" description="Brasilien"/><bool value="22" description="Brunei"/><bool value="23" description="Bulgarien"/><bool value="24" description="Burkina Faso"/><bool value="25" description="Burundi"/><bool value="26" description="Chile"/><bool value="27" description="China"/><bool value="28" description="Costa Rica"/><bool value="29" description="Deutschland"/><bool value="30" description="Dominica"/><bool value="31" description="Dominikanische Republik"/><bool value="32" description="Dschibuti"/><bool value="33" description="Dänemark"/><bool value="34" description="Ecuador"/><bool value="35" description="El Salvador"/><bool value="36" description="Elfenbeinküste"/><bool value="37" description="Eritrea"/><bool value="38" description="Estland"/><bool value="39" description="Fidschi"/><bool value="40" description="Finnland"/><bool value="41" description="Frankreich"/><bool value="42" description="Frankreich"/><bool value="43" description="Gabun"/><bool value="44" description="Gambia"/><bool value="45" description="Georgien"/><bool value="46" description="Ghana"/><bool value="47" description="Grenada"/><bool value="48" description="Griechenland"/><bool value="49" description="Großbritannien"/><bool value="50" description="Guatemala"/><bool value="51" description="Guinea"/><bool value="52" description="Guinea-Bissau"/><bool value="53" description="Guyana"/><bool value="54" description="Haiti"/><bool value="55" description="Honduras"/><bool value="56" description="Indien"/><bool value="57" description="Indonesien"/><bool value="58" description="Irak"/><bool value="59" description="Iran"/><bool value="60" description="Irland"/><bool value="61" description="Island"/><bool value="62" description="Israel"/><bool value="63" description="Italien"/><bool value="64" description="Italien"/><bool value="65" description="Jamaika"/><bool value="66" description="Japan"/><bool value="67" description="Jemen"/><bool value="68" description="Jordanien"/><bool value="69" description="Kambodscha"/><bool value="70" description="Kamerun"/><bool value="71" description="Kanada"/><bool value="72" description="Kap Verde"/><bool value="73" description="Kasachstan"/><bool value="74" description="Katar"/><bool value="75" description="Kenia"/><bool value="76" description="Kirgisistan"/><bool value="77" description="Kiribati"/><bool value="78" description="Kolumbien"/><bool value="79" description="Komoren"/><bool value="80" description="Kongo, Demokratische Republik"/><bool value="81" description="Kongo, Republik"/><bool value="82" description="Korea, Demokratische Volksrepublik"/><bool value="83" description="Korea, Republik"/><bool value="84" description="Kroatien"/><bool value="85" description="Kuba"/><bool value="86" description="Kuwait"/><bool value="87" description="Laos"/><bool value="88" description="Lesotho"/><bool value="89" description="Lettland"/><bool value="90" description="Libanon"/><bool value="91" description="Liberia"/><bool value="92" description="Libyen"/><bool value="93" description="Liechtenstein"/><bool value="94" description="Litauen"/><bool value="95" description="Luxemburg"/><bool value="96" description="Madagaskar"/><bool value="97" description="Malawi"/><bool value="98" description="Malaysia"/><bool value="99" description="Malediven"/><bool value="100" description="Mali"/><bool value="101" description="Malta"/><bool value="102" description="Marokko"/><bool value="103" description="Marshallinseln"/><bool value="104" description="Mauretanien"/><bool value="105" description="Mauritius"/><bool value="106" description="Mazedonien"/><bool value="107" description="Mexiko"/><bool value="108" description="Mikronesien"/><bool value="109" description="Moldawien"/><bool value="110" description="Monaco"/><bool value="111" description="Mongolei"/><bool value="112" description="Montenegro"/><bool value="113" description="Mosambik"/><bool value="114" description="Myanmar"/><bool value="115" description="Namibia"/><bool value="116" description="Nauru"/><bool value="117" description="Nepal"/><bool value="118" description="Neuseeland"/><bool value="119" description="Nicaragua"/><bool value="120" description="Niederlande"/><bool value="121" description="Niger"/><bool value="122" description="Nigeria"/><bool value="123" description="Norwegen"/><bool value="124" description="Oman"/><bool value="125" description="Osttimor"/><bool value="126" description="Pakistan"/><bool value="127" description="Palau"/><bool value="128" description="Panama"/><bool value="129" description="Papua-Neuguinea"/><bool value="130" description="Paraguay"/><bool value="131" description="Peru"/><bool value="132" description="Philippinen"/><bool value="133" description="Polen"/><bool value="134" description="Portugal"/><bool value="135" description="Ruanda"/><bool value="136" description="Rumänien"/><bool value="137" description="Russland"/><bool value="138" description="Salomonen"/><bool value="139" description="Sambia"/><bool value="140" description="Samoa"/><bool value="141" description="San Marino"/><bool value="142" description="Saudi-Arabien"/><bool value="143" description="Schweden"/><bool value="144" description="Schweiz"/><bool value="145" description="Senegal"/><bool value="146" description="Serbien"/><bool value="147" description="Seychellen"/><bool value="148" description="Sierra Leone"/><bool value="149" description="Simbabwe"/><bool value="150" description="Singapur"/><bool value="151" description="Slowakei"/><bool value="152" description="Slowenien"/><bool value="153" description="Somalia"/><bool value="154" description="Spanien"/><bool value="155" description="Spanien"/><bool value="156" description="Sri Lanka"/><bool value="157" description="St. Kitts und Nevis"/><bool value="158" description="St. Lucia"/><bool value="159" description="St. Vincent und die Grenadinen"/><bool value="160" description="Sudan"/><bool value="161" description="Suriname"/><bool value="162" description="Swasiland"/><bool value="163" description="Syrien"/><bool value="164" description="São Tomé und Príncipe"/><bool value="165" description="Südafrika"/><bool value="166" description="Tadschikistan"/><bool value="167" description="Tansania"/><bool value="168" description="Thailand"/><bool value="169" description="Togo"/><bool value="170" description="Tonga"/><bool value="171" description="Trinidad und Tobago"/><bool value="172" description="Tschad"/><bool value="173" description="Tschechien"/><bool value="174" description="Tunesien"/><bool value="175" description="Turkmenistan"/><bool value="176" description="Tuvalu"/><bool value="177" description="Türkei"/><bool value="178" description="Uganda"/><bool value="179" description="Ukraine"/><bool value="180" description="Ungarn"/><bool value="181" description="Uruguay"/><bool value="182" description="Usbekistan"/><bool value="183" description="Vanuatu"/><bool value="184" description="Vatikanstadt"/><bool value="185" description="Venezuela"/><bool value="186" description="Vereinigte Arabische Emirate"/><bool value="187" description="Vereinigte Staaten von Amerika"/><bool value="188" description="Vietnam"/><bool value="189" description="Weißrussland"/><bool value="190" description="Zentralafrikanische Republik"/><bool value="191" description="Zypern"/><bool value="192" description="Ägypten"/><bool value="193" description="Äquatorialguinea"/><bool value="194" description="Äthiopien"/><bool value="195" description="Österreich"/></choice></document>

Added: trunk/formed/privacy_statement.html
===================================================================
--- trunk/formed/privacy_statement.html	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/formed/privacy_statement.html	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>Einverständniserklärung</title>
+<meta name="generator" content="Bluefish 1.0.7">
+<meta name="date" content="2007-11-15T22:22:38+0100">
+<meta name="copyright" content="Intevation GmbH">
+<meta name="keywords" content="">
+<meta name="description" content="">
+<meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8">
+<meta http-equiv="content-style-type" content="text/css">
+<meta http-equiv="expires" content="0">
+<link href="/styles/all.css" media="all" rel="stylesheet" type="text/css">
+<link href="/styles/print.css'" media="screen" rel="stylesheet" type="text/css">
+<link href="/styles/print.css}" media="print" rel="stylesheet" type="text/css">
+<style type="text/css">
+.statement_content {
+	margin-bottom: 10em;
+}
+.statement_signs {
+	margin: 4em 0;
+}
+</style>
+<script type="text/javascript">
+<!--
+
+// -->
+</script>
+<body>
+<h1>Einwilligungserklärung</h1>
+<div class="statement_content">
+<p><strong>gemäß den Bestimmungen des §4a Bundesdatenschutzgesetz</strong></p>
+<p>Hiermit willige ich, <strong>$VORNAME $NACHNAME</strong>
+wohnhaft in, <strong>$PLZ $ORT</strong></p>
+<p>
+ein, dass die Kompetenzagentur $KA_NAME im Rahmen ihrer Aufgabe, mich bei meiner beruflichen und
+sozialen Eingliederung zu unterstützen, alle dazu erforderlichen Daten, die meine Person betreffen,
+erheben, verarbeiten und nutzen kann. Diese Daten werden grundsätzlich bei mir erhoben.
+</p>
+<p>
+Aus den Daten erstellt die Kompetenzagentur $KA_NAME im Rahmen ihrer Begleitung (Case-Management)
+einen Förder- und Entwicklungsplan, der die wichtigsten Angaben zu meiner persönlichen,
+beruflichen und sozialen Integration enthält. Aus diesem Grund werden auch Daten erhoben, die
+meine Gesundheit betreffen, so fern sie ärztlich attestiert sind. Sie werden verwendet um ein
+vollständiges Förderprofil zu erstellen, das alle Beeinträchtigungen berücksichtigt.
+</p>
+<p>
+Zum Zweck der wissenschaftlichen Begleitung und Auswertung sowie für die Erfassung von
+statistischen Angaben werden die von mir bei der Kompetenzagentur $KA_NAME erhobenen Daten
+anonymisiert und an den Projektträger im DLR für das Bundesministerium für Familie, Senioren,
+Frauen und Jugend (PT-DLR, Bonn) weitergeleitet. Anonymisiert heißt, dass alle Daten zu Namen
+und Adresse unkenntlich gemacht werden und die weiteren Daten somit nicht mehr mit meiner
+Person in Zusammenhang gebracht werden können. Mit diesen Daten wird PT-DLR ermitteln, ob und
+wie die Ziele des Programms ,,Kompetenzagenturen " erreicht wurden.
+</p>
+<p>
+Diese Einwilligung kann ich jederzeit widerrufen. Mir ist bewusst, dass dadurch unter Umständen eine
+Begleitung durch die Kompetenzagentur $KA_NAME nicht mehr in dem geplanten oder erforderlichen Umfang
+gewährleistet werden kann.
+Ziehe ich meinen Auftrag, mich von der Kompetenzagentur $KA_NAME bei der beruflichen und sozialen
+Integration begleiten zu lassen zurück, sind alle über mich gespeicherten Daten sofort zu löschen.
+Eine automatische Löschung meiner Daten bei der Kompetenzagentur $KA_NAME findet in jedem Fall Z
+Monate nach Abschluss der Begleitung statt.
+Ausgeschlossen von dieser Löschung bleiben die Angaben auf der Teilnehmerliste (z. B. Name,
+Anschrift, Datum Erstkontakt etc.) Die Angaben auf der Teilnehmerliste werden elektronisch nicht
+verarbeitet und dienen der Kompetenzagentur $KA_NAME und dem PT-DLR zu abrechnungstechnischen
+Zwecken.
+</p>
+<p>
+Ich habe jederzeit die Möglichkeit meine Fallakte bei der Kompetenzagentur $KA_NAME einzusehen.
+</p>
+</div>
+<div class="statement_signs">
+<table cellspacing=5 cellpadding=0 width="100%" border=0>
+  <tbody>
+  <tr>
+    <td style="text-align: left; border:0">_________________, den __.__.____</td>
+    <td style="text-align: right; border:0">________________, den __.__.____</td>
+  </tr>
+  <tr>
+    <td style="height: 5em; vertical-align: bottom;  text-align: left; border:0">(
+    $VORNAME $NACHNAME )</td>
+    <td style="height: 5em; vertical-align: bottom; text-align: right; border:0">( MitarbeiterIn der KA )</td>
+   </tr>
+  </tbody>
+</table>
+</div>
+</body>
+</html>

Added: trunk/formed/sprachen.xml
===================================================================
--- trunk/formed/sprachen.xml	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/formed/sprachen.xml	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document xmlns:tmp="http://www.xfa.org/schema/xfa-template/2.5/"><choice><bool value="0" description="Afrikaans"/><bool value="1" description="Albanisch"/><bool value="2" description="Amharisch"/><bool value="3" description="Arabisch"/><bool value="4" description="Aramäisch"/><bool value="5" description="Armenisch"/><bool value="6" description="Aserbaidschanisch"/><bool value="7" description="Assami"/><bool value="8" description="Äthiopisch"/><bool value="9" description="Azeri"/><bool value="10" description="Baskisch"/><bool value="11" description="Bengali"/><bool value="12" description="Bulgarisch"/><bool value="13" description="Burmesisch"/><bool value="14" description="Chinesisch"/><bool value="15" description="Dänisch"/><bool value="16" description="Darginisch"/><bool value="17" description="Dari"/><bool value="18" description="Deutsch"/><bool value="19" description="Englisch"/><bool value="20" description="Estnisch"/><bool value="21" description="Farsi"/><bool value="22" description="Finnisch"/><bool value="23" description="Französisch"/><bool value="24" description="Galla"/><bool value="25" description="Galizisch"/><bool value="26" description="Ge'ez"/><bool value="27" description="Georgisch"/><bool value="28" description="Glagolitisch"/><bool value="29" description="Griechisch"/><bool value="30" description="Gujarati"/><bool value="31" description="Haussa"/><bool value="32" description="Hebräisch"/><bool value="33" description="Hindi"/><bool value="34" description="Indonesisch"/><bool value="35" description="Inuktitut"/><bool value="36" description="Irisch"/><bool value="37" description="Isländisch"/><bool value="38" description="Italienisch"/><bool value="39" description="Japanisch"/><bool value="40" description="Jawi"/><bool value="41" description="Jiddisch"/><bool value="42" description="Kabardianisch"/><bool value="43" description="Kanarese"/><bool value="44" description="Kannada"/><bool value="45" description="Kasachisch"/><bool value="46" description="Katalanisch"/><bool value="47" description="Khmer"/><bool value="48" description="Kirgisisch"/><bool value="49" description="Koptisch"/><bool value="50" description="Koreanisch"/><bool value="51" description="Krimtatarisch"/><bool value="52" description="Kroatisch"/><bool value="53" description="Kurdisch"/><bool value="54" description="Laotisch"/><bool value="55" description="Lateinisch"/><bool value="56" description="Lettisch"/><bool value="57" description="Lihijanisch"/><bool value="58" description="Litauisch"/><bool value="59" description="Luxemburgisch"/><bool value="60" description="Makedonisch"/><bool value="61" description="Malayalam"/><bool value="62" description="Malaiisch"/><bool value="63" description="Maledivisch"/><bool value="64" description="Maori"/><bool value="65" description="Marathi"/><bool value="66" description="Moabitisch"/><bool value="67" description="Moldawisch"/><bool value="68" description="Mongolisch"/><bool value="69" description="Nabatäisch"/><bool value="70" description="Nepalesisch"/><bool value="71" description="Niederländisch"/><bool value="72" description="Norwegisch"/><bool value="73" description="Ossetisch"/><bool value="74" description="Paschto"/><bool value="75" description="Persisch"/><bool value="76" description="Polnisch"/><bool value="77" description="Portugiesisch"/><bool value="78" description="Punjabi"/><bool value="79" description="Rätoromanisch"/><bool value="80" description="Rumänisch"/><bool value="81" description="Russisch"/><bool value="82" description="Safatenisch"/><bool value="83" description="Samoanisch"/><bool value="84" description="Sanskrit"/><bool value="85" description="Schwedisch"/><bool value="86" description="Serbisch"/><bool value="87" description="Sindhi"/><bool value="88" description="Singhalesisch"/><bool value="89" description="Slowakisch"/><bool value="90" description="Slowenisch"/><bool value="91" description="Spanisch"/><bool value="92" description="Swahili"/><bool value="93" description="Syrisch"/><bool value="94" description="Südarabisch"/><bool value="95" description="Tagalog"/><bool value="96" description="Tamil"/><bool value="97" description="Tamudisch"/><bool value="98" description="Telugu"/><bool value="99" description="Thailändisch"/><bool value="100" description="Tibetisch"/><bool value="101" description="Tigre"/><bool value="102" description="Tigrina"/><bool value="103" description="Tschechisch"/><bool value="104" description="Türkisch"/><bool value="105" description="Ugaritisch"/><bool value="106" description="Uigurisch"/><bool value="107" description="Ukrainisch"/><bool value="108" description="Ungarisch"/><bool value="109" description="Urdu"/><bool value="110" description="Usbekisch"/><bool value="111" description="Vietnamesisch"/><bool value="112" description="Walisisch"/><bool value="113" description="Weissrussisch"/><bool value="114" description="Zulu"/></choice></document>

Added: trunk/formed/staatsangehoerigkeit.xml
===================================================================
--- trunk/formed/staatsangehoerigkeit.xml	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/formed/staatsangehoerigkeit.xml	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document><choice><bool value="0" description="Afghanistan"/><bool value="1" description="Albanien"/><bool value="2" description="Algerien"/><bool value="3" description="Andorra"/><bool value="4" description="Angola"/><bool value="5" description="Antigua und Barbuda"/><bool value="6" description="Argentinien"/><bool value="7" description="Armenien"/><bool value="8" description="Aserbaidschan"/><bool value="9" description="Australien"/><bool value="10" description="Bahamas"/><bool value="11" description="Bahrain"/><bool value="12" description="Bangladesch"/><bool value="13" description="Barbados"/><bool value="14" description="Belgien"/><bool value="15" description="Belize"/><bool value="16" description="Benin"/><bool value="17" description="Bhutan"/><bool value="18" description="Bolivien"/><bool value="19" description="Bosnien und Herzegowina"/><bool value="20" description="Botsuana"/><bool value="21" description="Brasilien"/><bool value="22" description="Brunei"/><bool value="23" description="Bulgarien"/><bool value="24" description="Burkina Faso"/><bool value="25" description="Burundi"/><bool value="26" description="Chile"/><bool value="27" description="China"/><bool value="28" description="Costa Rica"/><bool value="29" description="Deutschland" alternative="deutsch"/><bool value="30" description="Dominica"/><bool value="31" description="Dominikanische Republik"/><bool value="32" description="Dschibuti"/><bool value="33" description="Dänemark"/><bool value="34" description="Ecuador"/><bool value="35" description="El Salvador"/><bool value="36" description="Elfenbeinküste"/><bool value="37" description="Eritrea"/><bool value="38" description="Estland"/><bool value="39" description="Fidschi"/><bool value="40" description="Finnland"/><bool value="41" description="Frankreich"/><bool value="42" description="Frankreich"/><bool value="43" description="Gabun"/><bool value="44" description="Gambia"/><bool value="45" description="Georgien"/><bool value="46" description="Ghana"/><bool value="47" description="Grenada"/><bool value="48" description="Griechenland"/><bool value="49" description="Großbritannien"/><bool value="50" description="Guatemala"/><bool value="51" description="Guinea"/><bool value="52" description="Guinea-Bissau"/><bool value="53" description="Guyana"/><bool value="54" description="Haiti"/><bool value="55" description="Honduras"/><bool value="56" description="Indien"/><bool value="57" description="Indonesien"/><bool value="58" description="Irak"/><bool value="59" description="Iran"/><bool value="60" description="Irland"/><bool value="61" description="Island"/><bool value="62" description="Israel"/><bool value="63" description="Italien"/><bool value="64" description="Italien"/><bool value="65" description="Jamaika"/><bool value="66" description="Japan"/><bool value="67" description="Jemen"/><bool value="68" description="Jordanien"/><bool value="69" description="Kambodscha"/><bool value="70" description="Kamerun"/><bool value="71" description="Kanada"/><bool value="72" description="Kap Verde"/><bool value="73" description="Kasachstan"/><bool value="74" description="Katar"/><bool value="75" description="Kenia"/><bool value="76" description="Kirgisistan"/><bool value="77" description="Kiribati"/><bool value="78" description="Kolumbien"/><bool value="79" description="Komoren"/><bool value="80" description="Kongo, Demokratische Republik"/><bool value="81" description="Kongo, Republik"/><bool value="82" description="Korea, Demokratische Volksrepublik"/><bool value="83" description="Korea, Republik"/><bool value="84" description="Kroatien"/><bool value="85" description="Kuba"/><bool value="86" description="Kuwait"/><bool value="87" description="Laos"/><bool value="88" description="Lesotho"/><bool value="89" description="Lettland"/><bool value="90" description="Libanon"/><bool value="91" description="Liberia"/><bool value="92" description="Libyen"/><bool value="93" description="Liechtenstein"/><bool value="94" description="Litauen"/><bool value="95" description="Luxemburg"/><bool value="96" description="Madagaskar"/><bool value="97" description="Malawi"/><bool value="98" description="Malaysia"/><bool value="99" description="Malediven"/><bool value="100" description="Mali"/><bool value="101" description="Malta"/><bool value="102" description="Marokko"/><bool value="103" description="Marshallinseln"/><bool value="104" description="Mauretanien"/><bool value="105" description="Mauritius"/><bool value="106" description="Mazedonien"/><bool value="107" description="Mexiko"/><bool value="108" description="Mikronesien"/><bool value="109" description="Moldawien"/><bool value="110" description="Monaco"/><bool value="111" description="Mongolei"/><bool value="112" description="Montenegro"/><bool value="113" description="Mosambik"/><bool value="114" description="Myanmar"/><bool value="115" description="Namibia"/><bool value="116" description="Nauru"/><bool value="117" description="Nepal"/><bool value="118" description="Neuseeland"/><bool value="119" description="Nicaragua"/><bool value="120" description="Niederlande"/><bool value="121" description="Niger"/><bool value="122" description="Nigeria"/><bool value="123" description="Norwegen"/><bool value="124" description="Oman"/><bool value="125" description="Osttimor"/><bool value="126" description="Pakistan"/><bool value="127" description="Palau"/><bool value="128" description="Panama"/><bool value="129" description="Papua-Neuguinea"/><bool value="130" description="Paraguay"/><bool value="131" description="Peru"/><bool value="132" description="Philippinen"/><bool value="133" description="Polen"/><bool value="134" description="Portugal"/><bool value="135" description="Ruanda"/><bool value="136" description="Rumänien"/><bool value="137" description="Russland"/><bool value="138" description="Salomonen"/><bool value="139" description="Sambia"/><bool value="140" description="Samoa"/><bool value="141" description="San Marino"/><bool value="142" description="Saudi-Arabien"/><bool value="143" description="Schweden"/><bool value="144" description="Schweiz"/><bool value="145" description="Senegal"/><bool value="146" description="Serbien"/><bool value="147" description="Seychellen"/><bool value="148" description="Sierra Leone"/><bool value="149" description="Simbabwe"/><bool value="150" description="Singapur"/><bool value="151" description="Slowakei"/><bool value="152" description="Slowenien"/><bool value="153" description="Somalia"/><bool value="154" description="Spanien"/><bool value="155" description="Spanien"/><bool value="156" description="Sri Lanka"/><bool value="157" description="St. Kitts und Nevis"/><bool value="158" description="St. Lucia"/><bool value="159" description="St. Vincent und die Grenadinen"/><bool value="160" description="Sudan"/><bool value="161" description="Suriname"/><bool value="162" description="Swasiland"/><bool value="163" description="Syrien"/><bool value="164" description="São Tomé und Príncipe"/><bool value="165" description="Südafrika"/><bool value="166" description="Tadschikistan"/><bool value="167" description="Tansania"/><bool value="168" description="Thailand"/><bool value="169" description="Togo"/><bool value="170" description="Tonga"/><bool value="171" description="Trinidad und Tobago"/><bool value="172" description="Tschad"/><bool value="173" description="Tschechien"/><bool value="174" description="Tunesien"/><bool value="175" description="Turkmenistan"/><bool value="176" description="Tuvalu"/><bool value="177" description="Türkei"/><bool value="178" description="Uganda"/><bool value="179" description="Ukraine"/><bool value="180" description="Ungarn"/><bool value="181" description="Uruguay"/><bool value="182" description="Usbekistan"/><bool value="183" description="Vanuatu"/><bool value="184" description="Vatikanstadt"/><bool value="185" description="Venezuela"/><bool value="186" description="Vereinigte Arabische Emirate"/><bool value="187" description="Vereinigte Staaten von Amerika"/><bool value="188" description="Vietnam"/><bool value="189" description="Weißrussland"/><bool value="190" description="Zentralafrikanische Republik"/><bool value="191" description="Zypern"/><bool value="192" description="Ägypten"/><bool value="193" description="Äquatorialguinea"/><bool value="194" description="Äthiopien"/><bool value="195" description="Österreich"/></choice></document>

Added: trunk/formed/waska-hilfetexte.xhtml
===================================================================
--- trunk/formed/waska-hilfetexte.xhtml	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/formed/waska-hilfetexte.xhtml	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Help text</title>
+  </head>
+  <body>
+
+    <div id="kontaktdaten_arge">
+      <p>Je nach Bedarf ausschließlich zu Ihrer eigenen Benutzung. Fließt nicht in die Auswertung ein. </p>
+    </div>
+
+    <div id="kontaktdaten_agentur_fuer_arbeit">
+      <p>Je nach Bedarf ausschließlich zu Ihrer eigenen Benutzung. Fließt nicht in die Auswertung ein. </p>
+    </div>
+
+    <div id="kundennummer_jugendamt">
+      <p>Je nach Bedarf ausschließlich zu Ihrer eigenen Benutzung. Fließt nicht in die Auswertung ein. </p>
+    </div>
+
+    <div id="kontaktdaten_schule">
+      <p>Je nach Bedarf ausschließlich zu Ihrer eigenen Benutzung. Fließt nicht in die Auswertung ein.</p>
+    </div>
+
+    <div id="kontaktdaten_gerichtshilfe">
+      <p>Je nach Bedarf ausschließlich zu Ihrer eigenen Benutzung. Fließt nicht in die Auswertung ein. </p>
+    </div>
+
+    <div id="kontaktdaten_weitere_institutionen">
+      <p>Je nach Bedarf ausschließlich zu Ihrer eigenen Benutzung. Fließt nicht in die Auswertung ein. </p>
+    </div>
+
+    <div id="schule_2">
+      <p>Aufgrund der verschiedenen Bezeichnungen in den einzelnen
+	Bundesländern sind hier die zentralen Schulformen und -stufen 
+        aufgeführt. Wählen Sie bitte die Bezeichnung, die am ehesten 
+        der derzeit vom Jugendlichen besuchten Schule entspricht.
+      </p>
+     </div>
+
+    <div id="schulabschluss_1">
+      <p>Aufgrund der verschiedenen Bezeichnungen für die Schulabschlüsse in
+	Bundesländern sind hier die zentralen Abschlüsse aufgeführt. Wählen 
+	Sie bitte den Schulabschluss, der am ehesten dem Schulabschluss 
+	des Jugendlichen entspricht.
+      </p>
+     </div>
+
+    <div id="dauer_nach_letzter_beschaeftigung">
+      <p>Tragen Sie hier die Dauer der Arbeitslosigkeit nach der letzten Erwerbstätigkeit (Job) ein.</p>
+    </div>
+
+    <div id="zielsetzung">
+      <p>Tragen Sie hier bitte die primäre Zielsetzung ein. Weitere Zielsetzungen können im freien Textfeld vermerkt werden.</p>
+    </div>
+
+    <div id="verfahren_kompetenzfeststellung_1">
+      <p>Unter "Entwicklung und Durchführung des Verfahrens zur Kompetenzfeststellung" kann nur eine Angabe gemacht werden - hier ist das, bezogen auf den Fall, bedeutsamste Verfahren anzuklicken</p>
+    </div>
+
+    <div id="page_9">
+      <p>Dieser Abschnitt stellt kein Kompetenzfeststellungsverfahren bereit. Erfasst werden nur Ergebnisse der Kompetenzfeststellung. Machen Sie hier auf der Grundlage der vorliegenden Dokumente zur Kompetenzfeststellung (z.B. Gutachten) Angaben nur zu den Kompetenzen des Jugendlichen, die tatsächlich im Kompetenzfeststellungsverfahren gemessen wurden. Felder, zu denen keine Informationen vorliegen, bitte nicht ausfüllen!</p>
+    </div>
+
+    <div id="deutsche_sprache">
+      <p>Diese Frage bezieht sich nicht nur auf die Jugendlichen mit Migrationshintergrund, sondern auch auf die deutschen Jugendlichen.</p>
+    </div>
+
+    <div id="altersgerechter_entwicklungsstand">
+      <p>Wählen Sie hier bitte eine Kategorie zur Einschätzung aus.</p>
+    </div>
+
+    <div id="angebotsform">
+      <p>Wählen Sie hier bitte die grundsätzliche Form des Angebots aus. Konkret beschreiben können Sie das Angebot im Feld "Art der Unterstützung".</p>
+    </div>
+
+    <div id="art_der_unterstuetzung">
+      <p>Beschreiben Sie hier bitte das konkrete Angebot (z.B. Nachhilfeunterricht Englisch)</p>
+    </div>
+
+    <div id="angebotsform_3">
+      <p>Wählen Sie hier bitte die grundsätzliche Form des Angebots aus. Konkretisieren können Sie das Angebot in der Auswahlliste "Art der Unterstützung".</p>
+    </div>
+
+    <div id="art_der_unterstuetzung_3">
+      <p>Wählen Sie hier bitte eine konkretere Beschreibung des Angebotes aus.</p>
+    </div>
+
+    <div id="angebotsform_6">
+      <p>Wählen Sie hier bitte die grundsätzliche Form des Angebots aus. Konkretisieren können Sie das Angebot in der Auswahlliste "Angebote im Bereich".</p>
+    </div>
+
+    <div id="angebote_im_bereich">
+      <p>Wählen Sie hier bitte eine konkretere Beschreibung des Angebotes aus.</p>
+    </div>
+
+    <div id="angebotsform_9">
+      <p>Wählen Sie hier bitte die grundsätzliche Form des Angebots aus. Konkretisieren können Sie das Angebot in der Auswahlliste "Art der Unterstützung".</p>
+    </div>
+
+    <div id="art_der_unterstuetzung_5">
+      <p>Wählen Sie hier bitte eine konkretere Beschreibung des Angebotes aus.</p>
+    </div>
+  </body>
+</html>

Added: trunk/production_wsgi.ini
===================================================================
--- trunk/production_wsgi.ini	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/production_wsgi.ini	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,81 @@
+#
+# waskaweb - Pylons development environment configuration
+#
+# The %(here)s variable will be replaced with the parent directory of this file
+#
+[DEFAULT]
+debug = false
+# Uncomment and replace with the address which should receive any error reports
+#email_to = you at yourdomain.com
+smtp_server = localhost
+error_email_from = paste at localhost
+formed_tree = ../../formed/formedtree_web.xml
+
+# for connections to PostgeSQL database
+# db_database: %s will be replaced by certificate value
+# db_user:     first %s -> database name, second %s -> user
+db_database = ka_%s_db
+db_user     = ka_%s_%s
+db_host     = 192.168.11.17
+db_port     = 5434
+
+# for connections to PDF2XFA server
+pdf2xfa_host = 192.168.11.17
+pdf2xfa_port = 1111
+
+[server:main]
+use = egg:Paste#http
+host = 0.0.0.0
+port = 5001
+
+[app:main]
+use = egg:waskaweb
+lang = de 
+full_stack = true
+cache_dir = /usr/local/wsgi/waska_data
+beaker.session.key = waskaweb
+beaker.session.secret = somesecret
+beaker.session.timeout = 1800 
+#beaker.session.type = memory 
+#beaker.session.invalidate_corrupt = True
+
+# If you'd like to fine-tune the individual locations of the cache data dirs
+# for the Cache data, or the Session saves, un-comment the desired settings
+# here:
+#beaker.cache.data_dir = %(here)s/data/cache
+#beaker.session.data_dir = %(here)s/data/sessions
+
+# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
+# Debug mode will enable the interactive debugging tool, allowing ANYONE to
+# execute malicious code after an exception is raised.
+set debug = false 
+
+# Logging configuration
+[loggers]
+keys = root, waskaweb
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[logger_waskaweb]
+level = DEBUG
+handlers =
+qualname = waskaweb
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
+

Added: trunk/setup.cfg
===================================================================
--- trunk/setup.cfg	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/setup.cfg	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,59 @@
+[egg_info]
+tag_build = dev
+tag_svn_revision = true
+
+[easy_install]
+find_links = http://www.pylonshq.com/download/
+
+[pudge]
+theme = pythonpaste.org
+
+# Add extra doc files here with spaces between them
+docs = docs/index.txt
+
+# Doc Settings
+doc_base = docs/
+dest = docs/html
+
+# Add extra modules here separated with commas
+modules = waskaweb
+title = Waskaweb
+organization = Pylons
+
+# Highlight code-block sections with Pygments
+highlighter = pygments
+
+# Optionally add extra links
+#organization_url = http://pylonshq.com/
+#trac_url = http://pylonshq.com/project
+settings = no_about=true
+
+# Optionally add extra settings
+#           link1=/community/ Community
+#           link2=/download/ Download
+
+[publish]
+doc-dir=docs/html
+make-dirs=1
+
+# Babel configuration
+[compile_catalog]
+domain = waskaweb
+directory = waskaweb/i18n
+statistics = true
+
+[extract_messages]
+add_comments = TRANSLATORS:
+output_file = waskaweb/i18n/waskaweb.pot
+width = 80
+
+[init_catalog]
+domain = waskaweb
+input_file = waskaweb/i18n/waskaweb.pot
+output_dir = waskaweb/i18n
+
+[update_catalog]
+domain = waskaweb
+input_file = waskaweb/i18n/waskaweb.pot
+output_dir = waskaweb/i18n
+previous = true

Added: trunk/setup.py
===================================================================
--- trunk/setup.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/setup.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,31 @@
+try:
+    from setuptools import setup, find_packages
+except ImportError:
+    from ez_setup import use_setuptools
+    use_setuptools()
+    from setuptools import setup, find_packages
+
+setup(
+    name='waskaweb',
+    version="",
+    #description='',
+    #author='',
+    #author_email='',
+    #url='',
+    install_requires=["Pylons>=0.9.6"],
+    packages=find_packages(exclude=['ez_setup']),
+    include_package_data=True,
+    test_suite='nose.collector',
+    package_data={'waskaweb': ['i18n/*/LC_MESSAGES/*.mo']},
+    message_extractors = {'waskaweb': [
+            ('**.py', 'python', None),
+            ('templates/**.mako', 'mako', None),
+            ('public/**', 'ignore', None)]},
+    entry_points="""
+    [paste.app_factory]
+    main = waskaweb.config.middleware:make_app
+
+    [paste.app_install]
+    main = pylons.util:PylonsInstaller
+    """,
+)

Added: trunk/test.ini
===================================================================
--- trunk/test.ini	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/test.ini	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,21 @@
+#
+# waskaweb - Pylons testing environment configuration
+#
+# The %(here)s variable will be replaced with the parent directory of this file
+#
+[DEFAULT]
+debug = true
+# Uncomment and replace with the address which should receive any error reports
+#email_to = you at yourdomain.com
+smtp_server = localhost
+error_email_from = paste at localhost
+
+[server:main]
+use = egg:Paste#http
+host = 0.0.0.0
+port = 5000
+
+[app:main]
+use = config:development.ini
+
+# Add additional test specific configuration options as necessary.

Added: trunk/waskaweb/__init__.py
===================================================================

Added: trunk/waskaweb/config/__init__.py
===================================================================

Added: trunk/waskaweb/config/environment.py
===================================================================
--- trunk/waskaweb/config/environment.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/config/environment.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,33 @@
+"""Pylons environment configuration"""
+import os
+
+from pylons import config
+
+import waskaweb.lib.app_globals as app_globals
+import waskaweb.lib.helpers
+from waskaweb.config.routing import make_map
+
+def load_environment(global_conf, app_conf):
+    """Configure the Pylons environment via the ``pylons.config``
+    object
+    """
+    # Pylons paths
+    root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+    paths = dict(root=root,
+                 controllers=os.path.join(root, 'controllers'),
+                 static_files=os.path.join(root, 'public'),
+                 templates=[os.path.join(root, 'templates')])
+
+    # Initialize config with the basic options
+    config.init_app(global_conf, app_conf, package='waskaweb',
+                    template_engine='mako', paths=paths)
+
+    config['routes.map'] = make_map()
+    config['pylons.g'] = app_globals.Globals()
+    config['pylons.h'] = waskaweb.lib.helpers
+
+    # Customize templating options via this variable
+    tmpl_options = config['buffet.template_options']
+
+    # CONFIGURATION OPTIONS HERE (note: all config options will override
+    # any Pylons config options)

Added: trunk/waskaweb/config/middleware.py
===================================================================
--- trunk/waskaweb/config/middleware.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/config/middleware.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,86 @@
+"""Pylons middleware initialization"""
+#import authkit.authenticate
+#import authkit.authorize
+#from authkit.permissions import ValidAuthKitUser
+import authkit
+
+from paste.cascade import Cascade
+from paste.registry import RegistryManager
+from paste.urlparser import StaticURLParser
+from paste.deploy.converters import asbool
+
+from pylons import config
+from pylons.error import error_template
+from pylons.middleware import error_mapper, ErrorDocuments, ErrorHandler, \
+    StaticJavascripts
+from pylons.wsgiapp import PylonsApp
+
+#from waskaweb.lib.security import checkLogin
+
+
+from waskaweb.config.environment import load_environment
+
+#from authkit.authorize import NotAuthenticatedError
+
+#class MyValidAuthKitUser(ValidAuthKitUser):
+#    """
+#    Checks that the signed in user is one of the users specified when setting up
+#    the user management API.
+#    """
+#    def __init__(self):
+#        pass
+#    
+#    def check(self, app, environ, start_response):
+#        if not environ.get('REMOTE_USER'):
+#            raise NotAuthenticatedError('Not Authenticated')
+#        return app(environ, start_response)
+#
+def make_app(global_conf, full_stack=True, **app_conf):
+    """Create a Pylons WSGI application and return it
+
+    ``global_conf``
+        The inherited configuration for this application. Normally from
+        the [DEFAULT] section of the Paste ini file.
+
+    ``full_stack``
+        Whether or not this application provides a full WSGI stack (by
+        default, meaning it handles its own exceptions and errors).
+        Disable full_stack when this application is "managed" by
+        another WSGI middleware.
+
+    ``app_conf``
+        The application's local configuration. Normally specified in the
+        [app:<name>] section of the Paste ini file (where <name>
+        defaults to main).
+    """
+    # Configure the Pylons environment
+    load_environment(global_conf, app_conf)
+
+    # The Pylons WSGI app
+    app = PylonsApp()
+
+    # CUSTOM MIDDLEWARE HERE (filtered by error handling middlewares)
+    if asbool(full_stack):
+        pass
+        # Handle Python exceptions
+        #app = ErrorHandler(app, global_conf, error_template=error_template,
+        #                   **config['pylons.errorware'])
+
+
+        # We want to protect the whole application
+        #permission = MyValidAuthKitUser()
+        #app = authkit.authorize.middleware(app, permission)
+        #app = authkit.authenticate.middleware(app, app_conf)
+
+        # Display error documents for 401, 403, 404 status codes (and
+        # 500 when debug is disabled)
+        #app = ErrorDocuments(app, global_conf, mapper=error_mapper, **app_conf)
+
+    # Establish the Registry for this application
+    app = RegistryManager(app)
+
+    # Static files
+    javascripts_app = StaticJavascripts()
+    static_app = StaticURLParser(config['pylons.paths']['static_files'])
+    app = Cascade([static_app, javascripts_app, app])
+    return app

Added: trunk/waskaweb/config/routing.py
===================================================================
--- trunk/waskaweb/config/routing.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/config/routing.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,34 @@
+"""Routes configuration
+
+The more specific and detailed routes should be defined first so they
+may take precedent over the more generic routes. For more information
+refer to the routes manual at http://routes.groovie.org/docs/
+"""
+from pylons import config
+from routes import Mapper
+
+def make_map():
+    """Create, configure and return the routes Mapper"""
+    map = Mapper(directory=config['pylons.paths']['controllers'],
+                 always_scan=config['debug'])
+
+    # The ErrorController route (handles 404/500 error pages); it should
+    # likely stay at the top, ensuring it can always be resolved
+    map.connect('error/:action/:id', controller='error')
+
+    # CUSTOM ROUTES HERE
+    map.connect('', controller='waska', action='index')
+    map.connect('document/caseDelete/:id/:case/:confirmed', action="caseDelete", controller="document") 
+    map.connect('case/deleteAid/:ds_id/:ds_type/:confirmed', action="deleteAid", controller="case") 
+    map.connect('case/delete/:id/:confirmed', controller="case", action="delete")
+    map.connect('case/select/:id/:confirmed', controller="case", action="select")
+    map.connect('case/:action/:ds_id/:page_id/:form', controller="case") 
+    map.connect('case/:action/:ds_id/:page_id', controller="case")
+    map.connect('formhelp', 'case/showhelp/:help_id', controller="case", action="showHelp")
+    map.connect('digest', 'case/digest/:id', controller="case", action="digest")
+    map.connect(':controller/:action/:id/:confirmed')
+    map.connect(':controller/:action/:id')
+    map.connect(':controller/:action/*(file).csv')
+    map.connect('*url', controller='template', action='view')
+
+    return map

Added: trunk/waskaweb/controllers/__init__.py
===================================================================

Added: trunk/waskaweb/controllers/administration.py
===================================================================
--- trunk/waskaweb/controllers/administration.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/administration.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,168 @@
+import logging
+import formencode
+
+from waskaweb.lib.base import *
+from waskaweb.lib.db_factory import *
+from waskaweb.lib.validators import NewUserForm, EditUserForm, NewPasswordForm, EditSettingsForm 
+from waskaweb.model.user import UserObject, UserListObject
+from waskaweb.model.agency import Agency 
+
+log = logging.getLogger(__name__)
+
+RESET_PASSWORD_CONFIRM = u'Benutzerpasswort zur&uuml;cksetzen'
+RESET_PASSWORD_CONFIRM_QUESTION = u'Wollen Sie wirklich das Passwort f&uuml;r den Benutzer <strong>%s %s</strong> (login: %s) zur&uuml;cksetzen?' 
+
+DELETE_USER_NOTIFICATION = u'L&ouml;schen Benutzer'
+DELETE_USER_NOTIFICATION_TEXT = u'Leider ist die von Ihnen aufgerufene Funktion in der BETA Version dieser Anwendung noch nicht enthalten.' 
+DELETE_USER_CONFIRM = 'L&ouml;schen Benutzer'
+DELETE_USER_CONFIRM_QUESTION = u'Wollen Sie wirklich den Benutzer <strong>%s %s</strong> (login: %s) l&ouml;schen und die Daten unwiederbringlich verlieren?'
+class AdministrationController(BaseController):
+
+    def index(self):
+	redirect_to(action='overviewUser')
+
+    def accountDeactivated(self):
+        try:
+            del session['USER_AUTHORIZED']
+            session.save()
+        except KeyError:
+            pass
+        return render('/administration/account_deactivated.mako')
+
+    def overviewUser(self):
+        list = UserListObject(self.db_pool)
+        c.user_overview = list.getUserList() 
+        return render('/administration/overview_user.mako')
+
+    def showUser(self, id=None):
+        c.uo = UserObject(self.db_pool, id)
+        c.vuo = UserObject(self.db_pool, c.uo.standin)
+        return render('/administration/show_user.mako')
+
+    def editUser(self, id=None):
+        c.form_errors = {}
+        c.form_result = {}
+        c.uo = UserObject(self.db_pool, id)
+        return render('/administration/edit_user.mako') 
+
+    def resetUserPassword(self, id=None, confirmed=False):
+        c.uo = UserObject(self.db_pool, id)
+        if confirmed:
+            try:
+                c.new_password = c.uo.resetPassword()
+                return render('/administration/reset_password.mako')
+            except:
+                return render('/tests/trace.mako')
+        else:
+            c.context = "../main.mako" 
+            c.confirm_for = RESET_PASSWORD_CONFIRM 
+            c.question = RESET_PASSWORD_CONFIRM_QUESTION % (c.uo.first_name, c.uo.last_name, c.uo.getLogin()) 
+ 
+            c.url_yes = "/administration/resetUserPassword/%s/1" % id
+            c.url_no  = "/administration/showUser/%s" % id
+            return render('/administration/dialogs/confirm_resetpassword.mako')
+
+    def newUser(self):
+        c.form_errors = {}
+        c.form_result = {}
+        return render('/administration/new_user.mako')
+
+    def editUserAction(self):
+        validator = EditUserForm(self.db_pool) 
+        try:
+            try:
+                uid = request.params['uid']
+                c.uo = UserObject(self.db_pool, uid)
+                form_result = validator.to_python(request.params)
+                c.uo.setData(form_result)
+                c.uo.store()
+                return self.overviewUser() 
+            except formencode.Invalid, error:
+                c.form_result = error.value
+                c.form_errors = error.error_dict or {}
+                return render('/administration/edit_user.mako')
+        except:
+            return render('/tests/trace.mako')
+            #return "Es ist ein Fehler beim Speichern des Benutzers aufgetreten."
+
+    def createUserAction(self):
+        validator = NewUserForm(self.db_pool) 
+        c.user_password = None
+        try:
+            try:
+                c.form_result = validator.to_python(request.params)
+                c.uo = UserObject(self.db_pool)
+                # Set initial data which is needed to create a new user
+                login = c.form_result.get('login', '')
+                role = c.form_result.get('role', '')
+                agency = session.get('agency_name', '')
+                c.uo.setData(c.form_result)
+                # create user
+                c.user_password = c.uo.createLogin(login, role, agency)
+                return render('/administration/new_user_result.mako') 
+            except formencode.Invalid, error:
+                c.form_result = error.value
+                c.form_errors = error.error_dict or {}
+                return render('/administration/new_user.mako')
+        except:
+            return render('/tests/trace.mako')
+            #return "Es ist ein Fehler beim Speichern des Benutzers aufgetreten."
+
+    def deleteUser(self, id, confirmed=False):
+        try:
+            uo = UserObject(self.db_pool, id)
+            if confirmed:
+                c.notification_for = DELETE_USER_NOTIFICATION 
+                c.notification_text = DELETE_USER_NOTIFICATION_TEXT 
+                c.url_ok = "/administration/overviewUser"
+                return render('/administration/dialogs/notificate_deleteuser.mako')
+            else:
+                c.context = "../main.mako" 
+                c.confirm_for = DELETE_USER_CONFIRM 
+                c.question = DELETE_USER_CONFIRM_QUESTION % (uo.first_name, uo.last_name, uo.getLogin()) 
+                c.url_yes = "/administration/deleteUser/%s/1" % id
+                c.url_no  = "/administration/overviewUser/"
+                return render('/administration/dialogs/confirm_deleteuser.mako')
+        except:
+            return render('/tests/trace.mako')
+
+    def showSettings(self):
+        c.form_errors = {}
+        c.form_result = {}
+        try:
+            c.agency = Agency(self.db_pool)
+            return render('administration/show_settings.mako')
+        except:
+            return render('/tests/trace.mako')
+
+    def editSettings(self):
+        c.form_errors = {}
+        c.form_result = {}
+        try:
+            c.agency = Agency(self.db_pool)
+            return render('administration/edit_settings.mako')
+        except:
+            return render('/tests/trace.mako')
+
+    def editSettingsAction(self):
+        validator = EditSettingsForm()
+        try:
+            c.form_result = validator.to_python(request.params)
+        except formencode.Invalid, error:
+            c.form_result = error.value
+            c.form_errors = error.error_dict or {}
+            return render('/administration/edit_settings.mako')
+
+        c.agency = Agency(self.db_pool)
+        c.agency.store(c.form_result)
+        return self.showSettings()
+
+    def viewPrivacyStatement(self):
+        agency = Agency(self.db_pool)
+        statement = agency.getPrivacyStatement() 
+        return statement
+
+    def viewAidPlanStatement(self):
+        agency = Agency(self.db_pool)
+        statement = agency.getAidPlanStatement() 
+        return statement

Added: trunk/waskaweb/controllers/appointment.py
===================================================================
--- trunk/waskaweb/controllers/appointment.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/appointment.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,42 @@
+import logging
+
+from waskaweb.lib.base import *
+
+log = logging.getLogger(__name__)
+
+DELETE_APPOINT_NOTIFICATION = u'L&ouml;schen Termin'
+DELETE_APPOINT_NOTIFICATION_TEXT = u'Leider ist die von Ihnen aufgerufene Funktion in der BETA Version dieser Anwendung noch nicht enthalten.' 
+
+class AppointmentController(BaseController):
+
+    def index(self):
+	redirect_to(action='overview')
+
+    def overview(self):
+        return render('/appointments/overview.mako')
+
+    def create(self):
+        return render('/appointments/new.mako')
+
+    def show(self, id):
+        return render('/appointments/beta/show_%s.mako' % id)
+
+    def edit(self, id):
+        return self.show(id) 
+
+    def delete(self, id, confirmed=False):
+        if confirmed:
+            c.notification_for = DELETE_APPOINT_NOTIFICATION 
+            c.notification_text = DELETE_APPOINT_NOTIFICATION_TEXT 
+            c.url_ok = "/appointment/overview"
+            return render('/appointments/dialogs/notificate_delete_appointment.mako')
+        else:
+            c.context = "../main.mako" 
+            c.confirm_for = 'L&ouml;schen Termin'
+            c.question = 'Wollen Sie wirklich den Termin l&ouml;schen und die Daten unwiederbringlich verlieren?' 
+            c.url_yes = "/appointment/delete/1/1"
+            c.url_no  = "/appointment/overview/"
+            return render('/appointments/dialogs/confirm.mako')
+
+    def save(self):
+        return render('/appointments/new.mako')

Added: trunk/waskaweb/controllers/case.py
===================================================================
--- trunk/waskaweb/controllers/case.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/case.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,782 @@
+import logging
+import os
+import shutil
+import paste
+import formencode
+from pylons import config
+
+from waskaweb.lib.base import *
+from waskaweb.lib.evaluation import *
+from waskaweb.lib.casedata import *
+from waskaweb.lib.db_factory import *
+from waskaweb.lib.validators import NewCaseForm, SearchCaseForm, SetStandinForm, SetEditorForm
+from waskaweb.model.user import *
+from waskaweb.model.statement import * 
+
+from waskaweb.lib.renderer import FormDataImpl, ViewRenderer, ErrorItem
+from waskaweb.model.data import PageNode, RuleLeaf
+from waskaweb.model.semantic import * 
+
+from waskaweb.model.navigation import NavigationTree, TreeItem
+
+from waskaweb.lib.pdfimporter import asXFA, FieldExtractor
+
+from waskaweb.model.document import listDocuments
+
+import traceback
+
+log = logging.getLogger(__name__)
+
+import stat
+import os
+
+import cStringIO as StringIO
+
+PDF_DUB_NOTIFICATION      = u"Die Fallakte wurde nicht importiert."
+PDF_DUB_NOTIFICATION_TEXT = \
+u"""Eine Fallakte mit der Kundennummer %s existiert bereits.<br>"""
+
+PDF_IMPORT_FAILED_NOTIFICATION_TEXT = \
+u"""Die angegebene Datei konnte nicht als PDF-Fallakte erkannt werden."""
+
+PRINTALL_NOTIFICATION = u'Gesamte Fallakte drucken'
+PRINTALL_NOTIFICATION_TEXT = u'Leider ist die von Ihnen aufgerufene Funktion in der BETA Version dieser Anwendung noch nicht enthalten.' 
+
+class KompetenzTreeItem(TreeItem):
+
+    def __init__(self, key, page, description, children, kid):
+        TreeItem.__init__(self, key, page, description, children)
+        self.kid = kid
+
+    def realId(self, id):
+        return self.kid
+
+class CaseController(BaseController):
+
+    def __before__(self):
+        BaseController.__before__(self)
+        self.navigation = session.get('navigation.tree')
+
+    def index(self):
+        redirect_to(action='overview')
+
+    def search(self):
+        validator = SearchCaseForm()
+        try:
+            form_result = validator.to_python(request.params)
+            c.cases = DataSetOverviewPage(self.db_pool)
+            c.cases.search(form_result.get('search_str')) 
+        except formencode.Invalid, error:
+            c.form_result = error.value
+            c.form_errors = error.error_dict or {}
+            c.cases = DataSetOverviewPage(self.db_pool)
+            return render('/casemanagement/overview.mako')
+        return render('/casemanagement/overview.mako')
+
+    def overview(self):
+        c.cases = DataSetOverviewPage(self.db_pool)
+        c.cases.search()
+        return render('/casemanagement/overview.mako')
+
+    def __init_case(self, id):
+        session['case_modus'] = "show" 
+        session['case_id'] = id
+        session['case_errors'] = {}
+        c.digest = DataSetDigest(id, self.db_pool) 
+        c.ds_id = id
+        session['case_hasStatement'] = c.digest.hasSignedPrivacyStatement() 
+        session['case_last_name'] = c.digest.last_name 
+        session['case_first_name'] = c.digest.first_name 
+        session['case_nr'] = c.digest.knr
+        try:
+            k_id = kompetenzId(self.db_pool, int(id))
+            #print >> sys.stderr, "Found Kompetenz-Id: %s" % str(k_id)
+        except:
+            traceback.print_exc(file=sys.stderr)
+            k_id = None
+
+        if k_id is None:
+            self.navigation = NavigationTree()
+        else:
+            def xmake(key, page, description, children=None):
+                return KompetenzTreeItem(key, page, description, children, k_id)
+                
+            self.navigation = NavigationTree({
+                "page_8": xmake,
+                "page_9": xmake
+            })
+        session['navigation.tree'] = self.navigation
+
+        session.save()
+
+    def select(self, id, confirmed):
+        self.__init_case(int(id))
+        # Check if there is a "Einverstaendniserklaerung"
+        if c.digest.hasSignedPrivacyStatement() or confirmed == '1':
+            return self.digest(id)
+        else:
+            # Render Nagscreen to inform the user that he is about to open a
+            # case which does not have a signed statement
+            return render('statement/dialogs/missing_statement.mako')
+
+    def digest(self, id):
+        c.digest = DataSetDigest(id, self.db_pool) 
+        c.ds_id = id
+        session['case_last_name'] = c.digest.last_name 
+        session['case_first_name'] = c.digest.first_name 
+        session['case_nr'] = c.digest.knr
+        session.save()
+        ti = self.navigation.getTreeItem('0')
+        if not ti: return '404'
+        c.form_navigation = self._getFormNavigation(id, mode="show")
+        c.print_form = "digest" # Which page to open in popup on printing?           
+        return render('/casemanagement/digest.mako')
+
+    def printout(self, ds_id, page_id, form=None):
+        c.print_version = 1 
+        if form == "digest":
+            return self.digest(ds_id) 
+        elif form == "show":
+            return self.show(ds_id, page_id) 
+        else:
+            return render('/casemanagement/overview.mako')
+
+    def printAll(self, id):
+        c.notification_for = PRINTALL_NOTIFICATION 
+        c.notification_text = PRINTALL_NOTIFICATION_TEXT 
+        c.url_ok = h.url_for(action="digest")
+        c.form_navigation = self._getFormNavigation(id, mode=session['case_modus'])
+        return render('/casemanagement/dialogs/notificate_printall.mako')
+
+    def new(self):
+        session['case_last_name'] = "" 
+        session['case_first_name'] = "" 
+        session['case_address'] = "" 
+        session['case_plz'] = "" 
+        session['case_city'] = "" 
+        session['case_nr'] = "" 
+        session.save()
+        redirect_to(h.url_for(action="new2"))
+
+    def new2(self):
+        return render('/casemanagement/new.mako')
+
+    def newAction(self, id):
+        # TODO: Checked routes why 
+        #def newAction(self, confirmed=False): Does not work
+        if id: # Create emtpy case (no signed statement)
+            dsf = DSFactory(self.db_pool)
+            ds = dsf.createDataset()
+            return self.overview()
+
+        try:
+            session['case_last_name'] = request.params.getone("name_1")
+            session['case_first_name'] = request.params.getone("vorname_1")
+            session['case_address'] = request.params.getone("strasse")
+            session['case_plz'] = request.params.getone("plz")
+            session['case_city'] = request.params.getone("wohnort")
+            session.save()
+        except KeyError:
+            pass
+
+        if request.params.has_key('print'):
+            c.print_version = 1
+            statement = PrivacyStatement(self.db_pool)
+            agency = Agency(self.db_pool)
+            dummy = TempDigest(request.params)
+            c.content = statement.fillout(dummy, agency) 
+            return render('statement/default_statement.mako')
+
+        elif request.params.has_key('save'):
+            # TODO: Because of a change in the workflow we always want to
+            # create a new case, regardless if there is a signed statement or
+            # not. Change to following line to reactivate old behavoir
+
+            #if request.params.has_key('statement_signed'):
+            if True:
+                validator = NewCaseForm()
+                try:
+                    form_result = validator.to_python(request.params)
+                    dsf = DSFactory(self.db_pool)
+                    ds = dsf.createDataset()
+                    ds.initData()
+                    # Prepare params so that _save will eat them an gets all needed
+                    # values
+                    new_params = request.params.dict_of_lists()
+                    new_params['ds'] = [ds.id]
+                    # Does the new case has a signed statement?
+                    if request.params.has_key('statement_signed'):
+                        statement = PrivacyStatement(self.db_pool, ds.id)
+                        statement.sign()
+
+                    self.__save("page_1", new_params, {})
+                    self.__init_case(ds.id)
+                except formencode.Invalid, error:
+                    c.form_result = error.value
+                    c.form_errors = error.error_dict or {}
+                    return render('/casemanagement/new.mako')
+
+                if c.digest.hasSignedPrivacyStatement():
+                    return self.edit(str(ds.id), '0')
+                else:
+                    # Render Nagscreen to inform the user that he is about to open a
+                    # case which does not have a signed statement
+                    return render('statement/dialogs/missing_statement.mako')
+
+            else:
+                c.context = "../main.mako" 
+                c.alert_for = u'Keine Einverst&auml;ndniserkl&auml;rung vorhanden'
+                c.question = u"""Sie sind im Begriff, eine Fallakte ohne vorliegende Einverst&auml;ndniserkl&auml;rung des Jugendlichen zu erstellen. Dies bedeutet, dass <strong>keine personenbezogenen Daten gespeichert </strong>werden k&ouml;nnen.<br>
+                Es wird lediglich festgehalten, dass ein Erstgespr&auml;ch stattgefunden hat. Eine weitere Speicherung der Daten ist nicht m&ouml;glich!
+                <p>Wenn Sie wirklich eine solche Fallakte anlegen wollen, dann best&auml;tigen Sie bitte mit <strong>OK</strong><br>Um wieder auf die Einverst&auml;ndniserkl&auml;rungsseite zu gelangen klicken Sie auf <strong>Abbrechen</strong>"""
+
+                c.url_ok = "/case/newAction/1/"
+                c.url_cancel  = "/case/new2/"
+                return render('/casemanagement/dialogs/alert.mako')
+
+    def editToggle(self, ds_id, page_id):
+        ti = self.navigation.getTreeItem(page_id)
+        c.ds_id = ti.realId(ds_id)
+        c.page_id = page_id
+        c.show_form_actions = True
+        c.print_form = "show" # Which page to open in popup on printing?           
+        ti.toggle()
+        session.save()
+        c.form_navigation = self._getFormNavigation(
+            ds_id,
+            mode="edit",
+            selected_key=ti.key)
+        if not c.form_navigation:
+            return "404"
+        # Determine if we have an repeat group or a formular page
+        what = ti.page.startswith("rg_") and "rg_aid_overview" or "formular"
+        if what == "rg_aid_overview":
+            c.rg_list = DataSetAidList(self.db_pool, ds_id)
+        else:
+            formdata = self._getFormdata(ti, ds_id)
+            vr = ViewRenderer(formdata, ro_mode=False)
+            c.formular = vr.renderView(
+                #ti.page, 
+                ti.key, 
+                ds_id, 
+                "/case/save",
+                showNext = not ti.nextKey() is None)
+        return render('/casemanagement/%s.mako' % what)
+
+    def showToggle(self, ds_id, page_id):
+        ti = self.navigation.getTreeItem(page_id)
+        c.ds_id = ti.realId(ds_id)
+        c.page_id = page_id
+        c.show_form_actions = True
+        c.print_form = "show" # Which page to open in popup on printing?           
+        ti.toggle()
+        session.save()
+        c.form_navigation = self._getFormNavigation(
+            ds_id, 
+            mode="show",
+            selected_key=ti.key)
+        if not c.form_navigation:
+            return "404"
+        # Determine if we have an repeat group or a formular page
+        what = ti.page.startswith("rg_") and "rg_aid_overview" or "formular"
+        if what == "rg_aid_overview":
+            c.rg_list = DataSetAidList(self.db_pool, ds_id)
+        else:
+            formdata = self._getFormdata(ti, ds_id)
+            vr = ViewRenderer(formdata)
+            c.formular = vr.renderView(
+                #ti.page,
+                ti.key,
+                ds_id,
+                "/case/save",
+                showNext = not ti.nextKey() is None)
+        return render('/casemanagement/%s.mako' % what)
+
+    def edit(self, ds_id, page_id):
+        session["case_modus"] = "edit"
+        session.save()
+        ti = self.navigation.getTreeItem(page_id)
+        c.ds_id = ti.realId(ds_id)
+        c.page_id = page_id
+        c.show_form_actions = True
+        c.print_form = "show" # Which page to open in popup on printing?           
+        # Determine if we have an repeat group or a formular page
+        what = ti.page.startswith("rg_") and "rg_aid_overview" or "formular"
+        if what == "rg_aid_overview":
+            c.form_navigation = self._getFormNavigation(
+                ds_id, 
+                mode="edit",
+                selected_key="14")
+            c.rg_list = DataSetAidList(self.db_pool, ds_id)
+        else:
+            c.form_navigation = self._getFormNavigation(
+                ds_id, 
+                mode="edit",
+                selected_key=ti.key)
+            formdata = self._getFormdata(ti, ds_id)
+            vr = ViewRenderer(formdata, ro_mode=False)
+            c.formular = vr.renderView(
+                ti.key, 
+                ds_id,  
+                "/case/save", 
+                showNext = not ti.nextKey() is None)
+        return render('/casemanagement/%s.mako' % what)
+
+
+    def show(self, ds_id, page_id):
+        session["case_modus"] = "show"
+        session.save()
+        ti = self.navigation.getTreeItem(page_id)
+        c.ds_id = ti.realId(ds_id)
+        c.page_id = page_id
+        c.show_form_actions = True
+        c.print_form = "show" # Which page to open in popup on printing?           
+        # Determine if we have an repeat group or a formular page
+        what = ti.page.startswith("rg_") and "rg_aid_overview" or "formular"
+        if what == "rg_aid_overview":
+            c.form_navigation = self._getFormNavigation(
+                ds_id, 
+                mode="show",
+                selected_key="14")
+            c.rg_list = DataSetAidList(self.db_pool, ds_id)
+        else:
+            c.form_navigation = self._getFormNavigation(
+                ds_id, 
+                mode="show",
+                selected_key=ti.key)
+            formdata = self._getFormdata(ti, ds_id)
+            vr = ViewRenderer(formdata)
+            c.formular = vr.renderView(
+                #ti.page, 
+                ti.key, 
+                ds_id,  
+                "/case/save", 
+                showNext = not ti.nextKey() is None)
+        return render('/casemanagement/%s.mako' % what)
+
+    def showHelp(self, help_id):
+        c.helpdata = unicode(g.helpData.getHelp(help_id), 'utf-8')
+        return render('/casemanagement/help.mako')
+
+    def _getFormNavigation(self, ds_id, mode=None, selected_key=None):
+        # TODO:
+        # 1. Get rid of session var. Problem: We do not differ anymore between
+        # case datasets and rg datasets. This results in rendering an broken
+        # navigation. 
+
+        # Set errors for navigation
+        errors = session.get('case_errors', {})
+        self.navigation.setErrors([err.page for err in errors.itervalues()])
+        return self.navigation.render(
+            lambda t: '/case/%sToggle/%s/%s' % (
+                mode, session.get('case_id'), t.key),
+            selected_key)
+
+    def _getFormdata(self, treeItem, ds_id):
+        db_view = "%s_view" % treeItem.page 
+        doc = g.formedTree
+        help = g.helpData
+        nc = doc.findByClassAndName(PageNode, treeItem.page)
+        widgets = nc.allWidgets()
+        widgets_names = [w.getName() for w in widgets]
+        page = DataPage(self.db_pool, db_view, widgets_names, ds_id)
+        form_errors = session.get('case_errors', {})
+        formdata = FormDataImpl(help=help, page=page, errors=form_errors, nc=[nc])
+        return formdata
+
+    def save(self):
+        try:
+            ti = self.navigation.getTreeItem(request.params["page"])
+        except:
+            ti = None
+
+        if ti is None:
+            redirect_to(action='overview')
+
+        #ti = self.navigation.getTreeItemByPageName(request.params["page"])
+        # If we edit page_1 we better update the infofield because the names
+        # may have been edited 
+        if ti.page == "page_1":
+            try:
+                session['case_last_name'] = request.params.getone("name_1")
+                session['case_first_name'] = request.params.getone("vorname_1")
+                session.save()
+            except KeyError:
+                print >> sys.stderr, "Error! Could not update Infofield"
+
+        elif ti.page == "page_0":
+            try:
+                session['case_nr'] = request.params.getone("kundennummer")
+                session.save()
+            except KeyError:
+                print >> sys.stderr, "Error! Could not update Infofield"
+        # Get old formerrors, save data and store new formdata
+        old_errors = session.get('case_errors', {})
+        new_errors = self.__save(ti.page, request.params.dict_of_lists(), old_errors)
+        session['case_errors'] = new_errors
+        session.save()
+        ds_id = request.params["ds"]
+
+        if request.params.get('__formular_next'):
+
+            # XXX: This ultra ugly!
+            if ti.key.endswith("rg"):
+                try:
+                    nds = int(session['case_id'])
+                except:
+                    print >> sys.stderr, "Case id not found"
+                    nds = None
+                if not nds is None:
+                    ti.showPath()
+                    c.ds_id   = ti.realId(int(nds))
+                    c.page_id = "14"
+                    c.rg_list = DataSetAidList(self.db_pool, nds)
+                    c.form_navigation = self._getFormNavigation(
+                        nds,
+                        mode="edit",
+                        selected_key=ti.key)
+                    return render('/casemanagement/rg_aid_overview.mako')
+
+            nkey = ti.nextKey()
+            if not nkey is None:
+                nti = self.navigation.getTreeItem(nkey)
+                if not nti is None:
+                    ti = nti
+                    ti.showPath()
+        return self.edit(str(ti.realId(ds_id)), ti.key) 
+
+    def __save(self, pageName, params, old_errors):
+
+        try:
+            ds_id = params["ds"][0]
+        except KeyError:
+            print >> sys.stderr, "No page name given or no case id given"
+            return old_errors
+
+        document = g.formedTree
+
+        # fetch dataset if valid
+        db_view = "%s_view" % pageName 
+        try:
+            nc = document.findByClassAndName(PageNode, pageName)
+            nwidgets = nc.allWidgets()
+            widgets_names = [w.getName() for w in nwidgets]
+            dbPage = DataPage(self.db_pool, db_view, widgets_names, ds_id)
+        except:
+            print >> sys.stderr, "Could not load datapage"
+            return "Could not load datapage"
+
+        # widgets on current page
+        widgets = dict([
+            (widget.getName(), widget) for widget in nwidgets if widget.getName()])
+
+        # empty parameters will nullify values
+        delete_vars = []
+
+        # for updating the errors
+        #old_errors = session.setdefault("$ERRORS", {})
+        # Note: old_errors is now passed as argument
+
+        # vars that passed lexical and syntactic check
+        to_be_set = {}
+
+        for k, v in params.iteritems():
+            if k.startswith("__"):
+                continue
+            try:
+                value = v[0]
+                widget = widgets.pop(k)
+                #print "widget: %s"  % repr(widget)
+                if value == "": # no value -> delete it
+                    delete_vars.append(k)
+                else:
+                    # Hopefully this one causes no trouble any more
+                    old_errors.pop(k, None)
+                    # the empty array is for the rules
+                    to_be_set[k] = (checkAndConvert(widget, value), [])
+            except SematicError, inst:
+                ei = ErrorItem(pageName, value, widget.getDescription())
+                ei.addMessage(inst.value)
+                # overwrite old errors
+                old_errors[k] = ei
+            except KeyError, inst:
+                pass
+
+        # flag to indicate if we should flush the page
+        dirty = False
+
+        # remove variable from dataset which are set to ""
+        for wname in list(widgets.iterkeys()) + delete_vars:
+            dbPage.setData(wname, None)
+            dirty = True
+            # an unset value causes no problems.
+            old_errors.pop(wname, None)
+
+        # find all rules that depend on variables to be set.
+        # build up a lookup var-name -> list of rules
+        for r in document.findAllByClass(RuleLeaf):
+            expr = r.getExpr()
+            if not expr: continue
+            for var in expr.getDependencies():
+                try:
+                    to_be_set[var][1].append(r)
+                except KeyError:
+                    pass
+
+        # set vars into db page and check rules.
+        for k, tup in to_be_set.iteritems():
+            v, rules = tup[0], tup[1]
+            hasNoProblems = True
+            for rule in rules:
+                vars = {}
+                isNull = False # only process rule if all values are not null
+                for dependency in rule.getExpr().getDependencies():
+                    if dependency == k: # ignore because this comes from the web
+                        continue
+                    # XXX: Normally they are distributed over all kind of pages.
+                    value = ds.getValue(dependency)
+                    if value is None: isNull = True; break
+                    vars[dependency] = value
+                if isNull:
+                    continue
+                expr = rule.getExpr()
+                # Now evaluate the rule to see if its violated
+                try:
+                    vars[k] = v # test it with new value from web
+                    isOkay = expr.evaluate(vars)
+                except:
+                    print_exc()
+                    isOkay = False
+                if not isOkay:
+                    hasNoProblems = False
+                    ie = old_errors.get(k, None)
+                    if ie is None:
+                        ie = ErrorItem(pageName, v)
+                        old_errors[k] = ie
+                    msg = rule.getValue()
+                    if msg: ie.addMessage(msg)
+                    else:   ie.addMessage("There is a problem with '%s'." % k)
+            if hasNoProblems: # No new errors -> set it
+                dbPage.setData(k, v)
+                dirty = True
+                # TODO: Solve transitive problems!
+                # e.g. A was set. B contradicts A. That prevents B from
+                # being set. -> B is marked was wrong input.
+                # Now A is set to a value that does not contradicts B
+                # any more. Therefore B is not an error input any more.
+                # -> B can be applied. This scheme has to be applied 
+                # recursively along the dependencies.
+                old_errors.pop(k, None)
+
+        if dirty: # flush the db page
+            dbPage.store()
+        return old_errors
+
+    def newAidAction(self):
+        try:
+            case_id = request.params.getone('case_id')
+            page_id = request.params.getone('page_id')
+            aid_type = request.params.getone('aid_type')
+            aid = DataSetAidObject(self.db_pool, aid_type)
+            ds_id = aid.create(int(case_id))
+            print >> sys.stderr, "aid:%s, %s, %s" % (aid, ds_id, aid.page_id) 
+            if ds_id and aid.page_id:
+                return self.edit(str(ds_id), aid.page_id)
+            else:
+                return "Error. Could not create new Aid"
+        except KeyError:
+            pass
+
+    def deleteAid(self, ds_id, ds_type, confirmed=False):
+        if confirmed == '1':
+            aid = DataSetAidObject(self.db_pool, ds_type, ds_id)
+            if aid.delete():
+                return self.show(session.get('case_id'), '14') # 14 should be the overview page
+            # TODO: Create Errorpage
+            return "Error! Could not delete ds."
+        else:
+            c.context = "../main.mako" 
+            c.confirm_for = 'L&ouml;schen Unterst&uuml;tzungsangebot'
+            c.question = 'Wollen Sie wirklich das Angebot l&ouml;schen und die Daten unwiederbringlich verlieren?' 
+            c.url_yes = "/case/deleteAid/%s/%s/1" % (ds_id, ds_type) 
+            c.url_no  = "/case/show/%s/14" % session.get('case_id')
+            return render('/casemanagement/dialogs/confirm.mako')
+        
+            
+        
+    def importCase(self):
+        return render('/casemanagement/upload.mako')
+
+    def __fetchKundennummerFromPDF(self, tbls):
+        for n, rels, sep in tbls:
+            for rel in rels:
+                try:
+                    return rel.getColumn(u"kundennummer")
+                except KeyError:
+                    pass
+        
+        return None
+
+    def importAction(self):
+
+        # XXX: We are loading it all into memory. This is bad -> DoS
+        buf = StringIO.StringIO()
+
+        try:
+            myfile = request.POST['pdffile']
+            shutil.copyfileobj(myfile.file, buf)
+        except:
+            return self.importCase()
+
+        myfile.file.close()
+        b = buf.getvalue()
+        buf.close()
+        try:
+            fe = FieldExtractor(g.formedTree)
+
+            xfa = None
+            try:
+                xfa = asXFA(b)
+                print >> sys.stderr, "XFA fetched"
+                fe.extractFields(xfa)
+            finally:
+                if xfa:
+                    xfa.unlink()
+                    xfa = None
+
+            tbls = fe.requiredTables()
+
+            knummer = self.__fetchKundennummerFromPDF(tbls)
+            if not knummer is None:
+                in_db = caseExists(self.db_pool, knummer)
+                if in_db:
+                    c.notification_for  = PDF_DUB_NOTIFICATION 
+                    c.notification_text = PDF_DUB_NOTIFICATION_TEXT % knummer
+                    c.url_ok = "/case/importCase"
+                    return render('/casemanagement/dialogs/notificate_import_dub.mako')
+
+            ds_id = createTables(self.db_pool, tbls)
+            #c.messages = fe.allMessages()
+        except:
+            c.notification_for  = PDF_DUB_NOTIFICATION 
+            c.notification_text = PDF_IMPORT_FAILED_NOTIFICATION_TEXT
+            c.url_ok = "/case/importCase"
+            return render('/casemanagement/dialogs/notificate_import_dub.mako')
+
+        return self.select(str(ds_id), "0")
+
+    def export(self):
+        return render('/casemanagement/export.mako')
+
+    def createExportScheme(self):
+        return render('casemanagement/create_export_scheme.mako')
+
+    def evaluate(self):
+        return render('casemanagement/evaluation.mako')
+
+    def bundle(self):
+        action = request.params.getone('action')
+        if action == 'delete':
+            pass
+        elif action == 'export':
+            return self.export() 
+        elif action == 'evaluate':
+            return self.evaluate() 
+        elif action == 'stand-in':
+            pass
+        elif action == 'transfer':
+            pass
+        else:
+            return render('/casemanagement/overview.mako')
+
+    def organisation(self, id):
+        list = UserListObject(self.db_pool)
+        c.case = Dataset(self.db_pool, id)
+        c.standin_list = c.case.getStandin()
+        c.current_user = session['USER_AUTHORIZED'][2]
+        c.editor = UserObject(self.db_pool, c.case.getEditor())
+        # Get available users for standin. filter out admins and the current
+        # user
+        filter = [u.id for u in list.getAdminList()]
+        filter.append(c.current_user.id)
+        c.user_list = list.getUserList(filter) 
+        c.ds_id = id
+        c.form_navigation = self._getFormNavigation(
+            id, 
+            mode=session.get('case_modus'))
+        return render('/casemanagement/organisation.mako')
+
+    def setEditorAction(self):
+        validator = SetEditorForm()
+        try:
+            form_result = validator.to_python(request.params)
+            case = Dataset(self.db_pool, form_result.get('case_id'))
+            case.setEditor(form_result.get('editor'))
+            return self.organisation(form_result.get('case_id'))
+        except formencode.Invalid, error:
+            c.form_result = error.value
+            c.form_errors = error.error_dict or {}
+            return render('/casemanagement/organisation.mako')
+
+    def setStandinAction(self):
+        validator = SetStandinForm()
+        data = formencode.variabledecode.variable_decode(request.params)
+        try:
+            form_result = validator.to_python(data)
+            case = Dataset(self.db_pool, form_result.get('case_id'))
+            case.setStandin(form_result.get('standin'))
+            return self.organisation(form_result.get('case_id'))
+        except formencode.Invalid, error:
+            c.form_result = error.value
+            c.form_errors = error.error_dict or {}
+            return render('/casemanagement/organisation.mako')
+
+
+    def appointments(self, id):
+        c.ds_id = id
+        c.form_navigation = self._getFormNavigation(
+            id, 
+            mode=session.get('case_modus'))
+        return render('/casemanagement/appointments.mako')
+
+    def newAppointment(self):
+        c.ds_id = id
+        c.form_navigation = self._getFormNavigation(
+            id, 
+            mode=session.get('case_modus'))
+        return render('/casemanagement/new_appointment.mako')
+
+    def documents(self, id):
+        try:
+            c.ds_id = id
+            c.form_navigation = self._getFormNavigation(
+                id, 
+                mode=session.get('case_modus'))
+            id = int(id)
+            c.files = listDocuments(self.db_pool, id)
+        except:
+            return render('/tests/trace.mako')
+        return render('/documents/case_overview.mako')
+
+    def newDocument(self, id):
+        c.ds_id = id
+        c.form_navigation = self._getFormNavigation(
+            id, 
+            mode=session.get('case_modus'))
+        return render('/documents/case_new.mako')
+
+    def delete(self, id, confirmed):
+        c.ds_id = id
+        if confirmed == '1':
+            ds = Dataset(self.db_pool, id)
+            if ds.delete():
+                return self.overview()
+            # TODO: Create Errorpage
+            return "Error! Could not delete ds."
+        else:
+            c.context = "../main.mako" 
+            c.confirm_for = 'L&ouml;schen Fallakte'
+            c.question = 'Wollen Sie wirklich die Fallakte l&ouml;schen und die Daten unwiederbringlich verlieren?' 
+            c.url_yes = "/case/delete/%s/1" % id
+            c.url_no  = "/case/overview/"
+            return render('/casemanagement/dialogs/confirm.mako')

Added: trunk/waskaweb/controllers/document.py
===================================================================
--- trunk/waskaweb/controllers/document.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/document.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,162 @@
+# -*- coding: latin-1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+import logging
+import paste
+import sys
+import traceback
+
+from waskaweb.lib.base import *
+
+from waskaweb.model.document import \
+    Document, \
+    listDocuments, \
+    deleteDocument
+
+from pylons import config
+
+log = logging.getLogger(__name__)
+
+class DocumentController(BaseController):
+
+    def index(self):
+        redirect_to(action='globalOverview')
+
+    def globalOverview(self):
+        try:
+            c.files = listDocuments(self.db_pool)
+        except:
+            traceback.print_exc(file=sys.stderr)
+            c.files = []
+            #return render('/tests/trace.mako')
+        return render('/documents/global_overview.mako')
+
+    def globalUpload(self):
+        return render('/documents/global_upload.mako')
+
+    def globalUploadAction(self):
+        try:
+            doc = Document()
+            myfile = None
+            try:
+                myfile = request.POST.get('file')
+                if not myfile is None:
+                    doc.create(self.db_pool, myfile.filename, myfile.file)
+            finally:
+                if not myfile is None:
+                    try: myfile.file.close()
+                    except: pass
+        except:
+            traceback.print_exc(file=sys.stderr)
+            #return render('/tests/trace.mako')
+
+        return self.globalOverview() 
+
+    def caseUploadAction(self):
+        try:
+            case = int(request.POST['case'])
+        except:
+            redirect_to(controller="case", action="documents") 
+
+        try:
+            doc = Document()
+            myfile = None
+            try:
+                myfile = request.POST.get('file')
+                if not myfile is None:
+                    doc.create(self.db_pool, myfile.filename, myfile.file, case)
+            finally:
+                if not myfile is None:
+                    try: myfile.file.close()
+                    except: pass
+        except:
+            traceback.print_exc(file=sys.stderr)
+            #return render('/tests/trace.mako')
+
+        redirect_to(controller="case", action="documents", id=case) 
+
+    def globalShow(self, id):
+        try:
+            id = int(id)
+        except:
+            return self.globalOverview()
+
+        try:
+            document = Document(id)
+            document.load(self.db_pool)
+            data = paste.fileapp.DataApp(
+                document.data,
+                content_type=document.mime)
+            return data(request.environ, self.start_response)
+        except:
+            traceback.print_exc(file=sys.stderr)
+            redirect_to(controller="case", action="documents", id=case) 
+            #return render('/tests/trace.mako')
+
+    def caseShow(self, id):
+        try:
+            id = int(id)
+        except:
+            redirect_to(controller="case", action="documents") 
+
+        try:
+            document = Document(id)
+            document.load(self.db_pool, True)
+            data = paste.fileapp.DataApp(
+                document.data,
+                content_type=document.mime)
+            return data(request.environ, self.start_response)
+        except:
+            traceback.print_exc(file=sys.stderr)
+            redirect_to(controller="case", action="documents") 
+            #return render('/tests/trace.mako')
+
+    def globalDelete(self, id, confirmed=False):
+        try:
+            id = int(id)
+        except:
+            return self.globalOverview()
+
+        if confirmed:
+            try:
+                deleteDocument(self.db_pool, id)
+            except:
+                traceback.print_exc(file=sys.stderr)
+                return self.globalOverview()
+                #return render('/tests/trace.mako')
+            return self.globalOverview()
+        else:
+            c.context = "../main.mako" 
+            c.confirm_for = 'L&ouml;schen Dokument'
+            c.question = 'Wollen Sie das Dokument wirklich l&ouml;schen und die Daten unwiederbringlich verlieren?'
+            c.url_yes = "/document/globalDelete/%d/1" % id
+            c.url_no  = "/document/globalOverview/"
+            return render('/documents/dialogs/confirm.mako')
+
+    def caseDelete(self, id, case, confirmed):
+        try:
+            id   = int(id)
+            case = int(case)
+            confirmed = confirmed == "1"
+        except:
+            redirect_to(controller="case", action="overview") 
+
+        if confirmed:
+            try:
+                deleteDocument(self.db_pool, id, True)
+            except:
+                traceback.print_exc(file=sys.stderr)
+                #return render('/tests/trace.mako') 
+            redirect_to(controller="/case", action="documents", id=case) 
+        else:
+            c.context = "../main.mako" 
+            c.confirm_for = 'L&ouml;schen Dokument'
+            c.question = 'Wollen Sie das Dokument wirklich l&ouml;schen und die Daten unwiederbringlich verlieren?'
+            c.url_yes = "/document/caseDelete/%d/%d/1" % (id, case)
+            c.url_no  = h.url_for(controller="/case", action="documents", id=case)
+            return render('/documents/dialogs/confirm.mako')
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=latin1:

Added: trunk/waskaweb/controllers/error.py
===================================================================
--- trunk/waskaweb/controllers/error.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/error.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,42 @@
+import os.path
+
+import paste.fileapp
+from pylons.middleware import error_document_template, media_path
+
+from waskaweb.lib.base import *
+
+class ErrorController(BaseController):
+    """Generates error documents as and when they are required.
+
+    The ErrorDocuments middleware forwards to ErrorController when error
+    related status codes are returned from the application.
+
+    This behaviour can be altered by changing the parameters to the
+    ErrorDocuments middleware in your config/middleware.py file.
+    """
+
+    def __before__(self):
+        pass
+
+    def document(self):
+        """Render the error document"""
+        page = error_document_template % \
+            dict(prefix=request.environ.get('SCRIPT_NAME', ''),
+                 code=request.params.get('code', ''),
+                 message=request.params.get('message', ''))
+        return page
+
+    def img(self, id):
+        """Serve Pylons' stock images"""
+        return self._serve_file(os.path.join(media_path, 'img', id))
+
+    def style(self, id):
+        """Serve Pylons' stock stylesheets"""
+        return self._serve_file(os.path.join(media_path, 'style', id))
+
+    def _serve_file(self, path):
+        """Call Paste's FileApp (a WSGI application) to serve the file
+        at the specified path
+        """
+        fapp = paste.fileapp.FileApp(path)
+        return fapp(request.environ, self.start_response)

Added: trunk/waskaweb/controllers/evaluate.py
===================================================================
--- trunk/waskaweb/controllers/evaluate.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/evaluate.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,223 @@
+import logging
+import paste
+
+from waskaweb.lib.base import *
+from waskaweb.lib.evaluation import *
+from waskaweb.lib.db_factory import *
+
+log = logging.getLogger(__name__)
+
+class EvaluateController(BaseController):
+
+    def index(self):
+        # Return a rendered template
+        #   return render('/some/template.mako')
+        # or, Return a response
+        return "404"
+        
+    def evaluate(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e1 = Evaluation_1(conn)
+                c.eval_1_total, c.eval_1_cm, c.eval_1_percent = e1.perform()
+
+                conn = self.db_pool.getConnection()
+                e2 = Evaluation_2(conn)
+                c.eval_2_t, c.eval_2_m, c.eval_2_w, c.eval_2_i = e2.perform()
+
+                conn = self.db_pool.getConnection()
+                e3 = Evaluation_3(conn)
+                c.eval_3 = e3.perform()
+
+                conn = self.db_pool.getConnection()
+                e4 = Evaluation_4(conn)
+                c.eval_4 = e4.perform()
+
+                conn = self.db_pool.getConnection()
+                e5 = Evaluation_5(conn)
+                c.eval_5 = e5.perform()
+
+                conn = self.db_pool.getConnection()
+                e6 = Evaluation_6(conn)
+                c.eval_6 = e6.perform()
+
+                conn = self.db_pool.getConnection()
+                e7 = Evaluation_7(conn)
+                c.eval_7 = e7.perform()
+
+                conn = self.db_pool.getConnection()
+                e8 = Evaluation_8(conn) 
+                c.eval_8 = e8.perform()
+
+                conn = self.db_pool.getConnection()
+                e9 = Evaluation_9(conn)
+                c.eval_9 = e9.perform()
+
+                conn = self.db_pool.getConnection()
+                e10 = Evaluation_10(conn)
+                c.eval_10 = e10.perform()
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            return render('/tests/trace.mako')
+        return render('casemanagement/evaluation_result.mako')
+
+    def _export(self, evaluation):
+        path = evaluation.export()
+        fapp = paste.fileapp.FileApp(path)
+        return fapp(request.environ, self.start_response)
+        
+    def exportEvaluation_1(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_1(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_2(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_2(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_3(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_3(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_4(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_4(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_5(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_5(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_6(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_6(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_7(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_7(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_8(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_8(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_9(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_9(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def exportEvaluation_10(self):
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                e = Evaluation_10(conn)
+                return self._export(e)
+            finally:
+                try:
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass

Added: trunk/waskaweb/controllers/statement.py
===================================================================
--- trunk/waskaweb/controllers/statement.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/statement.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Torsten Irländer <torsten.irlaender at intevation.de>
+#
+
+import logging
+
+from waskaweb.lib.base import *
+from waskaweb.lib.casedata import DataSetDigest, DataSetAidList 
+from waskaweb.model.agency import *
+from waskaweb.model.statement import * 
+
+log = logging.getLogger(__name__)
+
+HEADER = u"""Angaben zur Einverständniserklärung""" 
+ACCEPT_QUESTION = u"""Sie haben angegeben, das eine Einverständniserklärung des Jugendlichen zur Erfassung, Verarbeitung und Speicherung personenbezogener Daten vorliegt. Sind Sie sicher das diese Angabe korrekt ist?"""  
+DECLINE_QUESTION = u"""Sie haben angegeben, das keine Einverständniserklärung des Jugendlichen zur Erfassung, Verarbeitung und Speicherung personenbezogener Daten vorliegt. Dies bedeutet das die bislang gespeicherten Daten der Fallakte zur Wahrung des Datenschutzes gelöscht werden und unwiederbringlich verloren gehen. Sind Sie sicher das diese Angabe korrekt ist?"""  
+
+class StatementController(BaseController):
+
+    def index(self):
+        redirect_to(controller="waska", action="start")
+
+    def printAidPlanStatement(self, id):
+        digest = DataSetDigest(id, self.db_pool)
+        statement = AidPlanStatement(self.db_pool, id)
+        agency = Agency(self.db_pool)
+        rg_list = DataSetAidList(self.db_pool, id)
+        c.content = statement.fillout(digest, agency, rg_list=rg_list.getDatasets()) 
+        return render('statement/default_statement.mako')
+
+    def printPrivacyStatement(self, id):
+        digest = DataSetDigest(id, self.db_pool)
+        statement = PrivacyStatement(self.db_pool, id)
+        agency = Agency(self.db_pool)
+        c.content = statement.fillout(digest, agency) 
+        return render('statement/default_statement.mako')
+
+    def setPrivacyStatement(self, id):
+        c.form_navigation = self._getFormNavigation(id, session.get("case_modus", "show"))
+        c.ds_id = id
+        return render('statement/edit.mako')
+
+    def setPrivacyStatementAction(self):
+        if request.params['statement_signed'] == "1": 
+            self.acceptPrivacyStatement(request.params['case_id'], "1")
+        else:
+            return self.declinePrivacyStatement(request.params['case_id'], '0')
+
+    def acceptPrivacyStatement(self, id, confirmed):
+        c.form_navigation = self._getFormNavigation(id, session.get("case_modus", "show"))
+        if confirmed == '1':
+            statement = PrivacyStatement(self.db_pool, id)
+            statement.sign()
+            session['case_hasStatement'] = True
+            session.save()
+            redirect_to('digest', id=id) 
+        else:
+            c.confirm_for = HEADER 
+            c.question = ACCEPT_QUESTION 
+            c.url_yes = h.url_for(controller="statement", action="acceptPrivacyStatement", id=id, confirmed="1")
+            c.url_no = h.url_for('digest', id=id)
+            return render('statement/dialogs/confirm.mako')
+
+    def declinePrivacyStatement(self, id, confirmed):
+        c.form_navigation = self._getFormNavigation(id, session.get("case_modus", "show"))
+        if confirmed == '1':
+            statement = PrivacyStatement(self.db_pool, id)
+            statement.decline()
+            # TODO: Delete case or delete personal data from case, at least hide
+            # this case in the case list from further editing by the user.
+            # Solution: Anonymize the data 
+            # Solution: SQL view? 
+            session['case_hasStatement'] = True
+            session.save()
+            redirect_to('digest', id=id) 
+        else:
+            c.confirm_for = HEADER 
+            c.question = DECLINE_QUESTION 
+            c.url_yes = h.url_for(controller="statement", action="declinePrivacyStatement", id=id, confirmed="1")
+            c.url_no = h.url_for('digest', id=id)
+            return render('statement/dialogs/confirm.mako')
+       
+    def _getFormNavigation(self, ds_id, mode=None):
+        # Set errors for navigation
+        errors = session.get('case_errors', {})
+        navigation = session.get('navigation.tree')
+        return navigation.render(lambda t: '/case/%sToggle/%s/%s' % (mode, session.get('case_id'), t.key))
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8:

Added: trunk/waskaweb/controllers/template.py
===================================================================
--- trunk/waskaweb/controllers/template.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/template.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,27 @@
+from waskaweb.lib.base import *
+
+class TemplateController(BaseController):
+
+    def view(self, url):
+        """By default, the final controller tried to fulfill the request
+        when no other routes match. It may be used to display a template
+        when all else fails, e.g.::
+
+            def view(self, url):
+                return render('/%s' % url)
+
+        Or if you're using Mako and want to explicitly send a 404 (Not
+        Found) response code when the requested template doesn't exist::
+
+            import mako.exceptions
+
+            def view(self, url):
+                try:
+                    return render('/%s' % url)
+                except mako.exceptions.TopLevelLookupException:
+                    abort(404)
+
+        By default this controller aborts the request with a 404 (Not
+        Found)
+        """
+        abort(404)

Added: trunk/waskaweb/controllers/usersettings.py
===================================================================
--- trunk/waskaweb/controllers/usersettings.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/usersettings.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,116 @@
+import logging
+import formencode
+
+from waskaweb.lib.base import *
+from waskaweb.model.user import UserListObject, UserObject
+from waskaweb.lib.validators import BaseFormValidator, NewPasswordForm  
+
+log = logging.getLogger(__name__)
+
+SET_PASSWORD_NOTIFICATION_HEADER = u"""&Auml;ndern des Benutzerpasswort"""
+SET_PASSWORD_NOTIFICATION_TEXT = u"""<p>Ihr Passwort wurde erfolgreich ge&auml;ndert.</p><p>Bitte klicken Sie auf "OK", um zu den Benutzereinstellungen zu gelangen.</p>"""
+
+class UsersettingsController(BaseController):
+
+    def index(self):
+        # Return a rendered template
+        #   return render('/some/template.mako')
+        # or, Return a response
+        return 'Hello World'
+
+    def showSettings(self, id):
+        c.uo = UserObject(self.db_pool, id)
+        c.vuo = UserObject(self.db_pool, c.uo.standin)
+        return render('/usersettings/show_settings.mako') 
+
+    def changePassword(self):
+        c.form_errors = {}
+        c.form_result = {}
+        return render('/usersettings/change_password.mako')
+
+    def changePasswordAction(self):
+        validator = NewPasswordForm() 
+        try:
+            try:
+                uid = request.params['uid']
+                c.uo = UserObject(self.db_pool, uid)
+                form_result = validator.to_python(request.params)
+                new_pass = c.uo.setPassword(form_result.get('passwd'))
+                if new_pass:
+                    # Save new password in the session
+                    login, password, user = session['USER_AUTHORIZED']
+                    session['USER_AUTHORIZED'] = (login, new_pass, user)
+                    session.save()
+                    c.notification_for = SET_PASSWORD_NOTIFICATION_HEADER
+                    c.notification_text = SET_PASSWORD_NOTIFICATION_TEXT
+                    c.url_ok = h.url_for(controller="usersettings", action="showSettings", id=user.id) 
+                else:
+                    return "Password could not be changed"
+            except formencode.Invalid, error:
+                c.form_result = error.value
+                c.form_errors = error.error_dict or {}
+                return render('/usersettings/change_password.mako')
+        except:
+            return render('/tests/trace.mako')
+        return render('/usersettings/dialogs/notificate_setpassword.mako')
+
+    def changePasswordOnLogin(self):
+        c.form_errors = {}
+        c.form_result = {}
+        return render('/usersettings/change_password_login.mako')
+
+    def changePasswordOnLoginAction(self):
+        # Do not forget to unset the flag for the need for pass change if this
+        # action succseeds 
+        validator = NewPasswordForm() 
+        try:
+            try:
+                form_result = validator.to_python(request.params)
+                login, password, user = session['USER_AUTHORIZED']
+                user.db_pool = self.db_pool
+                new_pass = user.setPassword(form_result.get('passwd'))
+                if new_pass:
+                    # Save new password in the session
+                    # Seting db_pool to None as it could not be pickled in the
+                    # session
+                    user.db_pool = None
+                    session['USER_AUTHORIZED'] = (login, new_pass, user)
+                    session.save()
+                    c.notification_for = SET_PASSWORD_NOTIFICATION_HEADER
+                    c.notification_text = SET_PASSWORD_NOTIFICATION_TEXT
+                    c.url_ok = h.url_for(controller="usersettings", action="showSettings", id=user.id) 
+                else:
+                    return "Password could not be changed"
+            except formencode.Invalid, error:
+                c.form_result = error.value
+                c.form_errors = error.error_dict or {}
+                return render('/usersettings/change_password_login.mako')
+        except:
+            return render('/tests/trace.mako')
+        return render('/usersettings/dialogs/notificate_setpassword.mako')
+
+    def editStandin(self, id):
+        c.form_errors = {}
+        c.form_result = {}
+        ulo = UserListObject(self.db_pool)
+        c.uo = UserObject(self.db_pool, id) 
+        user = session['USER_AUTHORIZED'][2]
+        # Get available users for standin. filter out admins and the current
+        # user
+        filter = [u.id for u in ulo.getAdminList()]
+        filter.append(user.id)
+        c.userlist = ulo.getUserList(filter) 
+        return render('usersettings/edit_standin.mako')
+
+    def editStandinAction(self):
+        validator = BaseFormValidator()
+        try:
+            c.form_result = validator.to_python(request.params)
+            c.uo = UserObject(self.db_pool, c.form_result.get('uid'))
+            c.uo.setStandin(c.form_result.get('standin') or None)
+            #TODO: Update the value for the logged in session user
+        except formencode.Invalid, error:
+            c.form_result = error.value
+            c.form_errors = error.error_dict or {}
+            return render('usersettings/edit_standin.mako')
+        return self.showSettings(c.form_result.get('uid'))

Added: trunk/waskaweb/controllers/waska.py
===================================================================
--- trunk/waskaweb/controllers/waska.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/controllers/waska.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,48 @@
+import logging
+
+from waskaweb.lib.base import *
+from waskaweb.lib.security import checkLogin
+#from waskaweb.model.renderer import * 
+from waskaweb.model.user import UserObject 
+
+log = logging.getLogger(__name__)
+class WaskaController(BaseController):
+
+    def index(self):
+        redirect_to(action='start')
+
+    def start(self): 
+        return render('/start/start.mako') 
+
+    def help(self):
+        return render('/start/help.mako') 
+
+    def settings(self, id):
+        redirect_to(controller="usersettings", action="showSettings", id=id)
+
+    def info(self):
+        return render('/start/responsible.mako') 
+
+    def logout(self):
+        try:
+            del session['USER_AUTHORIZED']
+            session.save()
+        except KeyError:
+            pass
+        return render('/logout.mako')
+
+    def login(self):
+        return render('/login.mako')
+
+    def loginAction(self):
+        try:
+            login = request.params.getone('username')
+            passwd = request.params.getone('password')
+            user = checkLogin(login, passwd)
+            if user:
+                session['USER_AUTHORIZED'] = (login, passwd, user)
+                session.save()
+                redirect_to(action="start") 
+        except KeyError:
+            pass
+        return self.login()

Added: trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po
===================================================================
--- trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,1060 @@
+# German translations for waskaweb.
+# Copyright (C) 2007 ORGANIZATION
+# This file is distributed under the same license as the waskaweb project.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: waskaweb 0.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL at ADDRESS\n"
+"POT-Creation-Date: 2007-11-21 14:48+0100\n"
+"PO-Revision-Date: 2007-10-14 20:33+0200\n"
+"Last-Translator: Torsten Irländer<torsten.irlaender at intevation.de>\n"
+"Language-Team: de <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Generated-By: Babel 0.9.1\n"
+
+#: waskaweb/templates/main.mako:62
+msgid "statusbar_logininfo"
+msgstr "Angemeldet als"
+
+#: waskaweb/templates/main.mako:69 waskaweb/templates/main.mako:100
+msgid "sm_menu_link_home"
+msgstr "Schwarzes Brett"
+
+#: waskaweb/templates/main.mako:70
+msgid "sm_menu_link_help"
+msgstr "Hilfe"
+
+#: waskaweb/templates/main.mako:71
+msgid "sm_menu_link_settings"
+msgstr "Mein Konto"
+
+#: waskaweb/templates/main.mako:73
+msgid "sm_menu_link_logout"
+msgstr "Abmelden"
+
+#: waskaweb/templates/main.mako:79
+msgid "np_text"
+msgstr "Sie sind hier: "
+
+#: waskaweb/templates/main.mako:80 waskaweb/templates/main.mako:98
+msgid "np_root"
+msgstr "Waska Start"
+
+#: waskaweb/templates/main.mako:103
+msgid "menu_app_link_overview"
+msgstr "Termine"
+
+#: waskaweb/templates/main.mako:106
+msgid "menu_doc_link_overview"
+msgstr "Dokumente"
+
+#: waskaweb/templates/main.mako:115
+msgid "menu_header_cm"
+msgstr "Case-Management"
+
+#: waskaweb/templates/main.mako:117
+msgid "menu_cm_link_overview"
+msgstr "Fallakten\t"
+
+#: waskaweb/templates/main.mako:120
+msgid "menu_cm_link_new"
+msgstr "Fallakte anlegen"
+
+#: waskaweb/templates/main.mako:122
+msgid "menu_cm_link_import"
+msgstr "Fallakte importieren"
+
+#: waskaweb/templates/main.mako:125
+#: waskaweb/templates/casemanagement/evaluation.mako:8
+msgid "cm_actions_link_evaluate"
+msgstr "Auswertung"
+
+#: waskaweb/templates/main.mako:134
+msgid "menu_header_adm"
+msgstr "Administration"
+
+#: waskaweb/templates/main.mako:136
+msgid "menu_adm_link_useroverview"
+msgstr "Benutzer"
+
+#: waskaweb/templates/main.mako:139
+msgid "menu_adm_link_showsettings"
+msgstr "Agentur"
+
+#: waskaweb/templates/main.mako:165
+msgid "footer_title"
+msgstr "WASKA"
+
+#: waskaweb/templates/main.mako:165
+msgid "footer_version"
+msgstr "22.11.07 | Beta 1"
+
+#: waskaweb/templates/administration/account_deactivated.mako:3
+msgid "adm_header_account_deactivated"
+msgstr "Dieses Konto wurde deaktiviert"
+
+#: waskaweb/templates/administration/edit_settings.mako:5
+#: waskaweb/templates/administration/edit_user.mako:4
+#: waskaweb/templates/administration/new_user.mako:5
+#: waskaweb/templates/administration/new_user_result.mako:5
+#: waskaweb/templates/administration/overview_user.mako:5
+#: waskaweb/templates/administration/reset_password.mako:5
+#: waskaweb/templates/administration/settings.mako:4
+#: waskaweb/templates/administration/show_settings.mako:5
+#: waskaweb/templates/administration/show_user.mako:5
+#: waskaweb/templates/administration/dialogs/confirm_deleteuser.mako:5
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:5
+#: waskaweb/templates/administration/dialogs/notificate_deleteuser.mako:5
+msgid "adm_np_root"
+msgstr "Administration"
+
+#: waskaweb/templates/administration/edit_settings.mako:6
+msgid "adm_np_editsettings"
+msgstr "Einstellungen bearbeiten"
+
+#: waskaweb/templates/administration/edit_settings.mako:11
+msgid "adm_header_editsettings"
+msgstr "Einstellungen bearbeiten"
+
+#: waskaweb/templates/administration/edit_settings.mako:16
+msgid "adm_actions_link_showsettings"
+msgstr "Zurück zu: Agentureinstellungen"
+
+#: waskaweb/templates/administration/edit_settings.mako:27
+#: waskaweb/templates/administration/show_settings.mako:25
+msgid "adm_form_settings_kaname"
+msgstr "Name der KA"
+
+#: waskaweb/templates/administration/edit_settings.mako:36
+#: waskaweb/templates/administration/show_settings.mako:29
+msgid "adm_form_settings_fkz"
+msgstr "FKZ der KA"
+
+#: waskaweb/templates/administration/edit_settings.mako:53
+#: waskaweb/templates/administration/show_settings.mako:33
+msgid "adm_form_settings_anontransfer"
+msgstr "Anonymisierte Fallakten übermitteln"
+
+#: waskaweb/templates/administration/edit_settings.mako:70
+msgid "adm_form_settings_save"
+msgstr "Einstellungen speichern"
+
+#: waskaweb/templates/administration/edit_user.mako:5
+#: waskaweb/templates/administration/new_user.mako:6
+#: waskaweb/templates/administration/new_user_result.mako:6
+#: waskaweb/templates/administration/overview_user.mako:6
+#: waskaweb/templates/administration/reset_password.mako:6
+#: waskaweb/templates/administration/show_user.mako:6
+#: waskaweb/templates/administration/dialogs/confirm_deleteuser.mako:6
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:6
+msgid "adm_np_overview"
+msgstr "Benutzerübersicht"
+
+#: waskaweb/templates/administration/edit_user.mako:6
+msgid "adm_np_edituser"
+msgstr "Benutzer bearbeiten"
+
+#: waskaweb/templates/administration/edit_user.mako:10
+msgid "adm_header_edituser"
+msgstr "Benutzer bearbeiten"
+
+#: waskaweb/templates/administration/edit_user.mako:15
+msgid "adm_actions_link_userpassreset"
+msgstr "Benutzerpasswort zurücksetzen"
+
+#: waskaweb/templates/administration/edit_user.mako:16
+#: waskaweb/templates/administration/edit_user.mako:16
+msgid "menu_adm_link_useredit_back"
+msgstr "Zurück zu: Benutzeransicht"
+
+#: waskaweb/templates/administration/edit_user.mako:25
+#: waskaweb/templates/administration/new_user.mako:28
+#: waskaweb/templates/administration/new_user_result.mako:22
+#: waskaweb/templates/administration/show_user_body.mako:2
+#: waskaweb/templates/administration/userform_body.mako:4
+msgid "adm_form_legend_personal"
+msgstr "Angaben zur Person"
+
+#: waskaweb/templates/administration/edit_user.mako:28
+#: waskaweb/templates/administration/new_user.mako:31
+#: waskaweb/templates/administration/userform_body.mako:7
+msgid "adm_form_user_firstname"
+msgstr "Vorname"
+
+#: waskaweb/templates/administration/edit_user.mako:36
+#: waskaweb/templates/administration/new_user.mako:39
+#: waskaweb/templates/administration/userform_body.mako:12
+msgid "adm_form_user_lastname"
+msgstr "Nachname"
+
+#: waskaweb/templates/administration/edit_user.mako:44
+#: waskaweb/templates/administration/new_user.mako:47
+#: waskaweb/templates/administration/userform_body.mako:17
+msgid "adm_form_user_telephone"
+msgstr "Telefon"
+
+#: waskaweb/templates/administration/edit_user.mako:49
+msgid "adm_form_user_roomnumer"
+msgstr "Raumnummer"
+
+#: waskaweb/templates/administration/edit_user.mako:54
+#: waskaweb/templates/administration/new_user.mako:57
+msgid "adm_form_user_branchoffice"
+msgstr "Filiale"
+
+#: waskaweb/templates/administration/edit_user.mako:58
+#: waskaweb/templates/administration/new_user.mako:61
+#: waskaweb/templates/administration/new_user_result.mako:45
+#: waskaweb/templates/administration/show_user_body.mako:29
+#: waskaweb/templates/administration/userform_body.mako:21
+#: waskaweb/templates/usersettings/change_password.mako:19
+#: waskaweb/templates/usersettings/change_password_login.mako:17
+msgid "adm_form_legend_login"
+msgstr "Angaben zum Konto"
+
+#: waskaweb/templates/administration/edit_user.mako:76
+#: waskaweb/templates/administration/new_user.mako:79
+#: waskaweb/templates/administration/userform_body.mako:28
+msgid "adm_form_user_activated"
+msgstr "Benutzer darf sich anmelden"
+
+#: waskaweb/templates/administration/edit_user.mako:84
+#: waskaweb/templates/administration/new_user.mako:83
+#: waskaweb/templates/administration/userform_body.mako:36
+msgid "adm_form_user_newpass"
+msgstr "Benutzer muss bei der nächsten Anmeldung das Passwort setzen"
+
+#: waskaweb/templates/administration/edit_user.mako:87
+#: waskaweb/templates/administration/new_user.mako:86
+#: waskaweb/templates/administration/userform_body.mako:54
+msgid "adm_form_user_submit"
+msgstr "Benutzer speichern"
+
+#: waskaweb/templates/administration/new_user.mako:7
+#: waskaweb/templates/administration/new_user_result.mako:7
+msgid "adm_np_newuser"
+msgstr "Neuen Benutzer anlegen"
+
+#: waskaweb/templates/administration/new_user.mako:11
+msgid "adm_header_newuser"
+msgstr "Neuen Benutzer anlegen"
+
+#: waskaweb/templates/administration/new_user.mako:16
+#: waskaweb/templates/administration/new_user_result.mako:16
+#: waskaweb/templates/administration/show_user.mako:17
+msgid "menu_adm_link_useroverview_back"
+msgstr "Zurück zu: Benutzerübersicht"
+
+#: waskaweb/templates/administration/new_user.mako:52
+msgid "adm_form_user_room"
+msgstr "Raumnummer"
+
+#: waskaweb/templates/administration/new_user.mako:64
+#: waskaweb/templates/administration/userform_body.mako:40
+msgid "adm_form_user_login"
+msgstr "Anmeldekennung"
+
+#: waskaweb/templates/administration/new_user.mako:71
+msgid "adm_form_user_role"
+msgstr "Benutzerrolle"
+
+#: waskaweb/templates/administration/new_user_result.mako:11
+msgid "adm_header_newuser_Result"
+msgstr "Benutzerdaten des neu angelegten Benutzers"
+
+#: waskaweb/templates/administration/overview_user.mako:12
+msgid "adm_header_overview"
+msgstr "Benutzerübersicht"
+
+#: waskaweb/templates/administration/overview_user.mako:17
+msgid "adm_actions_link_newuser"
+msgstr "Neuen Benutzer anlegen"
+
+#: waskaweb/templates/administration/overview_user.mako:24
+msgid "adm_overview_tbl_header_lastname"
+msgstr "Name"
+
+#: waskaweb/templates/administration/overview_user.mako:25
+msgid "adm_overview_tbl_header_firstname"
+msgstr "Vorname"
+
+#: waskaweb/templates/administration/overview_user.mako:26
+msgid "adm_overview_tbl_header_actions"
+msgstr "Aktionen"
+
+#: waskaweb/templates/administration/reset_password.mako:7
+#: waskaweb/templates/administration/show_user.mako:7
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:7
+msgid "adm_np_showuser"
+msgstr "Benutzer anzeigen"
+
+#: waskaweb/templates/administration/reset_password.mako:8
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:8
+#: waskaweb/templates/usersettings/dialogs/notificate_setpassword.mako:5
+msgid "adm_np_resetpassword"
+msgstr "Passwort zurücksetzen"
+
+#: waskaweb/templates/administration/reset_password.mako:10
+msgid "adm_header_resetpassword"
+msgstr "Benutzerpasswort zurücksetzen"
+
+#: waskaweb/templates/administration/settings.mako:5
+msgid "adm_np_setting"
+msgstr "Einstellungen"
+
+#: waskaweb/templates/administration/settings.mako:7
+msgid "adm_header_settings"
+msgstr "Einstellungen"
+
+#: waskaweb/templates/administration/settings.mako:9
+msgid "adm_header_synchronisation"
+msgstr "Synchronisation"
+
+#: waskaweb/templates/administration/show_settings.mako:6
+msgid "adm_np_showsettings"
+msgstr "Agentureinstellungen"
+
+#: waskaweb/templates/administration/show_settings.mako:11
+msgid "adm_header_showsettings"
+msgstr "Agentureinstellungen"
+
+#: waskaweb/templates/administration/show_settings.mako:16
+msgid "adm_actions_link_editsettings"
+msgstr "Einstellungen bearbeiten"
+
+#: waskaweb/templates/administration/show_settings.mako:36
+msgid "adm_form_settings_anontransfer_yes"
+msgstr "Ja"
+
+#: waskaweb/templates/administration/show_settings.mako:38
+msgid "adm_form_settings_anontransfer_no"
+msgstr "Nein"
+
+#: waskaweb/templates/administration/show_user.mako:11
+msgid "adm_header_showuser"
+msgstr "Benutzeransicht"
+
+#: waskaweb/templates/administration/show_user.mako:16
+msgid "adm_actions_link_edituser"
+msgstr "In Bearbeitung nehmen"
+
+#: waskaweb/templates/administration/userform_body.mako:45
+msgid "adm_form_user_passwd"
+msgstr "Passwort"
+
+#: waskaweb/templates/administration/userform_body.mako:50
+msgid "adm_form_user_passwd_confirm"
+msgstr "Passwortwiederholung"
+
+#: waskaweb/templates/administration/dialogs/confirm_deleteuser.mako:7
+msgid "adm_np_delteuser"
+msgstr "Benutzer löschen"
+
+#: waskaweb/templates/administration/dialogs/notificate_deleteuser.mako:6
+msgid "adm_np_deleteuser"
+msgstr "Benutzer löschen"
+
+#: waskaweb/templates/appointments/appointment_form.mako:6
+msgid "app_form_label_title"
+msgstr "Titel"
+
+#: waskaweb/templates/appointments/appointment_form.mako:10
+msgid "app_form_label_date"
+msgstr "Datum"
+
+#: waskaweb/templates/appointments/appointment_form.mako:14
+msgid "app_form_label_description"
+msgstr "Beschreibung"
+
+#: waskaweb/templates/appointments/appointment_form.mako:18
+msgid "app_form_label_remind"
+msgstr "Erinnerung"
+
+#: waskaweb/templates/appointments/appointment_form.mako:20
+msgid "app_form_option_remind_oneday"
+msgstr "1 Tag vorher"
+
+#: waskaweb/templates/appointments/appointment_form.mako:21
+msgid "app_form_option_remind_twoday"
+msgstr "2 Tage vorher"
+
+#: waskaweb/templates/appointments/appointment_form.mako:22
+msgid "app_form_option_remind_threeday"
+msgstr "3 Tage vorher"
+
+#: waskaweb/templates/appointments/appointment_form.mako:23
+msgid "app_form_option_remind_oneweek"
+msgstr "1 Woche vorher"
+
+#: waskaweb/templates/appointments/appointment_form.mako:24
+msgid "app_form_option_remind_twoweek"
+msgstr "2 Wochen vorher"
+
+#: waskaweb/templates/appointments/appointment_form.mako:25
+msgid "app_form_option_remind_onemonth"
+msgstr "1 Monat vorher"
+
+#: waskaweb/templates/appointments/appointment_form.mako:31
+msgid "app_form_new_submit"
+msgstr "Termin eintragen"
+
+#: waskaweb/templates/appointments/new.mako:4
+#: waskaweb/templates/appointments/overview.mako:4
+#: waskaweb/templates/appointments/show.mako:4
+#: waskaweb/templates/appointments/beta/show_10.mako:4
+#: waskaweb/templates/appointments/beta/show_5.mako:4
+#: waskaweb/templates/appointments/beta/show_6.mako:4
+#: waskaweb/templates/appointments/beta/show_7.mako:4
+#: waskaweb/templates/appointments/beta/show_8.mako:4
+#: waskaweb/templates/appointments/beta/show_9.mako:4
+#: waskaweb/templates/casemanagement/new_appointment.mako:5
+msgid "app_np_root"
+msgstr "Termine"
+
+#: waskaweb/templates/appointments/new.mako:5
+#: waskaweb/templates/casemanagement/new_appointment.mako:6
+msgid "app_np_new"
+msgstr "Neuen Termin anlegen"
+
+#: waskaweb/templates/appointments/new.mako:9
+#: waskaweb/templates/casemanagement/new_appointment.mako:10
+msgid "cm_app_header_new"
+msgstr "Neuen Termin anlegen"
+
+#: waskaweb/templates/appointments/new.mako:14
+#: waskaweb/templates/appointments/beta/show_10.mako:15
+#: waskaweb/templates/appointments/beta/show_5.mako:15
+#: waskaweb/templates/appointments/beta/show_6.mako:15
+#: waskaweb/templates/appointments/beta/show_7.mako:14
+#: waskaweb/templates/appointments/beta/show_8.mako:15
+#: waskaweb/templates/appointments/beta/show_9.mako:15
+msgid "menu_app_link_overview_back"
+msgstr "Zurück zu: Terminübersicht"
+
+#: waskaweb/templates/appointments/overview.mako:5
+#: waskaweb/templates/casemanagement/appointments.mako:5
+msgid "app_np_list"
+msgstr "Terminübersicht"
+
+#: waskaweb/templates/appointments/overview.mako:10
+#: waskaweb/templates/appointments/overview.mako:25
+#: waskaweb/templates/casemanagement/appointments.mako:10
+msgid "app_header_overview"
+msgstr "Terminübersicht"
+
+#: waskaweb/templates/appointments/overview.mako:15
+#: waskaweb/templates/casemanagement/appointments.mako:16
+msgid "app_actions_link_newappointment"
+msgstr "Neuen Termin anlegen"
+
+#: waskaweb/templates/appointments/overview_body.mako:4
+#: waskaweb/templates/appointments/overview_body.mako:75
+#: waskaweb/templates/start/start.mako:14
+msgid "app_overview_tbl_header_date"
+msgstr "Datum"
+
+#: waskaweb/templates/appointments/overview_body.mako:5
+#: waskaweb/templates/appointments/overview_body.mako:76
+#: waskaweb/templates/start/start.mako:15
+msgid "app_overview_tbl_header_desc"
+msgstr "Beschreibung"
+
+#: waskaweb/templates/appointments/overview_body.mako:6
+#: waskaweb/templates/appointments/overview_body.mako:77
+#: waskaweb/templates/start/start.mako:16
+msgid "app_overview_tbl_header_actions"
+msgstr "Aktionen"
+
+#: waskaweb/templates/appointments/show.mako:5
+#: waskaweb/templates/appointments/beta/show_1.mako:4
+#: waskaweb/templates/appointments/beta/show_10.mako:5
+#: waskaweb/templates/appointments/beta/show_2.mako:4
+#: waskaweb/templates/appointments/beta/show_3.mako:4
+#: waskaweb/templates/appointments/beta/show_4.mako:4
+#: waskaweb/templates/appointments/beta/show_5.mako:5
+#: waskaweb/templates/appointments/beta/show_6.mako:5
+#: waskaweb/templates/appointments/beta/show_7.mako:5
+#: waskaweb/templates/appointments/beta/show_8.mako:5
+#: waskaweb/templates/appointments/beta/show_9.mako:5
+msgid "app_np_show"
+msgstr "Terminansicht"
+
+#: waskaweb/templates/appointments/show.mako:9
+#: waskaweb/templates/appointments/beta/show_1.mako:9
+#: waskaweb/templates/appointments/beta/show_10.mako:10
+#: waskaweb/templates/appointments/beta/show_2.mako:9
+#: waskaweb/templates/appointments/beta/show_3.mako:8
+#: waskaweb/templates/appointments/beta/show_4.mako:9
+#: waskaweb/templates/appointments/beta/show_5.mako:10
+#: waskaweb/templates/appointments/beta/show_6.mako:10
+#: waskaweb/templates/appointments/beta/show_7.mako:9
+#: waskaweb/templates/appointments/beta/show_8.mako:10
+#: waskaweb/templates/appointments/beta/show_9.mako:10
+msgid "app_header_show"
+msgstr "Terminansicht"
+
+#: waskaweb/templates/appointments/show.mako:14
+#: waskaweb/templates/appointments/beta/show_1.mako:14
+#: waskaweb/templates/appointments/beta/show_2.mako:14
+#: waskaweb/templates/appointments/beta/show_3.mako:13
+#: waskaweb/templates/appointments/beta/show_4.mako:14
+msgid "sm_menu_link_home_back"
+msgstr "Zurück zu: Schwarzes Brett"
+
+#: waskaweb/templates/casemanagement/appointments.mako:4
+#: waskaweb/templates/casemanagement/digest.mako:5
+#: waskaweb/templates/casemanagement/formular.mako:34
+#: waskaweb/templates/casemanagement/new_appointment.mako:4
+#: waskaweb/templates/casemanagement/organisation.mako:4
+#: waskaweb/templates/casemanagement/rg_aid_overview.mako:6
+#: waskaweb/templates/documents/case_new.mako:4
+#: waskaweb/templates/documents/case_overview.mako:5
+msgid "cm_np_select"
+msgstr "Ausgewählte Fallakte"
+
+#: waskaweb/templates/casemanagement/create_export_scheme.mako:2
+msgid "cm_header_export_createscheme"
+msgstr "Exportschema erstellen"
+
+#: waskaweb/templates/casemanagement/digest.mako:6
+msgid "cm_np_digest"
+msgstr "Zusammenfassung der Fallakte"
+
+#: waskaweb/templates/casemanagement/digest.mako:11
+msgid "cm_header_digest"
+msgstr "Zusammenfassung der Fallakte"
+
+#: waskaweb/templates/casemanagement/digest.mako:17
+msgid "cm_header_digest_personal"
+msgstr "Angaben zur Person"
+
+#: waskaweb/templates/casemanagement/digest.mako:20
+msgid "cm_digest_tbl_label_lastname"
+msgstr "Name"
+
+#: waskaweb/templates/casemanagement/digest.mako:24
+msgid "cm_digest_tbl_label_firstname"
+msgstr "Vorname"
+
+#: waskaweb/templates/casemanagement/digest.mako:28
+msgid "cm_digest_tbl_label_caseid"
+msgstr "Kundennummer"
+
+#: waskaweb/templates/casemanagement/digest.mako:32
+msgid "cm_digest_tbl_label_age"
+msgstr "Alter"
+
+#: waskaweb/templates/casemanagement/digest.mako:36
+msgid "cm_digest_header_address"
+msgstr "Kontaktdaten"
+
+#: waskaweb/templates/casemanagement/digest.mako:39
+msgid "cm_digest_tbl_label_street"
+msgstr "Straße"
+
+#: waskaweb/templates/casemanagement/digest.mako:43
+msgid "cm_digest_tbl_label_plz"
+msgstr "PLZ"
+
+#: waskaweb/templates/casemanagement/digest.mako:47
+msgid "cm_digest_tbl_label_city"
+msgstr "Ort"
+
+#: waskaweb/templates/casemanagement/digest.mako:51
+msgid "cm_digest_tbl_label_telephone"
+msgstr "Telefon"
+
+#: waskaweb/templates/casemanagement/evaluation.mako:4
+#: waskaweb/templates/casemanagement/evaluation_result.mako:5
+#: waskaweb/templates/casemanagement/main.mako:8
+#: waskaweb/templates/casemanagement/new.mako:5
+#: waskaweb/templates/casemanagement/overview.mako:6
+#: waskaweb/templates/casemanagement/upload.mako:4
+#: waskaweb/templates/casemanagement/dialogs/alert.mako:5
+#: waskaweb/templates/casemanagement/dialogs/confirm.mako:5
+#: waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako:5
+#: waskaweb/templates/casemanagement/dialogs/notificate_printall.mako:5
+#: waskaweb/templates/casemanagement/static_form/statement.mako:5
+#: waskaweb/templates/casemanagement/static_form/statement_print.mako:5
+#: waskaweb/templates/statement/dialogs/confirm.mako:5
+#: waskaweb/templates/statement/dialogs/missing_statement.mako:5
+msgid "cm_np_root"
+msgstr "Case-Management"
+
+#: waskaweb/templates/casemanagement/evaluation.mako:5
+#: waskaweb/templates/casemanagement/evaluation_result.mako:6
+msgid "cm_np_evaluate"
+msgstr "Auswertung"
+
+#: waskaweb/templates/casemanagement/evaluation.mako:7
+msgid "cm_header_evaluate"
+msgstr "Auswertung"
+
+#: waskaweb/templates/casemanagement/evaluation_result.mako:7
+msgid "cm_np_evaluate_result"
+msgstr "Ergebnis der Auswertung"
+
+#: waskaweb/templates/casemanagement/evaluation_result.mako:9
+msgid "cm_header_evaluate_result"
+msgstr "Ergebnis der Auswertung"
+
+#: waskaweb/templates/casemanagement/evaluation_result.mako:22
+#: waskaweb/templates/casemanagement/evaluation_result.mako:23
+#: waskaweb/templates/casemanagement/evaluation_result.mako:24
+#: waskaweb/templates/casemanagement/evaluation_result.mako:25
+#: waskaweb/templates/casemanagement/evaluation_result.mako:26
+#: waskaweb/templates/casemanagement/evaluation_result.mako:27
+#: waskaweb/templates/casemanagement/evaluation_result.mako:28
+#: waskaweb/templates/casemanagement/evaluation_result.mako:29
+#: waskaweb/templates/casemanagement/evaluation_result.mako:30
+msgid "cm_actions_link_export_evaluate"
+msgstr "Ergebnis der Auswertung exportieren"
+
+#: waskaweb/templates/casemanagement/export.mako:4
+msgid "cm_np_root<"
+msgstr "Fallakten"
+
+#: waskaweb/templates/casemanagement/export.mako:5
+msgid "cm_np_export"
+msgstr "Fallakte exportieren"
+
+#: waskaweb/templates/casemanagement/export.mako:7
+msgid "cm_header_export"
+msgstr "Fallakten exportieren"
+
+#: waskaweb/templates/casemanagement/export.mako:11
+msgid "cm_actions_link_createexportscheme"
+msgstr "Exportschema festlegen"
+
+#: waskaweb/templates/casemanagement/formular.mako:5
+msgid "cm_header_form_edit"
+msgstr "Fallakte Bearbeitung"
+
+#: waskaweb/templates/casemanagement/formular.mako:7
+msgid "cm_header_form_show"
+msgstr "Fallaktenansicht"
+
+#: waskaweb/templates/casemanagement/formular.mako:17
+#: waskaweb/templates/casemanagement/formular.mako:72
+msgid "cm_actions_link_show"
+msgstr "Bearbeitung beenden"
+
+#: waskaweb/templates/casemanagement/formular.mako:19
+#: waskaweb/templates/casemanagement/formular.mako:74
+msgid "cm_actions_link_edit"
+msgstr "In Bearbeitung nehmen"
+
+#: waskaweb/templates/casemanagement/formular.mako:22
+#: waskaweb/templates/casemanagement/formular.mako:79
+#: waskaweb/templates/casemanagement/rg_aid_overview.mako:18
+#: waskaweb/templates/start/help.mako:10
+msgid "cm_actions_link_printout"
+msgstr "Druckversion"
+
+#: waskaweb/templates/casemanagement/main.mako:9
+#: waskaweb/templates/casemanagement/overview.mako:7
+msgid "cm_np_overview"
+msgstr "Fallaktenübersicht"
+
+#: waskaweb/templates/casemanagement/main.mako:17
+msgid "cm_info_name"
+msgstr "Name"
+
+#: waskaweb/templates/casemanagement/main.mako:20
+msgid "cm_info_nr"
+msgstr "Kundennr."
+
+#: waskaweb/templates/casemanagement/main.mako:44
+msgid "cm_menu_header_cases"
+msgstr "Fallakte"
+
+#: waskaweb/templates/casemanagement/main.mako:50
+msgid "cm_menu_link_close"
+msgstr "Akte schließen"
+
+#: waskaweb/templates/casemanagement/main.mako:51
+msgid "cm_menu_link_print"
+msgstr "Gesamte Akte drucken"
+
+#: waskaweb/templates/casemanagement/main.mako:57
+msgid "cm_menu_header_seperator"
+msgstr "Ãœberblick"
+
+#: waskaweb/templates/casemanagement/main.mako:60
+msgid "cm_menu_link_digest"
+msgstr "Zusammenfassung"
+
+#: waskaweb/templates/casemanagement/main.mako:62
+msgid "cm_menu_link_organisation"
+msgstr "Organisation"
+
+#: waskaweb/templates/casemanagement/main.mako:63
+msgid "cm_menu_link_appointment"
+msgstr "Termine"
+
+#: waskaweb/templates/casemanagement/main.mako:64
+msgid "cm_menu_link_documents"
+msgstr "Anlagen"
+
+#: waskaweb/templates/casemanagement/main.mako:70
+msgid "cm_menu_header_structure"
+msgstr "Gliederung"
+
+#: waskaweb/templates/casemanagement/new.mako:6
+#: waskaweb/templates/casemanagement/dialogs/alert.mako:6
+#: waskaweb/templates/casemanagement/static_form/statement.mako:6
+msgid "cm_np_new"
+msgstr "Fallakte anlegen"
+
+#: waskaweb/templates/casemanagement/new_appointment.mako:16
+msgid "cm_menu_link_appointment_back"
+msgstr "Zurück zu: Terminübersicht"
+
+#: waskaweb/templates/casemanagement/organisation.mako:5
+msgid "cm_np_organisation"
+msgstr "Organisation"
+
+#: waskaweb/templates/casemanagement/organisation.mako:10
+msgid "cm_header_organisation"
+msgstr "Organisation"
+
+#: waskaweb/templates/casemanagement/organisation.mako:15
+msgid "cm_header_organisation_editor"
+msgstr "Bearbeiter"
+
+#: waskaweb/templates/casemanagement/organisation.mako:18
+msgid "cm_organisation_tbl_label_lastname"
+msgstr "Nachname"
+
+#: waskaweb/templates/casemanagement/organisation.mako:21
+msgid "cm_organisation_tbl_label_firstname"
+msgstr "Vorname"
+
+#: waskaweb/templates/casemanagement/organisation.mako:24
+msgid "cm_organisation_tbl_label_telephone"
+msgstr "Telefon"
+
+#: waskaweb/templates/casemanagement/organisation.mako:35
+msgid "cm_form_editor_submit"
+msgstr "Fallakte übertragen"
+
+#: waskaweb/templates/casemanagement/organisation.mako:38
+msgid "cm_header_standin"
+msgstr "Vertretung"
+
+#: waskaweb/templates/casemanagement/organisation.mako:58
+msgid "cm_form_standin_submit"
+msgstr "Vertretung ändern"
+
+#: waskaweb/templates/casemanagement/overview.mako:9
+msgid "cm_header_overview"
+msgstr "Fallaktenübersicht"
+
+#: waskaweb/templates/casemanagement/overview.mako:12
+msgid "cm_header_search"
+msgstr "Suche"
+
+#: waskaweb/templates/casemanagement/overview.mako:16
+msgid "cm_form_overview_search_submit"
+msgstr "Suchen"
+
+#: waskaweb/templates/casemanagement/overview.mako:24
+msgid "cm_overview_tbl_header_id"
+msgstr "Knr."
+
+#: waskaweb/templates/casemanagement/overview.mako:25
+msgid "cm_overview_tbl_header_firstname"
+msgstr "Vorname"
+
+#: waskaweb/templates/casemanagement/overview.mako:26
+msgid "cm_overview_tbl_header_lastname"
+msgstr "Name"
+
+#: waskaweb/templates/casemanagement/overview.mako:27
+msgid "cm_overview_tbl_header_actions"
+msgstr "Aktionen"
+
+#: waskaweb/templates/casemanagement/rg_aid_overview.mako:20
+msgid "cm_actions_link_printoutAidPlanStatement"
+msgstr "Förderplan drucken"
+
+#: waskaweb/templates/casemanagement/upload.mako:5
+#: waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako:6
+msgid "cm_np_import"
+msgstr "Importieren"
+
+#: waskaweb/templates/casemanagement/upload.mako:7
+msgid "cm_header_import"
+msgstr "Fallakte importieren"
+
+#: waskaweb/templates/casemanagement/upload.mako:11
+msgid "cm_from_import_label_file"
+msgstr "PDF-Formular"
+
+#: waskaweb/templates/casemanagement/upload.mako:14
+msgid "cm_from_import_submit"
+msgstr "Importieren"
+
+#: waskaweb/templates/casemanagement/dialogs/confirm.mako:6
+msgid "cm_np_delete"
+msgstr "Fallakte löschen"
+
+#: waskaweb/templates/casemanagement/static_form/statement_print.mako:6
+msgid "cm_np_statement"
+msgstr "Einwilligungserklärung"
+
+#: waskaweb/templates/dialogs/alert.mako:2
+msgid "dialog_header_alert"
+msgstr "Achtung!"
+
+#: waskaweb/templates/dialogs/alert.mako:5
+msgid "dialog_header_confirm_option_ok"
+msgstr "OK"
+
+#: waskaweb/templates/dialogs/alert.mako:6
+msgid "dialog_header_confirm_option_cancel"
+msgstr "Abbrechen"
+
+#: waskaweb/templates/dialogs/confirm.mako:3
+msgid "dialog_header_confirm"
+msgstr "Bestätigung erforderlich"
+
+#: waskaweb/templates/dialogs/confirm.mako:6
+msgid "dialog_header_confirm_option_yes"
+msgstr "Ja"
+
+#: waskaweb/templates/dialogs/confirm.mako:7
+msgid "dialog_header_confirm_option_no"
+msgstr "Nein"
+
+#: waskaweb/templates/dialogs/notification.mako:3
+msgid "dialog_header_notification"
+msgstr "Hinweis"
+
+#: waskaweb/templates/dialogs/notification.mako:6
+msgid "dialog_header_notification_option_ok"
+msgstr "OK"
+
+#: waskaweb/templates/documents/case_new.mako:5
+#: waskaweb/templates/documents/case_overview.mako:6
+msgid "cm_np_doc_overview"
+msgstr "Anlagenübersicht"
+
+#: waskaweb/templates/documents/case_new.mako:6
+msgid "cm_np_doc_upload"
+msgstr "Anlage hinzufügen"
+
+#: waskaweb/templates/documents/case_new.mako:10
+msgid "cm_header_doc_new"
+msgstr "Neue Anlage hinzufügen"
+
+#: waskaweb/templates/documents/case_new.mako:16
+msgid "cm_menu_link_document_back"
+msgstr "Zurück zu: Anlagenübersicht"
+
+#: waskaweb/templates/documents/case_new.mako:26
+#: waskaweb/templates/documents/global_upload.mako:23
+#: waskaweb/templates/documents/upload_body.mako:5
+msgid "doc_form_upload_label_file"
+msgstr "Datei"
+
+#: waskaweb/templates/documents/case_new.mako:28
+#: waskaweb/templates/documents/global_upload.mako:25
+#: waskaweb/templates/documents/upload_body.mako:8
+msgid "doc_form_upload_submit"
+msgstr "Datei hinzufügen"
+
+#: waskaweb/templates/documents/case_overview.mako:11
+msgid "cm_header_doc_overview"
+msgstr "Anlagenübersicht"
+
+#: waskaweb/templates/documents/case_overview.mako:17
+msgid "cm_actions_link_doc_new"
+msgstr "Neue Anlage hinzufügen"
+
+#: waskaweb/templates/documents/case_overview.mako:28
+#: waskaweb/templates/documents/global_overview.mako:28
+msgid "doc_overview_tbl_header_filename"
+msgstr "Dateiname"
+
+#: waskaweb/templates/documents/case_overview.mako:29
+#: waskaweb/templates/documents/global_overview.mako:29
+msgid "doc_overview_tbl_header_filesize"
+msgstr "Dateigröße"
+
+#: waskaweb/templates/documents/case_overview.mako:30
+#: waskaweb/templates/documents/global_overview.mako:30
+msgid "doc_overview_tbl_header_actions"
+msgstr "Aktionen"
+
+#: waskaweb/templates/documents/case_overview.mako:47
+#: waskaweb/templates/documents/global_overview.mako:47
+msgid "doc_overview_nofilesfound"
+msgstr "Es wurden keine Dateien gefunden"
+
+#: waskaweb/templates/documents/global_overview.mako:6
+#: waskaweb/templates/documents/global_upload.mako:4
+msgid "doc_np_root"
+msgstr "Dokumente"
+
+#: waskaweb/templates/documents/global_overview.mako:7
+msgid "doc_np_overview"
+msgstr "Dokumentenübersicht"
+
+#: waskaweb/templates/documents/global_overview.mako:11
+msgid "doc_header_overview"
+msgstr "Dokumentenübersicht"
+
+#: waskaweb/templates/documents/global_overview.mako:17
+msgid "doc_actions_link_new"
+msgstr "Neues Dokument hinzufügen"
+
+#: waskaweb/templates/documents/global_upload.mako:5
+msgid "doc_np_upload"
+msgstr "Dokument hinzufügen"
+
+#: waskaweb/templates/documents/global_upload.mako:9
+msgid "doc_header_new"
+msgstr "Neues Dokument hinzufügen "
+
+#: waskaweb/templates/documents/global_upload.mako:14
+msgid "menu_doc_link_overview_back"
+msgstr "Zurück zu: Dokumentenübersicht"
+
+#: waskaweb/templates/start/start.mako:6
+msgid "start_header_blackboard"
+msgstr "Schwarzes Brett"
+
+#: waskaweb/templates/start/start.mako:11
+msgid "start_header_remind"
+msgstr "Erinnerungen"
+
+#: waskaweb/templates/statement/dialogs/confirm.mako:6
+msgid "statement_np_edit"
+msgstr "Einverständniserklärung setzen"
+
+#: waskaweb/templates/statement/dialogs/missing_statement.mako:6
+msgid "cm_np_show"
+msgstr "Fallakte anzeigen"
+
+#: waskaweb/templates/usersettings/change_password.mako:6
+msgid "adm_header_changepassword"
+msgstr "Benutzerpasswort ändern"
+
+#: waskaweb/templates/usersettings/change_password.mako:11
+#: waskaweb/templates/usersettings/edit_standin.mako:11
+msgid "sm_menu_link_settings_back"
+msgstr "Zurück zu: Mein Konto"
+
+#: waskaweb/templates/usersettings/change_password.mako:22
+#: waskaweb/templates/usersettings/change_password_login.mako:20
+msgid "adm_form_newuser_passwd"
+msgstr "Passwort"
+
+#: waskaweb/templates/usersettings/change_password.mako:30
+#: waskaweb/templates/usersettings/change_password_login.mako:28
+msgid "adm_form_newuser_passwd_confirm"
+msgstr "Passwort (Wiederholung)"
+
+#: waskaweb/templates/usersettings/change_password.mako:38
+#: waskaweb/templates/usersettings/change_password_login.mako:36
+msgid "adm_form_changepassword_submit"
+msgstr "Passwort ändern"
+
+#: waskaweb/templates/usersettings/change_password_login.mako:5
+msgid "adm_header_changepassword_needed"
+msgstr "Passwortänderung erforderlich"
+
+#: waskaweb/templates/usersettings/edit_standin.mako:6
+msgid "usrset_header_changestandin"
+msgstr "Vertretung setzen"
+
+#: waskaweb/templates/usersettings/edit_standin.mako:18
+msgid "usrset_explain_changestandin"
+msgstr ""
+"Hier können Sie einstellen, welche(r) MitarbeiterIn beim Anlegen einer neuen "
+"Fallakte als Ihre Vertretung eingetragen wird. Diese Person hat dann "
+"ebenfalls Zugriff neu von Ihnen angelegte Fallakten. Diese Einstellung hat "
+"keine Auswirkung auf bereits von Ihnen angelegte Fallakten."
+
+#: waskaweb/templates/usersettings/edit_standin.mako:22
+msgid "usrset_form_changestandin_standin"
+msgstr "VertreterIn"
+
+#: waskaweb/templates/usersettings/edit_standin.mako:35
+msgid "usrset_form_changestandin_submit"
+msgstr "Vertretung setzen"
+
+#~ msgid "start_header_appointments_period"
+#~ msgstr "Termine"
+
+#~ msgid "adm_form_settings_ee_statement"
+#~ msgstr "Vorlage Einverständniserklärung"
+
+#~ msgid "adm_form_settings_ap_statement"
+#~ msgstr "Vorlage Förderplan"
+
+#~ msgid "adm_form_settings_privacystatement"
+#~ msgstr "Vorlage Einverständniserklärung"
+
+#~ msgid "adm_form_settings_view_privacystatement"
+#~ msgstr "Vorlage anzeigen"
+
+#~ msgid "adm_form_settings_aidplanstatement"
+#~ msgstr "Vorlage Förderplan"
+
+#~ msgid "adm_form_settings_view_aidplanstatement"
+#~ msgstr "Vorlage anzeigen"
+
+#~ msgid "start_header_help"
+#~ msgstr "Waska Hilfe"
+
+#~ msgid "app_actions_link_edit"
+#~ msgstr "Termin bearbeiten"
+
+#~ msgid "menu_adm_link_settings"
+#~ msgstr "Einstellungen"
+
+#~ msgid "cm_menu_link_back"
+#~ msgstr "<< Vorheriger Fallaktenpunkt"
+
+#~ msgid "cm_menu_link_forward"
+#~ msgstr "Nächster Fallaktenpunkt >>"
+
+#~ msgid "menu_header_app"
+#~ msgstr "Termine"
+
+#~ msgid "menu_header_doc"
+#~ msgstr "Dokumente"
+
+#~ msgid "cm_info_selected"
+#~ msgstr "Ausgewählte Fallakte"
+
+#~ msgid "adm_form_newuser_firstname"
+#~ msgstr "Vorname"
+
+#~ msgid "adm_form_newuser_lastname"
+#~ msgstr "Nachname"
+
+#~ msgid "adm_form_newuser_telephone"
+#~ msgstr "Telefon"
+
+#~ msgid "adm_form_newuser_disabled"
+#~ msgstr "Benutzer ist gesperrt/deaktiviert"
+
+#~ msgid "adm_form_newuser_login"
+#~ msgstr "Anmeldekennung"
+
+#~ msgid "adm_form_newuser_submit"
+#~ msgstr "Benutzer speichern"
+
+#~ msgid "cm_actions_link_printview"
+#~ msgstr "Druckansicht"
+
+#~ msgid "cm_actions_link_new"
+#~ msgstr "Neue Fallakte anlegen"

Added: trunk/waskaweb/i18n/waskaweb.pot
===================================================================
--- trunk/waskaweb/i18n/waskaweb.pot	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/i18n/waskaweb.pot	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,987 @@
+# Translations template for waskaweb.
+# Copyright (C) 2007 ORGANIZATION
+# This file is distributed under the same license as the waskaweb project.
+# FIRST AUTHOR <EMAIL at ADDRESS>, 2007.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: waskaweb 0.0.0\n"
+"Report-Msgid-Bugs-To: EMAIL at ADDRESS\n"
+"POT-Creation-Date: 2007-11-21 14:48+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.1\n"
+
+#: waskaweb/templates/main.mako:62
+msgid "statusbar_logininfo"
+msgstr ""
+
+#: waskaweb/templates/main.mako:69 waskaweb/templates/main.mako:100
+msgid "sm_menu_link_home"
+msgstr ""
+
+#: waskaweb/templates/main.mako:70
+msgid "sm_menu_link_help"
+msgstr ""
+
+#: waskaweb/templates/main.mako:71
+msgid "sm_menu_link_settings"
+msgstr ""
+
+#: waskaweb/templates/main.mako:73
+msgid "sm_menu_link_logout"
+msgstr ""
+
+#: waskaweb/templates/main.mako:79
+msgid "np_text"
+msgstr ""
+
+#: waskaweb/templates/main.mako:80 waskaweb/templates/main.mako:98
+msgid "np_root"
+msgstr ""
+
+#: waskaweb/templates/main.mako:103
+msgid "menu_app_link_overview"
+msgstr ""
+
+#: waskaweb/templates/main.mako:106
+msgid "menu_doc_link_overview"
+msgstr ""
+
+#: waskaweb/templates/main.mako:115
+msgid "menu_header_cm"
+msgstr ""
+
+#: waskaweb/templates/main.mako:117
+msgid "menu_cm_link_overview"
+msgstr ""
+
+#: waskaweb/templates/main.mako:120
+msgid "menu_cm_link_new"
+msgstr ""
+
+#: waskaweb/templates/main.mako:122
+msgid "menu_cm_link_import"
+msgstr ""
+
+#: waskaweb/templates/main.mako:125
+#: waskaweb/templates/casemanagement/evaluation.mako:8
+msgid "cm_actions_link_evaluate"
+msgstr ""
+
+#: waskaweb/templates/main.mako:134
+msgid "menu_header_adm"
+msgstr ""
+
+#: waskaweb/templates/main.mako:136
+msgid "menu_adm_link_useroverview"
+msgstr ""
+
+#: waskaweb/templates/main.mako:139
+msgid "menu_adm_link_showsettings"
+msgstr ""
+
+#: waskaweb/templates/main.mako:165
+msgid "footer_title"
+msgstr ""
+
+#: waskaweb/templates/main.mako:165
+msgid "footer_version"
+msgstr ""
+
+#: waskaweb/templates/administration/account_deactivated.mako:3
+msgid "adm_header_account_deactivated"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:5
+#: waskaweb/templates/administration/edit_user.mako:4
+#: waskaweb/templates/administration/new_user.mako:5
+#: waskaweb/templates/administration/new_user_result.mako:5
+#: waskaweb/templates/administration/overview_user.mako:5
+#: waskaweb/templates/administration/reset_password.mako:5
+#: waskaweb/templates/administration/settings.mako:4
+#: waskaweb/templates/administration/show_settings.mako:5
+#: waskaweb/templates/administration/show_user.mako:5
+#: waskaweb/templates/administration/dialogs/confirm_deleteuser.mako:5
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:5
+#: waskaweb/templates/administration/dialogs/notificate_deleteuser.mako:5
+msgid "adm_np_root"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:6
+msgid "adm_np_editsettings"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:11
+msgid "adm_header_editsettings"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:16
+msgid "adm_actions_link_showsettings"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:27
+#: waskaweb/templates/administration/show_settings.mako:25
+msgid "adm_form_settings_kaname"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:36
+#: waskaweb/templates/administration/show_settings.mako:29
+msgid "adm_form_settings_fkz"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:53
+#: waskaweb/templates/administration/show_settings.mako:33
+msgid "adm_form_settings_anontransfer"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_settings.mako:70
+msgid "adm_form_settings_save"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:5
+#: waskaweb/templates/administration/new_user.mako:6
+#: waskaweb/templates/administration/new_user_result.mako:6
+#: waskaweb/templates/administration/overview_user.mako:6
+#: waskaweb/templates/administration/reset_password.mako:6
+#: waskaweb/templates/administration/show_user.mako:6
+#: waskaweb/templates/administration/dialogs/confirm_deleteuser.mako:6
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:6
+msgid "adm_np_overview"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:6
+msgid "adm_np_edituser"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:10
+msgid "adm_header_edituser"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:15
+msgid "adm_actions_link_userpassreset"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:16
+msgid "menu_adm_link_useredit_back"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:25
+#: waskaweb/templates/administration/new_user.mako:28
+#: waskaweb/templates/administration/new_user_result.mako:22
+#: waskaweb/templates/administration/show_user_body.mako:2
+#: waskaweb/templates/administration/userform_body.mako:4
+msgid "adm_form_legend_personal"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:28
+#: waskaweb/templates/administration/new_user.mako:31
+#: waskaweb/templates/administration/userform_body.mako:7
+msgid "adm_form_user_firstname"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:36
+#: waskaweb/templates/administration/new_user.mako:39
+#: waskaweb/templates/administration/userform_body.mako:12
+msgid "adm_form_user_lastname"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:44
+#: waskaweb/templates/administration/new_user.mako:47
+#: waskaweb/templates/administration/userform_body.mako:17
+msgid "adm_form_user_telephone"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:49
+msgid "adm_form_user_roomnumer"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:54
+#: waskaweb/templates/administration/new_user.mako:57
+msgid "adm_form_user_branchoffice"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:58
+#: waskaweb/templates/administration/new_user.mako:61
+#: waskaweb/templates/administration/new_user_result.mako:45
+#: waskaweb/templates/administration/show_user_body.mako:29
+#: waskaweb/templates/administration/userform_body.mako:21
+#: waskaweb/templates/usersettings/change_password.mako:19
+#: waskaweb/templates/usersettings/change_password_login.mako:17
+msgid "adm_form_legend_login"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:76
+#: waskaweb/templates/administration/new_user.mako:79
+#: waskaweb/templates/administration/userform_body.mako:28
+msgid "adm_form_user_activated"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:84
+#: waskaweb/templates/administration/new_user.mako:83
+#: waskaweb/templates/administration/userform_body.mako:36
+msgid "adm_form_user_newpass"
+msgstr ""
+
+#: waskaweb/templates/administration/edit_user.mako:87
+#: waskaweb/templates/administration/new_user.mako:86
+#: waskaweb/templates/administration/userform_body.mako:54
+msgid "adm_form_user_submit"
+msgstr ""
+
+#: waskaweb/templates/administration/new_user.mako:7
+#: waskaweb/templates/administration/new_user_result.mako:7
+msgid "adm_np_newuser"
+msgstr ""
+
+#: waskaweb/templates/administration/new_user.mako:11
+msgid "adm_header_newuser"
+msgstr ""
+
+#: waskaweb/templates/administration/new_user.mako:16
+#: waskaweb/templates/administration/new_user_result.mako:16
+#: waskaweb/templates/administration/show_user.mako:17
+msgid "menu_adm_link_useroverview_back"
+msgstr ""
+
+#: waskaweb/templates/administration/new_user.mako:52
+msgid "adm_form_user_room"
+msgstr ""
+
+#: waskaweb/templates/administration/new_user.mako:64
+#: waskaweb/templates/administration/userform_body.mako:40
+msgid "adm_form_user_login"
+msgstr ""
+
+#: waskaweb/templates/administration/new_user.mako:71
+msgid "adm_form_user_role"
+msgstr ""
+
+#: waskaweb/templates/administration/new_user_result.mako:11
+msgid "adm_header_newuser_Result"
+msgstr ""
+
+#: waskaweb/templates/administration/overview_user.mako:12
+msgid "adm_header_overview"
+msgstr ""
+
+#: waskaweb/templates/administration/overview_user.mako:17
+msgid "adm_actions_link_newuser"
+msgstr ""
+
+#: waskaweb/templates/administration/overview_user.mako:24
+msgid "adm_overview_tbl_header_lastname"
+msgstr ""
+
+#: waskaweb/templates/administration/overview_user.mako:25
+msgid "adm_overview_tbl_header_firstname"
+msgstr ""
+
+#: waskaweb/templates/administration/overview_user.mako:26
+msgid "adm_overview_tbl_header_actions"
+msgstr ""
+
+#: waskaweb/templates/administration/reset_password.mako:7
+#: waskaweb/templates/administration/show_user.mako:7
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:7
+msgid "adm_np_showuser"
+msgstr ""
+
+#: waskaweb/templates/administration/reset_password.mako:8
+#: waskaweb/templates/administration/dialogs/confirm_resetpassword.mako:8
+#: waskaweb/templates/usersettings/dialogs/notificate_setpassword.mako:5
+msgid "adm_np_resetpassword"
+msgstr ""
+
+#: waskaweb/templates/administration/reset_password.mako:10
+msgid "adm_header_resetpassword"
+msgstr ""
+
+#: waskaweb/templates/administration/settings.mako:5
+msgid "adm_np_setting"
+msgstr ""
+
+#: waskaweb/templates/administration/settings.mako:7
+msgid "adm_header_settings"
+msgstr ""
+
+#: waskaweb/templates/administration/settings.mako:9
+msgid "adm_header_synchronisation"
+msgstr ""
+
+#: waskaweb/templates/administration/show_settings.mako:6
+msgid "adm_np_showsettings"
+msgstr ""
+
+#: waskaweb/templates/administration/show_settings.mako:11
+msgid "adm_header_showsettings"
+msgstr ""
+
+#: waskaweb/templates/administration/show_settings.mako:16
+msgid "adm_actions_link_editsettings"
+msgstr ""
+
+#: waskaweb/templates/administration/show_settings.mako:36
+msgid "adm_form_settings_anontransfer_yes"
+msgstr ""
+
+#: waskaweb/templates/administration/show_settings.mako:38
+msgid "adm_form_settings_anontransfer_no"
+msgstr ""
+
+#: waskaweb/templates/administration/show_user.mako:11
+msgid "adm_header_showuser"
+msgstr ""
+
+#: waskaweb/templates/administration/show_user.mako:16
+msgid "adm_actions_link_edituser"
+msgstr ""
+
+#: waskaweb/templates/administration/userform_body.mako:45
+msgid "adm_form_user_passwd"
+msgstr ""
+
+#: waskaweb/templates/administration/userform_body.mako:50
+msgid "adm_form_user_passwd_confirm"
+msgstr ""
+
+#: waskaweb/templates/administration/dialogs/confirm_deleteuser.mako:7
+msgid "adm_np_delteuser"
+msgstr ""
+
+#: waskaweb/templates/administration/dialogs/notificate_deleteuser.mako:6
+msgid "adm_np_deleteuser"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:6
+msgid "app_form_label_title"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:10
+msgid "app_form_label_date"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:14
+msgid "app_form_label_description"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:18
+msgid "app_form_label_remind"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:20
+msgid "app_form_option_remind_oneday"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:21
+msgid "app_form_option_remind_twoday"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:22
+msgid "app_form_option_remind_threeday"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:23
+msgid "app_form_option_remind_oneweek"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:24
+msgid "app_form_option_remind_twoweek"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:25
+msgid "app_form_option_remind_onemonth"
+msgstr ""
+
+#: waskaweb/templates/appointments/appointment_form.mako:31
+msgid "app_form_new_submit"
+msgstr ""
+
+#: waskaweb/templates/appointments/new.mako:4
+#: waskaweb/templates/appointments/overview.mako:4
+#: waskaweb/templates/appointments/show.mako:4
+#: waskaweb/templates/appointments/beta/show_10.mako:4
+#: waskaweb/templates/appointments/beta/show_5.mako:4
+#: waskaweb/templates/appointments/beta/show_6.mako:4
+#: waskaweb/templates/appointments/beta/show_7.mako:4
+#: waskaweb/templates/appointments/beta/show_8.mako:4
+#: waskaweb/templates/appointments/beta/show_9.mako:4
+#: waskaweb/templates/casemanagement/new_appointment.mako:5
+msgid "app_np_root"
+msgstr ""
+
+#: waskaweb/templates/appointments/new.mako:5
+#: waskaweb/templates/casemanagement/new_appointment.mako:6
+msgid "app_np_new"
+msgstr ""
+
+#: waskaweb/templates/appointments/new.mako:9
+#: waskaweb/templates/casemanagement/new_appointment.mako:10
+msgid "cm_app_header_new"
+msgstr ""
+
+#: waskaweb/templates/appointments/new.mako:14
+#: waskaweb/templates/appointments/beta/show_10.mako:15
+#: waskaweb/templates/appointments/beta/show_5.mako:15
+#: waskaweb/templates/appointments/beta/show_6.mako:15
+#: waskaweb/templates/appointments/beta/show_7.mako:14
+#: waskaweb/templates/appointments/beta/show_8.mako:15
+#: waskaweb/templates/appointments/beta/show_9.mako:15
+msgid "menu_app_link_overview_back"
+msgstr ""
+
+#: waskaweb/templates/appointments/overview.mako:5
+#: waskaweb/templates/casemanagement/appointments.mako:5
+msgid "app_np_list"
+msgstr ""
+
+#: waskaweb/templates/appointments/overview.mako:10
+#: waskaweb/templates/appointments/overview.mako:25
+#: waskaweb/templates/casemanagement/appointments.mako:10
+msgid "app_header_overview"
+msgstr ""
+
+#: waskaweb/templates/appointments/overview.mako:15
+#: waskaweb/templates/casemanagement/appointments.mako:16
+msgid "app_actions_link_newappointment"
+msgstr ""
+
+#: waskaweb/templates/appointments/overview_body.mako:4
+#: waskaweb/templates/appointments/overview_body.mako:75
+#: waskaweb/templates/start/start.mako:14
+msgid "app_overview_tbl_header_date"
+msgstr ""
+
+#: waskaweb/templates/appointments/overview_body.mako:5
+#: waskaweb/templates/appointments/overview_body.mako:76
+#: waskaweb/templates/start/start.mako:15
+msgid "app_overview_tbl_header_desc"
+msgstr ""
+
+#: waskaweb/templates/appointments/overview_body.mako:6
+#: waskaweb/templates/appointments/overview_body.mako:77
+#: waskaweb/templates/start/start.mako:16
+msgid "app_overview_tbl_header_actions"
+msgstr ""
+
+#: waskaweb/templates/appointments/show.mako:5
+#: waskaweb/templates/appointments/beta/show_1.mako:4
+#: waskaweb/templates/appointments/beta/show_10.mako:5
+#: waskaweb/templates/appointments/beta/show_2.mako:4
+#: waskaweb/templates/appointments/beta/show_3.mako:4
+#: waskaweb/templates/appointments/beta/show_4.mako:4
+#: waskaweb/templates/appointments/beta/show_5.mako:5
+#: waskaweb/templates/appointments/beta/show_6.mako:5
+#: waskaweb/templates/appointments/beta/show_7.mako:5
+#: waskaweb/templates/appointments/beta/show_8.mako:5
+#: waskaweb/templates/appointments/beta/show_9.mako:5
+msgid "app_np_show"
+msgstr ""
+
+#: waskaweb/templates/appointments/show.mako:9
+#: waskaweb/templates/appointments/beta/show_1.mako:9
+#: waskaweb/templates/appointments/beta/show_10.mako:10
+#: waskaweb/templates/appointments/beta/show_2.mako:9
+#: waskaweb/templates/appointments/beta/show_3.mako:8
+#: waskaweb/templates/appointments/beta/show_4.mako:9
+#: waskaweb/templates/appointments/beta/show_5.mako:10
+#: waskaweb/templates/appointments/beta/show_6.mako:10
+#: waskaweb/templates/appointments/beta/show_7.mako:9
+#: waskaweb/templates/appointments/beta/show_8.mako:10
+#: waskaweb/templates/appointments/beta/show_9.mako:10
+msgid "app_header_show"
+msgstr ""
+
+#: waskaweb/templates/appointments/show.mako:14
+#: waskaweb/templates/appointments/beta/show_1.mako:14
+#: waskaweb/templates/appointments/beta/show_2.mako:14
+#: waskaweb/templates/appointments/beta/show_3.mako:13
+#: waskaweb/templates/appointments/beta/show_4.mako:14
+msgid "sm_menu_link_home_back"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/appointments.mako:4
+#: waskaweb/templates/casemanagement/digest.mako:5
+#: waskaweb/templates/casemanagement/formular.mako:34
+#: waskaweb/templates/casemanagement/new_appointment.mako:4
+#: waskaweb/templates/casemanagement/organisation.mako:4
+#: waskaweb/templates/casemanagement/rg_aid_overview.mako:6
+#: waskaweb/templates/documents/case_new.mako:4
+#: waskaweb/templates/documents/case_overview.mako:5
+msgid "cm_np_select"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/create_export_scheme.mako:2
+msgid "cm_header_export_createscheme"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:6
+msgid "cm_np_digest"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:11
+msgid "cm_header_digest"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:17
+msgid "cm_header_digest_personal"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:20
+msgid "cm_digest_tbl_label_lastname"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:24
+msgid "cm_digest_tbl_label_firstname"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:28
+msgid "cm_digest_tbl_label_caseid"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:32
+msgid "cm_digest_tbl_label_age"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:36
+msgid "cm_digest_header_address"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:39
+msgid "cm_digest_tbl_label_street"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:43
+msgid "cm_digest_tbl_label_plz"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:47
+msgid "cm_digest_tbl_label_city"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/digest.mako:51
+msgid "cm_digest_tbl_label_telephone"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation.mako:4
+#: waskaweb/templates/casemanagement/evaluation_result.mako:5
+#: waskaweb/templates/casemanagement/main.mako:8
+#: waskaweb/templates/casemanagement/new.mako:5
+#: waskaweb/templates/casemanagement/overview.mako:6
+#: waskaweb/templates/casemanagement/upload.mako:4
+#: waskaweb/templates/casemanagement/dialogs/alert.mako:5
+#: waskaweb/templates/casemanagement/dialogs/confirm.mako:5
+#: waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako:5
+#: waskaweb/templates/casemanagement/dialogs/notificate_printall.mako:5
+#: waskaweb/templates/casemanagement/static_form/statement.mako:5
+#: waskaweb/templates/casemanagement/static_form/statement_print.mako:5
+#: waskaweb/templates/statement/dialogs/confirm.mako:5
+#: waskaweb/templates/statement/dialogs/missing_statement.mako:5
+msgid "cm_np_root"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation.mako:5
+#: waskaweb/templates/casemanagement/evaluation_result.mako:6
+msgid "cm_np_evaluate"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation.mako:7
+msgid "cm_header_evaluate"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation_result.mako:7
+msgid "cm_np_evaluate_result"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation_result.mako:9
+msgid "cm_header_evaluate_result"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation_result.mako:22
+#: waskaweb/templates/casemanagement/evaluation_result.mako:23
+#: waskaweb/templates/casemanagement/evaluation_result.mako:24
+#: waskaweb/templates/casemanagement/evaluation_result.mako:25
+#: waskaweb/templates/casemanagement/evaluation_result.mako:26
+#: waskaweb/templates/casemanagement/evaluation_result.mako:27
+#: waskaweb/templates/casemanagement/evaluation_result.mako:28
+#: waskaweb/templates/casemanagement/evaluation_result.mako:29
+#: waskaweb/templates/casemanagement/evaluation_result.mako:30
+msgid "cm_actions_link_export_evaluate"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/export.mako:4
+msgid "cm_np_root<"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/export.mako:5
+msgid "cm_np_export"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/export.mako:7
+msgid "cm_header_export"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/export.mako:11
+msgid "cm_actions_link_createexportscheme"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/formular.mako:5
+msgid "cm_header_form_edit"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/formular.mako:7
+msgid "cm_header_form_show"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/formular.mako:17
+#: waskaweb/templates/casemanagement/formular.mako:72
+msgid "cm_actions_link_show"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/formular.mako:19
+#: waskaweb/templates/casemanagement/formular.mako:74
+msgid "cm_actions_link_edit"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/formular.mako:22
+#: waskaweb/templates/casemanagement/formular.mako:79
+#: waskaweb/templates/casemanagement/rg_aid_overview.mako:18
+#: waskaweb/templates/start/help.mako:10
+msgid "cm_actions_link_printout"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:9
+#: waskaweb/templates/casemanagement/overview.mako:7
+msgid "cm_np_overview"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:17
+msgid "cm_info_name"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:20
+msgid "cm_info_nr"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:44
+msgid "cm_menu_header_cases"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:50
+msgid "cm_menu_link_close"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:51
+msgid "cm_menu_link_print"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:57
+msgid "cm_menu_header_seperator"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:60
+msgid "cm_menu_link_digest"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:62
+msgid "cm_menu_link_organisation"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:63
+msgid "cm_menu_link_appointment"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:64
+msgid "cm_menu_link_documents"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/main.mako:70
+msgid "cm_menu_header_structure"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/new.mako:6
+#: waskaweb/templates/casemanagement/dialogs/alert.mako:6
+#: waskaweb/templates/casemanagement/static_form/statement.mako:6
+msgid "cm_np_new"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/new_appointment.mako:16
+msgid "cm_menu_link_appointment_back"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:5
+msgid "cm_np_organisation"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:10
+msgid "cm_header_organisation"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:15
+msgid "cm_header_organisation_editor"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:18
+msgid "cm_organisation_tbl_label_lastname"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:21
+msgid "cm_organisation_tbl_label_firstname"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:24
+msgid "cm_organisation_tbl_label_telephone"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:35
+msgid "cm_form_editor_submit"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:38
+msgid "cm_header_standin"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/organisation.mako:58
+msgid "cm_form_standin_submit"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/overview.mako:9
+msgid "cm_header_overview"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/overview.mako:12
+msgid "cm_header_search"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/overview.mako:16
+msgid "cm_form_overview_search_submit"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/overview.mako:24
+msgid "cm_overview_tbl_header_id"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/overview.mako:25
+msgid "cm_overview_tbl_header_firstname"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/overview.mako:26
+msgid "cm_overview_tbl_header_lastname"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/overview.mako:27
+msgid "cm_overview_tbl_header_actions"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/rg_aid_overview.mako:20
+msgid "cm_actions_link_printoutAidPlanStatement"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/upload.mako:5
+#: waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako:6
+msgid "cm_np_import"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/upload.mako:7
+msgid "cm_header_import"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/upload.mako:11
+msgid "cm_from_import_label_file"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/upload.mako:14
+msgid "cm_from_import_submit"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/dialogs/confirm.mako:6
+msgid "cm_np_delete"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/static_form/statement_print.mako:6
+msgid "cm_np_statement"
+msgstr ""
+
+#: waskaweb/templates/dialogs/alert.mako:2
+msgid "dialog_header_alert"
+msgstr ""
+
+#: waskaweb/templates/dialogs/alert.mako:5
+msgid "dialog_header_confirm_option_ok"
+msgstr ""
+
+#: waskaweb/templates/dialogs/alert.mako:6
+msgid "dialog_header_confirm_option_cancel"
+msgstr ""
+
+#: waskaweb/templates/dialogs/confirm.mako:3
+msgid "dialog_header_confirm"
+msgstr ""
+
+#: waskaweb/templates/dialogs/confirm.mako:6
+msgid "dialog_header_confirm_option_yes"
+msgstr ""
+
+#: waskaweb/templates/dialogs/confirm.mako:7
+msgid "dialog_header_confirm_option_no"
+msgstr ""
+
+#: waskaweb/templates/dialogs/notification.mako:3
+msgid "dialog_header_notification"
+msgstr ""
+
+#: waskaweb/templates/dialogs/notification.mako:6
+msgid "dialog_header_notification_option_ok"
+msgstr ""
+
+#: waskaweb/templates/documents/case_new.mako:5
+#: waskaweb/templates/documents/case_overview.mako:6
+msgid "cm_np_doc_overview"
+msgstr ""
+
+#: waskaweb/templates/documents/case_new.mako:6
+msgid "cm_np_doc_upload"
+msgstr ""
+
+#: waskaweb/templates/documents/case_new.mako:10
+msgid "cm_header_doc_new"
+msgstr ""
+
+#: waskaweb/templates/documents/case_new.mako:16
+msgid "cm_menu_link_document_back"
+msgstr ""
+
+#: waskaweb/templates/documents/case_new.mako:26
+#: waskaweb/templates/documents/global_upload.mako:23
+#: waskaweb/templates/documents/upload_body.mako:5
+msgid "doc_form_upload_label_file"
+msgstr ""
+
+#: waskaweb/templates/documents/case_new.mako:28
+#: waskaweb/templates/documents/global_upload.mako:25
+#: waskaweb/templates/documents/upload_body.mako:8
+msgid "doc_form_upload_submit"
+msgstr ""
+
+#: waskaweb/templates/documents/case_overview.mako:11
+msgid "cm_header_doc_overview"
+msgstr ""
+
+#: waskaweb/templates/documents/case_overview.mako:17
+msgid "cm_actions_link_doc_new"
+msgstr ""
+
+#: waskaweb/templates/documents/case_overview.mako:28
+#: waskaweb/templates/documents/global_overview.mako:28
+msgid "doc_overview_tbl_header_filename"
+msgstr ""
+
+#: waskaweb/templates/documents/case_overview.mako:29
+#: waskaweb/templates/documents/global_overview.mako:29
+msgid "doc_overview_tbl_header_filesize"
+msgstr ""
+
+#: waskaweb/templates/documents/case_overview.mako:30
+#: waskaweb/templates/documents/global_overview.mako:30
+msgid "doc_overview_tbl_header_actions"
+msgstr ""
+
+#: waskaweb/templates/documents/case_overview.mako:47
+#: waskaweb/templates/documents/global_overview.mako:47
+msgid "doc_overview_nofilesfound"
+msgstr ""
+
+#: waskaweb/templates/documents/global_overview.mako:6
+#: waskaweb/templates/documents/global_upload.mako:4
+msgid "doc_np_root"
+msgstr ""
+
+#: waskaweb/templates/documents/global_overview.mako:7
+msgid "doc_np_overview"
+msgstr ""
+
+#: waskaweb/templates/documents/global_overview.mako:11
+msgid "doc_header_overview"
+msgstr ""
+
+#: waskaweb/templates/documents/global_overview.mako:17
+msgid "doc_actions_link_new"
+msgstr ""
+
+#: waskaweb/templates/documents/global_upload.mako:5
+msgid "doc_np_upload"
+msgstr ""
+
+#: waskaweb/templates/documents/global_upload.mako:9
+msgid "doc_header_new"
+msgstr ""
+
+#: waskaweb/templates/documents/global_upload.mako:14
+msgid "menu_doc_link_overview_back"
+msgstr ""
+
+#: waskaweb/templates/start/start.mako:6
+msgid "start_header_blackboard"
+msgstr ""
+
+#: waskaweb/templates/start/start.mako:11
+msgid "start_header_remind"
+msgstr ""
+
+#: waskaweb/templates/statement/dialogs/confirm.mako:6
+msgid "statement_np_edit"
+msgstr ""
+
+#: waskaweb/templates/statement/dialogs/missing_statement.mako:6
+msgid "cm_np_show"
+msgstr ""
+
+#: waskaweb/templates/usersettings/change_password.mako:6
+msgid "adm_header_changepassword"
+msgstr ""
+
+#: waskaweb/templates/usersettings/change_password.mako:11
+#: waskaweb/templates/usersettings/edit_standin.mako:11
+msgid "sm_menu_link_settings_back"
+msgstr ""
+
+#: waskaweb/templates/usersettings/change_password.mako:22
+#: waskaweb/templates/usersettings/change_password_login.mako:20
+msgid "adm_form_newuser_passwd"
+msgstr ""
+
+#: waskaweb/templates/usersettings/change_password.mako:30
+#: waskaweb/templates/usersettings/change_password_login.mako:28
+msgid "adm_form_newuser_passwd_confirm"
+msgstr ""
+
+#: waskaweb/templates/usersettings/change_password.mako:38
+#: waskaweb/templates/usersettings/change_password_login.mako:36
+msgid "adm_form_changepassword_submit"
+msgstr ""
+
+#: waskaweb/templates/usersettings/change_password_login.mako:5
+msgid "adm_header_changepassword_needed"
+msgstr ""
+
+#: waskaweb/templates/usersettings/edit_standin.mako:6
+msgid "usrset_header_changestandin"
+msgstr ""
+
+#: waskaweb/templates/usersettings/edit_standin.mako:18
+msgid "usrset_explain_changestandin"
+msgstr ""
+
+#: waskaweb/templates/usersettings/edit_standin.mako:22
+msgid "usrset_form_changestandin_standin"
+msgstr ""
+
+#: waskaweb/templates/usersettings/edit_standin.mako:35
+msgid "usrset_form_changestandin_submit"
+msgstr ""
+

Added: trunk/waskaweb/lib/__init__.py
===================================================================

Added: trunk/waskaweb/lib/app_globals.py
===================================================================
--- trunk/waskaweb/lib/app_globals.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/app_globals.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,67 @@
+"""The application's Globals object"""
+from pylons import config
+
+from waskaweb.model.io.document import openDocument 
+import waskaweb.model.data as data 
+from waskaweb.lib.formular_help import HelpProvider 
+
+import waskaweb.lib.security    as security
+import waskaweb.lib.pdfimporter as pdfimporter
+
+import os, sys
+
+class Globals(object):
+    """Globals acts as a container for objects available throughout the
+    life of the application
+    """
+
+    def __init__(self):
+        """One instance of Globals is created during application
+        initialization and is available during requests via the 'g'
+        variable
+        """
+        # XXX: Dead ugly!
+        path = os.path.join(os.path.dirname(__file__), '..', '..', 'formed')
+        treeFile = os.path.join(path, 'formedtree_web.xml')
+        helpFile = os.path.join(path, 'waska-hilfetexte.xhtml')
+
+        # XXX: Check why the following throws key exceptions. Is config var not
+        # availiable in Globals?!?
+        #treeFile = os.path.join(os.path.dirname(__file__), config['formed_tree'])
+        self.formedTree = openDocument(treeFile)
+        try:
+            f = open(helpFile, "r")
+            xhtml = f.read()
+            f.close()
+            self.helpData = HelpProvider(xhtml) 
+        except:
+            print >> sys.stderr, "Could not open Helpfile"
+            self.helpData = None
+
+        # prefetch external external choice leaves
+        for ex in self.formedTree.findAllByClass(data.ExternalChoiceListLeaf):
+            fname = ex.getValue()
+            if not fname: continue
+            fname = os.path.join(path, fname)
+            subDoc = openDocument(fname)
+            ex.choice = subDoc.findByClassAndName(data.ChoiceNode)
+
+        # data for database connections
+
+        host   = config.get('db_host')
+        port   = config.get('db_port')
+        dbname = config.get('db_database')
+        user   = config.get('db_user')
+
+        if not host   is None: security.HOST   = host
+        if not port   is None: security.PORT   = int(port)
+        if not dbname is None: security.DBNAME = dbname
+        if not user   is None: security.USER   = user
+
+        # data for pdf2xfa connections
+        pdf_host = config.get('pdf2xfa_host')
+        pdf_port = config.get('pdf2xfa_port')
+
+        if not pdf_host is None: pdfimporter.HOST = pdf_host
+        if not pdf_port is None: pdfimporter.PORT = int(pdf_port)
+

Added: trunk/waskaweb/lib/base.py
===================================================================
--- trunk/waskaweb/lib/base.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/base.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,82 @@
+"""The base Controller API
+
+Provides the BaseController class for subclassing, and other objects
+utilized by Controllers.
+"""
+from pylons import c, cache, config, g, request, response, session
+from pylons.controllers import WSGIController
+from pylons.controllers.util import abort, etag_cache, redirect_to
+from pylons.decorators import jsonify, validate
+from pylons.i18n import _, ungettext, N_
+from pylons.templating import render
+
+import waskaweb.lib.helpers as h
+import waskaweb.model as model
+from waskaweb.lib.db_factory import *
+
+from waskaweb.lib.security import HOST, PORT, DBNAME, USER, getDbName
+
+import sys
+
+POSITIVE = [
+    "ie6.css",
+    "all.css",
+    "screen.css",
+    "print.css",
+    "logo_ka_75.png",
+    "eu_logo_4c_pos_web2.jpg",
+    "BMFSFJ_C_M_web.jpg",
+    "favicon.ico"
+]
+
+def inPositive(path):
+    for p in POSITIVE:
+        if path.endswith(p):
+            return True
+    return False
+
+class BaseController(WSGIController):
+    def __init__(self):
+        self.db_pool = None
+
+    def __before__(self):
+        # Check if the user is already authorized. If not then redirect the user
+        # to the login page
+        try:
+            login, passwd, user = session['USER_AUTHORIZED']
+            dbname = getDbName() 
+            #conn_url = CONN_URL % (dbname, dbname, login, passwd)
+            self.db_pool = DBPool(
+                dbname   = DBNAME % dbname,
+                host     = HOST,
+                port     = PORT,
+                user     = USER % (dbname, login),
+                password = passwd)
+
+            # Is the user activated?
+            if not user.isActivated() and not request.path_info in ('/administration/accountDeactivated', '/styles/web.css', '/styles/all.css'):
+                print request.path_info
+                redirect_to(controller="administration", action="accountDeactivated")
+            # Do the user needs to change his passwort?
+            if user.needsNewPass() and not request.path_info in ('/usersettings/changePasswordOnLogin', '/usersettings/changePasswordOnLoginAction', '/styles/web.css', '/styles/all.css'):
+                redirect_to(controller="usersettings", action="changePasswordOnLogin")
+        except KeyError:
+            p = str(request.path_info)
+            if not p in ( '/waska/login', '/waska/loginAction'):# and not inPositive(p):
+                print >> sys.stderr, "Redirect to: '%s' %s" % (request.path_info, str(inPositive(p)))
+                redirect_to(h.url_for(controller='/waska', action='login'))
+
+    def __after__(self):
+        if self.db_pool:
+            self.db_pool.closeConnection()
+
+    def __call__(self, environ, start_response):
+        """Invoke the Controller"""
+        # WSGIController.__call__ dispatches to the Controller method
+        # the request is routed to. This routing information is
+        # available in environ['pylons.routes_dict']
+        return WSGIController.__call__(self, environ, start_response)
+
+# Include the '_' function in the public names
+__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \
+           or __name == '_']

Added: trunk/waskaweb/lib/casedata.py
===================================================================
--- trunk/waskaweb/lib/casedata.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/casedata.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,901 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+# Torsten Irlaender <torsten.irlaender at intevation.de>
+#
+import sys
+import traceback
+import psycopg2 as dbapi
+import psycopg2.extras
+import time
+import datetime
+from sets import Set
+from waskaweb.model.agency import Agency
+from waskaweb.lib.base import session 
+
+#sql statements used by the DSFactory
+GET_ALL_DS_SQL = """SELECT id FROM master_tbl_view ORDER by name_1"""
+SEARCH_DS_SQL = """SELECT id FROM master_tbl_view WHERE
+                    vorname_1 ~* %(needle)s OR
+                    name_1 ~* %(needle)s OR
+                    kundennummer ~* %(needle)s 
+                    ORDER by name_1"""
+
+#other sql statements
+LOAD_DS_SQL = """SELECT bearbeiter_id FROM master_tbl_view WHERE id = %(id)s"""
+LOAD_STANDIN_SQL = """SELECT n.benutzer_id FROM nm_benutzer_master_tbl_view n
+                        JOIN master_tbl_view m ON 
+                        m.id = n.master_id
+                        WHERE m.id = %(id)s"""
+ADD_STANDIN_SQL = """SELECT create_nm_benutzer_master_ds(%(userid)s, %(caseid)s)"""
+DELETE_STANDIN_SQL = """SELECT delete_nm_benutzer_master_ds(%(userid)s, %(caseid)s)"""
+SET_EDITOR_SQL = """SELECT set_case_editor(%(userid)s, %(caseid)s)"""
+
+DELETE_DS_SQL = """SELECT delete_master_ds(%d)"""
+CREATE_DS_SQL = """SELECT create_master_ds()"""
+INIT_AGENCY_SQL  = """UPDATE page_0_view SET name_kompetenzagentur = %(ka_name)s, fkz = %(fkz)s, vorname = %(vorname)s, name = %(nachname)s WHERE id = %(id)s"""
+
+CREATE_RG_KOMPETENZ_DS = """SELECT create_rg_kompetenz_ds(%(id)s)"""
+CREATE_RG_SPRACHE_DS   = """SELECT create_rg_sprache_ds(%(id)s)"""
+CREATE_RG_MASSNAHME_DS = """SELECT create_rg_massnahme_ds(%(id)s)"""
+
+CREATE_RG_BILDEN_DS    = """SELECT create_rg_bilden_ds(%(id)s)"""
+CREATE_RG_LEBEN_DS     = """SELECT create_rg_leben_ds(%(id)s)"""
+CREATE_RG_QUALI_DS     = """SELECT create_rg_quali_ds(%(id)s)"""
+CREATE_RG_BERUF_DS     = """SELECT create_rg_beruf_ds(%(id)s)"""
+DELETE_RG_BILDEN_DS = """select delete_rg_bilden_ds(%(id)s)"""
+DELETE_RG_LEBEN_DS  = """select delete_rg_leben_ds(%(id)s)"""
+DELETE_RG_QUALI_DS = """select delete_rg_quali_ds(%(id)s)"""
+DELETE_RG_BERUF_DS = """select delete_rg_beruf_ds(%(id)s)"""
+
+FETCH_AID_LIST_SQL = """SELECT id FROM %s WHERE master_id = %s"""
+
+AID_0_DB_TBL = "rg_angebote_bildenden_bereich_tbl_view"
+AID_1_DB_TBL = "rg_angebote_berufsvorbereitung_tbl_view"
+AID_2_DB_TBL = "rg_angebote_berufliche_qualifizierung_tbl_view"
+AID_3_DB_TBL = "rg_angebote_lebensbewaeltigung_tbl_view"
+
+FETCH_AID_0_SQL = """SELECT id, angebotsform as form, art_der_unterstuetzung as type, durchfuehrende_institution as institute, unterstuetzung_start as start, unterstuetzung_ende as end FROM rg_angebote_bildenden_bereich_tbl_view WHERE id = %s"""
+FETCH_AID_1_SQL = """SELECT id, angebotsform_1 as form, art_der_unterstuetzung_1 as type, durchfuehrende_institution_1 as institute, unterstuetzung_start_1 as start, unterstuetzung_ende_1 as end FROM rg_angebote_berufsvorbereitung_tbl_view WHERE id = %s"""
+FETCH_AID_2_SQL = """SELECT id, angebotsform_2 as form, angebote_im_bereich as type, durchfuehrende_institution_2 as institute, unterstuetzung_start_2 as start, unterstuetzung_ende_2 as end FROM rg_angebote_berufliche_qualifizierung_tbl_view WHERE id = %s"""
+FETCH_AID_3_SQL = """SELECT id, angebotsform_3 as form, art_der_unterstuetzung_2 as type, durchfuehrende_institution_3 as institute, unterstuetzung_start_3 as start, unterstuetzung_ende_3 as end FROM rg_angebote_lebensbewaeltigung_tbl_view WHERE id = %s"""
+
+FETCH_KOMPETENZ_ID = """SELECT id from rg_kompetenzfestellung_tbl_view WHERE master_id = %(id)s LIMIT 1"""
+
+AID = {"0": ["BB", "14rg", CREATE_RG_BILDEN_DS, AID_0_DB_TBL, DELETE_RG_BILDEN_DS],
+        "1": ["BV", "15rg", CREATE_RG_BERUF_DS, AID_1_DB_TBL, DELETE_RG_BERUF_DS],
+    "2": ["BQ", "16rg", CREATE_RG_QUALI_DS, AID_2_DB_TBL, DELETE_RG_QUALI_DS],
+        "3": ["LB", "17rg", CREATE_RG_LEBEN_DS, AID_3_DB_TBL, DELETE_RG_LEBEN_DS]}
+
+class Id:
+    def __init__(self, id, key, parent):
+        self.id     = id
+        self.key    = key
+        self.parent = parent
+
+    def getIdentifier(self):
+        identifier = []
+        current = self
+        while current:
+            identifier.insert(0, (current.key, current.id))
+            current = current.parent
+        return identifier
+
+class Page(Id):
+
+    def __init__(self, id, key, parent):
+        Id.__init__(self, id, key, parent)
+
+    def isOverview(self):
+        return False
+
+def convert(x):
+    return isinstance(x, str) and unicode(x, 'utf-8') or x
+
+class DataPage(Page):
+    def __init__(self, dbFactory, relation, items, id):
+        self.dbFactory = dbFactory
+        self.items     = items # TODO: check for SQL injection
+        self.data      = None
+        self.relation  = relation # TODO: check for SQL injection
+        self.id        = id
+
+    def getData(self, item):
+        if self.data is None:
+            self._fetchData()
+        data = self.data
+        if data is None: return None
+        try:
+            # TODO: Ugly! Better change the db scheme "ja, nein, keine angabe"
+            # fields to int instead of boolean
+            if isinstance(data[item][0], type(True)):
+                return data[item][0] and 1 or 0 
+            return data[item][0]
+        except KeyError:
+            return None
+
+    def setData(self, item, value):
+        if self.data is None:
+            self._fetchData()
+        data = self.data
+        if data is None: return
+        try:
+            v = data[item]
+            # store only if different
+            if v[0] != value:
+                v[0] = value
+                v[1] = True
+        except KeyError:
+            pass
+
+    def store(self):
+        data = self.data
+        if data is None: return
+        fields = {} 
+        keys   = []
+        for k, v in data.iteritems():
+            if v[1]:
+                keys.append("%s=%%(%s)s" % (k, k))
+                fields[k]=v[0]
+
+        if not fields:
+            return
+
+        fields['id'] = int(self.id)
+
+        stmnt = "UPDATE %s SET %s WHERE id = %%(id)s;" % (
+            self.relation, ", ".join(keys))
+
+        try:
+            con = None
+            cur = None
+            try:
+                con = self.dbFactory.getConnection()
+                cur = con.cursor()
+                #cur.execute(stmnt)
+                cur.execute(stmnt, fields)
+                con.commit()
+            finally:
+                if cur:
+                    try: cur.close()
+                    except: pass
+                if con:
+                    try: self.dbFactory.recycleConnection(con)
+                    except: pass
+
+            # mark as written
+            for v in data.itervalues():
+                v[1] = False
+
+        except dbapi.Error, err:
+            print >> sys.stderr, "DB error: %s" % str(err)
+
+
+    def _fetchData(self):
+        try:
+            fields = ", ".join(self.items)
+        except:
+            pass
+        stmnt = "SELECT %s FROM %s WHERE id = %%(id)s;" % (fields, self.relation)
+        try:
+            con = None
+            cur = None
+            try:
+                con = self.dbFactory.getConnection()
+                cur = con.cursor()
+                cur.execute(stmnt, { 'id': int(self.id)})
+                res = cur.fetchone()
+            finally:
+                if cur:
+                    try: cur.close()
+                    except: pass
+                if con:
+                    try: self.dbFactory.recycleConnection(con)
+                    except: pass
+            if res:
+                self.data = dict(
+                    zip(self.items, [[convert(item), False] for item in res]))
+                #print str(self.data)
+
+        except dbapi.Error, err:
+            print >> sys.stderr, "DB error: %s" % str(err)
+
+class DataSetAidObject:
+    def __init__(self, db_pool=None, aid_type=None, id=None, sql=None):
+        self.db_pool = db_pool
+        self.id = id 
+        self.start_date = "-/-" 
+        self.end_date = "-/-" 
+        self.type = "-/-" 
+        self.institution = "-/-" 
+        self.aid_form = "-/-" 
+        self.type_name = "-/-" 
+
+        self.type_id = aid_type 
+        self.page_id = None
+        try:
+            self.type = AID[str(aid_type)][0] 
+            self.page_id = AID[str(aid_type)][1] 
+        except:
+            pass
+
+        #Do we load an object?
+        if id and sql:
+            self._fetchData(id, sql)
+
+    def _fetchData(self, id, sql):
+        conn = None
+        cur = None
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                cur = conn.cursor()
+                sql = sql % id
+                cur.execute(sql)
+                #print >> sys.stderr, "%s" % sql
+                r = cur.fetchone()
+                # Set data
+                self.id = r[0] 
+                self.form = unicode(str(r[1]), 'utf-8')
+                #self.type = r[2]
+                self.institution = unicode(str(r[3]), 'utf-8')
+                self.start_date = r[4].strftime('%d.%m.%Y')
+                self.end_date = r[5].strftime('%d.%m.%Y')
+            finally:
+                try:
+                    if cur:
+                        cur.close()
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except:
+            pass
+
+    def create(self, case_id):
+        conn = None
+        cur = None
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                cur = conn.cursor()
+                sql = AID[str(self.type_id)][2]
+                cur.execute(sql, { 'id': case_id })
+                r = cur.fetchone()
+                conn.commit()
+                # Set data
+                self.id = r[0]
+            finally:
+                try:
+                    if cur:
+                        cur.close()
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except StandardError, err:
+            pass
+        return self.id
+
+    def delete(self):
+        conn = None
+        cur = None
+        sql = None
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                cur = conn.cursor()
+                sql = (AID[str(self.type_id)][4]) # get delete function
+                cur.execute(sql, { 'id': self.id })
+                conn.commit()
+            finally:
+                try:
+                    if cur:
+                        cur.close()
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    print >> sys.stderr, "Could not recycle connection"
+        except StandardError, err:
+            print >> sys.stderr, "Error on deleting aid object", str(err), " ", sql 
+        return True
+
+class DataSetAidList:
+    def __init__(self, db_pool, case_id):
+        self.aid_list = []
+        self.db_pool = db_pool
+        conn = None
+        c = None
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                # Bildenden Bereich 
+                c = conn.cursor()
+                sql = FETCH_AID_LIST_SQL % (AID_0_DB_TBL, case_id)
+                #print >> sys.stderr, str(sql)
+                c.execute(sql)
+                for r in c.fetchall():
+                    self.aid_list.append(DataSetAidObject(self.db_pool, 0, r[0], FETCH_AID_0_SQL))
+                c.close()
+                # Berufsvorbereitung
+                c = conn.cursor()
+                sql = FETCH_AID_LIST_SQL % (AID_1_DB_TBL, case_id)
+                #print >> sys.stderr, str(sql)
+                c.execute(sql)
+                for r in c.fetchall():
+                    self.aid_list.append(DataSetAidObject(self.db_pool, 1, r[0], FETCH_AID_1_SQL))
+                c.close()
+                # Berufliche Qualifizierung
+                c = conn.cursor()
+                sql = FETCH_AID_LIST_SQL % (AID_2_DB_TBL, case_id)
+                #print >> sys.stderr, str(sql)
+                c.execute(sql)
+                for r in c.fetchall():
+                    self.aid_list.append(DataSetAidObject(self.db_pool, 2, r[0], FETCH_AID_2_SQL))
+                c.close()
+                # Bildenden Bereich 
+                c = conn.cursor()
+                sql = FETCH_AID_LIST_SQL % (AID_3_DB_TBL, case_id)
+                #print >> sys.stderr, str(sql)
+                c.execute(sql)
+                for r in c.fetchall():
+                    self.aid_list.append(DataSetAidObject(self.db_pool, 3, r[0], FETCH_AID_3_SQL))
+            finally:
+                try:
+                    if c:
+                        c.close()
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except StandardError, err:
+            print >> sys.stderr, "%s" % str(err)
+            pass
+
+    def numDatasets(self):
+        return len(self.aid_list) 
+
+    def getDatasets(self):
+        return self.aid_list
+
+    def listDatasetIds(self, limit, ofs):
+        return [ds.id for ds in self.ds_list]
+
+class DataSetOverviewPage:
+
+    def __init__(self, db_pool, search_str=None):
+        self.db_pool = db_pool
+        self.ds_list = []
+
+    def search(self, search_str=None):
+        self.ds_list = []
+        f = DSFactory(self.db_pool)
+        for id in f.listDatasetIds(search_str):
+            self.ds_list.append(DataSetOverviewObject(id, self.db_pool))
+
+    def numDatasets(self):
+        return len(self.ds_list) 
+
+    def getDatasets(self):
+        return self.ds_list
+
+    def listDatasetIds(self, limit, ofs):
+        return [ds.id for ds in self.ds_list]
+
+class DataSetOverviewObject:
+    def __init__(self, id, db_pool):
+        self.id = id
+        self.first_name = None
+        self.last_name = None
+        self.knr = None
+        self.db_pool = db_pool
+        self._loadFromDB(id)
+
+    def _loadFromDB(self, id):
+        # XXX: Not ensured that conn is given back to pool!
+        conn = self.db_pool.getConnection()
+        c = conn.cursor()
+        # XXX: Use prepared statement here
+        sql = """SELECT name_1, vorname_1, kundennummer from master_tbl_view WHERE id = %s""" % str(id)
+        result = None
+        try:
+            c.execute(sql)
+            result = c.fetchone()
+            c.close()
+            self.db_pool.recycleConnection(conn)
+        except StandardError, err:
+            print "DataSetOverviewObject: %s " % str(err)
+        try:        
+            self.last_name = unicode(str(result[0]), 'utf-8')
+            self.first_name = unicode(str(result[1]), 'utf-8')
+            self.knr = unicode(str(result[2]), 'utf-8')
+        except:
+            pass
+
+class TempDigest:
+    def __init__(self, params):
+        self.first_name = params.get('name_1') or '-/-' 
+        self.last_name = params.get('vorname_1') or '-/-' 
+        self.plz = params.get('plz') or '-/-'
+        self.address = params.get('strasse') or '-/-'  
+        self.city = params.get('wohnort') or '-/-'
+
+class DataSetDigest:
+    def __init__(self, id, db_pool):
+        self.id = id
+        self.first_name = '' 
+        self.last_name = '' 
+        self.knr = '' 
+        self.age = ''
+        self.plz = ''
+        self.city = ''
+        self.address = ''
+        self.telephone = ''
+        self.statement = '' 
+
+        self.db_pool = db_pool
+        self._loadFromDB(id)
+
+    def hasSignedPrivacyStatement(self):
+        return self.statement
+
+    def _loadFromDB(self, id):
+        conn = self.db_pool.getConnection()
+        c = conn.cursor()
+        sql = """SELECT name_1, 
+                    vorname_1, 
+                    kundennummer,
+                    date_part('year', age(geburtsdatum::timestamp)) as alter,
+                    plz,
+                    strasse,
+                    wohnort,
+                    vorwahl,
+                    telefon_1,
+                    einverstaendniserklaerung
+                    from master_tbl_view WHERE id = %s""" % str(id)
+        result = None
+        try:
+            c.execute(sql)
+            result = c.fetchone()
+            c.close()
+            self.db_pool.recycleConnection(conn)
+        except StandardError, err:
+            print "DataSetOverviewObject: %s " % str(err)
+        try: 
+            self.last_name = unicode(str(result[0]), 'utf-8')
+            self.first_name = unicode(str(result[1]), 'utf-8')
+            self.knr = unicode(str(result[2]), 'utf-8')
+            if result[3]:
+                self.age =  "%.0f" % result[3]
+            else: 
+                self.age = ""
+            self.plz = unicode(str(result[4]), 'utf-8')
+            self.address = unicode(str(result[5]), 'utf-8')
+            self.city = unicode(str(result[6]), 'utf-8')
+            self.telephone_1 = u"%s" % unicode(str(result[7]), 'utf-8')
+            self.telephone_2 = u"%s" % unicode(str(result[8]), 'utf-8')
+            self.statement = (result[9] >= 0)
+        except StandardError, err:
+            print >> sys.stderr, "Error! Could not read out case digest: %s" % str(err)
+            pass
+
+class DatasetStandin:
+    def __init__(self, db_pool=None, case_id=None):
+        self.db_pool = db_pool
+        self.case_id = case_id
+        self.user_ids = []
+        self._loadFromDB()
+
+    def _loadFromDB(self):
+        con = None
+        cur = None
+        sql = LOAD_STANDIN_SQL
+        fields = {'id': self.case_id}
+        try:
+            con = self.db_pool.getConnection()
+            cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+            cur.execute(LOAD_STANDIN_SQL, fields)
+            rows = cur.fetchall()
+            for row in rows:
+                self.user_ids.append(row['benutzer_id'])
+        finally:
+            try:
+                if cur:
+                    cursor.close()
+                if con:
+                    self.db_pool.recycleConnection(con)
+            except:
+                pass
+
+    def getStandin(self):
+        return self.user_ids
+
+    def setStandin(self, userid_list):
+        old = Set(self.getStandin())
+        new = Set(userid_list)
+        self._delete(old - new)
+        self._add(new - old)
+
+    def _delete(self, userid_list):
+        con = None
+        cur = None
+        fields = {'caseid': self.case_id, 'userid': None}
+        try:
+            con = self.db_pool.getConnection()
+            for uid in userid_list:
+                fields['userid'] = uid
+                cur = con.cursor()
+                try:
+                    cur.execute(DELETE_STANDIN_SQL, fields)
+                except:
+                    con.rollback()
+                cur.close()
+            con.commit()
+        finally:
+            try:
+                if cur:
+                    cursor.close()
+                if con:
+                    self.db_pool.recycleConnection(con)
+            except:
+                pass
+
+    def _add(self, userid_list):
+        con = None
+        cur = None
+        fields = {'caseid': self.case_id, 'userid': None}
+        try:
+            con = self.db_pool.getConnection()
+            for uid in userid_list:
+                fields['userid'] = uid
+                cur = con.cursor()
+                try:
+                    cur.execute(ADD_STANDIN_SQL, fields)
+                except:
+                    con.rollback()
+                cur.close()
+            con.commit()
+        finally:
+            try:
+                if cur:
+                    cursor.close()
+                if con:
+                    self.db_pool.recycleConnection(con)
+            except:
+                pass
+
+class Dataset(Id):
+    def __init__(self, db_pool=None, id=None, key=None, parent=None):
+        Id.__init__(self, id, key, parent)
+        self.db_pool = db_pool 
+        self.id = id 
+        self.editor = None
+        if id:
+            self.standin = DatasetStandin(self.db_pool, id) 
+            self._loadFromDB()
+
+    def _loadFromDB(self):
+        con = None
+        cur = None
+        sql = LOAD_DS_SQL
+        fields = {'id': self.id}
+        try:
+            con = self.db_pool.getConnection()
+            cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+            cur.execute(LOAD_DS_SQL, fields)
+            row = cur.fetchone()
+            self.editor = row['bearbeiter_id']
+        finally:
+            try:
+                if cur:
+                    cursor.close()
+                if con:
+                    self.db_pool.recycleConnection(con)
+            except:
+                pass
+
+    def getEditor(self):
+        return self.editor
+
+    def setEditor(self, userid):
+        con = None
+        cur = None
+        fields = {'caseid': self.id, 'userid': userid}
+        try:
+            con = self.db_pool.getConnection()
+            cur = con.cursor()
+            try:
+                cur.execute(SET_EDITOR_SQL, fields)
+            except:
+                con.rollback()
+            con.commit()
+        finally:
+            try:
+                if cur:
+                    cursor.close()
+                if con:
+                    self.db_pool.recycleConnection(con)
+            except:
+                pass
+        
+
+    def getStandin(self):
+        return self.standin.getStandin()
+
+    def setStandin(self, userid_list):
+        self.standin.setStandin(userid_list)
+
+    def numPages(self):
+        return 0
+
+    def getPage(self, id):
+        return None
+
+    def create(self):
+        conn = None
+        cur = None
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                cur = conn.cursor()
+                cur.execute(CREATE_DS_SQL)
+                self.id = cur.fetchone()[0]
+                conn.commit()
+            finally:
+                try:
+                    if cur:
+                        cur.close()
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+            # XXX: This a workaround the RGs
+            self.createDependencies()
+        except:
+            traceback.print_exc(file=sys.stderr)
+
+        return self.id 
+
+    def initData(self):
+        conn = None
+        cur = None
+        try:
+            login, passwd, user = session['USER_AUTHORIZED']
+            agency = Agency(self.db_pool)
+            fields = {
+                'ka_name': agency.getName(), 
+                'vorname': user.first_name,
+                'nachname': user.last_name,
+                'fkz': agency.getFKZ(), 
+                'id': self.id
+                }
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            cur.execute(INIT_AGENCY_SQL, fields)
+            conn.commit()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+        
+
+    def createDependencies(self):
+        #print >> sys.stderr, "createDependencies called"
+        con, cur = None, None
+        try:
+            con = self.db_pool.getConnection()
+
+            # create one Kompetenzfestellung
+            cur = con.cursor()
+            cur.execute(CREATE_RG_KOMPETENZ_DS, { 'id': self.id })
+            komp_id = cur.fetchone()[0]
+            cur.close(); cur = None
+
+            # TODO: Uncomment the following as soon as the SP exist.
+            # create three Maßnahmen per master data set
+            #for i in range(3):
+            #    cur = con.cursor()
+            #    cur.execute(CREATE_RG_MASSNAHME_DS, { 'id': komp_id })
+            #    cur.close(); cur = None
+
+            # create three Beherrschungsprache per Kompetenzfestellung
+            #for i in range(3):
+            #    cur = con.cursor()
+            #    cur.execute(CREATE_RG_SPRACHE_DS, { 'id': komp_id })
+            #    cur.close(); cur = None
+
+            # TODO: Uncomment the following as soon as the SP exist.
+            # create three Maßnahmen per master data set
+            #for i in range(3):
+            #    cur = con.cursor()
+            #    cur.execute(CREATE_RG_MASSNAHME_DS, { 'id': komp_id })
+            #    cur.close(); cur = None
+
+            con.commit()
+        finally:
+            if cur:
+                try: cur.close()
+                except: pass
+            if con:
+                try: self.db_pool.recycleConnection(con)
+                except:pass
+                
+
+    def delete(self):
+        conn = None
+        cur = None
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                cur = conn.cursor()
+                sql = DELETE_DS_SQL % int(self.id)
+                cur.execute(sql)
+                conn.commit()
+                return True
+            finally:
+                try:
+                    if cur:
+                        cur.close()
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except StandardError, err:
+            print >> sys.stderr, "Fehler beim Loeschen: %s" %str(err)
+        return False 
+
+class DSFactory:
+
+    def __init__(self, dbpool):
+        self.dbpool = dbpool 
+
+    def getDataset(self, id):
+        return None
+
+    def numDatasets(self):
+        return 0
+
+    def listDatasetIds(self, search_str=None, limit=None, ofs=None):
+        con = None
+        cur = None
+        ids = []
+        try:
+            con = self.dbpool.getConnection()
+            cur = con.cursor()
+            if search_str:
+                fields = {'needle': search_str}
+                cur.execute(SEARCH_DS_SQL, fields)
+            else:
+                cur.execute(GET_ALL_DS_SQL)
+            result = cur.fetchall()
+            for r in result:
+                ids.append(r[0])
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if con:
+                    self.db_pool.recycleConnection(con)
+            except:
+                pass
+        return ids 
+
+    def createDataset(self):
+        try:
+            ds = Dataset(self.dbpool)
+            ds_id = ds.create()
+            return ds
+        except StandardError, err:
+            print >> sys.stderr, "Fehler beim Anlegen eines Datensatzes: %s" % str(err)
+        return None 
+
+def kompetenzId(dbPool, id):
+    con, cur = None, None
+    result = None
+    try:
+        con = dbPool.getConnection()
+        # a master dataset has to be created each time
+        cur = con.cursor()
+        cur.execute(FETCH_KOMPETENZ_ID, { 'id': id })
+        row = cur.fetchone()
+        if row: 
+            result = row[0]
+        cur.close(); cur = None
+    finally:
+        if cur:
+            try: cur.close()
+            except: pass
+        if con:
+            try: dbPool.recycleConnection(con)
+            except: pass
+    return result
+
+CASE_EXISTS = "SELECT * FROM case_exists(%(knummer)s)"
+
+def caseExists(dbPool, knummer):
+    con, cur = None, None
+    try:
+        con = dbPool.getConnection()
+        cur = con.cursor()
+        cur.execute(CASE_EXISTS, { 'knummer': knummer })
+        row = cur.fetchone()
+        if row is None: return False
+        return row[0]
+    finally:
+        if cur:
+            try: cur.close()
+            except: pass
+        if con:
+            try: dbPool.recycleConnection(con)
+            except: pass
+
+CREATE_SQL = {
+   'rg_angebote_bildenden_bereich_tbl':         CREATE_RG_BILDEN_DS,
+   'rg_angebote_lebensbewaeltigung_tbl':        CREATE_RG_LEBEN_DS,
+   'rg_angebote_berufliche_qualifizierung_tbl': CREATE_RG_QUALI_DS,
+   'rg_angebote_berufsvorbereitung_tbl':        CREATE_RG_BERUF_DS
+}
+
+def createTables(dbPool, relations):
+    masterId, kompetenzId = None, None
+
+    con, cur = None, None
+    createdTables = {}
+    try:
+        con = dbPool.getConnection()
+        # a master dataset has to be created each time
+        cur = con.cursor()
+        cur.execute(CREATE_DS_SQL)
+        masterId = cur.fetchone()[0]
+        cur.close(); cur = None
+        createdTables['master_tbl'] = masterId
+
+        # kompetenz rg has to be created each time
+        cur = con.cursor()
+        cur.execute(CREATE_RG_KOMPETENZ_DS, { 'id': masterId })
+        rid = cur.fetchone()[0]
+        cur.close(); cur = None
+        con.commit()
+
+        createdTables['rg_kompetenzfestellung_tbl'] = rid
+
+        for name, rels, separate in relations:
+            id = None
+            if not separate:
+                id = createdTables.get(name)
+
+            if id is None:
+                try:
+                    stmnt = CREATE_SQL[name]
+                except KeyError:
+                    print >> sys.stderr, "Kann Statement zur Erzeugung von '%s' nicht finden." % name
+                    continue
+                cur = con.cursor()
+                cur.execute(stmnt, { 'id': masterId })
+                id = cur.fetchone()[0]
+                cur.close(); cur = None
+
+            # write the relations
+            for rel in rels:
+                rel.sqlUpdate(con, id)
+
+            if not separate:
+                createdTables[name] = id
+    finally:
+        if cur:
+            try: cur.close()
+            except: pass
+        if con:
+            try: dbPool.recycleConnection(con)
+            except: pass
+
+    return masterId
+
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/lib/db_factory.py
===================================================================
--- trunk/waskaweb/lib/db_factory.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/db_factory.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,50 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+
+import psycopg2 as dbapi
+
+import sys
+import traceback
+
+class DBPool:
+
+    def __init__(self, dbname, user, password, host='localhost', port=5432):
+        self.dbname   = dbname 
+        self.user     = user
+        self.password = password
+        self.host     = host
+        self.port     = int(port)
+        self.conn     = None
+
+    def getConnection(self):
+        conn = self.conn
+        if conn:
+            self.conn = None
+            return conn
+        try:
+            conn = dbapi.connect(
+                database = self.dbname,
+                host     = self.host,
+                port     = self.port,
+                user     = self.user,
+                password = self.password)
+            self.conn = conn
+        except:
+            traceback.print_exc(file=sys.stderr)
+            return None
+        return conn
+
+    def recycleConnection(self, conn):
+        self.conn = conn
+
+    def closeConnection(self):
+        conn = self.conn
+        if conn:
+            try: self.conn.close()
+            except dbapi.Error: pass
+            self.conn = None
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=latin1:

Added: trunk/waskaweb/lib/evaluation.py
===================================================================
--- trunk/waskaweb/lib/evaluation.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/evaluation.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,498 @@
+# -*- coding: UTF-8 -*-
+import psycopg2
+import codecs
+import waskaweb.lib.helpers as h
+import sys
+
+class Evaluation:
+    def __init__(self, conn):
+        self.total = 0;
+        self.total_cm = 0;
+        self.conn = conn
+        c1 = None
+        try:
+            try:
+                c1 = self.conn.cursor()
+                c1.execute("""SELECT getTotalCM()""")
+                self.total_cm = c1.fetchone()[0]
+                c1.close()
+                c1 = self.conn.cursor()
+                c1.execute("""SELECT getTotal()""")
+                self.total = c1.fetchone()[0]
+                c1.close()
+            finally:
+                try:
+                    if c1:
+                        c1.close()
+                except:
+                    pass
+        except:
+            print >> sys.stderr, "Error! Could not get connection in evaluation"
+
+    def perform(self):
+        pass
+
+    def export(self):
+        pass
+
+class Evaluation_1(Evaluation):
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+        self.percent = 0 
+
+    def perform(self):
+        try:
+            if self.total == 0: divisor = 1
+            else: divisor = self.total
+            self.percent = "%s" % h.formatNumber(float(self.total_cm)/float(divisor)*100)
+        except:
+            print >> sys.stderr, "No results for eval 1"
+            self.percent = 0;
+        return (self.total, self.total_cm, self.percent) 
+
+    def export(self):
+        self.perform()
+        path = "/tmp/evaluation_1.csv"
+        f = open(path, "w")
+        f.write("Jugendliche;Anzahl;Prozent\n")
+        f.write("Erstgespräche;%s;100%%\n" % (self.total))
+        f.write("In das CM übernommen;%s;%s%%\n" %(self.total_cm, self.percent))
+        f.close()
+        return path 
+
+class Evaluation_2(Evaluation):
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        self.m = [0,0] 
+        self.w = [0,0] 
+        self.i = [0,0]
+        self.u = [0,0]
+
+        cur = None
+        try:
+            cur = self.conn.cursor()
+            sql = """SELECT count(geschlecht), geschlecht, g.value 
+                FROM master_tbl_eval_incm_view v 
+                JOIN geschlecht_tbl g ON v.geschlecht = g.id 
+                GROUP BY geschlecht, g.value"""
+            cur.execute(sql)
+            for g in cur.fetchall():
+                if g[1] == 1:
+                    self.m[0] = g[0]
+                elif g[1]== 0:
+                    self.w[0] = g[0]
+                elif g[1] == 2:
+                    self.i[0] = g[0]
+                else:
+                    self.u[0] = g[0]
+            self.total = self.m[0]+self.w[0]+self.i[0]+self.u[0]
+            if self.total > 0:
+                if self.total == 0: divisor = 1
+                else: divisor = self.total_cm
+                self.m[1] = "%s" % h.formatNumber(float(self.m[0])/float(divisor)*100)
+                self.w[1] = "%s" % h.formatNumber(float(self.w[0])/float(divisor)*100)
+                self.i[1] = "%s" % h.formatNumber(float(self.i[0])/float(divisor)*100)
+                self.u[1] = "%s" % h.formatNumber(float(self.u[0])/float(divisor)*100)
+            cur.close()
+        except:
+            print >> sys.stderr, "No result for eval 2"
+        return (self.total,self.m,self.w,self.i)
+
+    def export(self):
+        self.perform()
+        path = "/tmp/evaluation_2.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Geschlecht;Anzahl;Prozent\n")
+        f.write(u"Männlich;%s;%s%%\n" % (self.m[0], self.m[1]))
+        f.write(u"Weiblich;%s;%s%%\n" %(self.w[0], self.w[1]))
+        f.write(u"Intersexuell;%s;%s%%\n" %(self.i[0], self.i[1]))
+        f.close()
+        return path 
+
+class Evaluation_3(Evaluation):
+    """Migrationshintergrund"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        c1 = self.conn.cursor()
+        m = [0,0]
+        sql = """select count(id) from master_tbl_eval_incm_view 
+                    WHERE geburtsland <> 29 
+                    OR vater = 0 
+                    OR mutter = 0"""
+        try:
+            c1.execute(sql)
+        except StandardError, err:
+            print >> sys.stderr,  "can not select: %s" % str(err)
+        try:
+            m[0] = c1.fetchone()[0]
+            if m[0]:
+                m[1] = "%s" % h.formatNumber(float(m[0])/float(self.total_cm)*100)
+            c1.close()
+        except StandardError, err: 
+            print >> sys.stderr,  "no result eval 3: %s" % str(err)
+            c1.close()
+            return [0,0]
+        return m 
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_2.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Kategorie;Anzahl;Prozent\n")
+        f.write("Migrationshintergrund;%s;%s%%\n" % (p[0], p[1]))
+        f.close()
+        return path 
+
+class Evaluation_4(Evaluation):
+    """ Zugang der der Jugendichen zu KA"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        c1 = self.conn.cursor()
+        result = {}
+        sql = """select t.id, count(v.zugang_kompetenzagentur), t.value 
+                    from master_tbl_view v 
+                    right join zugang_kompetenzagentur_tbl t 
+                    on v.zugang_kompetenzagentur = t.id 
+                    group by t.id, t.value having t.id is not null 
+                    order by t.id asc"""
+        try:
+            c1.execute(sql)
+        except StandardError, err:
+            print >> sys.stderr,  "can not select: %s" % str(err)
+        try:
+            if self.total == 0: divisor = 1
+            else: divisor = self.total
+            for r in c1.fetchall():
+                result[r[0]] = []
+                try:
+                    result[r[0]].append(u'%s' % unicode(r[2], 'utf-8')) # name
+                    result[r[0]].append(r[1]) # how many?
+                    result[r[0]].append("%s" % h.formatNumber(float(r[1])/float(divisor)*100))
+                except StandardError, err:
+                    print >> sys.stderr, str(err)
+            c1.close()
+        except:
+            print >> sys.stderr, "No results for eval 4"
+            c1.close()
+        return result 
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_4.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Zugang;Anzahl;Prozent\n")
+        for v in p.itervalues():
+            f.write("%s;%s;%s%%\n" % (v[0], v[1], v[2]))
+        f.close()
+        return path 
+
+class Evaluation_5(Evaluation):
+    """Rechtskreis der Jugendlichen beim Zugang zur KA"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        c1 = self.conn.cursor()
+        result = {}
+        sql = """select r.id, count(m.rechtlicher_kontext), r.value from master_tbl_view m 
+                    right join rechtlicher_kontext_tbl r 
+                    on m.rechtlicher_kontext = r.id
+                    group by r.id, r.value having r.id is not null
+                    order by r.id asc"""
+        try:
+            c1.execute(sql)
+        except StandardError, err:
+            print >> sys.stderr, str('Can not Select: %s' % err)
+        try:
+            if self.total == 0: divisor = 1
+            else: divisor = self.total
+            for r in c1.fetchall():
+                result[r[0]] = []
+                try:
+                    result[r[0]].append(u'%s' % unicode(r[2], 'utf-8')) # name
+                    result[r[0]].append(r[1]) # how many?
+                    result[r[0]].append("%s" % h.formatNumber(float(r[1])/float(divisor)*100))
+                except StandardError, err:
+                    print >> sys.stderr, str(err)
+            c1.close()
+        except StandardError, err:
+            print >> sys.stderr, str('no results for eval 5: %s' % err)
+            c1.close()
+        return result 
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_5.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Rechtskreis;Anzahl;Prozent\n")
+        for v in p.itervalues():
+            f.write(u"%s;%s;%s%%\n" % (v[0], v[1], v[2]))
+        f.close()
+        return path 
+
+class Evaluation_6(Evaluation):
+    """Vermittlung nach Beendigung"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        c1 = self.conn.cursor()
+        result = {}
+        sql = """select v.id, count(m.vermittlung), v.value from master_tbl_eval_incm_view m 
+                    right join vermittlung_tbl v on m.vermittlung = v.id 
+                    group by v.id, v.value having v.id is not null order by v.id asc"""
+        try:
+            c1.execute(sql)
+        except:
+            print >> sys.stderr, str('Can not Select')
+        try:
+            if self.total == 0: divisor = 1
+            else: divisor = self.total_cm
+            for r in c1.fetchall():
+                result[r[0]] = []
+                try:
+                    result[r[0]].append(u'%s' % unicode(r[2], "utf-8")) # name
+                    result[r[0]].append(r[1]) # how many?
+                    try:
+                        result[r[0]].append("%s" % h.formatNumber(float(r[1])/float(divisor)*100))
+                    except:
+                        result[r[0]].append("%s" % h.formatNumber(0.0))
+                except StandardError, err:
+                    print >> sys.stderr, str('Error on assigning values: %s' % err)
+            c1.close()
+        except StandardError, err:
+            print >> sys.stderr, str('No result eval 6: %s' % err)
+            c1.close()
+        return result 
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_6.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Vermittlung;Anzahl;Prozent\n")
+        for v in p.itervalues():
+            f.write(u"%s;%s;%s%%\n" % (v[0], v[1], v[2]))
+        f.close()
+        return path 
+
+class Evaluation_7(Evaluation):
+    """Rechtskreis nach Vermittlung"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        c1 = self.conn.cursor()
+        result = {}
+        sql = """select r.id, count(m.veraenderungen_rechtskreis), r.value from master_tbl_eval_incm_view m 
+                    right join rechtlicher_kontext_tbl r 
+                    on m.veraenderungen_rechtskreis = r.id 
+                    group by r.id, r.value having r.id is not null order by r.id asc"""
+        try:
+            c1.execute(sql)
+        except:
+            print >> sys.stderr, str('Can not Select')
+        try:
+            if self.total == 0: divisor = 1
+            else: divisor = self.total_cm
+            for r in c1.fetchall():
+                result[r[0]] = []
+                try:
+                    result[r[0]].append(u'%s' % unicode(r[2], "utf-8")) # name
+                    result[r[0]].append(r[1]) # how many?
+                    try:
+                        result[r[0]].append("%s" % h.formatNumber(float(r[1])/float(divisor)*100))
+                    except:
+                        result[r[0]].append("%s" % h.formatNumber(0.0))
+                except StandardError, err:
+                    print >> sys.stderr, str('Error on assigning values: %s' % err)
+            c1.close()
+        except StandardError, err:
+            print >> sys.stderr, str('No results for eval 7: %s' % err)
+            c1.close()
+        return result 
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_7.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Rechtskreis;Anzahl;Prozent\n")
+        for v in p.itervalues():
+            f.write(u"%s;%s;%s%%\n" % (v[0], v[1], v[2]))
+        f.close()
+        return path 
+
+class Evaluation_8(Evaluation):
+    """Altersvreteilung"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        c1 = self.conn.cursor()
+        result = [["<14",0,0], 
+                ["14-16",0,0],  
+                ["16-18",0,0], 
+                ["18-21",0,0], 
+                ["21-24",0,0], 
+                ["24-27",0,0], 
+                [">27",0,0]]
+        try:
+            c1.execute("""select date_part('year', age(geburtsdatum::timestamp)) from master_tbl_eval_incm_view""")
+        except:
+            print >> sys.stderr, str('Can not Select')
+        try:
+            if self.total == 0: divisor = 1
+            else: divisor = self.total_cm
+            for r in c1.fetchall():
+                #TODO Filter empty rows in sql directly
+                if not r[0]: 
+                    continue
+                if r[0] < 14:
+                    result[0][1] += 1
+                    result[0][2] = "%s" % h.formatNumber(float(result[0][1])/float(divisor)*100)
+                if 14 <= r[0] <= 16:
+                    result[1][1] += 1
+                    result[1][2] = "%s" % h.formatNumber(float(result[1][1])/float(divisor)*100)
+                if 16 < r[0] <= 18:
+                    result[2][1] += 1
+                    result[2][2] = "%s" % h.formatNumber(float(result[2][1])/float(divisor)*100)
+                if 18 < r[0] <= 21:
+                    result[3][1] += 1
+                    result[3][2] = "%s" % h.formatNumber(float(result[3][1])/float(divisor)*100)
+                if 21 < r[0] <= 24:
+                    result[4][1] += 1
+                    result[4][2] = "%s" % h.formatNumber(float(result[4][1])/float(divisor)*100)
+                if 24 < r[0] <= 27:
+                    result[5][1] += 1
+                    result[5][2] = "%s" % h.formatNumber(float(result[5][1])/float(divisor)*100)
+                if 27 < r[0]:
+                    result[6][1] += 1
+                    result[6][2] = "%s" % h.formatNumber(float(result[6][1])/float(divisor)*100)
+            c1.close()
+        except StandardError, err:
+            print >> sys.stderr, str('No results for eval 8: %s' % err)
+            c1.close()
+        return result 
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_8.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Altersgruppe;Anzahl;Prozent\n")
+        for v in p:
+            f.write("%s;%s;%s%%\n" % (v[0], v[1], v[2]))
+        f.close()
+        return path 
+
+
+class Evaluation_9(Evaluation):
+    """Verteilung Foerderangebote"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        c1 = self.conn.cursor()
+        result = [[u"berufliche Qualifizierung",0,0],
+            [u"berufliche Vorbereitung", 0,0],
+            [u"bildenden Bereich", 0,0],
+            [u"%s" % unicode("Lebens- bewältigung", "utf-8"), 0,0]
+        ]
+        try:
+            c1.execute("""select count(id) from rg_angebote_berufliche_qualifizierung_tbl_view""")
+            result[0][1] = c1.fetchone()[0]
+            c1.close()
+            c1 = self.conn.cursor()
+            c1.execute("""select count(id) from rg_angebote_berufsvorbereitung_tbl_view""")
+            result[1][1] = c1.fetchone()[0]
+            c1.close()
+            c1 = self.conn.cursor()
+            c1.execute("""select count(id) from rg_angebote_bildenden_bereich_tbl_view""")
+            result[2][1] = c1.fetchone()[0]
+            c1.close()
+            c1 = self.conn.cursor()
+            c1.execute("""select count(id) from rg_angebote_lebensbewaeltigung_tbl_view""")
+            result[3][1] = c1.fetchone()[0]
+            c1.close()
+            c1 = self.conn.cursor()
+            
+            total = 0
+            # Gesammtanzahl der Maßnahmen berechnen
+            for r in result: total += r[1]
+            if total == 0: total = 1
+            result[0][2] = "%s" % h.formatNumber(float(result[0][1])/float(total)*100)
+            result[1][2] = "%s" % h.formatNumber(float(result[1][1])/float(total)*100)
+            result[2][2] = "%s" % h.formatNumber(float(result[2][1])/float(total)*100)
+            result[3][2] = "%s" % h.formatNumber(float(result[3][1])/float(total)*100)
+            c1.close()
+            c1 = None
+        except StandardError, err:
+            print >> sys.stderr, str('No results for eval 9: %s' % err)
+            if c1:
+                c1.close()
+        return result
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_9.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Angebot;Anzahl;Prozent\n")
+        for v in p:
+            f.write(u"%s;%s;%s%%\n" % (v[0], v[1], v[2]))
+        f.close()
+        return path 
+
+class Evaluation_10(Evaluation):
+    """Verweildauer im CM"""
+    def __init__(self, conn):
+        Evaluation.__init__(self, conn)
+
+    def perform(self):
+        # [monat, abgeschl_num, abschloss_proz, abbruch_num, abbruch_proz]
+        c1 = self.conn.cursor()
+        sql = """select count(id), art_beendigung, zeitraum_fallmanagement from master_tbl_eval_incm_view where art_beendigung <> -1 group by zeitraum_fallmanagement, art_beendigung"""
+        c1.execute(sql)
+        row = None
+        result = []
+        curr_month = -1
+        if self.total_cm == 0: divisor = 1
+        else: divisor = self.total_cm
+        for r in c1.fetchall():
+            if r[1] == '-1': # Keine Angabe
+                continue
+            
+            if r[2] != curr_month:
+                curr_month = r[2]
+                if row is not None:
+                    if row[1] != 0 or row[3] != 0:
+                        result.append(row)
+                row = [r[2],0,0,0,0]
+
+            num = r[0]
+            proz = "%s" % h.formatNumber(float(r[0])/float(divisor)*100)
+
+            if r[1] == 1 : # Abbruch
+                row[3] = num
+                row[4] = proz 
+            else: 
+                row[1] = num
+                row[2] = proz 
+        c1.close()
+        if row is not None:
+            result.append(row)
+        return result
+
+    def export(self):
+        p = self.perform()
+        path = "/tmp/evaluation_10.csv"
+        f = codecs.open(path, "w", "utf-8")
+        f.write("Monat;Anzahl Abgeschlossen;Prozent Abgeschlossen, Anzahl Abgebrochen, Prozent Abgebrochen\n")
+        for v in p:
+            f.write(u"%s;%s;%s%%;%s;%s%%\n" % (v[0], v[1], v[2], v[3], v[4]))
+        f.close()
+        return path 
+

Added: trunk/waskaweb/lib/filters.py
===================================================================
--- trunk/waskaweb/lib/filters.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/filters.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from cgi import escape
+
+def no_none(text):
+    if text == 'None' or text == u'None':
+        return ''
+    return text
+
+def NA(text):
+    if text == 'None' or text == u'None' or text == '' or text == u'':
+        return '-/-'
+    return text
+
+def H(text):
+    return escape(text, True)
+
+def shorten(text):
+    if len(text) > 40:
+        text = text[0:40] + "..."
+    return text
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Added: trunk/waskaweb/lib/formular_help.py
===================================================================
--- trunk/waskaweb/lib/formular_help.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/formular_help.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from xml.dom.minidom import parseString
+
+from xml.dom.ext     import Print
+
+from cStringIO       import StringIO
+
+class HelpProvider:
+
+    def __init__(self, xhtml):
+        helps = {}
+        dom = None
+        try:
+            dom = parseString(xhtml)
+            for div in dom.getElementsByTagName("div"):
+                id = div.getAttribute("id")
+                if not id: continue
+                out = StringIO()
+                Print(div, out, 'UTF-8')
+                helps[id] = out.getvalue()
+                out.close()
+        finally:
+            if dom: dom.unlink()
+        self.helps = helps
+
+    def hasHelp(self, id):
+        return self.helps.has_key(id)
+
+    def getHelp(self, id, default=None):
+        return self.helps.get(id, default)
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/lib/helpers.py
===================================================================
--- trunk/waskaweb/lib/helpers.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/helpers.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,103 @@
+"""Helper functions
+
+Consists of functions to typically be used within templates, but also
+available to Controllers. This module is available to both as 'h'.
+"""
+#from waskaweb.lib.base import *
+import locale
+from pylons import c, cache, config, g, request, response, session
+from webhelpers import *
+from waskaweb.lib.db_factory import *
+
+def hasRole(rolelist):
+    # available rolenames:
+    #   * admin_ka
+    #   * cm_ka
+    #   * pt_dlr
+    try:
+        user = session['USER_AUTHORIZED'][2]
+        return user.role in rolelist
+    except KeyError:
+        return False
+
+def getRole():
+    # Translate Roles:
+    #   * admin_ka -> Admin-KA
+    #   * cm_ka    -> CM-KA
+    #   * pt_dlr   -> PT-DLR
+    try:
+        user = session['USER_AUTHORIZED'][2]
+        return user.getRole()
+        #role = user.role 
+        #if role == 'cm_ka':
+        #    return 'CM-KA'
+        #elif role == 'admin_ka':
+        #    return 'Admin-KA'
+        #elif role == 'pt_dlr':
+        #    return 'PT-DLR'
+        #else:
+        #    return ''
+    except KeyError:
+        return ''
+        
+def getUserFullname():
+    try:
+        user = session['USER_AUTHORIZED'][2]
+        return "%s, %s" % (user.last_name, user.first_name) 
+    except KeyError:
+        return ''
+
+def getLogin():
+    try:
+        user = session['USER_AUTHORIZED'][2]
+        return user.login 
+    except KeyError:
+        return ''
+
+def getUserId():
+    try:
+        user = session['USER_AUTHORIZED'][2]
+        return user.id 
+    except KeyError:
+        return ''
+    
+
+def formatNumber(number):
+    retval = locale.format("%.2f",(number),1)
+    return retval
+
+def getFormularHeaders(page_id):
+    navigation = session.get('navigation.tree')
+    headers = navigation.getHeaders(page_id)
+    return headers
+
+def getFormularName(page_id):
+    navigation = session.get('navigation.tree')
+    ti = navigation.getTreeItem(page_id)
+    try:
+        return "Akte: %s" % ti.description
+    except AttributeError:
+        pass
+
+def getFormularErrors(page_id):
+    errors_on_page = {}
+    # Get treeitem
+    navigation = session.get('navigation.tree')
+    ti = navigation.getTreeItem(page_id)
+    errors = session.get('case_errors', {})
+    try:
+        for key, err in errors.iteritems(): 
+            if err.page == ti.page:
+                errors_on_page[key] = err
+    except:
+        pass
+    return errors_on_page
+
+def getPrintUrl(print_form, ds_id, page_id):
+    if print_form == "digest":
+        return "/case/printout/%s/0/digest" % (ds_id)
+    elif print_form == "show":
+        return "/case/printout/%s/%s/show" % (ds_id, page_id)
+    else: 
+        return "#"
+

Added: trunk/waskaweb/lib/pdfimporter.py
===================================================================
--- trunk/waskaweb/lib/pdfimporter.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/pdfimporter.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,762 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+import socket
+
+from xml.dom.minidom import parse, parseString
+
+from waskaweb.model.nodecomponents import Leaf, Node, VISIT_CONTINUE, VISIT_IGNORE_CHILDREN
+
+import waskaweb.model.data as data
+from waskaweb.model.semantic import convertFromDescription, SematicError
+
+import sys
+
+HOST = "192.168.11.17"
+PORT = 1111
+
+#massnahme1_tbl:
+# no page
+
+#rg_beherrschung_sprache_tbl:
+# no page
+
+TBL_TO_PAGES = {
+    'master_tbl': [
+        "page_einverstaendnis", 
+        "page_0", 
+        "page_25",
+        "page_1", 
+        "page_2", 
+        "page_3", 
+        "page_4", 
+        "page_5", 
+        "page_6", 
+        "page_7", 
+        "page_10",
+        "page_15", 
+        "page_16", 
+        "page_17", 
+        "page_18", 
+        "page_19", 
+        "page_20" ],
+    'rg_kompetenzfestellung_tbl': [
+        "page_8", 
+        "page_9" ],
+    'rg_angebote_bildenden_bereich_tbl': [
+        "page_21" ],
+    'rg_angebote_berufsvorbereitung_tbl': [
+        "page_22" ],
+    'rg_angebote_berufliche_qualifizierung_tbl': [
+        "page_23" ],
+    'rg_angebote_lebensbewaeltigung_tbl': [
+        "page_24" ],
+}
+
+
+UNTERSTUETZUNGS_ANGEBOTE =  [
+    (u"rg_angebote_bildenden_bereich",
+     u"Unterstützungsangebote_%d_im_allgemein_bildenden_Bereich",
+     u"page_21"),
+
+    (u"rg_angebote_berufsvorbereitung",
+     u"Unterstützungsangebote_%d_im_Bereich_der_Berufsvorbereitung",
+     u"page_22"),
+
+    (u"rg_angebote_berufliche_qualifizierung",
+     u"Unterstützungsangebote_%d_im_Bereich_der_beruflichen_Qualifizierung",
+     u"page_23"),
+
+    (u"rg_angebote_lebensbewaeltigung",
+     u"Unterstützungsangebote_%d_im_Bereich_der_Lebensbewältigung",
+     u"page_24")
+]
+
+# This list models the fact that some XFA fields are mapped 
+# to other FormEd tree fields.
+
+REMAP_TO_OTHER = [
+    (u"Maßnahme_Nennung",                            u"Vermittlung_Nennung"),
+    (u"Ausbildung_Nennung",                          u"Vermittlung_Nennung"),
+    (u"Arbeit_Nennung",                              u"Vermittlung_Nennung"),
+    (u"Schule_Nennung",                              u"Vermittlung_Nennung"),
+    (u"Sonstiges_Nennung",                           u"Vermittlung_Nennung"),
+    (u"allgemein_bildender_Bereich_Kulturtechniken", u"bildender_Bereich"),
+    (u"ausbildungsbezogene_Kompetenzen",             u"Bereich_Berufsvorbereitung"),
+    (u"arbeitsweltbezogene_Kompetenzen",             u"Bereich_berufliche_Qualifizierung"),
+    (u"personalesoziale_Kompetenzen",                u"Bereich_Lebensbewältigung"),
+    (u"Kompetenzagentur",                            u"Kundennummer")
+]
+
+# There are a number of combo boxes in the PDFs which are
+# modelled in FormEd as a choice with an extra text field.
+
+COMBO_BOX_CONVERSION = set([
+    u"Sprache1",
+    u"Sprache2",
+    u"Sprache3",
+    u"Schulabschlusserwerbsland",
+    u"Muttersprache",
+    u"Staatsangehörigkeit",
+    u"Geburtsland"
+])
+
+# In v1.0 'Aufenthaltsstatus' is named 'Familienstand' so
+# we have to check if a given value is a valid value for
+# 'Familienstand' or 'Aufenthaltsstatus'
+
+def checkFamily(fe, name, value):
+    try:
+        widget = fe.formularname2widgets[u'Familienstand'][0]
+        convertFromDescription(widget, value)
+        # if this works we have a valid Familienstand value
+        return u'Familienstand'
+    except (KeyError, IndexError, SematicError), err:
+        pass
+
+    try:
+        widget = fe.formularname2widgets[u'Aufenthaltsstatus'][0]
+        convertFromDescription(widget, value)
+        # if this works we have a valid Aufenthaltsstatus value
+        return u'Aufenthaltsstatus'
+    except (KeyError, IndexError, SematicError), err:
+        pass
+
+    return name
+
+# to be prepared to have other cases like this
+# we map it over a dictionary.
+PRE_INSPECT = {
+    'Familienstand': checkFamily
+}
+
+# TODO: fetch from config file
+
+def asXFA(buf, host=None, port=None):
+
+    if host is None: host = HOST
+    if port is None: port = PORT
+
+    s = None, None
+    out = []
+    l = len(buf)
+    try:
+        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        s.connect((host, port))
+
+        s.sendall("%d " % l)
+        s.sendall(buf)
+
+        while True:
+            block = s.recv(4096)
+            if not block: break
+            out.append(block)
+    finally:
+        if s:
+            try: s.close()
+            except: pass
+
+    return parseString("".join(out))
+
+def allWidgets(formedTree):
+    """extracts all widgets from a FormEd tree in form 
+       of dictionary:
+       formular name -> list of widgets
+    """
+
+    widgets = {}
+
+    def visitor(nc):
+        if isinstance(nc, Node):
+            if isinstance(nc, (data.RadioNode, data.ChoiceNode)):
+                widgets.setdefault(nc.getFormularName(), []).append(nc)
+                return VISIT_IGNORE_CHILDREN
+        elif isinstance(nc, Leaf) and not isinstance(nc, 
+            (data.RuleLeaf, data.ExternalChoiceListLeaf, data.InfoLeaf)):
+            widgets.setdefault(nc.getFormularName(), []).append(nc)
+        
+        return VISIT_CONTINUE
+
+    formedTree.root.visit(visitor)
+
+    for k, v in REMAP_TO_OTHER:
+        try:
+            widgets.setdefault(k, []).extend(widgets[v])
+        except KeyError:
+            pass
+
+    return widgets
+
+def xfaContext(element):
+    return element.parentNode.nodeName
+
+def findRelationName(widget):
+    parent = widget.parent
+
+    while parent:
+        if isinstance(parent, data.PageNode) or \
+           isinstance(parent, data.GroupNode) and parent.isRepeat():
+           return parent.getName()
+        parent = parent.getParent()
+
+    return None
+
+def widgetContext(widget):
+    parent = widget.getParent()
+    while parent:
+        fname = parent.getFormularName()
+        if fname: return fname
+        parent = parent.parent
+    return None
+
+def _out(x):
+    if type(x) == type(u""): return x
+    if type(x) == type(""):  return unicode(x, "latin1")
+    return str(x)
+
+class Relation:
+
+    def __init__(self, name, separate = False):
+        self.name     = name
+        self.columns  = []
+        self.separate = separate
+
+    def add(self, widget, value):
+        for w, v in self.columns:
+            if w.getName() == widget.getName():
+                return
+        self.columns.append([widget, value])
+
+    def getColumn(self, name):
+        for w, v in self.columns:
+            if w.getName() == name:
+                return v
+        raise KeyError("No such column")
+
+    def dump(self):
+        out = [u"Relation: %s" % self.name]
+        for column in self.columns:
+            try:
+                out.append(u"  '%s': '%s'" % (column[0].getName(), _out(column[1])))
+            except UnicodeEncodeError:
+                out.append(u"   Kodierungsfehler fuer '%s'" % repr(column[1]))
+        return u"\n".join(out)
+
+    def isEmpty(self):
+        return len(self.columns) == 0
+
+    def sqlUpdate(self, con, id):
+
+        if not self.columns:
+            print >> sys.stderr, "No columns in relation '%s'" % self.name
+            return
+
+        sets = u", ".join([u"%s=%%(%s)s" % (c[0].getName(), c[0].getName()) for c in self.columns])
+        stmnt = u"UPDATE %s_view SET %s where id = %%(id)s" % (self.name, sets)
+        fields = dict([(c[0].getName(), c[1]) for c in self.columns])
+        fields['id'] = int(id)
+
+        #print >> sys.stderr, "%s" % str(stmnt)
+
+        cur = None
+        try:
+            cur = con.cursor()
+            cur.execute(stmnt, fields)
+            con.commit()
+        finally:
+            if cur:
+                try: cur.close()
+                except: pass
+
+    def typeConvert(self, fe):
+        to_remove = []
+        new_columns = []
+        for column in self.columns:
+            try:
+                column[1] = convertFromDescription(column[0], column[1])
+            except SematicError, err:
+                # check if we have to handle the combo box case
+                name = column[0].getFormularName()
+                if name in COMBO_BOX_CONVERSION:
+                    sonstige_nennung = "%s_sonstige_nennung" % name
+                    try:
+                        widget = fe.formularname2widgets[sonstige_nennung][0]
+                    except:
+                        fe.addMessage("Kann Textfeld von Combobox '%s' nicht finden" % name)
+                        to_remove.insert(0, column)
+                        continue
+
+                    new_column = [widget, column[1]]
+                    try:
+                        new_column[1] = convertFromDescription(new_column[0], new_column[1])
+                    except SematicError, err:
+                        fe.addMessage("Combobox Text fuer '%s' fehlerhaft");
+                        to_remove.insert(0, column)
+                        continue
+                    # XXX: 'Sonstiges' is -2 by convention. It may be better solution
+                    # to run through the descriptions to figure out the real value.
+                    column[1] = -2
+                    new_columns.append(new_column)
+                else:
+                    to_remove.insert(0, column)
+        for d in to_remove:
+            self.columns.remove(d)
+
+        self.columns.extend(new_columns)
+
+    def __repr__(self):
+        return "Relation: " + str(self.name)
+
+def pagesToTbl():
+    p2t = {}
+    for t, pages in TBL_TO_PAGES.iteritems():
+        for p in pages:
+            p2t[p] = t
+    return p2t
+
+PAGES_TO_TBL = pagesToTbl()
+
+class PDFImportException(Exception):
+
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return repr(self.value)
+
+
+class ContextAction:
+    def __init__(self, name):
+        self.name = name
+
+    def enter(self, xfa_traverser, element):
+        pass
+
+    def consume(self, xfa_traverser, element, value):
+        pass
+
+    def exit(self, xfa_traverser, element):
+        pass
+
+class StandardContext(ContextAction):
+    def __init__(self, name):
+        ContextAction.__init__(self, name)
+
+    def consume(self, xfa_traverser, element, value):
+        # redirect to XFAExtractor
+        xfa_traverser.fieldExtractor.consume(element, value)
+
+class Unterstuetzungsangebot(ContextAction):
+    def __init__(self, name, relation, context):
+        ContextAction.__init__(self, name)
+        self.relation = relation
+        self.context  = context
+
+    def enter(self, xfa_traverser, element):
+        pass
+        #xfa_traverser.fieldExtractor.addMessage(u"enter %s" % self.name)
+
+    def consume(self, xfa_traverser, element, value):
+        # redirect to XFAExtractor and use our special relation
+        xfa_traverser.fieldExtractor.consume(
+            element, value, self.context, self.relation)
+
+    def exit(self, xfa_traverser, element):
+        pass
+        #xfa_traverser.fieldExtractor.addMessage(u"exit %s" % self.name)
+
+# XXX: This is a workaround due to the fact that 'Sozioökonomische_Lage'
+# is modeled in 1.x (x > 0) different than 1.0.
+SOZIO_OEKO = {
+    u"versicherungspflichtig": 2,
+    u"geringfuegig":           2,
+    u"selbststaendig":         2,
+    u"Arbeitslosengeld1":      3,
+    u"Arbeitslosengeld2":      3,
+    u"Eltern":                 4,
+    u"Unterhaltszahlungen":    3,
+    u"Erziehungsgeld":         3,
+    u"Krankengeld":            3,
+    u"Unterstützung_Partner":  4,
+    u"Elterngeld":             3
+}
+
+SOZIO_TARGET = [
+    u"Familie_selbstständig",
+    u"Familie_staatliche_Unterstützung",
+    u"Jugendlicher_selbstständig",
+    u"Jugendlicher_staatliche_Unterstützung",
+    u"Jugendlicher_Unterstützung_soziales_Umfeld" ]
+
+class SozioOekonomischLage(ContextAction):
+    def __init__(self, name):
+        ContextAction.__init__(self, name)
+        self.mapping = [None] * len(SOZIO_OEKO)
+
+    def enter(self, xfa_traverser, element):
+        pass
+        #xfa_traverser.fieldExtractor.addMessage(u"enter %s" % self.name)
+
+    def consume(self, xfa_traverser, element, value):
+        fe = xfa_traverser.fieldExtractor
+
+        idx = SOZIO_OEKO.get(element.nodeName)
+        if not idx is None:
+            value = value.lower()
+            if value == "ja" or value == "1":
+                self.mapping[idx] = True
+            elif value == "nein" or value == "0" and self.mapping[idx] is None:
+                self.mapping[idx] = False
+        else:
+            fe.consume(element, value)
+
+    def exit(self, xfa_traverser, element):
+        fe = xfa_traverser.fieldExtractor
+        for idx, flag in enumerate(self.mapping):
+            if not flag is None:
+                flag = flag and "1" or "0"
+                try:
+                    match = fe.formularname2widgets[SOZIO_TARGET[idx]][0]
+                    fe.addToRelation(match, flag)
+                except (IndexError, KeyError):
+                    fe.addMessage(u"Kann Feld '%s' nicht finden" % SOZIO_TARGET[idx])
+        #fe.addMessage(u"exit %s" % self.name)
+
+# XXX: This is a workaround due to the fact that we
+# modeled 'Sorgeberechtigte' as a Choice in FormEd
+# not as list of individual boolean fields.
+SORGEBERECHTIGTE = set([
+    u"Mutter_Vater",
+    u"Mutter",
+    u"Vater",
+    u"Amtsvormund",
+    u"andere_Verwandte",
+    u"Pflegefamilie"])
+
+class FamiliaereSituation(ContextAction):
+    def __init__(self, name):
+        ContextAction.__init__(self, name)
+        self.sorgeberechtigte = None
+
+    def enter(self, xfa_traverser, element):
+        pass
+        #xfa_traverser.fieldExtractor.addMessage(u"enter %s" % self.name)
+
+    def consume(self, xfa_traverser, element, value):
+        fe = xfa_traverser.fieldExtractor
+        if element.nodeName in SORGEBERECHTIGTE:
+            value = value.lower()
+            if value == "ja" or value == "1":
+                if not self.sorgeberechtigte is None:
+                    fe.addMessage(u"  Mehrfache Nennung von Sorgeberechtigten!")
+                else:
+                    self.sorgeberechtigte = element.nodeName
+        else:
+            fe.consume(element, value)
+
+    def exit(self, xfa_traverser, element):
+        fe = xfa_traverser.fieldExtractor
+        if not self.sorgeberechtigte is None:
+            try:
+                match = fe.formularname2widgets[u"Familiäre_Situation"][0]
+                #fe.addMessage("  Sorgeberechtigte: %s" % self.sorgeberechtigte)
+                fe.addToRelation(match, self.sorgeberechtigte)
+            except (IndexError, KeyError):
+                fe.addMessage(u"Kann Feld 'Familiäre_Situation' nicht finden")
+        #fe.addMessage(u"exit %s" % self.name)
+
+# XXX: This is a workaround due to the fact that we
+# modeled 'Beratungsbedarf' as a Choice in FormEd
+# with on attached text field and not as a radiogroup
+# with text fields for every radio item.
+WELCHE_MASSNAHME = { 
+    u"welche_Maßnahme":   u"selbständig",
+    u"welche_Ausbildung": u"Ausbildung",
+    u"welche_Arbeit":     u"Arbeit" }
+
+class Beratungsbedarf(ContextAction):
+    def __init__(self, name):
+        ContextAction.__init__(self, name)
+        self.text   = None
+        self.choice = None
+
+    def enter(self, xfa_traverser, element):
+        pass
+        #xfa_traverser.fieldExtractor.addMessage(u"enter %s" % self.name)
+
+    def consume(self, xfa_traverser, element, value):
+        fe = xfa_traverser.fieldExtractor
+        #fe.addMessage(u"'%s' -> '%s'" % (element.nodeName, value))
+
+        alternative = WELCHE_MASSNAHME.get(element.nodeName)
+        if not alternative is None:
+            if not self.text is None:
+                fe.addMessage(u"Mehrfache Nennung einer Beratungsbedarfsmaßnahme")
+            else:
+                #fe.addMessage("  setze Alternative '%s'" % alternative)
+                self.text   = value
+                self.choice = alternative
+        else:
+            fe.consume(element, value)
+
+    def exit(self, xfa_traverser, element):
+        fe = xfa_traverser.fieldExtractor
+        if not self.text is None:
+            try:
+                match = fe.formularname2widgets[u"welche_vermittlung_nennung"][0]
+                fe.addToRelation(match, self.text)
+            except (IndexError, KeyError):
+                fe.addMessage(u"Kann Feld 'welche_vermittlung_nennung' nicht finden")
+
+            try:
+                match = fe.formularname2widgets[u"Begleitung"][0]
+                fe.addToRelation(match, self.choice)
+            except (IndexError, KeyError):
+                fe.addMessage(u"Kann Feld 'Begleitung' nicht finden")
+        #fe.addMessage(u"exit %s" % self.name)
+
+
+class XFATraverser:
+
+    def __init__(self, fieldExtractor):
+        self.fieldExtractor = fieldExtractor
+        self.contextActions = {}
+        self.stack          = None
+
+    def addContextAction(self, contextAction):
+        self.contextActions[contextAction.name] = contextAction
+
+    def __recursiveTraverse(self, element):
+
+        # look if have special treatment for this context
+        contextAction = self.contextActions.get(element.nodeName)
+
+        if contextAction:
+            self.stack.append(contextAction)
+            contextAction.enter(self, element)
+
+        text = []
+        for child in element.childNodes:
+            if child.nodeType == child.TEXT_NODE:
+                text.append(child.data)
+            else:
+                self.__recursiveTraverse(child)
+
+        # found an item -> feed to topmost context
+        if len(text) and len(text) == len(element.childNodes):
+            text = u"".join(text).strip()
+            if text: self.stack[-1].consume(self, element, text)
+
+        if contextAction:
+            contextAction.exit(self, element)
+            self.stack.pop()
+
+    def traverse(self, xfaTree, stdContext):
+        base = None
+        for r in ['Formular1', 'Case_Management']:
+            x = xfaTree.getElementsByTagName(r)
+            if x:
+                base = x[0]
+                break
+
+        if not base:
+            raise PDFImportException("Keine Formulardaten gefunden")
+
+        self.stack = [ stdContext ]
+        stdContext.enter(self, None)
+        self.__recursiveTraverse(base)
+        self.stack.pop().exit(self, None)
+
+class FieldExtractor:
+
+    def __init__(self, formedTree):
+        self.formularname2widgets = allWidgets(formedTree)
+        self.messages   = []
+        self.relations  = {}
+        self.missingFields = []
+        self.extraRelations = []
+
+    def preInspect(self, name, value):
+        checker = PRE_INSPECT.get(name)
+        if checker is None:
+            return name
+
+        return checker(self, name, value)
+
+    def consume(self, xfa_element, value, context=None, relation=None):
+
+        try:   
+            widgets = self.formularname2widgets[
+                self.preInspect(xfa_element.nodeName, value)]
+        except KeyError:
+            self.addMissingField(xfa_element, value)
+            return
+
+        if len(widgets) == 1: # unique -> no need to check contexts
+            match = widgets[0]
+        else:
+            # Need XFA context to figure out which one is really meant.
+            if context: # if forced use this one
+                pdfContext = context
+            else:
+                pdfContext = xfaContext(xfa_element)
+
+            if pdfContext is None:
+                self.addMessage(
+                    u"Kann PDF-Kontext für '%s' nicht finden. Wert: '%s'" % (xfa_element.nodeName, value))
+                return
+
+            match = None
+            for widget in widgets:
+                formedContext = widgetContext(widget)
+                if formedContext == pdfContext:
+                    match = widget
+                    break
+
+        if match is None:
+            self.addMessage(
+                u"Kann Widget-Kontext für '%s' nicht finden. Wert: '%s'" % (xfa_element.nodeName, value))
+            return
+
+        if relation is None:
+            self.addToRelation(match, value)
+        else:
+            relation.add(match, value)
+
+    def addToRelation(self, widget, value):
+        relationName = findRelationName(widget)
+        if relationName is None:
+            self.addMessage(
+                u"Kann keine zu '%s' passende Relation finden." % widget.getName())
+            return
+        try:
+            relation = self.relations[relationName]
+        except KeyError:
+            relation = Relation(relationName)
+            self.relations[relationName] = relation
+
+        relation.add(widget, value)
+
+    def addMissingField(self, element, value):
+        self.missingFields.append((element, value))
+
+    def missingFieldsAsString(self):
+        out = u", ".join([x[0].nodeName for x in self.missingFields])
+        return out
+
+    def requiredTables(self):
+        """ returns a list of 
+            (table entry to create, 
+             list of relations to be stored under this id,
+             True/False to indicate if separate)
+        """
+
+        tables = []
+
+        for relation in list(self.relations.itervalues()) + self.extraRelations:
+
+            if relation.isEmpty(): # no need for empty relations
+                continue
+
+            try:
+                name = PAGES_TO_TBL[relation.name]
+            except KeyError:
+                print >> sys.stderr, "Relation '%s' has no table" % relation.name
+                continue
+
+            if relation.separate: # need a separate table entry
+
+                tables.append((name, [relation], True))
+
+            else: # try to reuse an already created table entry
+                found = None
+                for tname, l, flag in tables:
+                    if tname == name:
+                        found = l
+                        break
+
+                if found is None:
+                    l = []
+                    tables.append((name, l, False))
+
+                l.append(relation)
+
+        return tables
+
+    def sqlUpdateTables(self, dbPool, tbl2id):
+        #print >> sys.stderr, "tbl2id: " + str(tbl2id)
+        for relation in self.relations.itervalues():
+            if not relation.isEmpty():
+                try:
+                    tbl = list(PAGES_TO_TBL[relation.name])[0]
+                    id = tbl2id[tbl] 
+                except KeyError:
+                    print >> sys.stderr, "No id found for relation '%s'" % relation.name
+                    continue
+                relation.sqlUpdate(dbPool, id)
+
+    def addMessage(self, msg):
+        self.messages.append(msg)
+
+    def allMessages(self):
+        return "\n".join(self.messages)
+
+    def typeConvert(self):
+
+        for relation in self.extraRelations:
+            relation.typeConvert(self)
+
+        for relation in self.relations.itervalues():
+            relation.typeConvert(self)
+
+    def dump(self):
+        out = []
+        for relation in self.extraRelations:
+            if not relation.isEmpty():
+                out.append(relation.dump())
+                out.append("")
+
+        for relation in self.relations.itervalues():
+            if not relation.isEmpty():
+                out.append(relation.dump())
+                out.append("")
+        self.addMessage("\n".join(out))
+
+    def extractFields(self, xfaTree):
+
+        xfaTraverser = XFATraverser(self)
+
+        for relation, pattern, page in UNTERSTUETZUNGS_ANGEBOTE:
+            for i in range(1, 4):
+                context = pattern % i
+                # create a separate relation
+                rel = Relation(page, True)
+                self.extraRelations.append(rel)
+                angebot = Unterstuetzungsangebot(context, rel, relation)
+                xfaTraverser.addContextAction(angebot)
+
+        familiaereSituation = FamiliaereSituation(u"Familiäre_Situation")
+        beratungsbedarf     = Beratungsbedarf(u"Beratungsbedarf")
+        sozioOeko           = SozioOekonomischLage(u"Sozioökonomische_Lage")
+
+        xfaTraverser.addContextAction(familiaereSituation)
+        xfaTraverser.addContextAction(beratungsbedarf)
+        xfaTraverser.addContextAction(sozioOeko)
+
+        stdContext = StandardContext("")
+        xfaTraverser.traverse(xfaTree, stdContext)
+
+        self.addMessage("\nKonversionsfehler:");
+        self.typeConvert()
+        self.addMessage("\nAnzahl Felder, die nicht im FormEd-Baum gefunden wurden: %d" % len(self.missingFields))
+        self.addMessage("    %s\n" % ",\n    ".join([x[0].nodeName for x in self.missingFields]))
+
+        #self.dump()
+        if self.missingFields:
+            print >> sys.stderr, u"Missing fields: %s" % self.missingFieldsAsString()
+
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Added: trunk/waskaweb/lib/renderer.py
===================================================================
--- trunk/waskaweb/lib/renderer.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/renderer.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,697 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from waskaweb.model.nodecomponents import Node
+import waskaweb.lib.helpers as h
+
+import waskaweb.model.data as data
+
+from cgi import escape
+
+import re
+from datetime import date 
+
+TARGET=re.compile(r"(\w+)(?:|:(.+))$")
+
+HELP = \
+'''<span class="help"> <a href="%s" target="_blank">
+<img src="/images/icons/form_help.png" border="0"
+alt="Hilfesymbol"></a></span>'''
+
+WEIGHTS = (25, 50, 75)
+
+SET_MODIFICATION = ' onchange="setModification();" '
+
+class FormData:
+   
+    def __init__(self, help=None):
+        self.help = help 
+
+    def getData(self, dataID):
+        return ""
+
+    def getPrintableData(self, dataID):
+        return self.getData(dataID) 
+
+    def getHelp(self, dataID):
+        if not self.help or not self.help.hasHelp(dataID):
+            return ''
+        return HELP % h.url_for('formhelp', help_id=escape(dataID))
+
+    def getError(self, dataID):
+        return ""
+
+def digits(n):
+    d, c = 10, 1
+    while n >= d: d *= 10; c += 1
+    return c
+
+def visibleDepth(c):
+    depth = -1
+    while c:
+        if not(isinstance(c, data.GroupNode) and not c.isInvisible()):
+            depth += 1
+        c = c.parent
+    return depth
+
+def pretty(x):
+    if isinstance(x, date):
+        return "%02d.%02d.%04d" % (x.day, x.month, x.year)
+    if isinstance(x, (type(""), type(u""))):
+        return u"%s" % x
+        #return unicode(str(x), 'utf-8')
+    if isinstance(x, type(False)):
+        return x and "on" or ""
+    return str(x)
+
+class ErrorItem:
+
+    def __init__(self, page=None, bad=None, name=None):
+        self.page     = page
+        self.bad      = bad
+        self.name     = name
+        self.messages = []
+
+    def addMessage(self, msg):
+        self.messages.append(msg)
+
+    def getName(self):
+        return self.name
+
+    def getMessages(self):
+        return self.messages
+
+
+class FormDataImpl(FormData):
+
+    def __init__(self, help=None, page=None, errors=None, nc=None):
+        FormData.__init__(self, help)
+        self.page   = page
+        self.errors = errors
+        if nc:
+            self.nc     = nc #NodeComponent List []
+            self.widgets = self.nc[0].allWidgets()
+        else: 
+            self.nc = []
+            self.widgets = {} 
+
+    def getData(self, dataID):
+        if not self.errors is None:
+            try:
+                ei = self.errors[dataID]
+                if not ei.bad is None:
+                    return u"%s" % pretty(ei.bad)
+            except KeyError:
+                pass
+        if not self.page is None:
+            value = self.page.getData(dataID)
+            if value is not None: value = pretty(value)
+            else:     value = ""
+            return value
+        return ""
+
+    def getPrintableData(self, dataID):
+        value = self.getData(dataID)
+        try:
+            widget = self.widgets[dataID]
+        except KeyError:
+            return value 
+
+        if not isinstance(widget, ChoiceNode):
+            return value
+
+        for c in widget.children:
+            if isinstance(c, BoolLeaf):
+                v = c.getValue()
+                if v == value:
+                    return c.getDescription()
+            elif isinstance(c, ExternalChoiceListLeaf):
+                cc = c.getChildren()
+                if cc:
+                    for i in cc:
+                        if isinstance(i, BoolLeaf):
+                            v = c.getValue()
+                            if v == value:
+                                return c.getDescription()
+
+        return value 
+
+    def getError(self, dataID):
+        if self.errors:
+            try:
+                ei = self.errors[dataID]
+                return u"<br>\n".join([u"%s" % s for s in ei.messages])
+            except KeyError:
+                pass
+        return ""
+
+
+class Text:
+    def __init__(self, txt):
+        self.txt = txt
+
+    def render(self, target, weight):
+        return self.txt
+
+class Div(Text):
+    def __init__(self, txt):
+        Text.__init__(self, txt)
+
+    def render(self, target, weight):
+        return '<div class="waska_form_element w100">%s</div>\n' % self.txt
+
+class Item(Text):
+    def __init__(self, txt):
+        Text.__init__(self, txt)
+
+    def render(self, target, weight):
+        weight = int(100.0*weight+0.5)
+        weight = weight in WEIGHTS and " w%d" % weight or " w100"
+        return '<div class="waska_form_element %s">\n%s</div>\n' % (
+            weight, self.txt)
+
+class Container:
+    def __init__(self, target):
+        self.target  = target
+        self.items   = []
+
+    def append(self, item, weight=1.0):
+        self.items.append((item, weight))
+
+    def render(self):
+        if self.items:
+            out = []
+            f = 1.0/reduce(lambda x, y: x + y[1], self.items, 0)
+            ws = [f*w[1] for w in self.items]
+            target = self.target
+            out = [item[0].render(target, w) for item, w in zip(self.items, ws)]
+            out.append('<br>')
+            return "".join(out)
+        return ""
+
+class ViewRenderer:
+
+    def __init__(self, formdata=FormData(), ro_mode=True):
+        self.formdata        = formdata
+        self.stateStack      = None
+        self.containersStack = None
+        self.ro_mode         = ro_mode
+        self.items           = formdata.nc
+
+
+    def renderView(self, name="", case_id="", action="", showNext=True):
+
+        if not self.items:
+            return "No items given!"
+       
+        out = []
+        if not self.ro_mode:
+            out.append('<form id="waska_form" action="')
+            if action: out.append(escape(action, True))
+            out.append('" accept-charset="UTF-8" method="POST">\n')
+
+        self.stateStack = []
+        self.containersStack = [[Container(None) ]]
+        for item in self.items:
+            self._renderChild(item)
+
+        out.append(self.containersStack[-1][0].render())
+
+        if not self.ro_mode:
+            if action:
+                if name:
+                    out.append('<input type="hidden" name="page" value="%s">\n' \
+                        % escape(name, True))
+                if case_id:
+                    out.append('<input type="hidden" name="ds" value="%s">\n' \
+                        % escape(case_id, True))
+                out.append('<input type="submit" name="__formular_save" value="Speichern">\n')
+                if showNext:
+                    out.append('<input type="submit" name="__formular_next" value="Speichern und weiter">\n')
+            out.append('</form>\n')
+
+        return "".join(out)
+
+    def toTarget(self, item, target):
+        weight = 1.0
+        if target:
+            m = TARGET.match(target)
+            if m:
+                target = m.group(1)
+                try:
+                   weight = float(m.group(2))
+                except (TypeError, ValueError):
+                   pass
+
+        containersStack = self.containersStack
+        for container in containersStack[-1]:
+            if not container.target or container.target == target:
+                container.append(item, weight)
+                return
+
+    def _renderGroup(self, node):
+        description = node.getDescription()
+        name        = node.getName()
+
+        help        = self.formdata.getHelp(name)
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+
+        out = []
+        
+        error = self.formdata.getData(name)
+        if node.isInvisible():
+            if description:
+                out.append("<!-- %s -->\n" % escape(description))
+            if error:
+                out.append('<!--<p class="errormsg">%s</p>-->' % escape(error))
+
+            out.append(self._renderRecursive(node))
+        else:
+            out.append("<fieldset>\n")
+            if description:
+                out.append(
+                    "<legend>%s %s</legend>\n" % (escape(description), help))
+            if error:
+                out.append('<!--<p class="errormsg">%s</p>-->\n' % error)
+            out.append(self._renderRecursive(node))
+            out.append("</fieldset>\n")
+
+        self.toTarget(Item("".join(out)), node.getTarget())
+
+    def _renderInfo(self, info):
+        if info.isInvisible(): return
+        text, depth = info.getValue(), visibleDepth(info)
+        if text:
+            text = "<h%s>%s</h%s>\n" % (depth, escape(text), depth)
+            self.toTarget(Div(text), info.getTarget())
+
+    def _renderRadio(self, radio):
+        description = radio.getDescription()
+        name        = radio.getName()
+
+        help        = self.formdata.getHelp(name)
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+
+        label = self._renderLabel(description, name, help=help,)
+
+        out = [ label ]
+
+        self.stateStack.append(data)
+        out.append(self._renderRecursive(radio))
+        self.stateStack.pop()
+
+        self.toTarget(Text("".join(out)), radio.getTarget());
+
+    def _renderChoice(self, choice):
+        description = choice.getDescription()
+        name        = choice.getName()
+        size        = choice.getSize()
+        multiple    = choice.getMultiple()
+
+        help        = self.formdata.getHelp(name)
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+        css_class   = []
+
+        label = self._renderLabel(description, name, help=help)
+
+        if name:
+            name = escape(name, True)
+            name = 'name="%s" id="%s"' % (name, name)
+        else:
+            name = ""
+
+        if self.ro_mode: 
+            disabled = 'disabled="disabled"'
+            #css_class.append('readonly')
+        else: disabled = ""
+
+        multiple = multiple and "multiple" or ""
+
+        if not size: size = "1"
+
+        out = [ label ]
+
+        if error:
+            css_class.append('error')
+            out.append('<a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>')
+
+        out.append(
+            '<select size="%s" class="%s" %s %s %s %s>\n' % (
+                size, " ".join(css_class), disabled, multiple, name, SET_MODIFICATION))
+
+        self.stateStack.append(data)
+        out.append(self._renderRecursive(choice, False))
+        self.stateStack.pop()
+
+        out.append("</select>\n")
+
+        self.toTarget(Item("".join(out)), choice.getTarget());
+
+    def _renderChoiceBool(self, bool):
+
+        description = bool.getDescription()
+        name        = bool.getName()
+        value       = bool.getValue()
+        selected    = ""
+        
+        toSelect = self.stateStack[-1]
+        selected = toSelect ==  (value or value==0) and "selected" or ""
+
+        if (value or value==0): value = 'value="%s"' % escape(value, True)
+        else:     value = ""
+
+        if description: description = escape(description)
+        else:           description = ""
+
+        out = "<option %s %s>%s</option>\n" % (value, selected, description)
+        self.toTarget(Text(out), bool.getTarget());
+
+    def _renderRadioBool(self, bool):
+
+        name        = bool.getName()
+        pname       = bool.parent.getName()
+        description = bool.getDescription()
+        value       = bool.getValue()
+        css_class   = []
+
+        toCheck = self.stateStack[-1]
+
+        checked = toCheck == value and "checked" or ""
+        
+        label = self._renderLabel(description, name, newline=False)
+
+        if value:
+            value = 'value="%s"' % escape(value, True)
+        else:
+            value = ""
+
+        if   pname: oname = 'name="%s"' % escape(pname, True)
+        elif  name: oname = 'name="%s"' % escape(name, True)
+        else:       oname = ''
+
+        if name: id = 'id="%s"' % escape(name, True)
+        else:    id = ""
+        
+        if self.ro_mode: 
+            disabled = "disabled"
+            css_class.append(disabled)
+        else: disabled = ""
+
+        out = '<input type="radio" class="%s" %s %s %s %s %s %s>%s\n' % (
+            " ".join(css_class), disabled, oname, id, value, checked, label, SET_MODIFICATION)
+
+        self.toTarget(Item(out), bool.getTarget())
+
+    def _renderPlainBool(self, bool):
+
+        name        = bool.getName()
+        description = bool.getDescription()
+        css_class   = []
+
+        data = self.formdata.getData(name)
+        if data == "1": 
+            value = 'value="%s"' % escape(data, True)
+            checked = "checked"
+        else:
+            value, checked = "", ""
+
+        label = self._renderLabel(description, name)
+
+        if name: 
+            name = escape(name, True)
+            name = 'name="%s" id="%s"' % (name, name)
+        else:
+            name = ''
+
+        if self.ro_mode: 
+            disabled = "disabled"
+            css_class.append(disabled)
+        else: disabled = ""
+
+        out = '<input type="checkbox" class="%s" %s %s %s %s %s>%s' % (
+            " ".join(css_class), disabled, name, value, checked, SET_MODIFICATION, label)
+
+        self.toTarget(Item(out), bool.getTarget())
+
+    def _renderLabel(self, description, name, help=None, newline=True):
+
+        if help: helpmsg = help
+        else:    helpmsg = ""
+
+        if newline: newline = "<br>"
+        else:       newline = ""
+
+        if description:
+            if name:
+                return '<label for="%s"><a name="%s">%s</a> %s</label>%s\n' % ( 
+                escape(name, True), escape(name, True), escape(description), helpmsg, newline)
+            return "%s " % escape(description)
+        return ""
+
+    def _renderTextArea(self, text):
+
+        description = text.getDescription()
+        name        = text.getName()
+        rows        = text.getRows()
+        cols        = text.getCols()
+        
+        help        = self.formdata.getHelp(name)
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+        css_class   = []
+
+        if data: value = escape(data, True)
+        else:    value = ""
+
+        if rows: rows = 'rows="%s"' % escape(rows, True)
+        else:    rows = ""
+
+        if cols: cols = 'cols="%s"' % escape(cols, True)
+        else:    cols = ""
+
+        out = [ self._renderLabel(description, name, help=help) ]
+
+        if name: 
+            name = escape(name, True)
+            name = 'name="%s" id="%s"' % (name, name)
+        else:
+            name = ""
+
+        if self.ro_mode: 
+            disabled = "disabled"
+            css_class.append('readonly')
+        else: disabled = ""
+
+        if error:
+            css_class.append('error')
+            out.append('<a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>')
+
+        out.append('<textarea class="%s" %s %s %s %s %s>%s</textarea><br>\n' % (
+            " ".join(css_class), disabled, name, rows, cols, SET_MODIFICATION, value))
+
+        self.toTarget(Item("".join(out)), text.getTarget())
+
+    def _renderDate(self, date):
+
+        description = date.getDescription()
+        name        = date.getName()
+        help        = self.formdata.getHelp(name)
+
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+        css_class   = []
+
+        if data: value = 'value="%s"' % escape(data, True)
+        else:    value = ""
+        
+        out = [ self._renderLabel(description, name, help=help) ]
+
+        if name:
+            name = escape(name, True)
+            name = 'name="%s" id="%s"' % (name, name)
+        else:
+            name = ""
+
+        if self.ro_mode: 
+            disabled = "readonly"
+            css_class.append('readonly')
+        else: disabled = ""
+
+        if error:
+            css_class.append('error')
+            out.append('<a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>')
+
+        out.append( '<input type="text" size="10" maxlength="10" class="%s" %s %s %s %s><br>\n' % (
+            " ".join(css_class), disabled, name, value, SET_MODIFICATION))
+
+        self.toTarget(Item("".join(out)), date.getTarget());
+
+    def _renderText(self, text):
+
+        description = text.getDescription()
+        size        = text.getSize()
+        length      = text.getMaxLength()
+        name        = text.getName()
+        help        = self.formdata.getHelp(name)
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+        css_class   = ['field']
+
+        if data: value = 'value="%s"' % escape(data, True)
+        else:    value = ""
+
+        if size:   size = 'size="%s"' % escape(size, True)
+        else:      size = ""
+
+        if length: length = 'maxlength="%s"' % escape(length, True)
+        else:      length = ""
+
+        if self.ro_mode: 
+            css_class.append('readonly')
+            disabled = "readonly"
+        else: disabled = ""
+
+        out = [ self._renderLabel(description, name, help=help) ]
+
+        if name:
+
+            name = escape(name, True)
+            name = 'name="%s" id="%s"' % (name, name)
+        else:
+            name = ""
+
+        if error:
+            css_class.append('error')
+            out.append('<a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>')
+
+        out.append('<input type="text" class="%s" %s %s %s %s %s %s><br>\n' % (
+            " ".join(css_class), disabled, size, length, name, value, SET_MODIFICATION))
+
+        self.toTarget(Item("".join(out)), text.getTarget())
+
+    def _renderIntLeaf(self, integer):
+
+        description = integer.getDescription()
+        name        = integer.getName()
+        minV        = integer.getMinValue()
+        maxV        = integer.getMaxValue()
+        help        = self.formdata.getHelp(name)
+        data        = self.formdata.getData(name)
+        error       = self.formdata.getError(name)
+        css_class   = ['intfield']
+        
+        if data: value = 'value="%s"' % escape(data, True)
+        else:    value = ""
+
+        try:
+            minV, maxV = int(minV), int(maxV)
+            highest = max(abs(maxV), abs(minV))
+            size = digits(highest)
+            if minV < 0 or maxV < 0: size += 1
+            size = 'size="%d" maxlength="%d"' % (size, size)
+        except ValueError:
+            size = ""
+
+        out = [ self._renderLabel(description, name, help=help) ]
+
+        if name:
+            name = escape(name, True)
+            id   = 'id="%s"'   % name
+            name = 'name="%s"' % name
+        else:
+            id, name = "", ""
+
+        if self.ro_mode: 
+            disabled = "readonly"
+            css_class.append('readonly')
+        else: disabled = ""
+
+        if error:
+            css_class.append('error')
+            out.append('<a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>')
+        out.append('<input type="text" class="%s" %s %s %s %s %s><br>\n' % (
+            " ".join(css_class), disabled, size, name, value, SET_MODIFICATION))
+
+        self.toTarget(Item("".join(out)), integer.getTarget())
+
+    def _renderPage(self, page):
+        out = self._renderRecursive(page)
+        self.toTarget(Text(out), page.getTarget())
+
+    def _renderBool(self, bool):
+
+        parent = bool.parent
+
+        if isinstance(parent,  data.ChoiceNode):
+            self._renderChoiceBool(bool)
+
+        elif isinstance(parent, data.RadioNode):
+            self._renderRadioBool(bool)
+
+        else:
+            self._renderPlainBool(bool)
+
+    def _renderExternalChoiceList(self, choiceList):
+        children = choiceList.getChildren()
+        if children:
+            for child in children:
+                if isinstance(child, data.BoolLeaf):
+                    self._renderBool(child)
+
+    def _renderChild(self, child):
+
+        if isinstance(child, Node):
+            if isinstance(child, data.GroupNode):
+                self._renderGroup(child)
+            elif isinstance(child, data.ChoiceNode):
+                self._renderChoice(child)
+            elif isinstance(child, data.RadioNode):
+                self._renderRadio(child)
+            elif isinstance(child, data.PageNode):
+                self._renderPage(child)
+            else:
+                self.toTarget(Text(self._renderRecursive(child)), child.getTarget())
+
+        elif isinstance(child, data.InfoLeaf):
+            self._renderInfo(child)
+        elif isinstance(child, data.BoolLeaf):
+            self._renderBool(child)
+        elif isinstance(child, data.TextLeaf):
+            self._renderText(child)
+        elif isinstance(child, data.TextAreaLeaf):
+            self._renderTextArea(child)
+        elif isinstance(child, data.IntLeaf):
+            self._renderIntLeaf(child)
+        elif isinstance(child, data.DateLeaf):
+            self._renderDate(child)
+        elif isinstance(child, data.ExternalChoiceListLeaf):
+            self._renderExternalChoiceList(child)
+        
+    def _renderRecursive(self, node, doBreak=True):
+        containers = node.getContainers()
+
+        containers = containers and [Container(c.strip()) for c in containers.split(",")] or []
+        containers.append(Container(None))
+
+        self.containersStack.append(containers)
+
+        for child in node.children:
+            self._renderChild(child)
+
+        out = []
+        for c in self.containersStack.pop():
+            txt = c.render()
+            if txt:
+                out.append(txt)
+                #if doBreak: out.append('<br class="newline">\n')
+        return "".join(out)
+
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/lib/security.py
===================================================================
--- trunk/waskaweb/lib/security.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/security.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,83 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+# Torsten Irlaender <torsten.irlaender at intevation.de>
+#
+
+from waskaweb.lib.db_factory import *
+from pylons import request, session
+import re
+import traceback
+import sys
+
+HOST    = '192.168.11.17'
+PORT    = 5433
+DBNAME  = 'ka_%s_db'
+USER    = 'ka_%s_%s'
+
+check_re = re.compile(r"^[a-z_0-9]+$")
+ROLE_SQL = """select groname from pg_group where getOID() = ANY (grolist)"""
+
+def checkLogin(user, password):
+    
+    dbname = getDbName()
+    if not dbname: return None # Failed to fetch dbname from SSL certifacate 
+    if not check_re.match(user) or not check_re.match(dbname):
+        return None
+
+    db_pool = None
+    try:
+        try:
+            db_pool = DBPool(
+                dbname   = DBNAME % dbname,
+                host     = HOST,
+                port     = PORT,
+                user     = USER % (dbname, user),
+                password = password)
+
+            conn = db_pool.getConnection()
+            cursor = conn.cursor()
+            cursor.execute(ROLE_SQL)
+            try:
+                # Get role of the current logged in user
+                result = cursor.fetchone()[0]
+                tok = result.split('_')
+                role = "_".join(tok[-2:])
+            except:
+                print "No role found"
+                role = None
+            cursor.close()
+            try:
+                from waskaweb.model.user import UserObject 
+                userobject = UserObject(db_pool)
+                if user == 'adm':
+                    userobject.setAdmUser()
+                else:
+                    userobject.loadByName(user)
+                    userobject.role = role
+            except StandardError, err:
+                print "Error on creating user Object: %s" % err
+            db_pool.recycleConnection(conn)
+            return userobject 
+        finally:
+            if db_pool:
+                db_pool.closeConnection()
+    except: 
+        traceback.print_exc(file=sys.stderr)
+        return None 
+    return None 
+
+def getDbName():
+    dbname = None
+    try:
+        dbname = request.environ['SSL_CLIENT_S_DN_CN'].split(' ')[3].lower()
+        session['agency_name'] = dbname
+        session.save()
+        return dbname
+    except:
+        print >> sys.stderr, "Could not fetch database name from client certificate"
+    return dbname 
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/lib/template.py
===================================================================
--- trunk/waskaweb/lib/template.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/template.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,35 @@
+import pylons
+from pylons.templating import Buffet
+from pylons import config
+import waskaweb.lib.helpers as h
+
+class MyBuffet(Buffet):
+    def _update_names(self, ns):
+        return ns
+
+def_eng = config['buffet.template_engines'][0]
+buffet = MyBuffet(
+    def_eng['engine'],
+    template_root=def_eng['template_root'],
+    **def_eng['template_options']
+)
+
+for e in config['buffet.template_engines'][1:]:
+    buffet.prepare(
+        e['engine'],
+        template_root=e['template_root'],
+        alias=e['alias'],
+        **e['template_options']
+    )
+
+class State:
+    pass
+
+c = State()
+c.user = 'None'
+
+def make_template():
+    return buffet.render(
+        template_name="/login.mako",
+        namespace=dict(h=h, c=State())
+    ).replace("%", "%%").replace("FORM_ACTION", "%s")

Added: trunk/waskaweb/lib/validators.py
===================================================================
--- trunk/waskaweb/lib/validators.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/lib/validators.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,100 @@
+from pylons import session
+import re
+import formencode
+
+class BaseFormValidator(formencode.Schema):
+    def __init__(self):
+        formencode.api.set_stdtranslation(domain="FormEncode", languages=["de"])
+    allow_extra_fields = True
+    filter_extra_fields = False 
+
+class SecurePassword(formencode.validators.FancyValidator):
+
+    min = 8
+    non_letter = 2
+    letter_regex = re.compile(r'[a-zA-Z]')
+
+    messages = {
+        'too_few': u'Ihr Passwort muss mindestens %(min)i '
+                  u'Zeichen lang sein',
+        'non_letter': u'Sie m&uuml;ssen mindestens %(non_letter)i '
+                     u'nicht Buchstaben in ihrem Passwort verwenden',
+        }
+
+    def _to_python(self, value, state):
+        # _to_python gets run before validate_python.  Here we
+        # strip whitespace off the password, because leading and
+        # trailing whitespace in a password is too elite.
+        return value.strip()
+
+    def validate_python(self, value, state):
+        if len(value) < self.min:
+            raise formencode.Invalid(self.message("too_few", state, min=self.min), value, state)
+        non_letters = self.letter_regex.sub('', value)
+        if len(non_letters) < self.non_letter:
+            raise formencode.Invalid(self.message("non_letter", state, non_letter=self.non_letter), value, state)
+
+class LoginCheck(formencode.validators.FancyValidator):
+
+    psql_max = 63
+    login_max = 0
+    valid_char = re.compile(r'^[a-z_0-9]+$')
+
+    messages = {
+        'too_long': u'Der Loginname darf nicht l&auml;nger als %(max)i '
+                  u'Zeichen lang sein',
+        'invalid_char': u'Der Loginname darf nur Buchstaben, Zahlen oder Unterstriche enthalten'
+        }
+
+    def _to_python(self, value, state):
+        # _to_python gets run before validate_python.  Here we
+        # strip whitespace off the password, because leading and
+        # trailing whitespace in a password is too elite.
+        user = session['USER_AUTHORIZED'][2]
+        agency = user.getAgency()
+        prefix_str = "ka_%s_" % agency
+        prefix_length = len(prefix_str)
+        self.login_max =  self.psql_max - prefix_length
+        return value.strip()
+
+    def validate_python(self, value, state):
+        if len(value) > (self.login_max):
+            raise formencode.Invalid(self.message("too_long", state, max=self.login_max), value, state)
+        if not self.valid_char.match(value):
+            raise formencode.Invalid(self.message("invalid_char", state), value, state)
+
+class NewPasswordForm(BaseFormValidator):
+    passwd = SecurePassword()  
+    passwd2 = formencode.validators.String() 
+    chained_validators = [formencode.validators.FieldsMatch('passwd', 'passwd2')]
+
+class NewUserForm(BaseFormValidator):
+    def __init__(self, db_pool):
+        formencode.api.set_stdtranslation(domain="FormEncode", languages=["de"])
+        self.db_pool = db_pool
+
+    firstname = formencode.validators.String(not_empty=True) 
+    lastname = formencode.validators.String(not_empty=True) 
+    login = formencode.All(formencode.validators.String(not_empty=True), LoginCheck()) 
+    activated = formencode.validators.StringBoolean(if_missing=False)
+    newpass = formencode.validators.StringBoolean(if_missing=False)
+
+class EditUserForm(NewUserForm):
+    login = None
+
+class NewCaseForm(BaseFormValidator):
+    pass
+
+class EditSettingsForm(BaseFormValidator):
+    anon_transfer = formencode.validators.String(if_missing='off')
+
+class SearchCaseForm(BaseFormValidator):
+    pass
+
+class SetEditorForm(BaseFormValidator):
+    pass
+
+class SetStandinForm(BaseFormValidator):
+    filter_extra_fields = True 
+    case_id = formencode.validators.Int()
+    standin = formencode.ForEach(formencode.validators.Int())

Added: trunk/waskaweb/model/__init__.py
===================================================================

Added: trunk/waskaweb/model/agency.py
===================================================================
--- trunk/waskaweb/model/agency.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/agency.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Torsten <irlaender at intevation.de>
+#
+import psycopg2.extras
+import os
+from waskaweb.model.statement import * 
+
+import traceback
+import sys
+
+FETCH_SETTINGS_SQL = """SELECT bez, wert from ka_konfiguration_tbl_view"""
+STORE_SETTINGS_SQL = """UPDATE ka_konfiguration_tbl_view SET wert = %(wert)s WHERE bez = %(bez)s"""
+class Agency:
+    def __init__(self, db_pool):
+        self.db_pool = db_pool
+        self.conf = {}
+        self._fetchData()
+
+    def _fetchData(self):
+        conn = None
+        cur = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
+            cur.execute(FETCH_SETTINGS_SQL)
+            rows = cur.fetchall()
+            for row in rows:
+                self.conf[row['bez']] = row['wert']
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db.recycleConnection(conn)
+            except:
+                pass
+
+    def store(self, formdata):
+        conn = None
+        cur = None
+        try:
+            conn = self.db_pool.getConnection()
+            for key, value in formdata.iteritems():
+                try:
+                    cur = conn.cursor()
+                    cur.execute(STORE_SETTINGS_SQL, {'bez': key, 'wert': value})
+                    conn.commit()
+                    cur.close()
+                except:
+                    traceback.print_exc(file=sys.stderr)
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db.recycleConnection(conn)
+            except:
+                pass
+
+    def isAnonTransfer(self):
+        return self.conf.get('anon_trasfer', '') == '1'
+
+    def getFKZ(self):
+        return self.conf.get('fkz', '')
+
+    def getName(self):
+        return self.conf.get('ka_name', '')
+
+    def _loadDefaultStatement(self, filename):
+        # XXX: Dead ugly!
+        path = os.path.join(os.path.dirname(__file__), '..', '..', 'formed')
+        path_statement = os.path.join(path, filename)
+        file = open(path_statement, "r")
+        statement = file.read()
+        file.close()
+        return unicode(statement, 'utf-8') 
+        
+    def getAidPlanStatement(self):
+        form = self.conf.get('fp_formular', '')
+        if len(form) > 0: return unicode(form, 'utf-8')
+        else: return self._loadDefaultStatement('aid_plan_statement.html')
+
+    def getPrivacyStatement(self):
+        form = self.conf.get('ee_formular', '')
+        if len(form) > 0: return unicode(form, 'utf-8')
+        else: return self._loadDefaultStatement('privacy_statement.html')
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8:

Added: trunk/waskaweb/model/data.py
===================================================================
--- trunk/waskaweb/model/data.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/data.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,243 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from nodecomponents import \
+    NodeComponent, \
+    Node, \
+    Leaf, \
+    VISIT_IGNORE_CHILDREN, \
+    VISIT_CONTINUE
+
+from expr           import Expr
+
+import waskaweb.model.io.document
+
+class PageNode(Node):
+    def __init__(self):
+        Node.__init__(self)
+
+    def allWidgets(self):
+
+        widgets = []
+
+        def visitor(nc):
+            if isinstance(nc, Node):
+                if isinstance(nc, (RadioNode, ChoiceNode)):
+                    widgets.append(nc)
+                    return VISIT_IGNORE_CHILDREN
+                if isinstance(nc, GroupNode) and nc.isRepeat():
+                    return VISIT_IGNORE_CHILDREN
+            elif isinstance(nc, Leaf) and not isinstance(nc, 
+                (RuleLeaf, ExternalChoiceListLeaf, InfoLeaf)):
+                widgets.append(nc)
+            
+            return VISIT_CONTINUE
+
+        self.visit(visitor)
+
+        return widgets
+        
+class GroupNode(Node):
+    def __init__(self):
+        Node.__init__(self)
+        self.attributes["repeat"]  = ""
+        self.attributes["invisible"] = ""
+
+    def isRepeat(self):
+        return self.getAttribute("repeat") and True or False
+
+    def setRepeat(self, repeat):
+        repeat = repeat and "true" or ""
+        self.setAttribute("repeat", repeat)
+
+    def isInvisible(self):
+        return self.getAttribute("invisible") and True or False
+
+    def setInvisible(self, invisible):
+        invisible = invisible and "true" or ""
+        self.setAttribute("invisible", invisible)
+
+    def allWidgets(self):
+
+        widgets = []
+
+        def visitor(nc):
+            if isinstance(nc, Node):
+                if isinstance(nc, (RadioNode, ChoiceNode)):
+                    widgets.append(nc)
+                    return VISIT_IGNORE_CHILDREN
+                if isinstance(nc, GroupNode) and nc.isRepeat() and nc != self:
+                    return VISIT_IGNORE_CHILDREN
+            elif isinstance(nc, Leaf) and not isinstance(nc, 
+                (RuleLeaf, ExternalChoiceListLeaf, InfoLeaf)):
+                widgets.append(nc)
+            
+            return VISIT_CONTINUE
+
+        self.visit(visitor)
+
+        return widgets
+
+class RadioNode(Node):
+    def __init__(self):
+        Node.__init__(self)
+        self.attributes["selected"] = ""
+
+    def getSelected(self):
+        return self.getAttribute("selected")
+
+    def setSelected(self, selected):
+        self.setSelected("selected", selected)
+
+class BoolLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+        self.attributes["checked"] = ""
+
+    def getChecked(self):
+        return self.getAttribute("checked")
+
+    def setChecked(self, checked):
+        self.setSelected("checked", checked)
+    
+class ExternalChoiceListLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+        self.choice = None
+
+    def getChildren(self):
+        if not self.choice:
+            fname = self.getValue()
+            if fname:
+                try: # TODO: This loading code should be else where!
+                    import waskaweb.model.io.document
+                    document = waskaweb.model.io.document.openDocument(fname)
+                    self.choice = document.findByClassAndName(ChoiceNode)
+                except Exception, inst:
+                    print str(inst)
+                    pass
+        if self.choice: 
+            return self.choice.children
+        return None
+
+class InfoLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+        self.attributes["invisible"] = ""
+
+    def isInvisible(self):
+        return self.getAttribute("invisible") and True or False
+
+    def setInvisible(self, invisible):
+        invisible = invisible and "true" or ""
+        self.setAttribute("invisible", invisible)
+
+class TextAreaLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+        self.attributes["cols"] = ""
+        self.attributes["rows"] = ""
+
+    def getCols(self):
+        return self.getAttribute("cols")
+
+    def setCols(self, cols):
+        return self.setAttribute("cols", cols)
+
+    def getRows(self):
+        return self.getAttribute("rows")
+
+    def setRows(self, rows):
+        return self.setAttribute("rows", rows)
+
+class TextLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+        self.attributes["size"] = "40"
+        self.attributes["maxlength"] = "60"
+
+    def getSize(self):
+        return self.getAttribute("size")
+
+    def setSize(self, size):
+        self.setAttribute("size", size)
+
+    def getMaxLength(self):
+        return self.getAttribute("maxlength")
+
+    def setMaxLength(self, length):
+        self.setAttribute("maxlength", length)
+
+class ChoiceNode(Node):
+    def __init__(self):
+        Node.__init__(self)
+        self.attributes["size"]     = "1"
+        self.attributes["multiple"] = ""
+
+    def getSize(self):
+        return self.getAttribute("size")
+
+    def setSize(self, size):
+        self.setAttribute("size", size)
+
+    def getMultiple(self):
+        return self.getAttribute("multiple")
+
+    def setMultiple(self, multiple):
+        self.setAttribute("multiple", multiple)
+
+    def getSelected(self):
+        return self.getAttribute("selected")
+
+    def setSelected(self, selected):
+        self.setAttribute("selected", selected)
+
+class IntLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+        self.attributes["minvalue"] = ""
+        self.attributes["maxvalue"] = ""
+
+    def getMinValue(self):
+        return self.getAttribute("minvalue")
+
+    def setMinValue(self, minValue):
+        self.setAttribute("minvalue", minValue)
+
+    def getMaxValue(self):
+        return self.getAttribute("maxvalue")
+
+    def setMaxValue(self, maxValue):
+        self.setAttribute("maxvalue", maxValue)
+
+class DateLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+
+class RuleLeaf(Leaf):
+    def __init__(self):
+        Leaf.__init__(self)
+        self.attributes["expr"] = ""
+        self.expr = None
+
+    def shallowCopy(self):
+        r = Leaf.shallowCopy(self)
+        if self.expr: r.expr = self.expr.clone()
+        else:         r.expr = None
+        return r
+
+    def setAttribute(self, attrib, value, broadcast=True):
+        if attrib == "expr":
+            newExpr = Expr(value)
+            newExpr.compile()
+            self.expr = newExpr
+        Leaf.setAttribute(self, attrib, value, broadcast)
+
+    def getExpr(self):
+        return self.expr
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/document.py
===================================================================
--- trunk/waskaweb/model/document.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/document.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,242 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from mimetypes import guess_type
+import waskaweb.lib.helpers as h
+import psycopg2  as dbapi
+import cStringIO as StringIO
+
+MAX_SIZE   = 10*1024*1024
+BLOCK_SIZE = 4*1024
+
+CREATE_GLOBAL = 'SELECT * FROM create_global_dokument_ds()'
+CREATE_CASE   = 'SELECT * FROM create_fall_dokument_ds(%(id)s)'
+
+UPDATE_GLOBAL = '''
+UPDATE ka_global_dokumente_tbl_view 
+SET daten = %(bytes)s, groesse = %(size)s, name = %(name)s, mime = %(mime)s
+WHERE id = %(id)s
+'''
+
+UPDATE_CASE = '''
+UPDATE ka_fall_dokumente_tbl_view 
+SET daten = %(bytes)s, groesse = %(size)s, name = %(name)s, mime = %(mime)s
+WHERE id = %(id)s AND master_id = %(case)s
+'''
+
+LIST_GLOBAL = '''
+SELECT id, master_id, groesse, mime, name
+FROM ka_global_dokumente_tbl_view
+'''
+
+LIST_CASE = '''
+SELECT id, master_id, groesse, mime, name
+FROM ka_fall_dokumente_tbl_view
+WHERE master_id = %(master_id)s
+'''
+
+DELETE_GLOBAL = '''
+SELECT delete_global_dokument_ds(%(id)s)
+'''
+
+DELETE_CASE = '''
+SELECT delete_fall_dokument_ds(%(id)s)
+'''
+
+LOAD_GLOBAL = '''
+SELECT master_id, groesse, mime, daten, name
+FROM ka_global_dokumente_tbl_view
+WHERE id = %(id)s
+'''
+
+LOAD_CASE = '''
+SELECT master_id, groesse, mime, daten, name
+FROM ka_fall_dokumente_tbl_view
+WHERE id = %(id)s
+'''
+
+class DocumentException(Exception):
+
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return repr(self.value)
+
+def listDocuments(dbPool, case=None):
+
+    if not case is None: case = int(case)
+
+    documents = []
+
+    con, cur = None, None
+    try:
+        con = dbPool.getConnection()
+        cur = con.cursor()
+        if case is None:
+            cur.execute(LIST_GLOBAL)
+        else:
+            cur.execute(LIST_CASE, { 'master_id': case })
+
+        while True:
+            row = cur.fetchone()
+            if not row: break
+            id, case, size, mime, name = row
+            documents.append(Document(id, case, size, mime, name))
+    finally:
+        if cur:
+            try: cur.close()
+            except: pass
+        if con:
+            try: dbPool.recycleConnection(con)
+            except: pass
+
+    return documents
+
+def deleteDocument(dbPool, id, case=False):
+    id = int(id)
+    con, cur, has_commited = None, None, False
+    try:
+        con = dbPool.getConnection()
+        cur = con.cursor()
+        if case: cur.execute(DELETE_CASE,   { 'id': id })
+        else:    cur.execute(DELETE_GLOBAL, { 'id': id })
+        con.commit()
+        has_commited = True
+    finally:
+        if not has_commited and con:
+            try: con.rollback()
+            except: pass
+
+        if cur:
+            try: cur.close()
+            except: pass
+        if con:
+            try: dbPool.recycleConnection(con)
+            except: pass
+
+class Document:
+    def __init__(self, id=None, case=None, size=None, mime=None, name=None):
+        self.id   = id
+        self.case = case
+        self.size = size
+        self.mime = mime
+        self.name = name
+        self.data = None
+
+    def isCaseAttached(self):
+        return not self.case is None
+
+    def create(self, dbPool, name, src, case=None):
+
+        name = name.strip().rsplit('\\', 1)[-1].rsplit('/', 1)[-1]
+
+        if not name:
+            raise DocumentException("Kein Dokumentname vorhanden.")
+
+        self.name = name
+
+        mime = guess_type(name)
+        if mime: mime = mime[0]
+        else:    mime = "application/octet-stream"
+
+        self.mime = mime
+
+        if not case is None:
+            case = int(case)
+            self.case = case
+
+        out = StringIO.StringIO()
+        total_size = 0
+        while True:
+            b = src.read(BLOCK_SIZE)
+            l = len(b)
+            if l == 0: break
+            total_size += l
+            if total_size > MAX_SIZE:
+                raise DocumentException(
+                    u"Datei ist zu groß. Maximal %sMB sind erlaubt." % h.formatNumber(MAX_SIZE/float(1024*1024)))
+            out.write(b)
+        bytes = out.getvalue()
+        out.close(); out = None
+
+        self.size = total_size
+
+        has_commited, con, cur = False, None, None
+
+        try:
+            con = dbPool.getConnection()
+            cur = con.cursor()
+
+            if case is None: cur.execute(CREATE_GLOBAL)
+            else:            cur.execute(CREATE_CASE, { 'id': case })
+
+            row = cur.fetchone()
+            if row is None:
+                raise DocumentException("Konnte neues Dokument nicht anlegen.")
+
+            id = row[0]
+            fields = {
+                'bytes': dbapi.Binary(bytes),
+                'size':  total_size,
+                'name':  name,
+                'mime':  mime,
+                'id':    id } 
+
+            if case is None:
+                stmnt = UPDATE_GLOBAL
+            else:
+                stmnt = UPDATE_CASE
+                fields['case'] = case
+
+            cur.execute(stmnt, fields)
+
+            con.commit()
+            has_commited = True
+
+            self.id = id
+        finally:
+            if cur:
+                try: cur.close()
+                except: pass
+
+            if not has_commited and con:
+                try: con.rollback()
+                except: pass
+
+            if con:
+                try: dbPool.recycleConnection(con)
+                except: pass
+
+    def load(self, dbPool, asCase=False):
+        if self.id is None:
+            raise DocumentException(u"ID wird benötigt")
+        con, cur = None, None
+        try:
+            con = dbPool.getConnection()
+            cur = con.cursor()
+            if asCase: cur.execute(LOAD_CASE,   { 'id': self.id })
+            else:      cur.execute(LOAD_GLOBAL, { 'id': self.id })
+            row = cur.fetchone()
+            if not row:
+                raise DocumentException(
+                    u"Das angeforderte Dokument kann nicht gefunden werden.")
+            self.case = row[0]
+            self.size = row[1]
+            self.mime = row[2]
+            self.data = row[3]
+            self.name = row[4]
+        finally:
+            if cur:
+                try: cur.close()
+                except: pass
+            if con:
+                try: dbPool.recycleConnection(db)
+                except: pass
+
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Added: trunk/waskaweb/model/expr.py
===================================================================
--- trunk/waskaweb/model/expr.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/expr.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,268 @@
+#!/usr/bin/env python
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+import sys
+import re
+import codecs
+
+from datetime import date
+
+FLT_RE = re.compile(r'^([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)$')
+INT_RE = re.compile(r'^([-+]?[0-9]+)$')
+VAR_RE = re.compile(r'^\$(\w+)$')
+
+from shlex import split as lexsplit
+
+class Expr:
+
+    class EvalContext:
+
+        def __init__(self, vars):
+            self.vars  = vars
+            self.stack = []
+
+        def evaluate(self, prog):
+            for op in prog:
+                op(self)
+            if len(self.stack) > 0:
+                return self.stack.pop()
+            return None
+
+        def _ADD(self):
+            stack = self.stack
+            stack.append(stack.pop() + stack.pop())
+
+        def _MUL(self):
+            stack = self.stack
+            stack.append(stack.pop() * stack.pop())
+
+        def _MINUS(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() - b)
+
+        def _DIV(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() / b)
+
+        def _MOD(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() % b)
+
+        def _POW(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() ** b)
+
+        def _INT(self):
+            stack = self.stack
+            stack.append(int(stack.pop()))
+
+        def _FLT(self):
+            stack = self.stack
+            stack.append(float(stack.pop()))
+
+        def _STR(self):
+            stack = self.stack
+            stack.append(str(stack.pop()))
+
+        def _LEN(self):
+            stack = self.stack
+            stack.append(len(stack.pop()))
+
+        def _EQ(self):
+            stack = self.stack
+            stack.append(stack.pop() == stack.pop())
+
+        def _NE(self):
+            stack = self.stack
+            stack.append(stack.pop() != stack.pop())
+
+        def _GT(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() > b)
+
+        def _LT(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() < b)
+
+        def _GE(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() >= b)
+
+        def _LE(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() <= b)
+
+        def _AND(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() and b)
+
+        def _OR(self):
+            stack = self.stack
+            b = stack.pop()
+            stack.append(stack.pop() or b)
+
+        def _NOT(self):
+            stack = self.stack
+            stack.append(not stack.pop())
+
+        def _DATE(self):
+            stack = self.stack
+            year  = stack.pop()
+            month = stack.pop()
+            day   = stack.pop()
+            stack.append(date(year, month, day))
+
+        def _TYPE(self):
+            stack = self.stack
+            stack.append(type(stack.pop()))
+
+#        def _ASSIGN(self):
+#            stack = self.stack
+#            var   = str(stack.pop())
+#            value = stack.pop()
+#            self.vars[var] = value
+
+        def _MIN(self):
+            stack = self.stack
+            stack.append(min(stack.pop(), stack.pop()))
+
+        def _MAX(self):
+            stack = self.stack
+            stack.append(max(stack.pop(), stack.pop()))
+
+        def _ABS(self):
+            stack = self.stack
+            stack.append(abs(stack.pop()))
+
+
+        def _QUESTION(self):
+            stack = self.stack
+            q = stack.pop()
+            b = stack.pop()
+            a = stack.pop()
+            if q:
+                stack.append(a)
+            else:
+                stack.append(b)
+
+        def _DUP(self):
+            stack = self.stack
+            stack.append(self.stack[-1])
+
+        def _OUT(self):
+            stack = self.stack
+            print str(stack.pop())
+
+        _OPS = {
+            '.':     _OUT,
+            '+':     _ADD,
+            '-':     _MINUS,
+            '*':     _MUL,
+            '/':     _DIV,
+            '%':     _MOD,
+            '**':    _POW,
+            'int':   _INT,
+            'str':   _STR,
+            'len':   _LEN,
+            'min':   _MIN,
+            'max':   _MAX,
+            'abs':   _ABS,
+            'float': _FLT,
+            '==':    _EQ,
+            '!=':    _NE,
+            '>':     _GT,
+            '<':     _LT,
+            '>=':    _GE,
+            '<=':    _LE,
+            'not':   _NOT,
+            'or':    _OR,
+            'and':   _AND,
+            'type':  _TYPE,
+            'DUP':   _DUP,
+            'date':  _DATE,
+            #'=':     _ASSIGN,
+            '?':     _QUESTION,
+        }
+
+    def __init__(self, expr):
+        self.expr    = expr
+        self.prog    = None
+        self.depends = None
+
+    def clone(self):
+        return Expr(self.expr)
+
+    def getDependencies(self):
+        if self.depends is None:
+            self.compile()
+        return self.depends
+
+    def compile(self):
+        prog    = []
+        depends = set()
+
+        def _store(x):
+            return lambda ec: ec.stack.append(x)
+
+        def _storeVar(x):
+            return lambda ec: ec.stack.append(ec.vars[x])
+
+        prog_append = prog.append
+        ops         = Expr.EvalContext._OPS
+
+        # XXX: shlex does not support unicode -> ascii
+        encoder = codecs.getencoder("ascii")
+        for token in lexsplit(encoder(self.expr)[0]):
+            token = unicode(token)
+            m = VAR_RE.match(token)
+            if m:
+                var = m.group(1)
+                depends.add(var)
+                prog_append(_storeVar(var))
+                continue
+            m = INT_RE.match(token)
+            if m:
+                prog_append(_store(int(m.group(1))))
+                continue
+            m = FLT_RE.match(token)
+            if m:
+                prog_append(_store(float(m.group(1))))
+                continue
+            try:
+                prog_append(ops[token])
+            except KeyError:
+                prog_append(_store(token))
+
+        self.prog    = prog
+        self.depends = depends
+
+    def evaluate(self, vars=None):
+        if self.prog is None:
+            self.compile()
+        return Expr.EvalContext(vars).evaluate(self.prog)
+
+#def main():
+#    for arg in sys.argv[1:]:
+#        expr = Expr(arg)
+#        vars = { 'a': 3 }
+#        result = expr.evaluate(vars)
+#        print str(result)
+#
+#if __name__ == "__main__":
+#    main()
+        
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/forms.py
===================================================================
--- trunk/waskaweb/model/forms.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/forms.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,5 @@
+import formencode
+
+class PdfImportForm(formencode.Schema):
+    allow_extra_fields = True
+    filter_extra_fields = True

Added: trunk/waskaweb/model/help.py
===================================================================
--- trunk/waskaweb/model/help.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/help.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from xml.dom.minidom import parseString
+
+from xml.dom.ext     import Print
+
+from cStringIO       import StringIO
+
+class HelpProvider:
+
+    def __init__(self, xhtml):
+        helps = {}
+        dom = None
+        try:
+            dom = parseString(xhtml)
+            for div in dom.getElementsByTagName("div"):
+                id = div.getAttribute("id")
+                if not id: continue
+                out = StringIO()
+                Print(div, out, 'UTF-8')
+                helps[id] = out.getvalue()
+                out.close()
+        finally:
+            if dom: dom.unlink()
+        self.helps = helps
+
+    def hasHelp(self, id):
+        return self.helps.has_key(id)
+
+    def getHelp(self, id, default=None):
+        return self.helps.get(id, default)
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/io/__init__.py
===================================================================
--- trunk/waskaweb/model/io/__init__.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/io/__init__.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1 @@
+# do not delete me!

Added: trunk/waskaweb/model/io/document.py
===================================================================
--- trunk/waskaweb/model/io/document.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/io/document.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,127 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from xml.sax          import make_parser
+from xml.sax.saxutils import quoteattr
+from parser           import SAXBuilder
+
+import codecs
+
+from factories import DocumentFactory, SimpleCreator, NodeComponentFactory, NodeFactory
+from waskaweb.model.nodecomponents import RootNode, Document, Leaf, Node
+from waskaweb.model.data           import *
+
+DOCUMENT_TAG        = u"document"
+PAGE_TAG            = u"page"
+GROUP_TAG           = u"group"
+RADIO_TAG           = u"radio"
+BOOL_TAG            = u"bool"
+INT_TAG             = u"int"
+INFO_TAG            = u"info"
+TEXT_TAG            = u"text"
+CHOICE_TAG          = u"choice"
+EXT_CHOICE_LIST_TAG = u"external-choice"
+DATE_TAG            = u"date"
+TEXT_AREA_TAG       = u"textarea"
+RULE_TAG            = u"rule"
+
+namesToClasses = {
+    DOCUMENT_TAG:        RootNode,
+    PAGE_TAG:            PageNode,
+    GROUP_TAG:           GroupNode,
+    RADIO_TAG:           RadioNode,
+    BOOL_TAG:            BoolLeaf,
+    CHOICE_TAG:          ChoiceNode,
+    EXT_CHOICE_LIST_TAG: ExternalChoiceListLeaf,
+    INT_TAG:             IntLeaf,
+    INFO_TAG:            InfoLeaf,
+    TEXT_TAG:            TextLeaf,
+    TEXT_AREA_TAG:       TextAreaLeaf,
+    RULE_TAG:            RuleLeaf,
+    DATE_TAG:            DateLeaf}
+
+factoryCreators = {
+    DOCUMENT_TAG:        SimpleCreator(DocumentFactory,      RootNode),
+    PAGE_TAG:            SimpleCreator(NodeFactory,          PageNode),
+    GROUP_TAG:           SimpleCreator(NodeFactory,          GroupNode),
+    RADIO_TAG:           SimpleCreator(NodeFactory,          RadioNode),
+    CHOICE_TAG:          SimpleCreator(NodeFactory,          ChoiceNode),
+    EXT_CHOICE_LIST_TAG: SimpleCreator(NodeComponentFactory, ExternalChoiceListLeaf),
+    BOOL_TAG:            SimpleCreator(NodeComponentFactory, BoolLeaf),
+    INT_TAG:             SimpleCreator(NodeComponentFactory, IntLeaf),
+    INFO_TAG:            SimpleCreator(NodeComponentFactory, InfoLeaf),
+    TEXT_AREA_TAG:       SimpleCreator(NodeComponentFactory, TextAreaLeaf),
+    TEXT_TAG:            SimpleCreator(NodeComponentFactory, TextLeaf),
+    RULE_TAG:            SimpleCreator(NodeComponentFactory, RuleLeaf),
+    DATE_TAG:            SimpleCreator(NodeComponentFactory, DateLeaf)}
+
+classesToTagNames = {
+    RootNode:               DOCUMENT_TAG,
+    PageNode:               PAGE_TAG,
+    GroupNode:              GROUP_TAG,
+    RadioNode:              RADIO_TAG,
+    ChoiceNode:             CHOICE_TAG,
+    IntLeaf:                INT_TAG,
+    InfoLeaf:               INFO_TAG,
+    TextLeaf:               TEXT_TAG,
+    TextAreaLeaf:           TEXT_AREA_TAG,
+    DateLeaf:               DATE_TAG,
+    ExternalChoiceListLeaf: EXT_CHOICE_LIST_TAG,
+    RuleLeaf:               RULE_TAG,
+    BoolLeaf:               BOOL_TAG }
+
+def openDocument(path):
+    builder = SAXBuilder()
+
+    builder.setCreators(factoryCreators)
+    f = None
+    try:
+        f = file(path, "rb")
+        parser = make_parser()
+        parser.setContentHandler(builder)
+        parser.parse(f)
+        return builder.getDocument()
+    finally:
+        if f is not None:
+            try:    f.close()
+            except: pass
+
+def _attributesToXML(nc):
+    out = []
+    for key, value in nc.attributes.iteritems():
+        if value:
+            out.append(u" %s=%s" % (key, quoteattr(value)))
+    return " ".join(out)
+
+def _toXML(nc):
+    if isinstance(nc, Node):
+        tagName = classesToTagNames.get(nc.__class__, "node")
+        out = [ u"<%s%s>" % (tagName, _attributesToXML(nc)) ]
+        for child in nc.children:
+            out.append(_toXML(child))
+        out.append(u"</%s>" % tagName)
+        return "".join(out)
+    if isinstance(nc, Leaf):
+        tagName = classesToTagNames.get(nc.__class__, "leaf")
+        return u"<%s%s/>" % (tagName, _attributesToXML(nc))
+    if isinstance(nc, Document):
+        out = [ u'<?xml version="1.0" encoding="UTF-8"?>\n' ]
+        out.append(_toXML(nc.root))
+        return "".join(out)
+    return ""
+
+def saveDocument(document, path):
+    f = None
+    try:
+        f = codecs.open(path, "wb", "UTF-8")
+        print >> f, _toXML(document)
+    finally:
+        if f is not None:
+            try: f.close()
+            except: pass
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/io/factories.py
===================================================================
--- trunk/waskaweb/model/io/factories.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/io/factories.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,43 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from parser import Factory, Creator
+
+from waskaweb.model.nodecomponents import Document
+
+class SimpleCreator(Creator):
+
+    def __init__(self, factoryClass, ncClass):
+        self.factoryClass = factoryClass
+        self.ncClass      = ncClass
+
+    def createFactory(self, name, attrs, ctx):
+        return self.factoryClass(attrs, self.ncClass())
+
+class NodeComponentFactory(Factory):
+
+    def __init__(self, attrs, nc):
+        self.nc = nc
+        for key in attrs.getNames():
+            value = attrs.getValue(key)
+            self.nc.setAttribute(key, value)
+
+    def reduce(self, ctx):
+        return self.nc
+
+class NodeFactory(NodeComponentFactory):
+
+    def eat(self, element, ctx):
+        self.nc.addChild(element)
+
+class DocumentFactory(NodeFactory):
+
+    def reduce(self, ctx):
+        root = NodeFactory.reduce(self, ctx)
+        return Document(root)
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/io/parser.py
===================================================================
--- trunk/waskaweb/model/io/parser.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/io/parser.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,66 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+from xml.sax.saxutils import DefaultHandler
+
+class Creator:
+
+    def createFactory(tag, attrs, context):
+        return None
+
+class Factory:
+
+    def eat(self, element, context):
+        pass
+
+    def reduce(self, context):
+        return None
+
+class ArrayFactory(Factory):
+
+    def __init__(self):
+        self.array = []
+
+    def eat(self, element, context):
+        self.array.append(element)
+
+    def reduce(self, context):
+        return self.array
+
+class SAXBuilder(DefaultHandler):
+
+    def __init__(self, context=None):
+        self.context  = context
+        self.creators = {}
+        self.stack    = []
+        self.document = None
+
+    def getDocument(self):
+        return self.document
+
+    def addCreator(self, name, creator):
+        self.creators[name] = creator
+
+    def setCreators(self, creators):
+        self.creators = creators
+
+    def startElement(self, name, attrs):
+        creator = self.creators[name]
+        factory = creator.createFactory(name, attrs, self.context)
+        self.stack.append(factory)
+
+    def endElement(self, name):
+        factory = self.stack.pop()
+        self.stack[-1].eat(factory.reduce(self.context), self.context)
+
+    def startDocument(self):
+        self.stack = [ ArrayFactory() ]
+    
+    def endDocument(self):
+        self.document = self.stack.pop().reduce(self.context)[0]
+    
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/navigation.py
===================================================================
--- trunk/waskaweb/model/navigation.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/navigation.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,228 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+import sys
+
+STRUCTURE = """
+    0, "1. Zust&auml;ndigkeiten, Eingangsdaten"
+    1, "2. Angaben zur Person"
+    2, "3. Biographische Daten"
+    2, "3.1 Famili&auml;re Situation"
+    3, "3.2 Gesundheitliche Situation"
+    4, "3.3 Soziale Lage"
+    5, "3.4 Schule"
+    6, "3.5 Ausbildung und Arbeit"
+    7, "3.6 Weiterer Verlauf"
+    8, "4. Case-Management"
+    8, "4.1 Kompetenzfestellung"
+    8, "4.1.1 Verfahren"
+    9, "4.1.2 Ergebnisse der Kompetenzfestellung"
+    10, "4.2 F&ouml;rderplanung"
+    21, "4.2.1 Unterst&uuml;tzungsangebote im allgemein bildenden Bereich"
+    21, "page_21"
+    22, "4.2.2 Unterst&uuml;tzungsangebote im Bereich der Berufsvorbereitung"
+    22, "page_22"
+    23, "4.2.3 Unterst&uuml;tzungsangebote im Bereich der beruflichen Qualifizierung"
+    23, "page_23"
+    24, "4.2.4 Unterst&uuml;tzungsangebote im Bereich der Lebensbew&auml;ltigung"
+    24, "page_24"
+    15, "Freie Dokumentation"
+    16, "5. Abschlussbewertung"
+    16, "5.1 Angaben zum Verlauf und Beendigung des CM</a""
+    17, "5.2 Erreichte Ziele"
+    17, "5.2.1 Berufliche Integration"
+    18, "5.2.2 Soziale Integration"
+    19, "5.2.3 Einsch&auml;tzung des Case-Managers"
+    20, "Freie Dokumentation"
+"""
+
+NEXT_KEYS = {
+    "0"   : "26",
+    "26"  : "1",
+    "1"   : "3",
+    "2"   : "4",
+    "3"   : "4",
+    "4"   : "5",
+    "5"   : "6",
+    "6"   : "7",
+    "7"   : "8",
+    "8"   : "10",
+    "9"   : "12",
+    "10"  : "12",
+    "11"  : "12",
+    "12"  : "13",
+    "13"  : "14",
+    "14rg": "14",
+    "15rg": "14",
+    "16rg": "14",
+    "17rg": "14",
+    "14"  : "18",
+    "18"  : "20",
+    "19"  : "21",
+    "20"  : "21",
+    "21"  : "23",
+    "22"  : "23",
+    "23"  : "24",
+    "24"  : "25"
+}
+
+class TreeItem:
+
+    def __init__(self, key, page = "", description = "", children = None, enabled=True):
+        self.displayChildren = False
+        self.key             = key
+        self.page            = page
+        self.parent          = None 
+        self.description     = description
+        self.children        = children
+        self.enabled         = enabled 
+
+    def toggle(self):
+        self.displayChildren = not self.displayChildren
+
+    def setParent(self, treeItem):
+        self.parent = treeItem
+
+    def render(self, action, out, error=False, selected_key=None):
+        if error: err_str = '<span class="error">(!) </span>'
+        else: err_str = ""
+        if self.enabled:
+            out.append('<li class="formpage">')
+
+            hl = self.key == selected_key and 'class="formpage_highlight"' or ""
+
+            out.append('<a href="%s" %s onclick="return checkModification();">%s%s</a>' % (
+                action(self),
+                hl,
+                err_str, 
+                self.description))
+
+            if self.children and self.displayChildren:
+                out.append('<ul>')
+                for child in self.children:
+                    child.render(action, out, selected_key=selected_key)
+                out.append('</ul>')
+            out.append("</li>")
+
+    def realId(self, id):
+        return id
+
+    def nextKey(self):
+        return NEXT_KEYS.get(self.key)
+
+    def showPath(self):
+        current = self
+        while current:
+            current.displayChildren = True
+            current = current.parent
+
+class NavigationTree:
+
+    def __init__(self, factories=None):
+        self.errors = [] #List page name with faulty pages
+        if factories is None: factories = {}
+
+        def make(p):
+            def _make(*args):
+                return factories.get(p, TreeItem)(*args)
+            return _make
+
+        self.children = [
+            make("page_0")("0", "page_0", "Zust&auml;ndigkeiten, Eingangsdaten"),
+            make("page_25")("26", "page_25", "Kontaktdaten"),
+            make("page_1")("1", "page_1", "Angaben zur Person"),
+            make("page_2")("2", "page_2", "Biographische Daten", [
+                make("page_2")("3", "page_2", "Famili&auml;re Situation"),
+                make("page_3")("4", "page_3", "Gesundheitliche Situation"),
+                make("page_4")("5", "page_4", "Soziale Lage"),
+                make("page_5")("6", "page_5", "Schule"),
+                make("page_6")("7", "page_6", "Ausbildung und Arbeit"),
+                make("page_7")("8", "page_7", "Weiterer Verlauf")
+            ]),
+            make("page_8")("9", "page_8", "Case-Management", [
+                make("page_8")("10", "page_8", "Kompetenzfestellung", [
+                    make("page_8")("11", "page_8", "Verfahren"),
+                    make("page_9")("12", "page_9", "Ergebnisse der Kompetenzfestellung")
+                ]),
+                make("page_10")("13", "page_10", "F&ouml;rderplanung"),
+                make("rg_unterstuetzungsangebote")("14", "rg_unterstuetzungsangebote", "Unterst&uuml;tzungsangebote", [
+                    make("page_21")("14rg", "page_21", "Angebot im Bereich BB", None, False),
+                    make("page_22")("15rg", "page_22", "Angebot im Bereich BV", None, False),
+                    make("page_23")("16rg", "page_23", "Angebot im Bereich BQ", None, False),
+                    make("page_24")("17rg", "page_24", "Angebot im Bereich LB", None, False)
+                ]),
+                make("page_15")("18", "page_15", "Freie Dokumentation")
+            ]),
+            make("page_16")("19", "page_16", "Abschlussbewertung", [
+                make("page_16")("20", "page_16", "Angaben zum Verlauf und Beendigung des CM"),
+                make("page_17")("21", "page_17", "Erreichte Ziele", [
+                    make("page_17")("22", "page_17", "Berufliche Integration"),
+                    make("page_18")("23", "page_18", "Soziale Integration"),
+                    make("page_19")("24", "page_19", "Einsch&auml;tzung des Case-Managers")
+                ]),
+                make("page_20")("25", "page_20", "Freie Dokumentation")
+            ])
+        ]
+        self.buildParents(self.children)
+
+    def buildParents(self, children, parent=None):
+        for child in children:
+            if parent:
+                child.setParent(parent)
+            if child.children: 
+                self.buildParents(child.children, child)
+
+    def getTreeItem(self, key):
+        stack = [self.children]
+
+        while stack:
+            children = stack.pop()
+            for c in children:
+                if c.key == key:
+                    return c
+                if c.children:
+                    stack.append(c.children)
+
+        return None
+
+    def getHeaders(self, key):
+        headers = []
+        ti = self.getTreeItem(key)
+        if not ti: return headers
+        while True:
+            headers.append(ti.description)
+            if not ti.parent: break
+            ti = ti.parent
+        headers.reverse()
+        return headers
+
+    def getTreeItemByPageName(self, name):
+        stack = [self.children]
+
+        while stack:
+            children = stack.pop()
+            for c in children:
+                if c.page == name:
+                    return c
+                if c.children:
+                    stack.append(c.children)
+        return None
+
+    def render(self, action, selected_key=None):
+        out = ['<ul>']
+        for child in self.children:
+            child.render(action, out, (child.page in self.errors), selected_key)
+        out.append('</ul>')
+        return "\n".join(out)
+
+    def setErrors(self, errors):
+        self.errors = errors
+        
+
+
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/nodecomponents.py
===================================================================
--- trunk/waskaweb/model/nodecomponents.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/nodecomponents.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,261 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+VISIT_IGNORE_CHILDREN = 2
+VISIT_CONTINUE        = None
+
+class NodeComponent:
+    
+    def __init__(self):
+        self.parent     = None
+        self.attributes = {}
+        self.attributes["name"]         = ""
+        self.attributes["description"]  = ""
+        self.attributes["formularname"] = ""
+        self.attributes["modes"]        = ""
+        self.attributes["annotation"]   = ""
+        self.attributes["target"]       = ""
+        self.attributes["alternative"]  = ""
+
+    def setAttribute(self, key, value, broadcast=True):
+        self.attributes[key] = value
+                
+    def getAttribute(self, key):
+        return self.attributes.get(key, None)
+
+    def getAnnotation(self):
+        return self.getAttribute("annotation")
+
+    def setAnnotation(self, annotation):
+        return self.setAttribute("annotation", annotation)
+
+    def getAlternative(self):
+        return self.getAttribute("alternative")
+
+    def setAlternative(self, alternative):
+        return self.setAttribute("alternative", alternative)
+
+    def getTarget(self):
+        return self.getAttribute("target")
+
+    def setTarget(self, target):
+        return self.setAttribute("target", target)
+
+    def setFormularName(self, name):
+        self.setAttribute("formularname", name)
+
+    def getFormularName(self):
+        return self.getAttribute("formularname")
+    
+    def setName(self, name):
+        self.setAttribute("name", name)
+
+    def getName(self):
+        return self.getAttribute("name")
+
+    def setDescription(self, description):
+        self.setAttribute("description", description)
+
+    def getDescription(self):
+        return self.getAttribute("description")
+
+    def getModes(self):
+        return self.getAttribute("modes")
+
+    def setModes(self, modes):
+        self.setAttribute("modes", modes)
+
+    def getParent(self):
+        return self.parent
+
+    def pathToRoot(self):
+        current = self
+        path = []
+        while not current is None:
+            path.insert(0, current)
+            current = current.parent
+        return path
+
+    def depth(self):
+        d = -1
+        current = self
+        while not current is None:
+            d += 1
+            current = current.parent
+        return d
+
+    def walk(self):
+        yield self
+
+    def visit(self, visitor):
+        return visitor(self)
+
+    def shallowCopy(self):
+        nc = self.__class__()
+        nc.attributes = self.attributes.copy()
+        return nc
+
+    def clone(self):
+        return self.shallowCopy()
+
+class Node(NodeComponent):
+
+    def __init__(self):
+        NodeComponent.__init__(self)
+        self.attributes["containers"] = ""
+        self.children = []
+
+    def getContainers(self):
+        return self.getAttribute("containers")
+
+    def setContainers(self, containers):
+        self.setAttribute("containers", containers)
+
+    def addChild(self, child, idx=-1, broadcast=True):
+        if idx == -1:
+            idx = len(self.children)
+        self.children.insert(idx, child)
+        child.parent = self
+
+    def indexOfChild(self, child):
+        try:
+            return self.children.index(child)
+        except ValueError:
+            return -1
+
+    def getChildByName(self, name):
+        for child in self.children:
+            if child.getName() == name:
+                return child
+        return None
+
+    def removeChild(self, child, broadcast=True):
+        try:
+            self.children.remove(child)
+            child.parent = None
+        except ValueError:
+            return
+
+    def walk(self):
+        yield self
+        for child in self.children:
+            for x in child.walk():
+                yield x
+
+    def visit(self, visitor):
+
+        result = visitor(self)
+        if result == VISIT_IGNORE_CHILDREN:
+            return VISIT_CONTINUE
+        if result != VISIT_CONTINUE:
+            return result
+        for child in self.children:
+            result = child.visit(visitor)
+            if result == VISIT_IGNORE_CHILDREN:
+                return VISIT_CONTINUE
+            if result != VISIT_CONTINUE:
+                return result
+        return VISIT_CONTINUE
+
+    def clone(self):
+        n = NodeComponent.clone(self)
+        children = []
+        for child in self.children:
+            child = child.clone()
+            children.append(child)
+            child.parent = n
+        n.children = children
+        return n
+
+    def firstLevel(self, crit):
+        visited = set()
+        for c in self.walk():
+            if c != self and crit(c):
+                parent = c.parent
+                found = False
+                while parent:
+                    if parent in visited:
+                        found = True
+                        break
+                    parent = parent.parent
+                if not found:
+                    visited.add(c)
+                    yield c
+
+class RootNode(Node):
+    def __init__(self, document=None):
+        Node.__init__(self)
+        self.document = document
+
+class Leaf(NodeComponent):
+    def __init__(self):
+        NodeComponent.__init__(self)
+        self.attributes["value"] = ""
+
+    def getValue(self):
+        return self.getAttribute("value")
+
+    def setValue(self, value):
+        self.setAttribute("value", value)
+
+class Document:
+
+    def __init__(self, root=None):
+        if root is None: self.root = RootNode()
+        else:            self.root = root
+        self.root.document = self
+
+    def importDocument(self, ndocument):
+        root, nroot = self.root, ndocument.root
+        if not root or not nroot: return
+
+        for child in nroot.children[:]:
+            nroot.removeChild(child)
+            root.addChild(child)
+
+    def getNames(self):
+        names = set()
+        root = self.root
+        if not root: names
+        for nc in root.walk():
+            name = nc.getName()
+            if name: names.add(name)
+        return names
+
+    def getNodeComponentByName(self, name):
+        root = self.root
+        if not root: None
+        for child in root.walk():
+            if child.getName() == name:
+                return child
+        return None
+
+    def findByClassAndName(self, clazz, name=None):
+        if self.root:
+            for nc in self.root.walk():
+                if isinstance(nc, clazz) and \
+                    (not name or nc.getName() == name):
+                    return nc
+        return None
+
+    def indexOfcomponentByClassAndName(self, clazz, name=None):
+        idx = 0
+        if self.root:
+            for nc in self.root.walk():
+                if isinstance(nc, clazz):
+                    if not name or nc.getName() == name:
+                        return idx
+                    idx += 1
+        return -1
+
+    def findAllByClass(self, clazz):
+        if self.root:
+            for nc in self.root.walk():
+                if isinstance(nc, clazz):
+                    yield nc
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/semantic.py
===================================================================
--- trunk/waskaweb/model/semantic.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/semantic.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,266 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+import re
+
+#import waskaweb.model.data as data
+import waskaweb
+
+from datetime import date
+
+from sys import maxint
+
+class SematicError(Exception):
+
+    def __init__(self, value):
+        self.value = value
+
+    def __str__(self):
+        return repr(self.value)
+
+class ValueChecker:
+    def checkAndConvert(self, value, nc):
+        return None
+
+class Converter:
+    def convert(self, value, nc):
+        return None
+
+class TextChecker:
+
+    def convert(self, value, nc):
+        return self.checkAndConvert(value, nc)
+
+    def checkAndConvert(self, value, nc):
+        
+        ml = nc.getMaxLength()
+        if ml:
+            try:
+                value = value[:int(ml)]
+                try:
+                    return unicode(str(value), 'utf-8')
+                except (TypeError, UnicodeError):
+                    return value
+            except ValueError:
+                raise SematicError("Invalid max length value")
+        return value
+
+class TextAreaChecker:
+
+    def convert(self, value, nc):
+        return self.checkAndConvert(value, nc)
+
+    def checkAndConvert(self, value, nc):
+        try:
+            return unicode(str(value), 'utf-8')
+        except (TypeError, UnicodeError):
+            pass
+        return value
+
+class IntChecker(ValueChecker):
+
+    def convert(self, value, nc):
+        return self.checkAndConvert(value, nc)
+
+    def checkAndConvert(self, value, nc):
+        value = value.strip()
+        try:
+            value = int(float(value))
+        except ValueError:
+            raise SematicError("'%s' ist keine ganze Zahl." % value)
+        try:
+            minv = nc.getMinValue()
+            maxv = nc.getMaxValue()
+
+            if isinstance(minv, (type(u""), type(""))):
+                if len(minv): minv = int(minv)
+                else:         minv = -maxint-1
+            else:
+                minv = int(minv)
+
+            if isinstance(maxv, (type(""), type(u""))):
+                if len(maxv): maxv = int(maxv)
+                else:         maxv = maxint
+
+            minv, maxv = min(minv, maxv), max(minv, maxv)
+
+            if value < minv:
+                raise SematicError(
+                    "%d ist kleiner als %d." % (value, minv))
+
+            if value > maxv:
+                raise SematicError(
+                    "%d is groesser als %d." % (value, maxv))
+        except ValueError:
+            raise SematicError(
+                "Check constraints for '%s'" % nc.getName())
+        return value
+
+class DateChecker(ValueChecker):
+
+    DATE         = re.compile(r"([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{2,4})")
+    DATE_IDX     = (1, 2, 3)
+    DATE_ISO     = re.compile(r"([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})")
+    DATE_ISO_IDX = (3, 2, 1)
+
+    def convert(self, value, nc):
+        return self.checkAndConvert(value, nc)
+
+    def checkAndConvert(self, value, nc):
+        value = value.strip()
+
+        for reg, idx in ((DateChecker.DATE, DateChecker.DATE_IDX), (DateChecker.DATE_ISO, DateChecker.DATE_ISO_IDX)):
+            m = reg.match(value)
+            if not m: continue
+            day   = int(m.group(idx[0]))
+            month = int(m.group(idx[1]))
+            year  = int(m.group(idx[2]))
+
+            if year < 100:
+                if year < 70: year += 2000
+                else:         year += 1900
+
+            try: 
+                return date(year, month, day)
+            except ValueError:
+                raise SematicError("'%s' ist kein gueltiges Datum." % value)
+
+        raise SematicError("'%s' ist kein Datum." % value)
+
+class ChoiceChecker(ValueChecker):
+
+    def checkAndConvert(self, value, nc):
+
+        value = value.strip()
+        for c in nc.children:
+            if isinstance(c, waskaweb.model.data.BoolLeaf):
+                v = c.getValue()
+                if v == value: 
+                    try:
+                        return int(v)
+                    except ValueError:
+                        return v
+            elif isinstance(c, waskaweb.model.data.ExternalChoiceListLeaf):
+                cc = c.getChildren()
+                if cc:
+                    for i in cc:
+                        if isinstance(i, waskaweb.model.data.BoolLeaf):
+                            v = i.getValue()
+                            if v == value:
+                                try:
+                                    return int(v)
+                                except ValueError:
+                                    return v
+
+        raise SematicError("'%s' is not a valid value for '%s'" % (
+            value, nc.getName()))
+
+def _checkBool(nc, value):
+    for m in ("getDescription", "getAlternative"):
+        v = getattr(nc, m)()
+        if v is None: continue
+        v = v.strip().lower()
+        if v == value: 
+            try:
+                return int(nc.getValue().strip())
+            except ValueError:
+                return v
+    return None
+
+class ChoiceConverter(Converter):
+    
+    def convert(self, value, nc):
+
+        value = value.strip().lower()
+        for c in nc.children:
+            if isinstance(c, waskaweb.model.data.BoolLeaf):
+                v = _checkBool(c, value)
+                if not v is None: return v
+            elif isinstance(c, waskaweb.model.data.ExternalChoiceListLeaf):
+                cc = c.getChildren()
+                if cc:
+                    for i in cc:
+                        if isinstance(i, waskaweb.model.data.BoolLeaf):
+                            v = _checkBool(i, value)
+                            if not v is None: return v
+
+        raise SematicError("'%s' ist kein valider Wert fuer '%s'" % (
+            value, nc.getName()))
+
+class RadioChecker(ValueChecker):
+
+    def checkAndConvert(self, value, nc):
+        value = value.strip()
+        for c in nc.children:
+            if isinstance(c, waskaweb.model.data.BoolLeaf):
+                v = c.getValue()
+                if v == value: return v
+        raise SematicError("'%s' is not a valid value for '%s'" % (
+            value, nc.getName()))
+
+class RadioConverter(Converter):
+
+    def convert(self, value, nc):
+        value = value.strip()
+        for c in nc.children:
+            if isinstance(c, waskaweb.model.data.BoolLeaf):
+                v = c.getDescription().strip().lower()
+                if v == value:
+                    return c.getValue()
+        raise SematicError("'%s' is not a valid value for '%s'" % (
+            value, nc.getName()))
+
+class BoolChecker(ValueChecker):
+
+    def checkAndConvert(self, value, nc):
+        value = value.strip()
+        return len(value) and 1 or 0 
+
+class BoolConverter(Converter):
+
+    def convert(self, value, nc):
+        value = value.strip().lower()
+        if not value: return None
+        return (value == "ja" or value == '1') and 1 or 0 
+
+TYPES = {
+    waskaweb.model.data.IntLeaf :     IntChecker(),
+    waskaweb.model.data.DateLeaf:     DateChecker(),
+    waskaweb.model.data.TextLeaf:     TextChecker(),
+    waskaweb.model.data.TextAreaLeaf: TextAreaChecker(),
+    waskaweb.model.data.ChoiceNode:   ChoiceChecker(),
+    waskaweb.model.data.BoolLeaf:     BoolChecker(),
+    waskaweb.model.data.RadioNode:    RadioChecker()
+}
+
+CONVERTERS = {
+    waskaweb.model.data.IntLeaf :     IntChecker(),
+    waskaweb.model.data.DateLeaf:     DateChecker(),
+    waskaweb.model.data.TextLeaf:     TextChecker(),
+    waskaweb.model.data.TextAreaLeaf: TextAreaChecker(),
+    waskaweb.model.data.ChoiceNode:   ChoiceConverter(),
+    waskaweb.model.data.BoolLeaf:     BoolConverter(),
+    waskaweb.model.data.RadioNode:    RadioConverter()
+}
+
+def checkAndConvert(nc, value):
+    try:
+        checker = TYPES[nc.__class__]
+    except KeyError:
+        raise SematicError("no type check found for '%s'"
+            % str(nc.__class__))
+    return checker.checkAndConvert(value, nc)
+
+def convertFromDescription(nc, value):
+    try:
+        converter = CONVERTERS[nc.__class__]
+    except KeyError:
+        raise SematicError("no converter found for '%s'"
+            % str(nc.__class__))
+    return converter.convert(value, nc)
+        
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/model/statement.py
===================================================================
--- trunk/waskaweb/model/statement.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/statement.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Torsten Irländer <torsten.irlaender at intevation.de>
+#
+
+from string import Template
+
+GET_STATEMENT_FLAG_SQL = """"""
+SET_STATEMENT_FLAG_SQL = """UPDATE page_einverstaendnis_view SET einverstaendniserklaerung = %(value)s WHERE id = %(id)s"""
+class Statement:
+    def __init__(self, db_pool, id=None):
+        self.db_pool = db_pool
+        self.case_id = id
+    
+    def _substitute(self, client, agency):
+        return ''
+
+    def _fetchData(self):
+        pass
+
+    def fillout (self, client, agency, **kwargs):
+        return self._substitute(client, agency)
+
+    def decline(self):
+        pass
+
+    def sign(self):
+        pass
+
+class PrivacyStatement(Statement):
+    def __init__(self, db_pool, id=None):
+        Statement.__init__(self, db_pool, id)
+
+    def fillout(self, client, agency, **kwargs):
+        tmpl = agency.getPrivacyStatement()
+        self.template = Template(tmpl)
+        return self._substitute(client, agency)
+
+    def _substitute(self, client, agency):
+        # Substitution dictionary
+        s = {
+                'VORNAME': client.first_name,
+                'NACHNAME': client.last_name,
+                'PLZ': client.plz,
+                'STRASSE': client.address,
+                'ORT': client.city,
+                'KA_NAME': agency.getName() 
+            }
+        result = self.template.safe_substitute(s)
+        return result 
+
+    def sign(self):
+        conn = None
+        cur = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            cur.execute(SET_STATEMENT_FLAG_SQL, {'id': self.case_id, 'value': 1})
+            conn.commit()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db.recycleConnection(conn)
+            except:
+                pass
+
+    def decline(self):
+            conn = None
+            cur = None
+            try:
+                conn = self.db_pool.getConnection()
+                cur = conn.cursor()
+                cur.execute(SET_STATEMENT_FLAG_SQL, {'id': self.case_id, 'value': 0})
+                conn.commit()
+            finally:
+                try:
+                    if cur:
+                        cur.close()
+                    if conn:
+                        self.db.recycleConnection(conn)
+                except:
+                    pass
+
+class AidPlanStatement(Statement):
+    def __init__(self, db_pool, id=None):
+        Statement.__init__(self, db_pool, id)
+
+    def fillout(self, client, agency, **kwargs):
+        list = self._buildAidList(kwargs.get('rg_list', []))
+        tmpl = agency.getAidPlanStatement()
+        self.template = Template(tmpl)
+        return self._substitute(client, agency, list)
+
+    def _buildAidList(self, rg_list):
+        out = []
+        out.append(u'<table width="100%">\n<tr>')
+        out.append(u'<th width="100">Von</th>')
+        out.append(u'<th width="100">Bis</th>')
+        out.append(u'<th>Institution</th>')
+        out.append(u'<th>Angebotsform</th>')
+        out.append(u"</tr>")
+        if len(rg_list) <= 0:
+            out.append(u'<tr><td colspan="4">Keine Angebote gefunden</td></tr>')
+        else:
+            for rg in rg_list:
+                out.append(u"<tr>")
+                out.append(u"<td>%s</td>" % rg.start_date)
+                out.append(u"<td>%s</td>" % rg.end_date)
+                out.append(u"<td>%s</td>" % rg.institution)
+                out.append(u"<td>%s</td>" % rg.type)
+                out.append(u"</tr>")
+        out.append(u"</table>")
+        out.append(u"""<div class="legend">
+        Legende: <strong>(BB)</strong>: Allgemein bildenden Bereich <strong>(BV)</strong>: Bereich der Berufsvorbereitung <strong>(BQ)</strong>: Berufliche Qualifizierung <strong>(LB)</strong>: Lebensbewältigung</div>""")
+        return u"\n".join(out)
+
+    def _substitute(self, client, agency, list):
+        # Substitution dictionary
+        s = {
+                'VORNAME': client.first_name,
+                'NACHNAME': client.last_name,
+                'ANGEBOTE': list 
+            }
+        result = self.template.safe_substitute(s)
+        return result 
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8:

Added: trunk/waskaweb/model/user.py
===================================================================
--- trunk/waskaweb/model/user.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/user.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,366 @@
+import waskaweb.lib.helpers as h
+from waskaweb.lib.security import getDbName 
+from waskaweb.lib.db_factory import DBPool
+from pylons import config, session
+import sys
+FETCH_USER_LIST_SQL = """SELECT id from ka_benutzer_tbl_view order by nachname""" 
+FETCH_USER_DATA_SQL = """SELECT id, vorname, nachname, telefon, aktiviert, passwort_aendern, login, raumnummer, filiale, usesysid, vertreter, rolle from ka_benutzer_tbl_view WHERE id = %s"""
+FETCH_USER_ID_SQL = """SELECT id from ka_benutzer_tbl_view WHERE login = %(login)s"""
+FETCH_USER_SYS_ID_SQL = """SELECT usesysid FROM pg_user WHERE usename = '%s'"""
+CREATE_USER_SQL_M = """SELECT ka_create_role(%(agency)s, %(grouprole)s, %(loginname)s, %(firstname)s, %(surname)s, %(phone)s, %(room)s, %(branchoffice)s, %(activated)s , %(setpassword)s)"""
+CREATE_USER_SQL_KA = """SELECT create_benutzer_ds(%(login)s)"""
+RESET_USER_PASSWORD_SQL = """SELECT waska_reset_password(%(login)s, %(agency)s)"""
+ALTER_USER_PASSWORD_SQL = """SELECT ka_set_password(%(login)s, %(password)s)"""
+ALTER_USER_STANDIN_SQL = """SELECT ka_set_standin(%(standin)s, %(userid)s)"""
+STORE_USER_DATA_SQL = """UPDATE ka_benutzer_tbl_view SET %s WHERE id = %%(id)s"""
+#GET_USERROLE_SQL = """select groname from pg_group where %(useroid)s = ANY (grolist)"""
+
+class UserListObject:
+    def __init__(self, db_pool):
+        self.user = []
+        self.db_pool = db_pool
+        conn = None
+        cur = None
+        try:
+            try:
+                conn = self.db_pool.getConnection()
+                cur = conn.cursor()
+                cur.execute(FETCH_USER_LIST_SQL)
+                for r in cur.fetchall():
+                    self.user.append(UserObject(self.db_pool, r[0]))
+            finally:
+                try:
+                    if cur:
+                        cur.close()
+                    if conn:
+                        self.db_pool.recycleConnection(conn)
+                except:
+                    pass
+        except StandardError, err:
+            print >> sys.stderr, "Error on creating user overview: %s" % str(err)
+
+    def getAdminList(self, filter=None):
+        admins = [e for e in self.user if e.isAdmin()]
+        if filter:
+            return [e for e in admins if e.id not in filter]
+        else:
+            return admins 
+
+    def getUserList(self, filter=None):
+        if filter:
+            return [e for e in self.user if e.id not in filter]
+        else:
+            return self.user
+        
+class UserObject:
+    def __init__(self, db_pool, id=None):
+        self.db_pool = db_pool
+        
+        self.login = ''
+        self.role = '' 
+        self.oid = '' 
+        self.agency = ''
+        self.full_login = ''
+
+        self.id = None 
+        self.last_name = '' 
+        self.first_name = '' 
+        self.telephone = '' 
+        self.room = ''
+        self.branchoffice = ''
+        self.telephone = '' 
+        self.activated = True 
+        self.needs_passrefresh = True 
+        self.standin = '' 
+
+        # Load existing user?
+        if id:
+            if id == '0':
+                self.setAdmUser()
+            else:
+                self._fetchData(id)
+
+    def _processLoginString(self):
+        tok = self.full_login.split('_')
+        self.login = "_".join(tok[2:])
+        self.agency = tok[1]
+
+    def getLogin(self):
+        if self.login: return self.login
+        else:
+            self._processLoginString()
+            return self.login
+
+    def getAgency(self):
+        if self.agency: return self.agency
+        else:
+            self.processLoginString()
+            return self.agency
+        
+    def isActivated(self):
+        return self.activated 
+
+    def needsNewPass(self):
+        return self.needs_passrefresh
+
+    def isAdmin(self):
+        return (self.getRole() == "Admin-KA")
+
+    def getRole(self):
+        tok = self.role.split('_')
+        role = "_".join(tok[-2:])
+        if role == 'cm_ka':
+            return 'CM-KA'
+        elif role == 'admin_ka':
+            return 'Admin-KA'
+        elif role == 'pt_dlr':
+            return 'PT-DLR'
+        else:
+            return role
+
+    def setPassword(self, password):
+        conn = None
+        cur = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            fields = {'login': self.full_login, 'password': password}
+            cur.execute(ALTER_USER_PASSWORD_SQL, fields)
+            new_pass = cur.fetchone()[0]
+            conn.commit()
+            self.needs_passrefresh = False
+            return new_pass 
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+        return None 
+
+    def resetPassword(self):
+        conn = None
+        cur = None
+        password = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            fields = {'login': self.getLogin(), 'agency': self.getAgency()}
+            cur.execute(RESET_USER_PASSWORD_SQL, fields)
+            password = cur.fetchone()[0]
+            conn.commit()
+            cur.close()
+            self.db_pool.recycleConnection(conn)
+            # Now set and save the passrefresh flag
+            self.needs_passrefresh = True
+            self.store()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+        return password
+
+    def _fetchData(self, id):
+        conn = None
+        cur = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            cur.execute(FETCH_USER_DATA_SQL % id)
+            ud = cur.fetchone()
+            # Set userdata
+            self.id = ud[0]
+            self.first_name = unicode(str(ud[1]), 'utf-8')
+            self.last_name = unicode(str(ud[2]), 'utf-8')
+            self.telephone = unicode(str(ud[3]), 'utf-8')
+            self.activated = ud[4]
+            self.needs_passrefresh = ud[5] 
+            self.full_login = unicode(str(ud[6]), 'utf-8')
+            self.room = unicode(str(ud[7]), 'utf-8')
+            self.branchoffice = unicode(str(ud[8]), 'utf-8')
+            self.oid = ud[9]
+            self.standin = ud[10]
+            self.role = ud[11]
+            self._processLoginString()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+    
+    def setAdmUser(self):
+        lname = "ka_%s_adm" % (getDbName())
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            fields = {'login': '''%s''' % lname}
+	    cmd = FETCH_USER_SYS_ID_SQL % lname
+            cur.execute(cmd)
+            uid = cur.fetchone()[0]
+        
+            self.id = 0
+            self.first_name = ''
+            self.last_name = 'Zentrale Administration'
+            self.activated = True
+            self.needs_passrefresh = False
+            self.full_login = lname
+            self.oid = uid
+            self.role = 'admin_ka'
+            self._processLoginString()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+    
+
+    def loadByName(self, name):
+        # build long loginname as it is stored in the db
+        lname = "ka_%s_%s" % (getDbName(), name)
+        conn = None
+        cur = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            fields = {'login': lname}
+            cur.execute(FETCH_USER_ID_SQL, fields)
+            id = cur.fetchone()
+            self._fetchData(id)
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+
+    def setStandin(self, uid):
+        con = None
+        cur = None
+        fields = {'userid': self.id, 'standin':uid}
+        try:
+            con = self.db_pool.getConnection()
+            cur = con.cursor()
+            cur.execute(ALTER_USER_STANDIN_SQL, fields)
+            con.commit()
+            cur.close()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if con:
+                    db_pool.recycleConnection(conn)
+            except:
+                pass
+
+    def setData(self, data):
+        """Eats dictionary holding valid data returned from the formencode validation"""
+        self.first_name = data.get('firstname', self.first_name) 
+        self.last_name= data.get('lastname', self.last_name) 
+        self.telephone = data.get('telephone', self.telephone) 
+        self.room = data.get('room', self.room) 
+        self.branchoffice = data.get('branchoffice', self.branchoffice) 
+        self.activated = data.get('activated', self.activated) 
+        self.needs_passrefresh = data.get('newpass', self.needs_passrefresh) 
+
+    def createLogin(self, login=None, role=None, agency=None):
+        conn = None
+        cur = None
+        self.login = login
+        self.role = role
+        self.agency = agency
+        password = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            fields = {'loginname': self.login, 
+                    'grouprole': self.role, 
+                    'agency': self.agency,
+                    'firstname': self.first_name,
+                    'surname': self.last_name,
+                    'phone': self.telephone,
+                    'room': self.room,
+                    'branchoffice': self.branchoffice,
+                    'activated': self.activated,
+                    'setpassword': self.needs_passrefresh 
+                    }
+            cur.execute(CREATE_USER_SQL_M, fields)
+            result = cur.fetchone()
+            password = result[0]
+            conn.commit()
+            cur.close()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    db_pool.recycleConnection(conn)
+            except:
+                pass
+        return password
+
+    def _init_ka_benutzer(self, username):
+        id = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            fields = {'login': username}
+            cur.execute(CREATE_USER_SQL_KA, fields)
+            id = cur.fetchone()[0]
+            conn.commit()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+        return id
+
+    def store(self):
+        fields = {
+                    'vorname': self.first_name,  
+                    'nachname': self.last_name,
+                    'telefon': self.telephone, 
+                    'aktiviert': self.activated,
+                    'raumnummer': self.room,
+                    'filiale': self.branchoffice,
+                    'passwort_aendern': self.needs_passrefresh
+        }
+        update_str = []
+        for key in fields.iterkeys():
+            update_str.append('%s=%%(%s)s' % (key, key))
+        fields['id'] = self.id
+        conn = None
+        cur = None
+        try:
+            conn = self.db_pool.getConnection()
+            cur = conn.cursor()
+            sql = STORE_USER_DATA_SQL % ", ".join(update_str)
+            cur.execute(sql, fields)
+            conn.commit()
+        finally:
+            try:
+                if cur:
+                    cur.close()
+                if conn:
+                    self.db_pool.recycleConnection(conn)
+            except:
+                pass
+
+    def delete(self):
+        pass

Added: trunk/waskaweb/model/view.py
===================================================================
--- trunk/waskaweb/model/view.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/model/view.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,79 @@
+# -*- coding: latin1 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <teichmann at intevation.de>
+#
+
+class CRUD:
+    
+    def create(self):
+        return None
+
+    def read(self, id):
+        pass
+
+    def update(self, view):
+        pass
+
+    def delete(self, view):
+        pass
+
+    def numberOfItems(self):
+        return 0
+
+    def idForIndex(self, idx):
+        return 0
+
+class Error:
+    def __init__(self, bad, msg = None):
+        self.bad = bad
+        if msg is None: self.messages = []
+        else:           self.messages = [ msg ]
+
+class View:
+
+    def __init__(self, id = None, name = None, crud = None):
+        self.id     = id
+        self.name   = name
+        self.crud   = crud
+        self.values = {}
+        self.errors = {}
+
+    def getName(self):
+        return self.name
+
+    def getId(self):
+        return self.id
+
+    def update(self):
+        self.crud.update(self)
+
+    def get(self, key):
+        return self.values.get(key, None)
+
+    def put(self, key, value):
+        self.values[key] = value
+
+    def getError(self, key):
+        try:
+            return ", ".self.errors[key].join(error.messages)
+        except KeyError:
+            return None
+
+    def numErrors(self):
+        return sum([len(e.messages) for e in self.errors.itervalues()])
+
+    def addError(self, key, bad, msg):
+        try:
+            self.errors[key].messages.append(msg)
+        except KeyError:
+            self.errors[key] = Error(bad, msg)
+
+    def clearError(self, key):
+        try:
+            del self.errors[key]
+        except KeyError:
+            pass
+
+# vim:set ts=4 sw=4 si et sta sts=4:

Added: trunk/waskaweb/public/images/BMFSFJ_C_M_web.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/BMFSFJ_C_M_web.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/alert.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/alert.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/error_small.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/error_small.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/eu_logo_4c_pos_web2.jpg
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/eu_logo_4c_pos_web2.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/icons/arrow3_e.gif
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/icons/arrow3_e.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/icons/form_help.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/icons/form_help.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/icons/trash.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/icons/trash.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/icons/view.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/icons/view.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/logo_dlr.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/logo_dlr.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/logo_intevation.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/logo_intevation.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/logo_ka_75.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/logo_ka_75.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/images/question.png
===================================================================
(Binary files differ)


Property changes on: trunk/waskaweb/public/images/question.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: trunk/waskaweb/public/js/check.js
===================================================================
--- trunk/waskaweb/public/js/check.js	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/js/check.js	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,24 @@
+/*
+ * (c) 2007 by Intevation GmbH
+ * authors:
+ * Sascha L. Teichmann <teichmann(at)intevation(dot)de>
+ */
+var modifiedData = false;
+
+var MODIFICATION_WARNING = 
+  "Es wurden ggf. Eingabedatenfelder verändert.\n" +
+  "Wollen Sie dennoch fortfahren?"
+
+function clearModification() {
+    modifiedData = false;
+}
+
+function setModification() {
+    modifiedData = true;
+}
+
+function checkModification() {
+    return !modifiedData || confirm(MODIFICATION_WARNING);
+    
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=uft8

Added: trunk/waskaweb/public/styles/all.css
===================================================================
--- trunk/waskaweb/public/styles/all.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/all.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,286 @@
+/*------------------------------*/
+/* Content of all.css		*/
+/* 1. Table Formats 		*/
+/* 2. Evaluation Formats	*/
+/* 3. Formular Elements		*/
+/* 4. Grouping form elements 	*/
+/*------------------------------*/
+
+
+/*------------------*/
+/* 1. Table Formats */
+/*------------------*/
+
+label a, label input, select {
+	margin-bottom:0.2em;
+}
+
+table {
+	border-color: #000;
+	border-spacing: 0;
+	empty-cells: show;
+	table-layout: fixed;	
+	text-align: left;
+	font-size:1em;
+	margin:0.6em 0 1em 0;
+	width:90%;
+}
+
+table th {
+	padding: 0.25em;
+	border-bottom: 0.5pt double;
+}
+
+table th.number_field {
+	text-align: right;
+}
+
+table td {
+	padding: 0.1em 0.25em;
+	border-bottom: 0.5pt solid; 
+}
+
+table td.number_field {
+	text-align: right;
+}
+
+table td.label {
+	font-weight: bold;
+	border-right: 0.5pt solid; 
+	width: 15em;
+}
+
+
+/*----------------------*/
+/* 2. Evaluation Formats*/
+/*----------------------*/
+
+table.evaluation {
+	margin: 0.3em 0.5em 0.3em 0.5em;
+}
+
+table.evaluation th, table.evaluation td {
+	text-align: right;
+}
+
+table.evaluation td.label, th.label {
+	font-weight: normal;
+	width: 15em;
+	text-align: left;
+}
+
+div.evaluation {
+	padding: 0.5em 0.5em 1.5em 0.5em;
+}
+
+div.evaluation h1, div.evaluation h2, div.evaluationa h3 {
+        margin: 0.1em 0;
+	padding: 0;
+	font-size:1.1em;
+}
+	
+div.evaluation h4 {
+        margin: 1.1em 0 0em 0;
+	padding-left: 0.75em;
+	font-size:1em;
+}
+
+div.odd-row{
+	border: 0.5pt;
+	border-style: solid none solid none;
+}
+
+div.odd-row a, div.even-row a{
+	padding-left:0.75em;
+	padding-right:0.6em;
+}
+
+div.odd-row h3 a, div.even-row h3 a {
+	padding-left:0.2em;
+}	
+
+
+/*---------------------*/
+/*3. Formular Elements */
+/*---------------------*/
+
+div.form_errors {
+	border: 0.5pt;
+	padding: 0.5em;
+	border-style: solid;
+}
+
+div.form_error img {
+	border: 0;
+	text-align: middle;
+}
+
+.waska_form form {
+        border: 0;
+}
+
+.waska_form fieldset {
+        margin: 0.2em 0em 0.2em 0em;
+    /*    border: 0.5pt solid; */
+	padding: 0.5em;
+}
+
+.waska_form legend {
+	margin: 0.5em 0em 0.5em 0em;
+	padding: 0 0.1em 0.2em 0.1em;
+}
+
+.waska_form_element {
+	float:left;
+	width: 100%;
+}
+
+.waska_form input.field {
+        width: 100%;
+	margin: 0 0.25em 0.3em 0;
+}
+
+.waska_form input.intfield {
+        width: auto;
+	margin: 0 0.25em;
+}
+
+.waska_form input[type="checkbox"] {
+        width: auto;
+        float: left;
+        clear: left;
+	margin-left:0.1em;
+	margin-top:0.5em;
+}
+
+.waska_form input[type="radio"] {
+        float: left;
+	margin-top:0.4em;
+}
+
+.waska_form input[type="submit"] {
+	margin-left: 0.1em;
+	margin-top: 0.5em;
+}
+
+#waska_form input[type="submit"] {
+	margin-left: 0.1em;
+	margin-top: 0.5em;
+}
+
+.waska_form textarea {
+        width: 100%;
+}
+
+.waska_form select {
+	margin: 0;
+        width: 100%;
+}
+
+.waska_form #angebot {
+	margin: 0;
+        width: 30%;
+}
+
+.waska_form_element label {
+        margin: 0em 0.1em;
+}
+
+.input_space input[type="submit"] {
+	margin-top:0.4em;
+	margin-left:0;
+	padding-left:0;
+}
+
+/*---------------------*/
+/*   3.1 User	       */
+/*---------------------*/
+
+#appointment #waska_form .w25, #appointment #waska_form .w50, #appointment #waska_form .w75 {
+	float:left;
+}
+
+#appointment #waska_form .w25 input, #appointment #waska_form .w50 input, #appointment #waska_form .w75 input {
+	margin-top:0;
+}
+
+#appointment #waska_form input {
+	margin-top:1.5em;
+}
+
+#description {	
+	width:29em;
+}
+
+#document input{
+	margin-top:0.5em;
+}
+
+
+/*-----------------------------*/
+/*   3.2 Administration	       */
+/*-----------------------------*/
+
+#admin_new_user #waska_form .w25, #admin_new_user #waska_form .w50, #admin_new_user #waska_form .w75, #admin_new_user #waska_form .w100  {
+	float:left;
+}
+
+#admin_new_user #waska_form form input {
+	margin-top:1em;
+}
+
+#admin_new_user #waska_form fieldset input {
+	margin-top:0em;
+}
+
+#admin_edit_user #waska_form .w25, #admin_edit_user #waska_form .w50, #admin_edit_user #waska_form .w75, #admin_edit_user #waska_form .w100{
+	float:left
+}
+
+#admin_edit_settings #waska_form .w25, #admin_edit_settings #waska_form .w50, #admin_edit_settings #waska_form .w75, #admin_edit_settings #waska_form .w100{
+	float:left
+}
+
+#admin_edit_settings_submit {
+margin-top:1em;
+}
+
+#admin_edit_settings p {
+margin-bottom:1em;
+}
+
+#admin_edit_user_submit {
+margin-top:1em;
+}
+
+form input.btn_space {
+margin-top:0.4em;
+}
+
+/*---------------------------*/
+/* 4. Grouping form elements */
+/*---------------------------*/
+
+.w100{
+        width: 100%;
+}
+
+.w75 {
+        width: 75%;
+}
+
+.w50 {
+        width: 50%;
+}
+
+.w25 {
+        width: 25%;
+}
+
+.waska_form div.w100 br {
+        clear:both;
+}
+
+br.newline {
+        clear:both;
+}


Property changes on: trunk/waskaweb/public/styles/all.css
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/waskaweb/public/styles/color3.css
===================================================================
--- trunk/waskaweb/public/styles/color3.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/color3.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,149 @@
+
+/*------------------------------*/
+/* Content colors3.css		*/
+/* 1. Common selectors 		*/
+/* 2. Header     		*/
+/* 3. Navigation  		*/
+/* 4. Content 			*/
+/* 5. Formular   		*/
+/* 6. Evaluation   		*/
+/*------------------------------*/
+
+/*---------------------*/
+/* 1. Common selectors */
+/*---------------------*/
+
+body {background-color: white;}
+
+a { color: #000; }
+
+a.button {
+	border-color: #ad224c;
+	background-color: #cccccc;
+}
+
+li tt {  text-decoration: none;}
+
+
+/*------------------*/
+/* 2.	Header      */
+/*------------------*/
+
+div#logo {background-color: #fff;}
+
+div#statusbar {
+	background-color: #0f3250;
+	color: #fff;
+}
+
+#navipath {background-color: #bec3c3;}
+	
+
+/*------------------*/
+/* 3.	Navigation  */
+/*------------------*/
+
+div.left div.navigation {
+	background:#e6e6e6;
+}
+
+.menuico { 
+	border-color: #A5103B;
+	color:#A5103B;
+}
+
+div#navigation, .menu  {background-color: #e6e6e6;}
+
+div.navigation .error {color: #a5103b;}
+
+/*div.infofield {background-color: #beba79;}*/
+
+div.actions li:before {color: #ad224c;}
+
+div.menu h1 {
+	background-color: #0f3250;
+	color: #fff;
+}
+
+.menu .actions li a:hover {
+	background:#BEC3C3;
+}
+
+a.formpage_highlight, .formpage a:hover {
+	background:#BEC3C3;
+}
+
+/*--------------*/
+/* 4. Content 	*/
+/*--------------*/
+
+div#content {
+	background-color: #efefef;
+}
+
+div#modusfield .actions a:hover {
+	background:#BEC3C3;
+}
+
+/*------------------*/
+/* 5.	Formular    */
+/*------------------*/
+
+table {border-color: #000;}
+
+.waska_form input:focus {background: #fffeb0;}
+
+.waska_form input.readonly {background-color: #ececec;}
+
+select[disabled=disabled] {
+	background-color: #bec3c3;
+	color: #000;
+}
+
+#navi_head {
+	background:#BEC3C3;
+}
+
+
+/*------------------*/
+/* 6. Evaluation    */
+/*------------------*/
+
+div.form_errors {
+	background-color: #fff;
+	border-color: #000;
+}
+
+div.form_errors h1 {
+	color: #a5103b;
+}
+
+div.odd-row {
+	border-color: #000;
+	background-color: #BEC3C3;
+}
+
+div.even-row {
+	background-color: #E6E6E6;
+}
+
+/*------------------*/
+/* 7. Login	    */
+/*------------------*/
+
+input:focus {
+	background: #fffeb0;
+}
+
+#content_login h1 {
+	color:#ffffff;
+	background:#0F3250;
+}
+
+#waska_form_login {
+	background-color: #E6E6E6;
+}
+
+
+
+


Property changes on: trunk/waskaweb/public/styles/color3.css
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/waskaweb/public/styles/ie6.css
===================================================================
--- trunk/waskaweb/public/styles/ie6.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/ie6.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,74 @@
+p {padding-left:0.1em;}
+
+legend {
+	margin-bottom:0.4em;
+	margin-left:-7px
+}
+
+.waska_form legend {
+	margin-left:-7px; /* the legend tag has a standard padding-left of 7px */
+}
+
+div#content {
+	width: 53.5em;
+}
+
+div#statusbar {
+	padding-bottom: 0.1em;
+	margin-top: 0.8em;
+}
+
+#navipath{
+	padding: 0.4em 1em;
+}
+
+div#startmenu {
+	padding-top:0.6em;
+	padding-bottom:0em;
+}
+
+.waska_form fieldset {
+        border: 0.5pt solid;
+}
+
+#waska_form_login form .input input, #waska_form_login form .label label {
+	width:11em;
+}
+
+#waska_form_login #login_btn input {
+	margin-left:11em;
+}
+
+#waska_form_login {
+	height:11em; /*sonst wird p element nicht angezeigt */
+}
+
+#waska_form_login form{
+	height:11em; /*sonst werden die Abst&#228;nde zwischen den Elementen ignoriert */
+}
+
+#wrapper_login {
+	margin:0;
+	padding:0;
+}
+
+div#footer {
+	width:99.9em;
+}
+
+#navipath li{
+	display: inline;
+	padding-right:0.2em;
+}
+
+.menu .formpage a {
+	width:13.65em;
+}
+
+.menu .formpage li a{
+	width:12.65em;
+}
+
+.menu .formpage li li a {
+	width:11.69em;
+}
\ No newline at end of file

Added: trunk/waskaweb/public/styles/old_css/all.css
===================================================================
--- trunk/waskaweb/public/styles/old_css/all.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/old_css/all.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,179 @@
+ at import url(color3.css);
+table {
+	border-color: #000;
+	border-spacing: 0;
+	empty-cells: show;
+	table-layout: fixed;	
+	text-align: left;
+	font-size:10pt;
+}
+
+table th {
+	padding: 0.25em;
+	border-bottom: 1px double;
+}
+
+table th.number_field {
+	text-align: right;
+}
+
+table td {
+	padding: 0.25em;
+	border-bottom: 1px solid; 
+}
+
+table td.number_field {
+	text-align: right;
+}
+
+table td.label {
+	font-weight: bold;
+	border-right: 1px solid; 
+	width: 150px;
+}
+
+table.evaluation {
+	margin: 0.5em 0.5em 1em 0.5em;
+}
+
+table.evaluation th, table.evaluation td {
+	text-align: right;
+}
+
+table.evaluation td.label, th.label {
+	font-weight: normal;
+	width: 150px;
+	text-align: left;
+}
+
+div.evaluation {
+	padding: 1.5em 0.5em;
+}
+
+div.odd-row {
+	border: 1px;
+	border-style: solid none solid none;
+}
+
+div.evaluation h1, h2, h3, h4, h5, h6 {
+        margin: 0.5em 0;
+}
+
+div.evaluation h3 {
+margin-left: 0;
+padding-left: 0;
+}
+
+div.evaluation h4{
+        margin: 1em 0em 0em 0.65em;
+}
+
+div.legend {
+	margin: 0.5em 0;
+	font-size: 0.8em;
+	padding-bottom:0.5em;
+
+}
+
+/* Formular Elements */
+div.form_errors {
+	border: 1px;
+	padding: 0.5em;
+	border-style: solid;
+}
+
+div.form_error img {
+	border: 0;
+	text-align: middle;
+}
+
+.waska_form {
+}
+
+.waska_form form {
+        margin: 0;
+        padding: 0;
+        border: 0;
+}
+
+.waska_form fieldset {
+        margin: 0.5em 0.5em;
+        border: 1px solid;
+	padding:0.5em;
+}
+
+.waska_form_element {
+	float:left;
+	width: 100%;
+	padding-top: 0.2em;
+	padding-bottom: 0.2em;
+}
+
+.waska_form input.field {
+        width: 100%;
+	margin: 0 0.25em;
+}
+
+.waska_form input.intfield {
+        width: auto;
+	margin: 0 0.25em;
+}
+
+.waska_form input[type="checkbox"] {
+        width: auto;
+        float: left;
+        clear: left;
+}
+
+.waska_form input[type="radio"] {
+        width: auto;
+        float: left;
+}
+.waska_form input[type="submit"] {
+        border: 1px;
+        border-style: solid ;
+        padding: 0.5em 0em;
+}
+
+.waska_form textarea {
+        width: 100%;
+}
+
+.waska_form select {
+	margin: 0 0.25em;
+        width: 100%;
+}
+
+.waska_form label {
+        text-align: left;
+        margin: 0 0.25em;
+        padding: 0px;
+        border: 0;
+}
+/* Grouping form elements */
+.waska_form div.w100{
+        width: 100%;
+}
+
+.waska_form div.w75 {
+        width: 75%;
+}
+
+.waska_form div.w50 {
+        width: 50%;
+}
+
+.waska_form div.w25 {
+        width: 25%;
+}
+
+.waska_form label.wXX {
+}
+
+.waska_form div.w100 br {
+        clear:both;
+}
+
+br.newline {
+        clear:both;
+}

Added: trunk/waskaweb/public/styles/old_css/color3.css
===================================================================
--- trunk/waskaweb/public/styles/old_css/color3.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/old_css/color3.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,94 @@
+
+/*------------------*/
+/* screen.css colors*/
+/*------------------*/
+
+body {background-color: white;}
+
+a { color: #000; }
+
+a.button {
+	border-color: #ad224c;
+	background-color: #cccccc;
+}
+
+li tt {  text-decoration: none;}
+/* 
+Layout 
+*/
+
+div#logo {background-color: #fff;}
+
+div#content {background-color: #efefef;}
+
+/* 
+Page elements 
+*/
+
+div#navigation {background-color: #e6e6e6;}
+
+div.navigation .error {color: #a5103b;}
+
+div#modusfield {background-color: #fff;}
+
+div#infofield {background-color: #bec3c3;}
+
+div.infofield {background-color: #beba79;}
+
+div.actions li:before {color: #ad224c;}
+
+div#statusbar {
+	background-color: #0f3250;
+	color: #fff;
+}
+
+#navipath {background-color: #bec3c3;}
+
+.menu {background-color: #e6e6e6;}
+
+div.menu h1 {
+	background-color: #0f3250;
+	color: #fff;
+}
+
+/*------------------*/
+/* all.css colors*/
+/*------------------*/
+
+table {border-color: #000;}
+
+.waska_form input:focus {background: #fffeb0;}
+
+.waska_form input.readonly {background-color: #ececec;}
+
+select[disabled=disabled] {
+	background-color: #bec3c3;
+	color: #000;
+}
+
+.waska_form input[type="submit"] {
+        border-color: #ad224c;
+        background-color: #cccccc;
+}
+
+/*------------------*/
+/* AUSWERTUNG colors*/
+/*------------------*/
+
+div.form_errors {
+	background-color: #fff;
+	border-color: #000;
+}
+
+div.form_errors h1 {
+	color: #a5103b;
+}
+
+div.odd-row {
+	border-color: #000;
+	background-color: #BEC3C3;
+}
+
+div.even-row {
+	background-color: #E6E6E6;
+}


Property changes on: trunk/waskaweb/public/styles/old_css/color3.css
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/waskaweb/public/styles/old_css/print.css
===================================================================
--- trunk/waskaweb/public/styles/old_css/print.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/old_css/print.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,22 @@
+body {
+  color : #000000;
+  background : #ffffff;
+  font-family : "Times New Roman", Times, serif;
+  font-size : 11pt;
+}
+a {
+  text-decoration : underline;
+  color : #0000ff;
+}
+
+div#logo {
+	border-bottom: 1px solid #000;
+}
+
+#navigation, #navipath, #startmenu, #statusbar, #infofield, .actions, .help {
+  display : none;
+}
+
+#waska_form input[type="submit"] {
+	display: none;
+}

Added: trunk/waskaweb/public/styles/old_css/screen.css
===================================================================
--- trunk/waskaweb/public/styles/old_css/screen.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/old_css/screen.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,231 @@
+/* ====================================== 
+   1. Kalibrierung und allgemeine Styles 
+   ====================================== */
+ at import url(color3.css);
+/* Kalibrierung der wichtigsten Abstände */
+*  { padding: 0; margin: 0; }
+/*ANMERK legend {padding:0; margin-left:-7px;} ie legend hack margin -7px; im ff legend margin-left:0.5em;} f&#252;r korrekte Darstellung*/
+h2, p, ul, ol { margin-bottom: 1em; }  
+ul {margin-left:1em;}
+ul ul { margin-top:0.4em;margin-bottom: 0.3em; margin-left:0.5em; list-style-type: square;} 
+li { margin-left: 1em; margin-bottom:0.3em; list-style-type: square;} 
+hmtl {height:101%;}
+
+body {
+	font-size:10pt;
+	font-family: sans-serif;
+	padding: 0.2em 0em 0em 0.4em;
+}
+
+h1 { font-size: 1.5em; }
+h2 { font-size: 1.3em; }
+h3 { font-size: 1.2em; }
+h4 { font-size: 1.0em; }
+
+
+a.button {
+	border: 1px;
+	margin-right: 3em;
+	border-style: solid ;
+	padding: 0 3em;
+}
+
+div.dialog img{
+	vertical-align: middle;
+	margin-right: 1em;
+}
+
+img.smallicon{
+	vertical-align: middle;
+	border: 0;
+	margin-right: 0.25em;
+}
+
+/* 
+Layout 
+*/
+div#header {
+	border-bottom: 1px solid #000;
+	width: 69.9em; /*total fixed width*/
+	height: 6.50em;
+}
+
+div#header img { 
+	margin-top: 1.45em;
+	/*width:15.7em;
+	height:5.9em;
+	max-height: 75px;
+	max-width: 207px;*/
+}
+
+div#main {
+	margin-top: 0.4em;
+	width: 74em; /* total fixed width */
+	clear:both;
+}
+
+div.left {
+	width: 15.8em;
+	float: left;
+}
+
+div.right {
+	margin-left: 15.96em;
+	width: 53em;
+}
+
+div#content {
+	padding: 0.5em;
+	margin-right:2em;
+}
+
+div#content ul {
+	padding: 0.5em;
+	margin-top:1em;
+	margin-left:2em;
+}
+div#content li {
+	list-style-type: disc;
+}
+
+div#footer {
+	clear:both;
+	text-align: right;
+	border-top: 1px solid #000;
+	font-size: 0.8em;
+	padding: 0.5em;
+}
+
+/* 
+Page elements 
+*/
+div#navigation {
+	padding-bottom: 0.5em;
+	margin: 0.001px;
+}
+
+div.navigation .error {
+ 	font-weight: bold;	
+}
+
+div#navigation ul.formpage {
+        list-style-type: square;
+	font-size: 8pt;
+	margin: 0.5em 1.5em;
+	padding: 0;
+}
+
+div#modusfield {
+	border: 1px;
+	border-style: solid none solid none;
+	margin-bottom: 0.4em;;
+}
+
+div#infofield {
+	padding: 0.5em;
+        font-size:0.8em;
+	margin-bottom: 0.4em;
+	border: 1px;
+	border-style: none none solid none;
+}
+
+div.infofield {
+	padding: 0.5em;
+        font-size:0.8em;
+	margin-bottom: 5px;
+	border: 1px;
+	border-style: none none solid none;
+}
+
+div.actions li {
+        list-style-type: none;
+	margin: 0.5em 1em;
+}
+
+div.actions li:before{
+	content: ">>";
+	font-size: 0.6em;
+	margin-right: 1em;
+	border: 1px solid #ad224c;
+}
+
+img.action {
+	margin-right: 0.75em;
+	border:0;
+}
+ 
+div#startmenu {
+	/*border: 1px;*/
+	margin-bottom: 0.1em;
+	text-align: right;
+	margin-top:1.05em;
+	padding-top:0.5em;
+	/*border-style: none none solid none;*/
+}
+
+div#startmenu ul {
+	margin-bottom: 0.4em;
+	padding:0;
+	font-weight: bold;
+}
+
+div#startmenu li {
+	margin: 0;
+	padding:0;
+	display: inline;
+}
+
+div#startmenu li:first-child:before{
+	content: "";
+	padding: 0em 0em;
+}
+
+div#startmenu li:before{
+	content: "|";
+	padding: 0em 0.5em;
+}
+
+div#statusbar {
+	padding: 0.1em 0 0.1em 0.2em;
+	margin-top: 0.4em;
+	height:1em;
+}
+
+#navipath{
+	height:1.0em;
+	font-size: 0.8em;
+	padding: 0.8em 1em;
+	border: 1px;
+	margin-bottom:0.4em;
+	/*border-style: none none dashed none;*/
+}
+
+#navipath ul{
+	margin: 0;
+	padding: 0;
+}
+
+#navipath li{
+	margin: 0;
+	display: inline;
+}
+
+#navipath li:first-child:before{
+	content: "";
+	padding: 0em 0em;
+}
+
+#navipath li:before{
+	content: "->";
+	padding: 0em 0.5em;
+}
+
+.menu {padding-bottom: 0.3em;}
+
+div.menu h1 {
+	margin-bottom: 5pt;
+	font-size: 1.1em;
+	padding: 0 1em;
+}
+
+#clearer {clear:both;}
\ No newline at end of file

Added: trunk/waskaweb/public/styles/print.css
===================================================================
--- trunk/waskaweb/public/styles/print.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/print.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,134 @@
+body {
+  	color : #000000;
+  	background : #ffffff;
+  	font-family : "Times New Roman", Times, serif;
+  	font-size : 11pt;
+}
+
+p {
+	margin-top:0;
+	padding-top:0;
+	margin-bottom:4pt;
+	padding-bottom:2pt;
+}
+
+ul {
+	list-style-type:none;
+	padding:0;
+	margin:0;
+}
+
+li {
+	list-style-type:none;
+	margin-left:0em;
+	padding-left:0em;
+	padding:0;
+	margin:0;
+} 
+
+li h1 {
+	font-size:1em;
+	font-weight:bold;
+	margin-top:0em;
+	padding-top:0em;
+	padding:0;
+	margin:0;	
+}
+
+
+a {
+  	text-decoration : none;
+ 	 color : #000000;
+}
+
+h1 {
+	margin: 0px 0px 5px 0px; 
+	padding:0;
+	font-size:14pt;
+	font-weight:bold;
+}
+h2, h3, h4 {
+	margin: 0px 0px 2px 0px; 
+	padding:0;
+	font-size:12pt;
+	font-weight:bold;
+}
+
+table {
+	margin-top:2pt;
+}
+
+div#content {
+	background-color:white;
+}
+
+div#content_header {
+	border:0.5pt solid;
+	width:250pt;
+	height:48pt;
+	margin-top:0em;
+	padding:2pt;
+	float:left;
+}
+
+#content_ueberschrift, #first_level_header {
+	margin-top:0;
+	padding-top:0;
+	font-size:14pt;
+	font-weight:bold;
+}
+
+
+/*div#logo {
+	margin:1px; 
+	float:left; 
+	position:absolute;
+	margin-left: 5pt;
+}*/
+
+#infofield {
+	border:0.5pt solid;
+	margin:0pt 0pt 0 0pt;
+	padding: 0 0 0 2pt;
+	background-color:white;
+	float:right; 
+	font-size: 9pt;
+	height:52pt;
+	width:140pt;
+}
+
+/*div#infofield br {display:none;}*/
+
+/*.waska_form_element h2, .waska_form_element h3, .waska_form_element h4 {
+	width:200px; 
+	height:20px; 
+	float:right; 
+	margin: 0 0 0 250pt; 
+	padding:0;
+}*/
+
+.menu h1, .menu li a, .menu ul, #navipath, #startmenu, #statusbar, #modusfield, #logo, .help, #footer{
+	display: none;
+}
+
+#content_header_small {
+	height: 22pt;
+}
+
+/*#page_field {
+	float:right;
+	width:50pt;
+	height:52pt;
+	border:0.5pt solid;
+	padding-left:5pt;
+}*/
+
+/*#formular_number {
+	font-weight:bold;
+	font-size:18pt;
+}
+
+#page_number {
+	font-weight:normal;
+	font-size:10pt;
+}*/
\ No newline at end of file


Property changes on: trunk/waskaweb/public/styles/print.css
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/waskaweb/public/styles/screen.css
===================================================================
--- trunk/waskaweb/public/styles/screen.css	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/public/styles/screen.css	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,510 @@
+ at import url(color3.css);
+
+/*------------------------------*/
+/* Content of screen.css	*/
+/* 1. Common selectors		*/
+/* 2. Layout 			*/ 
+/* 3. Header 			*/
+/* 4. Left Navigation		*/
+/* 5. Content			*/
+/* 6. Login			*/
+/*------------------------------*/
+
+
+/*------------------------*/
+/* 1. Common selectors	  */
+/*------------------------*/
+
+* { padding: 0; margin: 0; }
+ul, ol { margin-bottom: 1em; } 
+ul { margin-left:1em; }
+li {  list-style-type: square;} 
+
+html {	
+	height:101%;
+	font-size:1.1em;
+}
+
+body {
+	font-size:10pt;
+	font-family: sans-serif;
+	padding: 0.2em 0em 0em 0.4em;
+}
+
+h1 { font-size: 1.2em; padding-bottom:0.2em;}
+h2 { font-size: 1.1em; padding-top:1em;}
+h3 { font-size: 1.1em; }
+h4 { font-size: 1.0em; }
+
+li h1 {
+	font-size:1em;
+}
+
+fieldset {
+	padding:0.5em;
+}
+
+.button {
+	margin-top:0.5em;
+}
+
+.dialog p {
+	margin-bottom:1em;
+}
+
+a.button {
+	border: 1px;
+	margin-right: 3em;
+	border-style: solid ;
+	padding: 0 3em;
+}
+
+div.dialog img { 
+	vertical-align: middle;
+	margin-right: 1em;
+}
+
+img.smallicon {
+	vertical-align: middle;
+	border: 0;
+	margin-right: 0.25em;
+}
+
+
+/*-----------*/ 
+/* 2. Layout */ 
+/*-----------*/
+
+div#header {
+	border-bottom: 1px solid #000;
+	width: 69.7em; /*total fixed width*/
+	height: 6.4em;
+}
+
+div#header img { 
+	margin-top: 0.2em;
+	max-height: 75px;
+	max-width: 207px;
+}
+
+div#rightheader {
+	margin-top: 0.8em;
+	margin-left: 0.397em;
+	float: right;
+	width: 53.5em;
+}
+
+div#main {
+	margin-top: 0.4em;
+	width: 70em; /* total fixed width */
+	clear:both;
+}
+
+div.left {
+	width: 15.8em;
+	float: left;
+}
+
+div.right {
+	margin-left: 16.2em;
+	width: 52.5em;
+}
+
+div#footer {
+	width:99.3em;
+	margin-top:0.4em;
+	clear:both;
+	text-align: right;
+	border-top: 1px solid #000;
+	font-size: 0.7em;
+}
+
+
+/*-----------*/
+/* 3. Header */
+/*-----------*/
+
+div#startmenu {
+	/*border: 1px;*/
+	text-align: right;
+	padding-bottom:0.4em;
+	height:1.5em;
+	/*border-style: none none solid none;*/
+}
+
+#startmenu ul {
+	margin-bottom:0;
+	font-weight: bold;
+}
+
+#startmenu li {
+	display: inline;
+}
+
+#startmenu li:first-child:before{
+	content: "";
+	padding: 0em 0em;
+}
+
+#startmenu li:before{
+	content: "|";
+	padding: 0em 0.5em;
+}
+
+div#statusbar {
+	padding:0 0 0.7em 0.2em;
+	height:0.9em;
+}
+
+div#navipath{
+	height:1.5em;
+	font-size: 0.8em;
+	padding: 0.1em 0.8em 0.4em 0.3em;
+	border: 0.5pt;
+	margin-bottom:0.4em;
+	overflow:hidden;
+}
+
+#navipath ul{
+	margin-left:0;
+	margin-bottom:0;
+}
+
+#navipath li{
+	display: inline;
+}
+
+#navipath li:first-child:before{
+	content: "";
+	padding: 0em 0em;
+}
+
+#navipath li:before{
+	content: ">";
+	padding: 0em 0.5em;
+}
+
+div#navipath_text {
+	font-size:1.1em;
+	width: 6em;
+	display:inline;
+}
+
+
+/*--------------------*/
+/* 4. Left Navigation */
+/*--------------------*/
+
+div.left div.navigation {
+
+	padding-bottom:0.5em;
+	margin-bottom:0.4em;
+	height:auto !important;
+
+}
+
+div#navigation {
+	padding-bottom: 0.5em;
+}
+
+div.navigation .error {
+ 	font-weight: bold;	
+}
+
+div#infofield {
+	padding: 0.4em 0.5em 0.0em 1.4em;
+        font-size:0.8em;
+}
+
+div.menu {
+	padding-bottom: 0.4em;
+}
+
+.menu h1 {
+	font-size: 1.1em;
+	padding: 0.1em 1em;
+}
+
+.menu .actions ul {
+	margin-top:0.4em;
+	margin-bottom:0;
+	margin-left:0em;
+	padding:0;
+}
+
+.menu .actions ul ul {
+	margin-top:0em;
+	margin-bottom:0.4em;
+}
+
+.menu .actions ul ul ul {
+	margin-top:0em;
+	margin-bottom:0em;
+}
+
+.menu .actions li {
+	margin-top:0em;
+	margin-bottom:0;
+	margin-left:0em;
+	padding:0;
+}
+
+.menu .actions li li {
+	margin-top: 0em;
+	margin-bottom: 0em;
+}
+
+.menu .actions a {
+	text-decoration:none;
+}
+
+div.menu .actions li{
+        list-style-type:none;
+}
+
+div.menu .actions a {
+	display: block;
+	padding: 0.1em 1.1em 0.3em 1.1em;
+	height: 1.5em;
+}
+
+.menu ul {
+	margin-top:0.4em;
+}
+
+.menu .formpage {
+	list-style-type:square	;
+	margin:0 0 0 1.2em;
+}
+
+.menu .formpage ul {
+	margin: 0.2em 0 0.2em 0.8em;
+}
+
+.menu .formpage ul ul {
+	margin: 0em 0 0.2em 0.8em;
+}
+
+.menu .formpage li {
+	margin-left: 0.1em;
+	padding-left:0.1em;
+}
+
+.menu .formpage a, .menu .formpage li a, .menu .formpage li li a {
+	display:block;
+}
+
+#modusfield .actions span, span.menuico {
+	font-size:0.7em;
+	border:0.5pt solid;
+}
+
+
+/*------------*/
+/* 5. Content */
+/*------------*/
+
+div#content {
+	padding: 0em 0.4em 0.5em 0.4em;
+	width:52.5em;
+	min-height:490px;
+  	height:auto !important;
+  	height:375px;
+}
+
+div#content p {
+	width:90%;
+}
+
+div#content ul {
+	padding: 0.5em;
+	margin-left:0.3em;
+	margin-bottom: 0.5em;
+}
+
+div#content li {
+	list-style-type: none;
+}
+
+div#content.right table tbody tr td a{
+	padding-right:0.25em;
+}
+
+div#content_header {
+	width:52.5em;
+	height:6.6em;
+	background:#EFEFEF;
+}
+
+div#content_header_small {
+	width:52.5em;
+	height:3em;
+	background:#EFEFEF;
+}
+
+
+div#content_ueberschrift {
+	float:left;	
+	font-size:1.2em;
+	font-weight:bold;	
+	padding:0em 0 0 0;
+	margin:0;
+}
+
+#content_header #content_ueberschrift ul, #content_header_small #content_ueberschrift ul {
+	list-style-type:none;
+	margin:0;
+	padding:0 0 0 0;
+}
+
+#content_header #content_ueberschrift li, #content_header_small #content_ueberschrift li{
+	padding-bottom:0.em;
+}
+
+div#modusfield {
+	float: right;
+	/*margin-right:3em;*/
+	width:auto !important;
+	margin-top:0.4em;
+	padding:0.1em;
+	height:auto;
+	border: 0.5pt solid;
+
+}
+
+div#modusfield .actions li, div#modusfield .actions a{
+	height:1.6em;
+	margin-top:0.1em;
+	margin-bottom:0.1em;
+}
+
+div#modusfield .actions a {
+	padding-left:0.1em;
+	margin-right:0.2em;
+}
+
+#content_header #modusfield ul, #content_header #modusfield li, #content_header_small #modusfield ul, #content_header_small #modusfield li{
+	display:inline;
+	padding:0 0 0 0.1em;
+	margin:0 0 0 0;
+	list-style-type:none;
+}
+
+#content_header #modusfield a, #content_header_small #modusfield a {
+	text-decoration:none;
+	padding:0 0.1em;
+}
+
+div#clearer {clear:both;}
+.clearer {clear:left;}
+
+/*--------------*/
+/* 6. Login	*/
+/*--------------*/
+
+#header_login {
+	margin-top:1em;
+	height:6em;
+	width:100%;
+	border-bottom:0.5pt solid;
+}
+
+#waska_form_login #login_btn input {
+	margin-left:13em;
+}
+
+#waska_form_login #login_btn {
+padding-top:0.1em;
+}
+
+#wrapper_login {
+	width:40em;
+	margin-left:0.5em;
+}
+
+#content_login {
+	width:40em;		
+	margin-top:0.4em;
+}
+
+#content_login h1 {
+	padding:0em 0 0.2em 0.4em;
+	height:1.4em;
+}
+
+#content_login p {
+	padding-left:0.5em;
+	padding-top:0.5em;
+	margin-bottom:2em;
+}
+
+#waska_form_login {
+	padding-bottom:0.1em;
+}
+
+#waska_form_login ul, #waska_form_login li {
+	margin-left:0.8em;
+}
+
+#waska_form_login fieldset {
+	margin:0.5em;
+	padding:0.5em;
+}
+
+#waska_form_login form .label label {
+	width:11em;
+	padding-left: 2em;
+	float:left;
+	font-weight:bold;
+}
+
+#waska_form_login form .input input {
+	float:left;	
+}
+
+#waska_form_login form input {
+	margin:0.2em 0 0.2em 0.5em;	
+}
+
+#waska_form_login form .input input, #waska_form_login form .label label {
+	margin-top:0.3em;
+}
+
+#waska_form_login_pw p {
+	padding-left:0.5em;
+	padding-top:0.5em;
+	margin-bottom:0.1em;
+}
+
+#footer_login {
+	margin-top:0.4em;
+	border-top:0.5pt solid;	
+}
+
+#footer_login p {
+	font-size:0.9em;
+	padding-top:0.1em;
+	margin-bottom:0.6em;
+}
+
+#footer_login img {
+	vertical-align:text-top;
+	margin-right:0.5em;
+}
+
+#footer_login a {
+	color:#ffffff;
+}
+
+#page_field {
+	display:none;
+}
+
+.help {
+	vertical-align:text-bottom;
+}
+
+div#content #adm_beta li{
+	list-style-type:square;
+	margin-left:1em;
+}


Property changes on: trunk/waskaweb/public/styles/screen.css
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/waskaweb/templates/administration/account_deactivated.mako
===================================================================
--- trunk/waskaweb/templates/administration/account_deactivated.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/account_deactivated.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,11 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main_login.mako" />
+<h1>${_('adm_header_account_deactivated')}</h1>
+<p>Dieser Account wurde deaktiviert. Dies kann mehrere Ursachen haben:
+<ul>
+  <li>Option 1</li>
+  <li>Option 2</li>
+  <li>Option 3</li>
+</ul>
+Bitte setzen Sie sich in dieser Angelegenheit mit der Administration in Verbindung 
+</p>

Added: trunk/waskaweb/templates/administration/dialogs/confirm_deleteuser.mako
===================================================================
--- trunk/waskaweb/templates/administration/dialogs/confirm_deleteuser.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/dialogs/confirm_deleteuser.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,9 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+	<li><a href="#">${_('adm_np_delteuser')}</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/administration/dialogs/confirm_resetpassword.mako
===================================================================
--- trunk/waskaweb/templates/administration/dialogs/confirm_resetpassword.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/dialogs/confirm_resetpassword.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,10 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+	<li><a href="/administration/showUser">${_('adm_np_showuser')}</a></li>
+	<li><a href="#">${_('adm_np_resetpassword')}</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/administration/dialogs/notificate_deleteuser.mako
===================================================================
--- trunk/waskaweb/templates/administration/dialogs/notificate_deleteuser.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/dialogs/notificate_deleteuser.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/">${_('adm_np_root')}</a></li>
+	<li><a href="#">${_('adm_np_deleteuser')}</a></li>
+</%def>
+<%include file="../../dialogs/notification.mako" />

Added: trunk/waskaweb/templates/administration/edit_settings.mako
===================================================================
--- trunk/waskaweb/templates/administration/edit_settings.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/edit_settings.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,75 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/editSettings">${_('adm_np_editsettings')}</a></li>
+</%def>
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('adm_header_editsettings')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='administration', action='showSettings')}">${self.buildIco()} ${_('adm_actions_link_showsettings')}</a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+<div id="admin_edit_settings">
+<p>Hier können Sie die agenturweiten Einstellungen bearbeiten.</p>
+<div class="waska_form">
+<form action="/administration/editSettingsAction" method="POST">
+	<div class="waska_form_element w50">
+		<label
+		for="ka_name">${_('adm_form_settings_kaname')}</label><br>
+                % if c.form_errors.get('ka_name'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="text" class="field" id="ka_name" name="ka_name" value="${c.form_result.get('ka_name', c.agency.getName())}">
+	</div>
+	<div class="waska_form_element w100"></div>
+	<div class="waska_form_element w25">
+		<label
+		for="fkz">${_('adm_form_settings_fkz')}</label><br>
+                % if c.form_errors.get('fkz'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="text" class="field" id="fkz" name="fkz" value="${c.form_result.get('fkz', c.agency.getFKZ())}">
+	</div>
+	<div class="waska_form_element w100"><br></div>
+        <div class="waska_form_element w100">
+                % if c.form_errors.get('anon_transfer'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+                % if c.agency.conf.get('anon_transfer') == 'on':
+
+                  <input id="anon_transfer" name="anon_transfer" type="checkbox" checked/>
+                % else:
+                  <input id="anon_transfer" name="anon_transfer" type="checkbox"/>
+                % endif
+                <label for="anon_transfer">${_('adm_form_settings_anontransfer')}</label><br>
+        </div>
+##        <div class="waska_form_element w100">
+##                <label for="ee_formular">${_('adm_form_settings_ee_statement')}</label><br>
+##                % if c.form_errors.get('ee_formular'):
+##                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+##                % endif
+##                <textarea id="ee_formular" rows="10" name="ee_formular">${c.form_result.get('ee_formular', c.agency.getPrivacyStatement())}</textarea><br>
+##        </div>
+##        <div class="waska_form_element w100">
+##                <label for="fp_formular">${_('adm_form_settings_fp_statement')}</label><br>
+##                % if c.form_errors.get('fp_formular'):
+##                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+##                % endif
+##                <textarea id="fp_formular" rows="10" name="fp_formular">${c.form_result.get('fp_formular', c.agency.getAidPlanStatement())}</textarea><br>
+##        </div>
+        <div id="admin_edit_settings_submit" class="waska_form_element w100">
+                <input type="submit" value="${_('adm_form_settings_save')}">
+        </div>
+</form>
+</div>
+</div>
+<div id="clearer" ><div>

Added: trunk/waskaweb/templates/administration/edit_user.mako
===================================================================
--- trunk/waskaweb/templates/administration/edit_user.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/edit_user.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,92 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+	<li><a href="/administration/editUser">${_('adm_np_edituser')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('adm_header_edituser')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li> <a href="/administration/resetUserPassword/${c.uo.id}">${self.buildIco()} ${_('adm_actions_link_userpassreset')}</a> </li>
+		<li> <a href="/administration/showUser/${c.uo.id}"> ${self.buildIco()} ${_('menu_adm_link_useredit_back')} </a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+${self.buildFormErrors()}
+<div id="admin_edit_user">
+<div id="waska_form">
+<form action="/administration/editUserAction" method="POST">
+	<fieldset><legend>${_('adm_form_legend_personal')}</legend>
+	<div class="w25">
+		<label
+		for="firstname">${_('adm_form_user_firstname')}</label><br>
+                % if c.form_errors.get('firstname'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="text" class="field" id="firstname" name="firstname" value="${c.form_result.get('firstname', c.uo.first_name)}">
+	</div>
+	<div class="w75">
+		<label
+		for="lastname">${_('adm_form_user_lastname')}</label><br>
+                % if c.form_errors.get('lastname'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="text" class="field" id="lasttname" name="lastname" value="${c.form_result.get('lastname', c.uo.last_name)}">
+	</div>
+	<div class="w25">
+		<label
+		for="telephone">${_('adm_form_user_telephone')}</label><br>
+		<input type="text" class="field" id="telephone" name="telephone" value="${c.form_result.get('telephone', c.uo.telephone)}">
+	</div>
+	<div class="w75">
+		<label
+		for="room">${_('adm_form_user_roomnumer')}</label><br>
+		<input type="text" class="field" id="room" name="room" value="${c.form_result.get('room', c.uo.room)}">
+	</div>
+	<div class="waska_form_element w100">
+		<label
+		for="branchoffice">${_('adm_form_user_branchoffice')}</label><br>
+		<input type="text" class="field" id="branchoffice" name="branchoffice" value="${c.form_result.get('branchoffice', c.uo.branchoffice)}">
+	</div>
+	</fieldset>
+	<fieldset><legend>${_('adm_form_legend_login')}</legend>
+          <table>
+            <tr>
+              <td class="label">Login</td>
+              <td>${c.uo.getLogin()}</td>
+            </tr>
+            <tr>
+              <td class="label">Rolle</td>
+              <td>${c.uo.getRole()}</td>
+            </tr>
+            <tr>
+          </table>
+	<div class="waska_form_element w100">
+        % if c.uo.isActivated():
+          <input type="checkbox" checked  name="activated" id="activated">
+        % else:
+          <input type="checkbox" name="activated" id="activated">
+        % endif
+        <label for="activated">${_('adm_form_user_activated')}</label>
+	</div>
+	<div class="waska_form_element w100">
+        % if c.uo.needsNewPass():
+          <input type="checkbox" checked name="newpass" id="newpass">
+        % else:
+          <input type="checkbox" name="newpass" id="newpass">
+        % endif
+        <label for="newpass">${_('adm_form_user_newpass')}</label>
+	</div>
+        <div id="admin_edit_user_submit" class="waska_form_element w100">
+	  <input type="submit" value="${_('adm_form_user_submit')}">
+        </div>
+        <input type="hidden" value="${c.form_errors.get('uid', c.uo.id)}" name="uid">
+</form>
+</div>
+</div>

Added: trunk/waskaweb/templates/administration/new_user.mako
===================================================================
--- trunk/waskaweb/templates/administration/new_user.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/new_user.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,89 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+	<li><a href="/administration/newUser">${_('adm_np_newuser')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+ ${_('adm_header_newuser')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='administration', action='overviewUser')}">${self.buildIco()} ${_('menu_adm_link_useroverview_back')}
+            </a>
+          </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+${self.buildFormErrors()}
+<div id="admin_new_user">
+<div id="waska_form">
+<form action="/administration/createUserAction" method="POST">
+	<fieldset><legend>${_('adm_form_legend_personal')}</legend>
+	<div class="w25">
+		<label
+		for="firstname">${_('adm_form_user_firstname')}</label><br>
+                % if c.form_errors.get('firstname'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="text" class="field" id="firstname" name="firstname" value="${c.form_result.get('firstname', '')}">
+	</div>
+	<div class="w75">
+		<label
+		for="lastname">${_('adm_form_user_lastname')}</label><br>
+                % if c.form_errors.get('lastname'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="text" class="field" id="lasttname" name="lastname" value="${c.form_result.get('lastname', '')}">
+	</div>
+	<div class="w25">
+		<label
+		for="telephone">${_('adm_form_user_telephone')}</label><br>
+		<input type="text" class="field" id="telephone" name="telephone" value="${c.form_result.get('telephone', '')}">
+	</div>
+	<div class="w75">
+		<label
+		for="room">${_('adm_form_user_room')}</label><br>
+		<input type="text" class="field" id="room" name="room" value="${c.form_result.get('room', '')}">
+	</div>
+	<div class="w100">
+		<label
+		for="branchoffice">${_('adm_form_user_branchoffice')}</label><br>
+		<input type="text" class="field" id="branchoffice" name="branchoffice" value="${c.form_result.get('branchoffice', '')}">
+	</div>
+	</fieldset>
+	<fieldset><legend>${_('adm_form_legend_login')}</legend>
+	<div class="w25">
+		<label
+		for="login">${_('adm_form_user_login')}</label><br>
+                % if c.form_errors.get('login'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="text" class="field" id="login" name="login" value="${c.form_result.get('login', '')}">
+	</div>
+	<div class="w50">
+        <label for="role">${_('adm_form_user_role')}</label><br>
+          <select name="role" id="role">
+            <option value="CM-KA">CM-Ka</option>
+            <option value="Admin-KA">Admin-Ka</option>
+          </select>
+        </div>
+	<div class="w100">
+        <input type="checkbox" name="activated" id="activated" value="1" checked>
+        <label for="activated">${_('adm_form_user_activated')}</label>
+	</div>
+	<div class="w100">
+        <input type="checkbox" name="newpass" id="newpass" value="1" checked>
+        <label for="newpass">${_('adm_form_user_newpass')}</label>
+	</div>
+	</fieldset>
+	<input type="submit" value="${_('adm_form_user_submit')}">
+</form>
+</div>
+</div>

Added: trunk/waskaweb/templates/administration/new_user_result.mako
===================================================================
--- trunk/waskaweb/templates/administration/new_user_result.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/new_user_result.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,79 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+	<li><a href="/administration/newUser">${_('adm_np_newuser')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('adm_header_newuser_Result')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='administration', action='overviewUser')}">${self.buildIco()} ${_('menu_adm_link_useroverview_back')}</a></li>
+            </a>
+	</ul>
+    </div>
+  </div>
+</div>
+<h2>${_('adm_form_legend_personal')}</h2>
+<table>
+  <tr>
+    <td class="label">Vorname</td>
+    <td>${c.uo.first_name}</td>
+  </tr>
+  <tr>
+    <td class="label">Nachname</td>
+    <td>${c.uo.last_name}</td>
+  </tr>
+  <tr>
+    <td class="label">Telefon</td>
+    <td>${c.uo.telephone}</td>
+  </tr>
+  <tr>
+    <td class="label">Raumnummer</td>
+    <td>${c.uo.room}</td>
+  </tr>
+  <tr>
+    <td class="label">Filiale</td>
+    <td>${c.uo.branchoffice}</td>
+  </tr>
+</table>
+<h2>${_('adm_form_legend_login')}</h2>
+<table>
+  <tr>
+    <td class="label">Login</td>
+    <td>${c.uo.getLogin()}</td>
+  </tr>
+  <tr>
+    <td class="label">Passwort</td>
+    <td>${c.user_password}</td>
+  </tr>
+  <tr>
+    <td class="label">Rolle</td>
+    <td>${c.uo.role}</td>
+  </tr>
+  <tr>
+    <td class="label">Aktiviert</td>
+    <td>
+      % if c.uo.isActivated():
+        Ja
+      % else:
+        Nein
+      % endif
+    </td>
+  </tr>
+  <tr>
+    <td class="label">Bei Anmeldung neues Passwort verlangen</td>
+    <td>
+      % if c.uo.needsNewPass():
+        Ja
+      % else:
+        Nein
+      % endif
+    </td>
+  </tr>
+</table>
\ No newline at end of file

Added: trunk/waskaweb/templates/administration/overview_user.mako
===================================================================
--- trunk/waskaweb/templates/administration/overview_user.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/overview_user.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+  ${parent.buildNavipath()}
+  <li><a href="/administration">${_('adm_np_root')}</a></li>
+  <li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+</%def>
+
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+ ${_('adm_header_overview')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/administration/newUser">${self.buildIco()} ${_('adm_actions_link_newuser')}</a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+<table>
+  <tr>
+    <th>${_('adm_overview_tbl_header_lastname')}</th>
+    <th>${_('adm_overview_tbl_header_firstname')}</th>
+    <th>${_('adm_overview_tbl_header_actions')}</th>
+  </tr>
+  % for user in c.user_overview:
+  <tr>
+    <td>${user.last_name}</td>
+    <td>${user.first_name}</td>
+    <td>
+      <a href="/administration/showUser/${user.id}">Anzeigen</a>
+      <a href="/administration/deleteUser/${user.id}">Löschen</a>
+    </td>
+  </tr>
+  % endfor
+</table>

Added: trunk/waskaweb/templates/administration/reset_password.mako
===================================================================
--- trunk/waskaweb/templates/administration/reset_password.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/reset_password.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,12 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+	<li><a href="/administration/showUser">${_('adm_np_showuser')}</a></li>
+	<li><a href="#">${_('adm_np_resetpassword')}</a></li>
+</%def>
+<h1>${_('adm_header_resetpassword')}</h1>
+<p>Das Password für den Benutzer <strong>${c.uo.first_name} ${c.uo.last_name}</strong> wurde erfolgreich geändert.<br>Das neue Passwort lautet: <strong>${c.new_password}</strong></p>
+<p>Weiter zur <a href="/administration/overviewUser">Benutzerübersicht</a></p>

Added: trunk/waskaweb/templates/administration/settings.mako
===================================================================
--- trunk/waskaweb/templates/administration/settings.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/settings.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,12 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/settings">${_('adm_np_setting')}</a></li>
+</%def>
+<h1>${_('adm_header_settings')}</h1>
+<p>Hier werden Sie Einstellungen zur Synchrnisation vornehmen k&ouml;nnen.</p>
+<h2>${_('adm_header_synchronisation')}</h2>
+<form action="saveSync">
+<div id="waska_form">
+<div class="waska_formelement">

Added: trunk/waskaweb/templates/administration/show_settings.mako
===================================================================
--- trunk/waskaweb/templates/administration/show_settings.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/show_settings.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,66 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/showSettings">${_('adm_np_showsettings')}</a></li>
+</%def>
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('adm_header_showsettings')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<a href="/administration/editSettings">${self.buildIco()} ${_('adm_actions_link_editsettings')}</a>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<p>Hier können Sie die agenturweiten Einstellungen sehen.</p>
+<table>
+<tr>
+<td class="label">${_('adm_form_settings_kaname')}</td>
+  <td>${c.agency.conf.get('ka_name')}</td>
+</tr>
+<tr>
+  <td class="label">${_('adm_form_settings_fkz')}</td>
+  <td>${c.agency.conf.get('fkz')}</td>
+</tr>
+<tr>
+  <td class="label">${_('adm_form_settings_anontransfer')}</td>
+  <td>
+    % if c.agency.conf.get('anon_transfer') == 'on':
+      ${_('adm_form_settings_anontransfer_yes')}
+    % else:
+      ${_('adm_form_settings_anontransfer_no')}
+    % endif
+  </td>
+</tr>
+##<tr>
+##  <td class="label">${_('adm_form_settings_privacystatement')}</td>
+##  <td>
+##    % if c.agency.conf.get('ee_formular'):
+##      <a href="${h.url_for(action="viewPrivacyStatement")}" target="_blank">
+##        ${_('adm_form_settings_view_privacystatement')}
+##      </a>
+##    % else:
+##      --
+##    % endif
+##  </td>
+##</tr>
+##<tr>
+##  <td class="label">${_('adm_form_settings_aidplanstatement')}</td>
+##  <td>
+##    % if c.agency.conf.get('fp_formular'):
+##      <a href="${h.url_for(action="viewAidPlanStatement")}" target="_blank">
+##        ${_('adm_form_settings_view_aidplanstatement')}
+##      </a>
+##    % else:
+##      --
+##    % endif
+##  </td>
+##</tr>
+</table>

Added: trunk/waskaweb/templates/administration/show_user.mako
===================================================================
--- trunk/waskaweb/templates/administration/show_user.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/show_user.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,24 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/administration">${_('adm_np_root')}</a></li>
+	<li><a href="/administration/overviewUser">${_('adm_np_overview')}</a></li>
+	<li><a href="/administration/showUser/${c.uo.id}">${_('adm_np_showuser')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+ ${_('adm_header_showuser')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>	
+		<li> <a href="/administration/editUser/${c.uo.id}">${self.buildIco()} ${_('adm_actions_link_edituser')}</a> </li>
+		<li><a href="${h.url_for(controller='administration', action='overviewUser')}">${self.buildIco()} ${_('menu_adm_link_useroverview_back')}</a></li>
+		
+		
+	</ul>
+    </div>
+  </div>
+</div>
+<%include file="show_user_body.mako" />

Added: trunk/waskaweb/templates/administration/show_user_body.mako
===================================================================
--- trunk/waskaweb/templates/administration/show_user_body.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/show_user_body.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,61 @@
+<%!  import waskaweb.lib.filters as F %>
+<h2>${_('adm_form_legend_personal')}</h2>
+<table>
+  <tr>
+    <td class="label">Vorname</td>
+    <td>${c.uo.first_name | F.NA, h}</td>
+  </tr>
+  <tr>
+    <td class="label">Nachname</td>
+    <td>${c.uo.last_name | F.NA, h}</td>
+  </tr>
+  <tr>
+    <td class="label">Telefon</td>
+    <td>${c.uo.telephone | F.NA, h}</td>
+  </tr>
+  <tr>
+    <td class="label">Raumnummer</td>
+    <td>${c.uo.room | F.NA, h}</td>
+  </tr>
+  <tr>
+    <td class="label">Filiale</td>
+    <td>${c.uo.branchoffice | F.NA, h}</td>
+  </tr>
+  <tr>
+    <td class="label">Vertreter</td>
+    <td>${c.vuo.first_name | F.NA, h} ${c.vuo.last_name | F.NA, h}</td>
+  </tr>
+</table>
+<h2>${_('adm_form_legend_login')}</h2>
+<table>
+  <tr>
+    <td class="label">Login</td>
+    <td>${c.uo.getLogin()}</td>
+  </tr>
+  <tr>
+    <td class="label">Rolle</td>
+    <td>${c.uo.getRole()}</td>
+  </tr>
+  % if h.hasRole(['admin_ka']):
+  <tr>
+    <td class="label">Aktiviert</td>
+    <td>
+      % if c.uo.isActivated():
+        Ja
+      % else:
+        Nein
+      % endif
+    </td>
+  </tr>
+  <tr>
+    <td class="label">Bei Anmeldung neues Passwort verlangen</td>
+    <td>
+      % if c.uo.needsNewPass():
+        Ja
+      % else:
+        Nein
+      % endif
+    </td>
+  </tr>
+  % endif
+</table>

Added: trunk/waskaweb/templates/administration/userform_body.mako
===================================================================
--- trunk/waskaweb/templates/administration/userform_body.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/administration/userform_body.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,56 @@
+## -*- coding: utf-8 -*-
+<div id="waska_form">
+<form action="/administration/saveUser" method="POST">
+	<fieldset><legend>${_('adm_form_legend_personal')}</legend>
+	<div class="waska_form_element w100">
+		<label
+		for="firstname">${_('adm_form_user_firstname')}</label><br>
+		<input type="text" class="field" id="firstname" name="firstname", value="${c.user.first_name}">
+	</div>
+	<div class="waska_form_element w100">
+		<label
+		for="lastname">${_('adm_form_user_lastname')}</label><br>
+		<input type="text" class="field" id="lasttname" name="lastname" value="${c.user.last_name}">
+	</div>
+	<div class="waska_form_element w100">
+		<label
+		for="telephone">${_('adm_form_user_telephone')}</label><br>
+		<input type="text" class="field" id="telephone" name="telephone" value="${c.user.telephone}">
+	</div>
+	</fieldset>
+	<fieldset><legend>${_('adm_form_legend_login')}</legend>
+	<div class="waska_form_element w100">
+        % if c.user.activated:
+          <input type="checkbox" checked  name="activated" id="activated">
+        % else:
+          <input type="checkbox" name="activated" id="activated">
+        % endif
+        <label for="activated">${_('adm_form_user_activated')}</label>
+	</div>
+	<div class="waska_form_element w100">
+        % if c.user.needs_passrefresh:
+          <input type="checkbox" checked name="newpass" id="newpass">
+        % else:
+          <input type="checkbox" name="newpass" id="newpass">
+        % endif
+        <label for="newpass">${_('adm_form_user_newpass')}</label>
+	</div>
+	<div class="waska_form_element w100">
+		<label
+		for="login">${_('adm_form_user_login')}</label><br>
+		<input type="text" class="field" id="login" name="login" value="${c.user.login}">
+	</div>
+	<div class="waska_form_element w50">
+		<label
+		for="passwd">${_('adm_form_user_passwd')}</label><br>
+		<input type="text" class="field" id="passwd" name="passwd">
+	</div>
+	<div class="waska_form_element w50">
+		<label
+		for="passwd2">${_('adm_form_user_passwd_confirm')}</label><br>
+		<input type="text" class="field" id="passwd2" name="passwd2">
+	</div>
+	</fieldset>
+	<input type="submit" value="${_('adm_form_user_submit')}">
+</form>
+</div>

Added: trunk/waskaweb/templates/appointments/appointment_form.mako
===================================================================
--- trunk/waskaweb/templates/appointments/appointment_form.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/appointment_form.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,34 @@
+<div id="appointment">
+<div id="waska_form">
+<!--${h.form(h.url(action='/appointment/save'), method='post')}-->
+<form action="/appointment/save" method="post">
+<div class="w25">
+	<label for="title">${_('app_form_label_title')}</label><br>
+	<input type="text" class="field" name="title" id="title">
+</div>
+<div class="w75">
+	<label for="date">${_('app_form_label_date')}</label><br>
+	<input type="text" class="field" name="date" id="date">
+</div>
+<div class="w100">
+	<label for="description">${_('app_form_label_description')}</label><br>
+	<textarea name="description" id="description"></textarea>
+</div>
+<div class="w25">
+	<label for="remind">${_('app_form_label_remind')}</label><br>
+	<select name="remind" id="remind">
+		<option value="1">${_('app_form_option_remind_oneday')}</option>
+		<option value="2">${_('app_form_option_remind_twoday')}</option>
+		<option value="3">${_('app_form_option_remind_threeday')}</option>
+		<option value="7">${_('app_form_option_remind_oneweek')}</option>
+		<option value="14">${_('app_form_option_remind_twoweek')}</option>
+		<option value="30">${_('app_form_option_remind_onemonth')}</option>
+	</select>
+</div>
+% if c.case_id:
+	<input type="hidden" name="case_id" value="${c.case_id}">
+% endif
+${h.submit(_('app_form_new_submit'))}
+${h.end_form()}
+</div>
+</div>
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_1.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_1.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_1.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,37 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment/show/1">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['cm_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='waska')}">${self.buildIco()} ${_('sm_menu_link_home_back')}
+            </a>
+          </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>07.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Akte pr&#252;fen</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Akte von Herrn Bauer pr&#252;fen und F&#246;rderma&#223;nahmen beraten.</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_10.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_10.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_10.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/show/10">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['admin_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview_back')}
+	    </a>
+	  </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>24.91.2008</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Passw&#246;rter &#228;ndern</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Die Passw&#246;rter der Case-Manager sollten ge&#228;ndert werden</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_2.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_2.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_2.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,37 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment/show/2">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['cm_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='waska')}">${self.buildIco()} ${_('sm_menu_link_home_back')}
+            </a>
+          </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>17.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Auswertung Fallakten vorbereiten</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Aktens&#228;tze auf Vollst&#228;ndigkeit pr&#252;fen. Fehlende Informationen einholen</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_3.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_3.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_3.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,35 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment/show/3">${_('app_np_show')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='waska')}">${self.buildIco()} ${_('sm_menu_link_home_back')}
+            </a>
+          </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>21.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Weihnachtsfeier</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Feier auf dem Weihnachtsmarkt. Treffpunkt: 16 Uhr am Haupteingang der Kompetenzagentur. </td>
+	</tr>
+</tbody></table>

Added: trunk/waskaweb/templates/appointments/beta/show_4.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_4.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_4.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,37 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment/show/4">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['admin_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='waska')}">${self.buildIco()} ${_('sm_menu_link_home_back')}
+            </a>
+          </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>10.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Waska-Zugang f&#252;r Frau Maier</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Frau Maier wird am 11.12.07 die Arbeit bei uns aufnehmen. Zugang einrichten. Name: Maier Vorname:Anna Anmeldekennung: anna.maier</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_5.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_5.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_5.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/show/5">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['cm_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview_back')}
+	    </a>
+	  </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>07.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Akte pr&#252;fen</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Akte von Herrn Bauer pr&#252;fen und F&#246;rderma&#223;nahmen beraten.</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_6.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_6.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_6.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/show/6">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['cm_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview_back')}
+	    </a>
+          </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>17.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Auswertung Fallakten vorbereiten</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Aktens&#228;tze auf Vollst&#228;ndigkeit pr&#252;fen. Fehlende Informationen einholen</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_7.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_7.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_7.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,36 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/show/7">${_('app_np_show')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview_back')}
+	    </a>
+	  </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>21.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Weihnachtsfeier</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Feier auf dem Weihnachtsmarkt. Treffpunkt: 16 Uhr am Haupteingang der Kompetenzagentur. </td>
+	</tr>
+</tbody></table>

Added: trunk/waskaweb/templates/appointments/beta/show_8.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_8.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_8.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/show/8">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['admin_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview_back')}
+	    </a>
+	  </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>10.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Waska-Zugang f&#252;r Frau Maier</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Frau Maier wird am 11.12.07 die Arbeit bei uns aufnehmen. Zugang einrichten. Name: Maier Vorname:Anna Anmeldekennung: anna.maier</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/beta/show_9.mako
===================================================================
--- trunk/waskaweb/templates/appointments/beta/show_9.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/beta/show_9.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,38 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/show/9">${_('app_np_show')}</a></li>
+</%def>
+% if h.hasRole(['cm_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview_back')}
+	    </a>
+	  </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>14.01.2008</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Gespr&#228;ch mit Peter Koch</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Um 15 Uhr kommt Peter Koch in die Kompetenzagentur. Gespr&#228;ch &#252;ber die F&#246;rderma&#223;nahme von Herrn Maier.</td>
+	</tr>
+</tbody></table>
+% endif
\ No newline at end of file

Added: trunk/waskaweb/templates/appointments/dialogs/confirm.mako
===================================================================
--- trunk/waskaweb/templates/appointments/dialogs/confirm.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/dialogs/confirm.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/appointment">Termine</a></li>
+	<li><a href="/appointment/overview">Termine &Uuml;bersicht</a></li>
+	<li><a href="#">Termin L&ouml;schen</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/appointments/dialogs/notificate_delete_appointment.mako
===================================================================
--- trunk/waskaweb/templates/appointments/dialogs/notificate_delete_appointment.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/dialogs/notificate_delete_appointment.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,9 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/appointment">Termine</a></li>
+	<li><a href="/appointment/overview">Termine &Uuml;bersicht</a></li>
+	<li><a href="#">Termin L&ouml;schen</a></li>
+</%def>
+<%include file="../../dialogs/notification.mako" />

Added: trunk/waskaweb/templates/appointments/new.mako
===================================================================
--- trunk/waskaweb/templates/appointments/new.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/new.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,20 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/new/">${_('app_np_new')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('cm_app_header_new')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview_back')}
+	    </a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+<%include file="appointment_form.mako" />

Added: trunk/waskaweb/templates/appointments/overview.mako
===================================================================
--- trunk/waskaweb/templates/appointments/overview.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/overview.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,30 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment">${_('app_np_root')}</a></li>
+	<li><a href="/appointment/overview">${_('app_np_list')}</a></li>
+</%def>
+% if h.hasRole(['admin_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('app_header_overview')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/appointment/create">${self.buildIco()} ${_('app_actions_link_newappointment')}</a></li>
+            </a>
+	</ul>
+    </div>
+  </div>
+</div>
+% endif
+% if h.hasRole(['cm_ka']):
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('app_header_overview')}
+  </div>
+</div>
+<p>Hier wird eine Auflistung aller Termine angezeigt. Termine sind Benutzern oder Fallakten zugeordnet.</p> 
+% endif
+<%include file="overview_body.mako" />

Added: trunk/waskaweb/templates/appointments/overview_body.mako
===================================================================
--- trunk/waskaweb/templates/appointments/overview_body.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/overview_body.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,89 @@
+## -*- coding: utf-8 -*-
+<table>
+	<tr>
+		<th width="100">${_('app_overview_tbl_header_date')}</th>
+		<th>${_('app_overview_tbl_header_desc')}</th>
+		<th>${_('app_overview_tbl_header_actions')}</th>
+	</tr>
+% if h.hasRole(['cm_ka']):
+<!-- appointments for cm -->
+	<tr>
+		<td>07.12.2007</td>
+		<td>Akte pr&#252;fen </td>
+		<td>
+			<a href="#">Anzeigen</a>
+			<a href="#">Löschen</a>
+		</td>
+	</tr>
+	<tr>
+		<td>17.12.2007</td>
+		<td>Auswertung Fallakten vorbereiten</td>
+		<td>
+			<a href="#">Anzeigen</a>
+			<a href="#">Löschen</a>
+		</td>
+	</tr>
+	<tr>
+		<td>21.12.2007</td>
+		<td>Weihnachtsfeier</td>
+		<td>
+			<a href="#">Anzeigen</a>
+		</td>
+	</tr>
+	<tr>
+		<td>14.01.2008</td>
+		<td>Gespr&#228;ch mit Peter Koch</td>
+		<td>
+			<a href="#">Anzeigen</a>
+			<a href="#">Löschen</a>
+		</td>
+	</tr>
+% endif
+% if h.hasRole(['admin_ka']): 
+<!-- appointments for admin -->
+	<tr>
+		<td>21.12.2007</td>
+		<td>Weihnachtsfeier</td>
+		<td>
+			<a href="/appointment/show/7">Anzeigen</a>
+			<a href="/appointment/delete/7">Löschen</a>
+		</td>
+	</tr>
+% endif
+
+<!-- appointments for adm, admin, cm -->
+</table>
+<!--
+<table>
+  <tr>
+    <th width="100">${_('app_overview_tbl_header_date')}</th>
+    <th>${_('app_overview_tbl_header_desc')}</th>
+    <th>${_('app_overview_tbl_header_actions')}</th>
+  </tr>
+  % for a in c.appointments:
+  <tr>
+    <td>${a.date}</td>
+    <td>${a.title}</td>
+    <td>
+      <a href="${h.url_for(controller='appointment', action='show', id=a.id)}">Anzeigen</a>
+      % if a.global_app:
+          % if h.hasRole(['admin_ka']):
+	      <a href="${h.url_for(controller='appointment', action='delete', id=a.id)}">Löschen</a>
+          % endif
+      % else:
+          % if h.hasRole(['cm_ka']):
+	      <a href="${h.url_for(controller='appointment', action='delete', id=a.id)}">Löschen</a>
+          % endif
+      % endif
+    </td>
+  </tr>
+  % endfor
+  % if len(c.appointments) <= 0:
+  <tr>
+    <td colspan="3">
+      Es wurden keine Termine gefunden.
+    </td>
+  </tr>
+  % endif
+</table>
+-->

Added: trunk/waskaweb/templates/appointments/show.mako
===================================================================
--- trunk/waskaweb/templates/appointments/show.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/appointments/show.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,36 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/appointment"></a>${_('app_np_root')}</li>
+	<li><a href="/appointment/show/"></a>${_('app_np_show')}</li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('app_header_show')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='waska')}">${self.buildIco()} ${_('sm_menu_link_home_back')}
+            </a>
+          </li>
+	</ul>
+    </div>
+  </div>
+</div>
+
+<!-- Fake table -->
+<table>
+	<tbody><tr>
+		<td class="label">Datum</td>
+		<td>07.12.2007</td>
+	</tr>
+	<tr>
+		<td class="label">Titel</td>
+		<td>Wiedervorlage Akte</td>
+	</tr>
+	<tr>
+		<td class="label">Beschreibung</td>
+		<td>Akte von Herrn Bauer vorlegen und F&#246;rderma&#223;nahmen beraten.</td>
+	</tr>
+</tbody></table>

Added: trunk/waskaweb/templates/casemanagement/appointments.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/appointments.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/appointments.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,25 @@
+<%inherit file="main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	        <li><a href="/case/select/${session.get('case_id')}/1">${_('cm_np_select')}</a></li>
+		<li><a href="/case/appointments/${session.get('case_id')}">${_('app_np_list')}</a></li>
+</%def>
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+ ${_('app_header_overview')}
+  </div>
+<!--
+% if h.hasRole(['cm_ka']):
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/case/newAppointment">${self.buildIco()} ${_('app_actions_link_newappointment')}</a></li>
+	</ul>
+    </div>
+  </div>
+	% endif
+-->
+</div>
+
+<%include file="../appointments/overview_body.mako" />

Added: trunk/waskaweb/templates/casemanagement/create_export_scheme.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/create_export_scheme.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/create_export_scheme.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,4 @@
+<%inherit file="../main.mako" />
+<h1>${_('cm_header_export_createscheme')}</h1>
+<p>Hier werden Sie festlegen k&ouml;nnen welche Teile der Akte exportiert
+werden sollen.</p>

Added: trunk/waskaweb/templates/casemanagement/dialogs/alert.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/alert.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/dialogs/alert.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/">${_('cm_np_root')}</a></li>
+	<li><a href="#">${_('cm_np_new')}</a></li>
+</%def>
+<%include file="../../dialogs/alert.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/confirm.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/confirm.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/dialogs/confirm.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/">${_('cm_np_root')}</a></li>
+	<li><a href="#">${_('cm_np_delete')}</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/">${_('cm_np_root')}</a></li>
+	<li><a href="/case/import/">${_('cm_np_import')}</a></li>
+</%def>
+<%include file="../../dialogs/notification.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/notificate_printall.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/notificate_printall.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/dialogs/notificate_printall.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/">${_('cm_np_root')}</a></li>
+</%def>
+<%include file="../../dialogs/notification.mako" />

Added: trunk/waskaweb/templates/casemanagement/digest.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/digest.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/digest.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,54 @@
+<%inherit file="main.mako" />
+<%!  import waskaweb.lib.filters as F %>
+<%def name="buildNavipath()">
+      	${parent.buildNavipath()}
+	<li><a href="/case/select/${session.get('case_id')}/1">${_('cm_np_select')}</a></li>
+	<li><a href="/case/digest/${session.get('case_id')}">${_('cm_np_digest')}</a></li>
+</%def>
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('cm_header_digest')}
+  </div>
+</div>
+<p>Hier wird eine Zusammenfassung der Fallakte angezeigt. Diese
+Zusammenfassung besteht aus einer Zusammenstellung verschiedener Felder aus
+dem Fallaktenformular</p> 
+<h2>${_('cm_header_digest_personal')}</h2>
+<table>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_lastname')}</td>
+		<td>${c.digest.last_name | F.NA, h}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_firstname')}</td>
+		<td>${c.digest.first_name | F.NA, h}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_caseid')}</td>
+		<td>${c.digest.knr | F.NA, h}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_age')}</td>
+		<td>${c.digest.age | F.NA, h}</td>
+	</tr>
+</table>
+<h2>${_('cm_digest_header_address')}</h2>
+<table>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_street')}</td>
+		<td>${c.digest.address | F.NA, h}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_plz')}</td>
+		<td>${c.digest.plz | F.NA, h}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_city')}</td>
+		<td>${c.digest.city | F.NA, h}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_digest_tbl_label_telephone')}</td>
+		<td>(${c.digest.telephone_1 | F.NA, h}) ${c.digest.telephone_2 | F.NA, h}</td>
+	</tr>
+</table>

Added: trunk/waskaweb/templates/casemanagement/evaluation.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/evaluation.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/evaluation.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case">${_('cm_np_root')}</a></li>
+	<li><a href="/case/evaluate/">${_('cm_np_evaluate')}</a></li>
+</%def>
+<h1>${_('cm_header_evaluate')}</h1>
+<p><a href="/evaluate/evaluate">${_('cm_actions_link_evaluate')}</a></p>

Added: trunk/waskaweb/templates/casemanagement/evaluation_result.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/evaluation_result.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/evaluation_result.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,188 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case">${_('cm_np_root')}</a></li>
+	<li><a href="/case/evaluate/">${_('cm_np_evaluate')}</a></li>
+	<li><a href="/evaluate/evaluate/">${_('cm_np_evaluate_result')}</a></li>
+</%def>
+<h1><a name="top">${_('cm_header_evaluate_result')}</a></h1>
+<ul>
+  <li><a href="#eval_1">1. Verhältnis Beratungskunden/Aufnahmen in das CM</a></li>
+  <li><a href="#eval_2">2. Verweildauer im CM</a></li>
+  <li><a href="#eval_3">3. Alters- und Geschlechterstruktur in %</a></li>
+  <li><a href="#eval_4">4. Migrationshintergrund</a></li>
+  <li><a href="#eval_5">5. Zugang zur Kompetenzagentur</a></li>
+  <li><a href="#eval_6">6. F&ouml;rderbedarf</a></li>
+  <li><a href="#eval_7">7. Vermittlung</a></li>
+</ul>
+<!--
+<div class="actions">
+<ul>
+  <li><a href="/evaluate/exportEvaluation_1">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_10">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_2">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_8">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_3">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_4">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_5">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_6">${_('cm_actions_link_export_evaluate')}</a></li>
+  <li><a href="/evaluate/exportEvaluation_9">${_('cm_actions_link_export_evaluate')}</a></li>
+</ul>
+</div>
+-->
+<div class="evaluation odd-row first-row">
+<h3><a name="eval_1">1. Anzahl der Beratungskunden, davon % ins CM aufgenommen</a></h3>
+<table class="evaluation">
+  <tr>
+    <td class="label">Beratungskunden</td>
+    <td width="50px">${c.eval_1_total}</td>
+    <td width="100px">(100%)</td>
+    <td></td>
+  </tr>
+  <tr>
+    <td class="label">Ins CM übernommen</td>
+    <td>${c.eval_1_cm}</td>
+    <td>(${c.eval_1_percent}%)</td>
+    <td></td>
+  </tr>
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_1/auswertung_1.csv">Auswertung exportieren</a>
+</div>
+<div class="evaluation even-row"> 
+<h3><a name="eval_2">2. Anzahl der Jugendlichen im CM, davon % abgeschlossen nach durchschnittlich x Monaten</a></h3>
+<table class="evaluation">
+  <tr>
+    <th>Monat</th>
+    <th width="150px">Abgeschlossen</th>
+    <th width="150px">Abgebrochen</th>
+    <th></th>
+  </tr>
+  % for r in c.eval_10:
+  <tr>
+    <td class="label">${r[0]}</td>
+    <td>${r[1]} (${r[2]}%)</td>
+    <td>${r[3]} (${r[4]}%)</td>
+    <td></td>
+  </tr>
+  % endfor
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_10/auswertung_10.csv">Auswertung exportieren</a>
+</div>
+<div class="evaluation odd-row">
+<h3><a name="eval_3">3. Alters- und Geschlechterstruktur in %</a></h3>
+<h4>Angaben zur Geschlechterstruktur </h4>
+<table class="evaluation">
+  <tr>
+    <td class="label">Männlich</td>
+    <td width="50px">${c.eval_2_m[0]}</td>
+    <td width="100px">(${c.eval_2_m[1]}%)</td>
+    <td></td>
+  </tr>
+  <tr>
+    <td class="label">Weiblich</td>
+    <td>${c.eval_2_w[0]}</td>
+    <td width="100px">(${c.eval_2_w[1]}%)</td>
+    <td></td>
+  </tr>
+  <tr>
+    <td class="label">Intersexuell</td>
+    <td>${c.eval_2_i[0]}</td>
+    <td width="100px">(${c.eval_2_i[1]}%)</td>
+    <td></td>
+  </tr>
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_2/auswertung_2.csv">Auswertung exportieren</a>
+<h4>Angaben zur Altersverteilung</h4>
+<table class="evaluation">
+% for v in c.eval_8:
+  <tr>
+    <td class="label">${v[0]}</td>
+    <td width="50px">${v[1]}</td>
+    <td width="100px">${v[2]}%</td>
+  <td></td>
+  </tr>
+% endfor
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_8/auswertung_8.csv">Auswertung exportieren</a>
+</div>
+<div class="evaluation even-row">
+<h3><a name="eval_4">4. Migrationshintergrund in % (Staatsangehörigkeit nicht Deutsch oder Mutter/Vater nicht in Deutschland geboren)</a></h3>
+<table class="evaluation">
+  <tr>
+    <td class="label">Migrations- Hintergrund</td>
+    <td width="50px">${c.eval_3[0]}</td>
+    <td width="100px">(${c.eval_3[1]}%)</td>
+    <td></td>
+  </tr>
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_3/auswertung_3.csv">Auswertung exportieren</a>
+</div>
+<div class="evaluation odd-row">
+<h3><a name="eval_5">5. Angaben zum Zugang des Jugendlichen zur Kompetenzagentur in %</a></h3>
+<h4>Zugang des Jugendlichen zur Kompetenzagentur in %</h4>
+<table class="evaluation">
+% for r in c.eval_4.itervalues():
+  <tr>
+    <td class="label">${r[0]}</td>
+    <td width="50px">${r[1]}</td>
+    <td width="100px">(${r[2]}%)</td>
+    <td></td>
+  </tr>
+% endfor 
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_4/auswertung_4.csv">Auswertung exportieren</a>
+<h4>Rechtskreis der Jugendlichen beim Zugang zur Kompetenzagentur in %</h4>
+<table class="evaluation">
+% for r in c.eval_5.itervalues():
+  <tr>
+    <td class="label">${r[0]}</td>
+    <td width="50px">${r[1]}</td>
+    <td width="100px">(${r[2]}%)</td>
+    <td></td>
+  </tr>
+% endfor 
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_5/auswertung_5.csv">Auswertung exportieren</a>
+</div>
+<div class="evaluation even-row">
+<h3><a name="eval_6">6. F&ouml;rderbedarf in % nach den vier Bereichen 4.2.1 - 4.2.4</a></h3>
+<table class="evaluation">
+% for r in c.eval_9:
+  <tr>
+    <td class="label">${r[0]}</td>
+    <td width="50px">${r[1]}</td>
+    <td width="100px">(${r[2]}%)</td>
+    <td></td>
+  </tr>
+% endfor 
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_9/auswertung_9.csv">Auswertung exportieren</a>
+</div>
+<div class="evaluation odd-row">
+<h3><a name="eval_7">7. Angaben zur Vermittlung der Jugendlichen</a></h3>
+<h4>Wohin wurden die Jugendlichen vermittlelt?</h4>
+<table class="evaluation">
+% for r in c.eval_6.itervalues():
+  <tr>
+    <td class="label">${r[0]}</td>
+    <td width="50px">${r[1]}</td>
+    <td width="100px">(${r[2]}%)</td>
+    <td></td>
+  </tr>
+% endfor 
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_6/auswertung_6.csv">Auswertung exportieren</a>
+<h4>Angaben zur Ver&auml;nderung des Rechtskreises nach der Vermittlung</h4>
+<table class="evaluation">
+% for r in c.eval_7.itervalues():
+  <tr>
+    <td class="label">${r[0]}</td>
+    <td width="50px">${r[1]}</td>
+    <td width="100px">(${r[2]}%)</td>
+    <td></td>
+  </tr>
+% endfor 
+</table>
+<a href="#top">Zur Ãœbersicht</a> | <a href="/evaluate/exportEvaluation_7/auswertung_7.csv">Auswertung exportieren</a>
+</div>

Added: trunk/waskaweb/templates/casemanagement/export.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/export.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/export.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,15 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case">${_('cm_np_root<')}/a></li>
+	<li><a href="/case/export/">${_('cm_np_export')}</a></li>
+</%def>
+<h1>${_('cm_header_export')}</h1>
+<div class="actions">
+<ul>
+	<li>
+		<a href="/case/createExportScheme">${_('cm_actions_link_createexportscheme')}</a>
+	</li>
+</ul>
+</div>
+<p>Hier werden Sie eine Fallakte exportieren k&ouml;nnen.</p>

Added: trunk/waskaweb/templates/casemanagement/formular.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/formular.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/formular.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,86 @@
+## -*- coding: utf-8 -*-
+<%inherit file="main.mako" />
+<!--
+% if session.get("case_modus", "")  == "edit":
+<h1>${_('cm_header_form_edit')}</h1>
+% else:
+<h1>${_('cm_header_form_show')}</h1>
+% endif
+-->
+  ${self.buildFormErrors()}
+
+<!--
+<div class="actions">
+	<ul>
+                % if h.hasRole(['cm_ka']):
+                  % if session["case_modus"] == "edit":
+                    <li><a href="/case/show/${c.ds_id}/${c.page_id}">${_('cm_actions_link_show')}</a></li>
+                  % else:
+                    <li><a href="/case/edit/${c.ds_id}/${c.page_id}">${_('cm_actions_link_edit')}</a></li>
+                  % endif
+                % endif
+		<li><a href="/case/printout/${c.ds_id}/${c.page_id}/show" target="_blank">${_('cm_actions_link_printout')}</a></li>
+	</ul>
+</div>
+-->
+<div class="waska_form">
+<!-- Begin Form-->
+${c.formular}
+<!-- End Form -->
+</div>
+<div id="clearer" ></div>
+<%def name="buildNavipath()">
+      	${parent.buildNavipath()}
+	<li><a href="/case/select/${session.get('case_id')}/1" onclick="return checkModification();">${_('cm_np_select')}</a></li>
+	<li><a href="/case/${session['case_modus']}/${c.ds_id}/${c.page_id}" onclick="return checkModification();">${h.getFormularName(c.page_id)}</a></li>
+</%def>
+
+<%def name="buildFormErrors()">
+  % if len(h.getFormularErrors(c.page_id)) > 0:
+  <div class="form_errors">
+    <a name="error_list"><h1>Fehlerhafte Formulareingabe</h1></a>
+    <ul>
+    % for key, error in h.getFormularErrors(c.page_id).iteritems():
+      <li><a href="#${key}">${error.getName()}</a>:  ${"<br>".join(error.getMessages())}</a></li>
+    % endfor
+    </ul>
+  </div>
+  % endif
+</%def>
+
+
+<%def name="buildUeberschrift()">
+% if len(h.getFormularHeaders(c.page_id)) > 0:
+ <div id="content_header">
+<div id="content_ueberschrift">
+<ul>
+   % for header in h.getFormularHeaders(c.page_id):
+   <li id="first_level_header"><h1>${header} </h1></li>
+   % endfor
+</ul>
+</div>
+% endif
+</%def>
+
+<%def name="buildModusfield()">
+  <div id="modusfield">
+  <div class="actions">
+    <ul>
+      % if c.show_form_actions:
+        % if h.hasRole(['cm_ka']):
+          % if session["case_modus"] == "edit":
+            <li><a href="/case/show/${c.ds_id}/${c.page_id}" onclick="return checkModification();">${self.buildIco()} ${_('cm_actions_link_show')}</a></li>
+          % else:
+            <li><a href="/case/edit/${c.ds_id}/${c.page_id}" onclick="return checkModification();">${self.buildIco()} ${_('cm_actions_link_edit')}</a></li>
+          % endif
+        % endif
+      % endif
+      % if c.print_form:
+        <li><a href="${h.getPrintUrl(c.print_form, c.ds_id, c.page_id)}" target="_blank" onclick="return checkModification();">${self.buildIco()} ${_('cm_actions_link_printout')}</a></li>
+      % endif
+    </ul>
+  </div>
+</div>
+</div>
+</%def>
+

Added: trunk/waskaweb/templates/casemanagement/help.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/help.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/help.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,4 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main_login.mako" />
+<h1>Hilfe zum Fallakten-Formular</h1>
+<p>${c.helpdata}</p>

Added: trunk/waskaweb/templates/casemanagement/main.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/main.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/main.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,90 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%!  import waskaweb.lib.filters as F %>
+${next.body()}
+
+<%def name="buildNavipath()">
+  ${parent.buildNavipath()}
+  <li><a href="/case/" onclick="return checkModification();">${_('cm_np_root')}</a></li>
+  <li><a href="/case/overview/" onclick="return checkModification();">${_('cm_np_overview')}</a></li>
+</%def>
+  
+<%def name="buildModusfield()">
+</%def>
+
+<%def name="buildInfofield()">
+  <div id="infofield">
+    <strong>${_('cm_info_name')}:</strong>
+       ${session.get('case_first_name', "") | F.NA, h} 
+       ${session.get('case_last_name', "")  | F.NA, h}<br>
+    <strong>${_('cm_info_nr')}:</strong> ${session.get('case_nr', "") | F.NA, h}
+  </div>
+</%def>
+
+
+
+<%def name="buildPrivacyfield()">
+  % if h.hasRole(['cm_ka']) and not session.get('case_hasStatement'):
+   <div class="menu">
+     <h1>Datenschutz</h1>
+       <div class="actions">
+          <div id="marked">
+	  <ul>
+	  <li><a href="/statement/printPrivacyStatement/${session.get('case_id', None)}" target="_blank" onclick="return checkModification();">${self.buildIco()} Erkl&#228;rung drucken</a></li>
+          <li><a href="/statement/setPrivacyStatement/${session.get('case_id', None)}" onclick="return checkModification();">${self.buildIco()} Erkl&#228;rung setzen</a></li>
+	  </ul>
+	  </div>
+       </div>
+  </div>
+  % endif
+</%def>
+
+<%def name="buildNavigation()">
+    <div class="menu">
+      <h1>${_('cm_menu_header_cases')}</h1>
+      <div class="actions">
+	
+          % if h.hasRole(['cm_ka', 'admin_ka']):
+		${self.buildInfofield()}
+	<ul>
+          <li><a href="${h.url_for(controller='/case', action='overview')}" onclick="return checkModification();">${self.buildIco()} ${_('cm_menu_link_close')}</a></li>
+	  <li><a href="/case/printAll/${session.get('case_id', None)}" onclick="return checkModification();">${self.buildIco()} ${_('cm_menu_link_print')}</a></li>
+          % endif
+        </ul>
+      </div>
+    </div>
+     <div class="menu">
+      <h1>${_('cm_menu_header_seperator')}</h1>
+      <div class="actions">
+        <ul>
+          <li><a href="/case/digest/${session.get('case_id', None)}" onclick="return checkModification();">${self.buildIco()} ${_('cm_menu_link_digest')}</a></li>
+          % if h.hasRole(['cm_ka', 'admin_ka']):
+          <li><a href="/case/organisation/${session.get('case_id', None)}" onclick="return checkModification();">${self.buildIco()} ${_('cm_menu_link_organisation')}</a></li>
+          <li><a href="/case/appointments/${session.get('case_id', None)}" onclick="return checkModification();">${self.buildIco()} ${_('cm_menu_link_appointment')}</a></li>
+          <li><a href="/case/documents/${session.get('case_id', None)}" onclick="return checkModification();">${self.buildIco()} ${_('cm_menu_link_documents')}</a></li>
+          % endif
+        </ul>
+      </div>
+    </div>
+    <div class="menu">
+      <h1>${_('cm_menu_header_structure')}</h1>
+      ${c.form_navigation}
+    </div>
+   </div>
+  </div>
+</%def>
+
+
+<%def name="buildUeberschrift()">
+</%def>
+
+
+
+
+
+
+
+
+
+
+

Added: trunk/waskaweb/templates/casemanagement/new.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/new.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/new.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,43 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+		<li><a href="/case/">${_('cm_np_root')}</a></li>
+		<li><a href="/case/">${_('cm_np_new')}</a></li>
+</%def>
+<div class="waska_form">
+<form id="waska_form" action="/case/newAction" accept-charset="UTF-8" name="waska_form" method="POST">
+<h1>Neue Fallakte anlegen</h1>
+<div class="waska_form_element w50">
+<label for="vorname_1">Vorname:</label>
+<input class="field" type="text" size="50" maxlength="60" name="vorname_1" id="vorname_1" value="${session.get('case_first_name', "")}"> 
+</div>
+<div class="waska_form_element w50">
+<label for="name_1">Name:</label>
+<input class="field" type="text" size="50" maxlength="60" name="name_1" id="name_1" value="${session.get('case_last_name', "")}">
+</div>
+<div class="waska_form_element w100">
+<label for="strasse">Strasse:</label>
+<input class="field" type="text" size="50" maxlength="60" name="strasse" id="strasse" value="${session.get('case_address', "")}">
+</div>
+<div class="waska_form_element w25">
+<label for="plz">PLZ:</label>
+<input class="field" type="text" size="50" maxlength="60" name="plz" id="plz" value="${session.get('case_plz', "")}">
+</div>
+<div class="waska_form_element w75">
+<label for="wohnort">Ort:</label>
+<input class="field" type="text" size="50" maxlength="60" name="wohnort" id="wohnort" value="${session.get('case_city', "")}">
+</div>
+<div style="padding: 1em 0;">
+<p>Bitte beachten Sie, dass die Einverständniserklärung die Grundlage zur Erfassung personenbezogener Daten ist. Klicken Sie hierzu auf die Auswahl "Erklärung drucken". Bitte nutzen Sie den "Zurück"-Knopf Ihres Browsers, um nach dem Drucken auf diese Seite zurückzukehren.
+</p>
+</div>
+<div class="waska_form_element w100">
+<input type="checkbox" name="statement_signed"><label for="statement">Die Einwilligungserklärung für die Erfassung, Verarbeitung und Nutzung personenbezogener Daten wurde bereits zur Eingangsamnese bzw. Beratung vor dem Case Management eingeholt.</label></div>
+<div class="input_space">
+<input type="hidden" name="page" value="page_1"> 
+<input type="submit" value="Erklärung drucken" name="print">
+<input type="submit" value="Fallakte anlegen" name="save">
+</div>
+</form>
+</div>

Added: trunk/waskaweb/templates/casemanagement/new_appointment.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/new_appointment.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/new_appointment.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,22 @@
+<%inherit file="main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case/select/${session.get('case_id')}/1">${_('cm_np_select')}</a></li>
+	<li><a href="/case/appointments">${_('app_np_root')}</a></li>
+	<li><a href="/case/newAppointment/">${_('app_np_new')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('cm_app_header_new')}: ${c.case_id}
+  </div>
+% if h.hasRole(['cm_ka']):
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/case/appointments/${session.get('case_id', None)}">${self.buildIco()} ${_('cm_menu_link_appointment_back')}</a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+% endif
+<%include file="../appointments/appointment_form.mako" />

Added: trunk/waskaweb/templates/casemanagement/organisation.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/organisation.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/organisation.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,73 @@
+<%inherit file="main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case/select/${session.get('case_id')}/1">${_('cm_np_select')}</a></li>
+	<li><a href="/case/organisation/${session.get('case_id')}">${_('cm_np_organisation')}</a></li>
+</%def>
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('cm_header_organisation')}
+  </div>
+</div>
+<p>Diese Seite zeigt an, wer der Mitarbeiter dieser Fallakte ist und wer die
+Vertretung f&uuml;r die Bearbeitung &uuml;bernimmt.</p>
+<h2>${_('cm_header_organisation_editor')}</h2>
+<table>
+	<tr>
+		<td class="label">${_('cm_organisation_tbl_label_lastname')}</td><td>${c.editor.last_name}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_organisation_tbl_label_firstname')}</td><td>${c.editor.first_name}</td>
+	</tr>
+	<tr>
+		<td class="label">${_('cm_organisation_tbl_label_telephone')}</td><td>${c.editor.telephone}</td>
+	</tr>
+</table>
+% if h.hasRole(['admin_ka']):
+<form action="${h.url_for(controller="case", action="setEditorAction")}" method="POST">
+<input type="hidden" name="case_id" value="${session.get('case_id')}">
+<select name="editor">
+% for user in c.user_list:
+  <option value="${user.id}">${user.first_name} ${user.last_name}</option>
+% endfor
+</select>
+<input type="submit" value="${_('cm_form_editor_submit')}">
+</form>
+% endif
+<h2>${_('cm_header_standin')}</h2>
+% if (h.hasRole(['admin_ka']) or (c.current_user.id == c.editor.id)):
+<form action="${h.url_for(controller="case", action="setStandinAction")}" method="POST">
+<input type="hidden" name="case_id" value="${session.get('case_id')}">
+<table>
+  <tr>
+    <th width="15"></th>
+    <th>Bearbeiter</th>
+  </tr>
+  % for user in c.user_list:
+  <tr>
+    % if user.id in c.standin_list:
+    <td><input type="checkbox" name="standin-${user.id}" value="${user.id}" checked></td>
+    % else:
+    <td><input type="checkbox" name="standin-${user.id}" value="${user.id}"></td>
+    % endif
+    <td>${user.first_name}, ${user.last_name}</td>
+  </tr>
+  % endfor
+</table>
+<input type="submit" value="${_('cm_form_standin_submit')}">
+</form>
+% else:
+<table>
+  <tr>
+    <th>Bearbeiter</th>
+  </tr>
+  % for user in c.user_list:
+    % if user.id in c.standin_list:
+    <tr>
+      <td>${user.first_name}, ${user.last_name}</td>
+    </tr>
+    % endif
+  % endfor
+</table>
+% endif

Added: trunk/waskaweb/templates/casemanagement/overview.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/overview.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/overview.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,85 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%!  import waskaweb.lib.filters as F %>
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case">${_('cm_np_root')}</a></li>
+        <li><a href="/case/overview/">${_('cm_np_overview')}</a></li>
+</%def>
+<h1>${_('cm_header_overview')}</h1>
+<p>Hier wird eine Auflistung der F&auml;lle des angemeldeten Benutzers
+angezeigt</p>
+<h2>${_('cm_header_search')}</h2>
+<div class="waska_form">
+<form name="case_search" action="/case/search/">
+<input type="text" size="40" name="search_str">
+<input type="submit" value="${_('cm_form_overview_search_submit')}">
+</form>
+</div>
+<div class="waska_form">
+${h.form(h.url(action='bundle'), method='post')}
+<table>
+	<tr>
+		<!--B1114 <th width="25"></th> -->
+		<th>${_('cm_overview_tbl_header_id')}</th>
+		<th>${_('cm_overview_tbl_header_firstname')}</th>
+		<th>${_('cm_overview_tbl_header_lastname')}</th>
+		<th>${_('cm_overview_tbl_header_actions')}</th>
+	</tr>
+	<!--<tr>
+		<td>${h.check_box('case', value='1')}</td>
+		<td>KA_OS-0815</td>
+		<td>Meier</td>
+		<td>Franz</td>
+		<td>
+			<a href="/case/digest">
+                          <img src="/images/icons/view.png" class="action">
+                        </a>
+			<a href="/case/delete/1">
+                          <img src="/images/icons/trash.png" class="action">
+                        </a> 
+		</td>
+	</tr>-->
+        % for case in c.cases.getDatasets():
+	<tr>
+		<!--B1114 <td><input type="checkbox" name="case_id" value="${case.id}"></td>-->
+		<td>${case.knr       | F.NA, h}</td>
+		<td>${case.first_name| F.NA, h}</td>
+		<td>${case.last_name | F.NA, h}</td>
+		<td>
+			<a href="/case/select/${case.id}/0/">Anzeigen</a> 
+                        % if h.hasRole('admin_ka'):
+			<a href="/case/delete/${case.id}/0/">Löschen</a> 
+                        % endif
+		</td>
+	</tr>
+        % endfor
+        % if len(c.cases.getDatasets()) == 0:
+	<tr>
+          <td colspan="6">
+            Es wurden keine Datensätze gefunden.
+          </td>
+        </tr>
+        % endif
+</table>
+<!--B1114
+<div class="waska_form_element w25">
+<select name="action">
+  % if h.hasRole(['admin_ka']):
+  <option value="delete">Auswahl löschen</option>
+  <option value="stand-in">Auswahl Vertretung zuweisen</option>
+  <option value="transfer">Auswahl Bearbeitung übertragen</option>
+  % endif
+  % if h.hasRole(['admin_ka', 'cm_ka']):
+  <option value="export">Auswahl exportieren</option>
+  % endif
+  <option value="evaluate">Auswahl auswerten</option>
+</select>
+</div>
+<div class="waska_form_element w75">
+${h.submit('Aktion f&uuml;r Auswahl ausf&uuml;hren')}
+</div>
+-->
+<br class="newline">
+${h.end_form()}
+</div>

Added: trunk/waskaweb/templates/casemanagement/rg_aid_overview.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/rg_aid_overview.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/rg_aid_overview.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,77 @@
+## -*- coding: utf-8 -*-
+<%inherit file="main.mako" />
+<%!  import waskaweb.lib.filters as F %>
+<%def name="buildNavipath()">
+      	${parent.buildNavipath()}
+	<li><a href="/case/select/${session.get('case_id')}">${_('cm_np_select')}</a></li>
+	<li><a href="/case/${session['case_modus']}/${c.ds_id}/${c.page_id}">${h.getFormularName(c.page_id)}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+&#220;bersicht Unterst&#252;tzungsangebote
+  </div>
+% if h.hasRole(['cm_ka']):
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+	% if c.print_form:
+        <li><a href="${h.getPrintUrl(c.print_form, c.ds_id, c.page_id)}" target="_blank" onclick="return checkModification();">${self.buildIco()} ${_('cm_actions_link_printout')}</a></li>
+	% endif
+        <li><a href="/statement/printAidPlanStatement/${c.ds_id}" target="_blank" onclick="return checkModification();">${self.buildIco()} ${_('cm_actions_link_printoutAidPlanStatement')}</a></li>
+	</ul>
+    </div>
+  </div>
+% endif
+</div>
+
+
+<table>
+	<tr>
+		<th width="100">Von</th>
+		<th width="100">Bis</th>
+		<th>Institution</th>
+		<th>Angebotsform</th>
+        <th>Aktionen</th>
+	</tr>
+        % for aid in c.rg_list.getDatasets():
+	<tr>
+		<td>${aid.start_date  | F.NA, h}</td>
+		<td>${aid.end_date    | F.NA, h}</td>
+		<td>${aid.institution | F.NA, h}</td>
+		<td>${aid.type}</td>
+                <td>
+                  % if session['case_modus'] == "show": 
+                    <a href="/case/show/${aid.id}/${aid.page_id}">Anzeigen</a> 
+                  % else:
+                    <a href="/case/edit/${aid.id}/${aid.page_id}">Anzeigen</a> 
+                  % endif
+                  % if h.hasRole(['cm_ka']):
+                    <a href="/case/deleteAid/${aid.id}/${aid.type_id}/0">Löschen</a>
+                  % endif
+                </td>
+	</tr>
+        % endfor
+        % if c.rg_list.numDatasets() <= 0:
+        <tr>
+          <td colspan="5">Keine Angebote gefunden</td>
+        </tr>
+        % endif
+</table>
+<div class="legend">
+Legende: <strong>(BB)</strong>: Allgemein bildenden Bereich <strong>(BV)</strong>: Bereich der Berufsvorbereitung <strong>(BQ)</strong>: Berufliche Qualifizierung <strong>(LB)</strong>: Lebensbewältigung</div>
+% if h.hasRole(['cm_ka']):
+  <div class="waska_form">
+  <form name="new_unterstuetzung" action="/case/newAidAction" method="POST">
+  <label for="angebot">Neues Angebot hinzufügen</label><br>
+  <select name="aid_type" id="angebot">
+    <option value="0">allg. bildender Bereich (BB)</option>
+    <option value="1">Berufsvorbereitung (BV)</option>
+    <option value="2">berufl. Qualifizierung (BQ)</option>
+    <option value="3">Lebensbewältigung (LB)</option>
+  </select>
+  <input type="hidden" name="page_id" value="${c.page_id}">
+  <input type="hidden" name="case_id" value="${c.ds_id}">
+  <input type="submit" value="Hinzufügen">
+  </form>
+  </div>
+% endif

Added: trunk/waskaweb/templates/casemanagement/static_form/statement.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/static_form/statement.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/static_form/statement.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,41 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+		<li><a href="/case/">${_('cm_np_root')}</a></li>
+		<li><a href="/case/">${_('cm_np_new')}</a></li>
+</%def>
+<div class="waska_form">
+<form id="waska_form" action="/case/newAction" accept-charset="UTF-8" name="waska_form" method="POST">
+<h1>Neue Fallakte anlegen</h1>
+<p></p>
+<div class="waska_form_element w50">
+<label for="vorname_1">Vorname:</label>
+<input class="field" type="text" size="50" maxlength="60" name="vorname_1" id="vorname_1" value="${session.get('case_first_name', "")}"> 
+</div>
+<div class="waska_form_element w50">
+<label for="name_1">Name:</label>
+<input class="field" type="text" size="50" maxlength="60" name="name_1" id="name_1" value="${session.get('case_last_name', "")}">
+</div>
+<div class="waska_form_element w100">
+<label for="strasse">Strasse:</label>
+<input class="field" type="text" size="50" maxlength="60" name="strasse" id="strasse" value="${session.get('case_address', "")}">
+</div>
+<div class="waska_form_element w25">
+<label for="plz">PLZ:</label>
+<input class="field" type="text" size="50" maxlength="60" name="plz" id="plz" value="${session.get('case_plz', "")}">
+</div>
+<div class="waska_form_element w75">
+<label for="wohnort">Ort:</label>
+<input class="field" type="text" size="50" maxlength="60" name="wohnort" id="wohnort" value="${session.get('case_city', "")}">
+</div>
+<p>Bitte beachten Sie, dass Sie eine neue Fallakte nur mit vorliegender Einwilligungserklärung des Jugendlichen anlegen können.<br>
+Sie haben nun die Möglichkeit die Fallakte mit den von Ihnen eingegbenen Daten auszudrucken. Klicken Sie hierzu auf die Auswahl "Erklärung drucken".
+</p>
+<div class="waska_form_element" w100>
+<input type="checkbox" name="statement_signed"><label for="statement">Die Einwilligungserklärung für die Erfassung, Verarbeitung und Nutzung personenbezogener Daten wurde bereits bereits zur Eingangsamnese bzw. Beratung vor dem Case Management eingeholt.</label></div>
+<input type="hidden" name="page" value="page_1"> 
+<input type="submit" value="Erklärung drucken" name="print">
+<input type="submit" value="Fallakte anlegen" name="save">
+</form>
+</div>

Added: trunk/waskaweb/templates/casemanagement/static_form/statement_print.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/static_form/statement_print.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/static_form/statement_print.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,72 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+		<li><a href="/case/">${_('cm_np_root')}</a></li>
+		<li><a href="/case/">${_('cm_np_statement')}</a></li>
+</%def>
+<div id="waska_form">
+<form id="waska_form" action="/case/newAction" accept-charset="UTF-8" name="waska_form" method="POST">
+<h1>Einwilligungserklärung</h1>
+<p>gemäß den Bestimmungen des §4a Bundesdatenschutzgesetz</p>
+<p>Hiermit willige ich,</p>
+<div class="waska_form_element w50">
+<label for"vorname_">Vorname:</label>
+<input class="field" type="text" size="50" maxlength="60" name="vorname_1" id="vorname_1" value="${session.get('case_first_name', "")}"> 
+</div>
+<div class="waska_form_element w50">
+<label for"name_1">Name:</label>
+<input class="field" type="text" size="50" maxlength="60" name="name_1" id="name_1" value="${session.get('case_last_name', "")}">
+</div>
+<p>Wohnhaft in,</p>
+<div class="waska_form_element w100">
+<label for"strasse">Strasse:</label
+<input class="field" type="text" size="50" maxlength="60" name="strasse" id="strasse" value="${session.get('case_address', "")}">
+</div>
+<div class="waska_form_element w25">
+<label for"plz">PLZ:</label>
+<input class="field" type="text" size="50" maxlength="60" name="plz" id="plz" value="${session.get('case_plz', "")}">
+</div>
+<div class="waska_form_element w75">
+<label for"wohnort">Ort:</label>
+<input class="field" type="text" size="50" maxlength="60" name="wohnort" id="wohnort" value="${session.get('case_city', "")}">
+</div>
+<p>
+ein, dass die Kompetenzagentur XY im Rahmen ihrer Aufgabe, mich bei meiner beruflichen und
+sozialen Eingliederung zu unterstützen, alle dazu erforderlichen Daten, die meine Person betreffen,
+erheben, verarbeiten und nutzen kann. Diese Daten werden grundsätzlich bei mir erhoben.
+</p>
+<p>
+Aus den Daten erstellt die Kompetenzagentur XY im Rahmen ihrer Begleitung (Case-Management)
+einen Förder- und Entwicklungsplan, der die wichtigsten Angaben zu meiner persönlichen,
+beruflichen und sozialen Integration enthält. Aus diesem Grund werden auch Daten erhoben, die
+meine Gesundheit betreffen, so fern sie ärztlich attestiert sind. Sie werden verwendet um ein
+vollständiges Förderprofil zu erstellen, das alle Beeinträchtigungen berücksichtigt.
+</p>
+<p>
+Zum Zweck der wissenschaftlichen Begleitung und Auswertung sowie für die Erfassung von
+statistischen Angaben werden die von mir bei der Kompetenzagentur XY erhobenen Daten
+anonymisiert und an den Projektträger im DLR für das Bundesministerium für Familie, Senioren,
+Frauen und Jugend (PT-DLR, Bonn) weitergeleitet. Anonymisiert heißt, dass alle Daten zu Namen
+und Adresse unkenntlich gemacht werden und die weiteren Daten somit nicht mehr mit meiner
+Person in Zusammenhang gebracht werden können. Mit diesen Daten wird PT-DLR ermitteln, ob und
+wie die Ziele des Programms ,,Kompetenzagenturen " erreicht wurden.
+</p>
+<p>
+Diese Einwilligung kann ich jederzeit widerrufen. Mir ist bewusst, dass dadurch unter Umständen eine
+Begleitung durch die Kompetenzagentur XY nicht mehr in dem geplanten oder erforderlichen Umfang
+gewährleistet werden kann.
+Ziehe ich meinen Auftrag, mich von der Kompetenzagentur XY bei der beruflichen und sozialen
+Integration begleiten zu lassen zurück, sind alle über mich gespeicherten Daten sofort zu löschen.
+Eine automatische Löschung meiner Daten bei der Kompetenzagentur XY findet in jedem Fall Z
+Monate nach Abschluss der Begleitung statt.
+Ausgeschlossen von dieser Löschung bleiben die Angaben auf der Teilnehmerliste (z. B. Name,
+Anschrift, Datum Erstkontakt etc.) Die Angaben auf der Teilnehmerliste werden elektronisch nicht
+verarbeitet und dienen der Kompetenzagentur XY und dem PT-DLR zu abrechnungstechnischen
+Zwecken.
+</p>
+<p>
+Ich habe jederzeit die Möglichkeit meine Fallakte bei der Kompetenzagentur XY einzusehen.
+</p>
+</form>
+</div>

Added: trunk/waskaweb/templates/casemanagement/static_form.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/static_form.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/static_form.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,317 @@
+# -*- coding: utf-8 -*-
+        <form action="action" accept-charset="&Uuml;TF-8">
+	<div class="w100">
+	<h2>
+	    1. Zust&auml;ndigkeiten, Eingangsdaten
+	</h2>
+	</div>
+	<div class="waska_form_element w100">
+	      <label for="fkz">F&ouml;rderkennzeichen der
+	      Kompetenzagentur <span class="help"><a href=
+	      "help?what=fkz" target="_blank"><img src=
+	      "static?what=images/icons/icon_info.png"
+	      border="0" alt=
+	      "Hilfesymbol"></a></span></label><br>
+	      <input class="field" type="text" name="fkz" id="fkz">
+	</div>
+	<div class="waska_form_element w100">
+	      <label for="name_kompetenzagentur">Name der
+	      Kompetenzagentur</label><br>
+	      <input type="text" class="field" name="name_kompetenzagentur" id= "name_kompetenzagentur"><br>
+	</div>
+	    <div class="waska_form_element w100">
+	      <fieldset>
+		<legend>Name des zust&auml;ndigen Mitarbeiters
+		in der Kompetenzagentur</legend>
+		  <div class="waska_form_element w50">
+		    <label for=
+		    "vorname">Vorname</label><br>
+
+		    <input type="text" class="field" name="vorname" id="vorname"><br>
+		  </div>
+		  <div class="waska_form_element w50">
+		    <label for="name">Name</label><br>
+		    <input type="text" class="field" name="name" id="name"><br>
+		  </div>
+	      </fieldset>
+	    </div>
+	    <div class="waska_form_element w100">
+	      <label for="zugang_kompetenzagentur">Zugang
+	      des Jugendlichen zur
+	      Kompetenzagentur</label><br>
+	      <select size="1" name=
+	      "zugang_kompetenzagentur" id=
+	      "zugang_kompetenzagentur">
+		<option value="-1">
+		  keine Angabe
+		</option>
+
+		<option value="0">
+		  eigenst&auml;ndiger Zugang des Jugendlichen
+		</option>
+		<option value="1">
+		  Familie
+		</option>
+		<option value="2">
+		  Verwandte
+		</option>
+		<option value="3">
+
+		  Freunde
+		</option>
+		<option value="4">
+		  Lehrer/Lehrerin
+		</option>
+		<option value="5">
+		  andere Menschen aus dem sozialen &Uuml;mfeld
+		  des Jugendlichen
+		</option>
+		<option value="6">
+		  Agentur f&uuml;r Arbeit
+		</option>
+
+		<option value="7">
+		  SGB II -Tr&auml;ger
+		</option>
+		<option value="8">
+		  Jugendamt
+		</option>
+		<option value="9">
+		  Jugendhilfeeinrichtung
+		</option>
+		<option value="10">
+
+		  Schule
+		</option>
+		<option value="11">
+		  Streetwork
+		</option>
+		<option value="12">
+		  Beratungsstelle
+		</option>
+		<option value="13">
+		  &Uuml;nternehmen
+		</option>
+
+		<option value="14">
+		  Kompetenzagentur
+		</option>
+		<option value="15">
+		  Sonstiges
+		</option>
+	      </select>
+	  </div>
+	    <div class="waska_form_element w100">
+	      <fieldset>
+		<legend>Bei Eintritt ist der Jugendliche
+		(Mehrfachantworten m&ouml;glich)</legend>
+		  <input type="checkbox" name=
+		  "schulpflichtig" id=
+		  "schulpflichtig"><label for=
+		  "schulpflichtig">schulpflichtig</label><br>
+
+		  <input type="checkbox" name=
+		  "noch_schueler" id=
+		  "noch_schueler"><label for=
+		  "noch_schueler">noch
+		  Sch&uuml;lerin/Sch&uuml;ler</label><br>
+
+		  <div class="waska_form_element w100">
+		    <label for=
+		    "bei_eintritt_ist_der_jugendliche">keine
+		    Beschriftung vorhanden</label><br>
+		    <select size="1" name=
+		    "bei_eintritt_ist_der_jugendliche" id=
+		    "bei_eintritt_ist_der_jugendliche">
+		      <option value="-1">
+			keine Angabe
+		      </option>
+		      <option value="0">
+			in der Schule
+		      </option>
+
+		      <option value="1">
+			in der Ausbildung
+		      </option>
+		      <option value="2">
+			in Arbeit
+		      </option>
+		      <option value="3">
+			arbeitslos
+		      </option>
+		      <option value="4">
+
+			in der Erziehungszeit
+		      </option>
+		    </select>
+		  </div>
+	      </fieldset>
+	  </div>
+	    <div class="waska_form_element w50">
+	      <label for="rechtlicher_kontext">Rechtlicher
+	      Kontext</label><br>
+	      <select size="1" name="rechtlicher_kontext"
+	      id="rechtlicher_kontext">
+		<option value="-1">
+		  keine Angabe
+		</option>
+		<option value="0">
+		  SGB II
+		</option>
+
+		<option value="1">
+		  SGB II
+		</option>
+		<option value="2">
+		  SGB III
+		</option>
+		<option value="3">
+		  SGB XII
+		</option>
+		<option value="4">
+
+		  ungekl&auml;rt
+		</option>
+	      </select>
+	    </div>
+	    <div class="waska_form_element w50">
+	      <label for="schnittstelle_zu">Schnittstelle
+	      zu</label><br>
+	      <select size="1" name="schnittstelle_zu" id=
+	      "schnittstelle_zu">
+		<option value="-1">
+		  keine Angabe
+		</option>
+
+		<option value="0">
+		  SGB II
+		</option>
+		<option value="1">
+		  SGB II
+		</option>
+		<option value="2">
+		  SGB III
+		</option>
+		<option value="3">
+
+		  SGB XII
+		</option>
+	      </select>
+	    </div>
+	  <div class="w100">
+	    <div class="waska_form_element w50">
+	      <label for="kontaktdaten_arge">Kontaktdaten
+	      ARGE/&Ouml;ptionskommune</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kontaktdaten_arge" id=
+	      "kontaktdaten_arge"><br>
+
+	    </div>
+	    <div class="waska_form_element w50">
+	      <label for="kundennummer_arge">Kundennummer
+	      ARGE/&Ouml;ptionskommune</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kundennummer_arge" id=
+	      "kundennummer_arge"><br>
+	    </div>
+	  </div>
+	  <div class="w100">
+	    <div class="waska_form_element w50">
+
+	      <label for=
+	      "kontaktdaten_agentur_fuer_arbeit">Kontaktdaten
+	      Agentur f&uuml;r Arbeit</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kontaktdaten_agentur_fuer_arbeit" id=
+	      "kontaktdaten_agentur_fuer_arbeit"><br>
+	    </div>
+	    <div class="waska_form_element w50">
+	      <label for=
+	      "kundennummer_agentur_fuer_arbeit">Kundennummer
+	      Agentur f&uuml;r Arbeit</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kundennummer_agentur_fuer_arbeit" id=
+	      "kundennummer_agentur_fuer_arbeit"><br>
+	    </div>
+	  </div>
+
+	  <div class="w100">
+	    <div class="waska_form_element w50">
+	      <label for=
+	      "kundennummer_jugendamt">Kontaktdaten
+	      Jugendamt</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kundennummer_jugendamt" id=
+	      "kundennummer_jugendamt"><br>
+	    </div>
+	    <div class="waska_form_element w50">
+	      <label for=
+	      "kontaktdaten_jugendamt">Kundennummer
+	      Jugendamt</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kontaktdaten_jugendamt" id=
+	      "kontaktdaten_jugendamt"><br>
+
+	    </div>
+	  </div>
+	  <div class="w100">
+	    <div class="waska_form_element w50">
+	      <label for="kontaktdaten_schule">Kontaktdaten
+	      Schule</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kontaktdaten_schule" id=
+	      "kontaktdaten_schule"><br>
+	    </div>
+	    <div class="waska_form_element w50">
+
+	      <label for="schulname">Schulname</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="schulname" id="schulname"><br>
+	    </div>
+	  </div>
+	  <div class="w100">
+	    <div class="waska_form_element w50">
+	      <label for=
+	      "kontaktdaten_gerichtshilfe">Kontaktdaten
+	      Gerichtshilfe</label><br>
+	      <input type="text" class="field" size="50" maxlength="100"
+	      name="kontaktdaten_gerichtshilfe" id=
+	      "kontaktdaten_gerichtshilfe"><br>
+
+	    </div>
+	    <div class="waska_form_element w50">
+	      <label for=
+	      "kundennummer_gerichtshilfe">Kundennummer
+	      Gerichtshilfe</label><br>
+	      <input type="text" class="field" name="kundennummer_gerichtshilfe" id=
+	      "kundennummer_gerichtshilfe"><br>
+	    </div>
+	  </div>
+	  <div class="w100">
+	    <div class="waska_form_element w100">
+
+	      <label for=
+	      "kontaktdaten_weitere_institutionen">Kontaktdaten
+	      weitere Institutionen</label><br>
+	      <input type="text" class="field"100" name="kontaktdaten_weitere_institutionen" id=
+	      "kontaktdaten_weitere_institutionen"><br>
+	    </div>
+	  </div>
+	  <div class="w100">
+	    <div class="waska_form_element w50">
+	      <label for="erstgespraech">Datum des
+	      Erstgespr&auml;ches mit dem
+	      Jugendlichen</label><br>
+	      <input type="text" class="field" name="erstgespraech" id="erstgespraech"><br>
+
+	    </div>
+	    <div class="waska_form_element w50">
+	      <label for="kundennummer">Kundennummer bei
+	      der Kompetenzagentur</label><br>
+	      <input type="text" class="field" name="kundennummer" id="kundennummer"><br>
+	    </div>
+	  </div>
+	    <input type="hidden" name="page" value="page_0">
+            <input type="submit" value="Speichern">
+	</form>
+	<!--

Added: trunk/waskaweb/templates/casemanagement/upload.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/upload.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/casemanagement/upload.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,28 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case">${_('cm_np_root')}</a></li>
+	<li><a href="/case/import/">${_('cm_np_import')}</a></li>
+</%def>
+<h1>${_('cm_header_import')}</h1>
+<div id="waska_form">
+${h.form(h.url(action='importAction'), multipart=True)}
+<div class="waska_form_element w100">
+<label for="pdffile">${_('cm_from_import_label_file')}:</label><br>
+${h.file_field('pdffile')} <br>
+</div>
+${h.submit(_('cm_from_import_submit'))}
+${h.end_form()}
+</div>
+
+<%doc>
+<div id="waska_form">
+${h.form(h.url(action='importActionX'))}
+${h.submit('Aus Datei')}
+${h.end_form()}
+</div>
+</%doc>
+<div>
+<pre>${getattr(c, "messages", "&nbsp;")}</pre>
+</div>
+

Added: trunk/waskaweb/templates/dialogs/alert.mako
===================================================================
--- trunk/waskaweb/templates/dialogs/alert.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/dialogs/alert.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+<div class="dialog" />
+<h1><img alt="Achtung" src="/images/alert.png"/>${_('dialog_header_alert')}</h1>
+<h2>${c.alert_for}</h2>
+<p>${c.question}</p>
+<a class="button" href="${c.url_ok}">${_('dialog_header_confirm_option_ok')}</a>
+<a class="button" href="${c.url_cancel}">${_('dialog_header_confirm_option_cancel')}</a>
+</div>

Added: trunk/waskaweb/templates/dialogs/confirm.mako
===================================================================
--- trunk/waskaweb/templates/dialogs/confirm.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/dialogs/confirm.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+## -*- coding: utf-8 -*-
+<div class="dialog" />
+<h1><img alt="Achtung" src="/images/question.png"/>${_('dialog_header_confirm')}</h1>
+<h2>${c.confirm_for}</h2>
+<p>${c.question}</p>
+<a class="button" href="${c.url_yes}">${_('dialog_header_confirm_option_yes')}</a>
+<a class="button" href="${c.url_no}">${_('dialog_header_confirm_option_no')}</a>
+</div>

Added: trunk/waskaweb/templates/dialogs/notification.mako
===================================================================
--- trunk/waskaweb/templates/dialogs/notification.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/dialogs/notification.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+## -*- coding: utf-8 -*-
+<div class="dialog" />
+<h1><img alt="Achtung" src="/images/alert.png"/>${_('dialog_header_notification')}</h1>
+<h2>${c.notification_for}</h2>
+<p>${c.notification_text}</p>
+<a class="button" href="${c.url_ok}">${_('dialog_header_notification_option_ok')}</a>
+</div>

Added: trunk/waskaweb/templates/documents/case_new.mako
===================================================================
--- trunk/waskaweb/templates/documents/case_new.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/documents/case_new.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,32 @@
+<%inherit file="../casemanagement/main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/case/select/${session.get('case_id')}/1">${_('cm_np_select')}</a></li>
+	<li><a href="/case/documents/${session.get('case_id')}">${_('cm_np_doc_overview')}</a></li>
+	<li><a href="/case/newDocument">${_('cm_np_doc_upload')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('cm_header_doc_new')}
+  </div>
+% if h.hasRole(['cm_ka']):
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/case/documents/${session.get('case_id', None)}">${self.buildIco()} ${_('cm_menu_link_document_back')}</a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+% endif
+<div id="document">
+<div id="waska_form">
+${h.form(h.url(controller="document", action='caseUploadAction'), multipart=True)}
+<div class="w100">
+<label for="file">${_('doc_form_upload_label_file')}:</label><br>
+${h.file_field('file')}<br>
+${h.submit(_('doc_form_upload_submit'))}
+${h.hidden_field('case', value=session.get('case_id', None))}
+${h.end_form()}
+</div>
+</div>

Added: trunk/waskaweb/templates/documents/case_overview.mako
===================================================================
--- trunk/waskaweb/templates/documents/case_overview.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/documents/case_overview.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,48 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../casemanagement/main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/select/${session.get('case_id')}/1">${_('cm_np_select')}</a></li>
+	<li><a href="/case/documents/${session.get('case_id')}">${_('cm_np_doc_overview')}</a></li>
+</%def>
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+  ${_('cm_header_doc_overview')}
+  </div>
+% if h.hasRole(['cm_ka']):
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/case/newDocument/">${self.buildIco()} ${_('cm_actions_link_doc_new')}</a></li>
+	</ul>
+    </div>
+  </div>
+% endif
+</div>
+
+<%!  import waskaweb.lib.filters as F %>
+% if len(c.files) > 0:
+<table>
+  <tr>
+    <th>${_('doc_overview_tbl_header_filename')}</th>
+    <th class="number_field">${_('doc_overview_tbl_header_filesize')}</th>
+    <th>${_('doc_overview_tbl_header_actions')}</th>
+  </tr>
+  <% 
+    kb = lambda x: h.formatNumber(x * 1.0/1024.0) 
+    myid = session.get('case_id', None)
+  %>
+  % for f in c.files:
+  <tr>
+    <td>${ f.name | F.shorten, h}</td>
+    <td class="number_field">${kb(f.size)} KB</td>
+    <td><a href="/document/caseShow/${f.id}/${f.name | F.H}" target="_blank">Anzeigen</a>
+    <a href="/document/caseDelete/${f.id}/${myid}/0">Löschen</a>
+    </td>
+  </tr>
+  % endfor
+</table>
+% else:
+${_('doc_overview_nofilesfound')}
+% endif

Added: trunk/waskaweb/templates/documents/dialogs/confirm.mako
===================================================================
--- trunk/waskaweb/templates/documents/dialogs/confirm.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/documents/dialogs/confirm.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/document">Dokumente</a></li>
+	<li><a href="/document/overview">Dokument &Uuml;bersicht</a></li>
+	<li><a href="#">Dokument L&ouml;schen</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/documents/global_overview.mako
===================================================================
--- trunk/waskaweb/templates/documents/global_overview.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/documents/global_overview.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,48 @@
+## -*- coding: utf-8 -*-
+<%!  import waskaweb.lib.filters as F %>
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/document">${_('doc_np_root')}</a></li>
+	<li><a href="/document/globalOverview">${_('doc_np_overview')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('doc_header_overview')}
+  </div>
+% if h.hasRole(['admin_ka']):
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/document/globalUpload/">${self.buildIco()} ${_('doc_actions_link_new')}</a></li>
+            </a>
+	</ul>
+    </div>
+
+  </div>
+% endif
+</div>
+
+<table>
+  <tr>
+    <th>${_('doc_overview_tbl_header_filename')}</th>
+    <th class="number_field">${_('doc_overview_tbl_header_filesize')}</th>
+    <th>${_('doc_overview_tbl_header_actions')}</th>
+  </tr>
+% if len(c.files) > 0:
+  <% kb = lambda x: h.formatNumber(x * 1.0/1024.0) %>
+  % for f in c.files:
+  <tr>
+    <td>${ f.name | F.shorten, h}</td>
+    <td class="number_field">${kb(f.size)} KB</td>
+    <td><a href="/document/globalShow/${f.id}/${f.name | F.H}" target="_blank">Anzeigen</a>
+    % if h.hasRole(['admin_ka']):
+    <a href="/document/globalDelete/${f.id}">Löschen</a>
+    % endif
+    </td>
+  </tr>
+  % endfor
+</table>
+% else:
+${_('doc_overview_nofilesfound')}
+% endif

Added: trunk/waskaweb/templates/documents/global_upload.mako
===================================================================
--- trunk/waskaweb/templates/documents/global_upload.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/documents/global_upload.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,28 @@
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+		${parent.buildNavipath()}
+	<li><a href="/document">${_('doc_np_root')}</a></li>
+	<li><a href="/document/globalUpload">${_('doc_np_upload')}</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('doc_header_new')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='document', action='globalOverview')}">${self.buildIco()} ${_('menu_doc_link_overview_back')}</a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+<div id="document">
+<div id="waska_form">
+${h.form(h.url(controller="document", action='globalUploadAction'), multipart=True)}
+<div class="w100">
+<label for="file">${_('doc_form_upload_label_file')}:</label><br>
+${h.file_field('file')}<br>
+${h.submit(_('doc_form_upload_submit'))}
+${h.end_form()}
+</div>
+</div>

Added: trunk/waskaweb/templates/documents/upload_body.mako
===================================================================
--- trunk/waskaweb/templates/documents/upload_body.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/documents/upload_body.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,12 @@
+<div id="document">
+<div id="waska_form">
+${h.form(h.url(controller="document", action='uploadAction'), multipart=True)}
+<div class="w100">
+<label for="file">${_('doc_form_upload_label_file')}:</label><br>
+${h.file_field('file')}<br>
+
+${h.submit(_('doc_form_upload_submit'))}
+${h.end_form()}
+</div>
+</div>
+</div>
\ No newline at end of file

Added: trunk/waskaweb/templates/login.mako
===================================================================
--- trunk/waskaweb/templates/login.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/login.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,26 @@
+## -*- coding: utf-8 -*-
+<%inherit file="main_login.mako" />
+<h1>WASKA Anmeldung</h1>
+<div id="waska_form_login">
+<p>Geben Sie bitte Anmeldekennung und Passwort ein, um sich anzumelden.</p>
+<form name="login" action="${h.url_for(controller='waska', action='loginAction')}" method="POST">
+<div class="label">
+   <label for="login">Anmeldekennung:</label>
+</div>
+<div class="input">
+   <input type="text" size="20" name="username">
+</div>
+<div id="clearer"> </div>
+<div class="label">
+    <label for="pass">Passwort:</label>
+</div>
+
+<div class="input">
+    <input type="password" size="20" name="password">
+</div>
+<div id="clearer"> </div>
+<p id="login_btn">
+<input type="submit" value="Anmelden" name="authform">
+</p>
+</form>
+</div>
\ No newline at end of file

Added: trunk/waskaweb/templates/logout.mako
===================================================================
--- trunk/waskaweb/templates/logout.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/logout.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,6 @@
+## -*- coding: utf-8 -*-
+<%inherit file="main_login.mako" />
+<h1>WASKA Abmeldung</h1>
+<div id="waska_form_login">
+<p>Sie haben sich erfolgreich abgemeldet. Klicken Sie auf <a href="/">anmelden</a> um sich erneut in WASKA anzumelden.</p>
+</div>
\ No newline at end of file

Added: trunk/waskaweb/templates/main.mako
===================================================================
--- trunk/waskaweb/templates/main.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/main.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,182 @@
+## -*- coding: utf-8 -*-
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+  <head>
+    <title>WASKA ${session.get('agency_name', "")}</title>
+    <meta name="generator" content="vim">
+    <meta name="author" content="Torsten Irlaender">
+    <meta name="date" content="2007-08-07">
+    <meta name="copyright" content="">
+    <meta name="keywords" content="">
+    <meta name="description" content="">
+    <meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta http-equiv="content-style-type" content="text/css">
+    <meta http-equiv="expires" content="0">
+    % if c.print_version:
+    <link href="${h.url_for('/styles/all.css')}" media="all" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="screen" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="print" rel="stylesheet" type="text/css">
+    % else:
+    <link href="${h.url_for('/styles/all.css')}" media="all" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/screen.css')}" media="screen" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="print" rel="stylesheet" type="text/css">
+    <!--[if gt IE 5]><link href="${h.url_for('/styles/ie6.css')}" media="screen" rel="stylesheet" type="text/css"><![endif]-->
+    % endif
+    <script src="/js/check.js" type="text/javascript"></script>
+  </head>
+  <body onload="clearModification();">
+    <div id="header">
+      <div class="left" id="logo">
+        <a href="${h.url_for(controller='waska', action='start')}" onclick="return checkModification();">
+          <img src="${h.url_for('/images/logo_ka_75.png')}" alt="Logo Kompetenzagentur" border="0">
+        </a>
+      </div>
+      <div id="rightheader">
+        ${self.buildStartMenu()}
+        ${self.buildStatusBar()}
+        <div id="navipath">
+          <span style="float:left">${_('np_text')}&nbsp;</span>
+          <ul>
+            ${self.buildNavipath()}
+          </ul>
+        </div>
+      </div>
+    </div>
+    <div id="main">
+      <div class="left">
+	<div class="navigation">
+	${self.buildPrivacyfield()}
+        ${next.buildNavigation()}
+    <div id="content" class="right">
+	${self.buildUeberschrift()}
+	${self.buildModusfield()}
+        ${self.body()}
+    </div>
+</div>
+${self.buildFooter()}
+  </body>
+</html>
+<%def name="buildStatusBar()">
+  <div id="statusbar">
+    ${_('statusbar_logininfo')}: <strong>${h.getUserFullname()}</strong> (${h.getRole()})
+  </div>
+</%def>
+
+<%def name="buildStartMenu()">
+  <div id="startmenu">
+    <ul>
+      <li><a href="${h.url_for(controller='/waska')}" onclick="return checkModification();">${_('sm_menu_link_home')}</a></li>
+      <li><a href="${h.url_for(controller='/waska', action='help')}" onclick="return checkModification();">${_('sm_menu_link_help')}</a></li>
+      <li><a href="${h.url_for(controller='/waska', action='settings', id=h.getUserId())}" onclick="return checkModification();">${_('sm_menu_link_settings')}</a></li>
+      <li><a href="${h.url_for(controller='/waska', action='info')}" onclick="return checkModification();">Tr&#228;ger</a></li>
+      <li><a href="${h.url_for(controller='/waska', action='logout')}" onclick="return checkModification();">${_('sm_menu_link_logout')}</a></li>
+    </ul>
+  </div>
+</%def>
+
+<%def name="buildNavipath()">
+  <li><a href="${h.url_for(controller='/waska')}" onclick="return checkModification();">${_('np_root')}</a></li>
+</%def>
+
+<%def name="buildInfofield()">
+</%def>
+
+<%def name="buildPrivacyfield()">
+</%def>
+
+<%def name="buildIco()">
+<span class="menuico"> &gt;&gt;</span>
+</%def>
+
+<%def name="buildNavigation()">
+    % if (h.getLogin() != 'adm'):
+ % if h.hasRole(['cm_ka', 'admin_ka']):
+    <div class="menu">
+      <div class="actions">
+        <h1>${_('np_root')}</h1>
+        <ul>
+	  <li><a href="${h.url_for(controller='/waska')}">${self.buildIco()} ${_('sm_menu_link_home')}
+            </a>
+          </li>
+          <li><a href="${h.url_for(controller='/appointment', action='overview')}">${self.buildIco()} ${_('menu_app_link_overview')}
+	    </a>
+	  </li>
+	  <li><a href="${h.url_for(controller='/document', action='globalOverview')}">${self.buildIco()} ${_('menu_doc_link_overview')}
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+    % endif
+    <div class="menu">
+      <div class="actions">
+        <h1>${_('menu_header_cm')}</h1>
+        <ul>
+          <li><a href="${h.url_for(controller='/case', action='overview')}">${self.buildIco()} ${_('menu_cm_link_overview')}</a>
+          </li>
+          % if h.hasRole(['cm_ka']):
+          <li><a href="${h.url_for(controller='/case', action='new')}">${self.buildIco()} ${_('menu_cm_link_new')}</a>
+          </li>
+          <li><a href="${h.url_for(controller='/case', action='importCase')}">${self.buildIco()} ${_('menu_cm_link_import')}</a>
+          </li>
+          % endif
+          <li><a href="${h.url_for(controller='/evaluate', action='evaluate')}">${self.buildIco()} ${_('cm_actions_link_evaluate')}</a>
+          </li>
+        </ul>
+      </div>
+    </div>
+    % endif
+    % if h.hasRole(['admin_ka']):
+    <div class="menu">
+      <div class="actions">
+        <h1>${_('menu_header_adm')}</h1>
+        <ul>
+          <li><a href="${h.url_for(controller='/administration', action='overviewUser')}">${self.buildIco()} ${_('menu_adm_link_useroverview')}
+            </a>
+          </li>
+          <li><a href="${h.url_for(controller='/administration', action='showSettings')}">${self.buildIco()} ${_('menu_adm_link_showsettings')}
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+    % endif
+      </div>
+    </div>
+</%def>
+
+<%def name="buildFormErrors()">
+  % if len(c.form_errors) > 0:
+  <div class="form_errors">
+    <h1><a name="error_list">Fehlerhafte Formulareingabe</a></h1>
+    <%
+      # Please fill this dictionary in the templates if you want to substitute
+      # the formular identifier
+      formular_labels = {'firstname': 'adm_form_user_firstname',
+                          'lastname': 'adm_form_user_lastname',
+                          'login': 'adm_form_user_login',
+                          'passwd': 'adm_form_newuser_passwd',
+                          'passwd2': 'adm_form_newuser_passwd_confirm'
+                          }
+    %>
+    <ul>
+      % for key, value in c.form_errors.iteritems():
+        <li>${_(formular_labels.get(key, '%s' % key))}: ${value}</li>
+      % endfor
+    </ul>
+  </div>
+  % endif
+</%def>
+
+<%def name="buildFooter()">
+<div id="footer">
+${_('footer_title')} | ${_('footer_version')}
+</div>
+</%def>
+
+<%def name="buildUeberschrift()">
+</%def>
+
+<%def name="buildModusfield()">
+</%def>

Added: trunk/waskaweb/templates/main_login.mako
===================================================================
--- trunk/waskaweb/templates/main_login.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/main_login.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,67 @@
+## -*- coding: utf-8 -*-
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+  <head>
+    <title>WASKA ${session.get('agency_name', "")}</title>
+    <meta name="generator" content="vim">
+    <meta name="author" content="Torsten Irlaender">
+    <meta name="date" content="2007-08-07">
+    <meta name="copyright" content="">
+    <meta name="keywords" content="">
+    <meta name="description" content="">
+    <meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta http-equiv="content-style-type" content="text/css">
+    <meta http-equiv="expires" content="0">
+    % if c.print_version:
+    <link href="${h.url_for('/styles/all.css')}" media="all" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="screen" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="print" rel="stylesheet" type="text/css">
+    % else:
+    <link href="${h.url_for('/styles/all.css')}" media="all" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/screen.css')}" media="screen" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="print" rel="stylesheet" type="text/css">
+    <!--[if gt IE 5]><link href="${h.url_for('/styles/ie6.css')}" media="screen" rel="stylesheet" type="text/css"><![endif]-->
+    % endif
+  </head>
+  <body>
+    <div id="wrapper_login" >
+    <div id="header_login">
+      <div id="logo_login">
+        <img src="${h.url_for('/images/logo_ka_75.png')}" alt="Logo Kompetenzagentur" border="0">
+      </div>
+    </div>
+      <div id="content_login">
+        ${self.body()}
+    </div>
+      <div id="footer_login">
+        <p>Das Programm Kompetenzagenturen (Durchf&#252;hrungsphase) wird vom Bundesministerium f&#252;r Familie, Senioren, Frauen und Jugend aus Mitteln des Europ&#228;ischen Sozialfonds gef&#246;rdert.</p>
+         <a target="_blank" href="http://www.bmfsfj.de">
+          <img src="/images/BMFSFJ_C_M_web.jpg" alt="Logo Bundesministerium f&#252;r Familie, Senioren, Frauen und Jugend" border="0">
+        </a>
+         <a target="_blank" href="http://ec.europa.eu/employment_social/esf2000/index_de.html">
+          <img src="/images/eu_logo_4c_pos_web2.jpg" alt="Logo Europ&#228;ische Union - Europ&#228;ische Sozialfonds" border="0">
+        </a>
+      </div>
+    </div>	
+  </body>
+</html>
+<%def name="buildFormErrors()">
+    <%
+      # Please fill this dictionary in the templates if you want to substitute
+      # the formular identifier
+      formular_labels = {'passwd': 'adm_form_newuser_passwd',
+                          'passwd2': 'adm_form_newuser_passwd_confirm'
+                          }
+    %>
+  % if len(c.form_errors) > 0:
+  <div class="form_errors">
+    <a name="error_list"><h1>Fehlerhafte Formulareingabe</h1></a>
+    <ul>
+      % for key, value in c.form_errors.iteritems():
+        <li>${_(formular_labels.get(key, '%s' % key))}: ${value}</li>
+      % endfor
+    </ul>
+  </div>
+  % endif
+</%def>

Added: trunk/waskaweb/templates/start/help.mako
===================================================================
--- trunk/waskaweb/templates/start/help.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/start/help.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,28 @@
+<%inherit file="../main.mako" />
+<h1>WASKA Hilfe</h1>
+ 
+<p>An dieser Stelle wird Ihnen eine Hilfe zur Verf&#252;gung stehen.</p>
+<!--<ul>
+	<li><a href="#help_1">Abschnitt 1</a></li>
+	<li><a href="#help_2">Abschnitt 2</a></li>
+	<li><a href="#help_3">Abschnitt 3</a></li>
+	<li><a href="#help_4">Abschnitt 4</a></li>
+	<li><a href="#help_5">Abschnitt 5</a></li>
+</ul>
+<h2><a id="help_1" name="help_1">Abschnitt 1</a></h2>
+<p>Nus obnixe boatus. Canonus nam Pax For Ideo Vindico Ico lex iter laxo incredibilis Cariosus perturpis. Optimates veho insigniter invisus eia causa Quod sciscitor, paro os in Insignio exemplar male. Stillicidium excedo pes Neco blatta, immo ut ordo, no hio palus tollo Fere. Si Quin vix lex tres gens ora nam iucunditas. Mica ita amo sui Monstrum ile aut culpa, qui qui cavo sum epulor oraculum humo quis Nominatim Pius Mundus agnosco podagra mica per lugo Purgatio neo promontorium Ne mos repo, his vis sis Ingens uber. Qualis, hoc eo cos Parum tribuo, ornus nam condoleo constrictio. Dux cautor sino pando nec venio compatior inopinatus bos quinquagesimus undo his stupidus Agon quo nec Malbodiensis fortitudo. Illic ile pes Vastata sitis tergeo castigator Laetor se Ne. Salveo intolerabiliter. eligo furtim incrementabiliter convenienter prothoplastus. Heus spes ne aliquantum gaudium. Prohibeo quo. Plebs peto. Porta. Pax veno. Far crucio. Oestrus. Discerpo. Conjuro. Typus arbustum. Sum pecunia. Quin. Tantummodo. Tres Semestris, tui lex ut praetermissio plerumque. Cui tot lea Insumo, feculentia, profectio Inter, gelo contremisco Apud se Hora. Sto de neco in rogo una amo, lex natu Placo. Possessio res tot Peragro ex ne Attinet, eia consolo pax martyrium, amo et egeo St quasso. Mus vis boo pax tam, os crinis ros singultim qui de ferveo hic piger sentio novus solamen, juge pie pareo Caelum en nex Accommodo turma, quem optatus crus Idem nam mei hic, te. En repo agna, hac reverto grator via beo Indigeo, iam abhinc hae levo.. Tego, dis no invocatio.Sive infinitas pax St falx hoc multi. Tum sto se post Caetera. Boo, his nam tergo scisco lex puga per Virtus. Illo queo Sino sine lea do Ferula emo exorior per dies iam Mollio Res exinde. Si, sis Genero In ter deficio vis thorax Fugo Puto, eo Prodigus tam Prenda Si sui viridis zephyr Ego libero In modo sui seco macula os, se Res Sine unde neo paene, fas cui ascia Deficio hoc, par ars hos iam ut ars. Qua emo lac cito fides for, lex Quiesc
+</p>
+<h2><a id="help_2" name="help_2">Abschnitt 2</a></h2>
+<p>Nus obnixe boatus. Canonus nam Pax For Ideo Vindico Ico lex iter laxo incredibilis Cariosus perturpis. Optimates veho insigniter invisus eia causa Quod sciscitor, paro os in Insignio exemplar male. Stillicidium excedo pes Neco blatta, immo ut ordo, no hio palus tollo Fere. Si Quin vix lex tres gens ora nam iucunditas. Mica ita amo sui Monstrum ile aut culpa, qui qui cavo sum epulor oraculum humo quis Nominatim Pius Mundus agnosco podagra mica per lugo Purgatio neo promontorium Ne mos repo, his vis sis Ingens uber. Qualis, hoc eo cos Parum tribuo, ornus nam condoleo constrictio. Dux cautor sino pando nec venio compatior inopinatus bos quinquagesimus undo his stupidus Agon quo nec Malbodiensis fortitudo. Illic ile pes Vastata sitis tergeo castigator Laetor se Ne. Salveo intolerabiliter. eligo furtim incrementabiliter convenienter prothoplastus. Heus spes ne aliquantum gaudium. Prohibeo quo. Plebs peto. Porta. Pax veno. Far crucio. Oestrus. Discerpo. Conjuro. Typus arbustum. Sum pecunia. Quin. Tantummodo. Tres Semestris, tui lex ut praetermissio plerumque. Cui tot lea Insumo, feculentia, profectio Inter, gelo contremisco Apud se Hora. Sto de neco in rogo una amo, lex natu Placo. Possessio res tot Peragro ex ne Attinet, eia consolo pax martyrium, amo et egeo St quasso. Mus vis boo pax tam, os crinis ros singultim qui de ferveo hic piger sentio novus solamen, juge pie pareo Caelum en nex Accommodo turma, quem optatus crus Idem nam mei hic, te. En repo agna, hac reverto grator via beo Indigeo, iam abhinc hae levo.. Tego, dis no invocatio.Sive infinitas pax St falx hoc multi. Tum sto se post Caetera. Boo, his nam tergo scisco lex puga per Virtus. Illo queo Sino sine lea do Ferula emo exorior per dies iam Mollio Res exinde. Si, sis Genero In ter deficio vis thorax Fugo Puto, eo Prodigus tam Prenda Si sui viridis zephyr Ego libero In modo sui seco macula os, se Res Sine unde neo paene, fas cui ascia Deficio hoc, par ars hos iam ut ars. Qua emo lac cito fides for, lex Quiesc
+</p>
+<h2><a id="help_3" name="help_3">Abschnitt 3</a></h2>
+<p>Nus obnixe boatus. Canonus nam Pax For Ideo Vindico Ico lex iter laxo incredibilis Cariosus perturpis. Optimates veho insigniter invisus eia causa Quod sciscitor, paro os in Insignio exemplar male. Stillicidium excedo pes Neco blatta, immo ut ordo, no hio palus tollo Fere. Si Quin vix lex tres gens ora nam iucunditas. Mica ita amo sui Monstrum ile aut culpa, qui qui cavo sum epulor oraculum humo quis Nominatim Pius Mundus agnosco podagra mica per lugo Purgatio neo promontorium Ne mos repo, his vis sis Ingens uber. Qualis, hoc eo cos Parum tribuo, ornus nam condoleo constrictio. Dux cautor sino pando nec venio compatior inopinatus bos quinquagesimus undo his stupidus Agon quo nec Malbodiensis fortitudo. Illic ile pes Vastata sitis tergeo castigator Laetor se Ne. Salveo intolerabiliter. eligo furtim incrementabiliter convenienter prothoplastus. Heus spes ne aliquantum gaudium. Prohibeo quo. Plebs peto. Porta. Pax veno. Far crucio. Oestrus. Discerpo. Conjuro. Typus arbustum. Sum pecunia. Quin. Tantummodo. Tres Semestris, tui lex ut praetermissio plerumque. Cui tot lea Insumo, feculentia, profectio Inter, gelo contremisco Apud se Hora. Sto de neco in rogo una amo, lex natu Placo. Possessio res tot Peragro ex ne Attinet, eia consolo pax martyrium, amo et egeo St quasso. Mus vis boo pax tam, os crinis ros singultim qui de ferveo hic piger sentio novus solamen, juge pie pareo Caelum en nex Accommodo turma, quem optatus crus Idem nam mei hic, te. En repo agna, hac reverto grator via beo Indigeo, iam abhinc hae levo.. Tego, dis no invocatio.Sive infinitas pax St falx hoc multi. Tum sto se post Caetera. Boo, his nam tergo scisco lex puga per Virtus. Illo queo Sino sine lea do Ferula emo exorior per dies iam Mollio Res exinde. Si, sis Genero In ter deficio vis thorax Fugo Puto, eo Prodigus tam Prenda Si sui viridis zephyr Ego libero In modo sui seco macula os, se Res Sine unde neo paene, fas cui ascia Deficio hoc, par ars hos iam ut ars. Qua emo lac cito fides for, lex Quiesc
+</p>
+<h2><a id="help_4" name="help_4">Abschnitt 4</a></h2>
+<p>Nus obnixe boatus. Canonus nam Pax For Ideo Vindico Ico lex iter laxo incredibilis Cariosus perturpis. Optimates veho insigniter invisus eia causa Quod sciscitor, paro os in Insignio exemplar male. Stillicidium excedo pes Neco blatta, immo ut ordo, no hio palus tollo Fere. Si Quin vix lex tres gens ora nam iucunditas. Mica ita amo sui Monstrum ile aut culpa, qui qui cavo sum epulor oraculum humo quis Nominatim Pius Mundus agnosco podagra mica per lugo Purgatio neo promontorium Ne mos repo, his vis sis Ingens uber. Qualis, hoc eo cos Parum tribuo, ornus nam condoleo constrictio. Dux cautor sino pando nec venio compatior inopinatus bos quinquagesimus undo his stupidus Agon quo nec Malbodiensis fortitudo. Illic ile pes Vastata sitis tergeo castigator Laetor se Ne. Salveo intolerabiliter. eligo furtim incrementabiliter convenienter prothoplastus. Heus spes ne aliquantum gaudium. Prohibeo quo. Plebs peto. Porta. Pax veno. Far crucio. Oestrus. Discerpo. Conjuro. Typus arbustum. Sum pecunia. Quin. Tantummodo. Tres Semestris, tui lex ut praetermissio plerumque. Cui tot lea Insumo, feculentia, profectio Inter, gelo contremisco Apud se Hora. Sto de neco in rogo una amo, lex natu Placo. Possessio res tot Peragro ex ne Attinet, eia consolo pax martyrium, amo et egeo St quasso. Mus vis boo pax tam, os crinis ros singultim qui de ferveo hic piger sentio novus solamen, juge pie pareo Caelum en nex Accommodo turma, quem optatus crus Idem nam mei hic, te. En repo agna, hac reverto grator via beo Indigeo, iam abhinc hae levo.. Tego, dis no invocatio.Sive infinitas pax St falx hoc multi. Tum sto se post Caetera. Boo, his nam tergo scisco lex puga per Virtus. Illo queo Sino sine lea do Ferula emo exorior per dies iam Mollio Res exinde. Si, sis Genero In ter deficio vis thorax Fugo Puto, eo Prodigus tam Prenda Si sui viridis zephyr Ego libero In modo sui seco macula os, se Res Sine unde neo paene, fas cui ascia Deficio hoc, par ars hos iam ut ars. Qua emo lac cito fides for, lex Quiesc
+</p>
+<h2><a id="help_5" name="help_5" >Abschnitt 5</a></h2>
+<p>Nus obnixe boatus. Canonus nam Pax For Ideo Vindico Ico lex iter laxo incredibilis Cariosus perturpis. Optimates veho insigniter invisus eia causa Quod sciscitor, paro os in Insignio exemplar male. Stillicidium excedo pes Neco blatta, immo ut ordo, no hio palus tollo Fere. Si Quin vix lex tres gens ora nam iucunditas. Mica ita amo sui Monstrum ile aut culpa, qui qui cavo sum epulor oraculum humo quis Nominatim Pius Mundus agnosco podagra mica per lugo Purgatio neo promontorium Ne mos repo, his vis sis Ingens uber. Qualis, hoc eo cos Parum tribuo, ornus nam condoleo constrictio. Dux cautor sino pando nec venio compatior inopinatus bos quinquagesimus undo his stupidus Agon quo nec Malbodiensis fortitudo. Illic ile pes Vastata sitis tergeo castigator Laetor se Ne. Salveo intolerabiliter. eligo furtim incrementabiliter convenienter prothoplastus. Heus spes ne aliquantum gaudium. Prohibeo quo. Plebs peto. Porta. Pax veno. Far crucio. Oestrus. Discerpo. Conjuro. Typus arbustum. Sum pecunia. Quin. Tantummodo. Tres Semestris, tui lex ut praetermissio plerumque. Cui tot lea Insumo, feculentia, profectio Inter, gelo contremisco Apud se Hora. Sto de neco in rogo una amo, lex natu Placo. Possessio res tot Peragro ex ne Attinet, eia consolo pax martyrium, amo et egeo St quasso. Mus vis boo pax tam, os crinis ros singultim qui de ferveo hic piger sentio novus solamen, juge pie pareo Caelum en nex Accommodo turma, quem optatus crus Idem nam mei hic, te. En repo agna, hac reverto grator via beo Indigeo, iam abhinc hae levo.. Tego, dis no invocatio.Sive infinitas pax St falx hoc multi. Tum sto se post Caetera. Boo, his nam tergo scisco lex puga per Virtus. Illo queo Sino sine lea do Ferula emo exorior per dies iam Mollio Res exinde. Si, sis Genero In ter deficio vis thorax Fugo Puto, eo Prodigus tam Prenda Si sui viridis zephyr Ego libero In modo sui seco macula os, se Res Sine unde neo paene, fas cui ascia Deficio hoc, par ars hos iam ut ars. Qua emo lac cito fides for, lex Quiesc
+</p>
+
+-->
\ No newline at end of file

Added: trunk/waskaweb/templates/start/responsible.mako
===================================================================
--- trunk/waskaweb/templates/start/responsible.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/start/responsible.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,91 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+
+<h1>Informationen zur Trägerschaft</h1>
+<p>
+<strong>
+Das Programm "Kompetenzagenturen" (Durchf&uuml;hrungsphase) wird vom
+Bundesministerium f&uuml;r Familie, Senioren, Frauen und Jugend aus Mitteln des
+Europ&auml;ischen Sozialfonds gef&ouml;rdert.<br>
+</strong>
+</p>
+
+<table>
+    <tr>
+      <td style="border:0"><a href="http://www.bmfsfj.de/" target=
+      "_blank"><img class="" title="Logo bmfsj" alt="Logo bmfsj"
+      src="/images/BMFSFJ_C_M_web.jpg" border="0"
+      height="64" hspace="0" width="207"></a></td>
+
+      <td style="border:0"><a href=
+      "http://ec.europa.eu/employment_social/esf2000/index_de.html"
+      target="_blank"><img class="" title=
+      "Logo europ&auml;ische union - europ&auml;ischer sozialfonds"
+      alt=
+      "Logo europ&auml;ische union - europ&auml;ischer sozialfonds"
+      src="/images/eu_logo_4c_pos_web2.jpg" border=
+      "0" height="50" hspace="0" width="240"></a></td>
+    </tr>
+</table>
+
+<p><strong>Besucheradresse:</strong><br>
+Heinrich-Konen-Str. 1<br>
+53227 Bonn<br>
+<br>
+Tel.: 0228 3821-600<br>
+E-Mail: <a href="mailto:kompetenzagenturen at dlr.de" target=
+"_blank">kompetenzagenturen at dlr.de</a></p>
+
+<h2>Kontakt</h2>
+
+<table>
+    <tr>
+      <td style="border:0">
+          <strong>
+          <a href="#">Dr. Astrid Fischer</a>
+	  </strong><br>
+          Deutsches Zentrum f&uuml;r Luft- und
+          Raumfahrt e. V. (DLR)<br>
+          Projekttr&auml;ger im
+          DLR, Bildungsforschung, Chancengleichheit<br>
+          Bonn<br>
+          Tel.: +49 228 3821-602
+        <br>
+      </td>
+      <td style="border:0" rowspan="2" valign="top">
+      <img src="/images/logo_dlr.png" alt="Logo DLR">
+      </td>
+    </tr>
+
+    <tr>
+      <td style="border:0">
+	  <strong>
+          <a href="#">Frank T&ouml;nnissen</a>
+	  </strong><br>
+          Deutsches Zentrum f&uuml;r Luft- und
+          Raumfahrt e. V. (DLR)<br>
+          Projekttr&auml;ger im
+          DLR, Bildungsforschung, Chancengleichheit<br>
+          Bonn<br>
+          Tel.: +49 228 3821-603
+        <br>
+      </td>
+    </tr>
+</table>
+<h2>Realisation</h2>
+<table>
+    <tr>
+      <td style="border:0">
+          <strong>
+          <a href="#">Intevation GmbH</a>
+	  </strong><br>
+          Osnabr&uuml;ck<br>
+	  Realisation und Programmierung der Webanwendung<br>
+          Kontakt: Frank Koormann (Tel.: +49 541 33508-30)
+        <br>
+      </td>
+      <td style="border:0">
+      <img src="/images/logo_intevation.png" alt="Logo Intevation">
+      </td>
+    </tr>
+</table>

Added: trunk/waskaweb/templates/start/start.mako
===================================================================
--- trunk/waskaweb/templates/start/start.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/start/start.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,84 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+${_('start_header_blackboard')}
+  </div>
+</div>
+% if (h.getLogin() == 'adm'): 
+  <div id="adm_beta">
+  <p>Sie befinden sich in der zentralen Administration.</p><br><p> Im Men&#252;punkt "Benutzer" k&#246;nnen sie:</p>
+  <ul>
+     <li>neue Benutzer anlegen</li>
+     <li>bereits vorhandene Benutzer verwalten</li>
+  </ul>
+  <p>Im Men&#252;punkt "Agentur" k&#246;nnen sie:</p>
+  <ul>
+     <li>den Namen und die FKZ der Agentur einstellen</li>
+     <li>die &#220;bermittlung anonymisierter Fallakten aktivieren</li>
+  </ul>
+ </div>
+%endif
+
+% if (h.getLogin() != 'adm'): 
+% if h.hasRole(['cm_ka']):
+<p>Hier werden Sie eine kurze &Uuml;bersicht Ihrer anliegenden Termine und
+Erinnerungen zu den F&auml;lle sehen.</p>
+<h2>${_('start_header_remind')}</h2>
+<table>
+	<tr>
+		<th width="100">${_('app_overview_tbl_header_date')}</th>
+		<th>${_('app_overview_tbl_header_desc')}</th>
+		<th>${_('app_overview_tbl_header_actions')}</th>
+	</tr>
+<!-- appointments for cm -->
+	<tr>
+		<td>07.12.2007</td>
+		<td>Akte pr&#252;fen </td>
+		<td>
+			<a href="/appointment/show/1">Anzeigen</a>
+			<a href="/appointment/delete/1">Löschen</a>
+		</td>
+	</tr>
+	<tr>
+		<td>17.12.2007</td>
+		<td>Auswertung Fallakten vorbereiten</td>
+		<td>
+			<a href="/appointment/show/2">Anzeigen</a>
+			<a href="/appointment/delete/2">Löschen</a>
+		</td>
+	</tr>
+	<tr>
+		<td>21.12.2007</td>
+		<td>Weihnachtsfeier</td>
+		<td>
+			<a href="/appointment/show/3">Anzeigen</a>
+		</td>
+	</tr>
+</table>
+<!-- appointments for cm -->
+% endif
+% if h.hasRole(['admin_ka']): 
+<p>Hier werden Sie eine kurze &Uuml;bersicht der allgemeinen Termine in der
+Kompetenzagentur sehen.</p>
+<h2>${_('start_header_remind')}</h2>
+<table>
+	<tr>
+		<th width="100">${_('app_overview_tbl_header_date')}</th>
+		<th>${_('app_overview_tbl_header_desc')}</th>
+		<th>${_('app_overview_tbl_header_actions')}</th>
+	</tr>
+<!-- appointments for admin -->
+	<tr>
+		<td>21.12.2007</td>
+		<td>Weihnachtsfeier</td>
+		<td>
+			<a href="/appointment/show/3">Anzeigen</a>
+			<a href="/appointment/delete/3">Löschen</a>
+		</td>
+	</tr>
+</table>
+<!-- appointments for admin -->
+% endif
+% endif

Added: trunk/waskaweb/templates/statement/default_statement.mako
===================================================================
--- trunk/waskaweb/templates/statement/default_statement.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/statement/default_statement.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,2 @@
+## -*- coding: utf-8 -*-
+${c.content}

Added: trunk/waskaweb/templates/statement/dialogs/confirm.mako
===================================================================
--- trunk/waskaweb/templates/statement/dialogs/confirm.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/statement/dialogs/confirm.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,8 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../../casemanagement/main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/">${_('cm_np_root')}</a></li>
+	<li><a href="#">${_('statement_np_edit')}</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/statement/dialogs/missing_statement.mako
===================================================================
--- trunk/waskaweb/templates/statement/dialogs/missing_statement.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/statement/dialogs/missing_statement.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,32 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="/case/">${_('cm_np_root')}</a></li>
+	<li><a href="#">${_('cm_np_show')}</a></li>
+</%def>
+<div class="dialog" />
+<h1><img src="/images/alert.png"/>Fehlende Einverständniserklärung</h1>
+<p>Für die gewählte Fallakte liegt noch keine Einverständniserklärung
+seitens des Jugendlichen vor. Die Fallakte darf daher keine personenbezogenen
+Daten enthalten. Die entsprechende Einhaltung der gesetzlichen Bestimmungen liegt
+in Ihrer Verantwortung.</p>
+% if h.hasRole(['cm_ka']):
+<p>Sie haben nun folgende Möglichkeiten:
+<ol>
+<li><strong>"Erklärung jetzt setzen"</strong>, wenn der Status zur Einverständniserklärung
+inzwischen geklärt wurde.</li>
+<li><strong>"Erklärung weiterhin unklar"</strong>, wenn die Einverständniserklärung noch
+eingeholt werden soll.</li>
+</ol>
+</p>
+<p>
+<a class="button" href="/statement/setPrivacyStatement/${c.ds_id}">Erklärung jetzt setzen</a>
+<a class="button" href="/case/select/${c.ds_id}/1">Erklärung weiterhin unklar</a>
+</p>
+% else:
+<p>
+<a class="button" href="/case/select/${c.ds_id}/1">OK</a>
+</p>
+% endif
+</div>

Added: trunk/waskaweb/templates/statement/edit.mako
===================================================================
--- trunk/waskaweb/templates/statement/edit.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/statement/edit.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,29 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../casemanagement/main.mako" />
+<h1>Einverständniserklärung</h1>
+<p>
+Für die gewählte Fallakte liegt aktuell noch keine Einverständniserklärung 
+zur Erfassung, Verarbeitung und Nutzung personenbezogener Daten seitens des
+Jugendlichen vor.
+</p>
+<br>
+<p>
+Sie können in diesem Dialog bestätigen, dass die Einverständniserklärung nun
+vorliegt. Alternativ können Sie angeben, dass die Erklärung sicher nicht vom
+Jugendlichen abgegeben wird. In diesem Fall wird die gewählte Fallakte
+anonymisiert und ist nicht mehr bearbeitbar.
+</p>
+<br>
+<p>
+Bitte beachten Sie, dass die Einverständniserklärung der schriftlichen Form
+bedarf. Dazu steht Ihnen eine <a href="/statement/printPrivacyStatement/${c.ds_id}" target="_blank">Druckversion dieser Erklärung</a> zur Verfügung.
+</p>
+<br>
+<div class="waska_form">
+<form id="waska_form" action="/statement/setPrivacyStatementAction" accept-charset="UTF-8" name="waska_form" method="POST">
+<div class="waska_form_element" w100>
+<input type="radio" name="statement_signed" value="1"><label for="statement">Die Einwilligungserklärung liegt vor.</label></div>
+<input type="radio" name="statement_signed" value="0"><label for="statement">Die Einwilligungserklärung liegt nicht vor.</label></div>
+<input type="hidden" name="case_id" value="${c.ds_id}"> 
+<br>
+<input type="submit" value="Speichern" name="save">

Added: trunk/waskaweb/templates/tests/forms.mako
===================================================================
--- trunk/waskaweb/templates/tests/forms.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/tests/forms.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,9 @@
+<%inherit file="../main.mako" />
+<form name="outer" action="/dummy/save">
+	<input name="outer_text" type="text"><br>
+	<form name="inner" action="/dummy/save2">
+		<input name="inner_text" type="text"><br>
+		<input type="submit" value="inner"><br>
+	</form>
+	<input type="submit" value="outer"><br>
+</form>

Added: trunk/waskaweb/templates/tests/trace.mako
===================================================================
--- trunk/waskaweb/templates/tests/trace.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/tests/trace.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,3 @@
+<%inherit file="../main.mako" />
+<%! import traceback, cgi %>
+<pre>${cgi.escape(unicode(traceback.format_exc(), "UTF-8", "ignore"))}</pre>

Added: trunk/waskaweb/templates/usersettings/change_password.mako
===================================================================
--- trunk/waskaweb/templates/usersettings/change_password.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/usersettings/change_password.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,40 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+ ${_('adm_header_changepassword')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='waska', action='settings', id=h.getUserId())}">${self.buildIco()} ${_('sm_menu_link_settings_back')}</a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+${self.buildFormErrors()}
+<div id="waska_form">
+<form action="${h.url_for(controller="usersettings", action="changePasswordAction")}" method="POST">
+	<fieldset><legend>${_('adm_form_legend_login')}</legend>
+	<div class="waska_form_element w50">
+		<label
+		for="passwd">${_('adm_form_newuser_passwd')}</label><br>
+                % if c.form_errors.get('passwd'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="password" class="field" id="passwd" name="passwd">
+	</div>
+	<div class="waska_form_element w50">
+		<label
+		for="passwd2">${_('adm_form_newuser_passwd_confirm')}</label><br>
+                % if c.form_errors.get('passwd2'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="password" class="field" id="passwd2" name="passwd2">
+	</div>
+	</fieldset>
+	<input type="hidden" name="uid" value="${h.getUserId()}">
+	<input class="btn_space" type="submit" value="${_('adm_form_changepassword_submit')}">
+</form>
+</div>

Added: trunk/waskaweb/templates/usersettings/change_password_login.mako
===================================================================
--- trunk/waskaweb/templates/usersettings/change_password_login.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/usersettings/change_password_login.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,39 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main_login.mako" />
+<div id="waska_form_login">
+<div id="waska_form_login_pw">
+<h1>${_('adm_header_changepassword_needed')}</h1>
+${self.buildFormErrors()}
+<p>Sie müssen Ihr Passwort neu setzen. Dies kann folgende Ursachen haben:<p>
+<ul>
+  <li>Sie melden sich zum ersten Mal mit einem initialen Passwort auf dem System an.</li>
+  <li>Sie haben &#252;ber einen langen Zeitraum das selbe Passwort verwendet. Dies ist aus Gründen der Sicherheit nicht zulässig.</li>
+  <li>Das Passwort wurde durch die Administration zurückgesetzt.</li>
+</ul>
+<p>Bitte geben Sie nun das von Ihnen gewünschte Passwort ein.
+</p>
+<div id="waska_form_login">
+<form action="${h.url_for(controller="usersettings", action="changePasswordOnLoginAction")}" method="POST">
+	<fieldset><legend>${_('adm_form_legend_login')}</legend>
+	<div class="waska_form_element w50">
+		<label
+		for="passwd">${_('adm_form_newuser_passwd')}</label><br>
+                % if c.form_errors.get('passwd'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="password" class="field" id="passwd" name="passwd">
+	</div>
+	<div class="waska_form_element w50">
+		<label
+		for="passwd2">${_('adm_form_newuser_passwd_confirm')}</label><br>
+                % if c.form_errors.get('passwd2'):
+                  <a href="#error_list"><img class="smallicon" src="/images/error_small.png"></a>
+                % endif
+		<input type="password" class="field" id="passwd2" name="passwd2">
+	</div>
+	</fieldset>
+	<input type="hidden" name="uid" value="${h.getUserId()}">
+	<input type="submit" value="${_('adm_form_changepassword_submit')}">
+</form>
+</div>
+</div>
\ No newline at end of file

Added: trunk/waskaweb/templates/usersettings/dialogs/notificate_setpassword.mako
===================================================================
--- trunk/waskaweb/templates/usersettings/dialogs/notificate_setpassword.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/usersettings/dialogs/notificate_setpassword.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../../main.mako" />
+<%def name="buildNavipath()">
+	${parent.buildNavipath()}
+	<li><a href="#">${_('adm_np_resetpassword')}</a></li>
+</%def>
+<%include file="../../dialogs/notification.mako" />

Added: trunk/waskaweb/templates/usersettings/edit_standin.mako
===================================================================
--- trunk/waskaweb/templates/usersettings/edit_standin.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/usersettings/edit_standin.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,37 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+ ${_('usrset_header_changestandin')}
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="${h.url_for(controller='waska', action='settings', id=h.getUserId())}">${self.buildIco()} ${_('sm_menu_link_settings_back')}</a></li>
+	</ul>
+    </div>
+  </div>
+</div>
+${self.buildFormErrors()}
+<div id="waska_form">
+<p>${_('usrset_explain_changestandin')}</p>
+<form action="${h.url_for(action="editStandinAction")}" method="POST">
+  <div class="waska_form_element w100">
+    <label
+    for="standin">${_('usrset_form_changestandin_standin')}</label><br>
+    <select name="standin" id="standin">
+      % for u in c.userlist:
+        % if u.id == c.uo.standin:
+          <option value="${u.id}" selected>${u.first_name}, ${u.last_name}</option>
+        % else:
+          <option value="${u.id}">${u.first_name}, ${u.last_name}</option>
+        % endif
+      % endfor
+          <option value="">Keine Vertretung</option>
+    </select>
+  </div>
+  <input type="hidden" name="uid" value="${h.getUserId()}">
+  <input class="btn_space" type="submit" value="${_('usrset_form_changestandin_submit')}">
+</form>
+</div>

Added: trunk/waskaweb/templates/usersettings/show_settings.mako
===================================================================
--- trunk/waskaweb/templates/usersettings/show_settings.mako	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/templates/usersettings/show_settings.mako	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,21 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+Mein Konto
+  </div>
+
+  <div id="modusfield">
+    <div class="actions">
+	<ul>
+		<li><a href="/usersettings/changePassword/${h.getUserId()}">${self.buildIco()} Passwort &auml;ndern</a></li>
+                % if h.hasRole(['cm_ka']):
+		<li><a href="/usersettings/editStandin/${h.getUserId()}">${self.buildIco()} Vertretung &auml;ndern</a></li>
+	        % endif
+	</ul>
+    </div>
+  </div>
+</div>
+<p>Hier sehen sie eine &#220;bersicht Ihrer pers&#246;nlichen Daten.</p>
+<%include file="../administration/show_user_body.mako" />

Added: trunk/waskaweb/tests/__init__.py
===================================================================
--- trunk/waskaweb/tests/__init__.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/tests/__init__.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,40 @@
+"""Pylons application test package
+
+When the test runner finds and executes tests within this directory,
+this file will be loaded to setup the test environment.
+
+It registers the root directory of the project in sys.path and
+pkg_resources, in case the project hasn't been installed with
+setuptools. It also initializes the application via websetup (paster
+setup-app) with the project's test.ini configuration file.
+"""
+import os
+import sys
+from unittest import TestCase
+
+import pkg_resources
+import paste.fixture
+import paste.script.appinstall
+from paste.deploy import loadapp
+from routes import url_for
+
+__all__ = ['url_for', 'TestController']
+
+here_dir = os.path.dirname(os.path.abspath(__file__))
+conf_dir = os.path.dirname(os.path.dirname(here_dir))
+
+sys.path.insert(0, conf_dir)
+pkg_resources.working_set.add_entry(conf_dir)
+pkg_resources.require('Paste')
+pkg_resources.require('PasteScript')
+
+test_file = os.path.join(conf_dir, 'test.ini')
+cmd = paste.script.appinstall.SetupCommand('setup-app')
+cmd.run([test_file])
+
+class TestController(TestCase):
+
+    def __init__(self, *args, **kwargs):
+        wsgiapp = loadapp('config:test.ini', relative_to=conf_dir)
+        self.app = paste.fixture.TestApp(wsgiapp)
+        TestCase.__init__(self, *args, **kwargs)

Added: trunk/waskaweb/tests/functional/__init__.py
===================================================================

Added: trunk/waskaweb/tests/functional/test_administration.py
===================================================================
--- trunk/waskaweb/tests/functional/test_administration.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/tests/functional/test_administration.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+from waskaweb.tests import *
+
+class TestAdministrationController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url_for(controller='administration'))
+        # Test response...

Added: trunk/waskaweb/tests/functional/test_appointment.py
===================================================================
--- trunk/waskaweb/tests/functional/test_appointment.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/tests/functional/test_appointment.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+from waskaweb.tests import *
+
+class TestAppointmentController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url_for(controller='appointment'))
+        # Test response...

Added: trunk/waskaweb/tests/functional/test_case.py
===================================================================
--- trunk/waskaweb/tests/functional/test_case.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/tests/functional/test_case.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+from waskaweb.tests import *
+
+class TestCaseController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url_for(controller='case'))
+        # Test response...

Added: trunk/waskaweb/tests/functional/test_document.py
===================================================================
--- trunk/waskaweb/tests/functional/test_document.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/tests/functional/test_document.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+from waskaweb.tests import *
+
+class TestDocumentController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url_for(controller='document'))
+        # Test response...

Added: trunk/waskaweb/tests/functional/test_usersettings.py
===================================================================
--- trunk/waskaweb/tests/functional/test_usersettings.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/tests/functional/test_usersettings.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+from waskaweb.tests import *
+
+class TestUsersettingsController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url_for(controller='usersettings'))
+        # Test response...

Added: trunk/waskaweb/tests/functional/test_waska.py
===================================================================
--- trunk/waskaweb/tests/functional/test_waska.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/tests/functional/test_waska.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+from waskaweb.tests import *
+
+class TestWaskaController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url_for(controller='waska'))
+        # Test response...

Added: trunk/waskaweb/tests/test_models.py
===================================================================

Added: trunk/waskaweb/websetup.py
===================================================================
--- trunk/waskaweb/websetup.py	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb/websetup.py	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,14 @@
+"""Setup the waskaweb application"""
+import logging
+
+from paste.deploy import appconfig
+from pylons import config
+
+from waskaweb.config.environment import load_environment
+
+log = logging.getLogger(__name__)
+
+def setup_config(command, filename, section, vars):
+    """Place any commands to setup waskaweb here"""
+    conf = appconfig('config:' + filename)
+    load_environment(conf.global_conf, conf.local_conf)

Added: trunk/waskaweb.egg-info/PKG-INFO
===================================================================
--- trunk/waskaweb.egg-info/PKG-INFO	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/PKG-INFO	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: waskaweb
+Version: 0.0.0dev
+Summary: UNKNOWN
+Home-page: UNKNOWN
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: UNKNOWN
+Platform: UNKNOWN

Added: trunk/waskaweb.egg-info/SOURCES.txt
===================================================================
--- trunk/waskaweb.egg-info/SOURCES.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/SOURCES.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,29 @@
+MANIFEST.in
+README.txt
+setup.cfg
+setup.py
+waskaweb/__init__.py
+waskaweb/websetup.py
+waskaweb.egg-info/PKG-INFO
+waskaweb.egg-info/SOURCES.txt
+waskaweb.egg-info/dependency_links.txt
+waskaweb.egg-info/entry_points.txt
+waskaweb.egg-info/paste_deploy_config.ini_tmpl
+waskaweb.egg-info/requires.txt
+waskaweb.egg-info/top_level.txt
+waskaweb/config/__init__.py
+waskaweb/config/environment.py
+waskaweb/config/middleware.py
+waskaweb/config/routing.py
+waskaweb/controllers/__init__.py
+waskaweb/controllers/error.py
+waskaweb/controllers/template.py
+waskaweb/lib/__init__.py
+waskaweb/lib/app_globals.py
+waskaweb/lib/base.py
+waskaweb/lib/helpers.py
+waskaweb/model/__init__.py
+waskaweb/public/index.html
+waskaweb/tests/__init__.py
+waskaweb/tests/test_models.py
+waskaweb/tests/functional/__init__.py

Added: trunk/waskaweb.egg-info/dependency_links.txt
===================================================================
--- trunk/waskaweb.egg-info/dependency_links.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/dependency_links.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1 @@
+

Added: trunk/waskaweb.egg-info/entry_points.txt
===================================================================
--- trunk/waskaweb.egg-info/entry_points.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/entry_points.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,7 @@
+
+    [paste.app_factory]
+    main = waskaweb.config.middleware:make_app
+
+    [paste.app_install]
+    main = pylons.util:PylonsInstaller
+    
\ No newline at end of file

Added: trunk/waskaweb.egg-info/paste_deploy_config.ini_tmpl
===================================================================
--- trunk/waskaweb.egg-info/paste_deploy_config.ini_tmpl	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/paste_deploy_config.ini_tmpl	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,58 @@
+#
+# waskaweb - Pylons configuration
+#
+# The %(here)s variable will be replaced with the parent directory of this file
+#
+[DEFAULT]
+debug = true
+email_to = you at yourdomain.com
+smtp_server = localhost
+error_email_from = paste at localhost
+
+[server:main]
+use = egg:Paste#http
+host = 0.0.0.0
+port = 5000
+
+[app:main]
+use = egg:waskaweb
+full_stack = true
+cache_dir = %(here)s/data
+beaker.session.key = waskaweb
+beaker.session.secret = ${app_instance_secret}
+app_instance_uuid = ${app_instance_uuid}
+
+# If you'd like to fine-tune the individual locations of the cache data dirs
+# for the Cache data, or the Session saves, un-comment the desired settings
+# here:
+#beaker.cache.data_dir = %(here)s/data/cache
+#beaker.session.data_dir = %(here)s/data/sessions
+
+# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
+# Debug mode will enable the interactive debugging tool, allowing ANYONE to
+# execute malicious code after an exception is raised.
+set debug = false
+
+
+# Logging configuration
+[loggers]
+keys = root
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = INFO
+handlers = console
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(asctime)s %(levelname)-5.5s [%(name)s] %(message)s

Added: trunk/waskaweb.egg-info/paster_plugins.txt
===================================================================
--- trunk/waskaweb.egg-info/paster_plugins.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/paster_plugins.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1,3 @@
+Pylons
+WebHelpers
+PasteScript

Added: trunk/waskaweb.egg-info/requires.txt
===================================================================
--- trunk/waskaweb.egg-info/requires.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/requires.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1 @@
+Pylons>=0.9.6
\ No newline at end of file

Added: trunk/waskaweb.egg-info/top_level.txt
===================================================================
--- trunk/waskaweb.egg-info/top_level.txt	2008-08-13 12:54:59 UTC (rev 1)
+++ trunk/waskaweb.egg-info/top_level.txt	2008-08-13 13:01:12 UTC (rev 2)
@@ -0,0 +1 @@
+waskaweb



More information about the Mpuls-commits mailing list