[Mpuls-commits] r50 - in trunk: . waskaweb/config waskaweb/controllers waskaweb/i18n/de/LC_MESSAGES waskaweb/lib waskaweb/model waskaweb/public/images/icons waskaweb/public/styles waskaweb/templates waskaweb/templates/appointments waskaweb/templates/casemanagement waskaweb/templates/start waskaweb/templates/usersettings

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


Author: thomas
Date: 2008-08-13 15:14:11 +0200 (Wed, 13 Aug 2008)
New Revision: 50

Added:
   trunk/waskaweb/public/images/icons/extern_link.png
   trunk/waskaweb/templates/main_help.mako
Modified:
   trunk/ChangeLog.txt
   trunk/Changes.txt
   trunk/waskaweb/config/routing.py
   trunk/waskaweb/controllers/CaseBase.py
   trunk/waskaweb/controllers/case.py
   trunk/waskaweb/controllers/case_overview.py
   trunk/waskaweb/controllers/rg_aid.py
   trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po
   trunk/waskaweb/lib/base.py
   trunk/waskaweb/lib/db.py
   trunk/waskaweb/lib/evaluation.py
   trunk/waskaweb/lib/security.py
   trunk/waskaweb/lib/validators.py
   trunk/waskaweb/model/appointment.py
   trunk/waskaweb/model/case.py
   trunk/waskaweb/public/styles/screen.css
   trunk/waskaweb/templates/appointments/show_body.mako
   trunk/waskaweb/templates/casemanagement/bundle_standin.mako
   trunk/waskaweb/templates/casemanagement/downloadCSV.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/usersettings/change_password.mako
Log:
Load 8e4cff730d21 into trunk.


Modified: trunk/ChangeLog.txt
===================================================================
--- trunk/ChangeLog.txt	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/ChangeLog.txt	2008-08-13 13:14:11 UTC (rev 50)
@@ -1,3 +1,175 @@
+2008-05-21 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Another Fix for issue387
+
+	* waskaweb/public/styles/screen.css,
+ 	  waskaweb/templates/start/help.mako,
+ 	  waskaweb/public/images/icons/extern_link.png:Added icons to the
+	  external links on the help page to make it more clear that the user
+	  leaves the application on this point. 
+
+	Tagged as Version 1.0
+
+2008-05-20 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue387
+
+	* waskaweb/templates/start/help.mako: Added link to an external FAQ
+	  for the CM at the PT-DLR site.
+
+2008-05-20	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* Changes.txt: Adjusted for Beta 30
+
+2008-05-16	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue263
+
+	* waskaweb/lib/security.py: Try to encode password as ASCII. If
+	  this fails an invalid password is given and login fails.
+
+2008-05-16 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue357 (part3)
+
+	* waskaweb/controllers/CaseBase.py,
+	  waskaweb/controllers/case.py: Use url_for function istead of
+	  ahrdcoding the url in the redirect method. Removed try except block
+	  which prevents redirects to work as expected. Redirects are relaized
+	  as exceptions in Pylons. Too general catching of exceptions lead to
+	  problemes.
+
+2008-05-16	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue357 (part 2)
+
+	* waskaweb/controllers/CaseBase.py: Added a getNavigation()
+	  method which redirects to case overview ig no navigation exists.
+	
+	* waskaweb/controllers/case.py, waskaweb/controllers/rg_aid.py:
+	  use the new getNavigation() method.
+
+2008-05-16	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue297
+
+	* waskaweb/lib/security.py: Removed redundant call to method getDbName()
+
+	* waskaweb/templates/casemanagement/downloadCSV.mako:
+	  Added warning about MS Excel
+
+	* waskaweb/templates/casemanagement/overview.mako: Reordered
+	  export options.
+
+2008-05-16 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue200, issue136
+
+	* waskaweb/config/routing.py,
+	  waskaweb/controllers/case_overview.py,
+	  waskaweb/templates/main.mako: Searchoptions are now saved in a
+	  session and will be reused unitl the user selects the case overview
+	  from the mainmenu. In this case the session will be reset and a
+	  search is done with the default search options.
+
+
+2008-05-15	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue262
+
+	* waskaweb/model/case.py: Catch KeyErrors for none-existing
+	  parameters.
+
+2008-05-15	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue287
+
+	* waskaweb/lib/db.py: replaced '\' with '\\' in passwords.
+
+2008-05-15	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue357
+
+	* waskaweb/controllers/CaseBase.py,
+	  waskaweb/controllers/case.py: redirect to case overview if we 
+	  don't have a session.
+
+2008-05-15	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue360
+
+	* waskaweb/lib/security.py: The user identity is only the browser
+	  signature.
+
+2008-05-15 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue351
+
+	* waskaweb/controllers/case.py,
+	  waskaweb/model/appointment.py,
+	  waskaweb/templates/appointments/show_body.mako: Changed behavior if
+	  the user enters no enddate. Now the enddate will be NULL in
+	  database. Changed the SQL-Statement. If no enddate ist given, than
+	  take startdatum as enddatum (coalesce).
+	  Further fixed an ISE when entering a date in a wrong format while
+	  editing a appointment.
+
+	Fixed issue222:
+
+	* waskaweb/i18n/de/LC_MESSAGES/waskaweb.po,
+	  waskaweb/lib/validators.py,
+	  waskaweb/templates/usersettings/change_password.mako: Fixed spelling
+	  and removed dupclicated columns. Changed error-message in case the
+	  user enters an unsafe password.
+
+	Fixed issue379:
+
+	* waskaweb/controllers/case_overview.py,
+	  waskaweb/templates/casemanagement/bundle_standin.mako: Usergroups
+	  are now loaded for selecting groups as standin. Modfied mako
+	  template to work with usergroups.
+
+2008-05-14 	Torsten Irlaender  <torsten.irlaender at intevation.de>
+
+	Fixed issue372
+	
+	* waskaweb/lib/evaluation.py: Changed SQL query of Evaluation 7. It
+	  was a worng table referenced.
+
+	Fixed issue374
+
+	* M waskaweb/lib/evaluation.py: Check if there will be a
+	  null-devision. If so set divisor to 1.
+
+2008-05-14	Sascha L. Teichmann <teichmann at intevation.de>
+
+	Fixed issue375
+
+	* waskaweb/templates/casemanagement/organisation.mako: Uses
+	  group name correctly now.
+
+2008-05-13	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/templates/main_help.mako: New. Was missing. Caused an
+	  ISE when clicking on on-line help.
+
+2008-05-13	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/controllers/case.py: Removed printing of new errors to Apache
+	  error log while saving a page. This spamed the the log a lot.
+
+2008-05-13	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/lib/base.py: Added error logging when raising HTTPUnauthorized
+	  exceptions.
+
+2008-05-13	Sascha L. Teichmann <teichmann at intevation.de>
+
+	* waskaweb/controllers/case.py: Removed wrong check for changed cases in
+	  edit controller which pervented editing 'Unterstuezungsangebote'.
+
+	* Changes.txt: Replaced tabs with spaces.
+
 2008-05-09	Sascha L. Teichmann <teichmann at intevation.de>
 
 	* waskaweb/lib/xmlimport.py: lower() incoming uuids to prevent

