Changeset 3039
- Timestamp:
- 01/11/08 15:31:58 (1 year ago)
- Files:
-
- estimatorplugin/0.11/estimatorplugin/estimator.py (modified) (1 diff)
- estimatorplugin/0.11/estimatorplugin/htdocs/estimate.js (modified) (2 diffs)
- estimatorplugin/0.11/estimatorplugin/macro_provider.py (modified) (1 diff)
- estimatorplugin/0.11/estimatorplugin/templates/estimate.html (modified) (1 diff)
- estimatorplugin/0.11/estimatorplugin/webui.py (modified) (7 diffs)
- estimatorplugin/0.11/setup.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
estimatorplugin/0.11/estimatorplugin/estimator.py
r3035 r3039 41 41 def getHtmlEstimate(id): 42 42 return dbhelper.get_scalar("SELECT COMMENT FROM estimate WHERE ID=%s", 0, id) 43 44 estimateChangeTicketComment = """ 45 INSERT INTO ticket_change (ticket, time, author, field, oldvalue, newvalue) 46 VALUES ( %s, %s, %s, 'estimate', '', %s ) 47 """ estimatorplugin/0.11/estimatorplugin/htdocs/estimate.js
r3035 r3039 26 26 function evenDeeperClone(node){ 27 27 //firefox 2 has a bug where it wont clone textarea values sometimes 28 var kids = []; 28 var kids = [], kid; 29 29 30 for(var i=0 ; kid=node.childNodes[i] ; i++) 30 31 kids[i] = evenDeeperClone(kid); … … 33 34 if (node.value) hsh.value = node.value; 34 35 if (node.type && node.type!='textarea') hsh.type = node.type 35 36 36 if (node.tagName) newNode = cn(node.tagName, hsh, kids); 37 else newNode = node.cloneNode(true); 37 else 38 newNode = node.cloneNode(true); 39 /* 40 newNode = node.cloneNode(false); 41 for(var i=0 ; kid=node.childNodes[i] ; i++){ 42 var cloned = evenDeeperClone(kid); 43 newNode.appendChild(cloned); 44 } 45 */ 38 46 return newNode; 39 47 } estimatorplugin/0.11/estimatorplugin/macro_provider.py
r3035 r3039 41 41 """ 42 42 #try: 43 x = dir(self)44 x.sort()45 self.log.debug('what? : %s, %r' % (self, x))46 43 return self.estimate_macro(int(content), formatter.req) 47 44 #except: estimatorplugin/0.11/estimatorplugin/templates/estimate.html
r3034 r3039 106 106 var lineItems = ${estimate.lineItems}; 107 107 loadLineItems(); 108 newLineItem();108 if(lineItems.length == 0) newLineItem(); 109 109 </script > 110 110 </div> estimatorplugin/0.11/estimatorplugin/webui.py
r3035 r3039 9 9 from trac.web.href import Href 10 10 from estimator import * 11 11 from trac.ticket import Ticket 12 import datetime 13 from trac.util.datefmt import utc, to_timestamp 12 14 13 15 class EstimationsPage(Component): … … 15 17 def __init__(self): 16 18 pass 17 def load(self, req, addMessage, data):19 def load(self, id, addMessage, data): 18 20 try: 19 id = int(req.args['id'])20 21 data["estimate"]["id"] = id 21 22 estimate_rs = getEstimateResultSet(id) … … 32 33 addMessage('Cant Find Estimate Id: %s' % id) 33 34 except Exception, e: 34 addMessage('Invalid Id: %s' % req.args['id'])35 addMessage('Invalid Id: %s' % id) 35 36 addMessage('Error: %s' % e) 37 36 38 def line_item_hash_from_args(self, args): 37 39 not_line_items=['__FORM_TOKEN','tickets','variability','communication', … … 47 49 if not(not_line_items.__contains__(item[0]))] 48 50 return lineItems 51 52 def notify_old_tickets(self, req, id, addMessage, changer): 53 try: 54 estimate_rs = getEstimateResultSet(id) 55 tickets = estimate_rs.value('tickets', 0) 56 comment = estimate_rs.value('comment', 0) 57 tickets = [int(t.strip()) for t in tickets.split(',')] 58 self.log.debug('Notifying old tickets of estimate change: %s' % tickets) 59 return [(estimateChangeTicketComment, 60 [t, 61 to_timestamp(datetime.datetime.now(utc)), 62 req.authname, 63 "<del>%s</del>" % comment]) 64 for t in tickets] 65 except Exception, e: 66 self.log.error("Error saving old ticket changes: %s" % e) 67 addMessage("Tickets must be numbers") 68 return None 49 69 50 def save_from_form (self, args, addMessage): 70 def notify_new_tickets(self, req, id, tickets, addMessage): 71 try: 72 tag = "[[Estimate(%s)]]" % id 73 tickets = [int(t.strip()) for t in tickets.split(',')] 74 for t in tickets: 75 ticket = Ticket (self.env, t) 76 if ticket['description'].find (tag) == -1: 77 self.log.debug('Updating Ticket Description : %s'%t) 78 ticket['description'] = ticket['description']+'\n----\n'+tag 79 ticket.save_changes(req.authname, 'added estimate') 80 return True 81 except: 82 addMessage("Tickets must be numbers") 83 return None 84 85 86 def save_from_form (self, req, addMessage): 51 87 #try: 88 89 args = req.args 52 90 tickets = args["tickets"] 53 91 id = args["id"] 92 old_tickets = None 54 93 if id == None or id == '' : 94 self.log.debug('Saving new estimate') 55 95 sql = estimateInsert 56 96 id = nextEstimateId () 57 97 else: 98 self.log.debug('Saving edited estimate') 99 old_tickets = self.notify_old_tickets(req, id, addMessage, req.authname) 58 100 sql = estimateUpdate 59 101 self.log.debug('Old Tickets to Update: %r' % old_tickets) 60 102 estimate_args = [args['rate'], args['variability'], 61 103 args['communication'], tickets, … … 87 129 88 130 sql = removeLineItemsNotInListSql % ','.join(ids) 89 addMessage("Deleting NonExistant Estimate Rows: %r - %s" % (sql , id)) 90 91 result = dbhelper.execute_in_trans(saveEstimate, 92 (sql, [id]), 93 *saveLineItems) 131 #addMessage("Deleting NonExistant Estimate Rows: %r - %s" % (sql , id)) 132 133 sqlToRun = [saveEstimate, 134 (sql, [id]),] 135 sqlToRun.extend(saveLineItems) 136 if old_tickets: 137 sqlToRun.extend(old_tickets) 138 139 result = dbhelper.execute_in_trans(*sqlToRun) 94 140 #will be true or Exception 95 141 if result == True: 96 142 addMessage("Estimate Saved!") 143 if self.notify_new_tickets( req, id, tickets, addMessage): 144 req.redirect(req.href.Estimate()+'?id=%s'%id) 97 145 else: 98 146 addMessage("Failed to save! %s" % result) … … 124 172 def addMessage(s): 125 173 messages.extend([s]); 126 addMessage("Post Args: %s"% req.args.items())174 #addMessage("Post Args: %s"% req.args.items()) 127 175 if req.method == 'POST': 128 self.save_from_form(req .args, addMessage)176 self.save_from_form(req, addMessage) 129 177 data = {} 130 178 data["estimate"]={ … … 140 188 141 189 if req.args.has_key('id') and req.args['id'].strip() != '': 142 self.load( req, addMessage, data)190 self.load(int(req.args['id']), addMessage, data) 143 191 144 192 estimatorplugin/0.11/setup.py
r3013 r3039 4 4 5 5 setup(name=PACKAGE, 6 version='0.0. 1',6 version='0.0.2', 7 7 packages=[PACKAGE], 8 8 url='http://www.trac-hacks.org/wiki/EstimatorPlugin',
