home · contact · privacy
Add Todo/Process.blockers for Conditions that block rather than enable.
[plomtask] / plomtask / http.py
index d5da1d7e4d914a17b2a27a67e80db762e83f8403..41ce5d6a5da6738fe9eae35b5abff6cc2fd4a243 100644 (file)
@@ -113,6 +113,8 @@ class TaskHandler(BaseHTTPRequestHandler):
         start = self.params.get_str('start')
         end = self.params.get_str('end')
         days = Day.all(self.conn, date_range=(start, end), fill_gaps=True)
+        for day in days:
+            day.collect_calendarized_todos(self.conn)
         return {'start': start, 'end': end, 'days': days}
 
     def do_GET_day(self) -> dict[str, object]:
@@ -121,19 +123,24 @@ class TaskHandler(BaseHTTPRequestHandler):
         todays_todos = Todo.by_date(self.conn, date)
         conditions_present = []
         enablers_for = {}
+        disablers_for = {}
         for todo in todays_todos:
-            for condition in todo.conditions:
+            for condition in todo.conditions + todo.blockers:
                 if condition not in conditions_present:
                     conditions_present += [condition]
                     enablers_for[condition.id_] = [p for p in
                                                    Process.all(self.conn)
                                                    if condition in p.enables]
+                    disablers_for[condition.id_] = [p for p in
+                                                    Process.all(self.conn)
+                                                    if condition in p.disables]
         seen_todos: set[int] = set()
         top_nodes = [t.get_step_tree(seen_todos)
                      for t in todays_todos if not t.parents]
         return {'day': Day.by_id(self.conn, date, create=True),
                 'top_nodes': top_nodes,
                 'enablers_for': enablers_for,
+                'disablers_for': disablers_for,
                 'conditions_present': conditions_present,
                 'processes': Process.all(self.conn)}
 
@@ -147,7 +154,17 @@ class TaskHandler(BaseHTTPRequestHandler):
 
     def do_GET_conditions(self) -> dict[str, object]:
         """Show all Conditions."""
-        return {'conditions': Condition.all(self.conn)}
+        conditions = Condition.all(self.conn)
+        sort_by = self.params.get_str('sort_by')
+        if sort_by == 'is_active':
+            conditions.sort(key=lambda c: c.is_active)
+        elif sort_by == '-is_active':
+            conditions.sort(key=lambda c: c.is_active, reverse=True)
+        elif sort_by == '-title':
+            conditions.sort(key=lambda c: c.title.newest, reverse=True)
+        else:
+            conditions.sort(key=lambda c: c.title.newest)
+        return {'conditions': conditions, 'sort_by': sort_by}
 
     def do_GET_condition(self) -> dict[str, object]:
         """Show Condition of ?id=."""
@@ -196,7 +213,17 @@ class TaskHandler(BaseHTTPRequestHandler):
 
     def do_GET_processes(self) -> dict[str, object]:
         """Show all Processes."""
-        return {'processes': Process.all(self.conn)}
+        processes = Process.all(self.conn)
+        sort_by = self.params.get_str('sort_by')
+        if sort_by == 'steps':
+            processes.sort(key=lambda c: len(c.explicit_steps))
+        elif sort_by == '-steps':
+            processes.sort(key=lambda c: len(c.explicit_steps), reverse=True)
+        elif sort_by == '-title':
+            processes.sort(key=lambda c: c.title.newest, reverse=True)
+        else:
+            processes.sort(key=lambda c: c.title.newest)
+        return {'processes': processes, 'sort_by': sort_by}
 
     def do_POST(self) -> None:
         """Handle any POST request."""
@@ -242,11 +269,14 @@ class TaskHandler(BaseHTTPRequestHandler):
                 todo.save(self.conn)
         done_ids = self.form_data.get_all_int('done')
         comments = self.form_data.get_all_str('comment')
+        efforts = self.form_data.get_all_str('effort')
         for i, todo_id in enumerate(self.form_data.get_all_int('todo_id')):
             todo = Todo.by_id(self.conn, todo_id)
             todo.is_done = todo_id in done_ids
             if len(comments) > 0:
                 todo.comment = comments[i]
+            if len(efforts) > 0:
+                todo.effort = float(efforts[i]) if efforts[i] else None
             todo.save(self.conn)
             for condition in todo.enables:
                 condition.save(self.conn)
@@ -273,10 +303,14 @@ class TaskHandler(BaseHTTPRequestHandler):
                 continue
             child = Todo.by_id(self.conn, child_id)
             todo.add_child(child)
+        effort = self.form_data.get_str('effort', ignore_strict=True)
+        todo.effort = float(effort) if effort else None
         todo.set_conditions(self.conn, self.form_data.get_all_int('condition'))
+        todo.set_blockers(self.conn, self.form_data.get_all_int('blocker'))
         todo.set_enables(self.conn, self.form_data.get_all_int('enables'))
         todo.set_disables(self.conn, self.form_data.get_all_int('disables'))
         todo.is_done = len(self.form_data.get_all_str('done')) > 0
+        todo.calendarize = len(self.form_data.get_all_str('calendarize')) > 0
         todo.comment = self.form_data.get_str('comment', ignore_strict=True)
         todo.save(self.conn)
         for condition in todo.enables:
@@ -298,8 +332,10 @@ class TaskHandler(BaseHTTPRequestHandler):
         process.effort.set(self.form_data.get_float('effort'))
         process.set_conditions(self.conn,
                                self.form_data.get_all_int('condition'))
+        process.set_blockers(self.conn, self.form_data.get_all_int('blocker'))
         process.set_enables(self.conn, self.form_data.get_all_int('enables'))
         process.set_disables(self.conn, self.form_data.get_all_int('disables'))
+        process.calendarize = self.form_data.get_all_str('calendarize') != []
         process.save(self.conn)
         process.explicit_steps = []
         steps: list[tuple[int | None, int, int | None]] = []