Modified: trunk/Changes.txt
===================================================================
--- trunk/Changes.txt	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/Changes.txt	2008-08-13 13:14:11 UTC (rev 50)
@@ -1,3 +1,26 @@
+Beta 30:
+
+    Verbessert:
+
+        Ohne Fehlernummer:
+            - Das Aktivieren der Online-Hilfe in der Fallakte führte zu ISEs
+            - Unterstützungsangebote konnten nicht bearbeitet werden.
+        
+        issue136: Nach Fallakten->Suche sollte der Such-String wieder im Eingabefeld erscheinen.
+        issue200: "Aktion für Auswahl ausführen" gibt in zwei Fällen keinen Hinweis zurück
+        issue222: Fehlerhafte Fehlermeldung bei Passwortänderung
+        issue262: Apache Log: Key Error
+        issue263: ApacheLog: UnicodeEncodeError
+        issue287: Backslash in Passworten bereitet Probleme
+        issue297: CSV- und XLS-Export fehlerhaft
+        issue351: Termine: Endzeitpunkt von Terminen
+        issue357: ISE: Rendern der Navigation schlägt fehl, wenn keine Fallakte in der Session steckt.
+        issue360: Support: Sporadische Fehlermeldung "Unauthorized"
+        issue372: Auswertung: SGB XII nicht berücksichtigt
+        issue374: Auswertung: Float division
+        issue375: NameError - Apache error log
+        issue379: Vertretung für mehrere Fallakten zuweisen
+
 Beta 29:
 
     Neu:
@@ -12,14 +35,14 @@
 
         * Die Länge des Fallaktenausdrucks wurde verkürzt.
 
-	* Termine werden noch 1 Tag nach ihrem Ablauf in den Übersichten
-	  angezeigt.
+        * Termine werden noch 1 Tag nach ihrem Ablauf in den Übersichten
+          angezeigt.
 
-	* Die Aufteilung der Termine auf dem schwarzen Brett wurde leicht
-	  verändert. Der Bereich automatische Wiedervorlagen enthält nur noch
-	  Wiedervorlagen die durch das System aufgrund von überschrittenen
-	  Speicherfristen automatische generiert wurden. Der Bereich "Eigene
-	  Termine" enthälte alle durch den Benutzer angelegten Termine.
+        * Die Aufteilung der Termine auf dem schwarzen Brett wurde leicht
+          verändert. Der Bereich automatische Wiedervorlagen enthält nur noch
+          Wiedervorlagen die durch das System aufgrund von überschrittenen
+          Speicherfristen automatische generiert wurden. Der Bereich "Eigene
+          Termine" enthälte alle durch den Benutzer angelegten Termine.
 
     Verbessert:
 
@@ -32,7 +55,7 @@
         issue223: Gesamte Fallakte drucken: Reihenfolge der Seite nicht korrekt
         issue241: Rechtschreibfehler: Schulttest statt Schultest
         issue248: Import Fallakte 1.0
-	issue256: Dropdownliste Übertragen Fallakte
+        issue256: Dropdownliste Übertragen Fallakte
         issue259: CSV-Ausgabe/ interne Auswerung unvollständig
         issue265: ApacheLog: File does not exist
         issue297: CSV- und XLS-Export fehlerhaft
@@ -73,8 +96,8 @@
             - verschwinden, wenn das zugehörigen Datum
               verstrichen ist.
 
-	    - In der Fallübersicht wird die verbleibenden Restzeit bis zur
-	      nächsten Wiedervorlage angezeigt (ab 14 Tage).
+      - In der Fallübersicht wird die verbleibenden Restzeit bis zur
+        nächsten Wiedervorlage angezeigt (ab 14 Tage).
 
             - können auch manuell angelegt werden.
 
@@ -127,102 +150,102 @@
 
 Beta 27:
 
-	Neu: 
-		Speicherung der letzten Zugriffszeit
-		====================================
+  Neu: 
+    Speicherung der letzten Zugriffszeit
+    ====================================
 
-		* Bei einer Bearbeitung der Fallakte wird nun das das letzte
-		  Bearbeitungsdatum gespeichert und in der Fallaktenübersicht
-		  angezeigt.
+    * Bei einer Bearbeitung der Fallakte wird nun das das letzte
+      Bearbeitungsdatum gespeichert und in der Fallaktenübersicht
+      angezeigt.
 
-		  Bitte beachten Sie, dass bis zur ersten Bearbeitung der Fallakte das
-		  Datum des Erstellens der Fallakte in WASKA angezeigt wird. Bei der
-		  nächsten Bearbeitung wird dieses Datum dann aktualisiert.
+      Bitte beachten Sie, dass bis zur ersten Bearbeitung der Fallakte das
+      Datum des Erstellens der Fallakte in WASKA angezeigt wird. Bei der
+      nächsten Bearbeitung wird dieses Datum dann aktualisiert.
 
-		Anonymisierung der Fallakte:
-		============================
+    Anonymisierung der Fallakte:
+    ============================
 
-		* Die Fallakte kann nun durch den Bearbeiter anonymisiert
-		  werden. Hierzu findet sich im Abschnitt "Datenschutz" nun
-		  die Funktion "Fallakte anonymisieren". 
-		  Eine Anonymisierung führt zu einer Löschung der
-		  personenbezogenen Daten der Fallakte. Die Fallakte steht
-		  nach einer Anonymisierung nicht mehr für eine Bearbeitung
-		  zur Verfügung. Weitere Punkte die bezüglich anonymisierter
-		  Fallakten zu beachten gilt: 
+    * Die Fallakte kann nun durch den Bearbeiter anonymisiert
+      werden. Hierzu findet sich im Abschnitt "Datenschutz" nun
+      die Funktion "Fallakte anonymisieren". 
+      Eine Anonymisierung führt zu einer Löschung der
+      personenbezogenen Daten der Fallakte. Die Fallakte steht
+      nach einer Anonymisierung nicht mehr für eine Bearbeitung
+      zur Verfügung. Weitere Punkte die bezüglich anonymisierter
+      Fallakten zu beachten gilt: 
 
-		  	- Anonymisierte Fallakten fließen weiterhin in die
-			  Auswertungen mit ein. 
+        - Anonymisierte Fallakten fließen weiterhin in die
+        Auswertungen mit ein. 
 
-			- Anonymisierte Fallakten können nur durch die
-			  Administration gelöscht werden.
+      - Anonymisierte Fallakten können nur durch die
+        Administration gelöscht werden.
 
-		  Weiter Erläuterungen welche personenbezogenen Daten
-		  anonymisiert werden finden Sie unter:
-		  	
-			http://waska-anwender.intevation.de/download/WASKA-Erlaeuterungen_Anonymisierung.pdf
+      Weiter Erläuterungen welche personenbezogenen Daten
+      anonymisiert werden finden Sie unter:
+        
+      http://waska-anwender.intevation.de/download/WASKA-Erlaeuterungen_Anonymisierung.pdf
 
