0
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
3 # |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
4 # getan |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
5 # ----- |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
6 # (c) 2008 by Sascha L. Teichmann <sascha.teichmann@intevation.de> |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
7 # |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
8 # A python worklog-alike to log what you have 'getan' (done). |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
9 # |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
10 # This is Free Software licensed under the terms of GPLv3 or later. |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
11 # For details see LICENSE coming with the source of 'getan'. |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
12 # |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
13 import sys |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
14 import re |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
15 import curses |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
16 import curses.ascii |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
17 import traceback |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
18 import signal |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
19 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
20 from datetime import datetime, timedelta |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
21 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
22 from pysqlite2 import dbapi2 as db |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
23 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
24 PAUSED = 0 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
25 RUNNING = 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
26 PRE_EXIT = 2 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
27 PAUSED_ESC = 3 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
28 RUNNING_ESC = 4 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
29 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
30 SPACE = re.compile("[\\t ]+") |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
31 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
32 DEFAULT_DATABASE = "time.db" |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
33 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
34 LOAD_ACTIVE_PROJECTS = ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
35 SELECT id, key, description, total |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
36 FROM projects LEFT JOIN |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
37 (SELECT |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
38 project_id, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
39 sum(strftime('%s', stop_time) - strftime('%s', start_time)) AS total |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
40 FROM entries |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
41 GROUP BY project_id) ON project_id = id |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
42 WHERE active |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
43 ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
44 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
45 WRITE_LOG = ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
46 INSERT INTO entries (project_id, start_time, stop_time, description) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
47 VALUES(:project_id, :start_time, :stop_time, :description) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
48 ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
49 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
50 CREATE_PROJECT = ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
51 INSERT INTO projects (key, description) VALUES (:key, :description) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
52 ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
53 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
54 LAST_PROJECT_ID = ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
55 SELECT last_insert_rowid() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
56 ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
57 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
58 RENAME_PROJECT = ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
59 UPDATE projects set key = :key, description = :description WHERE id = :id |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
60 ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
61 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
62 ASSIGN_LOGS = ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
63 UPDATE entries SET project_id = :new_id WHERE project_id = :old_id |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
64 ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
65 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
66 DELETE_PROJECT = ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
67 DELETE FROM projects WHERE id = :id |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
68 ''' |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
69 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
70 worklog = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
71 stdscr = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
72 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
73 orig_vis = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
74 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
75 def cursor_visible(flag): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
76 global orig_vis |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
77 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
78 old = curses.curs_set(flag) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
79 if orig_vis is None: orig_vis = old |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
80 return old |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
81 except: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
82 pass |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
83 return 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
84 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
85 def restore_cursor(): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
86 global orig_vis |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
87 if not orig_vis is None: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
88 curses.curs_set(orig_vis) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
89 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
90 def render_header(ofs=0): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
91 global stdscr |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
92 stdscr.attron(curses.A_BOLD) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
93 stdscr.addstr(ofs, 5, "getan v0.1") |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
94 stdscr.addstr(ofs+1, 3, "--------------") |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
95 stdscr.attroff(curses.A_BOLD) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
96 return ofs + 2 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
97 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
98 def render_quit(ofs=0): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
99 global stdscr |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
100 stdscr.addstr(ofs + 2, 3, "Press DEL once more to quit") |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
101 return ofs + 3 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
102 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
103 def tolerantClose(cur): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
104 if cur: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
105 try: cur.close() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
106 except: pass |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
107 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
108 def ifNull(v, d): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
109 if v is None: return d |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
110 return v |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
111 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
112 def human_time(delta): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
113 seconds = delta.seconds |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
114 s = seconds % 60 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
115 if delta.microseconds >= 500000: s += 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
116 seconds /= 60 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
117 m = seconds % 60 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
118 seconds /= 60 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
119 out = "%02d:%02d:%02d" % (seconds, m, s) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
120 if delta.days: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
121 out = "%dd %s" % (delta.days, out) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
122 return out |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
123 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
124 class Project: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
125 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
126 def __init__(self, id = None, key = None, desc = None, total = 0): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
127 self.id = id |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
128 self.key = key |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
129 self.desc = desc |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
130 self.total = timedelta(seconds = ifNull(total, 0)) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
131 self.start_time = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
132 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
133 def checkExistence(self, cur): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
134 if self.id is None: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
135 cur.execute(CREATE_PROJECT, { |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
136 'key' : self.key, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
137 'description': self.desc}) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
138 cur.execute(LAST_PROJECT_ID) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
139 row = cur.fetchone() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
140 cur.connection.commit() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
141 self.id = row[0] |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
142 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
143 def writeLog(self, cur, description = None): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
144 if self.start_time is None: return |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
145 self.checkExistence(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
146 now = datetime.now() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
147 cur.execute(WRITE_LOG, { |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
148 'project_id' : self.id, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
149 'start_time' : self.start_time, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
150 'stop_time' : now, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
151 'description': description}) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
152 self.total += now-self.start_time |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
153 return now |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
154 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
155 def getId(self, cur): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
156 self.checkExistence(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
157 return self.id |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
158 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
159 def rename(self, cur, key, desc): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
160 self.key = key |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
161 self.desc = desc |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
162 self.checkExistence(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
163 cur.execute(RENAME_PROJECT, { |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
164 'key' : key, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
165 'description': desc, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
166 'id' : self.id }) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
167 cur.connection.commit() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
168 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
169 def assignLogs(self, cur, anon): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
170 self.total += anon.total |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
171 anon.total = timedelta(seconds=0) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
172 old_id = anon.getId(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
173 new_id = self.getId(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
174 cur.execute(ASSIGN_LOGS, { |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
175 'new_id': new_id, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
176 'old_id': old_id}) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
177 cur.connection.commit() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
178 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
179 def delete(self, cur): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
180 id = self.getId(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
181 cur.execute(DELETE_PROJECT, { 'id': id }) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
182 cur.connection.commit() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
183 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
184 class Worklog: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
185 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
186 def __init__(self, database): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
187 self.initDB(database) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
188 self.loadProjects() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
189 self.state = PAUSED |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
190 self.current_project = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
191 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
192 def initDB(self, database): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
193 self.con = db.connect(database) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
194 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
195 def loadProjects(self): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
196 cur = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
197 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
198 cur = self.con.cursor() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
199 cur.execute(LOAD_ACTIVE_PROJECTS) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
200 self.projects = [Project(*row) for row in cur.fetchall()] |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
201 finally: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
202 tolerantClose(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
203 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
204 def shutdown(self): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
205 self.con.close() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
206 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
207 def findProject(self, key): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
208 key_lower = key.lower() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
209 lower = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
210 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
211 for p in self.projects: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
212 if p.key == key: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
213 return p |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
214 if p.key and p.key.lower() == key_lower: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
215 lower = p |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
216 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
217 return lower |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
218 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
219 def findAnonymProject(self, num): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
220 count = 0 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
221 for p in self.projects: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
222 if p.key is None: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
223 if count == num: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
224 return p |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
225 count += 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
226 return None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
227 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
228 def renameAnonymProject(self, num, key, description): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
229 project = self.findAnonymProject(num) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
230 if project: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
231 cur = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
232 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
233 cur = self.con.cursor() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
234 project.rename(cur, key, description) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
235 finally: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
236 tolerantClose(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
237 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
238 def assignLogs(self, num, key): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
239 anon = self.findAnonymProject(num) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
240 if anon is None: return |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
241 project = self.findProject(key) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
242 if project is None: return |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
243 cur = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
244 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
245 cur = self.con.cursor() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
246 project.assignLogs(cur, anon) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
247 self.projects.remove(anon) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
248 anon.delete(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
249 finally: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
250 tolerantClose(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
251 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
252 def isRunning(self): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
253 return self.state in (RUNNING, RUNNING_ESC) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
254 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
255 def render(self, ofs=0): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
256 ofs = render_header(ofs) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
257 ml = max([len(p.desc and p.desc or "unknown") for p in self.projects]) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
258 unknown = 0 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
259 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
260 if self.current_project and self.current_project.start_time: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
261 current_delta = datetime.now() - self.current_project.start_time |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
262 current_time_str = "%s " % human_time(current_delta) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
263 current_time_space = " " * len(current_time_str) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
264 else: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
265 current_time_str = "" |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
266 current_time_space = "" |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
267 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
268 for project in self.projects: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
269 is_current = project == self.current_project |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
270 pref = is_current and " -> " or " " |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
271 if project.key is None: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
272 key = "^%d" % unknown |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
273 unknown += 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
274 else: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
275 key = " %s" % project.key |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
276 desc = project.desc is None and "unknown" or project.desc |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
277 stdscr.attron(curses.A_BOLD) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
278 stdscr.addstr(ofs, 0, "%s%s" % (pref, key)) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
279 stdscr.attroff(curses.A_BOLD) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
280 stdscr.addstr(" %s" % desc) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
281 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
282 diff = ml - len(desc) + 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
283 stdscr.addstr(" " * diff) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
284 if is_current: stdscr.attron(curses.A_UNDERLINE) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
285 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
286 if is_current: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
287 stdscr.addstr("%s(%s)" % ( |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
288 current_time_str, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
289 human_time(project.total + current_delta))) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
290 else: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
291 stdscr.addstr("%s(%s)" % ( |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
292 current_time_space, |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
293 human_time(project.total))) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
294 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
295 if is_current: stdscr.attroff(curses.A_UNDERLINE) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
296 ofs += 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
297 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
298 return ofs |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
299 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
300 def writeLog(self, description = None): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
301 if self.current_project is None: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
302 return datetime.now() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
303 cur = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
304 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
305 cur = self.con.cursor() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
306 now = self.current_project.writeLog(cur, description) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
307 self.con.commit() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
308 return now |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
309 finally: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
310 tolerantClose(cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
311 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
312 def run(self): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
313 global stdscr |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
314 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
315 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
316 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
317 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
318 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
319 while True: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
320 c = stdscr.getch() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
321 if c == -1: continue |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
322 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
323 if self.state == PAUSED: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
324 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
325 if c == curses.KEY_DC: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
326 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
327 ofs = render_quit(self.render()) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
328 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
329 self.state = PRE_EXIT |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
330 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
331 elif c == curses.ascii.ESC: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
332 self.state = PAUSED_ESC |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
333 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
334 elif curses.ascii.isascii(c): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
335 nproject = self.findProject(chr(c)) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
336 if nproject is None: continue |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
337 self.current_project = nproject |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
338 nproject.start_time = datetime.now() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
339 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
340 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
341 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
342 self.state = RUNNING |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
343 signal.signal(signal.SIGALRM, alarm_handler) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
344 signal.alarm(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
345 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
346 elif self.state == RUNNING: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
347 if c == curses.ascii.ESC: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
348 self.state = RUNNING_ESC |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
349 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
350 elif c == curses.ascii.NL: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
351 signal.signal(signal.SIGALRM, signal.SIG_IGN) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
352 self.state = PAUSED |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
353 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
354 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
355 old_cur = cursor_visible(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
356 curses.echo() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
357 stdscr.addstr(ofs + 1, 3, "Description: ") |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
358 description = stdscr.getstr() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
359 curses.noecho() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
360 cursor_visible(old_cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
361 self.writeLog(description) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
362 self.current_project = None |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
363 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
364 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
365 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
366 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
367 elif curses.ascii.isascii(c): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
368 nproject = self.findProject(chr(c)) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
369 if nproject is None or nproject == self.current_project: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
370 continue |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
371 nproject.start_time = self.writeLog() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
372 self.current_project = nproject |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
373 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
374 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
375 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
376 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
377 elif self.state == PAUSED_ESC: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
378 if curses.ascii.isdigit(c): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
379 pnum = c - ord('0') |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
380 nproject = self.findAnonymProject(pnum) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
381 if nproject is None: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
382 nproject = Project() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
383 self.projects.append(nproject) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
384 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
385 nproject.start_time = self.writeLog() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
386 self.current_project = nproject |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
387 self.state = RUNNING |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
388 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
389 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
390 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
391 signal.signal(signal.SIGALRM, alarm_handler) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
392 signal.alarm(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
393 elif curses.ascii.isalpha(c): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
394 if c == ord('n'): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
395 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
396 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
397 old_cur = cursor_visible(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
398 curses.echo() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
399 stdscr.addstr(ofs + 1, 3, "<num> <key> <description>: ") |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
400 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
401 description = stdscr.getstr() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
402 curses.noecho() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
403 cursor_visible(old_cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
404 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
405 description = description.strip() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
406 if description: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
407 num, key, description = SPACE.split(description, 2) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
408 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
409 num = int(num) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
410 self.renameAnonymProject(num, key, description) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
411 except ValueError: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
412 pass |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
413 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
414 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
415 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
416 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
417 self.state = PAUSED |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
418 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
419 elif c == ord('a'): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
420 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
421 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
422 old_cur = cursor_visible(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
423 curses.echo() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
424 stdscr.addstr(ofs + 1, 3, "<num> <key>: ") |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
425 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
426 key = stdscr.getstr() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
427 curses.noecho() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
428 cursor_visible(old_cur) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
429 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
430 key = key.strip() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
431 if key: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
432 num, key = SPACE.split(key, 1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
433 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
434 num = int(num) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
435 self.assignLogs(num, key) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
436 except ValueError: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
437 pass |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
438 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
439 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
440 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
441 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
442 self.state = PAUSED |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
443 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
444 else: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
445 self.state = PAUSED |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
446 pass |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
447 else: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
448 self.state = PAUSED |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
449 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
450 elif self.state == RUNNING_ESC: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
451 if curses.ascii.isdigit(c): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
452 signal.signal(signal.SIGALRM, signal.SIG_IGN) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
453 pnum = c - ord('0') |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
454 nproject = self.findAnonymProject(pnum) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
455 if nproject is None: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
456 nproject = Project() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
457 self.projects.append(nproject) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
458 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
459 nproject.start_time = self.writeLog() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
460 self.current_project = nproject |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
461 self.state = RUNNING |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
462 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
463 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
464 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
465 signal.signal(signal.SIGALRM, alarm_handler) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
466 signal.alarm(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
467 else: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
468 self.state = RUNNING |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
469 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
470 elif self.state == PRE_EXIT: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
471 if c == curses.KEY_DC: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
472 break |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
473 else: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
474 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
475 ofs = self.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
476 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
477 self.state = PAUSED |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
478 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
479 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
480 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
481 def alarm_handler(flag, frame): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
482 global worklog |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
483 global stdscr |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
484 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
485 stdscr.erase() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
486 worklog.render() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
487 stdscr.refresh() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
488 if worklog.isRunning(): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
489 signal.alarm(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
490 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
491 def exit_handler(flag, frame): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
492 exit_code = 0 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
493 global worklog |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
494 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
495 worklog.shutdown() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
496 except: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
497 traceback.print_exc(file=sys.stderr) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
498 exit_code = 1 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
499 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
500 restore_cursor() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
501 curses.nocbreak() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
502 stdscr.keypad(0) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
503 curses.echo() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
504 curses.endwin() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
505 sys.exit(exit_code) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
506 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
507 def main(): |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
508 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
509 database = len(sys.argv) < 2 and DEFAULT_DATABASE or sys.argv[1] |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
510 # TODO: create database file if it does not exist. |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
511 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
512 global worklog |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
513 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
514 worklog = Worklog(database) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
515 except: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
516 traceback.print_exc(file=sys.stderr) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
517 sys.exit(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
518 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
519 global stdscr |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
520 stdscr = curses.initscr() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
521 curses.noecho() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
522 curses.cbreak() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
523 stdscr.keypad(1) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
524 cursor_visible(0) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
525 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
526 signal.signal(signal.SIGHUP, exit_handler) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
527 signal.signal(signal.SIGINT, exit_handler) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
528 signal.signal(signal.SIGQUIT, exit_handler) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
529 signal.signal(signal.SIGTERM, exit_handler) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
530 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
531 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
532 try: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
533 worklog.run() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
534 except: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
535 traceback.print_exc(file=sys.stderr) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
536 finally: |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
537 exit_handler(0, None) |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
538 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
539 if __name__ == '__main__': |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
540 main() |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
541 |
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff
changeset
|
542 # vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: |