From 32f6cef7bddb9796bd9dddf09471489ea82a49fb Mon Sep 17 00:00:00 2001
From: Robin Sonnabend <robin@fsmpi.rwth-aachen.de>
Date: Tue, 28 Feb 2017 03:50:14 +0100
Subject: [PATCH] README and correct coercing for todostates

---
 README.md          | 16 ++++++++++++++++
 models/database.py |  9 +++++++--
 views/forms.py     | 19 +++++++++++++++----
 3 files changed, 38 insertions(+), 6 deletions(-)
 create mode 100644 README.md

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2ecbca3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+# Protokollsystem 3
+
+System zur Verwaltung von Protokollen und Sitzungen.
+
+* Planung der Tagesordnung
+* Einladungsmails
+* Kompilieren vom Protokollquelltext
+* PDF-Protokoll mit LaTeX
+* Protokollversand samt Anhang
+* automatisches Hochladen ins Wiki
+* Etherpadanbindung
+* Todoverwaltung mit mehr Zuständen
+* Beschlussverwaltung
+* Rechteverwaltung (interne Abschnitte)
+* Hochladen der Tagesordnung in einen Kalender
+* externe Protokolle ohne Protokollsyntax
diff --git a/models/database.py b/models/database.py
index 07c4e4f..897ae88 100644
--- a/models/database.py
+++ b/models/database.py
@@ -5,7 +5,7 @@ import math
 from io import StringIO, BytesIO
 from enum import Enum
 
-from shared import db, date_filter, escape_tex, DATE_KEY, START_TIME_KEY, END_TIME_KEY, AUTHOR_KEY, PARTICIPANTS_KEY, LOCATION_KEY
+from shared import db, date_filter, date_filter_short, escape_tex, DATE_KEY, START_TIME_KEY, END_TIME_KEY, AUTHOR_KEY, PARTICIPANTS_KEY, LOCATION_KEY
 from utils import random_string, url_manager, get_etherpad_url, split_terms
 from models.errors import DateNotMatchingException
 
@@ -411,6 +411,11 @@ class Todo(db.Model):
             self.id, self.number, self.who, self.description, self.state, self.date)
 
     def is_done(self):
+        if self.state.needs_date():
+            if self.state == TodoState.after:
+                return datetime.now().date() >= self.date
+            elif self.state == TodoState.before:
+                return datetime.now().date() <= self.date
         return self.state.is_done()
 
     def get_id(self):
@@ -433,7 +438,7 @@ class Todo(db.Model):
     def get_state_plain(self):
         result = self.state.get_name()
         if self.state.needs_date():
-            result = "{} {}".format(result, date_filter(self.state.date))
+            result = "{} {}".format(result, date_filter_short(self.date))
         return result
     def get_state_tex(self):
         return self.get_state_plain()
diff --git a/views/forms.py b/views/forms.py
index e917996..91d108f 100644
--- a/views/forms.py
+++ b/views/forms.py
@@ -16,7 +16,7 @@ def get_protocoltype_choices(protocoltypes, add_all=True):
 
 def get_todostate_choices():
     return [
-        (state.value, state.get_name())
+        (state, state.get_name())
         for state in TodoState
     ]
 
@@ -26,6 +26,12 @@ def get_calendar_choices():
         for calendar in CalendarClient().get_calendars()
     ]
 
+def coerce_todostate(key):
+    if isinstance(key, str):
+        class_part, key_part = key.split(".")
+        key = TodoState[key_part]
+    return key
+
 class LoginForm(FlaskForm):
     username = StringField("Benutzer", validators=[InputRequired("Bitte gib deinen Benutzernamen ein.")])
     password = PasswordField("Passwort", validators=[InputRequired("Bitte gib dein Passwort ein.")])
@@ -44,7 +50,11 @@ class ProtocolTypeForm(FlaskForm):
     use_wiki = BooleanField("Wiki benutzen")
     wiki_only_public = BooleanField("Wiki ist öffentlich")
     printer = SelectField("Drucker", choices=list(zip(config.PRINTING_PRINTERS, config.PRINTING_PRINTERS)))
-    calendar = SelectField("Kalender", choices=get_calendar_choices())
+    calendar = SelectField("Kalender", choices=[])
+
+    def __init__(self, **kwargs):
+        super().__init__(self, **kwargs)
+        self.calendar.choices = get_calendar_choices()
 
 class DefaultTopForm(FlaskForm):
     name = StringField("Name", validators=[InputRequired("Du musst einen Namen angeben.")])
@@ -124,10 +134,11 @@ class NewTodoForm(FlaskForm):
 class TodoForm(FlaskForm):
     who = StringField("Person")
     description = StringField("Aufgabe", validators=[InputRequired("Bitte gib an, was erledigt werden soll.")])
-    state = SelectField("Status", choices=[], coerce=int, validators=[CheckTodoDateByState()])
+    state = SelectField("Status", choices=[], coerce=coerce_todostate, validators=[CheckTodoDateByState()])
     date = DateField("Datum", format="%d.%m.%Y", validators=[Optional()])
 
-    def __init__(self):
+    def __init__(self, **kwargs):
+        super().__init__(**kwargs)
         self.state.choices = get_todostate_choices()
 
 class TodoMailForm(FlaskForm):
-- 
GitLab