-		* Anonymisierte Fallakten können in der Fallaktenübersicht
-		  eingeblendet werden. Dies dient in der Hauptsache zur Steigerung der
-		  Transparenz des Aktenbestandes. Auf diese Weise ist ersichtlich
-		  wieviele Fälle anonymisiert wurden.
+    * Anonymisierte Fallakten können in der Fallaktenübersicht
+      eingeblendet werden. Dies dient in der Hauptsache zur Steigerung der
+      Transparenz des Aktenbestandes. Auf diese Weise ist ersichtlich
+      wieviele Fälle anonymisiert wurden.
 
-		Zurückziehen Einwilligungserklärung:
-		====================================
+    Zurückziehen Einwilligungserklärung:
+    ====================================
 
-		* Eine einmal gesetzte Einwilligungserklärung kann nun zurückgezogen
-		  werden. Das Zurückziehen der Einverständniserklärung führt zur
-		  Anonymisierung der personenbezogenen Daten.
+    * Eine einmal gesetzte Einwilligungserklärung kann nun zurückgezogen
+      werden. Das Zurückziehen der Einverständniserklärung führt zur
+      Anonymisierung der personenbezogenen Daten.
 
-		* Der Arbeitsablauf zum Setzen und Zurückziehen der
-		  Einverständniserklärung wurde um Dialoge erweitert, die den
-		  Arbeitslauf transparenter und verständlicher machen sollen.
+    * Der Arbeitsablauf zum Setzen und Zurückziehen der
+      Einverständniserklärung wurde um Dialoge erweitert, die den
+      Arbeitslauf transparenter und verständlicher machen sollen.
 
-		CSV-Export:
-		===========
+    CSV-Export:
+    ===========
 
-		* Fallakten können über die Fallaktenübersicht als CSV-Datei
-		  exportiert werden. Die CSV-Datei z.B. für Auswertungen in
-		  externen Programmen verwendet werden. Zum Export der Fallakten müssen diese
-		  zunächst markiert und dann aus der Auswahlliste die
-		  entsprechende Funktion ausgewählt werden. 
-		  Bitte beachten Sie, dass sich eine CSV Datei _nicht_ für den
-		  Austausch (Export und Import) von Fallakten zwischen
-		  verschiedenen Systemen eignet. Diese Funktionalität wird in
-		  der kommenden Version in WASKA enthalten sein.
+    * Fallakten können über die Fallaktenübersicht als CSV-Datei
+      exportiert werden. Die CSV-Datei z.B. für Auswertungen in
+      externen Programmen verwendet werden. Zum Export der Fallakten müssen diese
+      zunächst markiert und dann aus der Auswahlliste die
+      entsprechende Funktion ausgewählt werden. 
+      Bitte beachten Sie, dass sich eine CSV Datei _nicht_ für den
+      Austausch (Export und Import) von Fallakten zwischen
+      verschiedenen Systemen eignet. Diese Funktionalität wird in
+      der kommenden Version in WASKA enthalten sein.
 
-		Sonstiges:
-		==========
+    Sonstiges:
+    ==========
 
-		* In der Fallaktenübersicht von Nutzern in der Rolle "CM-KA" wird
-		  zusätzlich der Zeitpunkt der letzen Bearbeitung an der Fallakte
-		  angezeigt. 
-		  Bitte beachten Sie, dass hier für jede Fallakte zunächst das Datum
-		  steht an dem die Fallakte angelegt wurde, bzw in WASKA importiert
-		  wurde. Das Feld wird dann bei der nächsten Bearbeitung aktualisiert.
+    * In der Fallaktenübersicht von Nutzern in der Rolle "CM-KA" wird
+      zusätzlich der Zeitpunkt der letzen Bearbeitung an der Fallakte
+      angezeigt. 
+      Bitte beachten Sie, dass hier für jede Fallakte zunächst das Datum
+      steht an dem die Fallakte angelegt wurde, bzw in WASKA importiert
+      wurde. Das Feld wird dann bei der nächsten Bearbeitung aktualisiert.
 
 
-	Verbessert:
+  Verbessert:
 
-		* Auswertung des Migrationshintergrund: Es wurde ein Fehler in
-		  der Auswertungsfunktion zum Migrationshintergrund behoben, der
-		  dazu führt, dass zu viele Jugendliche in der Auswertung einen
-		  Migrationshintergrund hatten.
+    * Auswertung des Migrationshintergrund: Es wurde ein Fehler in
+      der Auswertungsfunktion zum Migrationshintergrund behoben, der
+      dazu führt, dass zu viele Jugendliche in der Auswertung einen
+      Migrationshintergrund hatten.
 
-		* Die Fallaktenübersicht zeigt nun auch die Fälle, für die weder der
-		  Vorname, der Nachname, noch die Kundennummer eingetragen wurde.
-		
+    * Die Fallaktenübersicht zeigt nun auch die Fälle, für die weder der
+      Vorname, der Nachname, noch die Kundennummer eingetragen wurde.
+    
 Beta 25:
 
     Verbessert:
 
-	* Die Auswertungen sind visuell verschiedenen Gruppen zugeordnet:
-		
-		+ Auswertungen über alle Jugendlichen
-		+ Auswertung über Jugendliche im Case-Management
-		+ Auswertung über Jugendliche, die das CM abgeschlossen haben
+  * Die Auswertungen sind visuell verschiedenen Gruppen zugeordnet:
+    
+    + Auswertungen über alle Jugendlichen
+    + Auswertung über Jugendliche im Case-Management
+    + Auswertung über Jugendliche, die das CM abgeschlossen haben
 
-	* Kleinere Textänderungen in der Auswertung
+  * Kleinere Textänderungen in der Auswertung
 
 Beta 23:
     Neu:

Modified: trunk/waskaweb/config/routing.py
===================================================================
--- trunk/waskaweb/config/routing.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/config/routing.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -36,6 +36,7 @@
     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/:action/:confirmed', controller="case_overview") #for bundles actions in case_overview
     map.connect('agency_overview/:action/:confirmed', controller="agency_overview") #for bundles actions in agency_overview
     map.connect(':controller/:action/:id/:confirmed')

Modified: trunk/waskaweb/controllers/CaseBase.py
===================================================================
--- trunk/waskaweb/controllers/CaseBase.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/controllers/CaseBase.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -33,6 +33,10 @@
         except LoadCaseNotExistsError:
             self.showError()
 
+    def getNavigation(self):
+        if self.navigation: return self.navigation
+        redirect_to(h.url_for(controller='/case_overview'))
+
     def _getRenderdFormElements(self, ti, ds_id, page_id=None, ro_mode=False):
         # Determine if we have an repeat group or a formular page
         what = int(ti.key) == 14 and "rg_aid_overview" or "formular"
@@ -54,7 +58,8 @@
 
     def _getFormNavigation(self,selected_key=None):
         case = session.get('case')
-        if not case: return ""
+        if not case or not self.navigation:
+            redirect_to(h.url_for(controller='/case_overview'))
         errors = case.getFormErrors()
         id     = case.id
         mode   = case.getMode()
