[Mpuls-commits] r56 - in trunk: . formed waskaweb/config waskaweb/controllers waskaweb/i18n waskaweb/i18n/de/LC_MESSAGES waskaweb/lib waskaweb/model waskaweb/public waskaweb/public/images waskaweb/public/images/icons waskaweb/public/styles waskaweb/templates waskaweb/templates/appointments waskaweb/templates/casemanagement waskaweb/templates/casemanagement/dialogs waskaweb/templates/casemanagement/evaluation waskaweb/templates/logbook waskaweb/templates/logbook/dialogs waskaweb/templates/start waskaweb/tests/functional

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


Author: thomas
Date: 2008-08-13 15:15:49 +0200 (Wed, 13 Aug 2008)
New Revision: 56

Added:
   trunk/waskaweb/controllers/logbook.py
   trunk/waskaweb/lib/search.py
   trunk/waskaweb/model/logbook.py
   trunk/waskaweb/public/images/agplv3-155x51.png
   trunk/waskaweb/public/images/icons/anonym_red.gif
   trunk/waskaweb/public/images/icons/sort_asc.png
   trunk/waskaweb/public/images/icons/sort_desc.png
   trunk/waskaweb/public/servicezeit.html
   trunk/waskaweb/templates/casemanagement/agency_search.mako
   trunk/waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako
   trunk/waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako
   trunk/waskaweb/templates/casemanagement/dialogs/failed_markanonymize.mako
   trunk/waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako
   trunk/waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako
   trunk/waskaweb/templates/casemanagement/newLogbookEntry.mako
   trunk/waskaweb/templates/casemanagement/search.mako
   trunk/waskaweb/templates/casemanagement/selectParts.mako
   trunk/waskaweb/templates/logbook/
   trunk/waskaweb/templates/logbook/dialogs/
   trunk/waskaweb/templates/logbook/dialogs/confirm_delete_logbook_entry.mako
   trunk/waskaweb/templates/logbook/dialogs/failed_create_logbook_entry.mako
   trunk/waskaweb/templates/logbook/dialogs/failed_delete_logbook_entry.mako
   trunk/waskaweb/templates/logbook/dialogs/failed_save_logbook_entry.mako
   trunk/waskaweb/templates/logbook/dialogs/failed_show_logbook_entry.mako
   trunk/waskaweb/templates/logbook/dialogs/success_create_logbook_entry.mako
   trunk/waskaweb/templates/logbook/dialogs/success_delete_logbook_entry.mako
   trunk/waskaweb/templates/logbook/dialogs/success_save_logbook_entry.mako
   trunk/waskaweb/templates/logbook/edit.mako
   trunk/waskaweb/templates/logbook/edit_body.mako
   trunk/waskaweb/templates/logbook/new.mako
   trunk/waskaweb/templates/logbook/overview.mako
   trunk/waskaweb/templates/logbook/show.mako
   trunk/waskaweb/templates/start/globalappointmentlist.mako
   trunk/waskaweb/tests/functional/test_logbook.py
Modified:
   trunk/ChangeLog.txt
   trunk/Changes.txt
   trunk/formed/formedtree_web.xml
   trunk/formed/privacy_statement.html
   trunk/formed/waska-hilfetexte.xhtml
   trunk/waskaweb/config/routing.py
   trunk/waskaweb/controllers/CaseBase.py
   trunk/waskaweb/controllers/administration.py
   trunk/waskaweb/controllers/agency_overview.py
   trunk/waskaweb/controllers/case.py
   trunk/waskaweb/controllers/case_overview.py
   trunk/waskaweb/controllers/evaluate.py
   trunk/waskaweb/controllers/navigation.py
   trunk/waskaweb/controllers/statement.py
   trunk/waskaweb/controllers/waska.py
   trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po
   trunk/waskaweb/i18n/waskaweb.pot
   trunk/waskaweb/lib/csv.py
   trunk/waskaweb/lib/evaluation.py
   trunk/waskaweb/lib/excel.py
   trunk/waskaweb/lib/helpers.py
   trunk/waskaweb/lib/pdfimporter.py
   trunk/waskaweb/lib/renderer.py
   trunk/waskaweb/lib/sql_helper.py
   trunk/waskaweb/lib/validators.py
   trunk/waskaweb/lib/xmlexport.py
   trunk/waskaweb/lib/xmlimport.py
   trunk/waskaweb/model/agency.py
   trunk/waskaweb/model/appointment.py
   trunk/waskaweb/model/case.py
   trunk/waskaweb/model/casedocument.py
   trunk/waskaweb/model/document.py
   trunk/waskaweb/model/navigation.py
   trunk/waskaweb/model/nodecomponents.py
   trunk/waskaweb/model/repeatgroup.py
   trunk/waskaweb/model/user.py
   trunk/waskaweb/public/styles/all.css
   trunk/waskaweb/public/styles/color3.css
   trunk/waskaweb/public/styles/ie6.css
   trunk/waskaweb/public/styles/print.css
   trunk/waskaweb/public/styles/screen.css
   trunk/waskaweb/templates/appointments/appointmentlist.mako
   trunk/waskaweb/templates/appointments/overview.mako
   trunk/waskaweb/templates/appointments/remindlist_body.mako
   trunk/waskaweb/templates/casemanagement/agency_overview.mako
   trunk/waskaweb/templates/casemanagement/agencylist.mako
   trunk/waskaweb/templates/casemanagement/appointmentlist.mako
   trunk/waskaweb/templates/casemanagement/caselist.mako
   trunk/waskaweb/templates/casemanagement/dialogs/confirm_anonymize.mako
   trunk/waskaweb/templates/casemanagement/dialogs/success_anonymize.mako
   trunk/waskaweb/templates/casemanagement/downloadCSV.mako
   trunk/waskaweb/templates/casemanagement/downloadXLS.mako
   trunk/waskaweb/templates/casemanagement/downloadXML.mako
   trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako
   trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako
   trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako
   trunk/waskaweb/templates/casemanagement/export.mako
   trunk/waskaweb/templates/casemanagement/formular.mako
   trunk/waskaweb/templates/casemanagement/main.mako
   trunk/waskaweb/templates/casemanagement/organisation.mako
   trunk/waskaweb/templates/casemanagement/overview.mako
   trunk/waskaweb/templates/main.mako
   trunk/waskaweb/templates/start/help.mako
   trunk/waskaweb/templates/start/remindlist.mako
   trunk/waskaweb/templates/start/responsible.mako
   trunk/waskaweb/templates/start/start.mako
Log:
Load ddc4187afa3a into trunk.


Modified: trunk/ChangeLog.txt
===================================================================
--- trunk/ChangeLog.txt	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/ChangeLog.txt	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,3 +1,891 @@
+2008-07-01 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Tagged version 1.0.3rc5
+
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po: Changed verision string to
+	  1_0_3rc5
+
+	Issue482
+
+	* waskaweb/templates/appointments/remindlist_body.mako: Added default
+	  member f  unctions to the template
+
+	Issueissue383
+
+	* waskaweb/controllers/administration.py,
+	  waskaweb/lib/validators.py: changed validation on usergroups. 
+
+	Unsorted:
+
+	* waskaweb/templates/appointments/overview.mako: Removed explaination
+	string in appointment overview for admin. came from beta versions.
+	* waskaweb/lib/renderer.py: Fixed encoding error
+
+2008-07-01 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	Fixed Issue481
+
+	* waskaweb/lib/validators.py: raise validation exception if string is too long.
+	* waskaweb/templates/logbook/edit.mako,
+	  waskaweb/templates/logbook/edit_body.mako,
+	  waskaweb/templates/logbook/new.mako: Adjusted templates to print correct error
+	  message.
+
+2008-07-01 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	* Changes.txt: Updated to recent changes.
+
+2008-07-01 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Issue409 
+
+	* waskaweb/config/routing.py,
+	  waskaweb/controllers/CaseBase.py,
+	  waskaweb/controllers/case.py,
+	  waskaweb/templates/appointments/remindlist_body.mako,
+	  waskaweb/templates/start/remindlist.mako: Added function to mark a
+	  case as active directly from the blackboard.
+
+	Issue369
+
+	* waskaweb/controllers/waska.py,
+	  waskaweb/templates/start/start.mako,
+	  waskaweb/i18n/de/LC_MESSAGES/waskaweb.po
+	  waskaweb/i18n/waskaweb.pot
+	  waskaweb/templates/start/globalappointmentlist.mako: Separated
+	  global appointments on the blackboard in its own section.
+
+2008-06-30 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	Fixed Issue341
+
+	* waskaweb/lib/helpers.py: new function human_timedelta() which gives
+	  a timedelta in human readable form.
+	* waskaweb/model/appointment.py: use human_timedelta() for duration of
+	  appointments.
+
+2008-06-30 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Issue472 
+
+	* formed/formedtree_web.xml: New formedtree.
+	* formed/waska-hilfetexte.xhtml: New helptext for "Behinderung"
+
+	Issue465
+
+	* waskaweb/templates/start/responsible.mako,
+	  waskaweb/public/images/agplv3-155x51.png: Changed text on info page.
+	  The new version now includes licensing issues and differs between
+	  WASKA und mpuls. New version is commented out yet.
+
+	Issue479
+
+	* waskaweb/templates/casemanagement/search.mako: Added
+	  accept-charset="uft-8" to the search formularfield.  
+
+	Issue476
+
+	* waskaweb/templates/start/help.mako: Adjusted links on helppage to
+	  the new structure of the waska-anwender wiki 
+
+2008-06-30 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	Fixed Issue480
+
+	* waskaweb/controllers/agency_overview.py: Used pylons validator + htmlfill
+	  to fill the parts selection form.
+	  
+2008-06-30 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	* waskaweb/templates/casemanagement/downloadCSV.mako,
+	  waskaweb/templates/casemanagement/downloadXLS.mako,
+	  waskaweb/templates/casemanagement/downloadXML.mako: Adjusted templates
+	  for evaluation server.
+
+2008-06-27 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	Implemented anonymized XLS export.
+
+	* waskaweb/controllers/case_overview.py: use anonymize parameter.
+	* waskaweb/lib/excel.py: switch to anon views if anonymize parameter
+	  is given.
+	* waskaweb/model/case.py: use anonymize parameter.
+	* waskaweb/templates/casemanagement/downloadXLS.mako: Added anonymize 
+	  parameter to dialog.
+
+2008-06-27 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	Implemented anonymized CSV export.
+
+	* waskaweb/controllers/case_overview.py: use anonymize parameter.
+	* waskaweb/lib/csv.py: switch to anon views if anonymize parameter is given.
+	* waskaweb/model/case.py: use anonymize parameter
+	* waskaweb/templates/casemanagement/downloadCSV.mako: Changed dialog to use anonymize parameter
+	* waskaweb/templates/casemanagement/downloadXML.mako: Fix numbering.
+
+2008-06-27 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Hopfully last changes on evaluation and its workflow.
+
+	* waskaweb/lib/evaluation.py, 	  
+	  waskaweb/lib/search.py,
+	  waskaweb/controllers/agency_overview.py: Fixed timeframe query
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/controllers/evaluate.py,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:
+	  Searchoption on the evaluation result page are now only displayed if
+	  the user comes from the default search in the main-menu. Else hide
+	  search option as their impact is too complicated for users. 
+
+	Issue475
+
+	* formed/privacy_statement.html: Adjusted privacy statement to
+	standard workflow of anonymization.
+
+	Issue473
+
+	* waskaweb/templates/logbook/show.mako: Fixed output of note in show
+	dialog of an logbook entry.
+
+	Unsorted
+
+	* waskaweb/lib/validators.py: Make field "duration" disposable 
+
+2008-06-27 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	Implemented anonymized XML export.
+
+	* waskaweb/controllers/case_overview.py: added evaluation of flag
+	  for anonymization.
+	  
+	* waskaweb/lib/xmlexport.py: Switch to anon-views if export
+	  should be anonymized.
+
+	* waskaweb/model/case.py: take optional flag for anonymization.
+
+	* waskaweb/templates/casemanagement/downloadXML.mako: Attempt to
+	  make dialog look more like import (which failed partly).
+
+2008-06-27 	Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+	* waskaweb/lib/excel.py: Same '$'-Fix as for the CSV export.
+
+2008-06-26 	Frank Koormann <frank at intevation.de>
+
+	* formed/formedtree_web.xml: Reformatting of "Persoenliche Daten"
+	using new weights.
+
+2008-06-26 	Frank Koormann <frank at intevation.de>
+
+	Added further weights to the form element rendering
+
+	* waskaweb/lib/renderer.py: Enhanced list of weights.
+
+	* waskaweb/public/styles/all.css, waskaweb/public/styles/ie6.css:
+	Added weight styles
+
+2008-06-26 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Modified SQL query on evaluation server (massive perfomrance issues
+	with compressed ids)
+
+	* waskaweb/controllers/evaluate.py,
+	  waskaweb/lib/evaluation.py,
+	  waskaweb/model/agency.py: Added special code for building where
+	  statements of the evaluation querys if we are running an evaluation
+	  server. Because of some side effects this isn't a really nice
+	  soluation and somewhat hackish. 
+	* waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:
+	  Fixed syntax errors
+
+	Changed version string
+
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po: 1_0_3rc4
+
+2008-06-26 	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/csv.py: Separate differen 'Unterstuetzungsangebote' of same
+	  kind with '$' instead of '_' to avoid proplems with name collisions.
+
+2008-06-24 	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fix related to Issue461
+
+	* waskaweb/lib/pdfimporter.py, waskaweb/model/case.py: comment out
+	  output of unknown fields.
+
+2008-06-24 	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed Issue467:
+
+	* waskaweb/templates/main.mako: Sanitized HTML
+	* waskaweb/lib/helpers.py: new function status_message(s) which generates
+	  a line suitable for the status bar.
+	* waskaweb/controllers/case.py: uses status_message() now
+
+2008-06-24 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Issue466
+
+	* waskaweb/templates/logbook/edit_body.mako,
+	  waskaweb/templates/logbook/show.mako: Automatic generated entries in
+	  logbook are not editable anymore.
+
+	Extended Searchoptions for evaluation server (not tested too much yet):
+
+	* waskaweb/config/routing.py,
+	  waskaweb/controllers/agency_overview.py,
+	  waskaweb/lib/search.py,
+	  waskaweb/lib/validators.py,
+	  waskaweb/model/agency.py,
+	  waskaweb/templates/casemanagement/agency_overview.mako,
+	  waskaweb/templates/casemanagement/agencylist.mako: Agency overview
+	  is now searchable with the following criteria: gender, cm_state, and
+	  timeframe. Further the listing is no sortable.
+
+	Fixed extended search
+
+	* waskaweb/lib/search.py: changed db query to get cases which are in
+	  cm to make use of a new view. Old view (master_tbl_eval_incm_view)
+	  leads to sideeffects if the user searches for cases including
+	  standin cases. 
+
+	Fixed evaluation 1
+
+	* waskaweb/controllers/evaluate.py,
+	  waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/i18n/waskaweb.pot,
+	  waskaweb/lib/evaluation.py,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:
+	  Differ more between all, incm and not incm in first evaluation. 
+
+	Fixed help texts
+
+	* formed/waska-hilfetexte.xhtml,
+	  waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/i18n/waskaweb.pot,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:
+	  Fixed some helptexts (feedback DLR)
+
+	Removed status message from bottom of the page
+
+	* waskaweb/templates/main.mako: Removed status msg.
+
+	Unsorted:
+	
+	* waskaweb/public/styles/print.css: Do not print status msg
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po: Set Versionstring to 1_0_3rc3
+
+2008-06-23 	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Partial fix for Issue463. Removed ids, uuids and master_ids from output.
+
+	* waskaweb/lib/csv.py: Fixed wrong usage of cursor.description.
+
+2008-06-23 	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/validators.py: Set appointments to 1 if missing
+	* waskaweb/lib/xmlexport.py: Removed needless parameter in selection
+
+2008-06-23 	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/xmlexport.py: Added 'tagebuch-sonstiges' to XML export.
+
+2008-06-23 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Restructured templates of logbook. Pylonisize dataflow for logbook
+
+	* waskaweb/controllers/case.py: Changed way how to set and validate
+	  logbook data.
+	* waskaweb/lib/validators.py: Added new validator for logbooks
+	* waskaweb/templates/casemanagement/editLogbookEntry.mako,
+	  waskaweb/templates/casemanagement/newLogbookEntry.mako,
+	  waskaweb/templates/logbook/dialogs/confirm_delete_logbook_entry.mako,
+	  waskaweb/templates/logbook/dialogs/failed_create_logbook_entry.mako,
+	  waskaweb/templates/logbook/dialogs/failed_delete_logbook_entry.mako,
+	  waskaweb/templates/logbook/dialogs/failed_save_logbook_entry.mako,
+	  waskaweb/templates/logbook/dialogs/failed_show_logbook_entry.mako,
+	  waskaweb/templates/logbook/dialogs/success_create_logbook_entry.mako,
+	  waskaweb/templates/logbook/dialogs/success_delete_logbook_entry.mako,
+	  waskaweb/templates/logbook/dialogs/success_save_logbook_entry.mako,
+	  waskaweb/templates/logbook/edit.mako,
+	  waskaweb/templates/logbook/edit_body.mako,
+	  waskaweb/templates/logbook/new.mako,
+	  waskaweb/templates/logbook/overview.mako,
+	  waskaweb/templates/logbook/show.mako: Moved and created new
+	  templates
+	* waskaweb/templates/casemanagement/dialogs/confirm_delete_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/failed_create_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/failed_delete_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/failed_save_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/failed_show_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_create_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_delete_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_save_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/logbook.mako,
+	  waskaweb/templates/casemanagement/showLogbookEntry.mako: Removed old
+	  templates
+
+	Added statusbar at top of the page, add help text to the
+	statementlisting
+
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/public/styles/color3.css,
+	  waskaweb/public/styles/screen.css,
+	  waskaweb/templates/main.mako: New style for statusbar at top of the
+	  page. Changed translation strings for more helo in statementlisting
+
+	Added default vlaues for new logbook entrys
+
+	* waskaweb/controllers/case.py: make use of htmlfill. 
+
+	Issue251
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/templates/casemanagement/overview.mako: Replaced two
+	  checkboxes for states "Offen" and "Geschlossen" with one "checkbox"
+	  for "Bearbeitbar" which includes both states. 
+	* waskaweb/templates/casemanagement/organisation.mako: Removed
+	  setting state from organisation
+
+	Changed version string
+
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po: Changed version string to
+	rc2
+
+	IE6 rendering fix
+
+	* waskaweb/public/styles/all.css,
+	  waskaweb/templates/casemanagement/overview.mako,
+	  waskaweb/templates/main.mako: Fixed rendering error in caseoverview
+	  (tablewidth)
+
+2008-06-23	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/model/logbook.py: Added short notice ('Nennung Sonstiges')
+	  and extend list of kinds ('Erstgespräche', 'Kompetenzfeststellung').
+
+	* waskaweb/templates/casemanagement/editLogbookEntry.mako,
+	  waskaweb/templates/casemanagement/logbook.mako,
+	  waskaweb/templates/casemanagement/newLogbookEntry.mako,
+	  waskaweb/templates/casemanagement/showLogbookEntry.mako: Add new field 
+	  and values to templates.
+
+2008-06-20 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po: Changed Version string.
+
+	Fixed Evaluation
+
+	* waskaweb/controllers/evaluate.py, 
+	  waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/i18n/waskaweb.pot,
+	  waskaweb/lib/evaluation.py,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:
+	  Fixed incorrect evaluation of the duration of cm. Added new evaluation
+	  for the averange duration of cm. Fixed evaluation on aid plan. 
+
+2008-06-18 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Adjusted for Version 1.0.3rc1
+
+	* Changes.txt: enhanced changes
+
+2008-06-17	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/templates/casemanagement/downloadCSV.mako,
+	  waskaweb/templates/casemanagement/downloadXLS.mako
+	  waskaweb/templates/casemanagement/downloadXML.mako: Added privacy warnings
+	  for exports.
+
+2008-06-17	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/controllers/case.py: Fix for issue460
+
+2008-06-17	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/xmlexport.py: Implemented export of documents.
+	* waskaweb/templates/casemanagement/selectParts.mako: Re-inserted submit button.
+
+2008-06-17	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/templates/casemanagement/selectParts.mako: Fixed h.url_for() usage.
+
+2008-06-17	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/xmlexport.py: Export log book.
+
+2008-06-16	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/xmlexport.py: Remove appointments
+	* waskaweb/templates/casemanagement/selectParts.mako: Remove from selection
+
+2008-06-16	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Partial XML (Part II). Implemented: export only parts of the data
+
+	* waskaweb/lib/xmlexport.py: Filter out unneeded parts.
+	* waskaweb/model/nodecomponents.py: added method to formed tree to find
+	  node by name only.
+
+2008-06-16	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Partial XML (Part I). Implemented: connect selection to export
+
+	* waskaweb/controllers/agency_overview.py,
+	  waskaweb/controllers/case_overview.py: fetch selection from session a
+	  connect it to export.
+
+	* waskaweb/model/case.py: Removed selection.
+	* waskaweb/lib/xmlexport.py: Re-inserted here.
+
+2008-06-16 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue459
+
+	* formed/waska-hilfetexte.xhtml,
+	  waskaweb/controllers/CaseBase.py,
+	  waskaweb/controllers/case.py,
+	  waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/i18n/waskaweb.pot,
+	  waskaweb/lib/helpers.py,
+	  waskaweb/model/navigation.py,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako,
+	  waskaweb/templates/casemanagement/formular.mako,
+	  waskaweb/templates/start/help.mako: Added new help texts
+
+	Fixed issue352
+
+	* formed/formedtree_web.xml: Added new options in formular: 
+	  "in der Maßnahme" and "sonstiges" for Zugang
+	  "sonstiges" in "Uebernahme in das CM nicht notwendig weil..."
+
+2008-06-16 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Worked on issue425
+
+	* waskaweb/controllers/case.py,
+	  waskaweb/public/styles/color3.css,
+	  waskaweb/public/styles/screen.css,
+	  waskaweb/templates/main.mako: Added status line at the bottom of the
+	  page. Actions in controller can write some information in
+	  c.status_msg which will be then displayed as status msg.
+	  Implemented this for setting the editor, standin and for saving
+	  formular page which had no notification dialog yet.
+
+	Fixed issue383
+
+	* waskaweb/controllers/administration.py,
+	  waskaweb/lib/validators.py: Added two new checks against the DB to
+	  the validator: 1. Check if a group with the given name already
+	  exist. 2. On creating a new user check if there is already a user
+	  with the given loginname. If so show error dialog.
+
+2008-06-12	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Make day time editable and prevent editing of automatic entries.
+
+	* waskaweb/lib/helpers.py,
+	  waskaweb/model/logbook.py: check day time
+	* waskaweb/templates/casemanagement/editLogbookEntry.mako,
+	  waskaweb/templates/casemanagement/logbook.mako,
+	  waskaweb/templates/casemanagement/newLogbookEntry.mako,
+	  waskaweb/templates/casemanagement/showLogbookEntry.mako: Adjusted templates
+
+2008-06-12 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Pylonisize the part selection of the xml export
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/lib/validators.py,
+	  waskaweb/model/case.py,
+	  waskaweb/templates/casemanagement/selectParts.mako: Removed special
+	  code from the template and let htmlfill handle to correct rendering
+	  of checked and unchecked boxes. Added new validator for this
+	  formular.
+
+	Added uuid for documents
+
+	* waskaweb/model/document.py: create function now has optional uuid
+	  param. If this param is not given than a fresh uuid will be
+	  genereated (db-side).
+
+	Worked on Issue448
+
+	* waskaweb/templates/casemanagement/caselist.mako: Added icon for
+	  cm_ka users to anonymize a case directly from the case overview.
+
+	Fixed Issue290
+
+	* waskaweb/templates/appointments/appointmentlist.mako,
+	  waskaweb/templates/casemanagement/appointmentlist.mako: Reformted
+	  html code. 
+
+2008-06-12	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/public/servicezeit.html: Fixed typo.
+
+2008-06-12	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/public/servicezeit.html: Simple HTML page for service purposes.
+
+2008-06-12	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/model/logbook.py: cleaned SQL
+	* waskaweb/templates/casemanagement/logbook.mako: Renamed to 'Tagebuch'
+
+2008-06-12	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Logbook (Part V). TODO: Cleanup code, really i18n. Implemented 'edit'
+
+	* waskaweb/controllers/case.py: Added controllers to edit log book entries.
+	* waskaweb/model/logbook.py: Enable entries to be stored by id.
+	* waskaweb/templates/casemanagement/main.mako: Removed i18n. :-(
+	* waskaweb/templates/casemanagement/newLogbookEntry.mako: Added modus field.
+	* waskaweb/templates/casemanagement/dialogs/failed_save_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_save_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/editLogbookEntry.mako: Dialogs for editing.
+
+2008-06-12	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Logbook (Part IV). TODO: i18n, edit entries. Implemented 'show'
+
+	* waskaweb/controllers/case.py: Added controllers to show log book entry
+	* waskaweb/model/logbook.py: Load individual entry by id
+	* waskaweb/templates/casemanagement/dialogs/failed_show_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/showLogbookEntry.mako: New. Templates
+	  for showing one entry.
+
+2008-06-12 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Issue451
+
+	* waskaweb/controllers/evaluate.py,
+	  waskaweb/lib/validators.py: Save search options on the evaluation
+	  page in a session so we can display the seleted time interval on the
+	  resultpages of the evaluation.
+
+	Worked on Issue14:
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/lib/search.py,
+	  waskaweb/templates/casemanagement/overview.mako: Added new search
+	  option "branch" to the search engine. This option can be used by
+	  admins to seperate cases to the differnet branches of their KA. 
+
+	Fixed Issue456: 
+
+	* waskaweb/templates/casemanagement/downloadCSV.mako: Emphasized (red
+	  color) problematics regarding to CSV export in CSVExport-Diaolog. 
+
+2008-06-11	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Logbook (Part III). TODO: i18n, edit entries. implemented 'delete'
+
+	* waskaweb/config/routing.py: New route for delete confirmation
+	* waskaweb/controllers/case.py: controllers for deletion of log book entries.
+	* waskaweb/model/logbook.py: Enabled to delete entries from database.
+	* waskaweb/templates/casemanagement/dialogs/confirm_delete_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/failed_delete_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_delete_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/newLogbookEntry.mako: New. Confirmation, 
+	  success and failure dialogs.
+
+2008-06-11	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Logbook (Part II). TODO: i18n, edit/delete entries. implemented 'create'
+
+	* waskaweb/controllers/case.py: controllers for creation of new log book entries.
+	* waskaweb/lib/helpers.py: New helper for time intervals
+	* waskaweb/model/logbook.py: Enabled to store entries to database.
+	* waskaweb/model/user.py: Add a method for shortened name.
+	* waskaweb/templates/casemanagement/logbook.mako: Removed i18n.
+	* waskaweb/templates/casemanagement/dialogs/failed_create_logbook_entry.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_create_logbook_entry.mako: New.
+	  dialogs after (successful) creation of new log book entry.
+
+2008-06-11	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/model/logbook.py: Fixed text substitution.
+
+2008-06-11 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Issue448
+
+	* waskaweb/controllers/case.py,
+	  waskaweb/templates/casemanagement/main.mako: Small textchanges in
+	  the confirmation dialogs. 
+	* waskaweb/public/images/icons/anonym_red.gif: Added missing icon for
+	  issue448
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/i18n/waskaweb.pot: Added new translated strings
+	* waskaweb/model/case.py: Call anonymize wrapper function.
+
+	Issue452: Implemented more bundled actions
+
+	* waskaweb/controllers/case.py,
+	  waskaweb/controllers/case_overview.py,
+	  waskaweb/templates/casemanagement/overview.mako,
+	  waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako:
+	  Added bundled action for anonymisation, mark for anonymisation and
+	  restoring cases in the web gui. Workflow ist functional now 
+	
+	Issue126
+
+	* waskaweb/model/case.py: Print "0" instead of "-/-" for age in case
+	  digest if child is younger that one year.
+
+	Issue410
+
+	* waskaweb/model/appointment.py: Filter out reminders and appointments
+	  of cases for which the current user is only standin. Admin will still
+	  see reminders on outdated cases.
+
+	Unsorted:
+
+	* waskaweb/templates/casemanagement/overview.mako: Added new labels on
+	  the extended search link which depends on the extended search is
+	  visible or not.
+
+2008-06-10 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	* waskaweb/lib/search.py: Changed field for the end of the timeframe
+	  from last access time  to field "beendigung_5"
+
+	Issue447 (fix preview)
+
+	* waskaweb/controllers/case_overview.py
+	  waskaweb/lib/search.py: Changed default search options in case
+	  overview for admin users. On default they only see cases with are
+	  marked for deletion or for anonymisation
+
+	Issue448
+
+	* waskaweb/config/routing.py,
+	  waskaweb/controllers/case.py,
+	  waskaweb/controllers/case_overview.py,
+	  waskaweb/controllers/statement.py,
+	  waskaweb/model/case.py,
+	  waskaweb/templates/casemanagement/caselist.mako,
+	  waskaweb/templates/casemanagement/dialogs/confirm_anonymize.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_anonymize.mako,
+	  waskaweb/templates/casemanagement/main.mako,
+	  waskaweb/templates/casemanagement/overview.mako,
+	  waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako,
+	  waskaweb/templates/casemanagement/dialogs/failed_markanonymize.mako,
+	  waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako:
+	  Implemented the anonymisation of a case in the way like it is done
+	  for deleting cases: Anonymisation is now done in two steps. First
+	  marking it for deletion. Second anonymize, whereby the first step is
+	  done by users with cm-ka role and the second step will be done by
+	  users with admin-ka role.
+
+
+2008-06-10	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Logbook (Part I). TODO: i18n, add/edit/delete entries. Implemented 'overview'
+
+	* waskaweb/controllers/case.py: render logbook overview.
+	* waskaweb/lib/helpers.py: new time interval function
+	* waskaweb/templates/casemanagement/main.mako: Added link to logbook
+	* waskaweb/controllers/logbook.py: New. controller for logbook handling. Empty.
+	* waskaweb/model/logbook.py: New. Model for logbook and entries.
+	* waskaweb/templates/casemanagement/logbook.mako: New. Template for the logbook overview.
+	* waskaweb/tests/functional/test_logbook.py: New. Test stub.
+
+2008-06-09 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue417
+
+	* waskaweb/controllers/evaluate.py,
+	  waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/i18n/waskaweb.pot,
+	  waskaweb/lib/evaluation.py,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:
+	  Added two new evaluations over all cases. First highest graduation
+	  and current work situation.
+
+	Implemented toggling of the extended search
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/templates/casemanagement/overview.mako: Extended search can
+	  now be opened and collapsed. In collopses state no extended search
+	  option will be used for a search and only the default options will
+	  be used.
+
+	Implemented search on cm state
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/controllers/evaluate.py,
+	  waskaweb/lib/search.py,
+	  waskaweb/templates/casemanagement/overview.mako: Search for the
+	  cm-state of a case is now functional.
+
+	Implemented extended search with more search options
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/controllers/evaluate.py,
+	  waskaweb/lib/validators.py,
+	  waskaweb/templates/casemanagement/overview.mako: Added field for
+	  gender selection, Added field for setting a timeframe, adding field
+	  for selecting case_state (non functional yet). Moved checkboxes for
+	  open and closed cases to the extended search as these options are
+	  not used frequently. Added counting of different types of cases in
+	  the search results.
+	  Openening and collapsing the extended search is not functional yet.
+
+2008-06-06 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue423
+
+	* waskaweb/lib/renderer.py,
+	  waskaweb/model/repeatgroup.py: Added additional field in the aidlist
+	  overview. Modified SQL statement to fetch some more information to
+	  the aid.
+
+	Fixed issue333
+
+	* waskaweb/model/case.py: The name of the editor is updated in the
+	  master_tbl when the admin changes the editor. 
+
+	Fixed issue416
+
+	* formed/formedtree_web.xml: New formedtree which includes additional
+	  option on familienstand ('in fester Partnerschaft')
+
+	Fixed issue397
+
+	* formed/formedtree_web.xml: New formedtree which includes additional
+	  option on Rechstkreis ('SGB IX')
+
+	Worked on issue14
+
+	* waskaweb/lib/search.py: Added searchoption "gender" to the search engine
+
+2008-06-05	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/xmlimport.py: Do not crash if cases without UUIDs
+	  are imported.
+	  
+2008-06-05 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Added search on timeintervals
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/model/case.py: The "searchengine" now understands four new
+	  keywords which can be used to define a timeinterval for cases.
+	  These are: the start and end date und the fields in the database
+	  holding the fields which will be tested.
+	  Default search. If no date is given the search will look for the
+	  date of first contact and the last access time. Time intervall is
+	  1970-01-01 - today. 
+
+	Refactored search
+
+	* waskaweb/model/case.py,
+	  waskaweb/lib/search.py: Extracted search specific code out of the
+	  caseoverview und put it into the new lib "search" which can now be
+	  used at other places to
+
+	Implemented search mask for timeintervals on evaluations
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/controllers/evaluate.py,
+	  waskaweb/lib/sql_helper.py: Added search method in the evaluation
+	  controller. It is able to search for cases in a particular time
+	  interval and the does a evaluation on search result. 
+
+	* waskaweb/public/styles/screen.css,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako,
+	  waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:
+	  Added search mask to define a timeinterval on the the evaluation.
+
+	Fixed issue426
+
+	* waskaweb/controllers/case_overview.py: Fixed spelling
+
+	Fixed issuei342
+	
+	* waskaweb/lib/renderer.py: Replace '\r' and '\r\n' with <br> tag in
+	  readonly mode too.
+
+	Fixed issue427
+
+	* waskaweb/model/casedocument.py: Removed forgotten debugging output
+
+2008-06-05	Sascha L. Teichmann <teichmann at intevation.de>
+
+	GUI for partial XML export
+
+	* waskaweb/controllers/agency_overview.py, waskaweb/controllers/case_overview.py:
+	  Store selection to session.
+
+	* waskaweb/model/case.py: Added model for selection. TODO: feed to XML export
+
+	* waskaweb/templates/casemanagement/downloadXML.mako: add third button to select
+	  parts of the document.
+
+	* waskaweb/templates/casemanagement/selectParts.mako: New. Parts of the case.
+
+2008-06-04 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Implemented sorting in case overview.
+
+	* waskaweb/config/routing.py
+	  waskaweb/controllers/case_overview.py
+	  waskaweb/model/case.py: Modified SQL search string. It now takes two
+	  additional params: the field on which the sorting will happen and
+	  the oder of the sorting.
+
+	* waskaweb/templates/casemanagement/caselist.mako,
+	  waskaweb/public/styles/screen.css,
+	  waskaweb/public/images/icons/sort_asc.png,
+	  waskaweb/public/images/icons/sort_desc.png: Added sorting icons in
+	  the caselisting. 
+
+2008-06-03 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Implemented evaluation over subsets of cases and agencys
+	(evaluation-server)
+
+	* waskaweb/config/routing.py: Added new route for resetting the
+	  evaluation (evaluate over all cases again after defining a subset)
+	* waskaweb/controllers/agency_overview.py: Added evaluation for
+	  agencys. Basically build a huge casebundle which will be uses for
+	  the evaluation.
+	* waskaweb/controllers/case_overview.py: Implement evaluation over
+	  cases.
+	* waskaweb/controllers/evaluate.py
+	  waskaweb/lib/evaluation.py,
+	  waskaweb/lib/sql_helper.py: Modified sql statements in evaluation to
+	  support subsets of cases.
+	* waskaweb/templates/casemanagement/agency_overview.mako,
+	  waskaweb/templates/casemanagement/overview.mako,
+	  waskaweb/templates/main.mako: Added evaluation to the selection
+	  field on overviewpages. Added reset param to the evaluate link in
+	  the main menue.
+
+	Remove evaluation option from bundled actions if the users searches
+	for cases of an particualr user (privacy)
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/templates/casemanagement/overview.mako: Added
+	  regular expression to check wheter the search string contains editor
+	  specific earch options. If so then hide evalution option in
+	  case-overview.
+
 2008-05-30	Sascha L. Teichmann <teichmann at intevation.de>
 
 	* Changes.txt: Adjusted for 1.0.2

Modified: trunk/Changes.txt
===================================================================
--- trunk/Changes.txt	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/Changes.txt	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,3 +1,136 @@
+1.0.3:
+
+	Neu:
+	
+		* Workflow der Anonymisierung von Fallakten ist nun an das des
+		  Löschens der Fallakten angepasst. Das Anonymisieren ist nun
+		  auch 2-stufig realisiert (issue448). 
+
+		* Falltagebuch verfügbar. Neben den Terminen und Dokumenten
+		  steht nun mit dem Falltagebuch eine weitere unterstützende
+		  Funktion zur Verfügung. Der CM kann hier den Verlauf des CM 
+		  in Form von chronologisch aufeinander folgenden Einträgen
+		  dokumentieren.
+
+        * Beim Exportieren von XML, CSV und XLS wird jetzt angeboten,
+          die Daten anonymsiert zu exportieren. Dies ist die Standardvorgabe.
+
+		* Der XML-Fallaktenexport kann nun auch partiell durchgeführt werden.
+		  Hierzu wurde ein Dialog zur Verfügung gestellt, in dem der
+		  Benutzer die Teile der Fallakte auswählen kann die Exportiert
+		  werden sollen.
+
+        * Auf dem Schwarzenbrett werden die Termine und Wiedervorlagen
+          jetzt in drei Kategorien aufgelistet:
+          Automatisierte Wiedervorlagen, Eigene Termine, Agenturtermine
+
+		* Erweiterung und Umstrukturierung der Suchmaske in der
+		  Fallaktenübersicht. Folgende Suchoptionen wurden hinzugefügt:
+		  	
+			+ Such nach Geschlecht
+			+ Suche nach CM-Status (Beratung, CM, Abgschlossen...)
+			+ Suche über Zeitintervalle ("Aktive" Fälle im 1. Quartal
+			  2008)
+			+ Suche nach der Filliale für die Administration (issue14)
+		  
+		  Nicht so häfig genutzte Suchoptionen wurden in einen Bereich
+		  "erweiterte Suche" verlegt, der auf Wunsch eingeblendet werden
+		  kann.
+
+		* Erweiterung der Fallakte. Folgende Felder wurden hinzugefügt:
+
+			+ Rechtskreis: SGB XII (issue397)
+			+ Familienstand: "in fester Partnerschaft" (issue416)
+			+ beim Zugang befand..: "sonstiges", "in der Maßnahme
+			(issue352)
+			+ Weitere Verlauf/Eine Übernahmen ins CM: "sonstiges"
+
+		* Zwei neue Auswertungen verfügbar. Folgende Auswertungen
+		  wurden in die WASKA-interne Auswertung hinzugefügt (issue417):
+
+		  	+ Arbeitsituation des Jugendlichem beim Zugang
+			+ Höchster erreichte Schulabschluss beim Zugang
+
+		* Die Ergebnisseiten wurden um die Angaben eines Zeitintervalls
+		  erweitert (siehe Suchoptionen Fallaktenübersicht)
+
+		* Issue425: WASKA verfügt nun über eine Statuszeile in der z.B
+		  zusätzlich Informationen zu erfolgreich durchgeführten
+		  Aktionen angezeigt werden können ohne einen extra
+		  Bestätigungsdialog einzubauen.
+
+		* Issue459: Einbau von weiteren Hilfstexten (Kontexthilfen) 
+
+	Verbessert:
+
+		* Auswertungen sind nun auch über Teilmengen von Fällen möglich.
+		  Die Fallakten über die eine Auswertung durchgeführt werden
+		  soll müssen dazu in der Fallaktenübersicht markiert werden.
+		  Danach kann die Aktion "Auswerten" aus der Auswahlliste
+		  gewählt werden. 
+		  Auf dem Auswerteserver ist eine Auswertung auch über eine
+		  Teilmenge von Agenturen möglich.
+
+		* Um eine Leistungsüberwachung der CM zu verhindern wurde die
+		  Option "Auswerten" aus der Auswahlliste entfernt wenn der
+		  Administrator nach Fallakten eine bestimmten CM sucht. 
+
+		* Sortierung der Fallaktenübersicht. Die einzelnen Spalten der
+		  Fallakten lassen sich nun auf- und absteigend sortieren
+
+		* Schwebend gelöschte Fallakten werden nicht mehr in der
+		  Auswertung berücksichtigt.
+
+        * Beim Export von CSV- und XLS-Dateien werden die einzelnen Feldbezeichner
+          der Unterstützungensangebote des selben Typus jetzt mit einen Dollar-Zeichen
+          voneinander getrennt. (Issue463)
+
+		* Issue426: Tippfehler beseitig
+		* Issue342: Umbruchprobleme in Freitextfelder im Ansichtsmodus
+		  behoben
+		* Issue333: Bei dem Wechsel des Bearbeiters wird nun automatisch
+		  auch der Name des neuen Bearbeiters in der Fallakte
+		  anchgetragen.
+		* Issue423: Zusätzliches Feld "Art der Unterstützung" in der
+		  Übersicht der Unterstützungsangebot eingefügt.
+		* Issue447: Die voreingestellten Suchoptionen für die
+		  Adminstration in der Fallaktenübersicht wurden so geändert das
+		  zunächst die Fälle angezeugt werden, die zur Anonymisierung
+		  oder zur Löschung anstehen.
+		* Issue410: Das schwarze Brett (für cm-nutzer) zeigt nun nur
+		  noch Termine und Erinnerung der eigenen Fälle und nicht mehr
+		  der Vertretungsfälle.
+		* Issue126: Wenn ein Jugendlicher jünger als 1 Jahr ist wird in
+		  der Zusammenfassung nun das Alter "0" anstatt "-/-" angezeigt.
+		* Issue456: Einbau eines nachdrücklichen Hinweis im CSV Export
+		  das es hier zu Problemen beim Import mit Office-Anwendungen
+		  kommen kann.
+		* Issue383: Einbau einer Überprüfung beim Anlegen einer
+		  Benutzergruppe ob es eine Gruppe mit gleichen Namen schon
+		  gibt.
+        * Issue251: Bezeichnung Zustand Fallakte "Geschlossen"
+        * Issue409: Abfrage inaktive Fallakte: Fallakte als aktiv "bestätigen"
+        * Issue369: Definition von Wiedervorlage und Termine/ Keine Doppelung von Terminanzeigen
+        * Issue341: Dauer eines Termin wird in der Terminansicht englisch dargestellt
+        * Issue472: Erweiterungen Datenmodell für ESF-Stammblatt
+        * Issue465: Überarbeitung Menü "Träger"
+        * Issue479: Fallaktensuche mit 'accept-charset="UTF-8"' formulieren.
+        * Issue476: Anpassung der Verweise auf WASKA-Anwender
+        * Issue480: Partieller XML-Export auf dem Auswertungs-Server funktioniert nicht.
+        * Issue475: Datenschutz Anpassung relvanter Dokumente an Standardfall "Anonymisierung"
+        * Issue473: Logbuch Ergänzung Termin anlegen/ Ausgabe Ergänung "Thema"
+        * Issue467: Englische Zeitstempel in deutschsprachiger Anwendung
+        * Issue466: Automatische Logbuch-Einträge sind bearbeitbar.
+
+	Sonstiges:
+
+		* Issue427: Entfernen von Debugging Ausgaben in den Serverlogs 
+        * Issue461: Zahl der Eintraege in apache2/error.log stark angestiegen
+
+    Auswertungs-Server:
+
+        * Optimierung der SQL-Anfragen
+
 1.0.2:
 
     Neu:

Modified: trunk/formed/formedtree_web.xml
===================================================================
--- trunk/formed/formedtree_web.xml	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/formed/formedtree_web.xml	2008-08-13 13:15:49 UTC (rev 56)
@@ -41,8 +41,11 @@
           <bool description="in der Schule" name="inderschule" value="0"/>
           <bool description="in der Ausbildung" name="inderausbildung" value="1"/>
           <bool description="in Arbeit" name="inarbeit" value="2"/>
+          <bool description="selbstständig" name="selbststaendig" value="6"/>
           <bool description="arbeitslos" name="arbeitslos" value="3"/>
+          <bool description="in der Maßnahme" name="indermaßnahme" value="5"/>
           <bool description="in der Erziehungszeit" name="indererziehungszeit" value="4"/>
+          <bool description="sonstiges" name="sonstiges" value="-2"/>
         </choice>
       </group>
       <choice description="Rechtlicher Kontext" formularname="Rechtlicher_Kontext" name="rechtlicher_kontext" size="1" target="h">
@@ -51,6 +54,7 @@
         <bool description="SGB III" name="sgbiii" value="1"/>
         <bool description="SGB VIII" name="sgbviii" value="2"/>
         <bool description="SGB XII" name="sgbxii" value="4"/>
+        <bool description="SGB IX" name="sgbix" value="5"/>
         <bool description="ungeklärt" name="ungeklaert" value="3"/>
       </choice>
       <choice description="Schnittstelle zu" formularname="Schnittstelle_zu" name="schnittstelle_zu" size="1" target="h">
@@ -59,6 +63,7 @@
         <bool description="SGB III" name="sgbiii" value="1"/>
         <bool description="SGB VIII" name="sgbviii" value="2"/>
         <bool description="SGB XII" name="sgbxii" value="4"/>
+        <bool description="SGB IX" name="sgbix" value="5"/>
         <bool description="ungeklärt" name="ungeklaert" value="3"/>
       </choice>
     </group>
@@ -82,30 +87,31 @@
   <page containers="a,b" description="Angaben zur Person" formularname="Personenangaben" name="page_1">
     <info invisible="s" name="info-1" target="a" value="Angaben zur Person"/>
     <group containers="a,b,c,d" description="Angaben  zur Person" invisible="s" name="angabenzurperson" target="b">
-      <group containers="a,b,c" description="Persönliche Daten" name="persoenlichedaten" target="a">
+      <group containers="a,b" description="Persönliche Daten" name="persoenlichedaten" target="a">
         <text description="Vorname" formularname="Vorname" function="suppress_value" maxlength="60" modes="-mode1.1anon" name="vorname_1" size="40" target="a"/>
         <text description="Name" formularname="Name" function="suppress_value" maxlength="60" modes="-mode1.1anon" name="name_1" size="40" target="a"/>
-        <choice description="Geschlecht" formularname="Geschlecht" name="geschlecht" size="1" target="b">
+        <date description="Geburtsdatum" formularname="Geburtsdatum" function="get_age" modes="-mode1.1anon" name="geburtsdatum" target="b:30"/>
+        <choice description="Geschlecht" formularname="Geschlecht" name="geschlecht" size="1" target="b:30">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <bool description="weiblich" name="weiblich" value="0"/>
           <bool description="männlich" name="maennlich" value="1"/>
           <bool description="intersexuell" name="intersexuell" value="2"/>
         </choice>
-        <date description="Geburtsdatum" formularname="Geburtsdatum" function="get_age" modes="-mode1.1anon" name="geburtsdatum" target="b"/>
-        <choice description="Familienstand" formularname="Familienstand" name="familienstand" size="1">
+        <choice description="Familienstand" formularname="Familienstand" name="familienstand" size="1" target="b:40">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <bool description="ledig" name="ledig" value="0"/>
           <bool description="verheiratet" name="verheiratet" value="1"/>
           <bool description="geschieden" name="geschieden" value="2"/>
           <bool description="verwitwet" name="verwitwet" value="3"/>
           <bool description="getrennt lebend" name="getrenntlebend" value="4"/>
+          <bool description="in fester Partnerschaft" name="infesterpartnerschaft" value="5"/>
         </choice>
       </group>
-      <group containers="a,b,c" description="Anschrift" name="anschrift" target="b">
+      <group containers="a,b" description="Anschrift" name="anschrift" target="b">
         <text description="Straße und Nummer" formularname="Straße" function="suppress_value" maxlength="200" modes="-mode1.1anon" name="strasse" size="50" target="a"/>
-        <text description="PLZ" formularname="PLZ" function="shorten_value:3" maxlength="60" name="plz" size="10" target="b:25"/>
-        <text description="Wohnort" formularname="Wohnort" function="suppress_value" maxlength="60" modes="-mode1.1anon" name="wohnort" size="40" target="b:75"/>
-        <choice description="Größe des Wohnortes" formularname="Groesse_Wohnort" name="groesse_wohnort" size="1" target="c">
+        <text description="PLZ" formularname="PLZ" function="shorten_value:3" maxlength="5" name="plz" size="5" target="b:15"/>
+        <text description="Wohnort" formularname="Wohnort" function="suppress_value" maxlength="60" modes="-mode1.1anon" name="wohnort" size="40" target="b:45"/>
+        <choice description="Größe des Wohnortes" formularname="Groesse_Wohnort" name="groesse_wohnort" size="1" target="b:40">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <bool description="Großstadt (&gt; 100.000 Einwohner)" name="grossstadt100000einwohner" value="0"/>
           <bool description="Mittelstadt (20.000 - 100.000 Einwohner)" name="mittelstadt20000_100000einwohner" value="1"/>
@@ -120,27 +126,27 @@
         <text description="E-Mail" formularname="Email" function="suppress_value" maxlength="120" name="email" size="60" target="b"/>
         <textarea cols="80" description="weitere Telefonnummern" formularname="telefon_sonstige" function="suppress_value" name="telefon_sonstige" rows="5" target="c"/>
       </group>
-      <group containers="a,b,c,d,e,f" description="Sonstige Angaben" name="sonstigeangaben" target="d">
+      <group containers="a,b,c,d,e,f,g" description="Sonstige Angaben" name="sonstigeangaben" target="d">
         <text description="Zweiter Wohnort (Anschrift)" formularname="Zweiter_Wohnort" function="suppress_value" maxlength="120" modes="-mode1.1anon" name="zweiter_wohnort" size="100" target="a"/>
         <choice description="Geburtsland" formularname="Geburtsland" name="geburtsland" size="1" target="b:50">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <external-choice name="external-choice-1" value="laender.xml"/>
           <bool description="Sonstiges" name="sonstiges" value="-2"/>
         </choice>
-        <text description="Nennung sonstiges Geburtsland" formularname="Geburtsland_sonstige_nennung" function="suppress_value2" maxlength="60" modes="default" name="geburtsland_sonstige_nennung" size="40" target="b"/>
+        <text description="Nennung sonstiges Geburtsland" formularname="Geburtsland_sonstige_nennung" function="suppress_value2" maxlength="60" modes="default" name="geburtsland_sonstige_nennung" size="40" target="b:50"/>
         <choice description="Muttersprache" formularname="Muttersprache" name="muttersprache" size="1" target="c:50">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <external-choice name="external-choice-0" value="sprachen.xml"/>
           <bool description="Sonstige" name="sonstige" value="-2"/>
         </choice>
-        <text description="Nennung sonstige Muttersprache" formularname="Muttersprache_sonstige_nennung" function="suppress_value2" maxlength="60" modes="default" name="muttersprache_sonstige_nennung" size="40" target="c"/>
-        <choice description="Staatsangehörigkeit" formularname="Staatsangehörigkeit" name="staatsangehoerigkeit" size="1" target="c:50">
+        <text description="Nennung sonstige Muttersprache" formularname="Muttersprache_sonstige_nennung" function="suppress_value2" maxlength="60" modes="default" name="muttersprache_sonstige_nennung" size="40" target="c:50"/>
+        <choice description="Staatsangehörigkeit" formularname="Staatsangehörigkeit" name="staatsangehoerigkeit" size="1" target="d:50">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <external-choice name="external-choice-9" value="staatsangehoerigkeit.xml"/>
           <bool description="Sonstige" name="sonstige" value="-2"/>
         </choice>
-        <text description="Nennung sonstige Staatsangehörigkeit" formularname="Staatsangehörigkeit_sonstige_nennung" function="suppress_value2" maxlength="60" modes="default" name="staatsangehoerigkeit_sonstige_nennung" size="40" target="d"/>
-        <choice description="Aufenthaltsstatus" formularname="Aufenthaltsstatus" name="aufenthaltsstatus" size="1" target="d:50">
+        <text description="Nennung sonstige Staatsangehörigkeit" formularname="Staatsangehörigkeit_sonstige_nennung" function="suppress_value2" maxlength="60" modes="default" name="staatsangehoerigkeit_sonstige_nennung" size="40" target="d:50"/>
+        <choice description="Aufenthaltsstatus" formularname="Aufenthaltsstatus" name="aufenthaltsstatus" size="1" target="e:50">
           <bool checked="s" description="Keine Angabe" name="keineangabe" value="-1"/>
           <bool description="Aufenthaltserlaubnis" name="aufenthaltserlaubnis" value="0"/>
           <bool description="Niederlassungserlaubnis" name="niederlassungserlaubnis" value="1"/>
@@ -151,13 +157,13 @@
           <bool description="keine" name="keine" value="6"/>
           <bool description="unbekannt" name="unbekannt" value="7"/>
         </choice>
-        <int description="Aufenthalt in Deutschland (Jahr)" formularname="Aufenthaltsdauer" maxvalue="0" minvalue="9999" name="aufenthaltsdauer" target="d"/>
-        <choice description="Ist der Vater des Jugendlichen in Deutschland geboren worden?" formularname="Vater" modes="-mode1.1,-mode1.0" name="vater" size="1" target="e">
+        <int description="Aufenthalt in Deutschland (Jahr)" formularname="Aufenthaltsdauer" maxvalue="0" minvalue="9999" name="aufenthaltsdauer" target="e:50"/>
+        <choice description="Ist der Vater des Jugendlichen in Deutschland geboren worden?" formularname="Vater" modes="-mode1.1,-mode1.0" name="vater" size="1" target="f">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <bool description="Ja" name="Ja" value="1"/>
           <bool description="Nein" name="Nein" value="0"/>
         </choice>
-        <choice description="Ist die Mutter des Jugendlichen in Deutschland geboren worden?" formularname="Mutter" modes="-mode1.1,-mode1.0" name="mutter" size="1" target="f">
+        <choice description="Ist die Mutter des Jugendlichen in Deutschland geboren worden?" formularname="Mutter" modes="-mode1.1,-mode1.0" name="mutter" size="1" target="g">
           <bool checked="true" description="Keine Angabe" name="keineangabe" value="-1"/>
           <bool description="Ja" name="Ja" value="1"/>
           <bool description="Nein" name="Nein" value="0"/>
@@ -231,7 +237,7 @@
       </group>
     </page>
     <page description="Gesundheitliche Situation" name="page_3">
-      <group containers="b,c" description="Gesundheitliche Situation" formularname="GesundheitlicheSittuation" invisible="s" name="gesundheitlichesittuation">
+      <group containers="b,c,d" description="Gesundheitliche Situation" formularname="GesundheitlicheSittuation" invisible="s" name="gesundheitlichesittuation">
         <info invisible="s" name="info-4" value="Gesundheitliche Situation"/>
         <group description="physische Beeinträchtigungen" name="physischebeeintraechtigungen" target="b">
           <bool description="Ärztliches Gutachten oder Ähnliches liegt vor (§28 Abs. 7 BDSG)" formularname="arzt_gutachten_physisch" modes="default" name="arzt_gutachten_physisch"/>
@@ -251,6 +257,11 @@
           </choice>
           <text description="Sonstige psychische Beeinträchtigungen" formularname="psychische_Beeinträchtigungen_text" function="check_bool:arzt_gutachten_psychisch" maxlength="60" name="psychische_beeintraechtigungen_text" size="40"/>
         </group>
+        <choice description="anerkannte Behinderung" name="anerkannte_behinderung" size="1" target="d">
+          <bool checked="s" description="Keine Angabe" name="keineangabe" value="-1"/>
+          <bool description="Ja" name="ja" value="1"/>
+          <bool description="Nein" name="nein" value="0"/>
+        </choice>
       </group>
     </page>
     <page description="Soziale Lage" name="page_4">
@@ -319,6 +330,8 @@
           <bool description="Realschule" name="realschule" value="3"/>
           <bool description="Gymnasium" name="gymnasium" value="4"/>
           <bool description="Berufschule" name="berufschule" value="5"/>
+          <bool description="Berufsvorbereitungsjahr (BVJ)" name="bvjschule" value="8"/>
+          <bool description="Berufsgrundbildungsjahr (BGJ)" name="bgjschule" value="9"/>
           <bool description="sonstige Schule" name="sonstigeschule" value="6"/>
           <bool description="keine Schule" name="keineschule" value="7"/>
         </choice>
@@ -343,7 +356,10 @@
             <bool description="Hauptschulabschluss (HSA)" name="hauptschulabschlusshsa" value="3"/>
             <bool description="Erweiterter/Qualifizierter HSA" name="erweiterterqualifizierterhsa" value="4"/>
             <bool description="Realschulabschluss/Mittlere Reife" name="realschulabschlussmittlerereife" value="5"/>
-            <bool description="Fachhochschulreife/Abitur" name="fachhochschulreifeabitur" value="6"/>
+            <bool description="Fachhochschulreife/Abitur 1. Bildungsweg" name="fachhochschulreifeabitur" value="6"/>
+            <bool description="Fachhochschulreife/Abitur 2. Bildungsweg" name="fachhochschulreifeabitur2" value="8"/>
+            <bool description="Berufsvorbereitungsjahr (BVJ)" name="bvjabschluss" value="9"/>
+            <bool description="Berufsgrundbildungsjahr (BGJ)" name="bgjabschluss" value="10"/>
             <bool description="Anderer Schulabschluss" name="andererschulabschluss" value="7"/>
           </choice>
           <choice description="Schulabschluss erworben in" formularname="Schulabschlusserwerbsland" name="schulabschlusserwerbsland" size="1" target="b">
@@ -430,8 +446,8 @@
           <textarea cols="80" description="Welche weiteren Tätigkeiten/Jobs?" formularname="weitere_Jobs_text" name="weitere_jobs_text" rows="5" target="e"/>
           <int description="Dauer der weiteren Tätigkeiten/Jobs insgesamt? (in Monaten)" formularname="Dauer_weitere_Tätigkeiten" maxvalue="240" minvalue="0" name="dauer_weitere_taetigkeiten" target="f"/>
         </group>
-        <group containers="a,b" description="Arbeitslosigkeit" formularname="Arbeitslosigkeit" name="arbeitslosigkeit" target="f">
-          <choice description="Arbeitslosigkeit" formularname="Arbeitslosigkeit" name="arbeitslosigkeit_1" size="1" target="a">
+        <group containers="a,b,c" description="Arbeitslosigkeit" formularname="Arbeitslosigkeit" name="arbeitslosigkeit" target="f">
+          <choice description="Arbeitslosigkeit (gemeldet)" formularname="Arbeitslosigkeit" name="arbeitslosigkeit_1" size="1" target="a">
             <bool checked="s" description="Keine Angabe" name="keineangabe" value="-1"/>
             <bool description="Ja" name="Ja" value="1"/>
             <bool description="Nein" name="Nein" value="0"/>
@@ -439,6 +455,16 @@
           <int description="Anzahl der Arbeitslosigkeitsperioden" formularname="Anzahl_Arbeitslosigkeit" maxvalue="99" minvalue="0" name="anzahl_arbeitslosigkeit" target="a"/>
           <int description="Dauer Arbeitslosigkeit nach der letzten Beschäftigung (in Monaten)" formularname="Dauer_nach_letzter_Beschäftigung" maxvalue="99" minvalue="0" name="dauer_nach_letzter_beschaeftigung" target="b"/>
           <int description="Dauer der Arbeitslosigkeit insgesamt (in Monaten)" formularname="Dauer_insgesamt" maxvalue="99" minvalue="0" name="dauer_insgesamt" target="b"/>
+          <choice description="ALG I-Bezug" name="bezug_alg1" size="1" target="c">
+            <bool description="Keine Angabe" name="keineangabe" value="-1"/>
+            <bool description="Ja" name="ja" target="1"/>
+            <bool description="Nein" name="nein"/>
+          </choice>
+          <choice description="ALG II-Bezug" name="bezug_alg2" size="1" target="c">
+            <bool description="Keine Angabe" name="keineangabe" value="-1"/>
+            <bool description="Ja" name="ja" target="1"/>
+            <bool description="Nein" name="nein"/>
+          </choice>
         </group>
         <group description="Wehrpflicht/Zivildienst/Freiwilligenjahr" formularname="Wehrpflicht_Zivildienst_Freiwilligenjahr" name="wehrpflicht_zivildienst_freiwilligenjahr" target="g">
           <choice description="Wehrpflicht/Zivildienst/Freiwilligenjahr" formularname="Wehrpflicht_Zivildienst_Freiwilligenjahr" name="wehrpflicht_zivildienst_freiwilligenjahr_1" size="1">
@@ -490,6 +516,7 @@
               <bool alternative="selbständig" description="in eine Maßnahme vermittelt wurde" name="ineinemassnahmevermitteltwurde" value="1"/>
               <bool alternative="Ausbildung" description="in eine Ausbildung vermittelt wurde" name="ineineausbildungvermitteltwurde" value="2"/>
               <bool alternative="Arbeit" description="in die Arbeit vermittelt wurde" name="indiearbeitvermitteltwurde" value="3"/>
+              <bool description="sonstiges" name="sonstiges" value="-2"/>
             </choice>
             <text description="Nennung Vermittlung" formularname="welche_vermittlung_nennung" maxlength="60" modes="default" name="welche_vermittlung_nennung" size="40" target="b"/>
           </group>
@@ -1241,8 +1268,13 @@
         </group>
         <group containers="a,b,c" description="Angaben zur Beendigung des CM" name="angabenzurbeendigungdescm" target="c">
           <date description="Beendigung" formularname="Beendigung" name="beendigung_5" target="a"/>
-          <choice description="Art der Beendigung" formularname="Art_Beendigung" name="art_beendigung" size="1" target="a">
+          <choice description="vorzeitige Beendigung" name="vorzeitige_beendigung" size="1" target="a">
             <bool checked="s" description="Keine Angabe" name="keineangabe" value="-1"/>
+            <bool description="Ja" name="ja" value="1"/>
+            <bool description="Nein" name="nein" value="0"/>
+          </choice>
+          <choice description="Art der Beendigung" formularname="Art_Beendigung" name="art_beendigung" size="1" target="b">
+            <bool checked="s" description="Keine Angabe" name="keineangabe" value="-1"/>
             <bool description="regulär" name="regulaer" value="0"/>
             <bool description="Abbruch" name="abbruch" value="1"/>
           </choice>
@@ -1284,6 +1316,7 @@
             <bool description="SGB III" name="sgbiii" value="1"/>
             <bool description="SGB VIII" name="sgbviii" value="2"/>
             <bool description="SGB XII" name="sgbxii" value="3"/>
+            <bool description="SGB IX" name="sgbix" value="4"/>
           </choice>
         </group>
       </group>

Modified: trunk/formed/privacy_statement.html
===================================================================
--- trunk/formed/privacy_statement.html	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/formed/privacy_statement.html	2008-08-13 13:15:49 UTC (rev 56)
@@ -72,9 +72,9 @@
 nicht mehr in dem geplanten oder erforderlichen Umfang gewährleistet werden
 kann.<br> Ziehe ich meinen Auftrag, mich von der Kompetenzagentur $KA_NAME bei der
 beruflichen und sozialen Integration begleiten zu lassen zurück, werden alle
-über mich gespeicherten Daten sofort gelöscht. Wenn die Begleitung nach einem
+über mich gespeicherten Daten sofort anonymisiert. Wenn die Begleitung nach einem
 Zeitraum von $KA_SPEICHERDAUER Tagen nach Abschluss nicht weitergeführt wird, werden meine
-Daten bei der Kompetenzagentur $KA_NAME gelöscht.<br> Ausgeschlossen von dieser
+Daten bei der Kompetenzagentur $KA_NAME anonymisiert.<br> 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

Modified: trunk/formed/waska-hilfetexte.xhtml
===================================================================
--- trunk/formed/waska-hilfetexte.xhtml	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/formed/waska-hilfetexte.xhtml	2008-08-13 13:15:49 UTC (rev 56)
@@ -125,5 +125,285 @@
       <h2>Art der Unterstützung</h2>
       <p>Wählen Sie hier bitte eine konkretere Beschreibung des Angebotes aus.</p>
     </div>
+    <!-- Hilfetext von Frau Dr. Burkova vom 29.05.2008 -->
+    <div id="abgang">
+      <h2>Klassenstufe/Abgang</h2>
+      <p>In welcher Klasse ist der Jugendliche von der Schule abgegangen?</p>
+    </div>
+    <div id="foerderbedarf">
+      <h2>Förderbedarf</h2>
+      <p>Wenn ein Bedarf zur Förderung eingetragen und ein Förderplan für den
+      Jugendlichen erstellt wurde, gilt der Jugendliche als ins CM aufgenommen
+      und wird dementsprechend als Case-Management-Kunde bei den Auswertungen
+      berücksichtigt.</p>
+    </div>
+    <div id="art_beendigung">
+      <h2>Art der Beendigung</h2>
+      <p>Mit der Angabe zur Art der Beendigung wird bei den Jugendlichen die Beendigung des Case-Managements im Sinne der regulären Beendigung oder des Abbruchs dokumentiert. Es handelt sich um eine formale Beendigung des Case-Managements, da die Nachbetreuungsphase dabei nicht berücksichtigt ist.</p>
+    </div>
+    <div id="angabenzurvermittlungnachdemcm">
+      <h2>Angaben zur Vermittlung nach dem CM</h2>
+      <p>Angaben zur Vermittlung geben in der Auswertung Auskunft über die Vermittlungssituation der Jugendlichen. Nach der Vermittlung beginnt die Phase der Nachbetreuung.</p>
+    </div>
+    <div id="eingliederung">
+      <h2>Eingliederung</h2>
+      <p>Erst nach der stattgefundenen Nachbetreuung gilt das Case-Management als abgeschlossen.</p>
+    </div>
+    <div id="info-7">
+      <h2>Weiterer Verlauf</h2>
+      <p>An dieser Stelle hat die Case-Managerin bzw. der Case-Manager die
+      Möglichkeit, das weitere Vorgehen in der Arbeit mit dem Jugendlichen zu
+      bestimmen, indem sie bzw. er die Notwendigkeit zur Kompetenzfeststellung
+      und zur eventuellen Übernahme des Jugendlichen ins Case-Management
+      begründet. Wenn es kein Bedarf an Case-Management besteht, gilt der
+      Jugendliche als Beratungskunde und wird dementsprechend bei den
+      Auswertungen als Beratungsfall erfasst.</p>
+    </div>
+    <div id="info-20">
+      <h2>Abschlußbewertung</h2>
+      <p>In der Abschlussbewertung werden zum einen Daten zum Verlauf bzw. zur
+      Beendigung des Case-Managements erfasst. Zum anderen wird die
+      Zielerreichung im Hinblick auf die soziale und berufliche Integration
+      des Jugendlichen dokumentiert. Während es sich bei der beruflichen
+      Integration um objektiv messbare Größen (z.B. erworbene Abschlüsse)
+      handelt, steht bei der sozialen Integration die Einschätzung der
+      Case-Managerin bzw. des Case-Managers im Mittelpunkt. An dieser Stelle
+      soll sie bzw. er ausgehend von den Erkenntnissen aus der längerfristigen
+      Zusammenarbeit mit dem Jugendlichen die Intensität und Stabilität der
+      persönlichen und gesellschaftlichen Bezugssysteme des Jugendlichen
+      beurteilen.</p>
+      
+      <p> Zum Schluss ist eine Prognose der Case-Managerin bzw.  des
+      Case-Managers gefragt. Hier soll sie bzw. er eine perspektivische
+      Einschätzung der beruflichen und sozialen Integration des Jugendlichen
+      geben. Bei der Abschlussbewertung ist es zu empfehlen, die
+      Selbsteinschätzung des Jugendlichen mit einzubeziehen.  Im Rahmen des
+      Datenmonitorings können Aussagen zur Zielereichung sowohl auf Ebene des
+      Programms als auch der Kompetenzagenturen getroffen werden. Zum einen
+      kann durch die festgelegten Indikatoren die Zielerreichung in Bezug auf
+      die berufliche und soziale Integration überprüft werden. Zum anderen
+      kann die Nachhaltigkeit im Hinblick auf die berufliche und soziale
+      Integration der Jugendlichen festgestellt werden.</p>
+
+      <p>In der Abschlussbewertung werden die Beendigung des Case-Managements
+      im Sinne der regulären Beendigung oder des Abbruchs sowie die
+      Vermittlung der Jugendlichen dokumentiert. Es handelt sich um eine
+      formale Beendigung des Case-Managements, die nur die
+      Vermittlungssituation der jungen Menschen darstellt und die
+      Nachbetreuungsphase gar nicht berücksichtigt.</p>
+
+      <p>Erst nach Ablauf der in der Abschlussbewertung individuell
+      festzulegenden Nachbetreuungszeit ist der Fall abgeschlossen und beginnt
+      die Löschfrist der Akte nach den Bestimmungen des Datenschutzes. Vor
+      Löschung wird der Fall nochmals der Administratorin bzw. dem
+      Administrator der Kompetenzagentur vorgelegt. Nach Löschung verbleiben
+      nur noch anonymisierte Daten im System, die nicht mehr veränderbar
+      sind.</p>
+    </div>
+    <div id="info-14">
+      <h2>Förderplanung</h2>
+      <p>Die individuelle Förderplanung erfolgt in zwei Schritten. Zunächst
+      soll auf der Grundlage der individuellen Ausprägungen von Kompetenzen
+      der Förderbedarf des Jugendlichen definiert werden. Danach werden
+      ausgehend vom Förderbedarf konkrete Unterstützungsangebote für den
+      Jugendlichen bestimmt. Für die bessere Strukturierung der
+      Unterstützungsleistungen werden diese den folgenden vier Bereichen
+      zugeordnet: allgemein bildender, berufsvorbereitender, beruflicher und
+      lebensweltorientierter Bereich. Machen Sie bitte nur Angaben zu den für
+      den Jugendlichen relevanten Unterstützungsbereichen. Pro Fall können
+      mehrere Förderpläne angelegt werden.  Die Förderplanung sollte
+      ausgedruckt und vom betreuten Jugendlichen wie auch von der
+      Case-Managerin bzw. vom Case-Manager unterzeichnet werden.</p>
+    </div>
+    <div id="info-9">
+      <h2>Ergebnisse der Kompetenzfestellung</h2>
+      <p>Im Abschnitt „Kompetenzfeststellung“ werden zunächst Angaben zu den
+      durchgeführten Verfahren gemacht und danach die Ergebnisse der
+      Kompetenzfeststellung dokumentiert.  Da in den Kompetenzagenturen
+      unterschiedliche Kompetenzfeststellungsverfahren mit unterschiedlichen
+      Schwerpunktsetzungen (z.B. Rechen- und Lesekompetenz oder Interessen und
+      Neigungen) zum Einsatz kommen, sieht dieser Abschnitt eine
+      differenzierte Zusammenfassung der Ergebnisse der eingesetzten
+      Kompetenzerfassung vor. Es kann sein, dass nicht zu allen Feldern auch
+      tatsächlich Ergebnisse vorliegen. Deshalb bitten wir die Case-Managerin
+      bzw. den Case-Manager, auf der Grundlage der vorliegenden Dokumente zur
+      Kompetenzfeststellung (Gutachten u.a.) Angaben nur zu den Kompetenzen
+      des Jugendlichen zu machen, die tatsächlich im
+      Kompetenzfeststellungsverfahren gemessen wurden. Felder, zu denen keine
+      Informationen vorliegen, bitte nicht ausfüllen!</p> 
+
+      <p>Um möglichst objektive Auskunft zum Entwicklungsstand der einzelnen
+      Kompetenzbereiche des Jugendlichen zu bekommen, wurde bei der
+      Kompetenzfeststellung eine weitgehende Kategorisierung und Standardisierung
+      der Kompetenzen vorgenommen. Dabei handelt es sich um folgende
+      Kompetenzbereiche: ausbildungs- und berufsbezogene Kompetenzen sowie soziale
+      und personale Kompetenzen. Die Ausprägungen der einzelnen Kompetenzen werden
+      nach einem Antwortschema von „stark ausgeprägt“ bis „sehr schwach ausgeprägt“
+      beschrieben. Beachten Sie bitte folgende Erläuterungen zu den
+      Ausprägungsstufen:</p> 
+      <ul>
+        <li>„stark ausgeprägt“ – die Kompetenzen kommen in vielen
+        Situationen zum Ausdruck und sind intensiv ausgeprägt,</li>
+        <li>„ausgeprägt“ – die
+        Kompetenzen treten nur zum Teil auf und sind weniger intensiv ausgeprägt,</li>
+        <li>„schwach ausgeprägt“ – die Kompetenzen treten selten auf und sind im geringen
+        Maße ausgeprägt, </li>
+        <li>„sehr schwach ausgeprägt“ – die Kompetenzen treten nur sehr
+        selten auf und haben eine sehr geringe Ausprägung.</li>
+      </ul>
+      <p>Die Darstellung der Kompetenzen ist am im 12. Kinder- und
+      Jugendbericht der Bundesregierung  dargestellten Modell der so genannten
+      Leitkompetenzen oder basalen Kompetenzen orientiert und wurde erweitert
+      um Dimensionen aus dem Kriterienkatalog Ausbildungsreife. Die
+      Kompetenzeinteilung in der Fallakte bildet Schwerpunkte (Ausrichtungen)
+      der unterschiedlichen Kompetenzfeststellungsverfahren in der
+      Berufsausbildungs- und Beschäftigungsförderung ab.</p>
+      
+      <p>„Entwicklung und Durchführung des Verfahrens zur Kompetenzfeststellung“ kann
+      nur eine Angabe gemacht werden – hier ist das, bezogen auf den Fall,
+      bedeutsamste Verfahren anzuklicken. Unter „Art des Verfahrens“ sind
+      Mehrfachantworten möglich, so dass alle eingesetzten
+      Kompetenzfeststellungsverfahren berücksichtigt werden können. Die „Ergebnisse
+      der Kompetenzfeststellung“ beziehen sich auf die Ergebnisse aller
+      Kompetenzfeststellungsverfahren.</p>
+    </div>
+    <div id="info-8">
+      <h2>Case-Management</h2>
+      <p>In diesem Abschnitt werden die Ihnen aus dem Case-Management
+      vertrauten Schritte - Kompetenzfeststellung und Förderplanung  -
+      abgebildet und nur die Jugendlichen erfasst, die ins Case-Management
+      aufgenommen wurden.<br/>Durch die exakte Abbildung Schritte kann
+      Datenmonitoring der Prozess des Case-Managements plausibel dargestellt
+      und besser begleitet werden. Zum einen kann durch die Erfassung der
+      quantitativen Größen des Case-Mangements (z.B. Dauer) der Personalbedarf
+      besser definiert werden. Zum anderen ist es möglich, durch die
+      festgelegten qualitativen Indikatoren die einzelnen Phasen des
+      Case-Managements (z.B. Kompetenzfeststellung) zielorientiert und
+      effizient zu gestalten. Darüber hinaus sollen wichtige Erkenntnisse zur
+      Vermittlungslage der Jugendlichen gewonnen werden. Ausgehend davon kann
+      eine bedarfsgerechte Angebotsplanung und -initiierung erfolgen.</p>
+    </div>
+    <div id="info-2">
+      <h2>Biographische Daten</h2>
+      <p>Dieser Abschnitt verschafft einen Überblick über die biografische
+      Situation des Jugendlichen. Dabei werden mehrere Aspekte der schulischen
+      Entwicklung sowie der Berufs- und Arbeitssituation erfragt, die für die
+      Übergänge Schule – Ausbildung – Arbeitswelt von besonderer Bedeutung
+      sind. Die differenziert erfassten biografischen Daten stellen eine
+      wichtige Arbeitsgrundlage mit dem Jugendlichen dar: Zum einen gewähren
+      diese einen detaillierten Einblick in die Sozialisationsspezifika des
+      Jugendlichen und zum anderen ermöglichen sie eine weitgehende
+      Strukturierung des Arbeitsprozesses.<br/>Im Rahmen des programmweiten
+      Datenmonitorings werden soziodemografische Strukturmerkmale sowie
+      Entwicklungsbedingungen der Jugendlichen erfasst und eine bessere
+      Zielgruppensteuerung angestrebt. Durch die Ermittlung der Merkmale der
+      Klienten der Kompetenzagenturen kann zum einen die Zielgruppe der
+      besonders benachteiligten Jugendlichen im Case-Management abgegrenzt
+      werden. Zum anderen kann dadurch der Koordinationsbedarf im Rahmen der
+      Kompetenzagentur festgestellt werden.</p>
+    </div>
+    <div id="info-1">
+      <h2>Angaben zur Person</h2>
+      <p>In diesem Abschnitt werden zunächst persönliche Daten der
+      Jugendlichen erfasst. Danach werden Angaben zum Migrationshintergrund,
+      zur familiären und gesundheitlichen Situation sowie zur sozialen Lage
+      des Heranwachsenden gemacht. Diese bilden eine Ausgangsbasis für die
+      weitere Beratung des Jugendlichen und für die eventuelle Übernahme ins
+      Case-Management.</p>
+    </div>
+    <div id="info-28">
+      <h2>Externe Ansprechpartner</h2>
+      <p>Die Kontaktdaten und Kundennummern von ARGE/Optionskommune, Agentur
+      für Arbeit, Jugendamt, Schule, Gerichtshilfe und weiteren Institutionen
+      dienen als Arbeitshilfe in der Kompetenzagentur und werden nicht durch
+      das zentrale Datenmonitoring eingelesen und ausgewertet.</p>
+    </div>
+    <div id="info-0">
+      <h2>Eingangs- und Zuständigkeitsdaten</h2>
+      <p>Angaben über die jeweiligen Zuständigkeiten sind für die bessere
+      Einordnung und Nutzung der Klientendaten in der Kompetenzagentur
+      wichtig. Im Rahmen des programmweiten Datenmonitorings werden z.B.
+      unterschiedliche Zugangswege der Jugendlichen ermittelt. Durch die
+      Erfassung dieser können informelle Zugänge (unmittelbares Umfeld) sowie
+      institutionelle Zugänge abgebildet werden. Ausgehend von diesen
+      Informationen kann der Koordinationsbedarf und -aufwand der
+      Kompetenzagentur und der einzelnen Institutionen abgestimmt werden.
+      </p>
+      <p>Falls im Laufe des Case-Managements die zuständige Mitarbeiterin bzw.
+      der zuständige Mitarbeiter in der Kompetenzagentur wechselt, soll im
+      Feld „Name der zuständigen Mitarbeiterin/des zuständigen Mitarbeiters in
+      der Kompetenzagentur“ der Name einfach überschrieben werden.</p>
+    </div>
+    <div id="help_eval_search_criteria">
+      <h2>Zeitangabe in der Auswertung</h2>
+      <p>
+        Bitte geben Sie den Zeitraum an, über den Sie die Auswertung durchführen
+        wollen. Wählen Sie "Keine Auswahl", wenn Sie keine Einschränkung der
+        entsprechenden Kategorie wünschen, und über einen unbeschränkten Zeitraum
+        auswerten wollen.
+      </p>
+    </div>
+    <div id="cm_evaluate_result_note">
+      <h2>Auswertungen</h2>
+      <p>
+      Durch die folgenden Auswertungen können Sie einige wichtige Aussagen
+      über die Jugendlichen in Ihrer Kompetenzagentur treffen. Die
+      Auswertungen beziehen sich sowohl auf alle im System erfassten
+      Jugendlichen als auch nur auf die Jugendlichen, die sich im
+      Case-Management befinden oder Case-Management abgeschlossen haben. Neben
+      den nachfolgenden Auswertungsfunktionen besteht die Möglichkeit des
+      Datenexports und der differenzierten Auswertungen in anderen Programmen.
+      </p>
+    </div>
+    <div id="cm_eval_note_ka_migration_background">
+      <h2>Migrationshintergrund</h2>
+      <p>
+      Der Migrationshintergrund wird im diesem Fall anhand eines wichtigen
+      Indikators, nämlich der Muttersprache des Jugendlichen ausgewertet.
+      </p>
+    </div>
+    <div id="eval_6_note">
+      <h2>Förderbedarf</h2>
+      <p>
+      Diese Auswertung wird nur über die Angaben des Förderbedarfs in der
+      Förderplanung geführt. Die tatsächliche Anzahl der eingetragenen
+      Unterstützungsangebote wird nicht berücksichtigt.
+      </p>
+    </div>
+    <div id="cm_eval_note_taken_over_to_cm">
+      <h2>Verhältnis Beratungskunden/Aufnahmen in das Case-Management (CM)</h2>
+      <p>
+	Unter Case-Management-Kunden werden Jugendliche erfasst, bei denen ein
+	Förderbedarf im Abschnitt „Förderplanung“ definiert wurde. Wenn es
+	keinen Bedarf an Case-Management gibt, gilt der Heranwachsende als
+	Beratungskunde und wird dementsprechend in der Auswertung
+	berücksichtigt.
+      </p>
+    </div>
+    <div id="cm_eval_note_access_youngster_to_agency">
+      <h2>Zugang des Jugendlichen zur Kompetenzagentur</h2>
+      <p>
+      Bei den Zugängen zur Kompetenzagentur werden sowohl formelle bzw.
+      institutionalisierte Wege (z.B. Schule, Jugendamt) als auch informelle
+      Wege (z.B. Lehrer, Freunde) ermittelt.
+      </p>
+    </div>
+    <div id="extended_search">
+      <h2>Erweiterte Suche</h2>
+      <p>
+      Durch die Funktion "erweiterte Suche" haben Sie eine
+      zusätzliche Möglichkeit, bestimmte Fallakten auszuwerten. Sie können
+      Ihre Fallakten nach Geschlecht, Status der Jugendlichen und Zeitraum der
+      Betreuung suchen und die angezeigten Fallakten anschließend über
+      die Aktion "Auswahl auswerten" auswerten.
+      </p>
+    </div>
+    <div id="anerkannte_behinderung">
+      <h2>Anerkannte Behinderung</h2>
+      <p>
+      Anerkannte Behinderung bedeutet Behindertenausweis bzw.
+      Feststellungsbescheid mit Grad der Behinderung (GdB) von mindestens 20%.
+      </p>
+    </div>
   </body>
 </html>

Modified: trunk/waskaweb/config/routing.py
===================================================================
--- trunk/waskaweb/config/routing.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/config/routing.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -22,14 +22,17 @@
     map.connect('rg_aid/delete/:rg_id/:ds_type/:confirmed', action="delete", controller="rg_aid") 
     map.connect('case/markForDelete/:id/:confirmed', controller="case", action="markForDelete")
     map.connect('case/deleteAppointment/:id/:confirmed', controller="case", action="deleteAppointment")
+    map.connect('case/deleteLogbookEntry/:id/:confirmed', controller="case", action="deleteLogbookEntry")
     map.connect('case/delete/:id/:confirmed', controller="case", action="delete")
     map.connect('case/restore/:id/:confirmed', controller="case", action="restore")
     map.connect('case/open/:id/:confirmed', controller="case", action="open")
     map.connect('case/close/:id/:confirmed', controller="case", action="close")
     map.connect('case/select/:id/:confirmed', controller="case", action="select")
+    map.connect('case/keepActive/:id/:confirmed', controller="case", action="keepActive")
     map.connect('case/printAll/:id/:empty', controller="case", action="printAll", empty=0)
     map.connect('case/showAppointment/:id/:confirmed', controller="case", action="showAppointment", confirmed=1)
     map.connect('case/anonymize/:id/:confirmed', controller="case", action="anonymize")
+    map.connect('case/markForAnonymize/:id/:confirmed', controller="case", action="markForAnonymize")
     map.connect('case/:action/:ds_id/:page_id/:form', controller="case") 
     map.connect('case/:action/:ds_id/:page_id', controller="case")
     map.connect('navigation/:action/:ds_id/:page_id', controller="navigation")
@@ -37,9 +40,11 @@
     map.connect('rg_aid/:action/:rg_id/:page_id', controller="rg_aid")
     map.connect('formhelp', 'case/showhelp/:help_id', controller="case", action="showHelp")
     map.connect('digest', 'case/digest/:id', controller="case", action="digest")
-    map.connect('case_overview/overview/:reset', controller="case_overview", action="overview") #for bundles actions in case_overview
+    map.connect('case_overview/overview/:reset/:sort_field/:sort_order', controller="case_overview", action="overview", reset=0, sort_field="name_1", sort_order="asc") #for bundles actions in case_overview
     map.connect('case_overview/:action/:confirmed', controller="case_overview") #for bundles actions in case_overview
+    map.connect('agency_overview/overview/:reset/:sort_field/:sort_order', controller="agency_overview", action="overview", reset=0, sort_field="fkz", sort_order="asc") #for bundles actions in agency_overview
     map.connect('agency_overview/overview/:reset', controller="agency_overview", action="overview") #for bundles actions in agency_overview
+    map.connect('evaluate/evaluate/:id/:reset', controller="evaluate", action="evaluate") #for evaluation over all cases.
     map.connect(':controller/:action/:id/:confirmed')
     map.connect(':controller/:action/:id')
     map.connect(':controller/:action/*(file).csv')

Modified: trunk/waskaweb/controllers/CaseBase.py
===================================================================
--- trunk/waskaweb/controllers/CaseBase.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/CaseBase.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -30,7 +30,7 @@
         try:
             case = factory.loadById(id)
             return case
-        except LoadCaseNotExistsError:
+        except LoadCaseNotExistsError, err:
             self.showError()
 
     def getNavigation(self):
@@ -58,6 +58,11 @@
 
     def _getFormNavigation(self,selected_key=None):
         case = session.get('case')
+        # TODO: In the following situation: Fresh login, no case selected.
+        # select an appointment from blackboard. Find out why we need to get
+        # the navigation tree from the session again. I thought that this is
+        # alreday done in the _before_ method of this controller. 
+        self.navigation = session.get('navigation.tree')
         if not case or not self.navigation:
             redirect_to(h.url_for(controller='/case_overview'))
         errors = case.getFormErrors()

Modified: trunk/waskaweb/controllers/administration.py
===================================================================
--- trunk/waskaweb/controllers/administration.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/administration.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -12,7 +12,7 @@
 from formencode                    import htmlfill
 from waskaweb.lib.base             import *
 from waskaweb.lib.security         import getDbName 
-from waskaweb.lib.validators       import NewUserForm, EditUserForm, NewPasswordForm, EditSettingsForm, DeleteUserHelperForm, NewUserGroupForm, EditUserGroupForm
+from waskaweb.lib.validators       import ValidatorStateObject, NewUserForm, EditUserForm, NewPasswordForm, EditSettingsForm, DeleteUserHelperForm, NewUserGroupForm, EditUserGroupForm
 from waskaweb.model.user           import UserObject, UserListObject, UserGroup, UserGroupList, UserGroupFactory
 from waskaweb.model.case           import CaseOverview, CaseBundle 
 from waskaweb.model.agencysettings import Agency
@@ -139,8 +139,10 @@
         c.userlist  = userlist.getUserList(filter = [u.id for u in admins])
         try:
             try:
+                state = ValidatorStateObject
                 data = formencode.variabledecode.variable_decode(request.params)
-                form_result = validator.to_python(data)
+                state.groupid = data.get('id')
+                form_result = validator.to_python(data, state)
                 group = factory.load(form_result.get('id'))
                 group.setData(form_result)
                 group.setUser(form_result.get('standin'))
@@ -259,12 +261,14 @@
         c.user_password = None
         try:
             try:
-                c.form_result = validator.to_python(request.params)
+                agency = getDbName()
+                state = ValidatorStateObject
+                state.agency = agency
+                c.form_result = validator.to_python(request.params, state)
                 c.uo = UserObject()
                 # Set initial data which is needed to create a new user
                 login = c.form_result.get('login', '')
                 role = c.form_result.get('role', '')
-                agency = getDbName() 
                 c.uo.setData(c.form_result)
                 # create user
                 c.user_password = c.uo.createLogin(login, role, agency)
@@ -277,6 +281,7 @@
             except:
                 c.failed_for = NEW_USER_FAILURE_HEADER 
                 c.failed_text  = NEW_USER_FAILURE_TEXT 
+                return render('/tests/trace.mako')
                 c.url_ok     = "/administration/overviewUser"
                 return render('/administration/dialogs/failed_new_user.mako')
                 

Modified: trunk/waskaweb/controllers/agency_overview.py
===================================================================
--- trunk/waskaweb/controllers/agency_overview.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/agency_overview.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -12,7 +12,7 @@
 
 from waskaweb.lib.csv import exportAsCSV
 from waskaweb.lib.base import *
-from waskaweb.lib.validators import AgencyBundleActionForm
+from waskaweb.lib.validators import AgencyBundleActionForm, SearchAgencyForm, CasePartSelectionForm
 from waskaweb.lib.security                  import checkRole
 from waskaweb.model.agency  import AgencyOverview, AgencyFactory, AgencyBundle
 from waskaweb.model.case  import CaseBundle
@@ -22,9 +22,14 @@
                                                EXPORT_SUCCESS_XLS, \
                                                EXPORT_SUCCESS_XLS_EXPLAINATION, \
                                                EXPORT_SUCCESS_XML, \
-                                               EXPORT_SUCCESS_XML_EXPLAINATION
+                                               EXPORT_SUCCESS_XML_EXPLAINATION, \
+                                               parseSearchOptions
 
+from waskaweb.lib.xmlexport import CasePartsSelection
 
+
+FORM_DEFAULTS = {}
+
 log = logging.getLogger(__name__)
 
 DELETE_CONFIRM      = u'''Fallakten der Agentur löschen?''' 
@@ -49,6 +54,8 @@
 
 DELETE_NOTIFICATION_EMPTYLIST = u'''Es wurden keine Fallakten gelöscht.'''
 
+SELECT_PARTS_FOR_EXPORT = u"Welche Bereiche der Fallakte(n) sollen exportiert werden?"
+
 class AgencyOverviewController(BaseController):
 
     @checkRole(('pb_ka', 'admin_ka'))
@@ -56,19 +63,81 @@
         return self.overview()
 
     @checkRole(('pb_ka'))
-    def overview(self, reset=0):
-        c.agencys = AgencyOverview()
-        user = session['USER_AUTHORIZED']
+    def overview_extended(self):
+        extended = session.get('EXTENDED_SEARCH')
+        if extended is not None:
+            extended = not extended
+        else:
+            extended = True
+        session['EXTENDED_SEARCH'] = extended
+        session.save()
+        return self.overview(0)
 
+    @checkRole(('pb_ka'))
+    def overview(self, reset=0, sort_field="fkz", sort_order="asc"):
+        reset = self._checkBool(reset)
         if reset:
+            session['CASE_OVERVIEW_SEARCHOPTIONS'] = {}
             session['CASE_OVERVIEW_SELECTION'] = {}
+            session['EXTENDED_SEARCH'] = False 
             session.save()
 
-        form_defaults = session.get('CASE_OVERVIEW_SELECTION', {})
+        c.extended_search = session.get('EXTENDED_SEARCH', False)
+        user = session['USER_AUTHORIZED']
+
+        ## editor or standin setting will be ignored for admin users. They will
+        ## be overwritten in case-controller
+        #ulo = UserListObject()
+        #filter = [u.id for u in ulo.getAdminList()]
+        #c.userlist = ulo.getUserList(filter)
+
+        form_defaults = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or FORM_DEFAULTS
+        search_options = parseSearchOptions(form_defaults)
+
+        # Sorting of the cases
+        if sort_field == "fkz":
+            search_options.append('sort_field:fkz')
+        if sort_field == "num_cases":
+            search_options.append('sort_field:anzahl')
+        if sort_field == "zugriff":
+            search_options.append('sort_field:zugriff')
+
+        if sort_order == "desc":
+            search_options.append('sort_order:desc')
+        else:
+            search_options.append('sort_order:asc')
+
+        search_str = ";".join(search_options)
+
+        c.agencys = AgencyOverview()
+        c.agencys.search(search_str)
+
+        ##count num of cases
+        c.count_all = len([x for x in c.agencys.getDatasets()])
+
+        ## Load case-selection and merge with default search options
+        ## Ok please close your eyes now!!! This is.... well ugly
+        form_defaults_copy = form_defaults.copy()
+        form_defaults_copy.update(session.get('CASE_OVERVIEW_SELECTION', {}))
+
         overview = render('/casemanagement/agency_overview.mako')
-        return formencode.htmlfill.render(unicode(overview, 'utf-8'),defaults=form_defaults)
+        return formencode.htmlfill.render(unicode(overview, 'utf-8'),defaults=form_defaults_copy)
 
     @checkRole(('pb_ka'))
+    def search(self):
+        validator = SearchAgencyForm()
+        c.form_result = {}
+        c.form_errors = {}
+        try:
+            form_result = validator.to_python(request.params)
+        except formencode.Invalid, error:
+            form_result = error.value
+            form_errors = error.error_dict or {}
+        session['CASE_OVERVIEW_SEARCHOPTIONS'] = form_result
+        session.save()
+        return self.overview()
+
+    @checkRole(('pb_ka'))
     def delete(self, id, confirmed):
         #id        = self._checkInt(id)
         confirmed = self._checkBool(confirmed)
@@ -95,7 +164,7 @@
         validator = AgencyBundleActionForm()
         c.context           = "../main.mako" 
         c.url_ok            = "/agency_overview"
-        c.notification_for  = DIALOG_EMPTY_SELECTION    
+        c.notification_for  = DIALOG_EMPTY_SELECTION
         c.notification_text = DIALOG_EMPTY_SELECTION_EXPLAINATION 
         try:
             data        = formencode.variabledecode.variable_decode(request.params)
@@ -104,7 +173,12 @@
             session.save()
             action      = form_result.get('action') 
             if form_result.get('all_cases'):
-                agency_ids = [a.fkz for a in AgencyOverview().getDatasets()]
+                form_defaults = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or FORM_DEFAULTS
+                search_options = parseSearchOptions(form_defaults)
+                # sql query fails if no sort order is given.
+                search_options.append('sort_field:fkz')
+                search_options.append('sort_order:asc')
+                agency_ids = [a.fkz for a in AgencyOverview().search(";".join(search_options))]
                 agency_bundle = AgencyBundle(agency_ids)
             else:
                 agency_bundle = AgencyBundle(form_result.get('agency_id', []))
@@ -128,6 +202,17 @@
                 return self.downloadXML()
             if action == 'exportXLS':
                 return self.downloadXLS()
+            if action == 'evaluate':
+                # fetch all case ids from the agency bundle
+                case_ids = []
+                for a in agency_bundle.getAgencys():
+                    case_ids.extend(a.getCaseBundle().listDatasetIds())
+                # now build one huge case_bundle
+                case_bundle = CaseBundle(case_ids)
+                session['casebundle'] = case_bundle
+                session['hide_search_option_on_eval'] = True
+                session.save()
+                redirect_to(controller='evaluate', action="evaluate", id=1);
             else:
                 raise HTTPNotFound()
 
@@ -148,13 +233,59 @@
 
     @checkRole(('pb_ka'))
     def downloadXML(self):
-        c.success_for  = EXPORT_SUCCESS_XML
-        c.success_text = EXPORT_SUCCESS_XML_EXPLAINATION
-        c.download_link = h.url_for(action="downloadXMLAction")
-        c.overview_link = h.url_for(action="overview")
+        c.success_for        = EXPORT_SUCCESS_XML
+        c.success_text       = EXPORT_SUCCESS_XML_EXPLAINATION
+        selection_checker    = self.__getSelectionChecker()
+        c.is_all_selected    = selection_checker.isAllSelected()
+        case_parts_selection = session.get('case_parts_selection')
+        c.selection_link     = h.url_for(action="selectXMLParts")
+        c.download_link      = h.url_for(action="downloadXMLAction")
+        c.overview_link      = h.url_for(action="overview")
         return render('casemanagement/downloadXML.mako')
 
+    def __getSelectionChecker(self):
+        selection_checker = session.get('selected_export_parts')
+        if not selection_checker:
+            selection_checker = CasePartsSelection()
+            session['selected_export_parts'] = selection_checker
+            session.save()
+        return selection_checker
+
     @checkRole(('pb_ka'))
+    def selectXMLParts(self):
+        selection_checker  = self.__getSelectionChecker()
+        c.selection_question = SELECT_PARTS_FOR_EXPORT
+        c.store_action       = h.url_for(action="storeSelectedXMLParts")
+        page = render('casemanagement/selectParts.mako')
+        return formencode.htmlfill.render(unicode(page, 'utf-8'),defaults=selection_checker.selections)
+        #c.selection_checker  = self.__getSelectionChecker()
+        #c.selection_question = SELECT_PARTS_FOR_EXPORT
+        #c.store_action       = h.url_for(action="storeSelectedXMLParts")
+        #return render('casemanagement/selectParts.mako')
+
+    @checkRole(('pb_ka'))
+    def storeSelectedXMLParts(self):
+        validator = CasePartSelectionForm()
+        selection_checker = self.__getSelectionChecker()
+        try:
+            params = validator.to_python(request.params)
+            for key, value in params.iteritems():
+                selection_checker.setChecked(key, value)
+            session['selected_export_parts'] = selection_checker
+            session.save()
+        except formencode.Invalid, error:
+            return selectXMLParts()
+        return self.downloadXML()
+        #selection_checker = self.__getSelectionChecker()
+        #params = request.params
+        #for i in range(selection_checker.numItems()):
+        #    value = params.get("c%d" % i) and True or False
+        #    selection_checker.setChecked(i, value)
+        #session['selected_export_parts'] = selection_checker
+        #session.save()
+        #return self.downloadXML()
+
+    @checkRole(('pb_ka'))
     def downloadXLS(self):
         c.success_for  = EXPORT_SUCCESS_XLS
         c.success_text = EXPORT_SUCCESS_XLS_EXPLAINATION
@@ -191,7 +322,8 @@
         try:
             if case_ids:
                 case_bundle = CaseBundle(case_ids)
-                xml = case_bundle.exportAsXML()
+                selection_checker = self.__getSelectionChecker()
+                xml = case_bundle.exportAsXML(selection_checker)
                 data = paste.fileapp.DataApp(
                     xml,
                     content_type        = 'application/xml',

Modified: trunk/waskaweb/controllers/case.py
===================================================================
--- trunk/waskaweb/controllers/case.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/case.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -10,8 +10,10 @@
 import logging
 import paste
 import formencode
-from decorator                   import decorator
 
+from decorator import decorator
+from datetime  import datetime
+
 from pylons import config
 
 from paste.httpexceptions        import HTTPNotFound
@@ -20,7 +22,9 @@
 from waskaweb.lib.validators     import NewCaseForm, \
                                         SetStandinForm, \
                                         SetEditorForm, \
-                                        CreateAppointmentForm
+                                        CreateAppointmentForm, \
+                                        CreateLogbookForm, \
+                                        EditLogbookForm
 
 from waskaweb.lib.helpers import dd_mm_YYYY, HH_MM
 
@@ -38,6 +42,7 @@
 from waskaweb.lib.security         import checkRole
 from waskaweb.model.document       import listDocuments
 from waskaweb.model.data           import FilteredNodeComponentProxy
+from waskaweb.model.logbook        import Logbook, LogbookEntry, LogbookEntryChecker
 
 from waskaweb.lib.db        import db
 from waskaweb.lib.xmlimport import importFromXML
@@ -68,13 +73,16 @@
 
 DELETE_CONFIRM = u"""Fallakte löschen?""" 
 DELETE_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte löschen und die Daten unwiederbringlich verlieren?""" 
-MARKDELETE_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte zum Löschen freigeben? Die Fallakte steht Ihnen danach nicht mehr zur Bearbeitung zur Verfügung und wird durch die Administration gelöscht werden.""" 
+MARKDELETE_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte zum Löschen freigeben? Die Fallakte steht Ihnen danach nicht mehr zur Bearbeitung zur Verfügung und wird der Administration zum Löschen vorgelegt.""" 
 
 ANONYMIZE_CONFIRM = u"""Fallakte anonymisieren?"""
-ANONYMIZE_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte anonymisieren und die personenbezogenen Daten unwiederbringlich verlieren?. Die Fallakte steht Ihnen danach nicht mehr zur Bearbeitung zur Verfügung. Die anonymisierte Fallakte wird weiterhin in der Auswertung berücksichtigt werden."""
+ANONYMIZE_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte anonymisieren und die personenbezogenen Daten unwiederbringlich verlieren?. Die Fallakte steht danach nicht mehr zur Bearbeitung zur Verfügung. Die anonymisierte Fallakte wird weiterhin in der Auswertung berücksichtigt werden."""
+MARKANONYMIZE_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte zum Anonymisieren freigeben? Die Fallakte steht Ihnen danach nicht mehr zur Bearbeitung zur Verfügung und wird der Administration zur Anonymisierung vorgelegt.""" 
 
 ANONYMIZE_SUCCESS = u"""Fallakte anonymisiert!"""
-ANONYMIZE_SUCCESS_TEXT = u"""Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
+ANONYMIZE_SUCCESS_TEXT = u"""Die personenbezogenen Daten der Fallakte wurden gelöscht und die Fallakte aus der Übersicht entfernt. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
+MARKANONYMIZE_SUCCESS = u"""Fallakte wurde zur Anonymisierung freigegeben!"""
+MARKANONYMIZE_SUCCESS_TEXT = u"""Die Fallakten wurde zur Anonymisierung freigeben und liegt der Administration zur endgültigen Anonymisierung vor. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
 
 IMPORT_FAILED = u"""Fallakte wurde nicht importiert!"""
 IMPORT_FAILED_TEXT = u"""Bei dem Importieren der Datei ist ein Fehler aufgetreten. Es konnten keine Daten der Fallakte importiert werden. Klicken Sie auf "OK", um zum Import-Dialog fortzufahren."""
@@ -85,8 +93,8 @@
 IMPORT_XML_SUCCESS = u"""Fallakten erfolgreich importiert!"""
 IMPORT_XML_SUCCESS_TEXT = u"""Die Fallakten wurde erfolgreich importiert. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
 
-IMPORT_ANON_SUCCESS = u"""Fallakte importiert und anonymisiert!"""
-IMPORT_ANON_SUCCESS_TEXT = u"""Die Fallakte wurde erfolgreich importiert und anonymisiert. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
+IMPORT_ANON_SUCCESS = u"""Fallakte importiert und zur Anonymisierung freigegeben!"""
+IMPORT_ANON_SUCCESS_TEXT = u"""Die Fallakte wurde erfolgreich importiert und zur Anonymisierung freigegeben. Die Fallakte liegt der Administration zur endgültigen Anonymisierung vor. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
 
 RESTORE_CONFIRM = u"""Fallakte wiederherstellen?"""
 RESTORE_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte wiederherstellen? Die Fallakte ist danach wieder für die Nutzer bearbeitbar."""
@@ -97,6 +105,31 @@
 OPEN_CONFIRM = u"""Geschlossene Fallakte öffnen?"""
 OPEN_CONFIRM_TEXT = u"""Wollen Sie wirklich die Fallakte wieder öffnen?"""
 
+LOGBOOK_ENTRY_CREATE_FAILED = u"Tagebucheintrag wurde nicht angelegt!"
+LOGBOOK_ENTRY_CREATE_FAILED_TEXT = u"Beim Anlegen eines Tagebucheintrages is ein Fehler aufgetreten."
+
+CREATE_LOGBOOK_ENTRY_SUCCESS = u"Eintrag ins Tagebuch erfolgreich."
+CREATE_LOGBOOK_ENTRY_SUCCESS_TEXT = u"Der Tagebucheintrag wurde erfolgreich durchgeführt."
+
+DELETE_LOGBOOK_ENTRY_CONFIRM = u"Tagebucheintrag löschen?"
+DELETE_LOGBOOK_ENTRY_CONFIRM_TEXT = u"""Wollen Sie diesen Tagebucheintrag wirklich löschen?
+Er ginge damit unwiederbringlich verloren."""
+
+LOGBOOK_ENTRY_DELETE_SUCCESS = u"Tagebucheintrag erfolgreich gelöscht!"
+LOGBOOK_ENTRY_DELETE_SUCCESS_TEXT = u"Der Tagebucheintrag wurde erfolgreich gelöscht!"
+
+LOGBOOK_ENTRY_DELETE_FAILED = u"Löschen des Tagebucheintrags fehlgeschlagen!"
+LOGBOOK_ENTRY_DELETE_FAILED_TEXT = u"Beim Löschen des Tagebucheintrags ist ein Fehler aufgetreten."
+
+LOGBOOK_ENTRY_SHOW_FAILED = u"Anzeigen des Tagebucheintrags fehlgeschlagen!"
+LOGBOOK_ENTRY_SHOW_FAILED_TEXT = u"Beim Anzeigen des Tagebucheintrags ist ein Fehler aufgetreten."
+
+LOGBOOK_ENTRY_SAVE_SUCCESS = u"Änderung des Eintrages erfolgreich!"
+LOGBOOK_ENTRY_SAVE_SUCCESS_TEXT = u"Der Eintrag im Tagebuch wurde erfolgreich geändert."
+
+LOGBOOK_ENTRY_SAVE_FAILED = u"Änderung des Eintrages fehlgeschlagen!"
+LOGBOOK_ENTRY_SAVE_FAILED_TEXT = u"Die Änderung des Eintrages im Tagebuch ist fehlgeschlagen."
+
 def load_case(id):
         '''Return a case object'''
         factory   = CaseFactory()
@@ -111,7 +144,7 @@
         session.save()
         return case
 
-def checkPrivacyStatement(context=None):
+def checkPrivacyStatement(context='select'):
     '''Decorator for the methods in the case controller'''
     def validate(func, self, *args, **kwargs):
         #load case and check if the statement is signed
@@ -135,13 +168,14 @@
             except:
                 raise HTTPNotFound()
             c.targeturl = h.url_for(controller="/case", \
-                                    action="select", \
+                                    action=context, \
                                     id=case_id, \
                                     confirmed=1)
 
         try:
             case = load_case(case_id)
         except:
+            return render('/tests/trace.mako')
             self.showError()
         statement = case.getPrivacyStatement()
         # Check if there is a "Einverstaendniserklaerung" None if it is not either signed or declined
@@ -172,7 +206,7 @@
     def select(self, id, confirmed=0):
         try:
             case = self.__init_case(id)
-        except:
+        except StandardError, err:
             self.showError()
         return self.digest(id)
 
@@ -227,7 +261,8 @@
                     formular.append(content)
 
         c.formular = "<br>".join(formular)
-        return render('/casemanagement/formular.mako')
+        page = render('/casemanagement/formular.mako')
+        return page
 
         #c.notification_for = PRINTALL_NOTIFICATION 
         #c.notification_text = PRINTALL_NOTIFICATION_TEXT 
@@ -352,8 +387,6 @@
         c.page_id    = page_id
         c.print_form = "show" # Which page to open in popup on printing?
         case_session = session.get('case')
-        if case_session.id != ds_id: #Cases seems to have changed. 
-            return self.select(ds_id, 0)
         case_session.setPageId(page_id)
         case_session.setMode("show")
         session.save()
@@ -362,7 +395,7 @@
         c.form_navigation = navigation 
         return render('/casemanagement/formular.mako')
 
-    @checkRole(('admin_ka', 'cm_ka', 'pt_dlr'))
+    @checkRole(('admin_ka', 'cm_ka', 'pb_ka'))
     def showHelp(self, help_id):
         c.helpdata  = unicode(g.helpData.getHelp(help_id), 'utf-8')
         return render('/casemanagement/help.mako')
@@ -398,6 +431,10 @@
         old_errors = case_session.getFormErrors()
         ds_id = request.params["ds"]
         new_errors = self.__save(ti.page, request.params.dict_of_lists(), old_errors, ti.realId(ds_id))
+        if new_errors:
+            c.status_msg = h.status_message("Eingabedaten fehlerhaft! Daten wurden nicht gespeichert.")
+        else:
+            c.status_msg = h.status_message("Daten erfolgreich gespeichert.")
         case_session.setFormErrors(new_errors)
         session.save()
 
@@ -446,7 +483,7 @@
             pdf.file.close()
             # Check if the file should be anonymized directly after the import
             if request.POST.get('anonymize'):
-                if case.anonymize():
+                if case.getState().setState(4):
                     c.success_for  = IMPORT_ANON_SUCCESS
                     c.success_text = IMPORT_ANON_SUCCESS_TEXT
                     c.url_ok       = h.url_for(controller="/case_overview")
@@ -537,10 +574,12 @@
             form_result = validator.to_python(request.params)
             case = self._loadCase(form_result.get('case_id'))
             case.setEditor(form_result.get('editor'))
+            c.status_msg = h.status_message("Bearbeiter erfolgreich gesetzt.")
             return self.organisation(form_result.get('case_id'))
         except formencode.Invalid, error:
             c.form_result = error.value
             c.form_errors = error.error_dict or {}
+            c.status_msg = h.status_message("Fehler! Bearbeiter nicht gesetzt.")
             return render('/casemanagement/organisation.mako')
 
     @checkRole(('admin_ka', 'cm_ka'))
@@ -552,10 +591,12 @@
             case = self._loadCase(form_result.get('case_id'))
             standin = case.getStandin()
             standin.setGroups(form_result.get('standin'))
+            c.status_msg = h.status_message("Vertretung erfolgreich gesetzt.")
             return self.organisation(form_result.get('case_id'))
         except formencode.Invalid, error:
             c.form_result = error.value
             c.form_errors = error.error_dict or {}
+            c.status_msg = h.status_message("Fehler! Vertretung nicht gesetzt.")
             return render('/casemanagement/organisation.mako')
 
     @checkRole(('admin_ka', 'cm_ka'))
@@ -569,6 +610,215 @@
         return render('/casemanagement/appointments.mako')
 
     @checkRole(('admin_ka', 'cm_ka'))
+    def logbook(self, id):
+        id                 = self._checkInt(id)
+        case               = self._loadCase(id)
+        c.ds_id            = id
+        c.form_navigation  = self._getFormNavigation()
+        logbook = Logbook()
+        logbook.loadById(id)
+        c.logbook = logbook
+        return render('/logbook/overview.mako')
+
+    @checkRole('cm_ka')
+    def newLogbookEntry(self, id):
+        entry = LogbookEntry()
+        entry.setDate(datetime.now())
+        entry.setKind(-1)
+        form_defaults = {}
+        form_defaults['date']  = entry.getDate()
+        form_defaults['time']  = entry.getTime()
+        form_defaults['kind']  = entry.getKindAsInt()
+        id                = self._checkInt(id)
+        c.ds_id           = id
+        c.entry           = entry
+        c.form_navigation = self._getFormNavigation()
+        c.form_errors     = {}
+        form = render('/logbook/new.mako')
+        return formencode.htmlfill.render(unicode(form, 'utf-8'), \
+            defaults=form_defaults, \
+            auto_insert_errors=False, \
+            errors=c.form_errors)
+
+    @checkRole('cm_ka')
+    @checkPrivacyStatement('keepActive')
+    def keepActive(self, id, confirmed):
+        entry = LogbookEntry()
+        entry.setDate(datetime.now())
+        entry.setKind(-2)
+        form_defaults = {}
+        form_defaults['date']  = entry.getDate()
+        form_defaults['time']  = entry.getTime()
+        form_defaults['kind']  = entry.getKindAsInt()
+        form_defaults['kind']  = entry.getKindAsInt()
+        form_defaults['short_notice']  = u"Aufbewahrung verlängert" 
+        form_defaults['notice']  = u"Bitte geben Sie hier den Grund für die Verlängerung der Aufbewahrungsfrist ein." 
+        id                = self._checkInt(id)
+        c.ds_id           = id
+        c.entry           = entry
+        c.form_navigation = self._getFormNavigation()
+        c.form_errors     = {}
+        form = render('/logbook/new.mako')
+        return formencode.htmlfill.render(unicode(form, 'utf-8'), \
+            defaults=form_defaults, \
+            auto_insert_errors=False, \
+            errors=c.form_errors)
+
+    @checkRole('cm_ka')
+    def createNewLogbookEntry(self):
+        errors = []
+        checker = LogbookEntryChecker(request.params)
+        validator = CreateLogbookForm()
+        c.form_errors = {}
+        c.form_result = {}
+
+        try:
+            c.ds_id           = session['case'].id
+            c.form_navigation = self._getFormNavigation()
+            form_result = validator.to_python(request.params)
+        except formencode.Invalid, error:
+            c.form_result = error.value
+            c.form_errors = error.error_dict or {}
+            form = render('/logbook/new.mako')
+            return formencode.htmlfill.render(unicode(form, 'utf-8'), \
+                defaults=c.form_result, \
+                auto_insert_errors=False, \
+                errors=c.form_errors)
+
+        #if checker.hasErrors():
+        #    c.ds_id           = session['case'].id
+        #    c.entry           = checker.getLogbookEntry()
+        #    c.form_navigation = self._getFormNavigation()
+        #    c.form_errors     = checker.getErrors()
+
+        try:
+            logbook = Logbook(checker.getCaseId())
+            logbook.addEntry(checker.getLogbookEntry())
+            logbook.store(session['USER_AUTHORIZED'].id)
+            c.url_ok = "/case/logbook/%s" % str(session['case'].id)
+            c.success_for   = CREATE_LOGBOOK_ENTRY_SUCCESS 
+            c.success_text  = CREATE_LOGBOOK_ENTRY_SUCCESS_TEXT
+            return render('/logbook/dialogs/success_create_logbook_entry.mako')
+        except:
+            traceback.print_exc(file=sys.stderr)
+            c.failed_for  = LOGBOOK_ENTRY_CREATE_FAILED
+            c.failed_text = LOGBOOK_ENTRY_CREATE_FAILED_TEXT
+            c.url_ok = "/case/logbook/%s" % str(session['case'].id)
+            return render('/logbook/dialogs/failed_create_logbook_entry.mako')
+
+    @checkRole(('cm_ka', 'admin_ka'))
+    def showLogbookEntry(self, id):
+        id = self._checkInt(id)
+        try:
+            entry = LogbookEntry()
+            entry.loadById(id)
+        except:
+            c.failed_for  = LOGBOOK_ENTRY_SHOW_FAILED
+            c.failed_text = LOGBOOK_ENTRY_SHOW_FAILED_TEXT
+            c.url_ok = "/case/logbook/%s" % str(session['case'].id)
+            traceback.print_exc(file=sys.stderr)
+            return render('/logbook/dialogs/failed_show_logbook_entry.mako')
+
+        c.entry           = entry
+        c.form_navigation = self._getFormNavigation()
+        return render('/logbook/show.mako')
+
+    @checkRole('cm_ka')
+    def editLogbookEntry(self, id):
+        id = self._checkInt(id)
+        c.form_navigation = self._getFormNavigation()
+        entry_data = {}
+        try:
+            entry = LogbookEntry()
+            entry.loadById(id)
+            entry_data['id'] = entry.id
+            entry_data['date'] = entry.getDate()
+            entry_data['time'] = entry.getTime()
+            entry_data['duration'] = entry.getDuration()
+            entry_data['kind'] = entry.getKindAsInt()
+            entry_data['notice'] = entry.getNotice()
+            entry_data['short_notice'] = entry.getShortNotice()
+            c.entry = entry
+            form = render('/logbook/edit.mako')
+            return formencode.htmlfill.render(unicode(form, 'utf-8'), \
+                defaults=entry_data, \
+                auto_insert_errors=False, \
+                errors={})
+        except:
+            traceback.print_exc(file=sys.stderr)
+            c.failed_for  = LOGBOOK_ENTRY_SHOW_FAILED
+            c.failed_text = LOGBOOK_ENTRY_SHOW_FAILED_TEXT
+            c.url_ok = "/case/logbook/%s" % str(session['case'].id)
+            return render('/logbook/dialogs/failed_show_logbook_entry.mako')
+
+    @checkRole('cm_ka')
+    def saveLogbookEntry(self):
+        params = request.params
+        id = self._checkInt(params.getone('id'))
+        c.form_navigation = self._getFormNavigation()
+        checker = LogbookEntryChecker(params, check_case_id=False)
+        validator = EditLogbookForm()
+
+        try:
+            c.ds_id           = session['case'].id
+            form_result = validator.to_python(params)
+        except formencode.Invalid, error:
+            c.form_result = error.value
+            c.form_errors = error.error_dict or {}
+            form = render('/logbook/new.mako')
+            return formencode.htmlfill.render(unicode(form, 'utf-8'), \
+                defaults=c.form_result, \
+                auto_insert_errors=False, \
+                errors=c.form_errors)
+
+        #if checker.hasErrors():
+        #    c.form_navigation = self._getFormNavigation()
+        #    c.errors = checker.getErrors()
+        #    c.entry  = checker.getLogbookEntry()
+        #    c.entry.setId(id)
+        #    return render('/logbook/edit.mako')
+
+        try:
+            entry = checker.getLogbookEntry()
+            entry.setId(id)
+            entry.storeForUser(session['USER_AUTHORIZED'].id)
+            c.success_for  = LOGBOOK_ENTRY_SAVE_SUCCESS 
+            c.success_text = LOGBOOK_ENTRY_SAVE_SUCCESS_TEXT
+            c.url_ok       = "/case/logbook/%s" % str(session['case'].id)
+            return render('/logbook/dialogs/success_save_logbook_entry.mako')
+        except:
+            traceback.print_exc(file=sys.stderr)
+            c.failed_for  = LOGBOOK_ENTRY_SAVE_FAILED
+            c.failed_text = LOGBOOK_ENTRY_SAVE_FAILED_TEXT
+            c.url_ok      = "/case/logbook/%s" % str(session['case'].id)
+            return render('/logbook/dialogs/failed_save_logbook_entry.mako')
+
+    @checkRole('cm_ka')
+    def deleteLogbookEntry(self, id, confirmed=False):
+        id        = self._checkInt(id)
+        confirmed = self._checkBool(confirmed)
+        c.form_navigation = self._getFormNavigation()
+        if confirmed == 1:
+            try:
+                Logbook().deleteEntryById(int(id))
+                c.success_for  = LOGBOOK_ENTRY_DELETE_SUCCESS 
+                c.success_text = LOGBOOK_ENTRY_DELETE_SUCCESS_TEXT
+                c.url_ok       = "/case/logbook/%s" % str(session['case'].id)
+                return render('/logbook/dialogs/success_delete_logbook_entry.mako')
+            except:
+                traceback.print_exc(file=sys.stderr)
+                c.failed_for  = LOGBOOK_ENTRY_DELETE_FAILED
+                c.failed_text = LOGBOOK_ENTRY_DELETE_FAILED_TEXT
+                c.url_ok = "/case/logbook/%s" % str(session['case'].id)
+                return render('/logbook/dialogs/failed_delete_logbook_entry.mako')
+        else:
+            c.confirm_for = DELETE_LOGBOOK_ENTRY_CONFIRM
+            c.question    = DELETE_LOGBOOK_ENTRY_CONFIRM_TEXT
+            c.url_yes     = "/case/deleteLogbookEntry/%s/1" % id
+            c.url_no      = "/case/logbook/%s" % session['case'].id
+            return render('/logbook/dialogs/confirm_delete_logbook_entry.mako')
+
+    @checkRole(('admin_ka', 'cm_ka'))
     @checkPrivacyStatement('showAppointment')
     def showAppointment(self, id, confirmed):
         factory           = CaseAppointmentFactory()
@@ -851,16 +1101,41 @@
             return render('/casemanagement/dialogs/confirm_close.mako')
 
     @checkRole('cm_ka')
+    def markForAnonymize(self, id, confirmed):
+        try:
+            id        = self._checkInt(id)
+            confirmed = self._checkBool(confirmed)
+            c.ds_id   = id
+            c.form_navigation = self._getFormNavigation()
+            if confirmed == 1:
+                case = self._loadCase(id)
+                state = case.getState().setState(4)
+                if state:
+                    c.success_for   =  ANONYMIZE_SUCCESS
+                    c.success_text  =  MARKANONYMIZE_SUCCESS_TEXT
+                    c.url_ok        =  h.url_for(controller="/case_overview")
+                    return render('/casemanagement/dialogs/success_markanonymize.mako')
+            else:
+                c.context = "../main.mako"
+                c.confirm_for = ANONYMIZE_CONFIRM
+                c.question = MARKANONYMIZE_CONFIRM_TEXT
+                c.url_yes = "/case/markForAnonymize/%s/1" % id
+                c.url_no  = "/case/digest/%s" % id
+                return render('/casemanagement/dialogs/confirm_markanonymize.mako')
+        except:
+            return render('/tests/trace.mako')
+
+    @checkRole('admin_ka')
     def anonymize(self, id, confirmed):
         id        = self._checkInt(id)
         confirmed = self._checkBool(confirmed)
         c.ds_id   = id
-        c.form_navigation = self._getFormNavigation()
+        #c.form_navigation = self._getFormNavigation()
         if confirmed == 1:
             case = self._loadCase(id)
             if case.anonymize():
                 c.success_for   =  ANONYMIZE_SUCCESS
-                c.success_text  =  ANONYMIZE_SUCCESS_TEXT
+                c.success_text  =  MARKANONYMIZE_SUCCESS_TEXT
                 c.url_ok        =  h.url_for(controller="/case_overview")
                 return render('/casemanagement/dialogs/success_anonymize.mako')
             # TODO: Create Errorpage

Modified: trunk/waskaweb/controllers/case_overview.py
===================================================================
--- trunk/waskaweb/controllers/case_overview.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/case_overview.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -8,16 +8,19 @@
 import logging
 import formencode
 import paste
-from paste.httpexceptions                   import HTTPNotFound
+import re
+from paste.httpexceptions          import HTTPNotFound
 
-from waskaweb.lib.base                      import *
-import waskaweb.lib.filters                 as F
-from waskaweb.lib.validators                import SearchCaseForm, BundleActionForm, SetBundleEditorForm, SetBundleStandinForm
-from waskaweb.lib.security                  import checkRole
-from waskaweb.model.case                    import CaseOverview, CaseBundle
-from waskaweb.model.user                    import UserListObject, UserObject, UserGroupList
-from waskaweb.controllers.CaseBase          import CasebaseController
+from waskaweb.lib.base             import *
+import waskaweb.lib.filters        as F
+from waskaweb.lib.validators       import SearchCaseForm, BundleActionForm, SetBundleEditorForm, SetBundleStandinForm, CasePartSelectionForm
+from waskaweb.lib.security         import checkRole
+from waskaweb.model.case           import CaseOverview, CaseBundle
+from waskaweb.model.user           import UserListObject, UserObject, UserGroupList
+from waskaweb.controllers.CaseBase import CasebaseController
 
+from waskaweb.lib.xmlexport        import CasePartsSelection
+
 from datetime import datetime
 
 log = logging.getLogger(__name__)
@@ -27,6 +30,14 @@
 DIALOG_CONFIRM_DELETE = u'''Fallakten löschen?'''
 DIALOG_CONFIRM_EXPLAINATION = u'''Wollen Sie wirklich die folgenden Fallakten löschen?%s'''
 
+DIALOG_CONFIRM_ANONYMIZE = u'''Fallakten anonymisieren?'''
+DIALOG_CONFIRM_ANONYMIZE_EXPLAINATION = u'''Wollen Sie wirklich die folgenden Fallakten anonymisieren und die personenbzogenen Daten unwiederbringlich verlieren? Die Fallakten steht danach nicht mehr zur Bearbeitung zur Verfügung. Die anonymisierte Fallakte werden weiterhin in der Auswertung berücksichtigt werden.%s'''
+DIALOG_CONFIRM_MARKANONYMIZE = u'''Fallakten zur Anonymisierung freigeben?'''
+DIALOG_CONFIRM_MARKANONYMIZE_EXPLAINATION = u'''Wollen Sie wirklich die folgenden Fallakten zum Anonymisieren freigeben? Die Fallakten stehen Ihnen danach nicht mehr zur Bearbeitung zur Verfügung und werden der Administration zur Anonymisierung vorgelegt.%s'''
+
+DIALOG_CONFIRM_RESTORE = u'''Fallakten wiederherstellen?'''
+DIALOG_CONFIRM_RESTORE_EXPLAINATION = u'''Wollen Sie wirklich die folgenden Fallakten wiederherstellen? Die Fallakten stehen danach wieder zur Bearbeitung zur Verfügung.%s'''
+
 DIALOG_CONFIRM_SETEDITOR = u"""Bearbeitung übertragen!"""
 SETEDITOR_NOTIFICATION_SUCCESS = u"""Es wurden %s Fallakten erfolgreich an %s %s übertragen. Bitte klicken Sie auf "OK", um fortzufahren."""
 SETEDITOR_FAILED_HEADER = u"""Fallakten nicht übertragen!"""
@@ -50,11 +61,16 @@
 EXPORT_ERROR_EXPLAINATION = u'''Bei dem Exportieren der Fallakten ist ein Fehler aufgetreten. Klicken Sie auf "OK", um zur Agenturenübersicht zu gelangen.''' 
 
 BUNDLE_NOTIFICATION_EMPTYLIST_HEADER = u"""Keine gültigen Fälle in der Auswahl!"""
-BUNDLE_NOTIFICATION_EMPTYLIST = u"""Die gewünschte Aktion kann für keine der in der Auswahl befindlichen Fallakten durchgeführt werden. Vergwissern Sie sich, dass sich die Fallakten in einem Zustand befinden, aus dem Sie die Aktion ausführen können."""
+BUNDLE_NOTIFICATION_EMPTYLIST = u"""Die gewünschte Aktion kann für keine der in der Auswahl befindlichen Fallakten durchgeführt werden. Vergewissern Sie sich, dass sich die Fallakten in einem Zustand befinden, aus dem Sie die Aktion ausführen können."""
 
 BUNDLE_NOTIFICATION_NOACTION_HEADER = u"""Keine Aktion für die Auswahl angegeben!"""
 BUNDLE_NOTIFICATION_NOACTION = u"""Sie haben keine Aktion für die Auswahl angegeben. Bitte klicken Sie auf OK, um zur Fallaktenübersicht zu gelangen und dort eine Aktion aus dem Auswahlfeld auszuwählen."""
-
+MARKANONYMIZE_SUCCESS_HEADER = u"""Fallakten anonymisiert!"""
+MARKANONYMIZE_SUCCESS_TEXT = u"""Es wurden %s Fallakten zur Anonymisierung freigegeben. Sie liegen der Administration zur endgültigen Anonymisierung vor. Bitte klicken Sie auf "Ok", um fortzufahren."""
+MARKANONYMIZE_NOTIFICATION_ERROR = u"""Bei dem Freigeben zur Anonymisieren der Fallakten ist ein Fehler aufgetreten. Bitte klicken Sie auf "OK", um fortzufahren.""" 
+ANONYMIZE_SUCCESS_HEADER = u"""Fallakten anonymisiert!"""
+ANONYMIZE_SUCCESS_TEXT = u"""Es wurden %s Fallakten erfolgreich anonymisiert. Bitte klicken Sie auf "Ok", um fortzufahren."""
+ANONYMIZE_NOTIFICATION_ERROR = u"""Bei dem Anonymisieren der Fallakten ist ein Fehler aufgetreten. Bitte klicken Sie auf "OK", um fortzufahren.""" 
 DELETE_SUCCESS_ADMIN_HEADER = u"""Fallakten gelöscht!"""
 DELETE_SUCCESS_ADMIN_TEXT = u"""Es wurden %s Fallakten erfolgreich gelöscht. Bitte klicken Sie auf "OK", um fortzufahren."""
 DELETE_NOTIFICATION_ERROR = u"""Bei dem Löschen der Fallakten ist ein Fehler aufgetreten. Bitte klicken Sie auf "OK", um fortzufahren.""" 
@@ -62,10 +78,85 @@
 MARKDELETE_SUCCESS_TEXT = u"""Es wurden %s Fallakten erfolgreich zum Löschen freigegeben. Bitte klicken Sie auf "OK", um fortzufahren.""" 
 MARKDELETE_NOTIFICATION_ERROR = u"""Bei dem Freigeben zum Löschen der Fallakten ist ein Fehler aufgetreten. Bitte klicken Sie auf "OK", um fortzufahren."""
 
-FORM_DEFAULTS = {'show_own': '1', \
-                 'search_str': '', \
-                 'show_open': '1'}
+RESTORE_SUCCESS_HEADER = u"""Fallakten wiederhergestellt!"""
+RESTORE_SUCCESS_TEXT = u"""Es wurden %s Fallakten erfolgreich wiederhergestellt. Bitte klicken Sie auf "OK", um fortzufahren.""" 
+RESTORE_NOTIFICATION_ERROR = u"""Bei dem Wiederherstellen der Fallakten ist ein Fehler aufgetreten. Bitte klicken Sie auf "OK", um fortzufahren."""
+SELECT_PARTS_FOR_EXPORT = u"Welche Bereiche der Fallakte(n) sollen exportiert werden?"
 
+FORM_DEFAULTS_ADMIN = {'show_own': '1', \
+                      'search_str': '', \
+                      'show_open': '0', \
+                      'show_markdelete': '1', \
+                      'show_markanonymize': '1'}
+
+FORM_DEFAULTS_CM    = {'show_own': '1', \
+                      'search_str': '', \
+                      'show_open': '1'}
+
+def parseSearchOptions(options=None):
+    search_options = []
+    user = session['USER_AUTHORIZED']
+    if options.get('editor', '-1') != '-1':
+        search_options.append('editor:%s' % options.get('editor'))
+    if options.get('show_own') == '1':
+        search_options.append('own:%s' % user.id)
+    if options.get('show_other') == '1':
+        search_options.append('standin:%s' % user.id)
+    if options.get('show_open') == '1':
+        search_options.append('state:%s' % 1)
+        search_options.append('state:%s' % 2)
+    if options.get('show_closed') == '1':
+        search_options.append('state:%s' % 2)
+    if options.get('show_markdelete') == '1':
+        search_options.append('state:%s' % 3)
+    if options.get('show_markanonymize') == '1':
+        search_options.append('state:%s' % 4)
+    if options.get('show_anonymized') == '1':
+        search_options.append('state:%s' % 5)
+    if options.get('gender') >= -1:
+        search_options.append('gender:%s' % options.get('gender'))
+    if options.get('branch'):
+        search_options.append('branch:%s' % options.get('branch'))
+    if options.get('search_str'):
+        search_options.append(options.get('search_str'))
+
+    #cm-states
+    cm_state = options.get('cm_state')
+    cm = 'all' # default
+    if cm_state: 
+        if cm_state == 1:
+            cm = 'all'
+        if cm_state == 2:
+            cm = 'before'
+        if cm_state == 3:
+            cm = 'active'
+        if cm_state == 4:
+            cm = 'finished'
+        search_options.append('cm:%s' % cm)
+
+    #check build time_interval
+    year = options.get('year')
+    quarter = options.get('quarter')
+    if year != '-1' and year:
+        q_start = "01-01"
+        q_end = "12-31"
+        if quarter == '1':
+            q_end   = "03-31"
+        if quarter == '2':
+            q_start = "04-01"
+            q_end   = "06-30"
+        if quarter == '3':
+            q_start = "07-01"
+            q_end   = "09-30"
+        if quarter == '4':
+            q_start = "10-01"
+
+        search_options.append("interval_start_date:%s" % "-".join([year, q_start]))
+        search_options.append("interval_end_date:%s" % "-".join([year, q_end]))
+
+    return search_options
+
+
 class CaseOverviewController(CasebaseController):
 
     def __before__(self):
@@ -75,55 +166,90 @@
     def index(self):
         return self.overview()
 
+
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr'))
-    def overview(self, reset=0):
+    def overview_extended(self):
+        extended = session.get('EXTENDED_SEARCH')
+        if extended is not None:
+            extended = not extended
+        else:
+            extended = True
+        session['EXTENDED_SEARCH'] = extended
+        session.save()
+        return self.overview(0, 'name_1', 'asc')
+
+    @checkRole(('admin_ka', 'cm_ka', 'pt_dlr'))
+    def overview(self, reset=0, sort_field="name_1", sort_order="asc"):
         reset = self._checkBool(reset)
         if reset:
+            session['CASE_OVERVIEW_SEARCHOPTIONS'] = {}
             session['CASE_OVERVIEW_SELECTION'] = {}
-            session['CASE_OVERVIEW_SEARCHOPTIONS'] = {}
+            session['EXTENDED_SEARCH'] = False 
             session.save()
 
+        c.extended_search = session.get('EXTENDED_SEARCH', False)
+        user = session['USER_AUTHORIZED']
+
         # editor or standin setting will be ignored for admin users. They will
         # be overwritten in case-controller
         ulo = UserListObject()
         filter = [u.id for u in ulo.getAdminList()]
         c.userlist = ulo.getUserList(filter)
 
+        # If the user is admin then he should see only cases which are marked for
+        # deletion or anonymisation
+        if user.isAdmin():
+            FORM_DEFAULTS = FORM_DEFAULTS_ADMIN
+        else:
+            FORM_DEFAULTS = FORM_DEFAULTS_CM
+
+        form_defaults = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or FORM_DEFAULTS
+        search_options = parseSearchOptions(form_defaults)
+
+        # Sorting of the cases
+        if sort_field == "name_1":
+            search_options.append('sort_field:name_1')
+        if sort_field == "vorname_1":
+            search_options.append('sort_field:vorname_1')
+        if sort_field == "zugriff":
+            search_options.append('sort_field:zugriff')
+        if sort_field == "kundennummer":
+            search_options.append('sort_field:zugriff')
+        if sort_field == "bearbeiter_id":
+            search_options.append('sort_field:bearbeiter_id')
+
+        if sort_order == "desc":
+            search_options.append('sort_order:desc')
+        else:
+            search_options.append('sort_order:asc')
+
+        search_str = ";".join(search_options)
+
         c.cases = CaseOverview()
-        form_defaults = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or FORM_DEFAULTS
-        search_options = self._parseSearchOptions(form_defaults)
-        c.cases.search(";".join(search_options))
-        c.cases.sortByLastname()
+        c.cases.search(search_str)
+
+        #count num of cases
+        c.count_all = len([x for x in c.cases.getDatasets()])
+        c.count_own = len([x for x in c.cases.getDatasets() if x.getEditor().id == user.id])
+        c.count_standin = c.count_all - c.count_own 
+        c.count_anon = len([x for x in c.cases.getDatasets() if x.getState().getState() == 5])
+        c.count_markanon = len([x for x in c.cases.getDatasets() if x.getState().getState() == 4])
+        c.count_del  = len([x for x in c.cases.getDatasets() if x.getState().getState() == 3])
+
         # Load case-selection and merge with default search options
         # Ok please close your eyes now!!! This is.... well ugly
         form_defaults_copy = form_defaults.copy()
         form_defaults_copy.update(session.get('CASE_OVERVIEW_SELECTION', {}))
+
+        # Hide evaluation option if someone did a search for a particular editor
+        c.hide_evaluation = False 
+        expr = re.compile('.*editor:[0-9]+.*')
+        if expr.match(search_str):
+            c.hide_evaluation = True
+
         overview = render('/casemanagement/overview.mako')
         return formencode.htmlfill.render(unicode(overview, 'utf-8'),defaults=form_defaults_copy)
 
-    def _parseSearchOptions(self, options=None):
-
-        search_options = []
-        user = session['USER_AUTHORIZED']
-        if options.get('editor', '-1') != '-1':
-            search_options.append('editor:%s' % options.get('editor'))
-        if options.get('show_own') == '1':
-            search_options.append('own:%s' % user.id)
-        if options.get('show_other') == '1':
-            search_options.append('standin:%s' % user.id)
-
-        if options.get('show_open') == '1':
-            search_options.append('state:%s' % 1)
-        if options.get('show_closed') == '1':
-            search_options.append('state:%s' % 2)
-        if options.get('show_markdelete') == '1':
-            search_options.append('state:%s' % 3)
-        if options.get('show_anonymized') == '1':
-            search_options.append('state:%s' % 5)
-        if options.get('search_str'):
-            search_options.append(options.get('search_str'))
-        return search_options
-
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr'))
     def search(self):
         validator = SearchCaseForm()
@@ -149,11 +275,19 @@
             session.save()
             form_result = validator.to_python(data)
             action      = form_result.get('action') 
+            c.current_user = session['USER_AUTHORIZED']
             if form_result.get('all_cases') > 0:
                 # Narf! Load ids of all cases with the last search option again
                 # as they are not included in the submitted data.
+
+                # If the user is admin then he should see only cases which are marked for
+                # deletion or anonymisation
+                if c.current_user.isAdmin():
+                    FORM_DEFAULTS = FORM_DEFAULTS_ADMIN
+                else:
+                    FORM_DEFAULTS = FORM_DEFAULTS_CM
                 search_options = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or FORM_DEFAULTS
-                search_str = ";".join(self._parseSearchOptions(search_options))
+                search_str = ";".join(parseSearchOptions(search_options))
                 case_bundle = CaseBundle([case.id for case in CaseOverview().search(search_str)])
             else:
                 case_bundle = CaseBundle(form_result.get('case_id', []))
@@ -169,13 +303,13 @@
 
             group_list   = UserGroupList()
             user_list    = UserListObject()
-            c.current_user = session['USER_AUTHORIZED']
             group_filter = [u.gid for u in user_list.getAdminList()]
             user_filter  = [u.id for u in  user_list.getAdminList()]
             group_filter.append(c.current_user.gid)
             user_filter.append(c.current_user.id)
             c.group_list = group_list.getGroupList(group_filter)
             c.user_list = user_list.getUserList(user_filter)
+
             if action == 'delete':
                 # Filter out cases which aren't marked for deletion (3), or are anonymized (5)
                 case_bundle = self._filterBundle(case_bundle, (3,5))
@@ -183,6 +317,24 @@
                 session['casebundle'] = case_bundle
                 session.save()
                 return self.delete(0)
+
+            if action == 'anonymize':
+                # Filter out cases which aren't marked for anonymization (4)
+                case_bundle = self._filterBundle(case_bundle, [4])
+                if case_bundle.isEmpty(): return self._emptyListError()
+                session['casebundle'] = case_bundle
+                session.save()
+                return self.anonymize(0)
+
+            if action == 'restore':
+                # Filter out cases which aren't marked for anonymization (4),
+                # or marked for deletion (3)
+                case_bundle = self._filterBundle(case_bundle, (3,4))
+                if case_bundle.isEmpty(): return self._emptyListError()
+                session['casebundle'] = case_bundle
+                session.save()
+                return self.restore(0)
+
             if action == 'markdelete':
                 # Fiter out case which are not open(1) or inavtice (2)
                 case_bundle = self._filterBundle(case_bundle, (1,2))
@@ -190,6 +342,15 @@
                 session['casebundle'] = case_bundle
                 session.save()
                 return self.markDelete(0)
+
+            if action == 'markanonymize':
+                # Fiter out case which are not open(1) or inavtice (2)
+                case_bundle = self._filterBundle(case_bundle, (1,2))
+                if case_bundle.isEmpty(): return self._emptyListError()
+                session['casebundle'] = case_bundle
+                session.save()
+                return self.markAnonymize(0)
+
             elif action == 'stand-in':
                 # filter out cases where the user is not the editor and
                 # therefor is not allowed to set the standin.
@@ -237,9 +398,15 @@
                 return self.exportXML(1)
 
             elif action == 'evaluate':
-                return u"Auswerten"
+                if case_bundle.isEmpty(): return self._emptyListError()
+                session['casebundle'] = case_bundle
+                session['casebundle_for_eval'] = case_bundle
+                session['hide_search_option_on_eval'] = True
+                session.save()
+                redirect_to(controller='evaluate', action="evaluate", id=1);
             else:
                 raise HTTPNotFound()
+
         except formencode.Invalid, error:
             c.form_result = error.value
             c.form_errors = error.error_dict or {}
@@ -340,6 +507,31 @@
             return render('/casemanagement/dialogs/confirm.mako')
         return render('/casemanagement/dialogs/notificate_bundle_delete.mako')
 
+    @checkRole(('admin_ka'))
+    def anonymize(self, confirmed):
+        confirmed           = self._checkBool(confirmed)
+        c.context           = "../main.mako"
+        c.url_ok            = "/case_overview"
+        c.notification_for  = DIALOG_CONFIRM_ANONYMIZE
+        case_bundle         = session.get('casebundle')
+        if confirmed == 1:
+            try:
+                num = case_bundle.anonymize()
+                c.success_for       = ANONYMIZE_SUCCESS_HEADER
+                c.success_text = ANONYMIZE_SUCCESS_TEXT % str(num)
+                return render ('/casemanagement/dialogs/success_bundle_anonymize.mako')
+            except StandardError, err:
+                c.notification_text = ANONYMIZE_NOTIFICATION_ERROR
+            del session['casebundle']
+        else:
+            c.context     = "../main.mako" 
+            c.confirm_for = DIALOG_CONFIRM_ANONYMIZE
+            c.question    = DIALOG_CONFIRM_ANONYMIZE_EXPLAINATION % "\n".join(self._buildCaseList(case_bundle)) 
+            c.url_yes     = "/case_overview/anonymize/1"
+            c.url_no      = "/case_overview/"
+            return render('/casemanagement/dialogs/confirm_bundle_anonymize.mako')
+        return render('/casemanagement/dialogs/notificate_bundle_delete.mako')
+
     @checkRole(('cm_ka'))
     def markDelete(self, confirmed):
         confirmed           = self._checkBool(confirmed)
@@ -354,7 +546,6 @@
                 c.success_text = MARKDELETE_SUCCESS_TEXT % str(num)
                 return render ('/casemanagement/dialogs/success_markdelete.mako')
             except StandardError, err:
-                print err
                 c.notification_text = MARKDELETE_NOTIFICATION_ERROR
             del session['casebundle']
         else:
@@ -366,6 +557,58 @@
             return render('/casemanagement/dialogs/confirm.mako')
         return render('/casemanagement/dialogs/notificate_bundle_delete.mako')
 
+    @checkRole(('cm_ka'))
+    def markAnonymize(self, confirmed):
+        confirmed           = self._checkBool(confirmed)
+        c.context           = "../main.mako" 
+        c.url_ok            = "/case_overview"
+        c.notification_for  = DIALOG_CONFIRM_MARKANONYMIZE
+        case_bundle         = session.get('casebundle')
+        if confirmed == 1:
+            try:
+                num = case_bundle.markAnonymize()
+                c.success_for  = MARKANONYMIZE_SUCCESS_HEADER
+                c.success_text = MARKANONYMIZE_SUCCESS_TEXT % str(num)
+                return render ('/casemanagement/dialogs/success_bundle_anonymize.mako')
+            except StandardError, err:
+                print err
+                c.notification_text = MARKANONYMIZE_NOTIFICATION_ERROR
+            del session['casebundle']
+        else:
+            c.context     = "../main.mako" 
+            c.confirm_for = DIALOG_CONFIRM_MARKANONYMIZE
+            c.question    = DIALOG_CONFIRM_MARKANONYMIZE_EXPLAINATION % "\n".join(self._buildCaseList(case_bundle)) 
+            c.url_yes     = "/case_overview/markAnonymize/1"
+            c.url_no      = "/case_overview/"
+            return render('/casemanagement/dialogs/confirm_bundle_anonymize.mako')
+        return render('/casemanagement/dialogs/notificate_bundle_delete.mako')
+
+    @checkRole(('admin_ka'))
+    def restore(self, confirmed):
+        confirmed           = self._checkBool(confirmed)
+        c.context           = "../main.mako" 
+        c.url_ok            = "/case_overview"
+        c.notification_for  = DIALOG_CONFIRM_RESTORE
+        case_bundle         = session.get('casebundle')
+        if confirmed == 1:
+            try:
+                num = case_bundle.restore()
+                c.success_for  = RESTORE_SUCCESS_HEADER
+                c.success_text = RESTORE_SUCCESS_TEXT % str(num)
+                return render ('/casemanagement/dialogs/success_restore.mako')
+            except StandardError, err:
+                print err
+                c.notification_text = RESTORE_NOTIFICATION_ERROR
+            del session['casebundle']
+        else:
+            c.context     = "../main.mako" 
+            c.confirm_for = DIALOG_CONFIRM_RESTORE
+            c.question    = DIALOG_CONFIRM_RESTORE_EXPLAINATION % "\n".join(self._buildCaseList(case_bundle)) 
+            c.url_yes     = "/case_overview/restore/1"
+            c.url_no      = "/case_overview/"
+            return render('/casemanagement/dialogs/confirm_restore.mako')
+        return render('/casemanagement/dialogs/notificate_bundle_restore.mako')
+
     @checkRole(('cm_ka', 'admin_ka'))
     def exportCSV(self, confirmed):
         confirmed           = self._checkBool(confirmed)
@@ -417,13 +660,46 @@
         c.overview_link = h.url_for(action="overview")
         return render('casemanagement/downloadCSV.mako')
 
+    def __getSelectionChecker(self):
+        selection_checker = session.get('selected_export_parts')
+        if not selection_checker:
+            selection_checker = CasePartsSelection()
+            session['selected_export_parts'] = selection_checker
+            session.save()
+        return selection_checker
+
     @checkRole(('cm_ka', 'admin_ka'))
     def downloadXML(self):
-        c.download_link = h.url_for(action="downloadXMLAction")
-        c.overview_link = h.url_for(action="overview")
+        selection_checker = self.__getSelectionChecker()
+        c.is_all_selected = selection_checker.isAllSelected()
+        c.selection_link  = h.url_for(action="selectXMLParts")
+        c.download_link   = h.url_for(action="downloadXMLAction")
+        c.overview_link   = h.url_for(action="overview")
         return render('casemanagement/downloadXML.mako')
 
     @checkRole(('cm_ka', 'admin_ka'))
+    def selectXMLParts(self):
+        selection_checker  = self.__getSelectionChecker()
+        c.selection_question = SELECT_PARTS_FOR_EXPORT
+        c.store_action       = h.url_for(action="storeSelectedXMLParts")
+        page = render('casemanagement/selectParts.mako')
+        return formencode.htmlfill.render(unicode(page, 'utf-8'),defaults=selection_checker.selections)
+
+    @checkRole(('cm_ka', 'admin_ka'))
+    def storeSelectedXMLParts(self):
+        validator = CasePartSelectionForm()
+        selection_checker = self.__getSelectionChecker()
+        try:
+            params = validator.to_python(request.params)
+            for key, value in params.iteritems():
+                selection_checker.setChecked(key, value)
+            session['selected_export_parts'] = selection_checker
+            session.save()
+        except formencode.Invalid, error:
+            return selectXMLParts()
+        return self.exportXML(1)
+
+    @checkRole(('cm_ka', 'admin_ka'))
     def downloadXLS(self):
         c.download_link = h.url_for(action="downloadXLSAction")
         c.overview_link = h.url_for(action="overview")
@@ -433,10 +709,11 @@
     def downloadCSVAction(self):
         case_bundle = session.get('casebundle')
         case_ids = case_bundle.listDatasetIds()
+        anonymize = request.params.get('anonymize') and True or False
         try:
             if case_ids:
                 case_bundle = CaseBundle(case_ids)
-                csv = case_bundle.exportAsCSV()
+                csv = case_bundle.exportAsCSV(anonymize)
                 data = paste.fileapp.DataApp(
                     csv,
                     content_type        = 'text/csv',
@@ -452,10 +729,12 @@
     def downloadXMLAction(self):
         case_bundle = session.get('casebundle')
         case_ids = case_bundle.listDatasetIds()
+        anonymize = request.params.get('anonymize') and True or False
         try:
             if case_ids:
                 case_bundle = CaseBundle(case_ids)
-                xml = case_bundle.exportAsXML()
+                selection_checker = self.__getSelectionChecker()
+                xml = case_bundle.exportAsXML(selection_checker, anonymize)
                 data = paste.fileapp.DataApp(
                     xml,
                     content_type        = 'application/xml',
@@ -470,11 +749,12 @@
     @checkRole(('cm_ka', 'admin_ka'))
     def downloadXLSAction(self):
         case_bundle = session.get('casebundle')
-        case_ids = case_bundle.listDatasetIds()
+        case_ids    = case_bundle.listDatasetIds()
+        anonymize   = request.params.get('anonymize') and True or False
         try:
             if case_ids:
                 case_bundle = CaseBundle(case_ids)
-                xls = case_bundle.exportAsXLS()
+                xls = case_bundle.exportAsXLS(anonymize)
                 data = paste.fileapp.DataApp(
                     xls,
                     content_type        = 'application/msexcel',

Modified: trunk/waskaweb/controllers/evaluate.py
===================================================================
--- trunk/waskaweb/controllers/evaluate.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/evaluate.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -7,9 +7,16 @@
 #
 import logging
 import paste
-
+import formencode
+from sets import Set
+from waskaweb.lib.sql_helper import range_compress 
 from waskaweb.lib.base import *
 from waskaweb.lib.evaluation import *
+from waskaweb.lib.search import CaseSearch
+from waskaweb.lib.validators import SearchCaseForm 
+from waskaweb.controllers.case_overview import parseSearchOptions 
+from waskaweb.model.case import CaseBundle 
+from waskaweb.model.agency import AgencyBundle, AgencyOverview 
 
 log = logging.getLogger(__name__)
 
@@ -19,51 +26,154 @@
 from waskaweb.lib.security import checkRole
 from paste.httpexceptions  import HTTPNotFound
 
+SEARCH_STR = "state:1;state:2;state:4;state:5;own:%s"
+
 class EvaluateController(BaseController):
 
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def index(self):
         raise HTTPNotFound()
 
+    def search(self):
+        user = session['USER_AUTHORIZED']
+        search_str = SEARCH_STR % user.id
+        validator = SearchCaseForm()
+        c.form_result = {}
+        c.form_errors = {}
+        try:
+            form_result = validator.to_python(request.params)
+            # Update the searchoptions with params coming from the search
+            # dialog on the evaluation page 
+            old_session = session.get('CASE_OVERVIEW_SEARCHOPTIONS', {}) 
+            for key, value in form_result.iteritems():
+                if value:
+                   old_session[key] = value 
+            session['CASE_OVERVIEW_SEARCHOPTIONS'] = old_session
+            session.save()
+
+            search_str2 = ";".join(parseSearchOptions(form_result))
+            search_str  = ";".join([search_str2, search_str])
+            search = CaseSearch()
+            result = search.perform(search_str)
+            # fetch ids of the new search 
+            new_case_ids = []
+            for row in result:
+                new_case_ids.append(row['id'])
+
+            # fetch ids from the old casebundle 
+            old_case_bundle = session.get('casebundle_for_eval')
+            if not old_case_bundle:
+                old_case_bundle = self._getNewCaseBundle()
+            old_case_ids = old_case_bundle.listDatasetIds()
+
+            # now only take those ids which intersects.
+            ids = Set(old_case_ids) & Set(new_case_ids)
+
+            ## build casebundle
+            case_bundle = CaseBundle([id for id in ids])
+            session['casebundle'] = case_bundle
+            session.save()
+        except formencode.Invalid, error:
+            form_result = error.value
+            form_errors = error.error_dict or {}
+
+        return self.evaluate(form_result.get('eval_id'))
+
+    def _getNewCaseBundle(self):
+            user = session['USER_AUTHORIZED']
+            search_str = SEARCH_STR % user.id
+            search = CaseSearch()
+            result = search.perform(search_str)
+            # fetch ids if the cases
+            ids = []
+            for row in result:
+                ids.append(row['id'])
+            # build casebundle
+            case_bundle = CaseBundle(ids)
+            session['casebundle'] = case_bundle
+            session.save()
+            return case_bundle
+
+    def _getCompressedIds(self, reset=False):
+        # Load case bundle and build where to define cases for the evaluation
+        if reset:
+            case_bundle = self._getNewCaseBundle()
+        else:
+            case_bundle = session.get('casebundle')
+            if not case_bundle:
+                case_bundle = self._getNewCaseBundle()
+        ids = sorted(case_bundle.listDatasetIds())
+        rc = range_compress(ids)
+        return rc
+
+
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
-    def evaluate(self, id):
+    def evaluate(self, id, reset=0):
+        reset = self._checkBool(reset)
+        if reset:
+            if c.isEvaluationServer:
+                form_defaults = {}
+                search_options = parseSearchOptions(form_defaults)
+                # sql query fails if no sort order is given.
+                search_options.append('sort_field:fkz')
+                search_options.append('sort_order:asc')
+                agency_ids = [a.fkz for a in AgencyOverview().search(";".join(search_options))]
+                agency_bundle = AgencyBundle(agency_ids)
+                session['agencybundle'] = agency_bundle
+
+            session['hide_search_option_on_eval'] = False 
+            session['CASE_OVERVIEW_SEARCHOPTIONS'] = {}
+            session.save()
         try:
             if id == '1':
                 # Verhältnis Beratungskunden
-                e1 = Evaluation_1()
-                c.eval_1_total, c.eval_1_cm, c.eval_1_percent = e1.perform()
+                e1 = Evaluation_1(self._getCompressedIds(reset))
+                c.eval_1_total, c.eval_1_ber, c.eval_1_ber_percent, c.eval_1_cm, c.eval_1_cm_percent = e1.perform()
                 # Zugang zur KA
-                e4 = Evaluation_4()
+                e4 = Evaluation_4(self._getCompressedIds(reset))
                 c.eval_4 = e4.perform()
                 # Rechtskreis Zugang
-                e5 = Evaluation_5()
+                e5 = Evaluation_5(self._getCompressedIds(reset))
                 c.eval_5 = e5.perform()
-                return render('casemanagement/evaluation/evaluation_result_1.mako')
+                # Schulabschluss Zugang
+                e11 = Evaluation_11(self._getCompressedIds(reset))
+                c.eval_11 = e11.perform()
+                # Arbeitssituation
+                e12 = Evaluation_12(self._getCompressedIds(reset))
+                c.eval_12 = e12.perform()
+                page = render('casemanagement/evaluation/evaluation_result_1.mako')
             elif id == '2':
                 # Verweildauer CM
-                e10 = Evaluation_10()
+                e10 = Evaluation_10(self._getCompressedIds(reset))
                 c.eval_10 = e10.perform()
+                e13 = Evaluation_13(self._getCompressedIds(reset))
+                c.eval_13 = e13.perform()
                 # Altersverteilung 
-                e8 = Evaluation_8() 
+                e8 = Evaluation_8(self._getCompressedIds(reset)) 
                 c.eval_8 = e8.perform()
                 # Migration
-                e3 = Evaluation_3()
+                e3 = Evaluation_3(self._getCompressedIds(reset))
                 c.eval_3 = e3.perform()
                 # Verteilung Förderangebote
-                e9 = Evaluation_9()
+                e9 = Evaluation_9(self._getCompressedIds(reset))
                 c.eval_9 = e9.perform()
                 # Geschlecht
-                e2 = Evaluation_2()
+                e2 = Evaluation_2(self._getCompressedIds(reset))
                 c.eval_2_t, c.eval_2_m, c.eval_2_w, c.eval_2_i, c.eval_2_u = e2.perform()
-                return render('casemanagement/evaluation/evaluation_result_2.mako')
+                page = render('casemanagement/evaluation/evaluation_result_2.mako')
             elif id == '3':
                 # Vermittlung
-                e6 = Evaluation_6()
+                e6 = Evaluation_6(self._getCompressedIds(reset))
                 c.eval_6 = e6.perform()
                 # Rechtskreis nach Vermittlung
-                e7 = Evaluation_7()
+                e7 = Evaluation_7(self._getCompressedIds(reset))
                 c.eval_7 = e7.perform()
-                return render('casemanagement/evaluation/evaluation_result_3.mako')
+                page = render('casemanagement/evaluation/evaluation_result_3.mako')
+
+            form_result = session.get('CASE_OVERVIEW_SEARCHOPTIONS', {})
+            if form_result.has_key('eval_id'):
+                del form_result['eval_id'] # do not fillout eval_id woth htmlfill
+            return formencode.htmlfill.render(unicode(page, 'utf-8'),defaults=form_result)
         except:
             return render('/tests/trace.mako')
 
@@ -80,7 +190,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_1(self):
         try:
-            e = Evaluation_1()
+            e = Evaluation_1(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -89,7 +199,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_2(self):
         try:
-            e = Evaluation_2()
+            e = Evaluation_2(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -98,7 +208,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_3(self):
         try:
-            e = Evaluation_3()
+            e = Evaluation_3(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -107,7 +217,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_4(self):
         try:
-            e = Evaluation_4()
+            e = Evaluation_4(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -116,7 +226,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_5(self):
         try:
-            e = Evaluation_5()
+            e = Evaluation_5(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -125,7 +235,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_6(self):
         try:
-            e = Evaluation_6()
+            e = Evaluation_6(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -134,7 +244,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_7(self):
         try:
-            e = Evaluation_7()
+            e = Evaluation_7(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -143,7 +253,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_8(self):
         try:
-            e = Evaluation_8()
+            e = Evaluation_8(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -152,7 +262,7 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_9(self):
         try:
-            e = Evaluation_9()
+            e = Evaluation_9(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
@@ -161,10 +271,37 @@
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
     def exportEvaluation_10(self):
         try:
-            e = Evaluation_10()
+            e = Evaluation_10(self._getCompressedIds())
             return self._export(e)
         except:
             traceback.print_exc(file=sys.stderr)
             raise HTTPNotFound()
 
+    @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
+    def exportEvaluation_11(self):
+        try:
+            e = Evaluation_11(self._getCompressedIds())
+            return self._export(e)
+        except:
+            traceback.print_exc(file=sys.stderr)
+            raise HTTPNotFound()
+
+    @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
+    def exportEvaluation_12(self):
+        try:
+            e = Evaluation_12(self._getCompressedIds())
+            return self._export(e)
+        except:
+            traceback.print_exc(file=sys.stderr)
+            raise HTTPNotFound()
+
+    @checkRole(('admin_ka', 'cm_ka', 'pt_dlr', 'pb_ka'))
+    def exportEvaluation_13(self):
+        try:
+            e = Evaluation_13(self._getCompressedIds())
+            return self._export(e)
+        except:
+            traceback.print_exc(file=sys.stderr)
+            raise HTTPNotFound()
+
 # vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Added: trunk/waskaweb/controllers/logbook.py
===================================================================
--- trunk/waskaweb/controllers/logbook.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/logbook.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,13 @@
+import logging
+
+from waskaweb.lib.base import *
+
+log = logging.getLogger(__name__)
+
+class LogbookController(BaseController):
+
+    def index(self, id):
+        # Return a rendered template
+        #   return render('/some/template.mako')
+        # or, Return a response
+        return 'Hello World'

Modified: trunk/waskaweb/controllers/navigation.py
===================================================================
--- trunk/waskaweb/controllers/navigation.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/navigation.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -47,14 +47,11 @@
         ti.toggle()
 
         # Load last selected page
+        sti = ti 
         session_case = session.get('case')
         if session_case.id != ds_id: #Case seems to have changed. 
             redirect_to(controller="/case", action="select", id=ds_id, confirmed=0)
-        try:
             sti = self.navigation.getTreeItem(session_case.getPageId())
-        except:
-            # session page_id is none (e.g after selecting a case)
-            sti = ti
         c.ds_id      = ds_id
         real_id      = sti.realId(ds_id)
         c.case       = self._loadCase(ds_id)

Modified: trunk/waskaweb/controllers/statement.py
===================================================================
--- trunk/waskaweb/controllers/statement.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/statement.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -16,7 +16,9 @@
 from waskaweb.lib.security                  import checkRole
 
 from waskaweb.controllers.case              import ANONYMIZE_CONFIRM, \
-                                                   ANONYMIZE_CONFIRM_TEXT
+                                                   MARKANONYMIZE_CONFIRM_TEXT, \
+                                                   MARKANONYMIZE_SUCCESS, \
+                                                   MARKANONYMIZE_SUCCESS_TEXT
 
 log = logging.getLogger(__name__)
 
@@ -27,8 +29,8 @@
 SET_EE_ACCEPT_SUCCESS_TEXT = u"""Bitte klicken Sie auf "OK", um mit der Bearbeitung der Fallakte fortzufahren."""
 SET_EE_ACCEPT_FAILED_HEADER = u"""Einwilligungserklärung nicht gesetzt!"""
 SET_EE_ACCEPT_FAILED_TEXT = u"""Bei dem Setzen der Einwilligunserklärung ist ein Fehler aufgetreten. Bitte klicken Sie auf "OK", um fortzufahren."""
-SET_EE_DECLINE_SUCCESS_HEADER = u"""Fallakte wurde anonymisiert!"""
-SET_EE_DECLINE_SUCCESS_TEXT = u"""Die personenbezogenen Daten der Fallakte wurden gelöscht und die Fallakte aus der Übersicht entfernt. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
+#SET_EE_DECLINE_SUCCESS_HEADER = u"""Fallakte wurde anonymisiert!"""
+#SET_EE_DECLINE_SUCCESS_TEXT = u"""Die personenbezogenen Daten der Fallakte wurden gelöscht und die Fallakte aus der Übersicht entfernt. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
 SET_EE_DECLINE_FAILED_HEADER = u"""Fallakte wurde nicht anonymisiert!"""
 SET_EE_DECLINE_FAILED_TEXT = u"""Bei dem Anonymisieren der Fallakte ist ein Fehler aufgetreten. Die Fallakte wurde nicht anonymisiert. Bitte klicken Sie auf "OK", um zur Fallaktenübersicht fortzufahren."""
 class StatementController(CasebaseController):
@@ -126,16 +128,16 @@
             try:
                 statement = case.getPrivacyStatement()
                 statement.decline()
-                # Anonymize the case
-                case.anonymize()
+                # Mark case for anonymizion
+                case.getState().setState(4)
 
                 # TODO: Think about refreshing the state of the privacy statement
                 # in the statement model
                 session_case = session.get('case')
                 session_case.privacy_statement = True
                 session.save()
-                c.success_for  = SET_EE_DECLINE_SUCCESS_HEADER
-                c.success_text = SET_EE_DECLINE_SUCCESS_TEXT
+                c.success_for  = MARKANONYMIZE_SUCCESS
+                c.success_text = MARKANONYMIZE_SUCCESS_TEXT
                 c.url_ok       = h.url_for ('/case_overview')
                 return render('/statement/dialogs/ee_decline_success.mako')
             except:
@@ -145,7 +147,7 @@
                 return render('/statement/dialogs/ee_decline_failed.mako')
         else:
             c.confirm_for = ANONYMIZE_CONFIRM
-            c.question = ANONYMIZE_CONFIRM_TEXT
+            c.question = MARKANONYMIZE_CONFIRM_TEXT
             c.url_yes = h.url_for(
                 controller="statement", \
                 action="declinePrivacyStatement", \

Modified: trunk/waskaweb/controllers/waska.py
===================================================================
--- trunk/waskaweb/controllers/waska.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/controllers/waska.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -37,7 +37,7 @@
             # Get list of cases which were not edited longer than the allowed max
             # savetime
             maxsavetimelist   = MaxSaveTimeReminderOverview()
-            remindlist        = CaseReminderOverview()
+            caseremindlist        = CaseReminderOverview()
             #if h.hasRole(['cm_ka']):
             #    remindlist.join(maxsavetimelist)
             #    remindlist.sort()
@@ -51,12 +51,10 @@
             # As we want to display both kind of app. we need to join the lists and
             # sort them
             if h.hasRole(['cm_ka']):
-                caseapp.join(globalapp)
-                caseapp.join(remindlist)
+                caseapp.join(caseremindlist)
                 caseapp.sort()
                 c.appointmentlist = caseapp
-            else:
-                c.appointmentlist = globalapp
+            c.globalappointmentlist = globalapp
         return render('/start/start.mako')
 
     def help(self):

Modified: trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po
===================================================================
--- trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po	2008-08-13 13:15:49 UTC (rev 56)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: waskaweb 0.0.0\n"
 "Report-Msgid-Bugs-To: EMAIL at ADDRESS\n"
-"POT-Creation-Date: 2008-05-26 12:05+0200\n"
+"POT-Creation-Date: 2008-07-01 11:13+0200\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"
@@ -188,71 +188,82 @@
 "Ihre Standard-Vertretung wurde gespeichert. Bitte klicken Sie auf OK, um "
 "fortzufahren."
 
-#: waskaweb/lib/evaluation.py:77
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:13
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:33
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:13
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:13
+#: waskaweb/lib/evaluation.py:124
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:43
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:64
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:43
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:43
 msgid "cm_eval_summary_header_1"
 msgstr "1.1. Verhältnis Beratungskunden/Aufnahmen in das Case-Management (CM)"
 
-#: waskaweb/lib/evaluation.py:131
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:19
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:19
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:65
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:19
+#: waskaweb/lib/evaluation.py:180
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:50
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:50
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:116
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:50
 msgid "cm_eval_summary_header_4"
 msgstr "2.2. Alters- und Geschlechterstruktur in %"
 
-#: waskaweb/lib/evaluation.py:175
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:20
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:20
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:132
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:20
+#: waskaweb/lib/evaluation.py:224
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:51
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:51
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:183
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:51
 msgid "cm_eval_summary_header_5"
 msgstr "2.3. Migrationshintergrund"
 
-#: waskaweb/lib/evaluation.py:224
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:58
+#: waskaweb/lib/evaluation.py:274
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:95
 msgid "cm_eval_header_access_youngster_to_agency"
 msgstr "1.2.1. Zugang des Jugendlichen zur Kompetenzagentur"
 
-#: waskaweb/lib/evaluation.py:268
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:88
+#: waskaweb/lib/evaluation.py:319
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:125
 msgid "cm_eval_head_law_access_agency"
 msgstr "1.2.2. Angaben zum Rechtskreis beim Zugang zur Kompetenzagentur"
 
-#: waskaweb/lib/evaluation.py:318
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:34
+#: waskaweb/lib/evaluation.py:370
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:65
 msgid "cm_eval_head_where_to_place_youngster"
 msgstr "3.1.1. Wohin wurden die Jugendlichen vermittlelt?"
 
-#: waskaweb/lib/evaluation.py:363
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:64
+#: waskaweb/lib/evaluation.py:416
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:95
 msgid "cm_eval_header_law_changed_after_place"
 msgstr "3.1.2. Angaben zum Rechtskreis nach der Vermittlung"
 
-#: waskaweb/lib/evaluation.py:434
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:100
+#: waskaweb/lib/evaluation.py:487
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:151
 msgid "cm_eval_header_on_age"
 msgstr "2.2.2. Angaben zur Altersverteilung"
 
-#: waskaweb/lib/evaluation.py:497
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:21
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:21
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:165
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:21
+#: waskaweb/lib/evaluation.py:552
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:52
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:52
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:213
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:52
 msgid "cm_eval_summary_header_6"
 msgstr "2.4. Förderbedarf"
 
-#: waskaweb/lib/evaluation.py:559
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:18
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:18
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:33
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:18
-msgid "cm_eval_summary_header_3"
-msgstr "2.1. Verweildauer im CM"
+#: waskaweb/lib/evaluation.py:616
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:63
+msgid "cm_eval_length_cm"
+msgstr "2.1.1. Verweildauer im CM"
 
+#: waskaweb/lib/evaluation.py:657
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:90
+msgid "cm_eval_avg_length_cm"
+msgstr "2.1.2. Durchschnittliche Verweildauer in Wochen"
+
+#: waskaweb/lib/evaluation.py:707
+msgid "cm_eval_header_graduation"
+msgstr "1.3. Höchster erreichte Schulanbschluss"
+
+#: waskaweb/lib/evaluation.py:757
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:155
+msgid "cm_eval_header_work"
+msgstr "1.2.3. Status des Jugendlichen beim Zugang zur Kompetenzagentur"
+
 #: waskaweb/lib/renderer.py:209
 msgid "cm_rg_aid_overview_table_institution"
 msgstr "Institution"
@@ -313,27 +324,27 @@
 msgid "cm_rg_aid_overview_legend_new_offer"
 msgstr "Neues Angebot hinzufügen"
 
-#: waskaweb/model/case.py:1009
-#: waskaweb/templates/casemanagement/caselist.mako:41
-#: waskaweb/templates/casemanagement/caselist.mako:88
+#: waskaweb/model/case.py:1000
+#: waskaweb/templates/casemanagement/caselist.mako:57
+#: waskaweb/templates/casemanagement/caselist.mako:110
 msgid "case_state_label_open"
 msgstr "Offen"
 
-#: waskaweb/model/case.py:1010
-#: waskaweb/templates/casemanagement/caselist.mako:43
-#: waskaweb/templates/casemanagement/caselist.mako:90
+#: waskaweb/model/case.py:1001
+#: waskaweb/templates/casemanagement/caselist.mako:59
+#: waskaweb/templates/casemanagement/caselist.mako:112
 msgid "case_state_label_closed"
 msgstr "Geschlossen"
 
-#: waskaweb/model/case.py:1011
+#: waskaweb/model/case.py:1002
 msgid "case_state_label_outstanding_delete"
 msgstr "Schwebend gelöscht"
 
-#: waskaweb/model/case.py:1012
+#: waskaweb/model/case.py:1003
 msgid "case_state_label_outstanding_anon"
 msgstr "Schwebend anonymisiert"
 
-#: waskaweb/model/case.py:1013
+#: waskaweb/model/case.py:1004
 msgid "case_state_label_anon"
 msgstr "Anonymisiert"
 
@@ -377,37 +388,37 @@
 msgid "logout_p_login_again"
 msgstr ", um sich erneut in WASKA anzumelden."
 
-#: waskaweb/templates/main.mako:70
+#: waskaweb/templates/main.mako:78
 msgid "statusbar_logininfo"
 msgstr "Angemeldet als"
 
-#: waskaweb/templates/main.mako:82 waskaweb/templates/main.mako:112
+#: waskaweb/templates/main.mako:90 waskaweb/templates/main.mako:120
 msgid "sm_menu_link_home"
 msgstr "Schwarzes Brett"
 
-#: waskaweb/templates/main.mako:83 waskaweb/templates/start/help.mako:4
+#: waskaweb/templates/main.mako:91 waskaweb/templates/start/help.mako:4
 msgid "sm_menu_link_help"
 msgstr "Hilfe"
 
-#: waskaweb/templates/main.mako:84
+#: waskaweb/templates/main.mako:92
 #: waskaweb/templates/usersettings/change_password.mako:4
 #: waskaweb/templates/usersettings/show_settings.mako:4
 msgid "sm_menu_link_settings"
 msgstr "Mein Konto"
 
-#: waskaweb/templates/main.mako:85 waskaweb/templates/start/responsible.mako:4
+#: waskaweb/templates/main.mako:93 waskaweb/templates/start/responsible.mako:4
 msgid "sm_menu_link_responsible"
-msgstr "Träger"
+msgstr "Info"
 
-#: waskaweb/templates/main.mako:86
+#: waskaweb/templates/main.mako:94
 msgid "sm_menu_link_logout"
 msgstr "Abmelden"
 
-#: waskaweb/templates/main.mako:92 waskaweb/templates/main.mako:110
+#: waskaweb/templates/main.mako:100 waskaweb/templates/main.mako:118
 msgid "np_root"
 msgstr "Waska Start"
 
-#: waskaweb/templates/main.mako:113
+#: waskaweb/templates/main.mako:121
 #: waskaweb/templates/appointments/dialogs/confirm.mako:4
 #: waskaweb/templates/appointments/dialogs/notificate_delete_appointment.mako:5
 #: waskaweb/templates/appointments/dialogs/success_delete_appointment.mako:5
@@ -417,61 +428,61 @@
 msgid "menu_app_link_overview"
 msgstr "Termine"
 
-#: waskaweb/templates/main.mako:114
+#: waskaweb/templates/main.mako:122
 msgid "menu_doc_link_overview"
 msgstr "Dokumente"
 
-#: waskaweb/templates/main.mako:122 waskaweb/templates/main.mako:132
+#: waskaweb/templates/main.mako:130 waskaweb/templates/main.mako:140
 msgid "menu_header_cm"
 msgstr "Case-Management"
 
-#: waskaweb/templates/main.mako:124 waskaweb/templates/main.mako:134
+#: waskaweb/templates/main.mako:132 waskaweb/templates/main.mako:142
 msgid "menu_cm_link_overview"
 msgstr "Fallakten\t"
 
-#: waskaweb/templates/main.mako:125 waskaweb/templates/main.mako:139
+#: waskaweb/templates/main.mako:133 waskaweb/templates/main.mako:147
 #: waskaweb/templates/casemanagement/evaluation.mako:8
 msgid "cm_actions_link_evaluate"
 msgstr "Auswertung"
 
-#: waskaweb/templates/main.mako:136
+#: waskaweb/templates/main.mako:144
 msgid "menu_cm_link_new"
 msgstr "Fallakte anlegen"
 
-#: waskaweb/templates/main.mako:137
+#: waskaweb/templates/main.mako:145
 msgid "menu_cm_link_import"
 msgstr "Fallakte importieren"
 
-#: waskaweb/templates/main.mako:152
+#: waskaweb/templates/main.mako:160
 msgid "menu_header_adm"
 msgstr "Administration"
 
-#: waskaweb/templates/main.mako:154
+#: waskaweb/templates/main.mako:162
 msgid "menu_adm_link_useroverview"
 msgstr "Benutzer"
 
-#: waskaweb/templates/main.mako:157
+#: waskaweb/templates/main.mako:165
 msgid "menu_adm_link_usergroupoverview"
 msgstr "Benutzergruppen"
 
-#: waskaweb/templates/main.mako:160
+#: waskaweb/templates/main.mako:168
 msgid "menu_adm_link_showsettings"
 msgstr "Agentur"
 
-#: waskaweb/templates/main.mako:173
+#: waskaweb/templates/main.mako:181
 msgid "main_formular_input_error"
 msgstr "Fehlerhafte Formulareingabe"
 
-#: waskaweb/templates/main.mako:185
+#: waskaweb/templates/main.mako:194
 msgid "footer_title"
 msgstr "WASKA"
 
-#: waskaweb/templates/main.mako:185
+#: waskaweb/templates/main.mako:194
 msgid "footer_version"
-msgstr "30.05.2008 | Version 1.0.2"
+msgstr "01.07.2008 | Version 1.0.3rc5"
 
 #: waskaweb/templates/main_login.mako:38
-#: waskaweb/templates/start/responsible.mako:74
+#: waskaweb/templates/start/responsible.mako:149
 msgid "main_login_bmf_phrase"
 msgstr ""
 "Das Programm Kompetenzagenturen (Durchführungsphase) wird vom "
@@ -907,10 +918,10 @@
 #: waskaweb/templates/administration/overview_user.mako:60
 #: waskaweb/templates/administration/overview_usergroups.mako:34
 #: waskaweb/templates/administration/overview_usergroups.mako:43
-#: waskaweb/templates/appointments/appointmentlist.mako:4
-#: waskaweb/templates/casemanagement/appointmentlist.mako:4
-#: waskaweb/templates/casemanagement/caselist.mako:52
-#: waskaweb/templates/casemanagement/caselist.mako:99
+#: waskaweb/templates/appointments/appointmentlist.mako:3
+#: waskaweb/templates/casemanagement/appointmentlist.mako:3
+#: waskaweb/templates/casemanagement/caselist.mako:70
+#: waskaweb/templates/casemanagement/caselist.mako:123
 #: waskaweb/templates/casemanagement/reminderlist.mako:4
 #: waskaweb/templates/documents/case_overview.mako:42
 #: waskaweb/templates/documents/case_overview.mako:53
@@ -921,6 +932,7 @@
 #: waskaweb/templates/start/appointmentlist.mako:6
 #: waskaweb/templates/start/appointmentlist.mako:9
 #: waskaweb/templates/start/appointmentlist.mako:13
+#: waskaweb/templates/start/globalappointmentlist.mako:4
 #: waskaweb/templates/start/remindlist.mako:4
 msgid "cm_overview_a_show"
 msgstr "Anzeigen"
@@ -929,14 +941,14 @@
 #: waskaweb/templates/administration/overview_user.mako:62
 #: waskaweb/templates/administration/overview_usergroups.mako:35
 #: waskaweb/templates/administration/overview_usergroups.mako:44
-#: waskaweb/templates/appointments/appointmentlist.mako:7
-#: waskaweb/templates/casemanagement/agencylist.mako:20
-#: waskaweb/templates/casemanagement/agencylist.mako:30
-#: waskaweb/templates/casemanagement/appointmentlist.mako:7
-#: waskaweb/templates/casemanagement/caselist.mako:56
-#: waskaweb/templates/casemanagement/caselist.mako:62
-#: waskaweb/templates/casemanagement/caselist.mako:103
-#: waskaweb/templates/casemanagement/caselist.mako:109
+#: waskaweb/templates/appointments/appointmentlist.mako:5
+#: waskaweb/templates/casemanagement/agencylist.mako:29
+#: waskaweb/templates/casemanagement/agencylist.mako:39
+#: waskaweb/templates/casemanagement/appointmentlist.mako:5
+#: waskaweb/templates/casemanagement/caselist.mako:74
+#: waskaweb/templates/casemanagement/caselist.mako:84
+#: waskaweb/templates/casemanagement/caselist.mako:127
+#: waskaweb/templates/casemanagement/caselist.mako:137
 #: waskaweb/templates/casemanagement/reminderlist.mako:7
 #: waskaweb/templates/documents/case_overview.mako:44
 #: waskaweb/templates/documents/case_overview.mako:55
@@ -958,8 +970,8 @@
 msgstr "Benutzergruppenname"
 
 #: waskaweb/templates/administration/overview_usergroups.mako:53
-#: waskaweb/templates/casemanagement/agencylist.mako:39
-#: waskaweb/templates/casemanagement/caselist.mako:119
+#: waskaweb/templates/casemanagement/agencylist.mako:48
+#: waskaweb/templates/casemanagement/caselist.mako:147
 msgid "cm_overview_tbl_no_data_found"
 msgstr "Es wurden keine Datensätze gefunden."
 
@@ -1326,16 +1338,20 @@
 
 #: waskaweb/templates/appointments/overview_body.mako:5
 #: waskaweb/templates/appointments/remindlist_body.mako:5
+#: waskaweb/templates/start/globalappointmentlist.mako:9
 msgid "app_overview_tbl_header_date"
 msgstr "Datum"
 
 #: waskaweb/templates/appointments/overview_body.mako:6
 #: waskaweb/templates/appointments/remindlist_body.mako:6
+#: waskaweb/templates/start/globalappointmentlist.mako:10
 msgid "app_overview_tbl_header_desc"
 msgstr "Beschreibung"
 
 #: waskaweb/templates/appointments/overview_body.mako:7
 #: waskaweb/templates/appointments/remindlist_body.mako:7
+#: waskaweb/templates/logbook/overview.mako:30
+#: waskaweb/templates/start/globalappointmentlist.mako:11
 msgid "app_overview_tbl_header_actions"
 msgstr "Aktionen"
 
@@ -1431,6 +1447,7 @@
 #: waskaweb/templates/casemanagement/dialogs/alert.mako:5
 #: waskaweb/templates/casemanagement/dialogs/bundle_noselection.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm.mako:5
+#: waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_restore.mako:5
 #: waskaweb/templates/casemanagement/dialogs/delete_attachment_success.mako:4
@@ -1439,6 +1456,7 @@
 #: waskaweb/templates/casemanagement/dialogs/notificate_bundle_setstandin.mako:5
 #: waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako:5
 #: waskaweb/templates/casemanagement/dialogs/notificate_printall.mako:5
+#: waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete_admin.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete_cm.mako:5
@@ -1469,20 +1487,25 @@
 msgid "cm_header_overview"
 msgstr "Fallaktenübersicht"
 
+#: waskaweb/templates/casemanagement/agency_search.mako:55
+#: waskaweb/templates/casemanagement/search.mako:6
+msgid "cm_form_overview_search_submit"
+msgstr "Suchen"
+
 #: waskaweb/templates/casemanagement/agencylist.mako:6
 msgid "cm_overview_tbl_header_fkz"
 msgstr "FKZ"
 
-#: waskaweb/templates/casemanagement/agencylist.mako:7
+#: waskaweb/templates/casemanagement/agencylist.mako:10
 msgid "cm_overview_tbl_header_number_cases"
 msgstr "Anzahl Fälle"
 
-#: waskaweb/templates/casemanagement/agencylist.mako:8
+#: waskaweb/templates/casemanagement/agencylist.mako:14
 msgid "cm_overview_tbl_header_last_update"
 msgstr "Aktualisiert"
 
-#: waskaweb/templates/casemanagement/agencylist.mako:9
-#: waskaweb/templates/casemanagement/caselist.mako:15
+#: waskaweb/templates/casemanagement/agencylist.mako:18
+#: waskaweb/templates/casemanagement/caselist.mako:31
 msgid "cm_overview_tbl_header_actions"
 msgstr "Aktionen"
 
@@ -1491,6 +1514,7 @@
 #: waskaweb/templates/casemanagement/editAppointment.mako:12
 #: waskaweb/templates/casemanagement/formular.mako:34
 #: waskaweb/templates/casemanagement/newAppointment.mako:12
+#: waskaweb/templates/casemanagement/newLogbookEntry.mako:8
 #: waskaweb/templates/casemanagement/new_appointment.mako:5
 #: waskaweb/templates/casemanagement/organisation.mako:6
 #: waskaweb/templates/casemanagement/showAppointment.mako:4
@@ -1499,6 +1523,7 @@
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete_aid.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete_appointment.mako:4
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete_attachment.mako:4
+#: waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_open.mako:5
 #: waskaweb/templates/casemanagement/dialogs/delete_attachment_success.mako:6
 #: waskaweb/templates/casemanagement/dialogs/failed_delete_appointment.mako:5
@@ -1508,10 +1533,23 @@
 #: waskaweb/templates/casemanagement/dialogs/success_delete_aid.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete_appointment.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_edit_appointment.mako:5
+#: waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako:5
 #: waskaweb/templates/documents/case_new.mako:5
 #: waskaweb/templates/documents/case_overview.mako:5
 #: waskaweb/templates/documents/dialogs/delete_attachment_success.mako:4
 #: waskaweb/templates/documents/dialogs/failed_attachment.mako:4
+#: waskaweb/templates/logbook/edit.mako:10
+#: waskaweb/templates/logbook/new.mako:10
+#: waskaweb/templates/logbook/overview.mako:6
+#: waskaweb/templates/logbook/show.mako:5
+#: waskaweb/templates/logbook/dialogs/confirm_delete_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_create_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_delete_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_save_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_show_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/success_create_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/success_delete_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/success_save_logbook_entry.mako:5
 #: waskaweb/templates/statement/edit.mako:5
 #: waskaweb/templates/statement/list_statements.mako:6
 #: waskaweb/templates/statement/dialogs/confirm.mako:5
@@ -1569,48 +1607,60 @@
 msgid "cm_overview_tbl_header_id"
 msgstr "Knr."
 
-#: waskaweb/templates/casemanagement/caselist.mako:7
+#: waskaweb/templates/casemanagement/caselist.mako:10
 msgid "cm_overview_tbl_header_lastname"
 msgstr "Name"
 
-#: waskaweb/templates/casemanagement/caselist.mako:8
+#: waskaweb/templates/casemanagement/caselist.mako:14
 msgid "cm_overview_tbl_header_firstname"
 msgstr "Vorname"
 
-#: waskaweb/templates/casemanagement/caselist.mako:10
+#: waskaweb/templates/casemanagement/caselist.mako:19
 msgid "cm_overview_tbl_header_editor"
 msgstr "Bearbeiter"
 
-#: waskaweb/templates/casemanagement/caselist.mako:12
+#: waskaweb/templates/casemanagement/caselist.mako:24
 msgid "cm_overview_tbl_header_accesstime"
 msgstr "Aktualisiert"
 
-#: waskaweb/templates/casemanagement/caselist.mako:14
+#: waskaweb/templates/casemanagement/caselist.mako:30
 msgid "cm_overview_tbl_header_status"
 msgstr "Status"
 
-#: waskaweb/templates/casemanagement/caselist.mako:35
-#: waskaweb/templates/casemanagement/caselist.mako:82
+#: waskaweb/templates/casemanagement/caselist.mako:51
+#: waskaweb/templates/casemanagement/caselist.mako:104
 msgid "cm_overview_img_editor"
 msgstr "Bearbeiter"
 
-#: waskaweb/templates/casemanagement/caselist.mako:37
-#: waskaweb/templates/casemanagement/caselist.mako:84
+#: waskaweb/templates/casemanagement/caselist.mako:53
+#: waskaweb/templates/casemanagement/caselist.mako:106
 msgid "cm_overview_img_standin"
 msgstr "Vertreter"
 
-#: waskaweb/templates/casemanagement/caselist.mako:45
-#: waskaweb/templates/casemanagement/caselist.mako:92
+#: waskaweb/templates/casemanagement/caselist.mako:61
+#: waskaweb/templates/casemanagement/caselist.mako:114
 msgid "case_state_label_delete"
 msgstr "Gelöscht"
 
-#: waskaweb/templates/casemanagement/caselist.mako:47
-#: waskaweb/templates/casemanagement/caselist.mako:94
+#: waskaweb/templates/casemanagement/caselist.mako:63
+#: waskaweb/templates/casemanagement/caselist.mako:116
+msgid "case_state_label_markanonym"
+msgstr "Schwebend anonymisiert"
+
+#: waskaweb/templates/casemanagement/caselist.mako:65
+#: waskaweb/templates/casemanagement/caselist.mako:118
 msgid "case_state_label_anonym"
 msgstr "Anonymisiert"
 
-#: waskaweb/templates/casemanagement/caselist.mako:59
-#: waskaweb/templates/casemanagement/caselist.mako:106
+#: waskaweb/templates/casemanagement/caselist.mako:77
+#: waskaweb/templates/casemanagement/caselist.mako:83
+#: waskaweb/templates/casemanagement/caselist.mako:130
+#: waskaweb/templates/casemanagement/caselist.mako:136
+msgid "cm_overview_a_anonymize"
+msgstr "Fallakte anonymisieren"
+
+#: waskaweb/templates/casemanagement/caselist.mako:80
+#: waskaweb/templates/casemanagement/caselist.mako:133
 msgid "cm_overview_a_restore"
 msgstr "Fallakte wiederherstellen"
 
@@ -1632,60 +1682,60 @@
 msgid "cm_header_digest"
 msgstr "Zusammenfassung der Fallakte"
 
-#: waskaweb/templates/casemanagement/digest.mako:57
+#: waskaweb/templates/casemanagement/digest.mako:56
 msgid "cm_header_digest_youth"
 msgstr "Angaben zum Jugendlichen"
 
-#: waskaweb/templates/casemanagement/digest.mako:60
-#: waskaweb/templates/casemanagement/digest.mako:114
+#: waskaweb/templates/casemanagement/digest.mako:59
+#: waskaweb/templates/casemanagement/digest.mako:113
 msgid "cm_digest_tbl_label_lastname"
 msgstr "Name"
 
-#: waskaweb/templates/casemanagement/digest.mako:64
-#: waskaweb/templates/casemanagement/digest.mako:118
+#: waskaweb/templates/casemanagement/digest.mako:63
+#: waskaweb/templates/casemanagement/digest.mako:117
 msgid "cm_digest_tbl_label_firstname"
 msgstr "Vorname"
 
-#: waskaweb/templates/casemanagement/digest.mako:68
+#: waskaweb/templates/casemanagement/digest.mako:67
 msgid "cm_digest_tbl_label_caseid"
 msgstr "Kundennummer"
 
-#: waskaweb/templates/casemanagement/digest.mako:72
+#: waskaweb/templates/casemanagement/digest.mako:71
 msgid "cm_digest_tbl_label_age"
 msgstr "Alter"
 
-#: waskaweb/templates/casemanagement/digest.mako:76
-#: waskaweb/templates/casemanagement/digest.mako:122
+#: waskaweb/templates/casemanagement/digest.mako:75
+#: waskaweb/templates/casemanagement/digest.mako:121
 msgid "cm_digest_tbl_label_email"
 msgstr "E-Mail"
 
-#: waskaweb/templates/casemanagement/digest.mako:86
+#: waskaweb/templates/casemanagement/digest.mako:85
 msgid "cm_digest_tbl_label_street"
 msgstr "Straße"
 
-#: waskaweb/templates/casemanagement/digest.mako:90
+#: waskaweb/templates/casemanagement/digest.mako:89
 msgid "cm_digest_tbl_label_plz"
 msgstr "PLZ"
 
-#: waskaweb/templates/casemanagement/digest.mako:94
+#: waskaweb/templates/casemanagement/digest.mako:93
 msgid "cm_digest_tbl_label_city"
 msgstr "Ort"
 
-#: waskaweb/templates/casemanagement/digest.mako:98
-#: waskaweb/templates/casemanagement/digest.mako:132
+#: waskaweb/templates/casemanagement/digest.mako:97
+#: waskaweb/templates/casemanagement/digest.mako:131
 msgid "cm_digest_tbl_label_telephone"
 msgstr "Festnetz"
 
-#: waskaweb/templates/casemanagement/digest.mako:102
-#: waskaweb/templates/casemanagement/digest.mako:136
+#: waskaweb/templates/casemanagement/digest.mako:101
+#: waskaweb/templates/casemanagement/digest.mako:135
 msgid "cm_digest_tbl_label_mobiletelephone"
 msgstr "Mobil"
 
-#: waskaweb/templates/casemanagement/digest.mako:106
+#: waskaweb/templates/casemanagement/digest.mako:105
 msgid "cm_digest_tbl_label_telephone_more"
 msgstr "Weitere Telefonnummern"
 
-#: waskaweb/templates/casemanagement/digest.mako:111
+#: waskaweb/templates/casemanagement/digest.mako:110
 msgid "cm_header_digest_parent"
 msgstr "Angaben zum Erziehungsberechtigten"
 
@@ -1700,9 +1750,6 @@
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0.mako:7
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_month.mako:7
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_year.mako:7
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:7
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:7
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:7
 msgid "cm_np_evaluate"
 msgstr "Auswertung"
 
@@ -1766,7 +1813,6 @@
 msgstr "Name"
 
 #: waskaweb/templates/casemanagement/main.mako:21
-#: waskaweb/templates/casemanagement/organisation.mako:98
 msgid "cm_info_status"
 msgstr "Status"
 
@@ -1830,11 +1876,11 @@
 msgid "cm_menu_link_appointment"
 msgstr "Termine"
 
-#: waskaweb/templates/casemanagement/main.mako:73
+#: waskaweb/templates/casemanagement/main.mako:74
 msgid "cm_menu_link_documents"
 msgstr "Anlagen"
 
-#: waskaweb/templates/casemanagement/main.mako:79
+#: waskaweb/templates/casemanagement/main.mako:80
 msgid "cm_menu_header_structure"
 msgstr "Gliederung"
 
@@ -1894,14 +1940,6 @@
 msgid "cm_organisation_table_cm"
 msgstr "Mitarbeiterin / Mitarbeiter"
 
-#: waskaweb/templates/casemanagement/organisation.mako:101
-msgid "cm_menu_link_close"
-msgstr "Fallakte schließen"
-
-#: waskaweb/templates/casemanagement/organisation.mako:104
-msgid "cm_menu_link_open"
-msgstr "Fallakte öffnen"
-
 #: waskaweb/templates/casemanagement/overview.mako:11
 msgid "cm_overview_con_list_dossiers_admin"
 msgstr ""
@@ -1913,10 +1951,6 @@
 msgstr ""
 "Hier wird eine Auflistung der Fälle des angemeldeten Benutzers angezeigt"
 
-#: waskaweb/templates/casemanagement/overview.mako:29
-msgid "cm_form_overview_search_submit"
-msgstr "Suchen"
-
 #: waskaweb/templates/casemanagement/showAppointment.mako:18
 msgid "sm_menu_link_edit_appointment"
 msgstr "In Bearbeitung nehmen"
@@ -1943,9 +1977,14 @@
 msgstr "Fallakte löschen?"
 
 #: waskaweb/templates/casemanagement/dialogs/confirm_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako:6
 #: waskaweb/templates/casemanagement/dialogs/failed_anonymize.mako:5
+#: waskaweb/templates/casemanagement/dialogs/failed_markanonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/failed_xml_import.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako:6
 msgid "cm_np_anonymize"
 msgstr "Fallakte anonymisieren"
 
@@ -2051,134 +2090,171 @@
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0.mako:8
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_month.mako:8
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_year.mako:8
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:8
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:8
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:8
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:7
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:7
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:7
 msgid "cm_np_evaluate_result"
-msgstr "Ergebnis der Auswertung"
+msgstr "Auswertungen"
 
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0.mako:10
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_month.mako:10
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_year.mako:10
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:10
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:10
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:10
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:9
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:9
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:9
 msgid "cm_header_evaluate_result"
-msgstr "Ergebnis der Auswertung"
+msgstr "Auswertungen"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:11
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:28
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:11
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:11
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:41
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:59
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:41
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:41
 msgid "eval_group_header_all"
 msgstr "1. Auswertungen über alle Jugendlichen"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:14
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:57
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:14
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:14
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:44
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:94
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:44
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:44
 msgid "cm_eval_summary_header_2"
 msgstr "1.2. Zugang zur Kompetenzagentur"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:16
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:16
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:28
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:16
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:45
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:187
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:45
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:45
+msgid "cm_eval_summary_header_11"
+msgstr "1.3. Höchster erreichte Schulabschluss"
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:47
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:47
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:59
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:47
 msgid "eval_group_header_incm"
-msgstr "2. Auswertung über Jugendliche im Case-Management"
+msgstr "2. Auswertungen über Jugendliche im Case-Management"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:23
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:23
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:23
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:28
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:49
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:49
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:62
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:49
+msgid "cm_eval_summary_header_3"
+msgstr "2.1. Verweildauer im CM"
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:54
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:54
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:54
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:59
 msgid "eval_group_header_finished"
-msgstr "3. Auswertung über Jugendliche, die das CM abgeschlossen haben"
+msgstr "3. Auswertungen über Jugendliche, die das CM abgeschlossen haben"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:25
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:25
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:25
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:33
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:56
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:56
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:56
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:64
 msgid "cm_eval_summary_header_7"
 msgstr "3.1. Vermittlung"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:30
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:61
 msgid "eval_group_note_all"
 msgstr ""
-"Diese Auswertung wird über alle gespeicherten Jugendlichen geführt.  Dies "
-"umfasst sowohl Jugendliche die sich im Case-Management befinden, dieses "
-"bereits abgeschlossen haben, oder noch nicht in das CM aufgenommen wurden."
+"Folgende Auswertungen werden über alle  WASKA erfassten Jugendlichen "
+"geführt.  Sie beziehen sich sowohl auf die Jugendlichen, die sich im Case-"
+"Management befinden, dieses bereits abgeschlossen haben, oder noch nicht in "
+"das CM aufgenommen wurden."
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:36
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:67
 msgid "cm_eval_table_adolescent"
 msgstr "Jugendliche"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:37
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:62
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:92
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:70
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:104
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:136
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:169
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:38
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:68
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:68
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:99
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:129
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:159
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:191
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:121
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:155
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:187
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:217
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:99
 msgid "cm_eval_table_number"
 msgstr "Anzahl"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:38
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:63
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:93
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:71
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:105
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:137
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:170
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:39
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:100
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:130
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:160
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:192
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:122
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:156
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:188
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:218
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:70
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:100
 msgid "cm_eval_table_percent"
 msgstr "Prozent"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:42
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:73
+msgid "cm_eval_table_all_customer"
+msgstr "Gesamt Jugendliche"
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:79
 msgid "cm_eval_table_consult_customer"
-msgstr "Beratungskunden"
+msgstr "Davon Beratungskunden"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:48
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:85
 msgid "cm_eval_table_taken_over_to_cm"
 msgstr "Davon in das CM übernommen"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:54
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:87
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:117
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:62
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:99
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:129
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:162
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:195
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:63
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:93
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:91
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:124
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:154
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:184
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:216
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:89
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:113
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:150
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:180
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:210
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:242
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:94
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:124
 msgid "cm_eval_table_to_overview"
 msgstr "Zur Übersicht"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:54
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:87
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:117
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:62
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:99
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:129
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:162
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:195
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:63
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:93
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:91
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:124
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:154
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:184
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:216
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:89
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:113
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:150
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:180
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:210
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:242
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:94
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:124
 msgid "cm_eval_table_export_analysis"
 msgstr "Auswertung exportieren"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:61
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:98
 msgid "cm_eval_table_access"
 msgstr "Zugang"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:91
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:128
 msgid "cm_eval_table_law"
 msgstr "Rechtkreis"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:30
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:158
+msgid "cm_eval_table_work"
+msgstr "Status"
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:190
+msgid "cm_eval_table_graduation"
+msgstr "Abschluss"
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:60
 msgid "eval_group_note_incm"
 msgstr ""
 "Diese Auswertung wird nur über Jugendliche geführt, die in das Case-"
@@ -2187,80 +2263,69 @@
 "Förderplanung erstellt wurde und ein Bedarf zur Förderung eingetragen wurde</"
 "strong>."
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:36
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:66
 msgid "cm_eval_table_month"
 msgstr "Woche"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:37
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:67
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:93
 msgid "cm_eval_table_completed"
 msgstr "Abgeschlossen"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:38
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:68
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:94
 msgid "cm_eval_table_aborted"
 msgstr "Abgebrochen"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:66
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:117
 msgid "cm_eval_header_on_gender"
 msgstr "2.2.1. Angaben zur Geschlechtsstruktur"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:120
 msgid "cm_eval_table_gender"
 msgstr "Geschlecht"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:75
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:126
 msgid "cm_eval_label_male"
 msgstr "männlich"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:81
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:132
 msgid "cm_eval_label_female"
 msgstr "weiblich"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:87
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:138
 msgid "cm_eval_label_intersexual"
 msgstr "intersexuell"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:93
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:144
 msgid "cm_eval_label_unknown"
 msgstr "Keine Angabe"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:103
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:154
 msgid "cm_eval_table_age"
 msgstr "Alter"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:135
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:186
 msgid "cm_eval_table_category"
 msgstr "Kategorie"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:141
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:192
 msgid "cm_eval_label_migration_background"
 msgstr "Migrationshintergrund"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:147
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:198
 msgid "cm_eval_label_no_migration_background"
 msgstr "Kein Migrationshintergrund"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:153
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:204
 msgid "cm_eval_label_ka_migration_background"
 msgstr "Keine Angabe"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:160
-msgid "cm_eval_note_ka_migration_background"
-msgstr ""
-"(Hinweis: Der Migrationshintergrund der Jugendlichen wird an der "
-"Muttersprache festgehalten.)"
-
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:168
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:216
 msgid "cm_eval_table_offer"
 msgstr "Angebot"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:194
-msgid "eval6_note"
-msgstr ""
-"(Hinweis: Diese Auswertung wird nur über die Angaben des Förderbedarfs in "
-"der Förderplanung geführt. Die tatsächliche Anzahl der eingetragenen "
-"Unterstützungsangebote wird nicht berücksichtigt.)"
-
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:30
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:61
 msgid "eval_group_note_finished"
 msgstr ""
 "Diese Auswertung wird nur über die Jugendlichen geführt, die das Case-"
@@ -2269,11 +2334,11 @@
 "Punkt 'Art der Beendigung' gemacht wurde. Das CM wird sowohl bei regulären "
 "als auch bei Abbruch als abgeschlossen gewertet."
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:37
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:68
 msgid "cm_eval_table_place"
 msgstr "Vermittlung"
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:67
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:98
 msgid "cm_eval_table_law_change"
 msgstr "Rechtskreis"
 
@@ -2418,15 +2483,19 @@
 msgid "cm_np_doc_success"
 msgstr "Dokument hinzugefügt"
 
-#: waskaweb/templates/start/responsible.mako:7
+#: waskaweb/templates/start/remindlist.mako:8
+msgid "cm_overview_a_keepactive"
+msgstr "Aufbewahrung verlängern"
+
+#: waskaweb/templates/start/responsible.mako:82
 msgid "responsible_info_sponsorship"
 msgstr "Information zur Trägerschaft"
 
-#: waskaweb/templates/start/responsible.mako:10
+#: waskaweb/templates/start/responsible.mako:85
 msgid "responsible_project_sponsorship"
 msgstr "Projektträger"
 
-#: waskaweb/templates/start/responsible.mako:51
+#: waskaweb/templates/start/responsible.mako:126
 msgid "responsible_realisation"
 msgstr "Realisation"
 
@@ -2461,7 +2530,10 @@
 msgid "statement_explaination_ee"
 msgstr ""
 "Diese Einwilligungserklärung ist die Grundlage zur Erfassung und Speicherung "
-"von personenbezogenen Daten."
+"von personenbezogenen Daten. Die Einverständniserklärung beinhaltet eine "
+"Aufbewahrungsfrist, die für jede Agentur einstellbar ist. Abgeschlossene "
+"Fallakten werden nach Ablauf der Frist automatisch zur Anonymisierung "
+"vorgeschlagen."
 
 #: waskaweb/templates/statement/list_statements.mako:24
 msgid "statement_header_fp"
@@ -2471,7 +2543,10 @@
 msgid "statement_explaination_fp"
 msgstr ""
 "Vereinbarung zwischen dem Jugendlichen und der Kompetenzagentur über einen "
-"gemeinsam ausgearbeiteten Förderplan im Rahmen des Case-Managements."
+"gemeinsam ausgearbeiteten Förderplan im Rahmen des Case-Managements. Es ist "
+"eine eigene Einverständniserklärung des Jugendlichen und ggf. der "
+"Erziehungsberechtigen einzuholen, wenn der Förderplan bzw. Daten an eine "
+"andere Hilfeinstitution weitergeleitet werden"
 
 #: waskaweb/templates/statement/list_statements.mako:33
 msgid "statement_header_ud"
@@ -2642,6 +2717,50 @@
 msgid "adm_np_changepassword"
 msgstr "Benutzerpasswort geändert!"
 
+#~ msgid "cm_evaluate_result_note"
+#~ msgstr ""
+#~ "Durch die folgenden Auswertungen können Sie einige wichtige Aussagen über "
+#~ "die Jugendlichen in Ihrer Kompetenzagentur treffen. Die Auswertungen "
+#~ "beziehen sich sowohl auf alle im System erfassten Jugendlichen als auch "
+#~ "nur auf die Jugendlichen, die sich im Case-Management befinden oder Case-"
+#~ "Management abgeschlossen haben. Neben den nachfolgenden "
+#~ "Auswertungsfunktionen besteht die Möglichkeit des Datenexports und der "
+#~ "differenzierten Auswertungen in anderen Programmen."
+
+#~ msgid "cm_eval_note_taken_over_to_cm"
+#~ msgstr ""
+#~ "(Hinweis: Unter Beratungskunden werden die Jugendlichen erfasst, bei "
+#~ "denen die Aufnahme ins Case-Management nicht erforderlich ist. Im "
+#~ "Unterpunkt 'Weiterer Verlauf' entscheidet die Case-Managerin bzw. der "
+#~ "Case-Manager darüber, ob der Jugendliche ins Case-Management übernommen "
+#~ "wird. Im Falle, wenn es keinen Bedarf an Case-Management gibt, gilt der "
+#~ "Jugendliche als Beratungskunde und wird dementsprechend in der Auswertung "
+#~ "als Beratungskunde berücksichtigt.)"
+
+#~ msgid "cm_eval_note_access_youngster_to_agency"
+#~ msgstr ""
+#~ "(Hinweis: Bei den Zugängen zur Kompetenzagentur werden sowohl formelle "
+#~ "bzw. institutionalisierte Wege (z.B. Schule, Jugendamt) als auch "
+#~ "informelle Wege (z.B. Lehrer, Freunde) ermittelt.)"
+
+#~ msgid "cm_eval_note_ka_migration_background"
+#~ msgstr ""
+#~ "(Hinweis: Der Migrationshintergrund wird im diesem Fall anhand eines "
+#~ "wichtigen Indikators, nämlich der Muttersprache des Jugendlichen "
+#~ "ausgewertet.)"
+
+#~ msgid "eval6_note"
+#~ msgstr ""
+#~ "(Hinweis: Diese Auswertung wird nur über die Angaben des Förderbedarfs in "
+#~ "der Förderplanung geführt. Die tatsächliche Anzahl der eingetragenen "
+#~ "Unterstützungsangebote wird nicht berücksichtigt.)"
+
+#~ msgid "cm_menu_link_close"
+#~ msgstr "Fallakte schließen"
+
+#~ msgid "cm_menu_link_open"
+#~ msgstr "Fallakte öffnen"
+
 #~ msgid "cm_np_bundled_standin_success"
 #~ msgstr "Vertretung zugewiesen!"
 

Modified: trunk/waskaweb/i18n/waskaweb.pot
===================================================================
--- trunk/waskaweb/i18n/waskaweb.pot	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/i18n/waskaweb.pot	2008-08-13 13:15:49 UTC (rev 56)
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: waskaweb 0.0.0\n"
 "Report-Msgid-Bugs-To: EMAIL at ADDRESS\n"
-"POT-Creation-Date: 2008-05-26 12:05+0200\n"
+"POT-Creation-Date: 2008-07-01 11:13+0200\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"
@@ -159,71 +159,82 @@
 msgid "adm_edit_standin_success_text"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:77
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:13
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:33
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:13
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:13
+#: waskaweb/lib/evaluation.py:124
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:43
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:64
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:43
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:43
 msgid "cm_eval_summary_header_1"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:131
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:19
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:19
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:65
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:19
+#: waskaweb/lib/evaluation.py:180
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:50
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:50
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:116
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:50
 msgid "cm_eval_summary_header_4"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:175
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:20
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:20
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:132
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:20
+#: waskaweb/lib/evaluation.py:224
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:51
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:51
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:183
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:51
 msgid "cm_eval_summary_header_5"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:224
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:58
+#: waskaweb/lib/evaluation.py:274
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:95
 msgid "cm_eval_header_access_youngster_to_agency"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:268
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:88
+#: waskaweb/lib/evaluation.py:319
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:125
 msgid "cm_eval_head_law_access_agency"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:318
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:34
+#: waskaweb/lib/evaluation.py:370
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:65
 msgid "cm_eval_head_where_to_place_youngster"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:363
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:64
+#: waskaweb/lib/evaluation.py:416
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:95
 msgid "cm_eval_header_law_changed_after_place"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:434
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:100
+#: waskaweb/lib/evaluation.py:487
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:151
 msgid "cm_eval_header_on_age"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:497
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:21
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:21
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:165
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:21
+#: waskaweb/lib/evaluation.py:552
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:52
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:52
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:213
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:52
 msgid "cm_eval_summary_header_6"
 msgstr ""
 
-#: waskaweb/lib/evaluation.py:559
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:18
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:18
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:33
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:18
-msgid "cm_eval_summary_header_3"
+#: waskaweb/lib/evaluation.py:616
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:63
+msgid "cm_eval_length_cm"
 msgstr ""
 
+#: waskaweb/lib/evaluation.py:657
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:90
+msgid "cm_eval_avg_length_cm"
+msgstr ""
+
+#: waskaweb/lib/evaluation.py:707
+msgid "cm_eval_header_graduation"
+msgstr ""
+
+#: waskaweb/lib/evaluation.py:757
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:155
+msgid "cm_eval_header_work"
+msgstr ""
+
 #: waskaweb/lib/renderer.py:209
 msgid "cm_rg_aid_overview_table_institution"
 msgstr ""
@@ -284,25 +295,25 @@
 msgid "cm_rg_aid_overview_legend_new_offer"
 msgstr ""
 
-#: waskaweb/model/case.py:1009 waskaweb/templates/casemanagement/caselist.mako:41
-#: waskaweb/templates/casemanagement/caselist.mako:88
+#: waskaweb/model/case.py:1000 waskaweb/templates/casemanagement/caselist.mako:57
+#: waskaweb/templates/casemanagement/caselist.mako:110
 msgid "case_state_label_open"
 msgstr ""
 
-#: waskaweb/model/case.py:1010 waskaweb/templates/casemanagement/caselist.mako:43
-#: waskaweb/templates/casemanagement/caselist.mako:90
+#: waskaweb/model/case.py:1001 waskaweb/templates/casemanagement/caselist.mako:59
+#: waskaweb/templates/casemanagement/caselist.mako:112
 msgid "case_state_label_closed"
 msgstr ""
 
-#: waskaweb/model/case.py:1011
+#: waskaweb/model/case.py:1002
 msgid "case_state_label_outstanding_delete"
 msgstr ""
 
-#: waskaweb/model/case.py:1012
+#: waskaweb/model/case.py:1003
 msgid "case_state_label_outstanding_anon"
 msgstr ""
 
-#: waskaweb/model/case.py:1013
+#: waskaweb/model/case.py:1004
 msgid "case_state_label_anon"
 msgstr ""
 
@@ -346,37 +357,37 @@
 msgid "logout_p_login_again"
 msgstr ""
 
-#: waskaweb/templates/main.mako:70
+#: waskaweb/templates/main.mako:78
 msgid "statusbar_logininfo"
 msgstr ""
 
-#: waskaweb/templates/main.mako:82 waskaweb/templates/main.mako:112
+#: waskaweb/templates/main.mako:90 waskaweb/templates/main.mako:120
 msgid "sm_menu_link_home"
 msgstr ""
 
-#: waskaweb/templates/main.mako:83 waskaweb/templates/start/help.mako:4
+#: waskaweb/templates/main.mako:91 waskaweb/templates/start/help.mako:4
 msgid "sm_menu_link_help"
 msgstr ""
 
-#: waskaweb/templates/main.mako:84
+#: waskaweb/templates/main.mako:92
 #: waskaweb/templates/usersettings/change_password.mako:4
 #: waskaweb/templates/usersettings/show_settings.mako:4
 msgid "sm_menu_link_settings"
 msgstr ""
 
-#: waskaweb/templates/main.mako:85 waskaweb/templates/start/responsible.mako:4
+#: waskaweb/templates/main.mako:93 waskaweb/templates/start/responsible.mako:4
 msgid "sm_menu_link_responsible"
 msgstr ""
 
-#: waskaweb/templates/main.mako:86
+#: waskaweb/templates/main.mako:94
 msgid "sm_menu_link_logout"
 msgstr ""
 
-#: waskaweb/templates/main.mako:92 waskaweb/templates/main.mako:110
+#: waskaweb/templates/main.mako:100 waskaweb/templates/main.mako:118
 msgid "np_root"
 msgstr ""
 
-#: waskaweb/templates/main.mako:113
+#: waskaweb/templates/main.mako:121
 #: waskaweb/templates/appointments/dialogs/confirm.mako:4
 #: waskaweb/templates/appointments/dialogs/notificate_delete_appointment.mako:5
 #: waskaweb/templates/appointments/dialogs/success_delete_appointment.mako:5
@@ -386,61 +397,61 @@
 msgid "menu_app_link_overview"
 msgstr ""
 
-#: waskaweb/templates/main.mako:114
+#: waskaweb/templates/main.mako:122
 msgid "menu_doc_link_overview"
 msgstr ""
 
-#: waskaweb/templates/main.mako:122 waskaweb/templates/main.mako:132
+#: waskaweb/templates/main.mako:130 waskaweb/templates/main.mako:140
 msgid "menu_header_cm"
 msgstr ""
 
-#: waskaweb/templates/main.mako:124 waskaweb/templates/main.mako:134
+#: waskaweb/templates/main.mako:132 waskaweb/templates/main.mako:142
 msgid "menu_cm_link_overview"
 msgstr ""
 
-#: waskaweb/templates/main.mako:125 waskaweb/templates/main.mako:139
+#: waskaweb/templates/main.mako:133 waskaweb/templates/main.mako:147
 #: waskaweb/templates/casemanagement/evaluation.mako:8
 msgid "cm_actions_link_evaluate"
 msgstr ""
 
-#: waskaweb/templates/main.mako:136
+#: waskaweb/templates/main.mako:144
 msgid "menu_cm_link_new"
 msgstr ""
 
-#: waskaweb/templates/main.mako:137
+#: waskaweb/templates/main.mako:145
 msgid "menu_cm_link_import"
 msgstr ""
 
-#: waskaweb/templates/main.mako:152
+#: waskaweb/templates/main.mako:160
 msgid "menu_header_adm"
 msgstr ""
 
-#: waskaweb/templates/main.mako:154
+#: waskaweb/templates/main.mako:162
 msgid "menu_adm_link_useroverview"
 msgstr ""
 
-#: waskaweb/templates/main.mako:157
+#: waskaweb/templates/main.mako:165
 msgid "menu_adm_link_usergroupoverview"
 msgstr ""
 
-#: waskaweb/templates/main.mako:160
+#: waskaweb/templates/main.mako:168
 msgid "menu_adm_link_showsettings"
 msgstr ""
 
-#: waskaweb/templates/main.mako:173
+#: waskaweb/templates/main.mako:181
 msgid "main_formular_input_error"
 msgstr ""
 
-#: waskaweb/templates/main.mako:185
+#: waskaweb/templates/main.mako:194
 msgid "footer_title"
 msgstr ""
 
-#: waskaweb/templates/main.mako:185
+#: waskaweb/templates/main.mako:194
 msgid "footer_version"
 msgstr ""
 
 #: waskaweb/templates/main_login.mako:38
-#: waskaweb/templates/start/responsible.mako:74
+#: waskaweb/templates/start/responsible.mako:149
 msgid "main_login_bmf_phrase"
 msgstr ""
 
@@ -866,10 +877,10 @@
 #: waskaweb/templates/administration/overview_user.mako:60
 #: waskaweb/templates/administration/overview_usergroups.mako:34
 #: waskaweb/templates/administration/overview_usergroups.mako:43
-#: waskaweb/templates/appointments/appointmentlist.mako:4
-#: waskaweb/templates/casemanagement/appointmentlist.mako:4
-#: waskaweb/templates/casemanagement/caselist.mako:52
-#: waskaweb/templates/casemanagement/caselist.mako:99
+#: waskaweb/templates/appointments/appointmentlist.mako:3
+#: waskaweb/templates/casemanagement/appointmentlist.mako:3
+#: waskaweb/templates/casemanagement/caselist.mako:70
+#: waskaweb/templates/casemanagement/caselist.mako:123
 #: waskaweb/templates/casemanagement/reminderlist.mako:4
 #: waskaweb/templates/documents/case_overview.mako:42
 #: waskaweb/templates/documents/case_overview.mako:53
@@ -880,6 +891,7 @@
 #: waskaweb/templates/start/appointmentlist.mako:6
 #: waskaweb/templates/start/appointmentlist.mako:9
 #: waskaweb/templates/start/appointmentlist.mako:13
+#: waskaweb/templates/start/globalappointmentlist.mako:4
 #: waskaweb/templates/start/remindlist.mako:4
 msgid "cm_overview_a_show"
 msgstr ""
@@ -888,14 +900,14 @@
 #: waskaweb/templates/administration/overview_user.mako:62
 #: waskaweb/templates/administration/overview_usergroups.mako:35
 #: waskaweb/templates/administration/overview_usergroups.mako:44
-#: waskaweb/templates/appointments/appointmentlist.mako:7
-#: waskaweb/templates/casemanagement/agencylist.mako:20
-#: waskaweb/templates/casemanagement/agencylist.mako:30
-#: waskaweb/templates/casemanagement/appointmentlist.mako:7
-#: waskaweb/templates/casemanagement/caselist.mako:56
-#: waskaweb/templates/casemanagement/caselist.mako:62
-#: waskaweb/templates/casemanagement/caselist.mako:103
-#: waskaweb/templates/casemanagement/caselist.mako:109
+#: waskaweb/templates/appointments/appointmentlist.mako:5
+#: waskaweb/templates/casemanagement/agencylist.mako:29
+#: waskaweb/templates/casemanagement/agencylist.mako:39
+#: waskaweb/templates/casemanagement/appointmentlist.mako:5
+#: waskaweb/templates/casemanagement/caselist.mako:74
+#: waskaweb/templates/casemanagement/caselist.mako:84
+#: waskaweb/templates/casemanagement/caselist.mako:127
+#: waskaweb/templates/casemanagement/caselist.mako:137
 #: waskaweb/templates/casemanagement/reminderlist.mako:7
 #: waskaweb/templates/documents/case_overview.mako:44
 #: waskaweb/templates/documents/case_overview.mako:55
@@ -917,8 +929,8 @@
 msgstr ""
 
 #: waskaweb/templates/administration/overview_usergroups.mako:53
-#: waskaweb/templates/casemanagement/agencylist.mako:39
-#: waskaweb/templates/casemanagement/caselist.mako:119
+#: waskaweb/templates/casemanagement/agencylist.mako:48
+#: waskaweb/templates/casemanagement/caselist.mako:147
 msgid "cm_overview_tbl_no_data_found"
 msgstr ""
 
@@ -1285,16 +1297,20 @@
 
 #: waskaweb/templates/appointments/overview_body.mako:5
 #: waskaweb/templates/appointments/remindlist_body.mako:5
+#: waskaweb/templates/start/globalappointmentlist.mako:9
 msgid "app_overview_tbl_header_date"
 msgstr ""
 
 #: waskaweb/templates/appointments/overview_body.mako:6
 #: waskaweb/templates/appointments/remindlist_body.mako:6
+#: waskaweb/templates/start/globalappointmentlist.mako:10
 msgid "app_overview_tbl_header_desc"
 msgstr ""
 
 #: waskaweb/templates/appointments/overview_body.mako:7
 #: waskaweb/templates/appointments/remindlist_body.mako:7
+#: waskaweb/templates/logbook/overview.mako:30
+#: waskaweb/templates/start/globalappointmentlist.mako:11
 msgid "app_overview_tbl_header_actions"
 msgstr ""
 
@@ -1390,6 +1406,7 @@
 #: waskaweb/templates/casemanagement/dialogs/alert.mako:5
 #: waskaweb/templates/casemanagement/dialogs/bundle_noselection.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm.mako:5
+#: waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_restore.mako:5
 #: waskaweb/templates/casemanagement/dialogs/delete_attachment_success.mako:4
@@ -1398,6 +1415,7 @@
 #: waskaweb/templates/casemanagement/dialogs/notificate_bundle_setstandin.mako:5
 #: waskaweb/templates/casemanagement/dialogs/notificate_import_dub.mako:5
 #: waskaweb/templates/casemanagement/dialogs/notificate_printall.mako:5
+#: waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete_admin.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete_cm.mako:5
@@ -1428,20 +1446,25 @@
 msgid "cm_header_overview"
 msgstr ""
 
+#: waskaweb/templates/casemanagement/agency_search.mako:55
+#: waskaweb/templates/casemanagement/search.mako:6
+msgid "cm_form_overview_search_submit"
+msgstr ""
+
 #: waskaweb/templates/casemanagement/agencylist.mako:6
 msgid "cm_overview_tbl_header_fkz"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/agencylist.mako:7
+#: waskaweb/templates/casemanagement/agencylist.mako:10
 msgid "cm_overview_tbl_header_number_cases"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/agencylist.mako:8
+#: waskaweb/templates/casemanagement/agencylist.mako:14
 msgid "cm_overview_tbl_header_last_update"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/agencylist.mako:9
-#: waskaweb/templates/casemanagement/caselist.mako:15
+#: waskaweb/templates/casemanagement/agencylist.mako:18
+#: waskaweb/templates/casemanagement/caselist.mako:31
 msgid "cm_overview_tbl_header_actions"
 msgstr ""
 
@@ -1450,6 +1473,7 @@
 #: waskaweb/templates/casemanagement/editAppointment.mako:12
 #: waskaweb/templates/casemanagement/formular.mako:34
 #: waskaweb/templates/casemanagement/newAppointment.mako:12
+#: waskaweb/templates/casemanagement/newLogbookEntry.mako:8
 #: waskaweb/templates/casemanagement/new_appointment.mako:5
 #: waskaweb/templates/casemanagement/organisation.mako:6
 #: waskaweb/templates/casemanagement/showAppointment.mako:4
@@ -1458,6 +1482,7 @@
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete_aid.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete_appointment.mako:4
 #: waskaweb/templates/casemanagement/dialogs/confirm_delete_attachment.mako:4
+#: waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/confirm_open.mako:5
 #: waskaweb/templates/casemanagement/dialogs/delete_attachment_success.mako:6
 #: waskaweb/templates/casemanagement/dialogs/failed_delete_appointment.mako:5
@@ -1467,10 +1492,22 @@
 #: waskaweb/templates/casemanagement/dialogs/success_delete_aid.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_delete_appointment.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_edit_appointment.mako:5
+#: waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako:5
 #: waskaweb/templates/documents/case_new.mako:5
 #: waskaweb/templates/documents/case_overview.mako:5
 #: waskaweb/templates/documents/dialogs/delete_attachment_success.mako:4
 #: waskaweb/templates/documents/dialogs/failed_attachment.mako:4
+#: waskaweb/templates/logbook/edit.mako:10 waskaweb/templates/logbook/new.mako:10
+#: waskaweb/templates/logbook/overview.mako:6
+#: waskaweb/templates/logbook/show.mako:5
+#: waskaweb/templates/logbook/dialogs/confirm_delete_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_create_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_delete_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_save_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/failed_show_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/success_create_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/success_delete_logbook_entry.mako:5
+#: waskaweb/templates/logbook/dialogs/success_save_logbook_entry.mako:5
 #: waskaweb/templates/statement/edit.mako:5
 #: waskaweb/templates/statement/list_statements.mako:6
 #: waskaweb/templates/statement/dialogs/confirm.mako:5
@@ -1528,48 +1565,60 @@
 msgid "cm_overview_tbl_header_id"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:7
+#: waskaweb/templates/casemanagement/caselist.mako:10
 msgid "cm_overview_tbl_header_lastname"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:8
+#: waskaweb/templates/casemanagement/caselist.mako:14
 msgid "cm_overview_tbl_header_firstname"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:10
+#: waskaweb/templates/casemanagement/caselist.mako:19
 msgid "cm_overview_tbl_header_editor"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:12
+#: waskaweb/templates/casemanagement/caselist.mako:24
 msgid "cm_overview_tbl_header_accesstime"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:14
+#: waskaweb/templates/casemanagement/caselist.mako:30
 msgid "cm_overview_tbl_header_status"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:35
-#: waskaweb/templates/casemanagement/caselist.mako:82
+#: waskaweb/templates/casemanagement/caselist.mako:51
+#: waskaweb/templates/casemanagement/caselist.mako:104
 msgid "cm_overview_img_editor"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:37
-#: waskaweb/templates/casemanagement/caselist.mako:84
+#: waskaweb/templates/casemanagement/caselist.mako:53
+#: waskaweb/templates/casemanagement/caselist.mako:106
 msgid "cm_overview_img_standin"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:45
-#: waskaweb/templates/casemanagement/caselist.mako:92
+#: waskaweb/templates/casemanagement/caselist.mako:61
+#: waskaweb/templates/casemanagement/caselist.mako:114
 msgid "case_state_label_delete"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:47
-#: waskaweb/templates/casemanagement/caselist.mako:94
+#: waskaweb/templates/casemanagement/caselist.mako:63
+#: waskaweb/templates/casemanagement/caselist.mako:116
+msgid "case_state_label_markanonym"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/caselist.mako:65
+#: waskaweb/templates/casemanagement/caselist.mako:118
 msgid "case_state_label_anonym"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/caselist.mako:59
-#: waskaweb/templates/casemanagement/caselist.mako:106
+#: waskaweb/templates/casemanagement/caselist.mako:77
+#: waskaweb/templates/casemanagement/caselist.mako:83
+#: waskaweb/templates/casemanagement/caselist.mako:130
+#: waskaweb/templates/casemanagement/caselist.mako:136
+msgid "cm_overview_a_anonymize"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/caselist.mako:80
+#: waskaweb/templates/casemanagement/caselist.mako:133
 msgid "cm_overview_a_restore"
 msgstr ""
 
@@ -1589,60 +1638,60 @@
 msgid "cm_header_digest"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:57
+#: waskaweb/templates/casemanagement/digest.mako:56
 msgid "cm_header_digest_youth"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:60
-#: waskaweb/templates/casemanagement/digest.mako:114
+#: waskaweb/templates/casemanagement/digest.mako:59
+#: waskaweb/templates/casemanagement/digest.mako:113
 msgid "cm_digest_tbl_label_lastname"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:64
-#: waskaweb/templates/casemanagement/digest.mako:118
+#: waskaweb/templates/casemanagement/digest.mako:63
+#: waskaweb/templates/casemanagement/digest.mako:117
 msgid "cm_digest_tbl_label_firstname"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:68
+#: waskaweb/templates/casemanagement/digest.mako:67
 msgid "cm_digest_tbl_label_caseid"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:72
+#: waskaweb/templates/casemanagement/digest.mako:71
 msgid "cm_digest_tbl_label_age"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:76
-#: waskaweb/templates/casemanagement/digest.mako:122
+#: waskaweb/templates/casemanagement/digest.mako:75
+#: waskaweb/templates/casemanagement/digest.mako:121
 msgid "cm_digest_tbl_label_email"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:86
+#: waskaweb/templates/casemanagement/digest.mako:85
 msgid "cm_digest_tbl_label_street"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:90
+#: waskaweb/templates/casemanagement/digest.mako:89
 msgid "cm_digest_tbl_label_plz"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:94
+#: waskaweb/templates/casemanagement/digest.mako:93
 msgid "cm_digest_tbl_label_city"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:98
-#: waskaweb/templates/casemanagement/digest.mako:132
+#: waskaweb/templates/casemanagement/digest.mako:97
+#: waskaweb/templates/casemanagement/digest.mako:131
 msgid "cm_digest_tbl_label_telephone"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:102
-#: waskaweb/templates/casemanagement/digest.mako:136
+#: waskaweb/templates/casemanagement/digest.mako:101
+#: waskaweb/templates/casemanagement/digest.mako:135
 msgid "cm_digest_tbl_label_mobiletelephone"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:106
+#: waskaweb/templates/casemanagement/digest.mako:105
 msgid "cm_digest_tbl_label_telephone_more"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/digest.mako:111
+#: waskaweb/templates/casemanagement/digest.mako:110
 msgid "cm_header_digest_parent"
 msgstr ""
 
@@ -1657,9 +1706,6 @@
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0.mako:7
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_month.mako:7
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_year.mako:7
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:7
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:7
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:7
 msgid "cm_np_evaluate"
 msgstr ""
 
@@ -1723,7 +1769,6 @@
 msgstr ""
 
 #: waskaweb/templates/casemanagement/main.mako:21
-#: waskaweb/templates/casemanagement/organisation.mako:98
 msgid "cm_info_status"
 msgstr ""
 
@@ -1787,11 +1832,11 @@
 msgid "cm_menu_link_appointment"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/main.mako:73
+#: waskaweb/templates/casemanagement/main.mako:74
 msgid "cm_menu_link_documents"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/main.mako:79
+#: waskaweb/templates/casemanagement/main.mako:80
 msgid "cm_menu_header_structure"
 msgstr ""
 
@@ -1842,14 +1887,6 @@
 msgid "cm_organisation_table_cm"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/organisation.mako:101
-msgid "cm_menu_link_close"
-msgstr ""
-
-#: waskaweb/templates/casemanagement/organisation.mako:104
-msgid "cm_menu_link_open"
-msgstr ""
-
 #: waskaweb/templates/casemanagement/overview.mako:11
 msgid "cm_overview_con_list_dossiers_admin"
 msgstr ""
@@ -1858,10 +1895,6 @@
 msgid "cm_overview_con_list_dossiers_cm"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/overview.mako:29
-msgid "cm_form_overview_search_submit"
-msgstr ""
-
 #: waskaweb/templates/casemanagement/showAppointment.mako:18
 msgid "sm_menu_link_edit_appointment"
 msgstr ""
@@ -1888,9 +1921,14 @@
 msgstr ""
 
 #: waskaweb/templates/casemanagement/dialogs/confirm_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako:6
 #: waskaweb/templates/casemanagement/dialogs/failed_anonymize.mako:5
+#: waskaweb/templates/casemanagement/dialogs/failed_markanonymize.mako:5
 #: waskaweb/templates/casemanagement/dialogs/failed_xml_import.mako:5
 #: waskaweb/templates/casemanagement/dialogs/success_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako:6
+#: waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako:6
 msgid "cm_np_anonymize"
 msgstr ""
 
@@ -1996,211 +2034,241 @@
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0.mako:8
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_month.mako:8
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_year.mako:8
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:8
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:8
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:8
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:7
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:7
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:7
 msgid "cm_np_evaluate_result"
 msgstr ""
 
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0.mako:10
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_month.mako:10
 #: waskaweb/templates/casemanagement/evaluation/evaluation_result_0_year.mako:10
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:10
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:10
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:10
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:9
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:9
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:9
 msgid "cm_header_evaluate_result"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:11
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:28
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:11
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:11
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:41
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:59
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:41
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:41
 msgid "eval_group_header_all"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:14
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:57
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:14
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:14
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:44
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:94
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:44
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:44
 msgid "cm_eval_summary_header_2"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:16
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:16
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:28
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:16
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:45
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:187
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:45
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:45
+msgid "cm_eval_summary_header_11"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:47
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:47
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:59
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:47
 msgid "eval_group_header_incm"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:23
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:23
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:23
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:28
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:49
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:49
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:62
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:49
+msgid "cm_eval_summary_header_3"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:54
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:54
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:54
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:59
 msgid "eval_group_header_finished"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:25
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:25
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:25
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:33
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:56
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:56
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:56
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:64
 msgid "cm_eval_summary_header_7"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:30
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:61
 msgid "eval_group_note_all"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:36
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:67
 msgid "cm_eval_table_adolescent"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:37
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:62
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:92
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:70
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:104
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:136
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:169
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:38
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:68
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:68
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:99
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:129
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:159
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:191
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:121
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:155
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:187
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:217
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:99
 msgid "cm_eval_table_number"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:38
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:63
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:93
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:71
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:105
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:137
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:170
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:39
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:100
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:130
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:160
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:192
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:122
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:156
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:188
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:218
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:70
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:100
 msgid "cm_eval_table_percent"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:42
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:73
+msgid "cm_eval_table_all_customer"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:79
 msgid "cm_eval_table_consult_customer"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:48
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:85
 msgid "cm_eval_table_taken_over_to_cm"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:54
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:87
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:117
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:62
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:99
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:129
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:162
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:195
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:63
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:93
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:91
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:124
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:154
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:184
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:216
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:89
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:113
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:150
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:180
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:210
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:242
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:94
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:124
 msgid "cm_eval_table_to_overview"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:54
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:87
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:117
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:62
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:99
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:129
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:162
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:195
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:63
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:93
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:91
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:124
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:154
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:184
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:216
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:89
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:113
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:150
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:180
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:210
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:242
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:94
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:124
 msgid "cm_eval_table_export_analysis"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:61
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:98
 msgid "cm_eval_table_access"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:91
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:128
 msgid "cm_eval_table_law"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:30
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:158
+msgid "cm_eval_table_work"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako:190
+msgid "cm_eval_table_graduation"
+msgstr ""
+
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:60
 msgid "eval_group_note_incm"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:36
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:66
 msgid "cm_eval_table_month"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:37
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:67
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:93
 msgid "cm_eval_table_completed"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:38
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:68
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:94
 msgid "cm_eval_table_aborted"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:66
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:117
 msgid "cm_eval_header_on_gender"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:69
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:120
 msgid "cm_eval_table_gender"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:75
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:126
 msgid "cm_eval_label_male"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:81
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:132
 msgid "cm_eval_label_female"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:87
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:138
 msgid "cm_eval_label_intersexual"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:93
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:144
 msgid "cm_eval_label_unknown"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:103
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:154
 msgid "cm_eval_table_age"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:135
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:186
 msgid "cm_eval_table_category"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:141
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:192
 msgid "cm_eval_label_migration_background"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:147
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:198
 msgid "cm_eval_label_no_migration_background"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:153
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:204
 msgid "cm_eval_label_ka_migration_background"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:160
-msgid "cm_eval_note_ka_migration_background"
-msgstr ""
-
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:168
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:216
 msgid "cm_eval_table_offer"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako:194
-msgid "eval6_note"
-msgstr ""
-
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:30
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:61
 msgid "eval_group_note_finished"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:37
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:68
 msgid "cm_eval_table_place"
 msgstr ""
 
-#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:67
+#: waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako:98
 msgid "cm_eval_table_law_change"
 msgstr ""
 
@@ -2344,15 +2412,19 @@
 msgid "cm_np_doc_success"
 msgstr ""
 
-#: waskaweb/templates/start/responsible.mako:7
+#: waskaweb/templates/start/remindlist.mako:8
+msgid "cm_overview_a_keepactive"
+msgstr ""
+
+#: waskaweb/templates/start/responsible.mako:82
 msgid "responsible_info_sponsorship"
 msgstr ""
 
-#: waskaweb/templates/start/responsible.mako:10
+#: waskaweb/templates/start/responsible.mako:85
 msgid "responsible_project_sponsorship"
 msgstr ""
 
-#: waskaweb/templates/start/responsible.mako:51
+#: waskaweb/templates/start/responsible.mako:126
 msgid "responsible_realisation"
 msgstr ""
 

Modified: trunk/waskaweb/lib/csv.py
===================================================================
--- trunk/waskaweb/lib/csv.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/csv.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -13,14 +13,14 @@
 
 SEP = "\t"
 
-SELECT_MASTER_TBL = \
-"""SELECT * FROM master_tbl_view
-   WHERE id = %(id)s"""
-
 SELECT_MASTER_TBL_WHERE = \
 """SELECT * FROM master_tbl_view
    WHERE %s"""
 
+SELECT_MASTER_ANON = \
+"""SELECT * FROM master_tbl_anonym_view
+   WHERE %s"""
+
 FETCH_ALL_IDS = \
 """SELECT id FROM master_tbl_view"""
 
@@ -31,6 +31,13 @@
     "rg_angebote_bildenden_bereich_tbl_view",
     "rg_angebote_lebensbewaeltigung_tbl_view")
 
+RG_VIEWS_ANON = (
+    "rg_kompetenzfestellung_tbl_anonym_view",
+    "rg_angebote_berufliche_qualifizierung_tbl_anonym_view",
+    "rg_angebote_berufsvorbereitung_tbl_anonym_view",
+    "rg_angebote_bildenden_bereich_tbl_anonym_view",
+    "rg_angebote_lebensbewaeltigung_tbl_anonym_view")
+
 SELECT_RG = \
 """SELECT * FROM %s WHERE master_id = %d"""
 
@@ -76,15 +83,16 @@
         self.rgs[index].append(rg)
 
 class Cases:
-    def __init__(self):
-        self.cases = None
+    def __init__(self, anonymize=False):
+        self.cases     = None
+        self.anonymize = anonymize
 
     def fetchCases(self, cur, ids):
         case_hash = dict([(x[1], Case(x[0])) for x in enumerate(ids)])
         ids.sort()
         ids = range_compress(ids)
         where = where_ids(ids)
-        cur.execute(SELECT_MASTER_TBL_WHERE % where)
+        cur.execute((self.anonymize and SELECT_MASTER_ANON or SELECT_MASTER_TBL_WHERE) % where)
 
         headers, used_indices = None, None
 
@@ -93,7 +101,7 @@
             if not row: break
 
             if used_indices is None:
-                used_indices = [t[0] for t in enumerate(cur.description) if t[1] not in BLACK_LIST]
+                used_indices = [t[0] for t in enumerate(cur.description) if t[1][0] not in BLACK_LIST]
                 headers      = [cur.description[i][0] for i in used_indices]
 
             values = [row[i] for i in used_indices]
@@ -102,7 +110,7 @@
 
         where = where_ids(ids, "master_id")
 
-        for index, view in enumerate(RG_VIEWS):
+        for index, view in enumerate(self.anonymize and RG_VIEWS_ANON or RG_VIEWS):
 
             headers, used_indices = None, None
 
@@ -112,7 +120,7 @@
                 row = cur.fetchone()
                 if not row: break
                 if used_indices is None:
-                    used_indices = [t[0] for t in enumerate(cur.description) if t[1] not in BLACK_LIST]
+                    used_indices = [t[0] for t in enumerate(cur.description) if t[1][0] not in BLACK_LIST]
                     headers      = [cur.description[i][0] for i in used_indices]
 
                 values = [row[i] for i in used_indices]
@@ -150,7 +158,7 @@
             hs = rg.headerFields() 
             for j in range(self.maxRGs[i]):
                 if j > 0:
-                    headers.extend([ "%s_%d" % (x, j) for x in hs])
+                    headers.extend([ "%s$%d" % (x, j) for x in hs])
                 else:
                     headers.extend(hs)
         print >> out, "#%s" % SEP.join(headers)
@@ -176,10 +184,10 @@
             print >> out, "%s" % SEP.join(map(lambda x: u"%s" % strReplace(x), line))
 
 
-def exportAsCSV(cur, out, ids=None):
+def exportAsCSV(cur, out, ids=None, anonymize=False):
     #from datetime import datetime
     #start = datetime.now()
-    cases = Cases()
+    cases = Cases(anonymize)
     if ids is None:
         cur.execute(FETCH_ALL_IDS)
         ids = []
@@ -187,7 +195,6 @@
             row = cur.fetchone()
             if row is None: break
             ids.append(int(row[0]))
-    cases = Cases()
     cases.fetchCases(cur, ids)
     cases.maxRepeatGroups()
     cases.generateHeader(out)

Modified: trunk/waskaweb/lib/evaluation.py
===================================================================
--- trunk/waskaweb/lib/evaluation.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/evaluation.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -2,37 +2,81 @@
 import psycopg2
 import codecs
 import waskaweb.lib.helpers as h
-from waskaweb.lib.base import _
+from waskaweb.lib.base import _, c, session
 import sys
 import traceback
+from datetime import datetime
 
 import cStringIO as StringIO
 
+from waskaweb.model.agency import AgencyBundle 
 from waskaweb.lib.db import db
+from waskaweb.lib.search import AgencySearch
+from waskaweb.lib.sql_helper import where_ids
+from waskaweb.controllers.case_overview import parseSearchOptions
 
 class Evaluation:
-    def __init__(self):
+    def __init__(self, compressed_ids=None):
         self.total = 0;
         self.total_cm = 0;
+        self.compressed_ids = compressed_ids # addition where statement
+                                             # to define a subset of cases
         conn, c1 = None, None
         try:
             try:
                 conn = db.getConnection()
                 c1 = conn.cursor()
-                c1.execute("""SELECT getTotalCM()""")
+                c1.execute("""SELECT count(id) from master_tbl_eval_incm_view m WHERE %s""" % self.where_clause(self.compressed_ids))
                 self.total_cm = c1.fetchone()[0]
                 # Num of cases which are finished (aborted or regular ending)
-                c1.execute("""SELECT count(id) from master_tbl_eval_incm_view where art_beendigung <> -1""")
+                c1.execute("""SELECT count(id) from master_tbl_eval_incm_view m where art_beendigung <> -1 AND %s""" % self.where_clause(self.compressed_ids))
                 self.total_cmfinished = c1.fetchone()[0]
                 c1.close(); c1 = None
                 c1 = conn.cursor()
-                c1.execute("""SELECT getTotal()""")
+                c1.execute("""SELECT count(id) from master_tbl_eval_total_view m WHERE %s""" % self.where_clause(self.compressed_ids))
                 self.total = c1.fetchone()[0]
             finally:
                 db.recycleConnection(conn, c1)
         except:
             print >> sys.stderr, "Error! Could not get connection in evaluation"
 
+    def where_clause(self, ids, field="id"):
+        if c.isEvaluationServer:
+            return self._build_eval_where_clause(ids)
+        else:
+            return where_ids(ids, field)
+
+    def _build_eval_where_clause(self, fkz):
+        fkz = "fkz IN (%s)" % (", ".join("'%s'" % a.fkz for a in session.get('agencybundle', AgencyBundle()).getAgencys()))
+        dummy_search = AgencySearch()
+        form_defaults = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or {}
+        search_options = parseSearchOptions(form_defaults)
+        search_str = ";".join(search_options)
+        search, options, states = dummy_search._parse_search_str(search_str)
+
+        gender = options.get('gender') and "m.geschlecht = %s" % options.get('gender') or "TRUE"
+        #cm-state
+        cm = 'TRUE' #default
+        cm_state = options.get('cm', "all")
+        if cm_state == 'before':
+            cm = 'm.id not in (SELECT id from master_tbl_eval_incm_view)'
+        if cm_state == 'active':
+            cm = 'm.id in (SELECT id from master_tbl_eval_incm_view WHERE art_beendigung = -1)'
+        if cm_state == 'finished':
+            cm = 'm.id in (SELECT id from master_tbl_eval_incm_view WHERE art_beendigung <> -1)'
+
+        time_interval = "TRUE"
+        interval_start_field = options.get('interval_start_field', "erstgespraech")
+        interval_end_field = options.get('interval_end_field', "beendigung_5")
+        interval_start_date = options.get('interval_start_date',"1970-01-01")
+        d = datetime.today()
+        interval_end_date = options.get('interval_end_date', d.strftime('%Y-%m-%d'))
+        fields = {'start_field': interval_start_field, 'start_date': interval_start_date, 'end_field': interval_end_field, 'end_date': interval_end_date} 
+        time_interval = "(coalesce(%(start_field)s, '1970-01-01'::date) <= '%(end_date)s'::date AND coalesce(%(start_field)s, '1970-01-01'::date) <= coalesce(%(end_field)s, now()) AND coalesce(%(end_field)s, now()) >= '%(start_date)s'::date)" % fields
+
+        where = "AND ".join([fkz, '%s ' % gender, '%s ' % cm, '%s ' % time_interval])
+        return where
+
     def perform(self):
         '''overwrite this to do the calculation'''
         pass
@@ -56,32 +100,36 @@
         '''overwrite this to do the CVS export'''
         pass
 
+
 class Evaluation_1(Evaluation):
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
         self.percent = 0 
 
     def perform(self):
         try:
             if self.total == 0: divisor = 1
             else: divisor = self.total
-            self.percent = "%s" % h.formatNumber(
+            self.cm_percent = "%s" % h.formatNumber(
                 float(self.total_cm)/float(divisor)*100)
+            self.ber_percent = "%s" % h.formatNumber(
+                float(self.total-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) 
+        return (self.total, (self.total-self.total_cm), self.ber_percent, self.total_cm, self.cm_percent) 
 
     def doExport(self, f):
         self.perform()
         f.write(u"#%s (Auswertung: alle Jugendliche)\r\n" % _('cm_eval_summary_header_1'))
         f.write(u"Jugendliche;Anzahl;Prozent\r\n")
-        f.write(u"Erstgespräche;%s;100%%\r\n" % (self.total))
-        f.write(u"Davon in das CM übernommen;%s;%s%%\r\n" %(self.total_cm, self.percent))
+        f.write(u"Gesamt Jugendliche;%s;100%%\r\n" % (self.total))
+        f.write(u"Davon Beratungskunden;%s;%s%%\r\n" % (self.total-self.total_cm, self.ber_percent))
+        f.write(u"Davon in das CM übernommen;%s;%s%%\r\n" %(self.total_cm, self.cm_percent))
 
 class Evaluation_2(Evaluation):
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         self.m = [0,0]
@@ -95,8 +143,9 @@
                 conn = db.getConnection()
                 cur = conn.cursor()
                 sql = """SELECT count(geschlecht), coalesce(geschlecht, -1)
-                    FROM master_tbl_eval_incm_view
-                    GROUP BY geschlecht"""
+                    FROM master_tbl_eval_incm_view m
+                    WHERE %s
+                    GROUP BY geschlecht""" % self.where_clause(self.compressed_ids)
                 cur.execute(sql)
                 result = cur.fetchall()
                 for g in result:
@@ -137,8 +186,8 @@
 
 class Evaluation_3(Evaluation):
     """Migrationshintergrund"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         try:
@@ -147,7 +196,7 @@
                 conn = db.getConnection()
                 c1 = conn.cursor()
                 r = [[0,0],[0,0],[0,0]]
-                sql = """select coalesce(muttersprache, -1) from master_tbl_eval_incm_view""" 
+                sql = """select coalesce(muttersprache, -1) from master_tbl_eval_incm_view m WHERE %s""" % self.where_clause(self.compressed_ids)
                 c1.execute(sql)
                 for case in c1.fetchall():
                     muttersprache = case[0]
@@ -180,17 +229,18 @@
 
 class Evaluation_4(Evaluation):
     """ Zugang der der Jugendichen zu KA"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         result = {}
-        sql = """select t.id, count(v.zugang_kompetenzagentur), t.value 
-                    from master_tbl_eval_total_view v 
+        sql = """select t.id, count(m.zugang_kompetenzagentur), t.value 
+                    from master_tbl_eval_total_view m 
                     right join zugang_kompetenzagentur_tbl t 
-                    on v.zugang_kompetenzagentur = t.id 
+                    on m.zugang_kompetenzagentur = t.id 
+                    WHERE %s 
                     group by t.id, t.value having t.id is not null 
-                    order by t.id asc"""
+                    order by t.id asc""" % self.where_clause(self.compressed_ids, "m.id")
         try:
             conn, c1 = None, None
             try:
@@ -228,16 +278,17 @@
 
 class Evaluation_5(Evaluation):
     """Rechtskreis der Jugendlichen beim Zugang zur KA"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         result = {}
         sql = """select r.id, count(m.rechtlicher_kontext), r.value from master_tbl_eval_total_view m 
                     right join rechtlicher_kontext_tbl r 
                     on m.rechtlicher_kontext = r.id
+                    WHERE %s
                     group by r.id, r.value having r.id is not null
-                    order by r.id asc"""
+                    order by r.id asc""" % self.where_clause(self.compressed_ids, 'm.id')
         try:
             conn, c1 = None, None
             try:
@@ -272,8 +323,8 @@
 
 class Evaluation_6(Evaluation):
     """Vermittlung"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         result = {}
@@ -281,8 +332,9 @@
                  join vermittlung_tbl v
                  on v.id = m.vermittlung 
                  where art_beendigung <> -1
+                 AND %s
                  group by v.id, v.value
-                 order by v.id asc"""
+                 order by v.id asc""" % self.where_clause(self.compressed_ids, 'm.id')
         try:
             conn, c1 = None, None
             try:
@@ -322,17 +374,18 @@
 
 class Evaluation_7(Evaluation):
     """Rechtskreis nach Vermittlung"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         result = {}
-        sql ="""select r.id, count(m.veraenderungen_rechtskreis), r.value from master_tbl_eval_total_view m 
+        sql ="""select r.id, count(m.veraenderungen_rechtskreis), r.value from master_tbl_eval_incm_view m 
                     right join veraenderungen_rechtskreis_tbl r 
                     on m.veraenderungen_rechtskreis = r.id
                     where art_beendigung <> -1
+                    AND %s
                     group by r.id, r.value having r.id is not null
-                    order by r.id asc"""
+                    order by r.id asc""" % self.where_clause(self.compressed_ids, 'm.id')
         try:
             conn, c1 = None, None
             try:
@@ -367,8 +420,8 @@
 
 class Evaluation_8(Evaluation):
     """Altersvreteilung"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         result = [["<14",0,0], 
@@ -386,7 +439,7 @@
                 c1 = conn.cursor()
                 c1.execute(
                     """select date_part('year', age(geburtsdatum::timestamp)) 
-                       from master_tbl_eval_incm_view""")
+                       from master_tbl_eval_incm_view m WHERE %s""" % self.where_clause(self.compressed_ids))
                 if self.total == 0: divisor = 1
                 else: divisor = self.total_cm
                 for r in c1.fetchall():
@@ -438,8 +491,8 @@
 
 class Evaluation_9(Evaluation):
     """Verteilung Foerderangebote"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
         result = [[u"berufliche Qualifizierung",0,0],
@@ -453,29 +506,31 @@
             try:
                 conn = db.getConnection()
                 c1 = conn.cursor()
-                c1.execute("""select count(id) from master_tbl_eval_incm_view WHERE bereich_berufliche_qualifizierung = 1""")
+                c1.execute("""select count(id) from master_tbl_eval_incm_view m WHERE bereich_berufliche_qualifizierung = 1 AND %s""" % self.where_clause(self.compressed_ids))
                 result[0][1] = c1.fetchone()[0]
                 c1.close(); c1 = None
                 c1 = conn.cursor()
-                c1.execute("""select count(id) from master_tbl_eval_incm_view WHERE bereich_berufsvorbereitung = 1""")
+                c1.execute("""select count(id) from master_tbl_eval_incm_view m WHERE bereich_berufsvorbereitung = 1 AND %s""" % self.where_clause(self.compressed_ids))
                 result[1][1] = c1.fetchone()[0]
                 c1.close(); c1 = None
                 c1 = conn.cursor()
-                c1.execute("""select count(id) from master_tbl_eval_incm_view WHERE bildender_bereich = 1""")
+                c1.execute("""select count(id) from master_tbl_eval_incm_view m WHERE bildender_bereich = 1 AND %s""" % self.where_clause(self.compressed_ids))
                 result[2][1] = c1.fetchone()[0]
                 c1.close(); c1 = None
                 c1 = conn.cursor()
-                c1.execute("""select count(id) from master_tbl_eval_incm_view WHERE bereich_lebensbewaeltigung = 1""")
+                c1.execute("""select count(id) from master_tbl_eval_incm_view m WHERE bereich_lebensbewaeltigung = 1 AND %s""" % self.where_clause(self.compressed_ids))
                 result[3][1] = c1.fetchone()[0]
                 c1.close(); c1 = None
                 c1 = conn.cursor()
-                c1.execute("""select count(id) from master_tbl_eval_incm_view WHERE sonstiger_foerderbedarf = 1""")
+                c1.execute("""select count(id) from master_tbl_eval_incm_view m WHERE sonstiger_foerderbedarf = 1 AND %s""" % self.where_clause(self.compressed_ids))
                 result[4][1] = c1.fetchone()[0]
                 c1.close(); c1 = None
                 total = 0
                 # Gesamtanzahl der Maßnahmen berechnen
-                for r in result: total += r[1]
-                if total == 0: total = 1
+                if self.total_cm == 0: divisor = 1
+                else: divisor = self.total_cm
+                total = divisor
+                #for r in result: total += r[1]
                 result[0][2] = "%s" % h.formatNumber(
                     float(result[0][1])/float(total)*100)
                 result[1][2] = "%s" % h.formatNumber(
@@ -501,64 +556,207 @@
 
 class Evaluation_10(Evaluation):
     """Verweildauer im CM"""
-    def __init__(self):
-        Evaluation.__init__(self)
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
 
     def perform(self):
-        sql = """select count(id), art_beendigung, zeitraum_fallmanagement 
-                 from master_tbl_eval_incm_view 
-                 where art_beendigung <> -1 
-                 group by zeitraum_fallmanagement, art_beendigung
-                 order by zeitraum_fallmanagement"""
-        result = []
-        # [monat, abgeschl_num, abschloss_proz, abbruch_num, abbruch_proz]
-        curr_month = -1
-        row = [curr_month,0,0,0,0]
+        sql = """
+        SELECT
+            zeitraum_fallmanagement,
+            count(a.id) as abbruch,
+            count(r.id) as regulaer,
+            count(k.id) as keine
+            FROM master_tbl_eval_incm_view m 
+            LEFT JOIN beendigung_1_tbl a on a.id = m.art_beendigung AND a.id = 1
+            LEFT JOIN beendigung_1_tbl r on r.id = m.art_beendigung AND r.id = 0
+            LEFT JOIN beendigung_1_tbl k on k.id = m.art_beendigung AND k.id = -1 
+            WHERE %s
+            GROUP BY zeitraum_fallmanagement
+            ORDER BY zeitraum_fallmanagement
+        """  % self.where_clause(self.compressed_ids, 'm.id') 
+        if self.total_cm == 0: divisor = 1
+        else: divisor = self.total_cm
         try:
-            conn, c1 = None, None
+            conn, c1, query_result = None, None, None
             try:
                 conn = db.getConnection()
                 c1 = conn.cursor()
                 c1.execute(sql)
-                if self.total_cm == 0: divisor = 1
-                else: divisor = self.total_cm
-                for r in c1.fetchall():
-                    if r[2] != curr_month:
-                        # Ok month changed, we will fill another row
-                        curr_month = r[2]
-                        # Only save the row to the result if we have any data 
-                        if row[1] != 0 or row[3] != 0:
-                            result.append(row)
-                        # Create new row
-
-                        row = [curr_month or "Keine Angabe",0,0,0,0]
-
-                    # Calculate values...
-                    num = r[0]
-                    proz = "%s" % h.formatNumber(float(r[0])/float(divisor)*100)
-
-                    # And put them into the row depending of how the cm was finished
-                    if r[1] == 1 : # Abbruch
-                        row[3] = num
-                        row[4] = proz 
-                    else: 
-                        row[1] = num
-                        row[2] = proz 
+                query_result = c1.fetchall()
             finally:
                 db.recycleConnection(conn, c1)
         except:
             traceback.print_exc(file=sys.stderr)
 
-        if row[1] != 0 or row[3] != 0:
-            result.append(row)
+        # query_result: [monat, anz_abr, anz_reg, anz_ka]
+        result = []
+        # row:  [monat, abgeschl_num, abschloss_proz, abbruch_num, abbruch_proz, ka_num, ka_proz]
+        for r in query_result:
+            row = ['Keine Angabe',0,0,0,0,0,0]
+            # Monat
+            if r[0]:
+                row[0] = r[0]
+            # Regulaer 
+            row[1] = r[2]
+            row[2] = "%s" % h.formatNumber(float(r[2])/float(divisor)*100)
+            # Abbruch
+            row[3] = r[1]
+            row[4] = "%s" % h.formatNumber(float(r[1])/float(divisor)*100)
+            # KA
+            #row[5] = r[3]
+            #row[6] = "%s" % h.formatNumber(float(r[3])/float(divisor)*100)
+            if r[2]  > 0 or r[1] > 0:
+                result.append(row)
         return result
 
+
     def doExport(self, f):
         p = self.perform()
 
-        f.write(u"#%s (Auswertung: Jugendliche im CM)\r\n" % _('cm_eval_summary_header_3'))
+        f.write(u"#%s (Auswertung: Jugendliche im CM)\r\n" % _('cm_eval_length_cm'))
         f.write("Monat;Anzahl Abgeschlossen;Prozent Abgeschlossen, Anzahl Abgebrochen, Prozent Abgebrochen\r\n")
         for v in p:
             f.write(u"%s;%s;%s%%;%s;%s%%\r\n" % (v[0], v[1], v[2], v[3], v[4]))
 
+class Evaluation_13(Evaluation):
+    """Durchschnitt Verweildauer im CM"""
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
+
+
+    def perform(self):
+        eval_10 = Evaluation_10(self.compressed_ids).perform()
+        #r:  [monat, abgeschl_num, abschloss_proz, abbruch_num, abbruch_proz, ka_num, ka_proz]
+
+        months_abr = 0
+        anz_abr = 0 
+        months_abg = 0
+        anz_abg = 0 
+        avg_month_abr = "-/-"
+        avg_month_abg = "-/-"
+
+        for r in eval_10:
+            try:
+                months_abr += int(r[0]) * int(r[3])
+                anz_abr += int(r[3])
+                months_abg +=  int(r[0]) * int(r[1])
+                anz_abg += int(r[1])
+            except:
+                pass
+            if anz_abr > 0:
+                avg_month_abr = "%s" % h.formatNumber(float(months_abr) / float(anz_abr))
+            if anz_abg > 0:
+                avg_month_abg = "%s" % h.formatNumber(float(months_abg) / float(anz_abg))
+
+        result = [avg_month_abg, avg_month_abr]
+        return result
+
+    def doExport(self, f):
+        p = self.perform()
+
+        f.write(u"#%s (Auswertung: Jugendliche im CM)\r\n" % _('cm_eval_avg_length_cm'))
+        f.write("Durchschnitt Monat Abgeschlossen;Durchschnitt Monat Abgebrochen\r\n")
+        for v in [p]:
+            f.write(u"%s;%s;\r\n" % (v[0], v[1]))
+
+class Evaluation_11(Evaluation):
+    """Schulabschluss beim Zugang"""
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
+
+    def perform(self):
+        result = {}
+        sql = """select t.id, count(m.schulabschluss_1), t.value 
+                    from master_tbl_eval_total_view m 
+                    right join schulabschluss_1_tbl t 
+                    on m.schulabschluss_1 = t.id 
+                    WHERE %s 
+                    group by t.id, t.value having t.id is not null 
+                    order by t.id asc""" % self.where_clause(self.compressed_ids, "m.id")
+        try:
+            conn, c1 = None, None
+            try:
+                conn = db.getConnection()
+                c1 = conn.cursor()
+                c1.execute(sql)
+
+                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)
+            finally:
+                db.recycleConnection(conn, c1)
+        except:
+            print c1.query
+            print >> sys.stderr, "No results for eval 11"
+        return result 
+
+    def doExport(self, f):
+        p = self.perform()
+        f.write(u"#%s (Auswertung: alle Jugendliche)\r\n" % _('cm_eval_header_graduation'))
+        f.write(u"Schulabschluss;Anzahl;Prozent\r\n")
+        for v in p.itervalues():
+            f.write("%s;%s;%s%%\r\n" % (v[0], v[1], v[2]))
+
+class Evaluation_12(Evaluation):
+    """Arbeitsituation beim Zugang"""
+    def __init__(self, compressed_ids):
+        Evaluation.__init__(self, compressed_ids)
+
+    def perform(self):
+        result = {}
+        sql = """select t.id, count(m.schulabschluss_1), t.value 
+                    from master_tbl_eval_total_view m 
+                    right join bei_eintritt_ist_der_jugendliche_tbl t
+                    on m.bei_eintritt_ist_der_jugendliche = t.id 
+                    WHERE %s 
+                    group by t.id, t.value having t.id is not null 
+                    order by t.id asc""" % self.where_clause(self.compressed_ids, "m.id")
+        try:
+            conn, c1 = None, None
+            try:
+                conn = db.getConnection()
+                c1 = conn.cursor()
+                c1.execute(sql)
+
+                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)
+            finally:
+                db.recycleConnection(conn, c1)
+        except:
+            print c1.query
+            print >> sys.stderr, "No results for eval 11"
+        return result 
+
+    def doExport(self, f):
+        p = self.perform()
+        f.write(u"#%s (Auswertung: alle Jugendliche)\r\n" % _('cm_eval_header_work'))
+        f.write(u"Status;Anzahl;Prozent\r\n")
+        for v in p.itervalues():
+            f.write("%s;%s;%s%%\r\n" % (v[0], v[1], v[2]))
+
 # vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Modified: trunk/waskaweb/lib/excel.py
===================================================================
--- trunk/waskaweb/lib/excel.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/excel.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -9,9 +9,8 @@
 
 from pyExcelerator import Workbook
 
-SELECT_MASTER_TBL = \
-"""SELECT * FROM master_tbl_view
-   WHERE id = %(id)s"""
+SELECT_MASTER = \
+"""SELECT * FROM %s WHERE id = %%(id)s"""
 
 FETCH_ALL_IDS = \
 """SELECT id FROM master_tbl_view"""
@@ -23,6 +22,13 @@
     ("Angebote BB",         "rg_angebote_bildenden_bereich_tbl_view"),
     ("Angebote LB",         "rg_angebote_lebensbewaeltigung_tbl_view"))
 
+RG_VIEWS_ANON = (
+    ("Kompetenzfestellung", "rg_kompetenzfestellung_tbl_anonym_view"),
+    ("Angebote BQ",         "rg_angebote_berufliche_qualifizierung_tbl_anonym_view"),
+    ("Angebote BV",         "rg_angebote_berufsvorbereitung_tbl_anonym_view"),
+    ("Angebote BB",         "rg_angebote_bildenden_bereich_tbl_anonym_view"),
+    ("Angebote LB",         "rg_angebote_lebensbewaeltigung_tbl_anonym_view"))
+
 SELECT_RG = \
 """SELECT * FROM %s WHERE master_id = %d"""
 
@@ -79,7 +85,7 @@
 
         j = 0
         for i in xrange(repeats):
-            suffix = i != 0 and ("_%d" % i) or ""
+            suffix = i != 0 and ("$%d" % i) or ""
             for name in self.column_names:
                 worksheet.write(0, j, "%s%s" % (name, suffix))
                 j += 1
@@ -101,19 +107,20 @@
         Sheet.__init__(self, worksheet, relation)
 
     def fetch_data(self, mid, cur):
-        cur.execute(SELECT_MASTER_TBL, { 'id': mid })
+        cur.execute(SELECT_MASTER % self.relation, { 'id': mid })
         row = cur.fetchone()
         if not row: return
         self.add_row(row)
 
 class Book:
 
-    def __init__(self):
-        self.workbook = Workbook()
+    def __init__(self, anonymize=False):
+        self.workbook  = Workbook()
 
-        sheets = [Master(self.workbook.add_sheet("Hauptdatensatz"), "master_tbl_view")]
+        sheets = [Master(self.workbook.add_sheet("Hauptdatensatz"), 
+            anonymize and 'master_tbl_anonym_view' or 'master_tbl_view')]
 
-        for rg in RG_VIEWS:
+        for rg in anonymize and RG_VIEWS or RG_VIEWS_ANON:
             sheets.append(Sheet(self.workbook.add_sheet(rg[0]), rg[1]))
 
         self.sheets = sheets
@@ -131,7 +138,7 @@
     def write_xls(self, fname):
         self.workbook.save(fname)
 
-def exportAsXLS(cur, fname, ids=None):
+def exportAsXLS(cur, fname, ids=None, anonymize=False):
     if ids is None:
         ids = []
         cur.execute(FETCH_ALL_IDS)
@@ -139,7 +146,7 @@
             row = cur.fetchone()
             if not row: break
             ids.append(int(row[0]))
-    book = Book()
+    book = Book(anonymize)
     book.add_cases(ids, cur)
     book.generate_headers()
     book.write_xls(fname)

Modified: trunk/waskaweb/lib/helpers.py
===================================================================
--- trunk/waskaweb/lib/helpers.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/helpers.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -6,11 +6,15 @@
 #from waskaweb.lib.base import *
 import locale
 import sys
+import re
 from pylons import c, cache, config, g, request, response, session
 from webhelpers import *
 
 import datetime
 
+VALID_DATE = re.compile(r'^[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$')
+VALID_TIME = re.compile(r'^([0-9]{1,2}):([0-9]{2})')
+
 def hasRole(rolelist):
     try:
         user = session['USER_AUTHORIZED']
@@ -85,14 +89,61 @@
         d = datetime.datetime(d.year, d.month, d.day)
     return "%02d.%02d.%d %02d:%02d" % (d.day, d.month, d.year, d.hour, d.minute)
 
+def status_message(s):
+    return "%s: %s" % (dd_mm_yyyy_HH_MM(datetime.datetime.now()), s)
+
+def timedelta_in_minutes(ti):
+    if ti is None: return None
+    days = float(ti.days * (24*60))
+    secs = ti.seconds / 60.0
+    return round(days + secs)
+
+def human_timedelta(td):
+    if td is None: return None
+    out = []
+    if -td == abs(td):
+        out.append("-")
+        td = -td
+    days = td.days
+    if days == 1:
+        out.append("1 Tag,")
+    if days > 1:
+        out.append("%d Tage," % days)
+
+    secs  = td.seconds
+    hours = secs / 3600
+    secs -= hours * 3600
+    mins  = secs / 60
+    secs -= mins * 60
+
+    out.append("%d:%02d:%02d" % (hours, mins, secs))
+
+    return " ".join(out)
+
+def checkDate(value):
+    if not VALID_DATE.match(value): return None
+    token = value.split('.')
+    return datetime.datetime(int(token[2]), int(token[1]), int(token[0]))
+
+def checkTime(value):
+    m = VALID_TIME.match(value)
+    if not m: return None
+    return datetime.timedelta(hours = int(m.group(1)), minutes = int(m.group(2)))
+
 def getFormularHeaders(page_id):
     navigation = session.get('navigation.tree')
     try:
         headers = navigation.getHeaders(page_id)
-    except:
+    except StandardError, err:
+        print err
         return "" 
     return headers
 
+def getHelp(help_id):
+    from waskaweb.lib.renderer import FormData
+    formdata = FormData(g.helpData)
+    return formdata.getHelp(help_id)
+
 def getFormularName(page_id):
     navigation = session.get('navigation.tree')
     try:

Modified: trunk/waskaweb/lib/pdfimporter.py
===================================================================
--- trunk/waskaweb/lib/pdfimporter.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/pdfimporter.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -839,16 +839,15 @@
         stdContext = StandardContext("")
         xfaTraverser.traverse(xfaTree, stdContext)
 
-        self.addMessage("\nKonversionsfehler:");
+        #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.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:
-            try:
-                print >> sys.stderr, "Missing fields: %s" % self.missingFieldsAsString()
-            except:
-                traceback.print_exc(file=sys.stderr)
+        #if self.missingFields:
+        #    try:
+        #        print >> sys.stderr, "Missing fields: %s" % self.missingFieldsAsString()
+        #    except:
+        #        traceback.print_exc(file=sys.stderr)
 
 # vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Modified: trunk/waskaweb/lib/renderer.py
===================================================================
--- trunk/waskaweb/lib/renderer.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/renderer.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -24,7 +24,7 @@
 <img src="/images/icons/form_help.png" border="0"
 alt="Hilfesymbol"></a></span>'''
 
-WEIGHTS = (25, 50, 75)
+WEIGHTS = (15, 25, 30, 40, 45, 50, 55, 60, 75)
 
 SET_MODIFICATION = ' onchange="setModification();" '
 
@@ -232,6 +232,7 @@
                 <th class="table_header_h table_date">Von</th>
                 <th class="table_header_h table_date">Bis</th>
                 <th class="table_header_h">%s</th>
+                <th class="table_header_h">Art der Unterstützung</th>
                 <th class="table_header_h table_width_small">%s</th>
                 <th class="table_header_h table_action">%s</th>
             </tr>""" % (s_inst, s_type, s_act))
@@ -240,16 +241,16 @@
             for aid in self.aidList.getDatasets():
                 class_str = ""
                 if idset:
-                    out.append(u"""<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td>""" %
-                        (F.NA(aid.start_date), F.NA(aid.end_date), F.NA(aid.institution), F.NA(aid.type)))
+                    out.append(u"""<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td>""" %
+                        (F.NA(aid.start_date), F.NA(aid.end_date), F.NA(aid.institution), F.NA(aid.type), F.NA(aid.category)))
                 else:
-                    out.append(u"""<tr class="table_row_v"><td>%s</td><td>%s</td><td>%s</td><td>%s</td>""" %
-                        (F.NA(aid.start_date), F.NA(aid.end_date), F.NA(aid.institution), F.NA(aid.type)))
+                    out.append(u"""<tr class="table_row_v"><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td>""" %
+                        (F.NA(aid.start_date), F.NA(aid.end_date), F.NA(aid.institution), F.NA(aid.type), F.NA(aid.category)))
                 idset = not idset
                 out.append(u"""<td class="table_action"><a href="/rg_aid/%s/%s/%s">%s</a>""" %
                         (action,aid.id, aid.page_id, s_show))
                 if not self.ro_mode and h.hasRole(['cm_ka']):
-                    out.append(u"""<a href="/rg_aid/delete/%s/%s/0">%s</a>""" % (aid.id, aid.type_id, s_delete))
+                    out.append(u"""<a href="/rg_aid/delete/%s/%s/0">%s</a>""" % (aid.id, aid.category_id, s_delete))
                 out.append("""</td></tr>""")
 
                 if self.aidList.numDatasets() <= 0:
@@ -595,7 +596,10 @@
         else:
             #disabled = "disabled"
             #css_class.append('readonly')
-            out.append('<p class="readonly">%s</p>' % F.NA(value.replace('\n', '<br>')))
+            value = value.replace('\r\n', '<br>')
+            value = value.replace('\n', '<br>')
+            value = value.replace('\r', '<br>')
+            out.append('<p class="readonly">%s</p>' % F.NA(value))
 
         self.toTarget(Item("".join(out)), text.getTarget())
 

Added: trunk/waskaweb/lib/search.py
===================================================================
--- trunk/waskaweb/lib/search.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/search.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,207 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Torsten Irländer <torsten.irlaender at intevation.de>
+#
+
+import sys
+import re
+from datetime import datetime
+from waskaweb.lib.db import db
+import psycopg2.extras
+from waskaweb.lib.base import session, g, h, config 
+
+SAVE_SEARCH = re.compile(r'[^\w:;\-\. ]', re.UNICODE)
+
+VALID_OPTIONS = ['editor', 'own', 'standin', 'state', 'sort_field', 'sort_order', 'interval_start_date', 'interval_end_date', 'interval_start_field', 'interval_end_field', 'gender', 'cm', 'branch', 'fkz']
+
+SEARCH_CASE_SQL = \
+""" SELECT
+      m.id,
+      m.name_1,
+      m.vorname_1,
+      m.kundennummer,
+      m.bearbeiter_id,
+      st.status,
+      st.zugriff,
+      st.id as s_id,
+      m.zeitraum_nachbetreuung,
+      m.art_beendigung,
+      m.einverstaendniserklaerung
+    FROM master_tbl_view m
+    JOIN ka_status_tbl_view st ON
+    m.id = st.master_id
+    JOIN ka_benutzer_tbl b ON
+    m.bearbeiter_id = b.id
+    WHERE
+      ((m.vorname_1 ~* %%(needle)s
+      OR m.name_1 ~* %%(needle)s
+      OR m.kundennummer ~* %%(needle)s)
+      OR ( m.vorname_1 IS NULL
+      AND m.name_1 IS NULL
+      AND m.kundennummer IS NULL
+      ))
+      AND st.status IN (%s)
+      AND %s
+      AND %s
+      AND %s
+      AND %s
+      AND %s
+      AND %s
+      AND %s
+      AND %s
+    ORDER BY %s %s"""
+
+SEARCH_AGENCY_SQL = \
+"""select count(m.id) as anzahl,
+m.fkz,
+date_trunc('minute', max(s.zugriff)) as zugriff
+from master_tbl_view m 
+join ka_status_tbl_view s 
+on m.id = s.master_id
+WHERE %s
+AND %s
+AND %s
+group by fkz
+ORDER BY %s %s"""
+
+class Search:
+    def __init__(self):
+        pass
+
+    def _parse_search_str(self, s):
+        # TODO This is a very very simple approach. We should defentiley
+        # implement some searchengine here
+        search = []
+        allowed_states = [-1]
+        options = {}
+
+        if s:
+            s = SAVE_SEARCH.sub(u'', s)
+            option_list = [o.strip() for o in s.split(';')]
+            for option in option_list:
+                if option.find(":") > 0:
+                    try:
+                        key, value = [x.strip() for x in option.split(":")]
+                        if key in VALID_OPTIONS:
+                            if key == 'state':
+                                allowed_states.append(int(value))
+                            else:
+                                options[key] = value
+                    except ValueError:
+                        print >> sys.stderr, "Found invalid search syntax in options"
+                else:
+                    search.append(option)
+        return search, options, allowed_states
+
+    def _build_sql(self, search, options, allowed_states):
+        pass
+
+    def queryDB(self, sql, fields):
+        '''Does the search on the DB and returns the result of the search'''
+        rows = []
+        con, cur = None, None
+        try:
+            try:
+                con = db.getConnection()
+                cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
+                cur.execute(sql, fields)
+                rows = cur.fetchall()
+            except:
+                return {}
+        finally:
+            db.recycleConnection(con, cur)
+        return rows 
+
+    def perform(self, search_str):
+        '''Returns the result set of a search based on the search string'''
+        search, options, states = self._parse_search_str(search_str)
+        sql, fields = self._build_sql(search, options, states)
+        result = self.queryDB(sql, fields)
+        return result
+
+class AgencySearch(Search):
+    def __init__(self):
+        Search.__init__(self)
+
+    def _build_sql(self, search, options, allowed_states):
+        fields = {'needle': ""}
+        gender = options.get('gender') and "m.geschlecht = %s" % options.get('gender') or "TRUE"
+        #cm-state
+        cm = 'TRUE' #default
+        cm_state = options.get('cm', "all")
+        if cm_state == 'before':
+            cm = 'm.id not in (SELECT id from master_tbl_eval_incm_view)'
+        if cm_state == 'active':
+            cm = 'm.id in (SELECT id from master_tbl_eval_incm_view WHERE art_beendigung = -1)'
+        if cm_state == 'finished':
+            cm = 'm.id in (SELECT id from master_tbl_eval_incm_view WHERE art_beendigung <> -1)'
+
+        time_interval = "TRUE"
+        interval_start_field = options.get('interval_start_field', "erstgespraech")
+        interval_end_field = options.get('interval_end_field', "beendigung_5")
+        interval_start_date = options.get('interval_start_date',"1970-01-01")
+        d = datetime.today()
+        interval_end_date = options.get('interval_end_date', d.strftime('%Y-%m-%d'))
+        fields = {'start_field': interval_start_field, 'start_date': interval_start_date, 'end_field': interval_end_field, 'end_date': interval_end_date} 
+        time_interval = "(coalesce(%(start_field)s, '1970-01-01'::date) <= '%(end_date)s'::date AND coalesce(%(start_field)s, '1970-01-01'::date) <= coalesce(%(end_field)s, now()) AND coalesce(%(end_field)s, now()) >= '%(start_date)s'::date)" % fields
+
+        sort_field = options.get('sort_field', "name_1")
+        sort_order       = options.get('sort_order', "desc")
+        fields['needle'] = " ".join(search) 
+        SQL = SEARCH_AGENCY_SQL % (gender, time_interval, cm, sort_field, sort_order) 
+        return (SQL, fields)
+
+class CaseSearch(Search):
+    def __init__(self):
+        Search.__init__(self)
+
+    def _build_sql(self, search, options, allowed_states):
+        fields = {'needle': ""}
+        # Show all cases regardless if the privacy statement has been declined
+        #ee =  h.hasRole(['cm_ka']) and "m.einverstaendniserklaerung <> 0" or "TRUE"
+        ee = "TRUE"
+
+        which_user = 0
+        allowed_viewer = "FALSE"
+        if options.has_key('own'): which_user += 2
+        if options.has_key('standin'): which_user += 1
+        if which_user == 1: allowed_viewer = "m.bearbeiter_id <> %s" % options.get('standin')
+        if which_user == 2: allowed_viewer = "m.bearbeiter_id = %s" % options.get('own')
+        if which_user == 3: allowed_viewer = "TRUE"
+        gender = options.get('gender') and "m.geschlecht = %s" % options.get('gender') or "TRUE"
+        allowed_viewer =  h.hasRole(['admin_ka', 'pb_ka']) and "TRUE" or allowed_viewer
+        editor = options.has_key('editor') and "m.bearbeiter_id = %s" % options.get('editor') or "TRUE"
+        sort_field = options.get('sort_field', "name_1")
+        sort_order       = options.get('sort_order', "desc")
+        branch = options.get('branch') and "b.filiale = '%s'" % options.get('branch') or "TRUE"
+        fkz = options.get('fkz') and "m.fkz = '%s'" % options.get('fkz') or "TRUE"
+
+        #Build timeinterval
+        time_interval = "TRUE"
+        interval_start_field = options.get('interval_start_field', "erstgespraech")
+        interval_end_field = options.get('interval_end_field', "beendigung_5")
+        interval_start_date = options.get('interval_start_date',"1970-01-01")
+        d = datetime.today()
+        interval_end_date = options.get('interval_end_date', d.strftime('%Y-%m-%d'))
+        fields = {'start_field': interval_start_field, 'start_date': interval_start_date, 'end_field': interval_end_field, 'end_date': interval_end_date} 
+        time_interval = "(coalesce(%(start_field)s, '1970-01-01'::date) <= '%(end_date)s'::date AND coalesce(%(start_field)s, '1970-01-01'::date) <= coalesce(%(end_field)s, now()) AND coalesce(%(end_field)s, now()) >= '%(start_date)s'::date)" % fields
+
+
+        #cm-state
+        cm = 'TRUE' #default
+        cm_state = options.get('cm', "all")
+        if cm_state == 'before':
+            cm = 'm.id not in (SELECT id from master_tbl_incm_view)'
+        if cm_state == 'active':
+            cm = 'm.id in (SELECT id from master_tbl_incm_view WHERE art_beendigung = -1)'
+        if cm_state == 'finished':
+            cm = 'm.id in (SELECT id from master_tbl_incm_view WHERE art_beendigung <> -1)'
+
+
+        fields['needle'] = " ".join(search) 
+        SQL = SEARCH_CASE_SQL % (",".join([str(x) for x in allowed_states]), ee, allowed_viewer, editor, gender, time_interval, cm, branch, fkz, sort_field, sort_order) 
+        return (SQL, fields)
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Modified: trunk/waskaweb/lib/sql_helper.py
===================================================================
--- trunk/waskaweb/lib/sql_helper.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/sql_helper.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -27,6 +27,8 @@
     return out
 
 def where_ids(compressed, idname="id"):
+    if not compressed:
+        return "FALSE"
     between = "%s BETWEEN %%d AND %%d" % idname
     single  = "%s = %%d" % idname
     return " OR ".join([(type(x) is TupleType and between or single) % x 

Modified: trunk/waskaweb/lib/validators.py
===================================================================
--- trunk/waskaweb/lib/validators.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/validators.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,9 +1,18 @@
 # -*- coding: utf-8 -*-
 from pylons import session
+from waskaweb.lib.db import db
 import re
 import formencode
 import datetime
 
+class ValidatorStateObject:
+
+    def __setattr__(self, key, value):
+        self.__dict__[key] = value
+
+    def __getattr__(self, key):
+        return self.__dict__[key]
+
 class BaseFormValidator(formencode.Schema):
     def __init__(self):
         formencode.api.set_stdtranslation(domain="FormEncode", languages=["de"])
@@ -100,7 +109,8 @@
     messages = {
         'too_long': u'Die Anmeldekennung darf nicht l&auml;nger als %(max)i '
                   u'Zeichen lang sein',
-        'invalid_char': u'Die Anmeldekennung darf nur Kleinbuchstaben, Zahlen oder Unterstriche enthalten'
+        'invalid_char': u'Die Anmeldekennung darf nur Kleinbuchstaben, Zahlen oder Unterstriche enthalten',
+        'login_exists': u'Es existiert bereits ein Nutzer mit der Anmeldekennung "%(login)s".'
         }
 
     def _to_python(self, value, state):
@@ -119,14 +129,61 @@
             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)
+        try:
+            conn, cur = None, None
+            loginname = "_".join(["ka", state.agency, value])
+            fields = {'login': loginname}
+            try:
+                conn = db.getConnection()
+                cur  = conn.cursor()
+                cur.execute("SELECT id FROM ka_benutzer_tbl_view WHERE login = %(login)s", fields)
+                result = cur.fetchone()
+                if result:
+                    raise formencode.Invalid(self.message("login_exists", state, login=value), value, state)
+            finally:
+                db.recycleConnection(conn, cur)
+        except StandardError, err:
+            print "Fehler beim Validieren der Anmeldekennung: %s" % err
 
+
+class UserGroupExistsCheck(formencode.validators.FancyValidator):
+
+    messages = {
+        'group_exists': u'Es existiert bereits eine Benutzergruppe mit dem Namen "%(name)s"!'
+        }
+
+    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):
+        try:
+            conn, cur = None, None
+            fields = {'name': value, 'id': state.groupid}
+            try:
+                conn = db.getConnection()
+                cur  = conn.cursor()
+                cur.execute("SELECT name FROM ka_benutzergruppe_tbl_view WHERE id = %(id)s", fields)
+                result = cur.fetchone()
+                if result[0] != value:
+                    cur.execute("SELECT id FROM ka_benutzergruppe_tbl_view WHERE name = %(name)s", fields)
+                    result = cur.fetchone()
+                    if result:
+                        raise formencode.Invalid(self.message("group_exists", state, name=value), value, state)
+            finally:
+                db.recycleConnection(conn, cur)
+        except StandardError, err:
+            print "Fehler beim Validieren des Gruppennamens: %s" % err
+
 class NewPasswordForm(BaseFormValidator):
     passwd = SecurePassword()  
     passwd2 = formencode.validators.String() 
     chained_validators = [formencode.validators.FieldsMatch('passwd', 'passwd2')]
 
 class NewUserGroupForm(BaseFormValidator):
-    name = formencode.validators.String(not_empty=True) 
+    name = UserGroupExistsCheck(not_empty=True) 
 
 class EditUserGroupForm(NewUserGroupForm):
     standin = formencode.ForEach(formencode.validators.Int(), convert_to_list=True)
@@ -144,6 +201,28 @@
 class EditUserForm(NewUserForm):
     login = None
 
+class CasePartSelectionForm(BaseFormValidator):
+    documents = formencode.validators.Int(if_missing=0)
+    appointments = formencode.validators.Int(if_missing=1)
+    logbook = formencode.validators.Int(if_missing=0)
+    form_section_0 = formencode.validators.Int(if_missing=0)
+    form_section_1 = formencode.validators.Int(if_missing=0)
+    form_section_2 = formencode.validators.Int(if_missing=0)
+    form_section_3 = formencode.validators.Int(if_missing=0)
+    form_section_4 = formencode.validators.Int(if_missing=0)
+    form_section_5 = formencode.validators.Int(if_missing=0)
+    form_section_6 = formencode.validators.Int(if_missing=0)
+    form_section_7 = formencode.validators.Int(if_missing=0)
+    form_section_8 = formencode.validators.Int(if_missing=0)
+    form_section_9 = formencode.validators.Int(if_missing=0)
+    form_section_10 = formencode.validators.Int(if_missing=0)
+    form_section_11 = formencode.validators.Int(if_missing=0)
+    form_section_12 = formencode.validators.Int(if_missing=0)
+    form_section_13 = formencode.validators.Int(if_missing=0)
+    form_section_14 = formencode.validators.Int(if_missing=0)
+    form_section_15 = formencode.validators.Int(if_missing=0)
+    form_section_17 = formencode.validators.Int(if_missing=0)
+
 class NewCaseForm(BaseFormValidator):
     pass
 
@@ -152,6 +231,10 @@
     max_speicherdauer = MaxMinInt(min=7, max=180, not_empty=True)
 
 class SearchCaseForm(BaseFormValidator):
+    gender   = formencode.validators.Int(if_missing=None)
+    cm_state = formencode.validators.Int(if_missing=None)
+
+class SearchAgencyForm(SearchCaseForm):
     pass
 
 class BundleActionForm(BaseFormValidator):
@@ -229,6 +312,19 @@
         except:
             raise formencode.Invalid(self.message("invalid_time", state), value, state)
 
+class StringTooLong(formencode.validators.FancyValidator):
+
+    messages = {
+        'invalid_length': u'Bitte geben Sie einen Text mit maximal 80 Zeichen an.',
+        }
+
+    def _to_python(self, value, state):
+        return value.strip()
+
+    def validate_python(self, value, state):
+        if not value is None and len(value) > 80:
+            raise formencode.Invalid(self.message("invalid_length", state), value, state)
+
 class CreateAppointmentForm(BaseFormValidator):
     start_date = formencode.All(formencode.validators.String(not_empty=True), DateCheck())
     start_time = formencode.All(formencode.validators.String(not_empty=True), TimeCheck())
@@ -236,4 +332,13 @@
     end_time   = TimeCheck()
     title      = formencode.validators.String(not_empty=True)
 
+class CreateLogbookForm(BaseFormValidator):
+    date         = DateCheck(not_empty=True)
+    time         = TimeCheck(not_empty=True)
+    short_notice = StringTooLong()
+
+class EditLogbookForm(CreateLogbookForm):
+    pass
+
+
 # vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8

Modified: trunk/waskaweb/lib/xmlexport.py
===================================================================
--- trunk/waskaweb/lib/xmlexport.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/xmlexport.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -7,54 +7,306 @@
 
 from types import StringTypes
 
+import re
+import sys
+import xml.utils.iso8601 as iso8601
+from   time import mktime
+
+
+from pylons import g
+
+import waskaweb.lib.helpers as h
+
+SECTION_MAP = {
+    'form_section_0' : 'page_0',  # Zuständigkeiten, Eingangsdaten
+    'form_section_1' : 'page_25', # Externe Ansprechpartner
+    'form_section_2' : 'page_1',  # Persönliche Angaben
+    'form_section_3' : 'page_2',  # Familiäre Situation 
+    'form_section_4' : 'page_3',  # Gesundheitliche Situation
+    'form_section_5' : 'page_4',  # Soziale Lage
+    'form_section_6' : 'page_5',  # Schule
+    'form_section_7' : 'page_6',  # Ausbildung und Arbeit
+    'form_section_8' : 'page_7',  # Weiterer Verlauf
+    'form_section_9' : 'rg_kompetenzfestellung', # Kompetenzfeststellung
+    'form_section_10': 'page_10', # Förderplanung
+    'form_section_11': 'rg_unterstuetzungsangebote', # Unterstützungsangebote
+    'form_section_12': 'page_15', # Freie Dokumentation
+    'form_section_13': 'page_16', # Angaben zum Verlauf und Beendigung des CM
+    'form_section_14': 'page_17', # Berufliche Integration
+    'form_section_15': 'page_18', # Soziale Integration
+    'form_section_16': 'page_19', # Einschätzung des Case-Managers, 
+    'form_section_17': 'page_20'  # Freie Dokumentation
+    }
+
 FETCH_ALL_IDS = \
 """SELECT id FROM master_tbl_view"""
 
-SELECT_MASTER_TBL = \
-"""SELECT * FROM master_tbl_view WHERE id = %(id)s"""
+LOAD_LOGBOOK = """
+SELECT l.uuid_id AS uuid_id, datum, b.login AS login, art, kurz_notiz, notiz, dauer
+FROM ka_logbuch_tbl_view l LEFT JOIN ka_benutzer_tbl_view b
+ON l.bearbeiter = b.id
+WHERE l.master_id = %(id)s
+ORDER BY datum
+"""
 
-RG_VIEWS = (
-    "kompetenzfestellung",
+LOAD_DOCUMENTS = """
+SELECT uuid_id, groesse, mime, name, encode(daten, 'base64') AS daten
+FROM ka_fall_dokumente_tbl_view
+WHERE master_id = %(id)s
+"""
+
+RG_UNTERSTUETZUNG = (
     "angebote_bildenden_bereich",
     "angebote_berufsvorbereitung",
     "angebote_berufliche_qualifizierung",
     "angebote_lebensbewaeltigung")
 
-SELECT_RG = \
-"""SELECT * FROM %s WHERE master_id = %d"""
+RG_VIEWS = ["kompetenzfestellung"]
+RG_VIEWS.extend(RG_UNTERSTUETZUNG)
+RG_VIEWS = tuple(RG_VIEWS)
 
 BLACK_LIST = set(['id', 'master_id', 'bearbeiter_id'])
 
+USER_LOGIN = re.compile(r"(?:[^_]*)_(?:[^_]*)_(.+)")
+
+FORM_SECTION_RE = re.compile(r"^form_section_(\d+)$")
+
+
+def form_section_sort(a, b):
+    am = FORM_SECTION_RE.match(a)
+    bm = FORM_SECTION_RE.match(b)
+    if not am and not bm:
+        return cmp(a, b)
+    if not am: return +1
+    if not bm: return -1
+    return cmp(int(am.group(1)), int(bm.group(1)))
+
+def login(a):
+    b = USER_LOGIN.findall(a)
+    return b and b[0] or a
+
+class CasePartsSelection:
+
+    def __init__(self):
+        # Remember to change the formular validator if you change this
+        # dictionary
+        #'appointments'   : 1, 
+        self.selections = {
+            'documents'      : 0, # keine Dokumente
+            'logbook'        : 0, # kein Tagebuch
+            'form_section_0' : 1, 
+            'form_section_1' : 1, 
+            'form_section_2' : 1, 
+            'form_section_3' : 1, 
+            'form_section_4' : 1, 
+            'form_section_5' : 1, 
+            'form_section_6' : 1, 
+            'form_section_7' : 1, 
+            'form_section_8' : 1, 
+            'form_section_9' : 1, 
+            'form_section_10': 1, 
+            'form_section_11': 1, 
+            'form_section_12': 1, 
+            'form_section_13': 1, 
+            'form_section_14': 1, 
+            'form_section_15': 1, 
+            'form_section_16': 1, 
+            'form_section_17': 1 }
+
+    def numItems(self):
+        return len(self.selections)
+
+    def isChecked(self, item):
+        return self.selections.get(item) == 1
+
+    def setChecked(self, item, value):
+        self.selections[item] = value
+
+    def isAllSelected(self):
+        for v in self.selections.itervalues():
+            if v < 1: return False
+        return True
+
+    def allSelectedSections(self):
+        s = [kv[0] for kv in self.selections.iteritems() if kv[1] > 0]
+        # order form_section_XX to top, XX as int, rest to bottom by alpha 
+        s.sort(form_section_sort)
+        return s
+
+    def __str__(self):
+        return ", ".join([str(i) for i in self.selections])
+
+class Selector:
+
+    def __init__(self, anonymize=False):
+        self.views = {}
+        self.exportDocuments = False
+        self.exportLogbook   = False
+        self.anonymize       = anonymize
+
+    def getSelectStatement(self, view):
+        return self.views.get(view)
+
+    def addRepeatGroup(self, name):
+        relname = (self.anonymize and "rg_%s_tbl_anonym_view"  or "rg_%s_tbl_view") % name
+        self.views['rg_%s_tbl_view' % name] = \
+            "SELECT * FROM %s WHERE master_id = %%(id)s" % relname
+
+    def addMasterTable(self, projection):
+        relname = self.anonymize and "master_tbl_anonym_view" or "master_tbl_view"
+        self.views['master_tbl_view'] = "SELECT %s FROM %s WHERE id = %%(id)s" % (
+            ", ".join(projection),
+            relname)
+
+class SelectorFactory:
+
+    def __init__(self, case_parts, anonymize=False):
+        self.case_parts = case_parts
+        self.anonymize  = anonymize
+
+    def createSelector(self):
+        selector = Selector(self.anonymize)
+        selected_sections = self.case_parts.allSelectedSections()
+
+        master_tbl_items = ['id']
+
+        if not self.anonymize:
+            master_tbl_items.append('uuid_id')
+
+        for part in selected_sections:
+            try:
+                page = SECTION_MAP[part]
+            except:
+                if not self.anonymize:
+                    if part == "documents":
+                        selector.exportDocuments = True
+                    elif part == "logbook":
+                        selector.exportLogbook = True
+                    else:
+                        print >> sys.stderr, "missing %s" % part
+                continue
+
+            if page.startswith("rg_"):
+                if page == 'rg_kompetenzfestellung':
+                    selector.addRepeatGroup('kompetenzfestellung')
+                elif page == 'rg_unterstuetzungsangebote':
+                    for rg in RG_UNTERSTUETZUNG:
+                        selector.addRepeatGroup(rg)
+                else:
+                    print >> sys.stderr, "ignoring repeat group %s" % page
+                continue
+
+            nc = g.formedTree.findByName(page)
+            if nc is None:
+                print >> sys.stderr, "missing page '%s'" % page
+                continue
+
+            master_tbl_items.extend([n.getName() for n in nc.allWidgets()])
+
+        selector.addMasterTable(master_tbl_items)
+
+        return selector
+
+def cdataWrap(value):
+    return u"<![CDATA[%s]]>" % value.replace(u"]]>", u"]]><!CDATA[]]]]><![CDATA[>]]><[!CDATA[")
+
 def escape(value, tagname):
     if tagname == 'uuid_id':
         return "%s" % unicode(str(value), "utf-8")
     if type(value) in StringTypes:
-        value = unicode(str(value), "utf-8")
-        return "<![CDATA[%s]]>" % value.replace("]]>", "]]><!CDATA[]]]]><![CDATA[>]]><[!CDATA[")
+        return cdataWrap(unicode(str(value), "utf-8"))
     if value is None:
         return ""
     return "%s" % value
 
-def dumpColums(columns):
-    out = []
-    for tagname, value in columns:
-        if not value is None and tagname not in BLACK_LIST:
-            out.append("<%s>%s</%s>" % (tagname, escape(value, tagname), tagname))
-    return out
 
+class LogbookEntry:
+
+    def __init__(self, row):
+        if row[0] is None: self.uuid_id = None
+        else:              self.uuid_id = unicode(str(row[0]), 'UTF-8')
+
+        self.datum = row[1]
+
+        if row[2] is None: self.login = None
+        else:              self.login = unicode(str(row[2]), 'UTF-8')
+
+        self.art = row[3]
+
+        if row[4] is None: self.kurz_notiz = None
+        else:              self.kurz_notiz = unicode(str(row[4]), 'UTF-8')
+
+        if row[5] is None: self.notiz = None
+        else:              self.notiz = unicode(str(row[5]), 'UTF-8')
+
+        self.dauer = row[6]
+
+    def dump(self, out):
+        out.write(u"<tagebuch-eintrag>")
+        if not self.uuid_id is None:
+            out.write(u"<uuid_id>%s</uuid_id>" % self.uuid_id)
+        if not self.datum is None:
+            out.write(u"<tagebuch-datum>%s</tagebuch-datum>" % 
+                iso8601.tostring(mktime(self.datum.timetuple()) + 1e-6*self.datum.microsecond))
+        if not self.login is None:
+            out.write(u"<tagebuch-bearbeiter>%s</tagebuch-bearbeiter>" % login(self.login))
+        if not self.art is None:
+            out.write(u"<tagebuch-art>%d</tagebuch-art>" % self.art)
+        if not self.kurz_notiz is None:
+            out.write(u"<tagebuch-sonstiges>%s</tagebuch-sonstiges>" % cdataWrap(self.kurz_notiz))
+        if not self.notiz is None:
+            out.write(u"<tagebuch-notiz>%s</tagebuch-notiz>" % cdataWrap(self.notiz))
+        if not self.dauer is None:
+            out.write(u"<tagebuch-dauer>%d</tagebuch-dauer>" % 
+                h.timedelta_in_minutes(self.dauer))
+        out.write(u"</tagebuch-eintrag>")
+
+class Logbook:
+
+    def __init__(self):
+        self.entries = []
+
+    def addEntry(self, row):
+        self.entries.append(LogbookEntry(row))
+
+    def dump(self, out):
+        if self.entries:
+            out.write(u'<tagebuch>');
+            for entry in self.entries:
+                entry.dump(out)
+            out.write(u'</tagebuch>');
+
 class ExportCase:
 
-    def __init__(self, master_id):
+    def __init__(self, master_id, selector):
         self.master_id = int(master_id)
         self.columns   = None
         self.rgs       = []
+        self.selector  = selector
+        self.logbook   = None
+        self.blacklist = BLACK_LIST.copy()
+        if selector.anonymize:
+            self.blacklist.add('uuid_id')
 
+    def dumpColums(self, columns):
+        out = []
+        for tagname, value in columns:
+            if not value is None and tagname not in self.blacklist:
+                out.append("<%s>%s</%s>" % (tagname, escape(value, tagname), tagname))
+        return out
+
     def fetchData(self, cur):
         self.fetchMasterTable(cur)
         self.fetchRepeatGroups(cur)
+        self.fetchLogbook(cur)
 
     def fetchMasterTable(self, cur):
-        cur.execute(SELECT_MASTER_TBL, { 'id': self.master_id })
+        selector = self.selector
+        stmnt = selector.getSelectStatement('master_tbl_view')
+        if not stmnt:
+            print >> sys.stderr, "No SELECT statement for master_tbl_view found"
+            return
+        cur.execute(stmnt, { 'id': self.master_id })
         row = cur.fetchone()
         if not row: raise Exception("No dataset for id %d" % self.master_id)
         columns = row._index.items() # XXX: hackish!
@@ -63,9 +315,13 @@
         self.columns = columns
 
     def fetchRepeatGroups(self, cur):
+        selector = self.selector
+        id_dict = { 'id': self.master_id }
         for view in RG_VIEWS:
             viewname = "rg_%s_tbl_view" % view
-            cur.execute(SELECT_RG % (viewname, self.master_id))
+            stmnt = selector.getSelectStatement(viewname)
+            if stmnt is None: continue
+            cur.execute(stmnt, id_dict)
             rs = []
             while True:
                 row = cur.fetchone()
@@ -77,25 +333,73 @@
             if rs:
                 self.rgs.append((view, rs))
 
+    def fetchLogbook(self, cur):
+        if not self.selector.exportLogbook:
+            return
+        cur.execute(LOAD_LOGBOOK, {'id': self.master_id})
+        logbook = Logbook()
+        while True:
+            row = cur.fetchone()
+            if not row: break
+            logbook.addEntry(row)
+        self.logbook = logbook
+
+
     def dumpMasterTable(self, out):
-        fields = dumpColums(self.columns)
+        fields = self.dumpColums(self.columns)
         if fields:
             out.write("<master>%s</master>" % "".join(fields))
 
     def dumpRepeatGroups(self, out):
         for view, rgs in self.rgs:
             for r in rgs:
-                fields = dumpColums(r)
+                fields = self.dumpColums(r)
                 if fields:
                     out.write("<%s>%s</%s>" % (view, "".join(fields), view))
 
-    def dumpData(self, out):
+    def dumpLogbook(self, out):
+        if self.logbook:
+            self.logbook.dump(out)
+
+    def dumpDocuments(self, out, cur):
+        if not self.selector.exportDocuments:
+            return
+        # Not using OO aproach because loading documents first
+        # would fill up memory
+        first = True
+        cur.execute(LOAD_DOCUMENTS, {'id': self.master_id})
+        while True:
+            row = cur.fetchone()
+            if not row: break
+            if first:
+                first = False
+                out.write("<anlagen>")
+            out.write("<anlage>")
+            if not row[0] is None:
+                out.write("<uuid_id>%s</uuid_id>" % row[0])
+            if not row[1] is None:
+                out.write("<anlage-groesse>%d</anlage-groesse>" % row[1])
+            if not row[2] is None:
+                out.write("<anlage-mime>%s</anlage-mime>" % row[2])
+            if not row[4] is None:
+                out.write(u"<anlage-name>%s</anlage-name>" % cdataWrap(unicode(str(row[3]), 'UTF-8')))
+            if not row[3] is None:
+                out.write("<anlage-daten>")
+                out.write(row[4])
+                out.write("</anlage-daten>")
+            out.write("</anlage>")
+
+        if not first: out.write("</anlagen>")
+
+    def dumpData(self, out, cur):
         out.write("<case>")
         self.dumpMasterTable(out)
         self.dumpRepeatGroups(out)
+        self.dumpLogbook(out)
+        self.dumpDocuments(out, cur)
         out.write("</case>")
 
-def exportAsXML(cur, out, ids=None):
+def exportAsXML(cur, out, ids=None, case_parts=None, anonymize=False):
     if ids is None:
         cur.execute(FETCH_ALL_IDS)
         ids = []
@@ -103,12 +407,19 @@
             row = cur.fetchone()
             ids.append(int(row[0]))
 
+    if case_parts is None:
+        case_parts = CasePartsSelection()
+
+    selectFactory = SelectorFactory(case_parts, anonymize)
+
+    selector = selectFactory.createSelector()
+
     out.write('<?xml version="1.0" encoding="UTF-8"?>\n')
     out.write("<cases>")
     for mid in ids:
-        case = ExportCase(mid)
+        case = ExportCase(mid, selector)
         case.fetchData(cur)
-        case.dumpData(out)
+        case.dumpData(out, cur)
     out.write("</cases>")
 
 # vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

Modified: trunk/waskaweb/lib/xmlimport.py
===================================================================
--- trunk/waskaweb/lib/xmlimport.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/lib/xmlimport.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -441,6 +441,7 @@
     return row[0]
 
 def get_uuid(cur, relation_name, ds_id):
+    if relation_name != 'master': relation_name = "rg_%s" % relation_name
     sql = SQL_SELECT_UUID_FROM_RELATION % relation_name 
     cur.execute(sql, { 'id': ds_id })
     row = cur.next()

Modified: trunk/waskaweb/model/agency.py
===================================================================
--- trunk/waskaweb/model/agency.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/agency.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -12,6 +12,9 @@
 import sys
 
 from waskaweb.lib.db import db
+from waskaweb.lib.search import AgencySearch, CaseSearch
+from waskaweb.lib.base import session, g, h, config 
+from waskaweb.controllers.case_overview import parseSearchOptions
 
 GET_CASEIDS_SQL = """SELECT id from master_tbl_view
                      WHERE fkz = %(id)s"""
@@ -33,11 +36,12 @@
                                 WHERE m.fkz = %(id)s"""
 
 class AgencyBundle:
-    def __init__(self, ids):
+    def __init__(self, ids=None):
         self.list = []
         factory = AgencyFactory()
-        for id in ids:
-            self.list.append(factory.loadByFkz(id))
+        if ids:
+            for id in ids:
+                self.list.append(factory.loadByFkz(id))
 
     def delete(self):
         num = 0
@@ -77,17 +81,14 @@
 class AgencyOverview:
     def __init__(self):
         self.agency_list = []
+
+    def search(self, search_str=""):
         factory = AgencyFactory()
-        conn, cur = None, None
-        try:
-            conn = db.getConnection()
-            cur = conn.cursor()
-            cur.execute(GET_AGENCYLIST_SQL)
-            rows = cur.fetchall()
-            for row in rows:
-                self.agency_list.append(factory.loadByData(row[1], row[0], row[2]))
-        finally:
-            db.recycleConnection(conn, cur)
+        search = AgencySearch()
+        result = search.perform(search_str)
+        for row in result:
+            self.agency_list.append(factory.loadByData(row['fkz'], row['anzahl'], row['zugriff']))
+        return self.agency_list
 
     def getDatasets(self):
         return self.agency_list 
@@ -105,10 +106,26 @@
         try:
             conn = db.getConnection()
             cur = conn.cursor()
-            cur.execute(GET_CASEIDS_SQL, {'id': self.fkz})
-            rows = cur.fetchall()
-            for row in rows:
-                ids.append(row[0])
+
+            search = CaseSearch()
+            form_defaults = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or {}
+            search_options = parseSearchOptions(form_defaults)
+            # sql query fails if no sort order is given.
+            search_options.append('fkz:%s' % self.fkz)
+            # if no state id given in search options take default (all) states
+            if not form_defaults.has_key('state'):
+                search_options.append('state:1')
+                search_options.append('state:2')
+                search_options.append('state:3')
+                search_options.append('state:4')
+                search_options.append('state:5')
+            search_options.append('sort_field:fkz')
+            search_options.append('sort_order:asc')
+            search_str = ";".join(search_options)
+
+            result = search.perform(search_str)
+            for row in result:
+                ids.append(row['id'])
         finally:
             db.recycleConnection(conn, cur)
 

Modified: trunk/waskaweb/model/appointment.py
===================================================================
--- trunk/waskaweb/model/appointment.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/appointment.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -11,6 +11,8 @@
 from datetime import datetime, timedelta
 
 
+import waskaweb.lib.helpers as h
+
 from waskaweb.lib.base import session
 from waskaweb.lib.db import db
 from waskaweb.model.agencysettings import Agency
@@ -32,8 +34,8 @@
 GET_CASE_APPOINTMENT_SQL = "SELECT id, master_id, sdatum, edatum, name, beschreibung, art FROM ka_fall_termine_tbl_view WHERE id = %(id)s"
 GET_CASE_APPOINTMENTLIST_SQL = "SELECT id, master_id, sdatum, edatum, name, beschreibung, art FROM ka_fall_termine_tbl_view WHERE master_id = %(id)s AND coalesce(edatum, sdatum)::date+1 >= %(date)s AND art = 0 ORDER BY sdatum"
 GET_CASE_REMINDERLIST_SQL = "SELECT id, master_id, sdatum, edatum, name, beschreibung, art FROM ka_fall_termine_tbl_view WHERE master_id = %(id)s AND art = 1 ORDER BY sdatum"
-GET_ALLCASES_APPOINTMENTLIST_SQL = "SELECT a.id, a.master_id, a.sdatum, a.edatum, a.name, a.beschreibung, a.art FROM ka_fall_termine_tbl_view a JOIN master_tbl_view m ON m.id = a.master_id WHERE coalesce(edatum, sdatum)::date+1 >= %(date)s AND art = 0 ORDER BY sdatum"
-GET_ALLCASES_REMINDERLIST_SQL = "SELECT a.id, a.master_id, a.sdatum, a.edatum, a.name, a.beschreibung, a.art FROM ka_fall_termine_tbl_view a JOIN master_tbl_view m ON m.id = a.master_id WHERE art = 1 ORDER BY sdatum"
+GET_ALLCASES_APPOINTMENTLIST_SQL = "SELECT a.id, a.master_id, a.sdatum, a.edatum, a.name, a.beschreibung, a.art FROM ka_fall_termine_tbl_view a JOIN master_tbl_view m ON m.id = a.master_id WHERE coalesce(edatum, sdatum)::date+1 >= %(date)s AND art = 0 AND m.bearbeiter_id = %(editor)s ORDER BY sdatum"
+GET_ALLCASES_REMINDERLIST_SQL = "SELECT a.id, a.master_id, a.sdatum, a.edatum, a.name, a.beschreibung, a.art FROM ka_fall_termine_tbl_view a JOIN master_tbl_view m ON m.id = a.master_id WHERE art = 1 AND m.bearbeiter_id = %(editor)s ORDER BY sdatum"
 DELETE_CASE_APPOINTMENT_SQL = "select delete_fall_termin_ds(%(id)s)"
 CREATE_CASE_APPOINTMENT_SQL = "select create_fall_termin_ds(%(id)s)"
 STORE_CASE_APPOINTMENT_SQL = "UPDATE ka_fall_termine_tbl_view SET \
@@ -54,6 +56,16 @@
 #AND m.zeitraum_nachbetreuung = -1 
 #AND m.art_beendigung <> 1"""
 
+GET_OLDACTIVE_CASES_4_ADMIN = """
+SELECT m.id, s.zugriff, getLastCaseAppointment(m.id) AS last_date
+FROM
+  (SELECT * FROM ka_status_tbl_view
+   WHERE zugriff < now() - interval '1 day' * %(maxdays)s AND status <> 5) s
+   JOIN master_tbl_view m ON m.id = s.master_id 
+   WHERE m.zeitraum_nachbetreuung = -1
+       AND m.art_beendigung <> 1 
+       AND getLastCaseAppointment(s.master_id) < now() - interval '1 day' * %(maxdays)s
+"""
 GET_OLDACTIVE_CASES = """
 SELECT m.id, s.zugriff, getLastCaseAppointment(m.id) AS last_date
 FROM
@@ -62,15 +74,27 @@
    JOIN master_tbl_view m ON m.id = s.master_id 
    WHERE m.zeitraum_nachbetreuung = -1
        AND m.art_beendigung <> 1 
+       AND m.bearbeiter_id = %(editor)s
        AND getLastCaseAppointment(s.master_id) < now() - interval '1 day' * %(maxdays)s
 """
 
+GET_OLDFINISHED_CASES_4_ADMIN = """SELECT m.id, s.zugriff, 
+getLastCaseAppointment(m.id) as last_date 
+from master_tbl_view m 
+JOIN ka_status_tbl_view s 
+ON s.master_id = m.id 
+WHERE s.status <> 5
+AND extract(day from now()-s.zugriff) > %(maxdays)s 
+AND (m.zeitraum_nachbetreuung <> -1 
+OR m.art_beendigung = 1)"""
+
 GET_OLDFINISHED_CASES = """SELECT m.id, s.zugriff, 
 getLastCaseAppointment(m.id) as last_date 
 from master_tbl_view m 
 JOIN ka_status_tbl_view s 
 ON s.master_id = m.id 
-WHERE s.status <> 5 
+WHERE s.status <> 5
+AND m.bearbeiter_id = %(editor)s
 AND extract(day from now()-s.zugriff) > %(maxdays)s 
 AND (m.zeitraum_nachbetreuung <> -1 
 OR m.art_beendigung = 1)"""
@@ -197,7 +221,8 @@
             values = {'id': caseid, 'date': today}
             sql = GET_CASE_APPOINTMENTLIST_SQL
         else:
-            values = {'date': today}
+            user = session['USER_AUTHORIZED']
+            values = {'date': today, 'editor': user.id}
             sql = GET_ALLCASES_APPOINTMENTLIST_SQL
         self._load(afactory, sql, values)
 
@@ -217,7 +242,8 @@
             values = {'id': caseid, 'date': today}
             sql = GET_CASE_REMINDERLIST_SQL
         else:
-            values = {'date': today}
+            user = session['USER_AUTHORIZED']
+            values = {'date': today, 'editor': user.id}
             sql = GET_ALLCASES_REMINDERLIST_SQL
         self._load(afactory, sql, values)
 
@@ -234,8 +260,8 @@
         # longer than maxage.
         # orphaned means that all last appointmentment, aids or the
         # modification date is older than maxage
-        oldAndActive          = self.__getOldAndActiveCases(maxage)
-        oldAndFinished        = self.__getOldAndFinishedCases(maxage)
+        oldAndActive          = self.__getOldAndActiveCases(maxage, user)
+        oldAndFinished        = self.__getOldAndFinishedCases(maxage, user)
 
         # 1. Load cases of the user so we can so checks regarding the maximum
         # savetime on them
@@ -261,13 +287,16 @@
             appointment = self.__makeAppointment(case, access, maxage, finished=True)
             self.appointment_list.append(appointment)
 
-    def __getOldAndFinishedCases(self, days):
+    def __getOldAndFinishedCases(self, days, user):
         conn, cur = None, None
         list = {}
         try:
             conn = db.getConnection()
             cur = conn.cursor()
-            cur.execute(GET_OLDFINISHED_CASES, {'maxdays': days})
+            if user.isAdmin():
+                cur.execute(GET_OLDFINISHED_CASES_4_ADMIN, {'maxdays': days})
+            else:
+                cur.execute(GET_OLDFINISHED_CASES, {'maxdays': days, 'editor': user.id})
             result = cur.fetchall()
             for r in result:
                 list[r[0]] = {'access':r[1], 'last_date': r[2]}
@@ -276,13 +305,16 @@
             db.recycleConnection(conn, cur)
         return False
 
-    def __getOldAndActiveCases(self, days):
+    def __getOldAndActiveCases(self, days, user):
         conn, cur = None, None
         list = {}
         try:
             conn = db.getConnection()
             cur = conn.cursor()
-            cur.execute(GET_OLDACTIVE_CASES, {'maxdays': days})
+            if user.isAdmin():
+                cur.execute(GET_OLDACTIVE_CASES_4_ADMIN, {'maxdays': days, 'editor': user.id})
+            else:
+                cur.execute(GET_OLDACTIVE_CASES, {'maxdays': days, 'editor': user.id})
             result = cur.fetchall()
             for r in result:
                 list[r[0]] = {'access':r[1], 'last_date': r[2]}
@@ -346,11 +378,10 @@
     def getEndDate(self):
         return self.end_date
 
-    def getDuration(self):
+    def getDuration(self, empty=''):
         if self.end_date:
-            return self.end_date - self.start_date
-        else:
-            return None
+            return h.human_timedelta(self.end_date - self.start_date)
+        return empty
 
     def setData(self, data):
         '''Sets values of the appointment to data. Data is a dict returned from formencode'''

Modified: trunk/waskaweb/model/case.py
===================================================================
--- trunk/waskaweb/model/case.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/case.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -17,6 +17,8 @@
 from sets import Set
 from pylons.i18n                import _, ungettext, N_
 from waskaweb.lib.db import db
+from waskaweb.lib.sql_helper import where_ids, range_compress 
+from waskaweb.lib.search import CaseSearch
 from waskaweb.lib.csv import exportAsCSV
 from waskaweb.lib.excel import exportAsXLS
 from waskaweb.lib.xmlexport import exportAsXML
@@ -33,8 +35,6 @@
 
 from os import tmpnam, unlink
 
-SAVE_SEARCH = re.compile(r'[^\w:; ]', re.UNICODE)
-
 def save_getone(params, k, v):
     try:
         return params.getone(k)
@@ -42,36 +42,6 @@
         return v
 
 # SQL STATEMENTS
-SEARCH_CASE_OVERVIEW_SQL = \
-""" SELECT
-      m.id,
-      m.name_1,
-      m.vorname_1,
-      m.kundennummer,
-      m.bearbeiter_id,
-      st.status,
-      st.zugriff,
-      st.id as s_id,
-      m.zeitraum_nachbetreuung,
-      m.art_beendigung,
-      m.einverstaendniserklaerung
-    FROM master_tbl_view m
-    JOIN ka_status_tbl_view st ON
-    m.id = st.master_id
-    WHERE
-      ((m.vorname_1 ~* %%(needle)s
-      OR m.name_1 ~* %%(needle)s
-      OR m.kundennummer ~* %%(needle)s)
-      OR ( m.vorname_1 IS NULL
-      AND m.name_1 IS NULL
-      AND m.kundennummer IS NULL
-      ))
-      AND st.status IN (%s)
-      AND %s
-      AND %s
-      AND %s
-    ORDER by m.name_1"""
-
 LOAD_CASESTATE_SQL = """SELECT s.id, s.status, s.zugriff, m.zeitraum_nachbetreuung as cm_beendet, m.art_beendigung as cm_abbruch, getLastCaseAppointment(m.id) as letzer_termin from ka_status_tbl_view s JOIN master_tbl_view m ON m.id = s.master_id WHERE s.master_id = %(id)s"""
 SET_CASESTATE_SQL = """UPDATE ka_status_tbl_view SET status = %(status)s WHERE id = %(id)s"""
 
@@ -92,6 +62,7 @@
 ADD_STANDIN_SQL = """SELECT create_nm_benutzer_master_ds(%(groupid)s, %(caseid)s)"""
 DELETE_STANDIN_SQL = """SELECT delete_nm_benutzer_master_ds(%(groupid)s, %(caseid)s)"""
 SET_EDITOR_SQL = """SELECT set_case_editor(%(userid)s, %(caseid)s)"""
+SET_EDITOR_NAME_SQL = """SELECT set_case_editor_name(%(firstname)s, %(lastname)s, %(caseid)s)"""
 FETCH_KOMPETENZ_ID = """SELECT id from rg_kompetenzfestellung_tbl_view WHERE master_id = %(id)s LIMIT 1"""
 
 CASE_EXISTS = "SELECT * FROM case_exists(%(knummer)s)"
@@ -103,10 +74,8 @@
    'rg_angebote_berufsvorbereitung_tbl':        CREATE_RG_BERUF_DS
 }
 
-ANONYMIZE_CASE          = """SELECT anonymize_case(%(id)s)"""
-DELETE_CASE_ATTACHMENTS = """SELECT delete_all_fall_dokumente(%(id)s)"""
+ANONYMIZE_CASE          = """SELECT anonymize_case_wrapper(%(id)s)"""
 
-
 class LoadCaseNotExistsError(Exception):
     def __init__(self, value):
         self.value = value
@@ -184,6 +153,42 @@
                 print >> sys.stderr, "Could not delete Case from bundle"
         return num
 
+    def anonymize(self):
+        factory = CaseFactory()
+        num = 0
+        for id in self.case_list:
+            case = factory.loadById(id)
+            try:
+                case.anonymize()
+                num += 1
+            except:
+                print >> sys.stderr, "Could not anonymize Case from bundle"
+        return num
+
+    def restore(self):
+        factory = CaseFactory()
+        num = 0
+        for id in self.case_list:
+            case = factory.loadById(id)
+            try:
+                case.getState().setState(1)
+                num += 1
+            except:
+                print >> sys.stderr, "Could not restore case in bundle"
+        return num
+
+    def markAnonymize(self):
+        factory = CaseFactory()
+        num = 0
+        for id in self.case_list:
+            case = factory.loadById(id)
+            try:
+                case.getState().setState(4)
+                num += 1
+            except:
+                print >> sys.stderr, "Could not mark case for anonymisation in bundle"
+        return num
+
     def markDelete(self):
         factory = CaseFactory()
         num = 0
@@ -197,7 +202,7 @@
                 print >> sys.stderr, "Could not mark Case to delete from bundle"
         return num
 
-    def exportAsCSV(self):
+    def exportAsCSV(self, anonymize=False):
         con, cur = None, None
         f = StringIO.StringIO()
         Writer = codecs.getwriter('latin-1')
@@ -205,7 +210,7 @@
         try:
             con = db.getConnection()
             cur = con.cursor()
-            exportAsCSV(cur, out, self.listDatasetIds())
+            exportAsCSV(cur, out, self.listDatasetIds(), anonymize)
             out.flush()
             bytes = out.getvalue()
             out.close()
@@ -213,7 +218,7 @@
         finally:
             db.recycleConnection(con, cur)
 
-    def exportAsXML(self):
+    def exportAsXML(self, case_parts = None, anonymize=False):
         con, cur = None, None
         f = StringIO.StringIO()
         Writer = codecs.getwriter('utf-8')
@@ -221,7 +226,7 @@
         try:
             con = db.getConnection()
             cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
-            exportAsXML(cur, out, self.listDatasetIds())
+            exportAsXML(cur, out, self.listDatasetIds(), case_parts, anonymize)
             out.flush()
             bytes = out.getvalue()
             out.close()
@@ -229,7 +234,7 @@
         finally:
             db.recycleConnection(con, cur)
 
-    def exportAsXLS(self):
+    def exportAsXLS(self, anonymize=False):
         con, cur = None, None
         fname = None
         try:
@@ -238,7 +243,7 @@
             f = None
             try:
                 fname = tmpnam() # security risk: symlink attacks
-                exportAsXLS(cur, fname, self.listDatasetIds())
+                exportAsXLS(cur, fname, self.listDatasetIds(), anonymize)
                 f = open(fname, "rb")
                 return f.read()
             finally:
@@ -257,50 +262,6 @@
     def __init__(self, search_str=None):
         self.ds_list = []
 
-    def _parse_options(self, s):
-        # TODO This is a very very simple approach. We should defentiley
-        # implement some searchengine here
-        self.VALID_OPTIONS = ['editor', 'own', 'standin', 'state']
-        search = []
-        allowed_states = [-1]
-        options = {}
-        fields = {'needle': ""}
-
-        if s:
-            s = SAVE_SEARCH.sub(u'', s)
-            option_list = [o.strip() for o in s.split(';')]
-            for option in option_list:
-                if option.find(":") > 0:
-                    try:
-                        key, value = [x.strip() for x in option.split(":")]
-                        if key in self.VALID_OPTIONS:
-                            if key == 'state':
-                                allowed_states.append(int(value))
-                            else:
-                                options[key] = value
-                    except ValueError:
-                        print >> sys.stderr, "Found invalid search syntax in options"
-                else:
-                    search.append(option)
-
-        # Show all cases regardless if the privacy statement has been declined
-        #ee =  h.hasRole(['cm_ka']) and "m.einverstaendniserklaerung <> 0" or "TRUE"
-        ee = "TRUE"
-
-        which_user = 0
-        allowed_viewer = "FALSE"
-        if options.has_key('own'): which_user += 2
-        if options.has_key('standin'): which_user += 1
-        if which_user == 1: allowed_viewer = "m.bearbeiter_id <> %s" % options.get('standin')
-        if which_user == 2: allowed_viewer = "m.bearbeiter_id = %s" % options.get('own')
-        if which_user == 3: allowed_viewer = "TRUE"
-        allowed_viewer =  h.hasRole(['admin_ka']) and "TRUE" or allowed_viewer
-        editor = options.has_key('editor') and "m.bearbeiter_id = %s" % options.get('editor') or "TRUE"
-
-        fields['needle'] = " ".join(search) 
-        SQL = SEARCH_CASE_OVERVIEW_SQL % (",".join([str(x) for x in allowed_states]), ee, allowed_viewer, editor) 
-        return (SQL, fields) 
-
     def sortByLastname(self):
         def _cmp(a, b):
             if a is None and b is None: return 0
@@ -311,30 +272,23 @@
 
     def search(self, search_str=None):
         self.ds_list = []
-        SQL, fields = self._parse_options(search_str)
-        con, cur = None, None
-        try:
-            con = db.getConnection()
-            cur = con.cursor(cursor_factory=psycopg2.extras.DictCursor)
-            cur.execute(SQL, fields)
-            rows = cur.fetchall()
-            factory = CaseFactory()
-            for row in rows:
-                case = factory.loadByName( \
-                    row['id'], \
-                    row['vorname_1'], \
-                    row['name_1'], \
-                    row['kundennummer'], \
-                    row['bearbeiter_id'], \
-                    row['einverstaendniserklaerung'], \
-                    row['s_id'], \
-                    row['status'], \
-                    row['zugriff'], \
-                    row['zeitraum_nachbetreuung'], \
-                    row['art_beendigung'])
-                self.ds_list.append(case)
-        finally:
-            db.recycleConnection(con, cur)
+        search = CaseSearch()
+        result = search.perform(search_str)
+        factory = CaseFactory()
+        for row in result:
+            case = factory.loadByName( \
+                row['id'], \
+                row['vorname_1'], \
+                row['name_1'], \
+                row['kundennummer'], \
+                row['bearbeiter_id'], \
+                row['einverstaendniserklaerung'], \
+                row['s_id'], \
+                row['status'], \
+                row['zugriff'], \
+                row['zeitraum_nachbetreuung'], \
+                row['art_beendigung'])
+            self.ds_list.append(case)
         return self.ds_list
 
     def numDatasets(self):
@@ -397,7 +351,7 @@
         xfa = None
         try:
             xfa = asXFA(b)
-            print >> sys.stderr, "XFA fetched"
+            #print >> sys.stderr, "XFA fetched"
             fe.extractFields(xfa)
         finally:
             if xfa:
@@ -648,7 +602,7 @@
         self.first_name      = '' 
         self.last_name       = '' 
         self.knr             = '' 
-        self.age             = ''
+        self.age             = '0'
         self.plz             = ''
         self.city            = ''
         self.street          = ''
@@ -695,7 +649,7 @@
             self.telephone_more    = F.NA(unicode(str(result.get('telefon_sonstige', '')), 'utf-8')).replace('\n', '<br>')
 
             self.email             = unicode(str(result.get('email', '')), 'utf-8')
-            self.age               = result.get('alter') and "%.0f" % result.get('alter') or ""
+            self.age               = result.get('alter') and "%.0f" % result.get('alter') or "0"
             self.statement         = (result.get('einverstaendniserklaerung') >= 0)
 
             # Parents of the kids
@@ -843,12 +797,15 @@
     def setEditor(self, userid):
         '''sets the editor of the case to the given userid'''
         con, curr = None, None
-        fields = {'caseid': self.id, 'userid': userid}
+        user = UserObject(userid)
+        fields1 = {'caseid': self.id, 'userid': userid}
+        fields2 = {'caseid': self.id, 'firstname': user.first_name, 'lastname': user.last_name}
         try:
             con = db.getConnection()
             cur = con.cursor()
             try:
-                cur.execute(SET_EDITOR_SQL, fields)
+                cur.execute(SET_EDITOR_SQL, fields1)
+                cur.execute(SET_EDITOR_NAME_SQL, fields2)
             except:
                 con.rollback()
             con.commit()
@@ -968,7 +925,6 @@
                 cur  = conn.cursor()
                 d = { 'id': self.id }
                 cur.execute(ANONYMIZE_CASE, d)
-                cur.execute(DELETE_CASE_ATTACHMENTS, d)
             finally:
                 db.recycleConnection(conn, cur)
             state = self.getState()
@@ -1070,6 +1026,7 @@
                 self.state = value
             finally:
                 db.recycleConnection(conn, cur)
+            return True
         except:
             traceback.print_exc(file=sys.stderr)
         return False 

Modified: trunk/waskaweb/model/casedocument.py
===================================================================
--- trunk/waskaweb/model/casedocument.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/casedocument.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -20,7 +20,6 @@
         if proxy:
             proxy.set(nc)
             nc = proxy
-        print no_data
         if no_data:
             page = EmptyPageStore(db_view, nc, ds_id)
         else:

Modified: trunk/waskaweb/model/document.py
===================================================================
--- trunk/waskaweb/model/document.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/document.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -16,7 +16,7 @@
 BLOCK_SIZE = 4*1024
 
 CREATE_GLOBAL = 'SELECT * FROM create_global_dokument_ds()'
-CREATE_CASE   = 'SELECT * FROM create_fall_dokument_ds(%(id)s)'
+CREATE_CASE   = 'SELECT * FROM create_fall_dokument_ds(%(id)s, %(uuid)s)'
 
 UPDATE_GLOBAL = '''
 UPDATE ka_global_dokumente_tbl_view 
@@ -130,7 +130,7 @@
             return unicode(str(name), encoding)
         return name
 
-    def create(self, name, src, case=None):
+    def create(self, name, src, case=None, uuid=None):
 
         name = name.strip().rsplit('\\', 1)[-1].rsplit('/', 1)[-1]
 
@@ -172,7 +172,7 @@
             cur = con.cursor()
 
             if case is None: cur.execute(CREATE_GLOBAL)
-            else:            cur.execute(CREATE_CASE, { 'id': case })
+            else:            cur.execute(CREATE_CASE, { 'id': case, 'uuid': uuid})
 
             row = cur.fetchone()
             if row is None:

Added: trunk/waskaweb/model/logbook.py
===================================================================
--- trunk/waskaweb/model/logbook.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/logbook.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,337 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2007 by Intevation GmbH
+# Authors:
+# Sascha L. Teichmann <sascha.teichmann at intevation.de>
+
+from waskaweb.lib.db import db
+
+import waskaweb.lib.helpers as h
+
+from datetime  import timedelta
+
+KIND2TEXT = {
+    -2: u'Sonstiges',
+    -1: u'Keine Angabe',
+     0: u'Automatischer Eintrag',
+     1: u'Gespräch mit dem Jugendlichen',
+     2: u'Telefonat mit dem Jugendlichen',
+     3: u'Begleitung des Jugendlichen zu externen Stellen',
+     4: u'Betreuung des Jugendlichen',
+     5: u'Schriftverkehr',
+     6: u'Gespräch/Telefonat mit Kooperationspartnern',
+     7: u'Gespräch/Telefonat mit Dritten',
+     8: u'Fallkonferenz (Fallbesprechung, Supervision)',
+     9: u'Erstgespräch',
+    10: u'Kompetentfeststellung' }
+
+LOAD_LOGBOOK = """
+SELECT l.id AS id, datum, b.vorname AS vorname, b.nachname AS nachname, art, kurz_notiz, notiz, dauer
+FROM ka_logbuch_tbl_view l LEFT JOIN ka_benutzer_tbl_view b
+ON l.bearbeiter = b.id
+WHERE l.master_id = %(mid)s
+ORDER BY datum
+"""
+
+LOAD_LOGBOOK_BY_ID = """
+SELECT l.id AS id, datum, b.vorname AS vorname, b.nachname AS nachname, art, kurz_notiz, notiz, dauer
+FROM ka_logbuch_tbl_view l LEFT JOIN ka_benutzer_tbl_view b
+ON l.bearbeiter = b.id
+WHERE l.id = %(mid)s
+"""
+
+CREATE_LOGBOOK_ENTRY = """
+SELECT create_logbuch_ds(%(mid)s, NULL)
+"""
+
+DELETE_LOGBOOK_ENTRY = """
+SELECT delete_logbuch_ds(%(mid)s)
+"""
+
+UPDATE_LOGBOOK_ENTRY = """
+UPDATE ka_logbuch_tbl_view SET 
+    datum      = %(date)s, 
+    bearbeiter = %(editor)s, 
+    art        = %(kind)s,
+    kurz_notiz = %(short_notice)s,
+    notiz      = %(notice)s,
+    dauer      = %(duration)s
+WHERE id = %(id)s
+"""
+
+class LogbookEntry:
+
+    def __init__(self):
+        self.id                  = None
+        self.datum               = None
+        self.art                 = None
+        self.bearbeiter_vorname  = None
+        self.bearbeiter_nachname = None
+        self.kurz_notiz          = None
+        self.notiz               = None
+        self.dauer               = None
+
+    def setByRow(self, row):
+        self.id                  = row[0]
+        self.datum               = row[1]
+        self.bearbeiter_vorname  = row[2] and unicode(str(row[2]), 'UTF-8') or None
+        self.bearbeiter_nachname = row[3] and unicode(str(row[3]), 'UTF-8') or None
+        self.art                 = row[4]
+        self.kurz_notiz          = row[5] and unicode(str(row[5]), 'UTF-8') or None
+        self.notiz               = row[6] and unicode(str(row[6]), 'UTF-8') or None
+        self.dauer               = row[7]
+
+    def loadById(self, id):
+        self.id = id
+        conn, cur = None, None
+        try:
+            conn = db.getConnection()
+            cur  = conn.cursor()
+            cur.execute(LOAD_LOGBOOK_BY_ID, {'mid': id})
+            row = cur.fetchone()
+            if not row:
+                raise StandardError('logbook entry not found')
+            self.setByRow(row)
+        finally:
+            db.recycleConnection(conn, cur)
+
+    def setId(self, id):
+        self.id = id
+
+    def getId(self, id):
+        return self.id
+
+    def getDate(self):
+        return h.dd_mm_YYYY(self.datum)
+
+    def getTime(self):
+        return h.HH_MM(self.datum)
+
+    def setDate(self, datum):
+        self.datum = datum
+
+    def getEditor(self):
+        name = []
+        if self.bearbeiter_nachname:
+            name.append(self.bearbeiter_nachname)
+
+        if self.bearbeiter_vorname:
+            name.append(", ")
+            name.append(self.bearbeiter_vorname[0])
+            name.append(".")
+
+        if not name: return ""
+
+        return "".join(name)
+
+    def getKind(self, empty='-/-'):
+        if self.art == -2:
+            return "Sonstiges: %s" % self.getShortNotice(empty)
+        return KIND2TEXT.get(self.art, empty);
+
+    def setKind(self, art):
+        self.art = art
+
+    def getShortNotice(self, empty='-/-'):
+        if self.kurz_notiz is not None:
+            return self.kurz_notiz
+        return empty
+
+    def setShortNotice(self, kurz_notiz):
+        self.kurz_notiz = kurz_notiz
+
+    def getKindAsInt(self):
+        return self.art
+
+    def isSelectedKind(self, kind):
+        return kind == self.art and "selected" or ""
+
+    def setNotice(self, notice):
+        self.notiz = notice
+
+    def getNotice(self, empty=''):
+        if self.notiz: return self.notiz
+        return empty
+
+    def getDuration(self, empty=''):
+        if self.dauer is None: return empty
+        return "%d" % h.timedelta_in_minutes(self.dauer)
+
+    def setDuration(self, duration):
+        self.dauer = duration
+
+    def store(self, cur, mid, uid):
+        if self.id is None:
+            cur.execute(CREATE_LOGBOOK_ENTRY, {"mid": mid})
+            row = cur.fetchone()
+            if not row:
+                raise StandardError("Cannot create log book entry")
+            self.id = row[0]
+
+        cur.execute(UPDATE_LOGBOOK_ENTRY, {
+            "date"        : self.datum,
+            "editor"      : uid,
+            "kind"        : self.art,
+            "short_notice": self.kurz_notiz,
+            "notice"      : self.notiz,
+            "duration"    : self.dauer,
+            "id"          : self.id})
+
+    def storeForUser(self, uid):
+        conn, cur = None, None
+        try:
+            conn = db.getConnection()
+            cur  = conn.cursor()
+            cur.execute(UPDATE_LOGBOOK_ENTRY, {
+                "date"        : self.datum,
+                "editor"      : uid,
+                "kind"        : self.art,
+                "short_notice": self.kurz_notiz,
+                "notice"      : self.notiz,
+                "duration"    : self.dauer,
+                "id"          : self.id})
+            conn.commit()
+        finally:
+            db.recycleConnection(conn, cur)
+        
+
+class Logbook:
+
+    def __init__(self, mid = None):
+        self.entries = []
+        self.mid     = mid
+
+    def deleteEntryById(self, mid):
+        conn, cur = None, None
+        try:
+            conn = db.getConnection()
+            cur  = conn.cursor()
+            cur.execute(DELETE_LOGBOOK_ENTRY, {'mid': mid})
+            conn.commit()
+        finally:
+            db.recycleConnection(conn, cur)
+
+    def loadById(self, mid):
+        self.mid = mid
+        conn, cur = None, None
+        try:
+            conn = db.getConnection()
+            cur  = conn.cursor()
+            cur.execute(LOAD_LOGBOOK, {'mid': mid})
+            while True:
+                row = cur.fetchone()
+                if not row: break
+                entry = LogbookEntry()
+                entry.setByRow(row)
+                self.entries.append(entry)
+        finally:
+            db.recycleConnection(conn, cur)
+
+    def hasEntries(self):
+        return len(self.entries) > 0
+
+    def getEntries(self):
+        return self.entries
+
+    def addEntry(self, entry):
+        self.entries.append(entry)
+
+    def store(self, uid):
+        if self.mid is None: return
+        conn, cur = None, None
+        try:
+            conn = db.getConnection()
+            cur  = conn.cursor()
+            for entry in self.entries:
+                entry.store(cur, self.mid, uid)
+            conn.commit()
+        finally:
+            db.recycleConnection(conn, cur)
+
+class LogbookEntryChecker:
+    def __init__(self, params, check_case_id=True):
+        errors = []
+        datum = params.getone('date')
+        if datum:
+            ndatum = h.checkDate(datum)
+            if not ndatum:
+                errors.append("Datum '%s' ist nicht korrekt. (dd.MM.JJJJ)." % datum)
+            datum = ndatum
+        else:
+            datum = None
+
+        zeit = params.get('time')
+        if zeit:
+            nzeit = h.checkTime(zeit)
+            if nzeit is None:
+                errors.append("Uhrzeit '%s' ist nicht korrekt. (HH:MM)." % zeit)
+            elif datum:
+                datum += nzeit
+
+        self.case_id = None
+        if check_case_id:
+            case_id = params.getone('case_id')
+            if case_id is None:
+                errors.append("Es wurde keine Fallnummer gefunden.")
+            else:
+                try:
+                    case_id = int(case_id)
+                    self.case_id = case_id
+                except ValueError:
+                    errors.append("Fallnummer is keine Ganzzahl.");
+
+        art = params.getone('kind')
+        if art is None:
+            errors.append("Die Art des Eintrages wurde nicht angegeben.")
+        else:
+            try:
+                art = int(art)
+                if art < -2 or art > 10:
+                    errors.append("Die Art liegt ausserhalb des erlaubten Bereiches.")
+            except ValueError:
+                errors.append("Die Art des Eintrages ist keine Ganzzahl.")
+                art = None
+
+        dauer = params.getone('duration')
+        odauer = dauer
+        if dauer:
+            try:
+                dauer = int(dauer)
+                if dauer < 0: raise ValueError()
+                dauer = timedelta(minutes=dauer)
+            except ValueError:
+                errors.append("Die Dauer '%s' ist keine positive Ganzzahl." % odauer)
+                dauer = None
+        else:
+            dauer = None
+
+        notiz = params.getone('notice')
+        if not notiz: notiz = None
+
+        kurz_notiz = params.getone('short_notice')
+        if not kurz_notiz: kurz_notiz = None
+
+        self.errors = errors
+
+        entry = LogbookEntry()
+        self.entry = entry
+
+        if not art        is None: entry.setKind(art)
+        if not datum      is None: entry.setDate(datum)
+        if not dauer      is None: entry.setDuration(dauer)
+        if not kurz_notiz is None: entry.setShortNotice(kurz_notiz)
+        if not notiz      is None: entry.setNotice(notiz)
+
+    def hasErrors(self):
+        return len(self.errors) > 0
+
+    def getErrors(self):
+        return self.errors
+
+    def getLogbookEntry(self):
+        return self.entry
+
+    def getCaseId(self):
+        return self.case_id
+
+# vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8:

Modified: trunk/waskaweb/model/navigation.py
===================================================================
--- trunk/waskaweb/model/navigation.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/navigation.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -8,6 +8,7 @@
 import sys
 
 from paste.httpexceptions  import HTTPNotFound
+from waskaweb.lib.helpers  import getHelp
 
 NEXT_KEYS = {
     "0"   : "26",
@@ -47,15 +48,19 @@
 
 class TreeItem:
 
-    def __init__(self, key, page = "", description = "", children = None, enabled=True):
+    def __init__(self, key, page = "", description = "", children=None, enabled=True, fname=None):
         self.displayChildren = False
         self.key             = key
+        self.formed_name     = fname
         self.page            = page
         self.parent          = None 
         self.description     = description
         self.children        = children
         self.enabled         = enabled 
 
+    def __str__(self):
+        return "Desc: %s, Key: %s, Fname: %s, Page: %s" % (self.description, self.key, self.formed_name, self.page)
+
     def toggle(self):
         self.displayChildren = not self.displayChildren
 
@@ -131,8 +136,8 @@
 
 class KompetenzTreeItem(TreeItem):
 
-    def __init__(self, key, page, description, children, kid):
-        TreeItem.__init__(self, key, page, description, children)
+    def __init__(self, key, page, description, children, kid, fname):
+        TreeItem.__init__(self, key, page, description, children, fname=fname)
         self.kid = kid
 
     def realId(self, id):
@@ -146,8 +151,8 @@
         factories = {}
         k_id = case.getKompetenzId()
         
-        def xmake(key, page, description, children=None):
-            return KompetenzTreeItem(key, page, description, children, k_id)
+        def xmake(key, page, description, children=None, fname=None):
+            return KompetenzTreeItem(key, page, description, children, k_id, fname)
 
         if not k_id is None:
             factories = {
@@ -160,24 +165,24 @@
             }
 
         def make(p):
-            def _make(*args):
-                return factories.get(p, TreeItem)(*args)
+            def _make(*args, **v):
+                return factories.get(p, TreeItem)(*args, **v)
             return _make
 
         self.children = [
-            make("page_0")("0", "page_0", "Zust&auml;ndigkeiten, Eingangsdaten"),
-            make("page_25")("26", "page_25", "Externe Ansprechpartner"),
+            make("page_0")("0", "page_0", "Zust&auml;ndigkeiten, Eingangsdaten", fname="info-0"),
+            make("page_25")("26", "page_25", "Externe Ansprechpartner", fname="info-28"),
             make("page_1")("36", "page_1", "Angaben zur Person", [
                 make("page_1")("1", "page_1", "Pers&ouml;nliche Angaben"),
                 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")
-            ]),
+            ], fname="info-1"),
             make("page_2")("2", "page_5", "Biographische Daten", [
                 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_7")("8", "page_7", "Weiterer Verlauf", fname="info-7")
+            ], fname="info-2"),
             make("page_8")("9", "page_8", "Case-Management", [
                 make("page_8")("10", "page_8", "Kompetenzfeststellung", [
                     make("page_8")("11", "page_8", "Verfahren"),
@@ -185,11 +190,11 @@
                         make("page_9")("31", "page_9", "Fachkompetenzen"),
                         make("page_26")("32", "page_26", "Methodenkompetenzen"),
                         make("page_27")("33", "page_27", "Sprachen und Kommunikation"),
-                        make("page_28")("34", "page_28", "Sozial und Selbstkompetenzen"),
-                    ]),
+                        make("page_28")("34", "page_28", "Sozial und Selbstkompetenzen")
+                    ], fname="info-9"),
                     make("page_29")("35", "page_29", "Dokumentation")
                 ]),
-                make("page_10")("13", "page_10", "F&ouml;rderplanung"),
+                make("page_10")("13", "page_10", "F&ouml;rderplanung", fname="info-14"),
                 make("rg_unterstuetzungsangebote")("14", "rg_unterstuetzungsangebote", "Unterst&uuml;tzungsangebote", [
                     make("page_21")("27", "page_21", "Angebot im Bereich BB", None, False),
                     make("page_22")("28", "page_22", "Angebot im Bereich BV", None, False),
@@ -197,7 +202,7 @@
                     make("page_24")("30", "page_24", "Angebot im Bereich LB", None, False)
                 ]),
                 make("page_15")("18", "page_15", "Freie Dokumentation")
-            ]),
+            ], fname="info-8"),
             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", [
@@ -206,7 +211,7 @@
                     make("page_19")("24", "page_19", "Einsch&auml;tzung des Case-Managers")
                 ]),
                 make("page_20")("25", "page_20", "Freie Dokumentation")
-            ])
+            ], fname="info-20")
         ]
         self.buildParents(self.children)
 
@@ -229,7 +234,6 @@
 
     def getTreeItem(self, key):
         stack = [self.children]
-
         while stack:
             children = stack.pop()
             for c in children:
@@ -237,9 +241,8 @@
                     return c
                 if c.children:
                     stack.append(c.children)
+        return None
 
-        raise HTTPNotFound()
-
     def getHeaders(self, key):
         headers = []
         ti = self.getTreeItem(key)
@@ -248,7 +251,7 @@
         # actually rendered
         ti = self.getTreeItemByPageName(ti.page)
         while True:
-            headers.append(ti.description)
+            headers.append((ti.description, getHelp(ti.formed_name)))
             if not ti.parent: break
             ti = ti.parent
         headers.reverse()

Modified: trunk/waskaweb/model/nodecomponents.py
===================================================================
--- trunk/waskaweb/model/nodecomponents.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/nodecomponents.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -234,6 +234,13 @@
                 return child
         return None
 
+    def findByName(self, name):
+        if self.root:
+            for nc in self.root.walk():
+                if name == nc.getName():
+                    return nc
+        return None
+
     def findByClassAndName(self, clazz, name=None):
         if self.root:
             for nc in self.root.walk():

Modified: trunk/waskaweb/model/repeatgroup.py
===================================================================
--- trunk/waskaweb/model/repeatgroup.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/repeatgroup.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -25,12 +25,15 @@
 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)"""
+
 LOAD_RG_BILDEN_DS = """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"""
 
-LOAD_RG_BERUF_DS = """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"""
-LOAD_RG_QUALI_DS= """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"""
-LOAD_RG_LEBEN_DS= """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"""
+LOAD_RG_BERUF_DS = """SELECT r.id, r.angebotsform_1 as form, t.value as type, r.durchfuehrende_institution_1 as institute, r.unterstuetzung_start_1 as start, r.unterstuetzung_ende_1 as end FROM rg_angebote_berufsvorbereitung_tbl_view r JOIN art_der_unterstuetzung_1_tbl t ON r.art_der_unterstuetzung_1 = t.id WHERE r.id = %s"""
 
+LOAD_RG_QUALI_DS= """SELECT r.id, angebotsform_2 as form, t.value as type, durchfuehrende_institution_2 as institute, unterstuetzung_start_2 as start, unterstuetzung_ende_2 as end FROM rg_angebote_berufliche_qualifizierung_tbl_view r JOIN angebote_im_bereich_tbl t on r.angebote_im_bereich = t.id  WHERE r.id = %s"""
+
+LOAD_RG_LEBEN_DS= """SELECT r.id, angebotsform_3 as form, t.value as type, durchfuehrende_institution_3 as institute, unterstuetzung_start_3 as start, unterstuetzung_ende_3 as end FROM rg_angebote_lebensbewaeltigung_tbl_view r JOIN art_der_unterstuetzung_2_tbl t ON r.art_der_unterstuetzung_2 = t.id  WHERE r.id = %s"""
+
 RG_BILDEN_DB_TBL = "rg_angebote_bildenden_bereich_tbl_view"
 RG_BERUF_DB_TBL  = "rg_angebote_berufsvorbereitung_tbl_view"
 RG_QUALI_DB_TBL  = "rg_angebote_berufliche_qualifizierung_tbl_view"
@@ -99,18 +102,20 @@
         self.start_date  = "-/-"
         self.end_date    = "-/-"
         self.instutution = "-/-"
+        self.category    = "-/-"
         self.aid_form    = "-/-"
         self.type        = "-/-"
+        self.test        = "-/-"
 
-        self.type_id     = None 
+        self.category_id     = None 
         self.page_id     = None 
 
     def load(self, id):
         r = self._load(id)
         try:
             self.id          = r[0] 
-            self.form        = unicode(str(r[1]), 'utf-8')
-            self.type_name   = unicode(str(r[2]), 'utf-8')
+            self.aid_form    = unicode(str(r[1]), 'utf-8') # Angebotsform
+            self.type        = unicode(str(r[2]), 'utf-8') # Art der Unterstützung
             self.institution = unicode(str(r[3]), 'utf-8')
             self.start_date  = dd_mm_YYYY(r[4])
             self.end_date    = dd_mm_YYYY(r[5])
@@ -174,8 +179,8 @@
 
     def __init__(self, id=None):
         AidObject.__init__(self, id)
-        self.type    = "BB"
-        self.type_id = 0 
+        self.category    = "BB"
+        self.category_id = 0 
         self.page_id = 27
 
         self.load_sql     = LOAD_RG_BILDEN_DS 
@@ -188,8 +193,8 @@
 
     def __init__(self, id=None):
         AidObject.__init__(self, id)
-        self.type    = "BV"
-        self.type_id = 1 
+        self.category    = "BV"
+        self.category_id = 1 
         self.page_id = 28
 
         self.load_sql     = LOAD_RG_BERUF_DS
@@ -202,8 +207,8 @@
 
     def __init__(self, id=None):
         AidObject.__init__(self, id)
-        self.type    = "BQ"
-        self.type_id = 2 
+        self.category    = "BQ"
+        self.category_id = 2 
         self.page_id = 29
 
         self.load_sql     = LOAD_RG_QUALI_DS 
@@ -216,8 +221,8 @@
 
     def __init__(self, id=None):
         AidObject.__init__(self, id)
-        self.type    = "LB"
-        self.type_id = 3 
+        self.category    = "LB"
+        self.category_id = 3 
         self.page_id = 30 
 
         self.load_sql     = LOAD_RG_LEBEN_DS 

Modified: trunk/waskaweb/model/user.py
===================================================================
--- trunk/waskaweb/model/user.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/model/user.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -275,6 +275,21 @@
     def isAdmin(self):
         return (self.getRole() == "Admin-KA")
 
+    def shortenedName(self):
+        name = []
+        if self.last_name:
+            name.append(self.last_name)
+
+        if self.first_name:
+            name.append(", ")
+            name.append(self.first_name[0])
+            name.append(".")
+
+        if not name: return ""
+
+        return "".join(name)
+        
+
 class SessionUser(User):
     def __init__(self, lname, password):
         User.__init__(self, None) 

Added: trunk/waskaweb/public/images/agplv3-155x51.png
===================================================================
(Binary files differ)


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

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


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

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


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

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


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

Added: trunk/waskaweb/public/servicezeit.html
===================================================================
--- trunk/waskaweb/public/servicezeit.html	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/public/servicezeit.html	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+    <head>
+        <title>Wartungsarbeiten auf dem WASKA-System</title>
+    </head>
+    <body>
+        <center><h1>Wartungsarbeiten auf dem WASKA-System</h1>
+        Zur Zeit finden Wartungsarbeiten auf dem WASKA-System statt.<br>
+        Das System wird Ihnen bald wieder zur Verf&uuml;gung stehen.
+        </center>
+    </body>
+</html>

Modified: trunk/waskaweb/public/styles/all.css
===================================================================
--- trunk/waskaweb/public/styles/all.css	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/public/styles/all.css	2008-08-13 13:15:49 UTC (rev 56)
@@ -99,6 +99,10 @@
 .table_checkbox {
 	width: 1.5em;
 }
+
+table#searchoptiontable { 
+	width: 30em;
+}
 /*----------------------*/
 /* 2. Evaluation Formats*/
 /*----------------------*/
@@ -270,7 +274,7 @@
 	float:left;
 }
 
-#appointment #waska_form .w25 input, #appointment #waska_form .w50 input, #appointment #waska_form .w75 input {
+#appointment #waska_form .w25 input, #appointment #waska_form .w50 input, #appointment #waska_form .w75 input, #appointment #waska_form .w100 input {
 	margin-top:0;
 }
 
@@ -328,26 +332,65 @@
 /*---------------------------*/
 
 .w100{
-        width: 100%;
+        width: 99%;
+	margin-left:0.25%;
+	margin-right:0.25%;
 }
 
 .w75 {
-        width: 75%;
+        width: 74%;
+	margin-left:0.25%;
+	margin-right:0.25%;
 }
 
+.w60 {
+        width: 59%;
+	margin-left:0.25%;
+	margin-right:0.25%;
+}
+
+.w55 {
+        width: 54%;
+	margin-left:0.25%;
+	margin-right:0.25%;
+}
+
 .w50 {
-        width: 50%;
+        width: 49%;
+	margin-left:0.25%;
+	margin-right:0.25%;
 }
 
-.w25 {
-        width: 25%;
+.w45 {
+        width: 44%;
+	margin-left:0.25%;
+	margin-right:0.25%;
 }
 
+.w40 {
+        width: 39%;
+	margin-left:0.25%;
+	margin-right:0.25%;
+}
+
 .w30 {
-	width:30%;
-	margin-right:0.4em;
+	width: 29%;
+	margin-left:0.25%;
+	margin-right:0.25%;
 }
 
+.w25 {
+        width: 24%;
+	margin-left:0.25%;
+	margin-right:0.25%;
+}
+
+.w15 {
+        width: 14%;
+	margin-left:0.25%;
+	margin-right:0.25%;
+}
+
 .waska_form div.w100 br {
         clear:both;
 }

Modified: trunk/waskaweb/public/styles/color3.css
===================================================================
--- trunk/waskaweb/public/styles/color3.css	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/public/styles/color3.css	2008-08-13 13:15:49 UTC (rev 56)
@@ -47,6 +47,14 @@
 }
 
 #navipath { background-color: #bec3c3; }
+
+div#status_str span.redcolor {
+	color: #a5103b;
+}
+div#status_str_nofloat span.redcolor {
+	color: #a5103b;
+}
+
 	
 /*------------------*/
 /* 3.	Navigation  */

Modified: trunk/waskaweb/public/styles/ie6.css
===================================================================
--- trunk/waskaweb/public/styles/ie6.css	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/public/styles/ie6.css	2008-08-13 13:15:49 UTC (rev 56)
@@ -65,3 +65,67 @@
 	margin:0;
 	padding:0;
 }
+
+/*---------------------------*/
+/* 4. Grouping form elements */
+/*---------------------------*/
+
+.w100{
+        width: 98%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w75 {
+        width: 73%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w60 {
+        width: 58%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w55 {
+        width: 53%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w50 {
+        width: 48%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w45 {
+        width: 43%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w40 {
+        width: 38%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w30 {
+	width: 28%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w25 {
+        width: 23%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}
+
+.w15 {
+        width: 13%;
+	margin-left:0.5%;
+	margin-right:0.5%;
+}

Modified: trunk/waskaweb/public/styles/print.css
===================================================================
--- trunk/waskaweb/public/styles/print.css	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/public/styles/print.css	2008-08-13 13:15:49 UTC (rev 56)
@@ -99,7 +99,7 @@
 }
 
 .menu h1, .menu li a, .menu ul, #navipath, #startmenu, #statusbar,
-#modusfield, #logo, .help, #footer, .skiplink, .table_action, .print_menu_header{
+#modusfield, #logo, .help, #footer, .skiplink, .table_action, .print_menu_header, #status_str_nofloat {
 	display: none;
 }
 

Modified: trunk/waskaweb/public/styles/screen.css
===================================================================
--- trunk/waskaweb/public/styles/screen.css	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/public/styles/screen.css	2008-08-13 13:15:49 UTC (rev 56)
@@ -104,6 +104,17 @@
 	margin-right: 0.25em;
 }
 
+img.sorticon {
+	vertical-align: middle;
+	border: 0;
+}
+
+img.smallicon {
+	vertical-align: middle;
+	border: 0;
+	margin-right: 0.25em;
+}
+
 img.link_img {
 	vertical-align: middle;
 	border: 0;
@@ -161,11 +172,19 @@
 	font-size: 10pt;
 }
 
-div#footer p {
+div#version_str {
 	font-size:0.7em;
 }
 
+div#status_str {
+	float: left;
+	font-size:0.7em;
+}
+div#status_str_nofloat {
+	font-size:0.7em;
+}
 
+
 /*-----------*/
 /* 3. Header */
 /*-----------*/
@@ -675,7 +694,7 @@
 }
 
 #search_criteria {
-	margin:0.2em 0 1em 0em;
+	margin:0.2em 0 0.5em 0em;
 }
 
 #search_criteria label{

Modified: trunk/waskaweb/templates/appointments/appointmentlist.mako
===================================================================
--- trunk/waskaweb/templates/appointments/appointmentlist.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/appointments/appointmentlist.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,10 +1,7 @@
 <%inherit file="/appointments/overview_body.mako" />
 <%def name="showAppointmentActions(appointment)">
-<a href="${h.url_for(controller='/appointment', action='show', id=appointment.id)}">
-  <img src="/images/icons/view_red.gif" border="0" alt="${_('cm_overview_a_show')}" title="${_('cm_overview_a_show')}"></a>
+<a href="${h.url_for(controller='/appointment', action='show', id=appointment.id)}"><img src="/images/icons/view_red.gif" border="0" alt="${_('cm_overview_a_show')}" title="${_('cm_overview_a_show')}"></a>
 % if h.hasRole(['admin_ka']):
-  <a href="${h.url_for(controller='/appointment', action='delete', id=appointment.id, confirmed=0)}">
-    <img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}">
-  </a>
+  <a href="${h.url_for(controller='/appointment', action='delete', id=appointment.id, confirmed=0)}"><img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}"></a>
 % endif
 </%def>

Modified: trunk/waskaweb/templates/appointments/overview.mako
===================================================================
--- trunk/waskaweb/templates/appointments/overview.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/appointments/overview.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -17,5 +17,4 @@
   </div>
   % endif
 </div>
-<p>${_('app_con_list_all_appointments')}</p> 
 <%include file="/appointments/appointmentlist.mako" />

Modified: trunk/waskaweb/templates/appointments/remindlist_body.mako
===================================================================
--- trunk/waskaweb/templates/appointments/remindlist_body.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/appointments/remindlist_body.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -12,6 +12,9 @@
     <td class="title">${appointment.title | F.NA, h}</td>
     <td class="action">
      ${self.showAppointmentActions(appointment)}
+     % if h.hasRole('cm_ka'):
+      ${self.showKeepActiveActions(appointment)}
+    % endif
     </td>
   </tr>
   <tr>
@@ -25,3 +28,10 @@
   </tr>
   % endif
 </table>
+
+<%def name="showAppointmentActions(appointment)">
+## Default function 
+</%def>
+<%def name="showKeepActiveActions(appointment)">
+## Default function 
+</%def>

Modified: trunk/waskaweb/templates/casemanagement/agency_overview.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/agency_overview.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/agency_overview.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -7,34 +7,7 @@
   <li><a href="/case_overview">${_('cm_np_overview')}</a></li>
 </%def>
 <h1>${_('cm_header_overview')}</h1>
-##<div id="search_field">
-##  <form method="post" name="case_search" action="/case_overview/search/">
-##  <div>
-##    <input type="text" size="30" name="search_str">
-##    % if h.hasRole(['admin_ka']):
-##    <select name="editor">
-##      <option value="-1">Alle Benutzer</option>
-##    % for user in c.userlist:
-##      <option value="${user.id}">${user.last_name | h}, ${user.first_name | h}</option>
-##    % endfor
-##    </select>
-##    % endif
-##    <input type="submit" value="${_('cm_form_overview_search_submit')}">
-##  </div>
-##  <div id="search_criteria">
-##    <strong>Suchfilter:</strong>
-##    % if h.hasRole(['cm_ka']):
-##    <input type="checkbox" name="show_own" id="show_own" value="1" checked="checked"><label for="show_own"><img title="Eigene Fallakten" alt="Bearbeiter"  src="/images/icons/editor_grey.gif">Eigene</label>
-##    <input type="checkbox" name="show_other" id="show_other" value="1" checked="checked"><label for="show_other"><img title="Vertreter Fallakten" alt="Vertreter"  src="/images/icons/stand-in_grey.gif">Vertretung</label>
-##    % endif
-##    <input type="checkbox" name="show_open" id="show_open" value="1" checked="checked"><label for="show_open"><img title="Offene Fallakten" alt="Offene" src="/images/icons/work_in_progress_grey.gif">Offen</label>
-##    <input type="checkbox" name="show_closed" id="show_closed" value="1" checked="checked"><label for="show_closed"><img title="Geschlossene Fallakten" alt="Geschlossene" src="/images/icons/done_grey.gif">Geschlossen</label>
-##    % if h.hasRole(['admin_ka']):
-##    <input type="checkbox" name="show_markdelete" id="show_markdelete" value="1" checked="checked"><label for="show_markdelete"><img title="Zu löschende Fallakten" alt="Schwebend Gelöscht" src="/images/icons/delete_grey.gif">Schwebend gelöscht</label>
-##% endif
-##  </div>
-##</form>
-##</div>
+<%include file="/casemanagement/agency_search.mako" />
 <div class="waska_form">
   ${h.form(h.url(action='bundleAction'), method='post')}
   <%include file="./agencylist.mako" />
@@ -48,6 +21,7 @@
       <option value="exportXLS">Auswahl als Excel-Tabellen exportieren</option>
       <option value="exportXML">Auswahl als XML-Datei exportieren</option>
       <option value="exportCSV">Auswahl als CSV-Datei exportieren</option>
+      <option value="evaluate">Auswahl auswerten</option>
     </select>
   </div>
   <div class="waska_form_element w50">

Added: trunk/waskaweb/templates/casemanagement/agency_search.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/agency_search.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/agency_search.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,58 @@
+## -*- coding: utf-8 -*-
+<div id="search_field">
+  <form method="post" name="agency_search" action="/agency_overview/search/">
+  <div class="search_criteria">
+    <h3>Suche</h3>
+    <table>
+      <tr>
+        <td width="80" valign="top"><label for="gender">Geschlecht:</label></td>
+        <td valign="top">
+          <select name="gender" id="gender">
+            <option value="-2">Alle</option>
+            <option value="0">Weiblich</option>
+            <option value="1">Männlich</option>
+            <option value="2">Intersexuel</option>
+            <option value="-1">Kein Angabe</option>
+          </select>
+        </td>
+      </tr>
+      <tr>
+        <td width="80" valign="top"><label for="cm_state">CM-Status:</label></td>
+        <td valign="top">
+          <select name="cm_state" id="cm_state">
+            <option value="1">Alle</option>
+            <option value="2">Beratungskunde</option>
+            <option value="3">CM-Kunde</option>
+            <option value="4">CM-Abgeschlossen</option>
+          </select>
+        </td>
+      </tr>
+      <tr>
+        <td width="80" valign="top"><label for="quarter">Zeitraum:</label></td>
+        <td valign="top">
+          <select name="quarter" id="quarter">
+            <option value="-1">Keine Auswahl</option>
+            <option value="1">1. Quartal</option>
+            <option value="2">2. Quartal</option>
+            <option value="3">3. Quartal</option>
+            <option value="4">4. Quartal</option>
+          </select>
+          <select name="year">
+            <option value="-1">Keine Auswahl</option>
+            <option value="2006">2006</option>
+            <option value="2007">2007</option>
+            <option value="2008">2008</option>
+            <option value="2009">2009</option>
+            <option value="2010">2010</option>
+            <option value="2011">2011</option>
+            <option value="2012">2012</option>
+          </select>
+        </td>
+      </tr>
+    </table>
+  </div>
+  <div>
+    <input type="submit" value="${_('cm_form_overview_search_submit')}">
+  </div>
+  </form>
+</div>

Modified: trunk/waskaweb/templates/casemanagement/agencylist.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/agencylist.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/agencylist.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -3,9 +3,18 @@
 <table>
   <tr>
     <th class="table_header_h table_checkbox">&nbsp;</th>
-    <th class="table_id table_header_h">${_('cm_overview_tbl_header_fkz')}</th>
-    <th class="table_name table_header_h">${_('cm_overview_tbl_header_number_cases')}</th>
-    <th class="table_name table_header_h">${_('cm_overview_tbl_header_last_update')}</th>
+    <th class="table_id table_header_h">${_('cm_overview_tbl_header_fkz')}
+      <a href="/agency_overview/overview/0/fkz/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+      <a href="/agency_overview/overview/0/fkz/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+    </th>
+    <th class="table_name table_header_h">${_('cm_overview_tbl_header_number_cases')}
+      <a href="/agency_overview/overview/0/num_cases/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+      <a href="/agency_overview/overview/0/num_cases/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+    </th>
+    <th class="table_name table_header_h">${_('cm_overview_tbl_header_last_update')}
+      <a href="/agency_overview/overview/0/zugriff/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+      <a href="/agency_overview/overview/0/zugriff/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+    </th>
     <th class="table_action table_header_h">${_('cm_overview_tbl_header_actions')}</th>
   </tr>
   <% idset = True %>

Modified: trunk/waskaweb/templates/casemanagement/appointmentlist.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/appointmentlist.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/appointmentlist.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,10 +1,7 @@
 <%inherit file="/appointments/overview_body.mako" />
 <%def name="showAppointmentActions(appointment)">
-<a href="${h.url_for(controller='/case', action='showAppointment', id=appointment.id)}">
-  <img src="/images/icons/view_red.gif" border="0" alt="${_('cm_overview_a_show')}" title="${_('cm_overview_a_show')}"></a>
+<a href="${h.url_for(controller='/case', action='showAppointment', id=appointment.id)}"><img src="/images/icons/view_red.gif" border="0" alt="${_('cm_overview_a_show')}" title="${_('cm_overview_a_show')}"></a>
 % if h.hasRole(['cm_ka']):
-  <a href="${h.url_for(controller='/case', action='deleteAppointment', id=appointment.id, confirmed=0)}">
-    <img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}">
-  </a>
+  <a href="${h.url_for(controller='/case', action='deleteAppointment', id=appointment.id, confirmed=0)}"><img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}"></a>
 % endif
 </%def>

Modified: trunk/waskaweb/templates/casemanagement/caselist.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/caselist.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/caselist.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -3,13 +3,29 @@
 <table>
   <tr>
     <th class="table_header_h table_checkbox">&nbsp;</th>
-    <th class="table_id table_header_h">${_('cm_overview_tbl_header_id')}</th>
-    <th class="table_name table_header_h">${_('cm_overview_tbl_header_lastname')}</th>
-    <th class="table_name table_header_h">${_('cm_overview_tbl_header_firstname')}</th>
+    <th class="table_id table_header_h">${_('cm_overview_tbl_header_id')}
+      <a href="/case_overview/overview/0/kundennummer/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+      <a href="/case_overview/overview/0/kundennummer/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+    </th>
+    <th class="table_name table_header_h">${_('cm_overview_tbl_header_lastname')}
+      <a href="/case_overview/overview/0/name_1/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+      <a href="/case_overview/overview/0/name_1/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+    </th>
+    <th class="table_name table_header_h">${_('cm_overview_tbl_header_firstname')}
+      <a href="/case_overview/overview/0/vorname_1/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+      <a href="/case_overview/overview/0/vorname_1/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+    </th>
     % if h.hasRole(['admin_ka']):
-      <th class="table_name table_header_h">${_('cm_overview_tbl_header_editor')}</th>
+      <th class="table_name table_header_h">${_('cm_overview_tbl_header_editor')}
+        <a href="/case_overview/overview/0/bearbeiter_id/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+        <a href="/case_overview/overview/0/bearbeiter_id/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+      </th>
     % else:
-      <th class="table_name table_header_h">${_('cm_overview_tbl_header_accesstime')}</th>
+      <th class="table_name table_header_h">${_('cm_overview_tbl_header_accesstime')}
+        <a href="/case_overview/overview/0/zugriff/asc"><img class="sorticon" src="/images/icons/sort_asc.png"></a> 
+        <a href="/case_overview/overview/0/zugriff/desc"><img class="sorticon" src="/images/icons/sort_desc.png"></a> 
+      
+      </th>
     % endif
     <th class="table_status table_header_h">${_('cm_overview_tbl_header_status')}</th>
     <th class="table_action table_header_h">${_('cm_overview_tbl_header_actions')}</th>
@@ -43,6 +59,8 @@
             <img src="/images/icons/done_grey.gif" border="0" alt="${_('case_state_label_closed')}" title="${_('case_state_label_closed')}">
           % elif case.getState().getState() == 3:
             <img src="/images/icons/delete_grey.gif" border="0" alt="${_('case_state_label_delete')}" title="${_('case_state_label_delete')}">
+          % elif case.getState().getState() == 4:
+            <img src="/images/icons/anonym.gif" border="0" alt="${_('case_state_label_markanonym')}" title="${_('case_state_label_markanonym')}">
           % elif case.getState().getState() == 5:
             <img src="/images/icons/anonym.gif" border="0" alt="${_('case_state_label_anonym')}" title="${_('case_state_label_anonym')}">
           % endif
@@ -55,10 +73,14 @@
             % if case.getState().getState() in (3,5):
               <a href="/case/delete/${case.id}/0/"><img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}"></a>
             % endif
-            % if case.getState().getState() == 3:
+            % if case.getState().getState() == 4:
+              <a href="/case/anonymize/${case.id}/0/"><img src="/images/icons/anonym_red.gif" border="0" alt="${_('cm_overview_a_anonymize')}" title="${_('cm_overview_a_anonymize')}"></a>
+            % endif
+            % if case.getState().getState() in (3,4):
               <a href="/case/restore/${case.id}/0/"><img src="/images/icons/recover_red.gif" border="0" alt="${_('cm_overview_a_restore')}" title="${_('cm_overview_a_restore')}"></a>
             % endif
           % elif h.hasRole(['cm_ka']) and case.getState().getState() in (1,2):
+            <a href="/case/markForAnonymize/${case.id}/0/"><img src="/images/icons/anonym_red.gif" border="0" alt="${_('cm_overview_a_anonymize')}" title="${_('cm_overview_a_anonymize')}"></a> 
             <a href="/case/markForDelete/${case.id}/0/"><img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}"></a> 
           % endif
         </td>
@@ -90,6 +112,8 @@
             <img src="/images/icons/done_grey.gif" border="0" alt="${_('case_state_label_closed')}" title="${_('case_state_label_closed')}">
           % elif case.getState().getState() == 3:
             <img src="/images/icons/delete_grey.gif" border="0" alt="${_('case_state_label_delete')}" title="${_('case_state_label_delete')}">
+          % elif case.getState().getState() == 4:
+            <img src="/images/icons/anonym.gif" border="0" alt="${_('case_state_label_markanonym')}" title="${_('case_state_label_markanonym')}">
           % elif case.getState().getState() == 5:
             <img src="/images/icons/anonym.gif" border="0" alt="${_('case_state_label_anonym')}" title="${_('case_state_label_anonym')}">
           % endif
@@ -102,10 +126,14 @@
             % if case.getState().getState() in (3, 5):
               <a href="/case/delete/${case.id}/0/"><img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}"></a>
             % endif
-            % if case.getState().getState() == 3:
+            % if case.getState().getState() == 4:
+              <a href="/case/anonymize/${case.id}/0/"><img src="/images/icons/anonym_red.gif" border="0" alt="${_('cm_overview_a_anonymize')}" title="${_('cm_overview_a_anonymize')}"></a>
+            % endif
+            % if case.getState().getState() in (3,4):
               <a href="/case/restore/${case.id}/0/"><img src="/images/icons/recover_red.gif" border="0" alt="${_('cm_overview_a_restore')}" title="${_('cm_overview_a_restore')}"></a>
             % endif
           % elif h.hasRole(['cm_ka']) and case.getState().getState() in (1, 2):
+            <a href="/case/markForAnonymize/${case.id}/0/"><img src="/images/icons/anonym_red.gif" border="0" alt="${_('cm_overview_a_anonymize')}" title="${_('cm_overview_a_anonymize')}"></a> 
             <a href="/case/markForDelete/${case.id}/0/"><img src="/images/icons/delete_red.gif" border="0" alt="${_('cm_overview_a_delete')}" title="${_('cm_overview_a_delete')}"></a>
           % endif
         </td>

Modified: trunk/waskaweb/templates/casemanagement/dialogs/confirm_anonymize.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/confirm_anonymize.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/dialogs/confirm_anonymize.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,8 +1,8 @@
 ## -*- coding: utf-8 -*- 
-<%inherit file="/casemanagement/main.mako" />
+<%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/select/${c.ds_id}/1">${_('cm_np_select')}</a></li>
   <li><a href="#">${_('cm_np_anonymize')}</a></li>
 </%def>
 <%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/dialogs/confirm_bundle_anonymize.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -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_anonymize')}</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/dialogs/confirm_markanonymize.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,8 @@
+## -*- 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="#">${_('cm_np_anonymize')}</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/failed_markanonymize.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/failed_markanonymize.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/dialogs/failed_markanonymize.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,7 @@
+## -*- coding: utf-8 -*- 
+<%inherit file="/main.mako" />
+<%def name="buildNavipath()">
+  ${parent.buildNavipath()}
+  <li><a href="#">${_('cm_np_anonymize')}</a></li>
+</%def>
+<%include file="../../dialogs/failed.mako" />

Modified: trunk/waskaweb/templates/casemanagement/dialogs/success_anonymize.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/success_anonymize.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/dialogs/success_anonymize.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,8 +1,8 @@
 ## -*- coding: utf-8 -*- 
-<%inherit file="/casemanagement/main.mako" />
+<%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/select/${c.ds_id}/1">${_('cm_np_select')}</a></li>
   <li><a href="#">${_('cm_np_anonymize')}</a></li>
 </%def>
 <%include file="../../dialogs/success.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/dialogs/success_bundle_anonymize.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -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_anonymize')}</a></li>
+</%def>
+<%include file="../../dialogs/success.mako" />

Added: trunk/waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/dialogs/success_markanonymize.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,8 @@
+## -*- 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="#">${_('cm_np_anonymize')}</a></li>
+</%def>
+<%include file="../../dialogs/success.mako" />

Modified: trunk/waskaweb/templates/casemanagement/downloadCSV.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/downloadCSV.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/downloadCSV.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -11,18 +11,38 @@
 
 <h1><img src="/images/confirmation.png" alt="Erledigt"/>${c.success_for | F.NA, h}</h1>
 
-<div class="export_box_dialog">
+<div class="export_box_dialog error_font">
 <strong>Achtung:</strong> Diese CSV-Datei ist für das Öffnen in verschiedenen
 Office-Produkten z.B. Microsoft-Excel nicht geeignet. Weitere Details
 hierzu lesen Sie bitte im WASKA-Anwendungshandbuch nach.
 </div>
-<div class="export_box_dialog">
-<p class="export_p"><strong class="export_number">1. </strong> CSV-Datei herunterladen:
-<a class="button export1" href="${c.download_link}/fallakten-export.csv">Herunterladen</a></p>
+
+%if not c.isEvaluationServer:
+<div class="import_p">
+Bitte beachten Sie, dass Sie ggf. personenbezogene Daten exportieren,
+wenn Sie diese nicht mit dem Haken 'Daten anoymisiert exportieren' exportieren.
+Ihnen obliegt somit die Einhaltung der jeweiligen Datenschutzbestimmungen.
 </div>
 
-<div class="export_box_dialog">
-<p class="export_p"><strong class="export_number">2.</strong> Zur Übersicht zurückkehren:
-<a class="button export" href="${c.overview_link}">Übersicht</a></p>
+<div class="import_box_dialog">
+
+    <form method="GET" action="${c.download_link}" accept-charset="UTF-8">
+        <p class="export_p"><label for="anonymize"><strong class="import_number">1.</strong> <input id="anonymize" name="anonymize" type="checkbox" value="1" checked>
+        Daten anonymisiert exportieren.</label></p>
+        <p class="export_p"><strong class="import_number">2. </strong> CSV-Datei herunterladen:
+        <input type="submit" id="button" value="Herunterladen"></p>
+    </form>
+
+    <p class="export_p"><strong class="import_number">3.</strong> Zur Übersicht zurückkehren:
+    <a class="button export" href="${c.overview_link}">Übersicht</a></p>
 </div>
+%else:
+<div class="import_box_dialog">
 
+    <p class="export_p"><strong class="import_number">1. </strong> CSV-Datei herunterladen:
+    <a class="button export" href="${c.download_link}">Herunterladen</a></p>
+
+    <p class="export_p"><strong class="import_number">2.</strong> Zur Übersicht zurückkehren:
+    <a class="button export" href="${c.overview_link}">Übersicht</a></p>
+</div>
+%endif

Modified: trunk/waskaweb/templates/casemanagement/downloadXLS.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/downloadXLS.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/downloadXLS.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -11,13 +11,33 @@
 
 <h1><img src="/images/confirmation.png" alt="Erledigt"/>${c.success_for | F.NA, h}</h1>
 
-<div class="export_box_dialog">
-<p class="export_p"><strong class="export_number">1. </strong> XLS-Datei herunterladen:
-<a class="button export1" href="${c.download_link}/fallakten-export.xls">Herunterladen</a></p>
+%if not c.isEvaluationServer:
+
+<div class="import_p">
+Bitte beachten Sie, dass Sie ggf. personenbezogene Daten exportieren,
+wenn Sie diese nicht mit dem Haken 'Daten anoymisiert exportieren' exportieren.
+Ihnen obliegt somit die Einhaltung der jeweiligen Datenschutzbestimmungen.
 </div>
 
-<div class="export_box_dialog">
-<p class="export_p"><strong class="export_number">2.</strong> Zur Übersicht zurückkehren:
-<a class="button export" href="${c.overview_link}">Übersicht</a></p>
+<div class="import_box_dialog">
+
+    <form method="GET" action="${c.download_link}" accept-charset="UTF-8">
+        <p class="export_p"><label for="anonymize"><strong class="import_number">1.</strong> <input id="anonymize" name="anonymize" type="checkbox" value="1" checked>
+        Daten anonymisiert exportieren.</label></p>
+        <p class="export_p"><strong class="import_number">2. </strong> XLS-Datei herunterladen:
+        <input type="submit" id="button" value="Herunterladen"></p>
+    </form>
+
+    <p class="export_p"><strong class="import_number">3.</strong> Zur Übersicht zurückkehren:
+    <a class="button export" href="${c.overview_link}">Übersicht</a></p>
 </div>
+%else: 
+<div class="import_box_dialog">
 
+    <p class="export_p"><strong class="import_number">1. </strong> XLS-Datei herunterladen:
+    <a class="button export" href="${c.download_link}">Herunterladen</a></p>
+
+    <p class="export_p"><strong class="import_number">2.</strong> Zur Übersicht zurückkehren:
+    <a class="button export" href="${c.overview_link}">Übersicht</a></p>
+</div>
+%endif

Modified: trunk/waskaweb/templates/casemanagement/downloadXML.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/downloadXML.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/downloadXML.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -11,13 +11,54 @@
 
 <h1><img src="/images/confirmation.png" alt="Erledigt"/>${c.success_for | F.NA, h}</h1>
 
-<div class="export_box_dialog">
-<p class="export_p"><strong class="export_number">1. </strong> XML-Datei herunterladen:
-<a class="button export1" href="${c.download_link}/fallakten-export.xml">Herunterladen</a></p>
+%if not c.isEvaluationServer:
+
+<p class="import_p">
+Bitte beachten Sie, dass Sie ggf. personenbezogene Daten exportieren,
+wenn Sie diese nicht mit dem Haken 'Daten anoymisiert exportieren' exportieren.
+Ihnen obliegt somit die Einhaltung der jeweiligen Datenschutzbestimmungen.
+</p>
+
+<div class="import_box_dialog">
+
+    <p class="import_p">
+        <strong class="import_number">1.</strong> Aktenbereiche ausw&auml;hlen:<br>
+    <span class="note">
+    % if c.is_all_selected:
+        Zur Zeit sind alle Bereiche ausgewählt.
+    % else:
+        Zur Zeit sind nur Teilbereiche ausgewählt.
+    % endif
+    </span>
+    <a class="button import" href="${c.selection_link}">Ausw&auml;hlen</a></p>
+
+    <form method="GET" action="${c.download_link}" accept-charset="UTF-8">
+        <p><label for="anonymize"><strong class="import_number">2.</strong> <input id="anonymize" name="anonymize" type="checkbox" value="1" checked>
+        Daten anonymisiert exportieren.</label></p>
+        <p class="import_p"><strong class="import_number">3. </strong> XML-Datei herunterladen:
+        <input type="submit" id="button" value="Herunterladen"></p>
+    </form>
+    <p class="import_p"><strong class="export_number">4.</strong> Zur Übersicht zurückkehren:
+    <a class="button import" href="${c.overview_link}">Übersicht</a></p>
 </div>
+%else:
+<div class="import_box_dialog">
 
-<div class="export_box_dialog">
-<p class="export_p"><strong class="export_number">2.</strong> Zur Übersicht zurückkehren:
-<a class="button export" href="${c.overview_link}">Übersicht</a></p>
+    <p class="import_p">
+        <strong class="import_number">1.</strong> Aktenbereiche ausw&auml;hlen:<br>
+    <span class="note">
+    % if c.is_all_selected:
+        Zur Zeit sind alle Bereiche ausgewählt.
+    % else:
+        Zur Zeit sind nur Teilbereiche ausgewählt.
+    % endif
+    </span>
+    <a class="button import" href="${c.selection_link}">Ausw&auml;hlen</a></p>
+
+    <p class="import_p"><strong class="import_number">2. </strong> XML-Datei herunterladen:
+    <a class="button import" href="${c.download_link}">Herunterladen</a></p>
+
+    <p class="import_p"><strong class="import_number">3.</strong> Zur Übersicht zurückkehren:
+    <a class="button import" href="${c.overview_link}">Übersicht</a></p>
 </div>
-
+%endif

Modified: trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_1.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -4,14 +4,45 @@
 <%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>
+  <li><a href="/evaluate/evaluate/1/1">${_('cm_np_evaluate_result')}</a></li>
 </%def>
-<h1><a name="top">${_('cm_header_evaluate_result')}</a></h1>
+<h1><a name="top">${_('cm_header_evaluate_result')}</a>${h.getHelp('cm_evaluate_result_note')}</h1>
+% if not session.get('hide_search_option_on_eval', False):
+<h2>Zeitraum angeben</h2>
+  <div id="search_field">
+    <form method="post" name="case_search" action="/evaluate/search/">
+    <input type="hidden" name="eval_id" value="1">
+    <div>
+      Zeitraum:
+      <select name="quarter">
+        <option value="-1">Keine Auswahl</option>
+        <option value="1">1. Quartal</option>
+        <option value="2">2. Quartal</option>
+        <option value="3">3. Quartal</option>
+        <option value="4">4. Quartal</option>
+      </select>
+      Jahr:
+      <select name="year">
+        <option value="-1">Keine Auswahl</option>
+        <option value="2006">2006</option>
+        <option value="2007">2007</option>
+        <option value="2008">2008</option>
+        <option value="2009">2009</option>
+        <option value="2010">2010</option>
+        <option value="2011">2011</option>
+        <option value="2012">2012</option>
+      </select>
+      <input type="submit" value="Auswerten">
+      ${h.getHelp('help_eval_search_criteria')} 
+    </div>
+    </form>
+  </div>
+% endif
 <h2>${_('eval_group_header_all')}</h2>
 <ul>
   <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_1">${_('cm_eval_summary_header_1')}</a></li>
   <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_2">${_('cm_eval_summary_header_2')}</a></li>
+  <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_11">${_('cm_eval_summary_header_11')}</a></li>
 </ul>
 <h2>${_('eval_group_header_incm')}</h2>
 <ul>
@@ -30,7 +61,7 @@
 ${_('eval_group_note_all')}
 </p>
 <div class="evaluation odd-row first-row">
-<h3><a name="eval_1">${_('cm_eval_summary_header_1')}</a></h3>
+<h3><a name="eval_1">${_('cm_eval_summary_header_1')}</a>${h.getHelp('cm_eval_note_taken_over_to_cm')}</h3>
 <table class="evaluation">
   <tr>
     <th class="table_header_h table_width_long">${_('cm_eval_table_adolescent')}</th>
@@ -39,23 +70,29 @@
     <th class="table_header_h table_width_mid_s">&nbsp;</th>
   </tr>
   <tr>
-    <td>${_('cm_eval_table_consult_customer')}</td>
+    <td>${_('cm_eval_table_all_customer')}</td>
     <td>${c.eval_1_total| F.NA, h}</td>
     <td>(100%)</td>
     <td></td>
   </tr>
   <tr>
-    <td class="label table_row_v_12">${_('cm_eval_table_taken_over_to_cm')}</td>
-    <td class="table_row_v_12" >${c.eval_1_cm| F.NA, h}</td>
-    <td class="table_row_v_12">(${c.eval_1_percent| F.NA, h}%)</td>
+    <td class="label table_row_v_12">${_('cm_eval_table_consult_customer')}</td>
+    <td class="table_row_v_12" >${c.eval_1_ber| F.NA, h}</td>
+    <td class="table_row_v_12">(${c.eval_1_ber_percent| F.NA, h}%)</td>
     <td class="table_row_v_12 table_width_mid_s">&nbsp;</td>
   </tr>
+  <tr>
+    <td>${_('cm_eval_table_taken_over_to_cm')}</td>
+    <td >${c.eval_1_cm| F.NA, h}</td>
+    <td>(${c.eval_1_cm_percent| F.NA, h}%)</td>
+    <td>&nbsp;</td>
+  </tr>
 </table>
 <a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_1/auswertung_1_1.csv">${_('cm_eval_table_export_analysis')}</a>
 </div>
 <div class="evaluation odd-row">
 <h3><a name="eval_2">${_('cm_eval_summary_header_2')}</a></h3>
-<h4>${_('cm_eval_header_access_youngster_to_agency')}</h4>
+<h4>${_('cm_eval_header_access_youngster_to_agency')}${h.getHelp('cm_eval_note_access_youngster_to_agency')}</h4>
 <table class="evaluation">
    <tr>
     <th class="table_header_h table_width_long">${_('cm_eval_table_access')}</th>
@@ -115,4 +152,66 @@
 % endfor 
 </table>
 <a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_5/auswertung_1_2_2.csv">${_('cm_eval_table_export_analysis')}</a>
+<h4>${_('cm_eval_header_work')}</h4>
+<table class="evaluation">
+   <tr>
+    <th class="table_header_h table_width_long">${_('cm_eval_table_work')}</th>
+    <th class="table_header_h table_width_mid_s">${_('cm_eval_table_number')}</th>
+    <th class="table_header_h table_width_mid_s">${_('cm_eval_table_percent')}</th>
+    <th class="table_header_h table_width_mid_s">&nbsp;</th>
+  </tr> 
+<% idset = 0 %>
+% for r in c.eval_12.itervalues():
+  % if idset==0:
+   <tr>
+     <td>${r[0]}</td>
+     <td>${r[1]| F.NA, h}</td>
+     <td>(${r[2]| F.NA, h}%)</td>
+     <td></td>
+   </tr>
+   <% idset = 1 %>
+    % else:
+    <tr>
+      <td class="table_row_v_12 table_width_long">${r[0]}</td>
+      <td class="table_row_v_12">${r[1]| F.NA, h}</td>
+      <td class="table_row_v_12">(${r[2]| F.NA, h}%)</td>
+      <td class="table_row_v_12 table_width_mid_s ">&nbsp;</td>
+    </tr>
+    <% idset = 0 %>
+  % endif
+% endfor 
+</table>
+<a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_12/auswertung_1_2_3.csv">${_('cm_eval_table_export_analysis')}</a>
 </div>
+<div class="evaluation odd-row">
+<h3><a name="eval_11">${_('cm_eval_summary_header_11')}</a></h3>
+<table class="evaluation">
+   <tr>
+    <th class="table_header_h table_width_long">${_('cm_eval_table_graduation')}</th>
+    <th class="table_header_h table_width_mid_s">${_('cm_eval_table_number')}</th>
+    <th class="table_header_h table_width_mid_s">${_('cm_eval_table_percent')}</th>
+    <th class="table_header_h table_width_mid_s">&nbsp;</th>
+  </tr> 
+<% idset = 0 %>
+% for r in c.eval_11.itervalues():
+  % if idset==0:
+   <tr>
+     <td>${r[0]}</td>
+     <td>${r[1]| F.NA, h}</td>
+     <td>(${r[2]| F.NA, h}%)</td>
+     <td></td>
+   </tr>
+   <% idset = 1 %>
+    % else:
+    <tr>
+      <td class="table_row_v_12 table_width_long">${r[0]}</td>
+      <td class="table_row_v_12">${r[1]| F.NA, h}</td>
+      <td class="table_row_v_12">(${r[2]| F.NA, h}%)</td>
+      <td class="table_row_v_12 table_width_mid_s ">&nbsp;</td>
+    </tr>
+    <% idset = 0 %>
+  % endif
+% endfor 
+</table>
+<a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_11/auswertung_1_3.csv">${_('cm_eval_table_export_analysis')}</a>
+</div>

Modified: trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_2.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -4,14 +4,45 @@
 <%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>
+  <li><a href="/evaluate/evaluate/2/1">${_('cm_np_evaluate_result')}</a></li>
 </%def>
-<h1><a name="top">${_('cm_header_evaluate_result')}</a></h1>
+<h1><a name="top">${_('cm_header_evaluate_result')}</a>${h.getHelp('cm_evaluate_result_note')}</h1>
+% if not session.get('hide_search_option_on_eval', False):
+<h2>Zeitraum angeben</h2>
+  <div id="search_field">
+    <form method="post" name="case_search" action="/evaluate/search/">
+    <input type="hidden" name="eval_id" value="2">
+    <div>
+      Zeitraum:
+      <select name="quarter">
+        <option value="-1">Keine Auswahl</option>
+        <option value="1">1. Quartal</option>
+        <option value="2">2. Quartal</option>
+        <option value="3">3. Quartal</option>
+        <option value="4">4. Quartal</option>
+      </select>
+      Jahr:
+      <select name="year">
+        <option value="-1">Keine Auswahl</option>
+        <option value="2006">2006</option>
+        <option value="2007">2007</option>
+        <option value="2008">2008</option>
+        <option value="2009">2009</option>
+        <option value="2010">2010</option>
+        <option value="2011">2011</option>
+        <option value="2012">2012</option>
+      </select>
+      <input type="submit" value="Auswerten">
+      ${h.getHelp('help_eval_search_criteria')} 
+    </div>
+    </form>
+  </div>
+% endif;
 <h2>${_('eval_group_header_all')}</h2>
 <ul>
   <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_1">${_('cm_eval_summary_header_1')}</a></li>
   <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_2">${_('cm_eval_summary_header_2')}</a></li>
+  <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_11">${_('cm_eval_summary_header_11')}</a></li>
 </ul>
 <h2>${_('eval_group_header_incm')}</h2>
 <ul>
@@ -26,17 +57,15 @@
 </ul>
 
 <h1>${_('eval_group_header_incm')}</h1>
-<p>
-${_('eval_group_note_incm')}
-</p>
-<div class="evaluation even-row first-row"> 
+<p>${_('eval_group_note_incm')}</p>
+<div class="evaluation odd-row first-row"> 
 <h3><a name="eval_3">${_('cm_eval_summary_header_3')}</a></h3>
+<h4>${_('cm_eval_length_cm')}</h4>
 <table class="evaluation">
   <tr>
     <th class="table_header_h table_width_mid_s">${_('cm_eval_table_month')}</th>
     <th class="table_header_h table_width_mid_l">${_('cm_eval_table_completed')}</th>
     <th class="table_header_h table_width_mid_l">${_('cm_eval_table_aborted')}</th>
-    <th class="table_header_h table_width_mid_s" >&nbsp;</th>
   </tr>
   <% idset = 0 %>
   % for r in c.eval_10:
@@ -45,7 +74,6 @@
     <td>${r[0]}</td>
     <td>${r[1]| F.NA, h} (${r[2]| F.NA, h}%)</td>
     <td>${r[3]| F.NA, h} (${r[4]| F.NA, h}%)</td>
-    <td></td>
   </tr>
   <% idset = 1 %>
   % else:
@@ -53,13 +81,36 @@
      <td class="table_row_v_12">${r[0]}</td>
      <td class="table_row_v_12">${r[1]| F.NA, h} (${r[2]| F.NA, h}%)</td>
      <td class="table_row_v_12">${r[3]| F.NA, h} (${r[4]| F.NA, h}%)</td>
-     <td class="table_row_v_12 table_width_mid_s">&nbsp;</td>
    </tr>
   <% idset = 0 %>
   % endif
   % endfor
 </table>
-<a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_10/auswertung_2_1.csv">${_('cm_eval_table_export_analysis')}</a>
+<a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_10/auswertung_2_1_1.csv">${_('cm_eval_table_export_analysis')}</a>
+<h4>${_('cm_eval_avg_length_cm')}</h4>
+<table class="evaluation">
+  <tr>
+    <th class="table_header_h table_width_mid_l">${_('cm_eval_table_completed')}</th>
+    <th class="table_header_h table_width_mid_l">${_('cm_eval_table_aborted')}</th>
+  </tr>
+  <% idset = 0 %>
+  % for r in [c.eval_13]:
+   % if idset==0:
+   <tr>
+    <td>${r[0]| F.NA, h}</td>
+    <td>${r[1]| F.NA, h}</td>
+  </tr>
+  <% idset = 1 %>
+  % else:
+   <tr>
+     <td class="table_row_v_12">${r[0]| F.NA, h}</td>
+     <td class="table_row_v_12">${r[1]| F.NA, h}</td>
+   </tr>
+  <% idset = 0 %>
+  % endif
+  % endfor
+</table>
+<a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_13/auswertung_2_1_2.csv">${_('cm_eval_table_export_analysis')}</a>
 </div>
 <div class="evaluation odd-row ">
 <h3><a name="eval_4">${_('cm_eval_summary_header_4')}</a></h3>
@@ -129,7 +180,7 @@
 <a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_8/auswertung_2_2_2.csv">${_('cm_eval_table_export_analysis')}</a>
 </div>
 <div class="evaluation even-row">
-<h3><a name="eval_5">${_('cm_eval_summary_header_5')| F.NA, h}</a></h3>
+<h3><a name="eval_5">${_('cm_eval_summary_header_5')| F.NA, h}</a>${h.getHelp('cm_eval_note_ka_migration_background')}</h3>
 <table class="evaluation">
   <tr>
     <th class="table_header_h table_width_long">${_('cm_eval_table_category')}</th>
@@ -156,13 +207,10 @@
     <td class="table_width_mid_s"></td>
   </tr>
 </table>
-<div class="eval_note">
-    ${_('cm_eval_note_ka_migration_background')}
-</div>
   <a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_3/auswertung_2_3.csv">${_('cm_eval_table_export_analysis')}</a>
 </div>
 <div class="evaluation even-row">
-<h3><a name="eval_6">${_('cm_eval_summary_header_6')}</a></h3>
+<h3><a name="eval_6">${_('cm_eval_summary_header_6')}</a>${h.getHelp('eval_6_note')}</h3>
 <table class="evaluation">
   <tr>
     <th class="table_header_h table_width_long">${_('cm_eval_table_offer')}</th>
@@ -191,6 +239,5 @@
   % endif
 % endfor 
 </table>
-<div class="eval_note">${_('eval6_note')}</div>
 <a href="#top">${_('cm_eval_table_to_overview')}</a> | <a href="/evaluate/exportEvaluation_9/auswertung_2_4.csv">${_('cm_eval_table_export_analysis')}</a>
 </div>

Modified: trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/evaluation/evaluation_result_3.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -4,14 +4,45 @@
 <%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>
+  <li><a href="/evaluate/evaluate/3/1">${_('cm_np_evaluate_result')}</a></li>
 </%def>
-<h1><a name="top">${_('cm_header_evaluate_result')}</a></h1>
+<h1><a name="top">${_('cm_header_evaluate_result')}</a>${h.getHelp('cm_evaluate_result_note')}</h1>
+% if not session.get('hide_search_option_on_eval', False):
+<h2>Zeitraum angeben</h2>
+  <div id="search_field">
+    <form method="post" name="case_search" action="/evaluate/search/">
+    <input type="hidden" name="eval_id" value="3">
+    <div>
+      Zeitraum:
+      <select name="quarter">
+        <option value="-1">Keine Auswahl</option>
+        <option value="1">1. Quartal</option>
+        <option value="2">2. Quartal</option>
+        <option value="3">3. Quartal</option>
+        <option value="4">4. Quartal</option>
+      </select>
+      Jahr:
+      <select name="year">
+        <option value="-1">Keine Auswahl</option>
+        <option value="2006">2006</option>
+        <option value="2007">2007</option>
+        <option value="2008">2008</option>
+        <option value="2009">2009</option>
+        <option value="2010">2010</option>
+        <option value="2011">2011</option>
+        <option value="2012">2012</option>
+      </select>
+      <input type="submit" value="Auswerten">
+      ${h.getHelp('help_eval_search_criteria')} 
+    </div>
+    </form>
+  </div>
+% endif;
 <h2>${_('eval_group_header_all')}</h2>
 <ul>
   <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_1">${_('cm_eval_summary_header_1')}</a></li>
   <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_2">${_('cm_eval_summary_header_2')}</a></li>
+  <li><a href="${h.url_for(controller="/evaluate", action="evaluate", id=1)}#eval_11">${_('cm_eval_summary_header_11')}</a></li>
 </ul>
 <h2>${_('eval_group_header_incm')}</h2>
 <ul>

Modified: trunk/waskaweb/templates/casemanagement/export.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/export.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/export.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -1,15 +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>
+  ${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>
+  <li>
+    <a href="/case/createExportScheme">${_('cm_actions_link_createexportscheme')}</a>
+  </li>
 </ul>
 </div>
 <p>${_('cm_export_con_can_export_a_dossier')}</p>

Modified: trunk/waskaweb/templates/casemanagement/formular.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/formular.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/formular.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -59,8 +59,8 @@
 % if len(h.getFormularHeaders(c.page_id)) > 0:
   <div id="content_ueberschrift">
     <ul>
-    % for header in h.getFormularHeaders(c.page_id):
-      <li><h1>${header} </h1></li>
+    % for header, help in h.getFormularHeaders(c.page_id):
+      <li><h1>${header} ${help}</h1></li>
     % endfor
     </ul>
   </div>

Modified: trunk/waskaweb/templates/casemanagement/main.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/main.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/main.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -30,13 +30,13 @@
        <div class="actions">
           <div id="marked">
           <ul>
-          % if session.get('case').hasPrivacyStatement() is None:
+          % if not session.get('case').hasPrivacyStatement():
             <li><a href="/statement/setPrivacyStatement/${session.get('case').id}" onclick="return checkModification();"> ${_('cm_main_set_statement')}</a></li>
           % elif session.get('case').hasPrivacyStatement():
             <li><a href="/statement/declinePrivacyStatement/${session.get('case').id}/0" onclick="return checkModification();"> ${_('cm_main_revoke_statement')}</a></li>
           % endif
-          % if session.get('case').getState().getState() != 5:
-            <li><a href="/case/anonymize/${session.get('case').id}/0" onclick="return checkModification();"> ${_('cm_main_anonymize_case')}</a></li>
+          % if session.get('case').getState().getState() not in (4,5):
+            <li><a href="/case/markForAnonymize/${session.get('case').id}/0" onclick="return checkModification();"> ${_('cm_main_anonymize_case')}</a></li>
             <li><a href="/statement/listStatements/${session.get('case').id}" onclick="return checkModification();"> ${_('statement_list_statement')}</a></li>
           % endif
           </ul>
@@ -70,6 +70,7 @@
         % if h.hasRole(['cm_ka', 'admin_ka']):
         <li><a href="/case/organisation/${session.get('case').id}" onclick="return checkModification();"> ${_('cm_menu_link_organisation')}</a></li>
         <li><a href="/case/appointments/${session.get('case').id}" onclick="return checkModification();"> ${_('cm_menu_link_appointment')}</a></li>
+        <li><a href="/case/logbook/${session.get('case').id}" onclick="return checkModification();"> Tagebuch</a></li>
         <li><a href="/case/documents/${session.get('case').id}" onclick="return checkModification();"> ${_('cm_menu_link_documents')}</a></li>
         % endif
       </ul>

Added: trunk/waskaweb/templates/casemanagement/newLogbookEntry.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/newLogbookEntry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/newLogbookEntry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,76 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/casemanagement/main.mako" />
+<%
+formular_labels = {'date': 'ein test'}
+%>
+<%def name="buildNavipath()">
+  ${parent.buildNavipath()}
+  <li><a href="/case/select/${session.get('case').id}/1">${_('cm_np_select')}</a></li>
+  <li><a href="/case/logbook/${session.get('case').id}">Tagebuch</a></li>
+  <li><a href="#"></a>Eintrag vornehmen</li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+     Tagebucheintrag vornehmen 
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+      <ul>
+        <li><a href="/case/logbook/${session.get('case').id}">Zur&uuml;ck zu: Tagebuch</a></li>
+      </ul>
+    </div>
+  </div>
+</div>
+${self.buildFormErrors(formular_labels)}
+<div id="appointment">
+<div id="waska_form">
+  <form action="/case/createNewLogbookEntry" accept-charset="UTF-8" method="POST">
+  <%include file="../logbook/edit_body.mako" />
+  </form>
+</div>
+   <div id="waska_form">
+        <form action="/case/createNewLogbookEntry" accept-charset="UTF-8" method="POST">
+            Bearbeiter: ${session.get('USER_AUTHORIZED').shortenedName() | h}
+            <br>
+            <div>
+                <label for="date">Datum:</label>
+                <input type="text" name="date" id="date" value="${c.entry.getDate() | h}">
+            </div>
+            <div>
+                <label for="date">Uhrzeit:</label>
+                <input type="text" name="time" id="time" value="${c.entry.getTime() | h}">
+            </div>
+            <div>
+                <label for="kind">Art des Eintrags:</label>
+                <select name='kind' id='kind'>
+                    <option value="-1" ${c.entry.isSelectedKind(-1)}>Keine Angabe</option>
+                    <option value="-2" ${c.entry.isSelectedKind(-2)}>Sonstiges</option>
+                    <option value="1"  ${c.entry.isSelectedKind(1)}>Gespräch mit dem Jugendlichen</option>
+                    <option value="2"  ${c.entry.isSelectedKind(2)}>Telefonat mit dem Jugendlichen</option>
+                    <option value="3"  ${c.entry.isSelectedKind(3)}>Begleitung des Jugendlichen zu externen Stellen</option>
+                    <option value="4"  ${c.entry.isSelectedKind(4)}>Betreuung des Jugendlichen</option>
+                    <option value="5"  ${c.entry.isSelectedKind(5)}>Schriftverkehr</option>
+                    <option value="6"  ${c.entry.isSelectedKind(6)}>Gespräch/Telefonat mit Kooperationspartnern</option>
+                    <option value="7"  ${c.entry.isSelectedKind(7)}>Gespräch/Telefonat mit Dritten</option>
+                    <option value="8"  ${c.entry.isSelectedKind(8)}>Fallkonferenz (Fallbesprechung, Supervision)</option>                  
+                    <option value="9"  ${c.entry.isSelectedKind(9)}>Erstgespräch</option>                  
+                    <option value="10" ${c.entry.isSelectedKind(10)}>Kompetenzfeststellung</option>                  
+                </select>
+            </div>
+            <div>
+                <label for="short_notice">Nennung Sonstiges:</label>
+                <input type="text" name="short_notice" id="short_notice" value="${c.entry.getShortNotice('') | h}"/>
+            </div>
+            <div>
+                <label for="duration">Dauer in Minuten:</label>
+                <input type="text" name="duration" id="duration" value="${c.entry.getDuration() | h}"/>
+            </div>
+            <div>
+                <label for="notice">Notiz:</label><br>
+                <textarea cols="70" rows="10" name="notice" id="notice">${c.entry.getNotice() | h}</textarea>
+            </div>
+            <input type="hidden" name="case_id" value="${c.ds_id}">
+            <input type="submit" value="Neuen Eintrag vornehmen">
+        </form>
+    </div>
+</div>

Modified: trunk/waskaweb/templates/casemanagement/organisation.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/organisation.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/organisation.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -94,21 +94,4 @@
   % endfor
 </table>
 % endif
-<br>
-<h2>${_('cm_info_status')}</h2>
-<p>Der Zustand der Fallakte ist: "<strong>${session.get('case').getState().getStateLabel()  | F.NA, h}</strong>"
-% if session.get('case').getState().getState() == 1 and h.hasRole(['cm_ka']):
-<a href="${h.url_for(controller='/case', action='close', id=session.get('case').id, confirmed='0')}" onclick="return checkModification();"> ${_('cm_menu_link_close')}</a>
-% endif
-% if session.get('case').getState().getState() == 2 and h.hasRole(['cm_ka']):
-<a href="${h.url_for(controller='/case', action='open', id=session.get('case').id, confirmed='0')}" onclick="return checkModification();"> ${_('cm_menu_link_open')}</a>
-% endif 
-</p>
-<div class="note">
-<p><strong>Hinweis</strong><br>Das Schließen einer Fallakte steht in keinem Zusammenhang mit dem Beenden eines Falls im Sinne des Case-Management! Um einen Fall im Sinne des Case-Management zu beenden, müssen Sie weiterhin im Abschnitt "Abschlussbewertung" der Fallakte entsprechende Angaben eintragen.<br>
-</p>
-<p>Das Schließen der Fallakte hat zwei Auswirkungen:<br>
-1. Die Fallakte wird aus der Fallaktenübersicht ausgeblendet. Sie können die Fallakte aber durch die Erweiterung der Suchfilter wieder einblenden.<br>
-2. Zur Wahrung des Datenschutzes wird eine abgeschlossene Fallakte, die länger als 3 Monate nicht bearbeitet wurde, dem Bearbeiter wiedervorgelegt und ein Löschen der Fallakte empfohlen.
-</p>
 </div>

Modified: trunk/waskaweb/templates/casemanagement/overview.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/overview.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/overview.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -14,58 +14,36 @@
 % if h.hasRole(['cm_ka']):
  <!-- <p>${_('cm_overview_con_list_dossiers_cm')}</p>-->
 %endif
-<div id="search_field">
-  <form method="post" name="case_search" action="/case_overview/search/">
-  <div>
-    <input type="text" size="30" name="search_str">
-    % if h.hasRole(['admin_ka']):
-    <select name="editor">
-      <option value="-1">Alle Benutzer</option>
-    % for user in c.userlist:
-      <option value="${user.id}">${user.last_name | h}, ${user.first_name | h}</option>
-    % endfor
-    </select>
-    % endif
-    <input type="submit" value="${_('cm_form_overview_search_submit')}">
-  </div>
-  <div id="search_criteria">
-    <strong>Suchfilter:</strong>
-    % if h.hasRole(['cm_ka']):
-    <input type="checkbox" name="show_own" id="show_own" value="1" checked="checked"><label for="show_own"><img title="Eigene Fallakten" alt="Bearbeiter"  src="/images/icons/editor_grey.gif">Eigene</label>
-    <input type="checkbox" name="show_other" id="show_other" value="1" checked="checked"><label for="show_other"><img title="Vertreter Fallakten" alt="Vertreter"  src="/images/icons/stand-in_grey.gif">Vertretung</label>
-    % endif
-    <input type="checkbox" name="show_open" id="show_open" value="1" checked="checked"><label for="show_open"><img title="Offene Fallakten" alt="Offene" src="/images/icons/work_in_progress_grey.gif">Offen</label>
-    <input type="checkbox" name="show_closed" id="show_closed" value="1" checked="checked"><label for="show_closed"><img title="Geschlossene Fallakten" alt="Geschlossene" src="/images/icons/done_grey.gif">Geschlossen</label>
-    % if h.hasRole(['admin_ka']):
-    <input type="checkbox" name="show_markdelete" id="show_markdelete" value="1" checked="checked"><label for="show_markdelete"><img title="Zu löschende Fallakten" alt="Schwebend Gelöscht" src="/images/icons/delete_grey.gif">Schwebend gelöscht</label>
-    % endif
-    <input type="checkbox" name="show_anonymized" id="show_anonymized" value="1" checked="checked"><label for="show_anonymized"><img title="Anonymisierte Fallakten" alt="Anonymisiert" src="/images/icons/anonym.gif">Anonymisiert</label>
-  </div>
-  </form>
-</div>
+<%include file="/casemanagement/search.mako" />
+Es wurden ${c.count_all} Fallakten gefunden
 <div class="waska_form">
   ${h.form(h.url(action='bundleAction'), method='post')}
   <%include file="./caselist.mako" />
   <div class="waska_form_element">
-    <input type="checkbox" name="all_cases" id="all_cases" value="1"><label for="all_cases">Alle angezeigten Fallakten auswählen</label>
+    <input type="checkbox" name="all_cases" id="all_cases" value="1"><label for="all_cases">Alle angezeigten Fallakten (${c.count_all}) auswählen</label>
   </div>
   <div class="waska_form_element w30">
     <select name="action">
       <option value="no_action">Keine Aktion</option>
       % if h.hasRole(['admin_ka']):
         <option value="delete">Auswahl löschen</option>
+        <option value="anonymize">Auswahl anonymisieren</option>
+        <option value="restore">Auswahl wiederherstellen</option>
         <option value="transfer">Auswahl Bearbeitung übertragen</option>
       % endif
       % if h.hasRole(['cm_ka']):
         <option value="markdelete">Auswahl löschen</option>
+        <option value="markanonymize">Auswahl anonymisieren</option>
       % endif
       % if h.hasRole(['admin_ka', 'cm_ka']):
       <option value="stand-in">Auswahl Vertretung zuweisen</option>
       <option value="exportXLS">Auswahl als Excel-Tabellen exportieren</option>
       <option value="exportXML">Auswahl als XML-Datei exportieren</option>
       <option value="exportCSV">Auswahl als CSV-Datei exportieren</option>
-      <!--<option value="evaluate">Auswahl auswerten</option>-->
+      % if not c.hide_evaluation:
+        <option value="evaluate">Auswahl auswerten</option>
       % endif
+      % endif
     </select>
   </div>
   <div class="waska_form_element w50">

Added: trunk/waskaweb/templates/casemanagement/search.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/search.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/search.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,130 @@
+## -*- coding: utf-8 -*-
+<div id="search_field">
+  <form method="post" name="case_search" action="/case_overview/search/" accept-charset="UTF-8">
+  <div>
+    <input type="text" size="30" name="search_str">
+    <input type="submit" value="${_('cm_form_overview_search_submit')}">
+    % if c.extended_search:
+      <a href="/case_overview/overview_extended/">Erweiterte Suche ausblenden</a>
+    % else:
+      <a href="/case_overview/overview_extended/">Erweiterte Suche einblenden</a>
+    % endif
+    ${h.getHelp('extended_search')}
+  </div>
+  <div class="search_criteria">
+    <strong>Suchfilter:</strong>
+    % if h.hasRole(['cm_ka']):
+      <input type="checkbox" name="show_own" id="show_own" value="1" checked="checked">
+      <label for="show_own">
+        <img title="Eigene Fallakten" alt="Bearbeiter"  src="/images/icons/editor_grey.gif">Eigene (${c.count_own})
+      </label>
+      <input type="checkbox" name="show_other" id="show_other" value="1" checked="checked">
+      <label for="show_other">
+        <img title="Vertreter Fallakten" alt="Vertreter"  src="/images/icons/stand-in_grey.gif">Vertretung (${c.count_standin})
+      </label>
+    % endif
+    % if h.hasRole(['admin_ka']):
+      <input type="checkbox" name="show_markdelete" id="show_markdelete" value="1" checked="checked">
+      <label for="show_markdelete">
+        <img title="Zu löschende Fallakten" alt="Schwebend Gelöscht" src="/images/icons/delete_grey.gif">Schwebend gelöscht (${c.count_del})
+      </label>
+      <input type="checkbox" name="show_markanonymize" id="show_markanonymize" value="1" checked="checked">
+      <label for="show_markanonymize">
+        <img title="Schwebend anonymisierte Fallakten" alt="Schwebend anonymisiert" src="/images/icons/anonym.gif">Schwebend anonymisiert (${c.count_markanon})
+      </label>
+    % endif
+      <input type="checkbox" name="show_anonymized" id="show_anonymized" value="1" checked="checked">
+    <label for="show_anonymized">
+      <img title="Anonymisierte Fallakten" alt="Anonymisiert" src="/images/icons/anonym.gif">Anonymisiert (${c.count_anon})
+    </label>
+  </div>
+  % if c.extended_search:
+  <div class="search_criteria">
+    <h3>Erweiterte Suche</h3>
+    <table id="searchoptiontable">
+      % if h.hasRole(['admin_ka']):
+      <tr>
+        <td width="80" valign="top"><label for="editor">Bearbeiter:</label></td>
+        <td valign="top">
+          <select name="editor" id="editor">
+            <option value="-1">Alle Benutzer</option>
+          % for user in c.userlist:
+            <option value="${user.id}">${user.last_name | h}, ${user.first_name | h}</option>
+          % endfor
+          </select>
+        </td>
+      </tr>
+      <tr>
+        <td width="80" valign="top"><label for="branch">Filiale:</label></td>
+        <td valign="top">
+          <input type="text" name="branch" id="branch">
+        </td>
+      </tr>
+      % endif
+      <tr>
+        <td width="80" valign="top"><label for="gender">Geschlecht:</label></td>
+        <td valign="top">
+          <select name="gender" id="gender">
+            <option value="-2">Alle</option>
+            <option value="0">Weiblich</option>
+            <option value="1">Männlich</option>
+            <option value="2">Intersexuel</option>
+            <option value="-1">Kein Angabe</option>
+          </select>
+        </td>
+      </tr>
+      <tr>
+        <td width="80" valign="top"><label for="cm_state">CM-Status:</label></td>
+        <td valign="top">
+          <select name="cm_state" id="cm_state">
+            <option value="1">Alle</option>
+            <option value="2">Beratungskunde</option>
+            <option value="3">CM-Kunde</option>
+            <option value="4">CM-Abgeschlossen</option>
+          </select>
+        </td>
+      </tr>
+      <tr>
+        <td width="80" valign="top"><label for="quarter">Zeitraum:</label></td>
+        <td valign="top">
+          <select name="quarter" id="quarter">
+            <option value="-1">Keine Auswahl</option>
+            <option value="1">1. Quartal</option>
+            <option value="2">2. Quartal</option>
+            <option value="3">3. Quartal</option>
+            <option value="4">4. Quartal</option>
+          </select>
+          <select name="year">
+            <option value="-1">Keine Auswahl</option>
+            <option value="2006">2006</option>
+            <option value="2007">2007</option>
+            <option value="2008">2008</option>
+            <option value="2009">2009</option>
+            <option value="2010">2010</option>
+            <option value="2011">2011</option>
+            <option value="2012">2012</option>
+          </select>
+        </td>
+      </tr>
+      <tr>
+        <td width="80" valign="top">Fallakte:</td>
+        <td valign="top">
+          <input type="checkbox" name="show_open" id="show_open" value="1" checked="checked">
+          <label for="show_open">
+            <img title="Bearbeitbare Fallakten" alt="Bearbeitbare" src="/images/icons/work_in_progress_grey.gif">Bearbeitbare Fallakten
+          </label>
+          <!--
+          <input type="checkbox" name="show_closed" id="show_closed" value="1" checked="checked">
+          <label for="show_closed">
+            <img title="Geschlossene Fallakten" alt="Geschlossene" src="/images/icons/done_grey.gif">Geschlossen
+          </label>
+          -->
+        </td>
+      </tr>
+    </table>
+  </div>
+  % else:
+    <input type="hidden" name="show_open" value="1">
+  % endif
+  </form>
+</div>

Added: trunk/waskaweb/templates/casemanagement/selectParts.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/selectParts.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/casemanagement/selectParts.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,136 @@
+## -*- coding: utf-8 -*-
+<%inherit file="../main.mako" />
+<%def name="buildNavipath()">
+  ${parent.buildNavipath()}
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+    Bereichsauswahl der Fallakte 
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+      <ul>
+        <li>
+          <a href="${h.url_for(controller='/case_overview', action='exportXML', confirmed=1)}">Zurück zu: XML Export</a>
+        </li>
+      </ul>
+    </div>
+  </div>
+</div>
+${self.buildFormErrors(formular_labels)}
+<div class="waska_form">
+<div class="waska_form_element" >
+<p>${c.selection_question}</p>
+<form action="${c.store_action}" accept-charset="UTF-8" method="POST">
+<h2>Formulardaten</h2>
+<ul>
+    <li>
+      <input type="checkbox" name="form_section_0" id="form_section_0" value="1">
+      <label for="form_section_0">Zuständigkeiten, Eingangsdaten</label>
+    </li>
+    <li>
+      <input type="checkbox" name="form_section_1" id="form_section_1" value="1">
+      <label for="form_section_1">Externe Ansprechpartner</label>
+    </li>
+    <li><strong>Angaben zur Person</strong>
+        <ul>
+            <li>
+              <input type="checkbox" name="form_section_2" id="form_section_2" value="1">
+              <label for="form_section_2">Persönliche Angaben</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_3" id="form_section_3" value="1">
+              <label for="form_section_3">Familiäre Situation</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_4" id="form_section_4" value="1">
+              <label for="form_section_4">Gesundheitliche Situation</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_5" id="form_section_5" value="1">
+              <label for="form_section_5">Soziale Lage</label>
+            </li>
+        </ul>
+    </li>
+    <li><strong>Biographische Daten</strong>
+        <ul>
+            <li>
+              <input type="checkbox" name="form_section_6" id="form_section_6" value="1">
+              <label for="form_section_6">Schule</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_7" id="form_section_7" value="1">
+              <label for="form_section_7">Ausbildung und Arbeit</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_8" id="form_section_8" value="1">
+              <label for="form_section_8">Weiterer Verlauf</label>
+            </li>
+        </ul>
+    </li>
+    <li><strong>Case-Management</strong>
+        <ul>
+            <li>
+              <input type="checkbox" name="form_section_9"  id="form_section_9" value="1" >
+              <label for="form_section_9" >Kompetenzfeststellung</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_10" id="form_section_10" value="1">
+              <label for="form_section_10">Förderplanung</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_11" id="form_section_11" value="1">
+              <label for="form_section_11">Unterstützungsangebote</label>
+            </li>
+            <li>
+              <input type="checkbox" name="form_section_12" id="form_section_12" value="1">
+              <label for="form_section_12">Freie Dokumentation</label>
+            </li>
+        </ul>
+    </li>
+    <li><strong>Abschlussbewertung</strong>
+        <ul>
+            <li>
+              <input type="checkbox" name="form_section_13" id="form_section_13" value="1">
+              <label for="form_section_13">Angaben zum Verlauf und Beendigung des CM</label>
+            </li>
+            <li><strong>Erreichte Ziele</strong>
+                <ul>
+                    <li>
+                      <input type="checkbox" name="form_section_14" id="form_section_14" value="1">
+                      <label for="form_section_14">Berufliche Integration</label>
+                    </li>
+                    <li>
+                      <input type="checkbox" name="form_section_15" id="form_section_15" value="1">
+                      <label for="form_section_15">Soziale Integration</label>
+                    </li>
+                    <li>
+                      <input type="checkbox" name="form_section_16" id="form_section_16" value="1">
+                      <label for="form_section_16">Einschätzung des Case-Managers</label>
+                    </li>
+                </ul>
+            </li>
+            <li>
+              <input type="checkbox" id="form_section_17" name="form_section_17" value="1">
+              <label for="form_section_17">Freie Dokumentation</label>
+            </li>
+        </ul>
+    </li>
+</ul>
+<h2>Falltagebuch</h2>
+<input type="checkbox" name="logbook" id="loogbook" value="1">
+<label for="logbook">Falltagebuch exportieren</label>
+<h2>Anlagen</h2>
+<input type="checkbox" name="documents" id="documents" value="1">
+<label for="documents">Anlagen des Falls exportieren</label>
+<br>
+<input type="submit" value="Auswählen und zurück">
+<%doc>
+<h2>Termine/Wiedervorlagen</h2>
+<input type="checkbox" name="appointments" id="appointments" value="1">
+<label for="appointments">Termine und Wiedervorlagen des Falls exportieren</label>
+</%doc>
+</form>
+</div>
+</div>
+<div class="clearer" ></div>

Added: trunk/waskaweb/templates/logbook/dialogs/confirm_delete_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/confirm_delete_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/confirm_delete_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag löschen</a></li>
+</%def>
+<%include file="../../dialogs/confirm.mako" />

Added: trunk/waskaweb/templates/logbook/dialogs/failed_create_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/failed_create_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/failed_create_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag vornehmen</a></li>
+</%def>
+<%include file="../../dialogs/failed.mako" />

Added: trunk/waskaweb/templates/logbook/dialogs/failed_delete_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/failed_delete_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/failed_delete_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag löschen fehlgeschlagen</a></li>
+</%def>
+<%include file="../../dialogs/failed.mako" />

Added: trunk/waskaweb/templates/logbook/dialogs/failed_save_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/failed_save_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/failed_save_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag speichern fehlgeschlagen</a></li>
+</%def>
+<%include file="../../dialogs/failed.mako" />

Added: trunk/waskaweb/templates/logbook/dialogs/failed_show_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/failed_show_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/failed_show_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag ansehen fehlgeschlagen</a></li>
+</%def>
+<%include file="../../dialogs/failed.mako" />

Added: trunk/waskaweb/templates/logbook/dialogs/success_create_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/success_create_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/success_create_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag vornehmen</a></li>
+</%def>
+<%include file="../../dialogs/success.mako" />

Added: trunk/waskaweb/templates/logbook/dialogs/success_delete_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/success_delete_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/success_delete_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag löschen erfolgreich</a></li>
+</%def>
+<%include file="../../dialogs/success.mako" />

Added: trunk/waskaweb/templates/logbook/dialogs/success_save_logbook_entry.mako
===================================================================
--- trunk/waskaweb/templates/logbook/dialogs/success_save_logbook_entry.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/dialogs/success_save_logbook_entry.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,9 @@
+## -*- 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/logbook/${session.get('case').id}">Tagebuch</a></li>
+	<li><a href="#">Eintrag abspeichern</a></li>
+</%def>
+<%include file="../../dialogs/success.mako" />

Added: trunk/waskaweb/templates/logbook/edit.mako
===================================================================
--- trunk/waskaweb/templates/logbook/edit.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/edit.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,35 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/casemanagement/main.mako" />
+<%
+formular_labels = {'date': 'Datum',
+                   'time': 'Uhrzeit',
+                   'duration': 'Dauer',
+                   'short_notice': 'Nennung Sonstiges' }
+%>
+<%def name="buildNavipath()">
+  ${parent.buildNavipath()}
+  <li><a href="/case/select/${session.get('case').id}/1">${_('cm_np_select')}</a></li>
+  <li><a href="/case/logbook/${session.get('case').id}">Tagebuch</a></li>
+  <li><a href="#"></a>Eintrag bearbeiten</li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+     Tagebucheintrag bearbeiten 
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+      <ul>
+        <li><a href="/case/showLogbookEntry/${c.entry.id}">Zur&uuml;ck zu: Eintrag ansehen</a></li>
+      </ul>
+    </div>
+  </div>
+</div>
+${self.buildFormErrors(formular_labels)}
+<div id="appointment">
+  <div id="waska_form">
+    <form action="/case/saveLogbookEntry" accept-charset="UTF-8" method="POST">
+      <%include file="../logbook/edit_body.mako" />
+      <input type="hidden" name="id">
+    </form>
+  </div>
+</div>

Added: trunk/waskaweb/templates/logbook/edit_body.mako
===================================================================
--- trunk/waskaweb/templates/logbook/edit_body.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/edit_body.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,50 @@
+## -*- coding: utf-8 -*-
+<fieldset>
+<legend>Zeitangaben</legend>
+  <div class="w25">
+    <label for="date">Datum:</label><br>
+    <input type="text" class="field" name="date" id="date">
+  </div>
+  <div class="w75">
+    <label for="date">Uhrzeit:</label><br>
+    <input type="text" class="field" name="time" id="time">
+  </div>
+  <div class="w25">
+    <label for="duration">Dauer in Minuten:</label><br>
+    <input type="text" class="field" name="duration" id="duration"/>
+  </div>
+</fieldset>
+<fieldset>
+<legend>Eintrag</legend>
+Bearbeiter: ${session.get('USER_AUTHORIZED').shortenedName() | h}
+<div class="w100">
+  <label for="kind">Art des Eintrags:</label><br>
+  <select name='kind' id='kind'>
+    <option value="-1">Keine Angabe</option>
+    <option value="-2">Sonstiges</option>
+    ##<option value="0" >Automatischer Eintrag</option>
+    <option value="1" >Gespräch mit dem Jugendlichen</option>
+    <option value="2" >Telefonat mit dem Jugendlichen</option>
+    <option value="3" >Begleitung des Jugendlichen zu externen Stellen</option>
+    <option value="4" >Betreuung des Jugendlichen</option>
+    <option value="5" >Schriftverkehr</option>
+    <option value="6" >Gespräch/Telefonat mit Kooperationspartnern</option>
+    <option value="7" >Gespräch/Telefonat mit Dritten</option>
+    <option value="8" >Fallkonferenz (Fallbesprechung, Supervision)</option> 
+    <option value="9" >Erstgespräch</option>
+    <option value="10">Kompetenzfeststellung</option> 
+  </select>
+</div>
+<div class="w100">
+  <label for="short_notice">Nennung Sonstiges:</label><br>
+  <input type="text" class="field" name="short_notice" id="short_notice" maxlength="80"/>
+</div>
+<div>
+  <label for="notice">Notiz:</label><br>
+  <textarea cols="70" rows="10" name="notice" id="notice"></textarea>
+</div>
+<div>
+<input type="hidden" name="case_id" value="${c.ds_id}">
+<input type="submit" value="Eintrag speichern">
+</div>
+</fieldset>

Added: trunk/waskaweb/templates/logbook/new.mako
===================================================================
--- trunk/waskaweb/templates/logbook/new.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/new.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,34 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/casemanagement/main.mako" />
+<%
+formular_labels = {'date': 'Datum',
+                   'time': 'Uhrzeit',
+                   'duration': 'Dauer',
+                   'short_notice': 'Nennung Sonstiges'}
+%>
+<%def name="buildNavipath()">
+  ${parent.buildNavipath()}
+  <li><a href="/case/select/${session.get('case').id}/1">${_('cm_np_select')}</a></li>
+  <li><a href="/case/logbook/${session.get('case').id}">Tagebuch</a></li>
+  <li><a href="#"></a>Eintrag vornehmen</li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+     Tagebucheintrag vornehmen 
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+      <ul>
+        <li><a href="/case/logbook/${session.get('case').id}">Zur&uuml;ck zu: Tagebuch</a></li>
+      </ul>
+    </div>
+  </div>
+</div>
+${self.buildFormErrors(formular_labels)}
+<div id="appointment">
+<div id="waska_form">
+  <form action="/case/createNewLogbookEntry" accept-charset="UTF-8" method="POST">
+  <%include file="../logbook/edit_body.mako" />
+  </form>
+</div>
+</div>

Added: trunk/waskaweb/templates/logbook/overview.mako
===================================================================
--- trunk/waskaweb/templates/logbook/overview.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/overview.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,58 @@
+## -*- coding: utf-8 -*-
+<%!  import waskaweb.lib.filters as F %>
+<%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/logbook/${session.get('case').id}">Tagebuch</a></li>
+</%def>
+
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+    Tagebuch 
+  </div>
+% if h.hasRole(['cm_ka']):
+  <div id="modusfield">
+    <div class="actions">
+      <ul>
+        <li><a href="${h.url_for(controller='/case', action='newLogbookEntry', id=session.get('case').id)}">Eintrag vornehmen</a></li>
+      </ul>
+    </div>
+  </div>
+% endif
+</div>
+<table class="appointment">
+  <tr>
+    <th class="date table_header_h">Datum/Uhrzeit</th>
+    <th class="title table_header_h">Bearbeiter</th>
+    <th class="title table_header_h">Art</th>
+    <th class="title table_header_h">Dauer in Minuten</th>
+    <th class="action table_header_h">${_('app_overview_tbl_header_actions')}</th>
+  </tr>
+% if c.logbook.hasEntries():
+  % for entry in c.logbook.getEntries():
+    <tr>
+    <td class="date">${entry.getDate() | h} ${entry.getTime()}</td>
+    <td class="title">${entry.getEditor() | h}</td>
+    <td class="title">${entry.getKind() | h}</td>
+    <td class="title">${entry.getDuration() | h}</td>
+    <td class="action">
+        <a href="${h.url_for(controller='/case', action='showLogbookEntry', id=entry.id)}">
+            <img src="/images/icons/view_red.gif" border="0" alt="Eintrag ansehen" title="Eintrag ansehen"></a>
+        % if h.hasRole(['cm_ka']) and entry.getKindAsInt() != 0:
+        <a href="${h.url_for(controller='/case', action='deleteLogbookEntry', id=entry.id, confirmed=0)}">
+            <img src="/images/icons/delete_red.gif" border="0" alt="Eintrag löschen" title="Eintrag löschen"></a>
+        % endif
+    </td>
+  </tr>
+  <tr>
+    <% notice = F.shorten(F.H(entry.getNotice()),120) %>
+    <td colspan="5" class="description">${notice | F.NA}</td>
+  </tr>
+  % endfor
+% else:
+  <tr>
+    <td colspan="5">Keine Eintr&auml;ge gefunden</td>
+  </tr>
+% endif
+</table>

Added: trunk/waskaweb/templates/logbook/show.mako
===================================================================
--- trunk/waskaweb/templates/logbook/show.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/logbook/show.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,54 @@
+<%inherit file="/casemanagement/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/logbook/${session.get('case').id}">Tagebuch</a></li>
+  <li><a href="#"></a>Tagebucheintrag</a></li>
+</%def>
+<div id="content_header_small">
+  <div id="content_ueberschrift">
+    Tagebucheintrag    
+  </div>
+  <div id="modusfield">
+    <div class="actions">
+      <ul>
+        % if h.hasRole('cm_ka') and c.entry.getKindAsInt() != 0:
+        <li>
+          <a href="${h.url_for(controller='/case', action='editLogbookEntry', id=c.entry.id)}">
+            In Bearbeitung nehmen
+          </a>
+        </li>
+        % endif
+        <li>
+          <a href="/case/logbook/${session.get('case').id}">Zur&uuml;ck zu: Tagebuch</a>
+        </li>
+      </ul>
+    </div>
+  </div>
+</div>
+<table>
+    <tbody>
+        <tr>
+            <td class="label table_header_v table_width_long">Datum</td>
+            <td class="table_row_v">${c.entry.getDate() | h} ${c.entry.getTime() | h}</td>
+        </tr>
+        <tr>
+            <td class="label">Bearbeiter</td>
+            <td class="table_row_v_2">${c.entry.getEditor() | h}</td>
+        </tr>
+        <tr>
+            <td class="label table_header_v">Art</td>
+            <td class="table_row_v">${c.entry.getKind() | h}</td>
+        </tr>
+        <tr>
+            <td class="label">Dauer in Minuten</td>
+            <td class="table_row_v_2">${c.entry.getDuration('-/-') | h}</td>
+        </tr>
+        <tr>
+            <td class="label table_header_v">Notiz</td>
+            <% description = F.H(c.entry.notiz).replace('\n', '<br>') %>
+            <td class="table_row_v">${description | F.NA}</td>
+        </tr>
+    </tbody>
+</table>

Modified: trunk/waskaweb/templates/main.mako
===================================================================
--- trunk/waskaweb/templates/main.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/main.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -57,6 +57,14 @@
         </div>
       </div>
       <div id="content" class="right">
+        <div id="status_str_nofloat">
+          % if c.status_msg:
+            <span class="redcolor">${c.status_msg | h}<span>
+          % else:
+            <strong>Hinweis:</strong> Nach 30 Minuten ohne Aktivität/ohne Speichern wird die Sitzung
+      automatisch beendet, ggf. gehen Daten verloren!
+          % endif
+        </div>
         ${self.buildContentHeader()}
         ${self.body()}
       </div>
@@ -122,7 +130,7 @@
       <h1>${_('menu_header_cm')}</h1>
       <ul>
         <li><a href="${h.url_for(controller='/agency_overview', action='overview', reset=1)}"> ${_('menu_cm_link_overview')}</a> </li>
-        <li><a href="${h.url_for(controller='/evaluate', action='evaluate', id=1)}"> ${_('cm_actions_link_evaluate')}</a></li>
+        <li><a href="${h.url_for(controller='/evaluate', action='evaluate', id=1, reset=1)}"> ${_('cm_actions_link_evaluate')}</a></li>
       </ul>
     </div>
   </div>
@@ -136,7 +144,7 @@
           <li><a href="${h.url_for(controller='/case', action='new')}"> ${_('menu_cm_link_new')}</a> </li>
           <li><a href="${h.url_for(controller='/case', action='importCase')}"> ${_('menu_cm_link_import')}</a> </li>
         % endif
-        <li><a href="${h.url_for(controller='/evaluate', action='evaluate', id=1)}"> ${_('cm_actions_link_evaluate')}</a></li>
+        <li><a href="${h.url_for(controller='/evaluate', action='evaluate', id=1, reset=1)}"> ${_('cm_actions_link_evaluate')}</a></li>
       </ul>
     </div>
   </div>
@@ -182,7 +190,9 @@
 
 <%def name="buildFooter()">
 <div id="footer">
-  <p>${_('footer_title')} | ${_('footer_version')}</p>
+  <div id="version_str">
+    ${_('footer_title')} | ${_('footer_version')}
+  </div>
 </div>
 </%def>
 

Added: trunk/waskaweb/templates/start/globalappointmentlist.mako
===================================================================
--- trunk/waskaweb/templates/start/globalappointmentlist.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/start/globalappointmentlist.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,31 @@
+<%!  import waskaweb.lib.filters as F %>
+<%def name="showAppointmentActions(appointment)">
+  <a href="${h.url_for(controller='/appointment', action='show', id=appointment.id)}">
+    <img src="/images/icons/view_red.gif" border="0" alt="${_('cm_overview_a_show')}" title="${_('cm_overview_a_show')}"></a>
+</%def>
+
+<table class="appointment">
+  <tr>
+    <th class="date table_header_h">${_('app_overview_tbl_header_date')}</th>
+    <th class="title table_header_h">${_('app_overview_tbl_header_desc')}</th>
+    <th class="action table_header_h">${_('app_overview_tbl_header_actions')}</th>
+  </tr>
+  % for appointment in c.globalappointmentlist.getDatasets():
+  <tr>
+    <td class="date">${h.dd_mm_YYYY(appointment.getStartDate())}</td>
+    <td class="title">${appointment.title | F.NA, h}</td>
+    <td class="action">
+     ${self.showAppointmentActions(appointment)}
+    </td>
+  </tr>
+  <tr>
+    <% description = F.shorten(F.H(appointment.description),120) %>
+    <td colspan="3" class="description">${description | F.NA}</td>
+  </tr>
+  % endfor
+  % if len(c.globalappointmentlist.getDatasets()) <= 0:
+  <tr>
+    <td colspan="3">Keine Termine gefunden</td>
+  </tr>
+  % endif
+</table>

Modified: trunk/waskaweb/templates/start/help.mako
===================================================================
--- trunk/waskaweb/templates/start/help.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/start/help.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -4,4 +4,44 @@
   <li><a href="#" onclick="return checkModification();">${_('sm_menu_link_help')}</a></li>
 </%def>
 <h1>WASKA Hilfe</h1>
-<p>Die Hilfe befindet sich noch in Bearbeitung. Bitte wenden Sie sich bis zur Fertigstellung an das Informationsportal <a target="_blank" href="http://waska-anwender.intevation.de/index.html" >Waska-Anwender<img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a>. Dort finden Sie sowohl <a target="_blank" href="http://waska-anwender.intevation.de/download.html">Handbücher <img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a>für Administration und Casemanagement, als auch einen Bereich, in dem Antworten auf <a target="_blank" href="http://waska-anwender.intevation.de/faq.html">häufig gestellte Fragen zur Anwendung<img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a> gegeben werden.</p><p>Darüber hinaus steht eine Liste mit Antworten zu <a href="http://www.kompetenzagenturen.de/_media/FAQ_INBAS_PT.pdf" target="_blank">häufig gestellten Fragen im Bereich des CM<img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a>vom PT-DLR zur Verfügung</p>
+<p>WASKA ist ein webbasiertes System zur Pflege von elektronischen Fallakten.
+Innerhalb von WASKA hat jede Kompetenzagentur eine eigene Datenbank, auf die
+Außenstehende keinen Zugriff haben. Aus den einzelnen Datenbanken werden
+anonymisierte Daten, die keine Rückschlüsse auf einzelne Jugendliche
+ermöglichen, in eine zentrale Datenbank überspielt über die ein programmweites
+Monitoring möglich ist. Für technisch-organisatorische Fragen, auch zum
+Datenschutz, stehen Handbücher und Online Hilfen bereit. Fachliche Aspekte
+werden in der kontextabhängigen Hilfe erläutert.</p>
+
+<p>Für jeden Jugendlichen, der in der Kompetenzagentur betreut wird, wird von
+der Case-Managerin bzw. vom Case-Manager eine Fallakte angelegt. Die Fallakte
+gliedert sich in vier aufeinanderfolgende Abschnitte, die die wichtigsten
+Schritte des Case-Managements abbildet: Anamnese, (Ergebnisse der)
+Kompetenzfeststellung, Förderplanung und Abschlussbewertung. Nach einer
+Eingangsanamnese entscheidet sich, ob es zu einer intensiveren Betreuung mit
+einem umfassenden Case-Management kommt. Das Case-Management besteht aus
+individuellen Begleitungs- und Vermittlungsprozessen, die mit einer
+Zielvereinbarung geplant werden und deren Verlauf dokumentiert wird. Am Ende
+des Case-Managements erfolgt eine Abschlussbewertung, die u.a. auf die
+Zielerreichung des oder der Förderpläne und den Verbleib des Jugendlichen
+eingeht. Auf der Grundlage der in WASKA erfassten Daten erfolgt das
+programmweite Datenmonitoring, das zum besseren Verständnis der Arbeit in den
+Kompetenzagenturen und zur Qualitätsverbesserung beitragen soll.</p>
+
+<p>Jugendliche, die durch eine Kompetenzagentur aufgenommen werden, haben
+unterschiedlichen Bedarf an Hilfe und Unterstützung. Demzufolge unterscheiden
+wir zwischen Informationskunden („Laufkundschaft“), Beratungskunden und
+Case-Management-Kunden. In WASKA werden Beratungskunden, die in der Regel
+wenige Beratungen in Anspruch nehmen und Case-Management-Kunden, die eine
+intensive Betreuung über einen längeren Zeitraum benötigen, erfasst. WASKA ist
+nicht zur Erfassung von Informationskunden gedacht!</p>
+
+<p>Beachten Sie bitte folgende Hinweise zur Dateneingabe: Es ist wichtig,
+Felder in WASKA so weit wie möglich auszufüllen. Zusätzlich haben Sie nach
+jedem Abschnitt die Möglichkeit, sich Notizen im Feld „freie Dokumentation“ zu
+machen. Felder, zu denen keine Informationen vorliegen oder die auf den
+Jugendlichen nicht zutreffen, bitte leer lassen. Bitte nutzen Sie WASKA als
+Dokument, das Ihre Arbeit mit dem Jugendlichen begleitet. Eingaben können ohne
+weiteres auch zum späteren Zeitpunkt noch ergänzt oder geändert werden.</p>
+
+<p><strong>Für weitere Informationen zu WASKA wenden Sie sich an das Informationsportal</strong> <a target="_blank" href="https://waska-anwender.intevation.de" >Waska-Anwender<img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a>. Dort finden Sie sowohl <a target="_blank" href="https://waska-anwender.intevation.de/DownloadBereich">Handbücher <img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a>für Administration und Casemanagement, als auch einen Bereich, in dem Antworten auf <a target="_blank" href="https://waska-anwender.intevation.de/FAQ">häufig gestellte Fragen zur Anwendung<img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a> gegeben werden.</p><p>Darüber hinaus steht eine Liste mit Antworten zu <a href="http://www.kompetenzagenturen.de/_media/FAQ_INBAS_PT.pdf" target="_blank">häufig gestellten Fragen im Bereich des CM<img src="/images/icons/extern_link.png" class="link_img" border="0" alt="externer Link"/></a>vom PT-DLR zur Verfügung.</p>

Modified: trunk/waskaweb/templates/start/remindlist.mako
===================================================================
--- trunk/waskaweb/templates/start/remindlist.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/start/remindlist.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -3,3 +3,7 @@
   <a href="${h.url_for(controller='/case', action='select', id=appointment.case_id, confirmed=0)}">
     <img src="/images/icons/view_red.gif" border="0" alt="${_('cm_overview_a_show')}" title="${_('cm_overview_a_show')}"></a>
 </%def>
+<%def name="showKeepActiveActions(appointment)">
+  <a href="${h.url_for(controller='/case', action='keepActive', id=appointment.case_id, confirmed=0)}">
+    <img src="/images/icons/recover_red.gif" border="0" alt="${_('cm_overview_a_keepactive')}" title="${_('cm_overview_a_keepactive')}"></a>
+</%def>

Modified: trunk/waskaweb/templates/start/responsible.mako
===================================================================
--- trunk/waskaweb/templates/start/responsible.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/start/responsible.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -3,6 +3,81 @@
 <%def name="buildNavipath()">
   <li><a href="#" onclick="return checkModification();">${_('sm_menu_link_responsible')}</a></li>
 </%def>
+##<div class="traeger">
+##  <div class="traeger_name">
+##    <h2>Förderung</h2>
+##    <div class="traeger_name_text">
+##      <p>WASKA wurde von 2007-2008 im Auftrag des Projektträgers im Deutschen
+##      Zentrum für Luft- und Raumfahrt e.V. (PT-DLR) im Rahmen des Programms
+##      "Kompetenzagenturen" (Durchführungsphase) enwickelt. Das Programm
+##      "Kompetenzagenturen" (Durchführungsphase) wurde gefördert vom
+##      Bundesministerium für Familie, Senioren, Frauen und Jugend (BMFSFJ) aus
+##      Mitteln des Europäischen Sozialfonds (ESF)</p>
+##    </div>
+##    <div class="traeger_name_img">
+##      <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" >
+##      </a>	
+##      <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" >
+##      </a>
+##    </div>
+##  </div>
+##</div>
+##<div class="traeger">
+##  <div class="traeger_name">
+##    <h2>mpuls WASKA</h2>
+##    <div class="traeger_name_text">
+##      <p>
+##      mpuls WASKA wurde seitens des Projektträgers im Deutschen Zentrum für Luft- und
+##      Raumfahrt e.V. (PT-DLR) von Dr. Olga Burkova, Max Kamp und Frank Tönnissen
+##      (Projektleitung) entwickelt und eingeführt.
+##      </p>
+##    </div>
+##    <div class="traeger_name_img">
+##      <a href="http://www.dlr.de/" target="_blank"><img class="" title="Logo Deutsches Luft- und Raumfahrtzentrum"
+##      alt="Logo Deutsches Luft- und Raumfahrtzentrum" src="/images/logo_dlr.png" style="border:0">
+##      </a>
+##    </div>
+##  </div>
+##</div>
+##<div class="traeger">
+##  <div class="traeger_name">
+##    <h2>Lizenz</h2>
+##    <div class="traeger_name_text">
+##      <p>WASKA is free software: you can redistribute it and/or modify it under
+##      the terms of the GNU Affero General Public License as published by the
+##      Free Software Foundation, either version 3 of the License, or (at your
+##      option) any later version.</p>
+##    </div>
+##    <div class="traeger_name_img">
+##      <a href="http://www.gnu.org/licenses/agpl.html" target="_blank">
+##        <img src="/images/agplv3-155x51.png" alt="Logo GPL3" style="border:0">
+##      </a>
+##    </div>
+##  </div>
+##</div>
+##<div class="traeger">
+##  <div class="traeger_name">
+##    <h2>Technische Umsetzung</h2>
+##    <div class="traeger_name_text">
+##      <p>Design und Implementation der Software durch die Intevation GmbH:
+##      Frank Koormann (Projektleitung), Sascha Teichmann und Torsten Irländer,
+##      unterstützt durch Bernhard Reiter, Benjamin Kirschner, Bernhard Herzog
+##      und Sascha Wilde.</p>
+##      <p>Unterstützung beim Datenbankkonzept durch <a href="http://www.dataintransit.com" target="_blank">data in transit</a> (Jutta Horstmann)</p>
+##    </div>
+##    <div class="traeger_name_img">
+##      <a href="http://www.intevation.de/" target="_blank">
+##        <img src="/images/logo_intevation.png" alt="Logo Intevation" style="border:0">
+##      </a>
+##    </div>
+##  </div>
+##</div>
+
 <div>
 <h1>${_('responsible_info_sponsorship')}</h1>
 <div class="traeger">
@@ -87,7 +162,6 @@
 </div>
 </div>
 </div>
-
 <div class="clearer"></div>
 
 

Modified: trunk/waskaweb/templates/start/start.mako
===================================================================
--- trunk/waskaweb/templates/start/start.mako	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/templates/start/start.mako	2008-08-13 13:15:49 UTC (rev 56)
@@ -31,7 +31,11 @@
   % else:
   <h2>Automatisierte Wiedervorlagen</h2>
   <%include file="/start/remindlist.mako"/>
-  <h2>Eigene Termine</h2>
-  <%include file="/start/appointmentlist.mako"/>
+  %if h.hasRole('cm_ka'):
+    <h2>Eigene Termine</h2>
+    <%include file="/start/appointmentlist.mako"/>
   % endif
+  <h2>Agenturtermine</h2>
+  <%include file="/start/globalappointmentlist.mako"/>
+  % endif
 % endif

Added: trunk/waskaweb/tests/functional/test_logbook.py
===================================================================
--- trunk/waskaweb/tests/functional/test_logbook.py	2008-08-13 13:15:18 UTC (rev 55)
+++ trunk/waskaweb/tests/functional/test_logbook.py	2008-08-13 13:15:49 UTC (rev 56)
@@ -0,0 +1,7 @@
+from waskaweb.tests import *
+
+class TestLogbookController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url_for(controller='logbook'))
+        # Test response...



More information about the Mpuls-commits mailing list