Changeset 2335
- Timestamp:
- 06/25/07 16:55:40 (1 year ago)
- Files:
-
- worklogplugin/0.10/worklog/dbhelper.py (modified) (1 diff)
- worklogplugin/0.10/worklog/timeline_hook.py (modified) (4 diffs)
- worklogplugin/0.10/worklog/uihooks_ticket.py (modified) (3 diffs)
- worklogplugin/0.10/worklog/util.py (added)
- worklogplugin/0.10/worklog/webui.py (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
worklogplugin/0.10/worklog/dbhelper.py
r2330 r2335 84 84 return ResultSet(get_all(db, sql, *params)) 85 85 86 def get_active_task(env, authname):87 sql = "SELECT MAX(lastchange) FROM work_log WHERE user='%s'" % (authname)88 lastchange = get_scalar(env.get_db_cnx(), sql)89 if not lastchange:90 return None91 92 sql = "SELECT user,ticket,starttime,endtime FROM work_log WHERE user='%s' AND lastchange=%s" % (authname, lastchange)93 data = get_all(env.get_db_cnx(), sql)[1]94 task = {}95 for row in data:96 task["user"] = row[0]97 task["ticket"] = row[1]98 task["starttime"] = row[2]99 task["endtime"] = row[3]100 return task101 102 103 86 class ResultSet: 104 87 """ the result of calling getResultSet """ worklogplugin/0.10/worklog/timeline_hook.py
r2334 r2335 1 1 import re 2 import dbhelper 2 from util import * 3 3 from trac.log import logger_factory 4 4 from trac.core import * … … 28 28 cursor = db.cursor() 29 29 30 cursor.execute("""SELECT wl.user,wl.ticket,wl.time,wl. kind,wl.humankind,t.summary30 cursor.execute("""SELECT wl.user,wl.ticket,wl.time,wl.starttime,wl.kind,wl.humankind,t.summary 31 31 FROM ( 32 32 33 SELECT user, ticket, starttime AS time, 'workstart' AS kind, 'started' AS humankind33 SELECT user, ticket, starttime AS time, starttime, 'workstart' AS kind, 'started' AS humankind 34 34 FROM work_log 35 35 36 36 UNION 37 37 38 SELECT user, ticket, endtime AS time, 'workstop' AS kind, 'stopped' AS humankind38 SELECT user, ticket, endtime AS time, starttime, 'workstop' AS kind, 'stopped' AS humankind 39 39 FROM work_log 40 40 … … 45 45 % (start, stop)) 46 46 previous_update = None 47 for user,ticket,time, kind,humankind,summary in cursor:47 for user,ticket,time,starttime,kind,humankind,summary in cursor: 48 48 ticket_href = href.ticket(ticket) 49 49 if format == 'rss': … … 54 54 (user, humankind, summary, ticket)) 55 55 message = '' 56 if kind == 'workstop': 57 started = datetime.fromtimestamp(starttime) 58 finished = datetime.fromtimestamp(time) 59 message = 'Time spent: ~' + pretty_timedelta(started, finished) 56 60 yield kind, ticket_href, title, time, user, message 57 61 worklogplugin/0.10/worklog/uihooks_ticket.py
r2330 r2335 1 1 import re 2 import dbhelper 2 from util import * 3 3 from trac.log import logger_factory 4 4 from trac.core import * … … 66 66 67 67 def get_navigation_items(self, req): 68 if req.authname == 'anonymous': 69 return 70 68 71 match = re.match(r'/ticket/([0-9]+)$', req.path_info) 69 72 if match: … … 71 74 72 75 # Check to see if y 73 workingon = dbhelper.get_active_task(self.env, req.authname) 74 if not workingon: 75 workingon = { 'starttime': 1, 76 'endtime': 1, 77 'ticket': 0} 76 task = get_latest_task(self.env.get_db_cnx(), req.authname) 78 77 79 # Check state 80 if not workingon['endtime'] == 0: 81 # Should display a "Work on Link" button. 78 # If we are not working on anything or our latest task is finished we 79 # can start working on this task. 80 if not task or not task['endtime'] == 0: 81 # Display a "Work on Link" button. 82 82 yield 'mainnav', "ticket-addon", self.get_javascript(req, ticket, 0) 83 83 return 84 84 85 85 # We are working on SOMETHING, but not this ticket... 86 if not workingon['ticket'] == ticket: 87 return 88 89 yield 'mainnav', "ticket-addon", self.get_javascript(req, ticket, 1) 86 if task and task['ticket'] == ticket: 87 yield 'mainnav', "ticket-addon", self.get_javascript(req, ticket, 1) worklogplugin/0.10/worklog/webui.py
r2330 r2335 1 1 import re 2 2 import dbhelper 3 from util import * 3 4 from time import time 4 5 from datetime import tzinfo, timedelta, datetime … … 34 35 Markup('<a href="%s">%s</a>' % \ 35 36 (url , "Work Log")) 36 37 # Stolen from Trac trunk :)38 def pretty_timedelta(self, time1, time2=None, resolution=None):39 """Calculate time delta (inaccurately, only for decorative purposes ;-) for40 prettyprinting. If time1 is None, the current time is used."""41 if not time1: time1 = datetime.now()42 if not time2: time2 = datetime.now()43 if time1 > time2:44 time2, time1 = time1, time245 units = ((3600 * 24 * 365, 'year', 'years'),46 (3600 * 24 * 30, 'month', 'months'),47 (3600 * 24 * 7, 'week', 'weeks'),48 (3600 * 24, 'day', 'days'),49 (3600, 'hour', 'hours'),50 (60, 'minute', 'minutes'))51 diff = time2 - time152 age_s = int(diff.days * 86400 + diff.seconds)53 if resolution and age_s < resolution:54 return ''55 if age_s < 60:56 return '%i second%s' % (age_s, age_s != 1 and 's' or '')57 for u, unit, unit_plural in units:58 r = float(age_s) / float(u)59 if r >= 0.9:60 r = int(round(r))61 return '%d %s' % (r, r == 1 and unit or unit_plural)62 return ''63 37 64 38 # IRequestHandler methods … … 101 75 "started": started, 102 76 "delta": 'Started ' + format_date(starttime) + " " + format_time(starttime) + \ 103 " (" + self.pretty_timedelta(started) + " ago)"77 " (" + pretty_timedelta(started) + " ago)" 104 78 } 105 79 … … 108 82 log[user]["finished"] = finished 109 83 log[user]["delta"] = 'Worked on from ' + format_date(starttime) + " " + format_time(starttime) + " - " + format_date(endtime) + " " + format_time(endtime) + \ 110 " (" + self.pretty_timedelta(started, finished) + ")"84 " (" + pretty_timedelta(started, finished) + ")" 111 85 112 86 … … 130 104 tckt_link = Markup('#' + ticket) 131 105 132 sql = "SELECT MAX(lastchange) FROM work_log WHERE user='%s'" % (authname) 133 lastchange = dbhelper.get_scalar(self.env.get_db_cnx(), sql) 134 if lastchange: 135 sql = "SELECT endtime FROM work_log WHERE user='%s' AND lastchange=%s" % (authname, lastchange) 136 endtime = dbhelper.get_scalar(self.env.get_db_cnx(), sql) 137 if endtime == 0: 138 addMessage("You cannot work on ticket " + tckt_link + " as you seem to already be working on another ticket.") 139 return 140 106 task = get_latest_task(self.env.get_db_cnx(), authname) 107 if task and task['endtime'] == 0: 108 addMessage("You cannot work on ticket " + tckt_link + " as you seem to already be working on another ticket.") 109 return 110 141 111 if not authname == tckt['owner']: 142 112 addMessage("You cannot work on ticket " + tckt_link + " as you are not the owner.") … … 151 121 sql = "INSERT INTO work_log (user, ticket, lastchange, starttime, endtime) VALUES ('%s', %s, %s, %s, %s)" % \ 152 122 (authname, ticket, now, now, 0) 153 dbhelper.execute_non_query(self.env.get_db_cnx(), sql) 123 db = self.env.get_db_cnx(); 124 cursor = db.cursor() 125 cursor.execute(sql) 154 126 addMessage("You are now working on ticket " + tckt_link + ".") 155 127 … … 160 132 tckt_link = Markup('#' + ticket) 161 133 162 sql = "SELECT MAX(lastchange) FROM work_log WHERE user='%s'" % (authname) 163 lastchange = dbhelper.get_scalar(self.env.get_db_cnx(), sql) 164 if not lastchange: 134 task = get_latest_task(self.env.get_db_cnx(), authname) 135 if not task: 165 136 addMessage("You cannot stop working on ticket " + tckt_link + " as it apears you've not started working on anything yet!") 166 137 return 167 138 168 sql = "SELECT ticket,endtime FROM work_log WHERE user='%s' AND lastchange=%s" % (authname, lastchange) 169 data = dbhelper.get_all(self.env.get_db_cnx(), sql)[1] 170 if not data: 139 if not task['endtime'] == 0: 171 140 addMessage("You cannot stop working on ticket " + tckt_link + " as it appears you've not started working on it yet!") 172 141 return 173 for (activeticket, endtime) in data: 174 if not activeticket == int(ticket): 175 addMessage("You cannot stop working on ticket " + tckt_link + " as it appears you've not started working on it yet! " + str(activeticket) + " " + str(endtime)) 176 return 177 if not endtime == 0: 178 addMessage("You cannot stop working on ticket " + tckt_link + " as it apears you've already finished working!") 179 return 142 if not task['ticket'] == int(ticket): 143 addMessage("You cannot stop working on ticket " + tckt_link + " as it appears you're working on something else!") 144 return 180 145 181 146 # Here we should calculate times and automatically add hours to ticket etc. 182 147 now = int(time()); 183 148 sql = "UPDATE work_log SET endtime=%s, lastchange=%s WHERE user='%s' AND lastchange=%s AND endtime=0" % \ 184 (now, now, authname, lastchange) 185 dbhelper.execute_non_query(self.env.get_db_cnx(), sql) 149 (now, now, authname, task['lastchange']) 150 db = self.env.get_db_cnx(); 151 cursor = db.cursor() 152 cursor.execute(sql) 186 153 addMessage("You are no longer working on ticket " + tckt_link + ".") 187 154