@@ -64,10 +69,13 @@
         return self.navigation.render(select_url, toggle_url, selected_key) 
 
     def _getFormdata(self, treeItem, ds_id):
+        case = session.get('case')
+        if not case:
+            redirect_to(controller="/case_overview")
         doc  = g.formedTree
         help = g.helpData
         page = doc.getPageStore(treeItem.page, ds_id)
-        case = session.get('case')
+
         form_errors = case.getFormErrors()
         formdata = FormDataImpl(
             help=help, 

Modified: trunk/waskaweb/controllers/case.py
===================================================================
--- trunk/waskaweb/controllers/case.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/controllers/case.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -187,7 +187,7 @@
         c.maxsavetime = case.getState().getMaxSavetime()
         c.finished = case.getState().isCmFinished()
         c.canceled = case.getState().isCmCanceled()
-        #ti = self.navigation.getTreeItem('0')
+        #ti = self.getNavigation().getTreeItem('0')
         #if not ti: return '404'
         c.form_navigation = self._getFormNavigation()
         c.print_form = "digest" # Which page to open in popup on printing?
@@ -211,7 +211,7 @@
         case = self._loadCase(id)
         formular = []
         c.print_version = 1
-        for ti in self.navigation.getAllItems():
+        for ti in self.getNavigation().getAllItems():
             if ti.key in ['27', '28', '29', '30']: continue #ignoring empty aid pages
             content, navigation = self._getRenderdFormElements(ti, id, ro_mode=True)
             formular.append("""<h1>%s</h1>""" % ti.description)
@@ -220,7 +220,7 @@
             if ti.key == '14': # found aid-overview
                 aid_list = AidList(id)
                 for aid in aid_list.getDatasets():
-                    ti_rg   = self.navigation.getTreeItem(aid.page_id)
+                    ti_rg   = self.getNavigation().getTreeItem(aid.page_id)
                     content, navigation = self._getRenderdFormElements(ti_rg, aid.id, ro_mode=True)
                     formular.append("""<h1>%s</h1>""" % ti_rg.description)
                     formular.append(content)
@@ -322,15 +322,13 @@
     def edit(self, ds_id, page_id):
         ds_id        = self._checkInt(ds_id)
         page_id      = self._checkInt(page_id)
-        ti           = self.navigation.getTreeItem(page_id)
+        ti           = self.getNavigation().getTreeItem(page_id)
         c.ds_id      = ds_id
         real_id      = ti.realId(ds_id)
         # TODO: Move repieatgroup handling in an own controller
         #factory     = CaseFactory()
         #c.case      = factory.loadById(ds_id)
         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("edit")
         case_session.setPageId(page_id)
@@ -347,7 +345,7 @@
     def show(self, ds_id, page_id):
         ds_id        = self._checkInt(ds_id)
         page_id      = self._checkInt(page_id)
-        ti           = self.navigation.getTreeItem(page_id)
+        ti           = self.getNavigation().getTreeItem(page_id)
         c.ds_id      = ds_id
         real_id      = ti.realId(ds_id)
         c.page_id    = page_id
@@ -372,7 +370,7 @@
     def save(self):
         case_session = session.get('case')
         try:
-            ti = self.navigation.getTreeItem(request.params["page"])
+            ti = self.getNavigation().getTreeItem(request.params["page"])
         except:
             ti = None
 
@@ -399,7 +397,6 @@
         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))
-        print new_errors
         case_session.setFormErrors(new_errors)
         session.save()
 
@@ -421,7 +418,7 @@
 
             nkey = ti.nextKey()
             if not nkey is None:
-                nti = self.navigation.getTreeItem(nkey)
+                nti = self.getNavigation().getTreeItem(nkey)
                 if not nti is None:
                     ti = nti
                     ti.showPath()
@@ -629,6 +626,7 @@
             except formencode.Invalid, error:
                 c.form_result = error.value
                 c.form_errors = error.error_dict or {}
