Renamed and added default config file.
2 Description: Database lib for cronrec.
3 Author: Eugen Sawin (sawine@me73.com)
4 Dependencies: libsqlite3-dev
9 ACTIVITIES_TABLE = """activities(
13 COMPANIES_TABLE = """companies(
21 PROJECTS_TABLE = """projects(
25 constraint customer_fk foreign key(customer) references companies(rowid) on delete
28 CURRENCIES_TABLE = """currencies(
29 name text not null)"""
31 RATE_TYPES_TABLE = """rate_types(
32 name text not null)"""
34 RATES_TABLE = """rates(
35 rate smallmoney not null,
36 currency int not null,
40 constraint currency_fk foreign key(currency) references currencies(rowid) on
42 constraint type_fk foreign key(type) references rate_types(rowid) on delete
44 constraint project_fk foreign key(project) references projects(rowid) on delete
46 constraint activity_fk foreign key(activity) references activities(rowid) on delete
49 TASKS_TABLE = """tasks(
55 constraint project_fk foreign key(project) references projects(rowid) on delete
57 constraint activity_fk foreign key(activity) references activities(rowid) on delete
60 BREAKS_TABLE = """breaks(
65 constraint task_fk foreign key(task) references tasks(rowid) on delete
68 TABLES = (ACTIVITIES_TABLE, COMPANIES_TABLE, PROJECTS_TABLE, CURRENCIES_TABLE,
69 RATES_TABLE, RATE_TYPES_TABLE, TASKS_TABLE, BREAKS_TABLE)
71 DEF_PROJECT = "default"
72 DEF_ACTIVITY = "default"
75 con = sqlite3.connect(db_file)
76 return con, con.cursor()
79 con, cur = session(db_file)
80 cur.execute("select * from projects")
84 cur.execute("select * from activities")
88 cur.execute("select * from tasks")
92 cur.execute("select * from breaks")
96 cur.execute("select * from currencies")
100 cur.execute("select * from rate_types")
104 cur.execute("select * from rates")
111 con, cur = session(db_file)
113 sql = "create table " + table
118 def update_where(db_file, table, dep_column, dep_value, set_column, set_value):
119 con, cur = session(db_file)
120 values = (set_value, dep_value)
121 sql = "update %s set %s=? where %s=?" % (table, set_column, dep_column)
122 cur.execute(sql, values)
127 def set_rate(db_file, project, activity, rate, currency, type):
129 activity = DEF_ACTIVITY
130 con, cur = session(db_file)
131 values = (rate, row_id(db_file, "currencies", currency),
132 row_id(db_file, "rate_types", type),
133 row_id(db_file, "projects", project),
134 row_id(db_file, "activities", activity))
135 sql = "insert into rates values(?, ?, ?, ?, ?)"
136 cur.execute(sql, values)
141 def find_last_project(db_file, time):
142 con, cur = session(db_file)
144 sql = "select project from tasks where begin < ? and end is null order by \
146 cur.execute(sql, values)
150 sql = "select name from projects where rowid=?"
151 cur.execute(sql, values)
152 project = cur.fetchone()[0]
154 project = None#DEF_PROJECT
159 def find_last_activity(db_file, time):
160 con, cur = session(db_file)
162 sql = "select activity from tasks where begin < ? and end is null order by \
164 cur.execute(sql, values)
168 sql = "select name from activities where rowid=?"
169 cur.execute(sql, values)
170 activity = cur.fetchone()[0]
172 activity = None#DEF_ACTIVITY
177 def find_active_task(db_file, time=None):
178 con, cur = session(db_file)
180 values = (time, time)
181 sql = "select project, activity from tasks where begin < ? and \
182 (end is null or end > ?)"
185 sql = "select project, activity from tasks where end is null"
186 cur.execute(sql, values)
187 task = cur.fetchone()
193 def id_name(db_file, table, id):
194 con, cur = session(db_file)
196 sql = "select name from %s where rowid=?" % table
197 cur.execute(sql, values)
202 def row_id(db_file, table, name):
203 con, cur = session(db_file)
205 sql = "select rowid from %s where name=?" % table
206 cur.execute(sql, values)
209 sql = "insert into %s(name) values(?)" % table
210 cur.execute(sql, values)
213 return row_id(db_file, table, name)
218 def project_id(db_file, name):
219 return row_id(db_file, "projects", name)
221 def activity_id(db_file, name):
222 return row_id(db_file, "activities", name)
224 def end(db_file, project, activity, time, log):
225 print "ending: %s:%s" % (project, activity)
226 if activity or project:
228 activity = find_last_activity(db_file, time)
230 project = find_last_project(db_file, time)
232 con, cur = session(db_file)
233 if activity == "all" and project == "all":
235 sql = "update tasks set end=?, log=? where end is null"
237 values = (time, log, project_id(db_file, project),
238 activity_id(db_file, activity))
239 sql = "update tasks set end=?, log=? where project=? and activity=?"
240 cur.execute(sql, values)
245 def begin(db_file, project, activity, time):
246 print "beginning: %s:%s" % (project, activity)
247 last_project = find_last_project(db_file, time)
248 last_activity = find_last_activity(db_file, time)
250 project = last_project
252 activity = DEF_ACTIVITY
253 if activity != last_activity or project != last_project:
254 end(db_file, last_project, last_activity, time, None)
255 con, cur = session(db_file)
256 values = (time, None, project_id(db_file, project),
257 activity_id(db_file, activity), None)
258 sql = "insert into tasks values(?, ?, ?, ?, ?)"
259 cur.execute(sql, values)
264 def is_paused(db_file, time):
265 con, cur = session(db_file)
267 sql = "select rowid from breaks where begin < ? and end is null"
268 cur.execute(sql, values)
269 paused = cur.fetchone()
273 def pause(db_file, time):
275 if not is_paused(db_file, time):
276 task = find_active_task(db_file, time)
277 con, cur = session(db_file)
278 values = (time, None, task, None)
279 sql = "insert into breaks values(?, ?, ?, ?)"
280 cur.execute(sql, values)
285 def resume(db_file, task, time, log):
287 if is_paused(db_file, time):
289 task = find_active_task(db_file, time)
290 con, cur = session(db_file)
291 values = (time, log, task)
292 sql = "update breaks set end=?, log=? where task=? and end is null"
293 cur.execute(sql, values)
299 task = find_active_task(db_file)
300 con, cur = session(db_file)
304 sql = "select project, activity from tasks where rowid=?"
305 cur.execute(sql, values)
306 result = cur.fetchone()
308 result = (id_name(db_file, "projects", result[0]),
309 id_name(db_file, "activities", result[1]))