+                c.appointment = factory.loadById(c.form_result.get('id'))
                 form = render('/casemanagement/editAppointment.mako')
                 return formencode.htmlfill.render(unicode(form, 'utf-8'), \
                             defaults=c.form_result, \
@@ -732,13 +730,10 @@
     @checkRole(('admin_ka', 'cm_ka'))
     def documents(self, id):
         id = self._checkInt(id)
-        try:
-            c.ds_id = id
-            case = self._loadCase(id)
-            c.form_navigation = self._getFormNavigation()
-            c.files = case.getDocuments()
-        except:
-            return render('/tests/trace.mako')
+        c.ds_id = id
+        case = self._loadCase(id)
+        c.form_navigation = self._getFormNavigation()
+        c.files = case.getDocuments()
         return render('/documents/case_overview.mako')
 
     @checkRole('cm_ka')

Modified: trunk/waskaweb/controllers/case_overview.py
===================================================================
--- trunk/waskaweb/controllers/case_overview.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/controllers/case_overview.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -15,7 +15,7 @@
 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
+from waskaweb.model.user                    import UserListObject, UserObject, UserGroupList
 from waskaweb.controllers.CaseBase          import CasebaseController
 
 log = logging.getLogger(__name__)
@@ -50,6 +50,9 @@
 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_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."""
+
 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.""" 
@@ -67,93 +70,99 @@
         return self.overview()
 
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr'))
-    def overview(self):
-        c.cases = CaseOverview()
-        user = session['USER_AUTHORIZED']
+    def overview(self, reset=0):
+        reset = self._checkBool(reset)
+        if reset:
+            session['CASE_OVERVIEW_SELECTION'] = {}
+            session['CASE_OVERVIEW_SEARCHOPTIONS'] = {}
+            session.save()
+
         # 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) 
-        default_search_options = ['own:%s' % user.id, 'state:1']
-        c.cases.search(";".join(default_search_options))
+        c.userlist = ulo.getUserList(filter)
+
+        c.cases = CaseOverview()
+        default_search_options = {'show_own': u'1', \
+                        'search_str': u'', \
+                        'show_open': u'1'}
+
+        search_options = session.get('CASE_OVERVIEW_SEARCHOPTIONS') or default_search_options 
+        c.cases.search(";".join(self._parseSearchOptions(search_options)))
         c.cases.sortByLastname()
-        c.form_defaults = {'show_own': 1, \
-                        'show_other': 0, \
-                        'show_open': 1, \
-                        'show_closed': 0, \
-                        'show_markdelete': 0, \
-                        'show_anonymized': 0}
+        # Load case-selection and merge with default search options
+        form_defaults = self.merge_dict(search_options, session.get('CASE_OVERVIEW_SELECTION', {})) 
         overview = render('/casemanagement/overview.mako')
-        return formencode.htmlfill.render(unicode(overview, 'utf-8'),defaults=c.form_defaults)
+        return formencode.htmlfill.render(unicode(overview, 'utf-8'),defaults=form_defaults)
 
+    def _parseSearchOptions(self, options):
+        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()
         c.form_result = {}
         c.form_errors = {}
         try:
-            c.form_result = validator.to_python(request.params)
-            c.cases = CaseOverview()
-            # Userlisting to select cases of an praticular user. only available
-            # for admins
-            ulo = UserListObject()
-            filter = [u.id for u in ulo.getAdminList()]
-            c.userlist = ulo.getUserList(filter) 
-            search_str = []
-            user = session['USER_AUTHORIZED']
-            # editor or standin setting will be ignored for admin users. They will
-            # be overwritten in case-controller
-            if c.form_result.get('editor', '-1') != '-1':
-                search_str.append('editor:%s' % c.form_result.get('editor'))
-            if c.form_result.get('show_own') == '1':
-                search_str.append('own:%s' % user.id)
-            if c.form_result.get('show_other') == '1':
-                search_str.append('standin:%s' % user.id)
-
-            if c.form_result.get('show_open') == '1':
-                search_str.append('state:%s' % 1)
-            if c.form_result.get('show_closed') == '1':
-                search_str.append('state:%s' % 2)
-            if c.form_result.get('show_markdelete') == '1':
-                search_str.append('state:%s' % 3)
-            if c.form_result.get('show_anonymized') == '1':
-                search_str.append('state:%s' % 5)
-            search_str.append(c.form_result.get('search_str'))
-            c.cases.search(";".join(search_str))
-            c.search_str = c.form_result.get('search_str')
-            c.cases.sortByLastname()
+            form_result = validator.to_python(request.params)
         except formencode.Invalid, error:
-            c.form_result = error.value
-            c.form_errors = error.error_dict or {}
-            c.cases = CaseOverview()
-            c.cases.search()
-        overview = render('/casemanagement/overview.mako')
-        return formencode.htmlfill.render(unicode(overview, 'utf-8'),defaults=c.form_result, errors=c.form_errors, auto_insert_errors=False)
+            form_result = error.value
+            form_errors = error.error_dict or {}
+        session['CASE_OVERVIEW_SEARCHOPTIONS'] = form_result
+        session.save()
+        return self.overview()
 
     @checkRole(('admin_ka', 'cm_ka', 'pt_dlr'))
     def bundleAction(self):
         validator = BundleActionForm()
         c.context           = "../main.mako" 
         c.url_ok            = "/case_overview"
-        c.notification_for  = DIALOG_EMPTY_SELECTION    
-        c.notification_text = DIALOG_EMPTY_SELECTION_EXPLAINATION 
         try:
             data        = formencode.variabledecode.variable_decode(request.params)
+            session['CASE_OVERVIEW_SELECTION'] = data
+            session.save()
             form_result = validator.to_python(data)
             action      = form_result.get('action') 
             case_bundle = CaseBundle(form_result.get('case_id', []))
 
-            if action == 'no_action':
-                return self.overview() 
             if case_bundle.isEmpty():
+                c.notification_for  = DIALOG_EMPTY_SELECTION    
+                c.notification_text = DIALOG_EMPTY_SELECTION_EXPLAINATION 
                 return render('/casemanagement/dialogs/bundle_noselection.mako')
+            if action == 'no_action':
+                c.notification_for  = BUNDLE_NOTIFICATION_NOACTION_HEADER
+                c.notification_text = BUNDLE_NOTIFICATION_NOACTION 
+                return render('/casemanagement/dialogs/bundle_noselection.mako')
 
-            list   = UserListObject()
+            group_list   = UserGroupList()
+            user_list    = UserListObject()
             c.current_user = session['USER_AUTHORIZED']
-            filter = [u.id for u in list.getAdminList()]
-            filter.append(c.current_user.id)
-            c.user_list = list.getUserList(filter)
+            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))
@@ -223,7 +232,7 @@
             c.form_errors = error.error_dict or {}
             form = render('/casemanagement/overview.mako')
             return htmlfill.render(unicode(form, 'utf-8'), c.form_result, c.form_errors, auto_insert_errors=False)
-        return render('/casemanagement/overview.mako')
+        return self.overview()
 
     def _filterBundle(self, case_bundle, allowedstates):
         filtered = []

Modified: trunk/waskaweb/controllers/rg_aid.py
===================================================================
--- trunk/waskaweb/controllers/rg_aid.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/controllers/rg_aid.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -34,7 +34,7 @@
         identified by it id (rg_id) and its "type" (page_id)'''
         rg_id     = self._checkInt(rg_id)
         page_id   = self._checkInt(page_id)
-        ti        = self.navigation.getTreeItem(page_id)
+        ti        = self.getNavigation().getTreeItem(page_id)
         c.ds_id   = ti.realId(rg_id)
         c.page_id = page_id
 
@@ -55,7 +55,7 @@
         identified by it id (rg_id) and its "type" (page_id)'''
         rg_id     = self._checkInt(rg_id)
         page_id   = self._checkInt(page_id)
-        ti        = self.navigation.getTreeItem(page_id)
+        ti        = self.getNavigation().getTreeItem(page_id)
         c.ds_id   = ti.realId(rg_id)
         c.page_id = page_id
 

Modified: trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po
===================================================================
--- trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/i18n/de/LC_MESSAGES/waskaweb.po	2008-08-13 13:14:11 UTC (rev 50)
@@ -468,7 +468,7 @@
 
 #: waskaweb/templates/main.mako:185
 msgid "footer_version"
-msgstr "09.05.2008 | Beta 29"
+msgstr "09.05.2008 | Version 1.0"
 
 #: waskaweb/templates/main_login.mako:38
 #: waskaweb/templates/start/responsible.mako:74
@@ -2553,14 +2553,14 @@
 #: waskaweb/templates/usersettings/change_password_login.mako:20
 #: waskaweb/templates/usersettings/change_password_login.mako:23
 msgid "adm_form_newuser_passwd"
-msgstr "Neues Passwort eingeben:"
+msgstr "Neues Passwort eingeben"
 
 #: waskaweb/templates/usersettings/change_password.mako:41
 #: waskaweb/templates/usersettings/change_password.mako:44
 #: waskaweb/templates/usersettings/change_password_login.mako:29
 #: waskaweb/templates/usersettings/change_password_login.mako:32
 msgid "adm_form_newuser_passwd_confirm"
-msgstr "Neues Passwort wiederholen:"
+msgstr "Neues Passwort wiederholen"
 
 #: waskaweb/templates/usersettings/change_password.mako:50
 #: waskaweb/templates/usersettings/change_password_login.mako:38

Modified: trunk/waskaweb/lib/base.py
===================================================================
--- trunk/waskaweb/lib/base.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/lib/base.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -27,6 +27,9 @@
 
 from waskaweb.lib.timelog import timeLog
 
+COOKIE_NOT_FOUND = "Cookie konnte nicht gefunden werden. Haben Sie Cookies in Ihrem Browser aktiviert?"
+IDENTITY_CHANGED = "Ihre Identitaet hat sich geaendert."
+
 class BaseController(WSGIController):
     def __init__(self):
         self.db = None
@@ -41,10 +44,12 @@
             try:
                 shared = request.cookies['waska_auth']
             except KeyError:
-                raise HTTPUnauthorized()
+                print >> sys.stderr, "Cannot find waska_auth cookie -> HTTPUnauthorized"
+                raise HTTPUnauthorized(detail = COOKIE_NOT_FOUND)
 
             if storedHash != md5.new(shared + userIdentity()).digest():
-                raise HTTPUnauthorized()
+                print >> sys.stderr, "Stored hash does't match new hash -> HTTPUnauthorized"
+                raise HTTPUnauthorized(detail = IDENTITY_CHANGED)
         except KeyError:
             pass
 

Modified: trunk/waskaweb/lib/db.py
===================================================================
--- trunk/waskaweb/lib/db.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/lib/db.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -23,7 +23,7 @@
     def __init__(self, dbname, user, password, host='localhost', port=5432):
         self.dbname      = dbname 
         self.user        = user
-        self.password    = password
+        self.password    = password.replace("\\", "\\\\")
         self.host        = host
         self.port        = int(port)
         self.conn        = None

Modified: trunk/waskaweb/lib/evaluation.py
===================================================================
--- trunk/waskaweb/lib/evaluation.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/lib/evaluation.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -158,9 +158,11 @@
                     else:
                         r[2][0] += 1
 
-                r[0][1] = "%s" % h.formatNumber(float(r[0][0])/float(self.total_cm)*100)
-                r[1][1] = "%s" % h.formatNumber(float(r[1][0])/float(self.total_cm)*100)
-                r[2][1] = "%s" % h.formatNumber(float(r[2][0])/float(self.total_cm)*100)
+                if self.total_cm == 0: divisor = 1
+                else: divisor = self.total_cm
+                r[0][1] = "%s" % h.formatNumber(float(r[0][0])/float(divisor)*100)
+                r[1][1] = "%s" % h.formatNumber(float(r[1][0])/float(divisor)*100)
+                r[2][1] = "%s" % h.formatNumber(float(r[2][0])/float(divisor)*100)
             finally:
                 db.recycleConnection(conn, c1)
         except StandardError, err: 
@@ -325,12 +327,12 @@
 
     def perform(self):
         result = {}
-        sql = """select r.id, count(m.veraenderungen_rechtskreis), r.value from master_tbl_eval_incm_view m
-                 join rechtlicher_kontext_tbl r
-                 on r.id = m.veraenderungen_rechtskreis
-                 where art_beendigung <> -1
-                 group by r.id, r.value
-                 order by r.id asc"""
+        sql ="""select r.id, count(m.veraenderungen_rechtskreis), r.value from master_tbl_eval_total_view m 
+                    right join veraenderungen_rechtskreis_tbl r 
+                    on m.veraenderungen_rechtskreis = r.id
+                    where art_beendigung <> -1
+                    group by r.id, r.value having r.id is not null
+                    order by r.id asc"""
         try:
             conn, c1 = None, None
             try:
@@ -343,22 +345,17 @@
                     result[r[0]] = []
                     try:
                         result[r[0]].append(
-                            u'%s' % unicode(r[2], "utf-8")) # name
+                            u'%s' % unicode(r[2], 'utf-8')) # name
+                        result[r[0]].append(r[1]) # how many?
                         result[r[0]].append(
-                            r[1]) # how many?
-                        try:
-                            result[r[0]].append(
-                                "%s" % h.formatNumber(
-                                    float(r[1])/float(divisor)*100))
-                        except:
-                            result[r[0]].append("%s" % h.formatNumber(0.0))
+                            "%s" % h.formatNumber(
+                                float(r[1])/float(divisor)*100))
                     except StandardError, err:
-                        print >> sys.stderr, str(
-                            'Error on assigning values: %s' % err)
+                        print >> sys.stderr, str(err)
             finally:
                 db.recycleConnection(conn, c1)
         except StandardError, err:
-            print >> sys.stderr, str('No results for eval 7: %s' % err)
+            print >> sys.stderr, str('no results for eval 7: %s' % err)
         return result 
 
     def doExport(self, f):

Modified: trunk/waskaweb/lib/security.py
===================================================================
--- trunk/waskaweb/lib/security.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/lib/security.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -16,6 +16,8 @@
 import random
 import md5
 
+from codecs import getdecoder
+
 import psycopg2 as dbapi
 
 from waskaweb.lib.helpers import hasRole
@@ -38,11 +40,23 @@
 """Sie sind nicht authorisiert, das angeforderte Dokument anzuschauen.
 """
 
+ASCII_DECODER = getdecoder("ascii")
+
+def validPassword(s):
+    try:
+        ASCII_DECODER(s)
+    except (UnicodeEncodeError, UnicodeDecodeError):
+        return False
+    return True
+
 def checkLogin(user, password):
 
     dbname = getDbName()
-    if not dbname: return None # Failed to fetch dbname from SSL certifacate 
-    if not check_re.match(user) or not check_re.match(dbname):
+    if not password                \
+    or not validPassword(password) \
+    or not dbname                  \
+    or not check_re.match(user)    \
+    or not check_re.match(dbname):
         return None
 
     try:
@@ -59,7 +73,7 @@
             try:
                 conn = db.getConnection()
                 cursor = conn.cursor()
-                login = "ka_%s_%s" % (getDbName(), user)
+                login = "ka_%s_%s" % (dbname, user)
                 fields = {'login': login}
                 cursor.execute(FETCH_USER_DATA_SQL, fields)
                 try:
@@ -116,9 +130,7 @@
 
 def userIdentity():
     env = request.environ
-    return "%s%s" % (
-        subnet(env.get('REMOTE_ADDR', '')), 
-        env.get('HTTP_USER_AGENT', ''))
+    return "%s" % env.get('HTTP_USER_AGENT', '')
 
 def getDbName():
     dbname = None

Modified: trunk/waskaweb/lib/validators.py
===================================================================
--- trunk/waskaweb/lib/validators.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/lib/validators.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -63,13 +63,14 @@
 
     min = 8
     non_letter = 2
+    non_letter_literal = "zwei" 
     letter_regex = re.compile(r'[a-zA-Z]')
 
     messages = {
         'too_few': u'Ihr Passwort muss mindestens %(min)i '
                   u'Zeichen lang sein',
-        'non_letter': u'Sie m&uuml;ssen mindestens %(non_letter)i '
-                     u'Nicht-Buchstaben in ihrem Passwort verwenden.',
+        'non_letter': u'Sie m&uuml;ssen mindestens %(non_letter)s '
+                     u'Nicht-Buchstaben in Ihrem Passwort verwenden.',
         'only_ascii': u'Das Passwort darf nur aus ASCII-Zeichen bestehen.'
         }
 
@@ -88,7 +89,7 @@
             raise formencode.Invalid(self.message("too_few", state, min=self.min), value, state)
         non_letters = self.letter_regex.sub('', value)
         if len(non_letters) < self.non_letter:
-            raise formencode.Invalid(self.message("non_letter", state, non_letter=self.non_letter), value, state)
+            raise formencode.Invalid(self.message("non_letter", state, non_letter=self.non_letter_literal), value, state)
 
 class LoginCheck(formencode.validators.FancyValidator):
 

Modified: trunk/waskaweb/model/appointment.py
===================================================================
--- trunk/waskaweb/model/appointment.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/model/appointment.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -18,7 +18,7 @@
 from waskaweb.model.user   import UserObject
 
 GET_GLOBAL_APPOINTMENT_SQL = "SELECT id, master_id, sdatum, edatum, name, beschreibung, art FROM ka_global_termine_tbl_view WHERE id = %(id)s"
-GET_GLOBAL_APPOINTMENTLIST_SQL = "SELECT id, master_id, sdatum, edatum, name, beschreibung, art FROM ka_global_termine_tbl_view WHERE edatum::date+1 >= %(date)s ORDER BY sdatum"
+GET_GLOBAL_APPOINTMENTLIST_SQL = "SELECT id, master_id, sdatum, edatum, name, beschreibung, art FROM ka_global_termine_tbl_view WHERE coalesce(edatum, sdatum)::date+1 >= %(date)s ORDER BY sdatum"
 DELETE_GLOBAL_APPOINTMENT_SQL = "select delete_global_termin_ds(%(id)s)"
 CREATE_GLOBAL_APPOINTMENT_SQL = "select create_global_termin_ds()"
 STORE_GLOBAL_APPOINTMENT_SQL = "UPDATE ka_global_termine_tbl_view SET \
@@ -30,9 +30,9 @@
                                 WHERE id = %(id)s"
 
 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 edatum::date+1 >= %(date)s AND art = 0 ORDER BY sdatum"
+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 edatum::date+1 >= %(date)s AND art = 0 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"
 DELETE_CASE_APPOINTMENT_SQL = "select delete_fall_termin_ds(%(id)s)"
 CREATE_CASE_APPOINTMENT_SQL = "select create_fall_termin_ds(%(id)s)"
@@ -316,8 +316,14 @@
     def _convertStr2Date(self, str, format=None):
         str = str.strip()
         date, time = str.split(' ')
-        d,m,Y = date.split('.')
-        H,M = time.split(':')
+        try:
+            d,m,Y = date.split('.')
+        except: 
+            return None
+        try:
+            H,M = time.split(':')
+        except:
+            H,M = (0,0)
         return datetime(int(Y),int(m),int(d),int(H),int(M))
 
     def getStartDate(self):
@@ -327,7 +333,10 @@
         return self.end_date
 
     def getDuration(self):
-        return self.end_date - self.start_date
+        if self.end_date:
+            return self.end_date - self.start_date
+        else:
+            return None
 
     def setData(self, data):
         '''Sets values of the appointment to data. Data is a dict returned from formencode'''
@@ -338,12 +347,15 @@
         sdate = "%s %s" % (data.get('start_date'), data.get('start_time'))
         self.start_date = self._convertStr2Date(sdate)
 
-        # If not end_date is given, than end_date is equal to start_date 
-        if not data.get('end_date') or not data.get('end_time'):
-            self.end_date   = self.start_date
-        else:
-            edate = "%s %s" % (data.get('end_date'), data.get('end_time'))
-            self.end_date   = self._convertStr2Date(edate)
+        ## If not end_date is given, than end_date is equal to start_date 
+        #if not data.get('end_date') or not data.get('end_time'):
+        #    self.end_date   = self.start_date
+        #else:
+        #    edate = "%s %s" % (data.get('end_date'), data.get('end_time'))
+        #    self.end_date   = self._convertStr2Date(edate)
+        
+        edate = "%s %s" % (data.get('end_date'), data.get('end_time'))
+        self.end_date   = self._convertStr2Date(edate)
 
         self.description = data.get('description', self.description)
         self.case_id = data.get('case_id', self.case_id)

Modified: trunk/waskaweb/model/case.py
===================================================================
--- trunk/waskaweb/model/case.py	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/model/case.py	2008-08-13 13:14:11 UTC (rev 50)
@@ -35,6 +35,12 @@
 
 SAVE_SEARCH = re.compile(r'[^\w:; ]', re.UNICODE)
 
+def save_getone(params, k, v):
+    try:
+        return params.getone(k)
+    except KeyError:
+        return v
+
 # SQL STATEMENTS
 SEARCH_CASE_OVERVIEW_SQL = \
 """ SELECT
@@ -735,11 +741,11 @@
         return self.privacy_statement
 
     def setData(self, params):
-        self.last_name = params.getone("name_1")
-        self.first_name = params.getone("vorname_1")
-        self.street = params.getone("strasse")
-        self.plz = params.getone("plz")
-        self.city = params.getone("wohnort")
+        self.last_name  = save_getone(params, "name_1",    "")
+        self.first_name = save_getone(params, "vorname_1", "")
+        self.street     = save_getone(params, "strasse",   "")
+        self.plz        = save_getone(params, "plz",       "")
+        self.city       = save_getone(params, "wohnort",   "")
 
     def save():
         pass

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


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

Modified: trunk/waskaweb/public/styles/screen.css
===================================================================
--- trunk/waskaweb/public/styles/screen.css	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/public/styles/screen.css	2008-08-13 13:14:11 UTC (rev 50)
@@ -104,7 +104,14 @@
 	margin-right: 0.25em;
 }
 
+img.link_img {
+	vertical-align: middle;
+	border: 0;
+	margin-right: 0.25em;
+	margin-left: 0.25em;
+}
 
+
 /*-----------*/ 
 /* 2. Layout */ 
 /*-----------*/

Modified: trunk/waskaweb/templates/appointments/show_body.mako
===================================================================
--- trunk/waskaweb/templates/appointments/show_body.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/appointments/show_body.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -7,11 +7,11 @@
     </tr>
     <tr>
       <td class="label">${_('app_table_enddate')}</td>
-      <td class="table_row_v_2">${h.dd_mm_yyyy_HH_MM(c.appointment.getEndDate())}</td>
+      <td class="table_row_v_2">${h.dd_mm_yyyy_HH_MM(c.appointment.getEndDate()) | F.NA}</td>
     </tr>
     <tr>
       <td class="label table_header_v">${_('app_table_duration')}</td>
-      <td class="table_row_v">${c.appointment.getDuration()}</td>
+      <td class="table_row_v">${c.appointment.getDuration() | F.NA}</td>
     </tr>
     <tr>
       <td class="label">${_('app_form_type')}</td>

Modified: trunk/waskaweb/templates/casemanagement/bundle_standin.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/bundle_standin.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/casemanagement/bundle_standin.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -34,14 +34,14 @@
     <th class="table_header_h table_description">BearbeiterIn</th>
   </tr>
   <% idset = True %>
-  % for user in c.user_list:
+  % for group in c.group_list:
     <tr>
     % if idset:
-       <td><input type="checkbox" name="standin-${user.id | h}" value="${user.id | h}"></td>
-       <td>${user.last_name | F.NA, h}, ${user.first_name | F.NA, h}</td>
+       <td><input type="checkbox" name="standin-${group.id | h}" value="${group.id | h}"></td>
+       <td>${group.name | F.NA, h}</td>
     % else:
-       <td class="table_row_v_12"><input type="checkbox" name="standin-${user.id | h}" value="${user.id | h}"></td>
-       <td class="table_row_v_12">${user.last_name | F.NA, h}, ${user.first_name | F.NA, h}</td>
+       <td class="table_row_v_12"><input type="checkbox" name="standin-${group.id | h}" value="${group.id | h}"></td>
+       <td class="table_row_v_12">${group.name}</td>
     % endif
     </tr>
     <% idset = not idset %>

Modified: trunk/waskaweb/templates/casemanagement/downloadCSV.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/downloadCSV.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/casemanagement/downloadCSV.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -12,6 +12,11 @@
 <h1><img src="/images/confirmation.png" alt="Erledigt"/>${c.success_for | F.NA, h}</h1>
 
 <div class="export_box_dialog">
+<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>
 </div>

Modified: trunk/waskaweb/templates/casemanagement/organisation.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/organisation.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/casemanagement/organisation.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -86,7 +86,7 @@
       <% idset = 1 %>
       % else:
       <tr>
-        <td class="table_row_h">${name | F.NA, h}</td>
+        <td class="table_row_h">${group.name | F.NA, h}</td>
       </tr>
       <% idset = 0 %>
       % endif

Modified: trunk/waskaweb/templates/casemanagement/overview.mako
===================================================================
--- trunk/waskaweb/templates/casemanagement/overview.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/casemanagement/overview.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -58,9 +58,9 @@
       % 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="exportXML">Auswahl als XML-Datei exportieren</option>
-      <option value="exportXLS">Auswahl als XLS-Datei exportieren</option>
       <!--<option value="evaluate">Auswahl auswerten</option>-->
       % endif
     </select>

Modified: trunk/waskaweb/templates/main.mako
===================================================================
--- trunk/waskaweb/templates/main.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/main.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -131,7 +131,7 @@
     <div class="actions">
       <h1>${_('menu_header_cm')}</h1>
       <ul>
-        <li><a href="${h.url_for(controller='/case_overview')}"> ${_('menu_cm_link_overview')}</a> </li>
+        <li><a href="${h.url_for(controller='/case_overview', action='overview', reset=1)}"> ${_('menu_cm_link_overview')}</a> </li>
         % if h.hasRole(['cm_ka']):
           <li><a href="${h.url_for(controller='/case', action='new')}"> ${_('menu_cm_link_new')}</a> </li>
           <li><a href="${h.url_for(controller='/case', action='importCase')}"> ${_('menu_cm_link_import')}</a> </li>

Added: trunk/waskaweb/templates/main_help.mako
===================================================================
--- trunk/waskaweb/templates/main_help.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/main_help.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -0,0 +1,41 @@
+## -*- coding: utf-8 -*-
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+  <head>
+    <title>WASKA</title>
+    <meta name="generator" content="vim">
+    <meta name="author" content="Torsten Irlaender">
+    <meta name="date" content="2007-08-07">
+    <meta name="copyright" content="">
+    <meta name="keywords" content="">
+    <meta name="description" content="">
+    <meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <meta http-equiv="content-style-type" content="text/css">
+    <meta http-equiv="expires" content="0">
+    % if c.print_version:
+    <link href="${h.url_for('/styles/all.css')}" media="all" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="screen" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="print" rel="stylesheet" type="text/css">
+    % else:
+    <link href="${h.url_for('/styles/all.css')}" media="all" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/screen.css')}" media="screen" rel="stylesheet" type="text/css">
+    <link href="${h.url_for('/styles/print.css')}" media="print" rel="stylesheet" type="text/css">
+    <!--[if gt IE 5]><link href="${h.url_for('/styles/ie6.css')}" media="screen" rel="stylesheet" type="text/css"><![endif]-->
+    % endif
+  </head>
+  <body>
+    <div id="wrapper_login" >
+      <div id="header_login">
+        <div id="logo_login">
+          <img src="${h.url_for('/images/logo_ka_75.png')}" alt="Logo Kompetenzagentur" border="0">
+        </div>
+      </div>
+      <div id="content_login">
+        ${self.body()}
+      </div>
+      <div id="footer_login">
+      </div>
+    </div>	
+  </body>
+</html>

Modified: trunk/waskaweb/templates/start/help.mako
===================================================================
--- trunk/waskaweb/templates/start/help.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/start/help.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -4,8 +4,4 @@
   <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</a>.
- Dort finden Sie sowohl <a target="_blank" href="http://waska-anwender.intevation.de/download.html">Handbücher</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</a> gegeben werden.</p>
+<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>

Modified: trunk/waskaweb/templates/usersettings/change_password.mako
===================================================================
--- trunk/waskaweb/templates/usersettings/change_password.mako	2008-08-13 13:13:43 UTC (rev 49)
+++ trunk/waskaweb/templates/usersettings/change_password.mako	2008-08-13 13:14:11 UTC (rev 50)
@@ -24,24 +24,24 @@
 </div>
 ${self.buildFormErrors(formular_labels)}
 <div id="waska_form" class="import_box">
-<p class="import_p">Das neue Passwort sollte aus mindestens 8 Zeichen bestehen und 2 Sonderzeichen enthalten. </p>
+<p class="import_p">Das neue Passwort muss aus mindestens acht Zeichen bestehen und zwei Nicht-Buchstaben enthalten. </p>
 <div class="import_box_dialog">
 <form action="${h.url_for(controller="usersettings", action="changePasswordAction")}" method="POST">
 <div class="waska_form_element">	
           % if c.form_errors.get('passwd'):
-	    <label class="import_label" for="passwd" class="error_font"><strong class="import_number">1. </strong>${_('adm_form_newuser_passwd')}</label>
+	    <label class="import_label" for="passwd" class="error_font"><strong class="import_number">1. </strong>${_('adm_form_newuser_passwd')}:</label>
             <input type="password" class="field error_box" id="passwd" name="passwd">
           % else:
-            <label class="import_label" for="passwd"><strong class="import_number">1. </strong>${_('adm_form_newuser_passwd')}</label>
+            <label class="import_label" for="passwd"><strong class="import_number">1. </strong>${_('adm_form_newuser_passwd')}:</label>
             <input type="password" class="field" id="passwd" name="passwd">
           % endif
           </div>
 <div class="waska_form_element">
           % if c.form_errors.get('passwd2'):
-	    <label class="import_label" for="passwd2" class="error_font"><strong class="import_number">2. </strong>${_('adm_form_newuser_passwd_confirm')}</label>
+	    <label class="import_label" for="passwd2" class="error_font"><strong class="import_number">2. </strong>${_('adm_form_newuser_passwd_confirm')}:</label>
             <input type="password" class="field error_box" id="passwd2" name="passwd2">
           % else:
-            <label class="import_label" for="passwd2"><strong class="import_number">2. </strong>${_('adm_form_newuser_passwd_confirm')}</label>
+            <label class="import_label" for="passwd2"><strong class="import_number">2. </strong>${_('adm_form_newuser_passwd_confirm')}:</label>
             <input type="password" class="field" id="passwd2" name="passwd2">
           % endif
         </div>



More information about the Mpuls-commits mailing list