NewWorkflow: patch-newworkflow-r1040.diff
| File patch-newworkflow-r1040.diff, 66.7 KB (added by pkou <pkou at ua.fm>, 4 years ago) |
|---|
-
htdocs/css/timeline.css
30 30 /* Apply icon background-image twice to avoid hover-flicker in IE/Win */ 31 31 dt.changeset, dt.changeset a { background-image: url(../changeset.png) !important } 32 32 dt.newticket, dt.newticket a { background-image: url(../newticket.png) !important } 33 dt.resolvedticket, dt.resolvedticket a { background-image: url(../resolvedticket.png) !important } 34 dt.reopenedticket, dt.reopenedticket a { background-image: url(../reopenedticket.png) !important } 33 35 dt.closedticket, dt.closedticket a { background-image: url(../closedticket.png) !important } 34 36 dt.wiki, dt.wiki a { background-image: url(../wiki.png) !important } 35 37 dt.milestone, dt.milestone a { background-image: url(../milestone.png) !important } -
wiki-default/TracIni
22 22 See also: TracLogging 23 23 24 24 == [ticket] == 25 || workflow_version || Workflow version: 1 for simple, 2 for advanced || 25 26 || default_version || Default version for newly created tickets || 26 27 || default_severity || Default severity for newly created tickets || 27 28 || default_priority || Default priority for newly created tickets || -
wiki-default/TracAdmin
23 23 permission add <user> <action> -- Add a new permission rule 24 24 permission remove <user> <action> -- Remove permission rule 25 25 component list -- Show available components 26 component add <name> <owner> -- Add a new component26 component add <name> <owner> [<qaowner>] -- Add a new component 27 27 component rename <name> <newname> -- Rename a component 28 28 component remove <name> -- Remove/uninstall component 29 component chown <name> <owner> -- Change component ownership29 component chown <name> <owner> [<qaowner>] -- Change component ownership 30 30 priority list -- Show possible ticket priorities 31 31 priority add <value> -- Add a priority value option 32 32 priority change <value> <newvalue> -- Change a priority value … … 41 41 version time <name> <time> -- Set version date/time 42 42 version remove <name> -- Remove version 43 43 milestone list -- Show milestones 44 milestone add <name> [ time]-- Add milestone44 milestone add <name> [<owner> [time]] -- Add milestone 45 45 milestone rename <name> <newname> -- Rename milestone 46 46 milestone time <name> <time> -- Set milestone date/time 47 milestone chown <name> <owner> -- Change milestone ownership 47 48 milestone remove <name> -- Remove milestone 48 49 }}} 49 50 -
scripts/trac-admin
290 290 291 291 # ## Component 292 292 _help_component = [('component list', 'Show available components'), 293 ('component add <name> <owner> ', 'Add a new component'),293 ('component add <name> <owner> [<qaowner>]', 'Add a new component'), 294 294 ('component rename <name> <newname>', 'Rename a component'), 295 295 ('component remove <name>', 'Remove/uninstall component'), 296 ('component chown <name> <owner> ', 'Change component ownership')]296 ('component chown <name> <owner> [<qaowner>]', 'Change component ownership')] 297 297 298 298 def complete_component (self, text, line, begidx, endidx): 299 299 if begidx in [16,17]: … … 309 309 try: 310 310 if arg[0] == 'list': 311 311 self._do_component_list() 312 elif arg[0] == 'add' and len(arg) ==3:312 elif arg[0] == 'add' and len(arg) in [3,4]: 313 313 name = arg[1] 314 314 owner = arg[2] 315 self._do_component_add(name, owner) 315 if len(arg) == 4: 316 qaowner = arg[3] 317 else: 318 qaowner = owner 319 self._do_component_add(name, owner, qaowner) 316 320 elif arg[0] == 'rename' and len(arg)==3: 317 321 name = arg[1] 318 322 newname = arg[2] … … 320 324 elif arg[0] == 'remove' and len(arg)==2: 321 325 name = arg[1] 322 326 self._do_component_remove(name) 323 elif arg[0] == 'chown' and len(arg) ==3:327 elif arg[0] == 'chown' and len(arg) in [3,4]: 324 328 name = arg[1] 325 329 owner = arg[2] 326 self._do_component_set_owner(name, owner) 330 if len(arg) == 4: 331 qaowner = arg[3] 332 else: 333 qaowner = owner 334 self._do_component_set_owner(name, owner, qaowner) 327 335 else: 328 336 self.do_help ('component') 329 337 except Exception, e: 330 338 print 'Component %s failed:' % arg[0], e 331 339 332 340 def _do_component_list(self): 333 data = self.db_execsql('SELECT name, owner FROM component')334 self.print_listing(['Name', 'Owner' ], data)341 data = self.db_execsql('SELECT name, owner, qaowner FROM component') 342 self.print_listing(['Name', 'Owner', 'QA Owner'], data) 335 343 336 def _do_component_add(self, name, owner ):337 data = self.db_execsql("INSERT INTO component VALUES('%s', '%s' )"338 % (name, owner))344 def _do_component_add(self, name, owner, qaowner): 345 data = self.db_execsql("INSERT INTO component VALUES('%s', '%s', '%s')" 346 % (name,owner,qaowner)) 339 347 340 348 def _do_component_rename(self, name, newname): 341 349 cnx = self.db_open() … … 360 368 data = self.db_execsql("DELETE FROM component WHERE name='%s'" 361 369 % (name)) 362 370 363 def _do_component_set_owner(self, name, owner ):371 def _do_component_set_owner(self, name, owner, qaowner): 364 372 cnx = self.db_open() 365 373 cursor = cnx.cursor () 366 374 cursor.execute('SELECT name FROM component WHERE name=%s', name) 367 375 data = cursor.fetchone() 368 376 if not data: 369 377 raise Exception("No such component '%s'" % name) 370 data = self.db_execsql("UPDATE component SET owner='%s' WHERE name='%s'"371 % (owner, name))378 data = self.db_execsql("UPDATE component SET owner='%s', qaowner='%s' WHERE name='%s'" 379 % (owner,qaowner,name)) 372 380 373 381 374 382 ## Permission … … 795 803 796 804 ## Milestone 797 805 _help_milestone = [('milestone list', 'Show milestones'), 798 ('milestone add <name> [ time]', 'Add milestone'),806 ('milestone add <name> [<owner> [time]]', 'Add milestone'), 799 807 ('milestone rename <name> <newname>', 800 808 'Rename milestone'), 809 ('milestone chown <name> <newowner>', 'Change milestone owner'), 801 810 ('milestone time <name> <time>', 'Set milestone date (Format: "Jun 3, 2003")'), 802 811 ('milestone remove <name>', 'Remove milestone')] 803 812 … … 805 814 806 815 if begidx in [15,17]: 807 816 comp = self.get_milestone_list () 817 elif begidx > 15 and line.startswith('milestone chown '): 818 comp = self.get_user_list() 808 819 elif begidx < 15: 809 comp = ['list','add','rename',' time','remove']820 comp = ['list','add','rename','chown','time','remove'] 810 821 return self.word_complete(text, comp) 811 822 812 823 def do_milestone(self, line): 813 self._do_mile_ver('milestone', line) 824 type = 'milestone' 825 arg = self.arg_tokenize(line) 826 try: 827 if arg[0] == 'list': 828 self._do_milestone_list() 829 elif arg[0] == 'add' and len(arg) in [2,3,4]: 830 name = arg[1] 831 self._do_mile_ver_add(type, name) 832 if len(arg) >= 3: 833 owner = arg[2] 834 self._do_mile_ver_chown(type, name, owner) 835 if len(arg) >= 4: 836 time = arg[3] 837 self._do_mile_ver_time(type, name, time) 838 elif arg[0] == 'rename' and len(arg)==3: 839 name = arg[1] 840 newname = arg[2] 841 self._do_mile_ver_rename(type, name, newname) 842 elif arg[0] == 'chown' and len(arg)==3: 843 name = arg[1] 844 owner = arg[2] 845 self._do_mile_ver_chown(type, name, owner) 846 elif arg[0] == 'time' and len(arg)==3: 847 name = arg[1] 848 time = arg[2] 849 self._do_mile_ver_time(type, name, time) 850 elif arg[0] == 'remove' and len(arg)==2: 851 name = arg[1] 852 self._do_mile_ver_remove(type, name) 853 else: 854 self.do_help (type) 855 except Exception, e: 856 print 'Command %s failed:' % arg[0], e 814 857 858 def _do_milestone_list(self): 859 data = self.db_execsql("SELECT name,owner,time FROM milestone ORDER BY time,name") 860 data = map(lambda x: (x[0], x[1], x[2] and time.strftime('%c', time.localtime(x[2]))), data) 861 #print data 862 self.print_listing(['Name', 'Owner', 'Time'], data) 815 863 864 816 865 ## Version 817 866 _help_version = [('version list', 'Show versions'), 818 867 ('version add <name> [time]', 'Add version'), … … 832 881 def do_version(self, line): 833 882 self._do_mile_ver('version', line) 834 883 835 # Milestone and Version are identical, methods884 # Milestone and Version are almost identical, methods 836 885 837 886 def _do_mile_ver(self, type, line): 838 887 arg = self.arg_tokenize(line) … … 923 972 else: 924 973 print >> sys.stderr, 'Unknown time format' 925 974 975 def _do_mile_ver_chown(self, type, name, owner): 976 data = self.db_execsql("UPDATE %s SET owner='%s' WHERE name='%s'" 977 % (type, owner, name)); 978 926 979 _help_upgrade = [('upgrade', 'Upgrade database to current version.')] 927 980 def do_upgrade(self, line): 928 981 arg = self.arg_tokenize(line) -
trac/db_default.py
21 21 22 22 23 23 # Database version identifier. Used for automatic upgrades. 24 db_version = 7 24 db_version = 8 25 # Current workflow version identifier 26 current_workflow_version = 2 25 27 26 28 def __mkreports(reps): 27 29 """Utility function used to create report data in same syntax as the … … 125 127 ); 126 128 CREATE TABLE component ( 127 129 name text PRIMARY KEY, 128 owner text 130 owner text, 131 qaowner text 129 132 ); 130 133 CREATE TABLE milestone ( 131 134 id integer PRIMARY KEY, 132 135 name text, 133 136 time integer, 137 owner text, 134 138 descr text, 135 139 UNIQUE(name) 136 140 ); … … 209 213 """, 210 214 """ 211 215 SELECT p.value AS __color__, 212 versionAS __group__,213 id AS ticket, summary, component, version, severity,216 (CASE WHEN IFNULL(version, '') = '' THEN 'Not Specified' ELSE 'Version ' || version END) AS __group__, 217 id AS ticket, summary, component, milestone, severity, 214 218 (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 215 219 time AS created, 216 220 changetime AS _changetime, description AS _description, … … 218 222 FROM ticket t, enum p 219 223 WHERE status IN ('new', 'assigned', 'reopened') 220 224 AND p.name = t.priority AND p.type = 'priority' 221 ORDER BY ( version IS NULL),version, p.value, severity, time225 ORDER BY (IFNULL(version, '') = '') DESC,version, p.value, severity, time 222 226 """), 223 227 #---------------------------------------------------------------------------- 224 ('A llTickets by Milestone',228 ('Active Tickets by Milestone', 225 229 """ 226 230 This report shows how to color results by priority, 227 231 while grouping results by milestone. … … 231 235 """, 232 236 """ 233 237 SELECT p.value AS __color__, 234 milestone||' Release'AS __group__,238 (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 235 239 id AS ticket, summary, component, version, severity, 236 240 (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 237 241 time AS created, … … 240 244 FROM ticket t, enum p 241 245 WHERE status IN ('new', 'assigned', 'reopened') 242 246 AND p.name = t.priority AND p.type = 'priority' 243 ORDER BY ( milestone IS NULL),milestone, p.value, severity, time247 ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 244 248 """), 245 249 #---------------------------------------------------------------------------- 246 250 ('Assigned, Active Tickets by Owner', … … 248 252 List assigned tickets, group by ticket owner, sorted by priority. 249 253 """, 250 254 """ 251 252 255 SELECT p.value AS __color__, 253 ownerAS __group__,254 id AS ticket, summary, component, milestone, severity, time AS created,256 (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 257 id AS ticket, summary, component, version, milestone, severity, time AS created, 255 258 changetime AS _changetime, description AS _description, 256 259 reporter AS _reporter 257 260 FROM ticket t,enum p 258 261 WHERE status = 'assigned' 259 262 AND p.name=t.priority AND p.type='priority' 260 ORDER BY owner, p.value, severity, time263 ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 261 264 """), 262 265 #---------------------------------------------------------------------------- 263 266 ('Assigned, Active Tickets by Owner (Full Description)', … … 268 271 """ 269 272 SELECT p.value AS __color__, 270 273 owner AS __group__, 271 id AS ticket, summary, component, milestone, severity, time AS created,274 id AS ticket, summary, component, version, milestone, severity, time AS created, 272 275 description AS _description_, 273 276 changetime AS _changetime, reporter AS _reporter 274 277 FROM ticket t, enum p … … 283 286 """, 284 287 """ 285 288 SELECT p.value AS __color__, 286 t.milestoneAS __group__,289 (CASE WHEN IFNULL(t.milestone, '') = '' THEN 'Not Assigned' ELSE t.milestone || ' Release' END) AS __group__, 287 290 (CASE status 288 291 WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;' 289 292 ELSE … … 295 298 time AS _time,reporter AS _reporter 296 299 FROM ticket t,enum p 297 300 WHERE p.name=t.priority AND p.type='priority' 298 ORDER BY ( milestone IS NULL), milestone DESC, (status = 'closed'),301 ORDER BY (IFNULL(milestone, '') = '') DESC, milestone DESC, (status = 'closed'), 299 302 (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC 300 303 """), 301 304 #---------------------------------------------------------------------------- … … 308 311 """ 309 312 SELECT p.value AS __color__, 310 313 (CASE status WHEN 'assigned' THEN 'Assigned' ELSE 'Owned' END) AS __group__, 311 id AS ticket, summary, component, version, milestone,314 id AS ticket, summary, component, status, version, milestone, 312 315 severity, priority, time AS created, 313 316 changetime AS _changetime, description AS _description, 314 317 reporter AS _reporter 315 318 FROM ticket t, enum p 316 WHERE t.status IN ('new', 'assigned', 'reopened')319 WHERE t.status <> 'closed' 317 320 AND p.name = t.priority AND p.type = 'priority' AND owner = '$USER' 318 321 ORDER BY (status = 'assigned') DESC, p.value, milestone, severity, time 319 322 """), … … 338 341 WHERE status IN ('new', 'assigned', 'reopened') 339 342 AND p.name = t.priority AND p.type = 'priority' 340 343 ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 344 """), 345 #---------------------------------------------------------------------------- 346 ('Open Tickets, Mine first', 347 """ 348 * List all not closed tickets by priority. 349 * Show all tickets owned by the logged in user in a group first. 350 """, 351 """ 352 SELECT p.value AS __color__, 353 (CASE owner 354 WHEN '$USER' THEN 'My Tickets' 355 ELSE 'Open Tickets' 356 END) AS __group__, 357 id AS ticket, summary, component, status, version, milestone, severity, 358 (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 359 time AS created, 360 changetime AS _changetime, description AS _description, 361 reporter AS _reporter 362 FROM ticket t, enum p 363 WHERE status <> 'closed' 364 AND p.name = t.priority AND p.type = 'priority' 365 ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 366 """), 367 #---------------------------------------------------------------------------- 368 ('Open Tickets by Version', 369 """ 370 * List all not closed tickets by priority. 371 * Group results by version. 372 """, 373 """ 374 SELECT p.value AS __color__, 375 (CASE WHEN IFNULL(version, '') = '' THEN 'Not Specified' ELSE 'Version ' || version END) AS __group__, 376 id AS ticket, summary, component, status, milestone, severity, 377 (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 378 time AS created, 379 changetime AS _changetime, description AS _description, 380 reporter AS _reporter 381 FROM ticket t, enum p 382 WHERE status <> 'closed' 383 AND p.name = t.priority AND p.type = 'priority' 384 ORDER BY (IFNULL(version, '') = '') desc,version, p.value, severity, time 385 """), 386 #---------------------------------------------------------------------------- 387 ('Open Tickets by Milestone', 388 """ 389 * List all not closed tickets by priority. 390 * Group results by milestone. 391 """, 392 """ 393 SELECT p.value AS __color__, 394 (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 395 id AS ticket, summary, component, status, version, severity, 396 (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 397 time AS created, 398 changetime AS _changetime, description AS _description, 399 reporter AS _reporter 400 FROM ticket t, enum p 401 WHERE status <> 'closed' 402 AND p.name = t.priority AND p.type = 'priority' 403 ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 404 """), 405 #---------------------------------------------------------------------------- 406 ('Open Tickets by Owner', 407 """ 408 List not closed tickets, group by ticket owner, sorted by priority. 409 """, 410 """ 411 SELECT p.value AS __color__, 412 (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 413 id AS ticket, summary, component, status, version, milestone, severity, 414 time AS created, changetime AS _changetime, description AS _description, 415 reporter AS _reporter 416 FROM ticket t,enum p 417 WHERE status <> 'closed' 418 AND p.name=t.priority AND p.type='priority' 419 ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 420 """), 421 #---------------------------------------------------------------------------- 422 ('Open Tickets by Status', 423 """ 424 * List all not closed tickets by priority. 425 * Group results by status. 426 """, 427 """ 428 SELECT p.value AS __color__, 429 status AS __group__, 430 id AS ticket, summary, component, version, milestone, severity, owner, 431 time AS created, 432 changetime AS _changetime, description AS _description, 433 reporter AS _reporter 434 FROM ticket t, enum q, enum p 435 WHERE status <> 'closed' 436 AND q.name = t.status AND q.type = 'status' 437 AND p.name = t.priority AND p.type = 'priority' 438 ORDER BY q.value, p.value, severity, time 439 """), 440 #---------------------------------------------------------------------------- 441 ('Resolved Tickets, Mine first', 442 """ 443 * List all resolved tickets by priority. 444 * Show all tickets owned by the logged in user in a group first. 445 """, 446 """ 447 SELECT p.value AS __color__, 448 (CASE owner 449 WHEN '$USER' THEN 'My Tickets' 450 ELSE 'Active Tickets' 451 END) AS __group__, 452 id AS ticket, summary, component, version, milestone, severity, 453 (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 454 time AS created, 455 changetime AS _changetime, description AS _description, 456 reporter AS _reporter 457 FROM ticket t, enum p 458 WHERE status = 'resolved' 459 AND p.name = t.priority AND p.type = 'priority' 460 ORDER BY (owner = '$USER') DESC, p.value, milestone, severity, time 461 """), 462 #---------------------------------------------------------------------------- 463 ('Resolved Tickets by Milestone', 464 """ 465 List resolved tickets, sorted by priority, grouped by milestone 466 """, 467 """ 468 SELECT p.value AS __color__, 469 (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 470 id AS ticket, summary, component, version, severity, 471 (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, 472 time AS created, 473 changetime AS _changetime, description AS _description, 474 reporter AS _reporter 475 FROM ticket t, enum p 476 WHERE status = 'resolved' 477 AND p.name = t.priority AND p.type = 'priority' 478 ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 479 """), 480 #---------------------------------------------------------------------------- 481 ('Resolved Tickets by Owner', 482 """ 483 List resolved tickets, group by ticket owner, sorted by priority. 484 """, 485 """ 486 SELECT p.value AS __color__, 487 (CASE WHEN IFNULL(owner, '') = '' THEN 'Not Assigned' ELSE owner END) AS __group__, 488 id AS ticket, summary, component, version, milestone, severity, time AS created, 489 changetime AS _changetime, description AS _description, 490 reporter AS _reporter 491 FROM ticket t,enum p 492 WHERE status = 'resolved' 493 AND p.name=t.priority AND p.type='priority' 494 ORDER BY (IFNULL(owner, '') = '') DESC, owner, p.value, severity, time 495 """), 496 #---------------------------------------------------------------------------- 497 ('Verified Tickets by Milestone (Full Description)', 498 """ 499 Release Notes: List verified and closed tickets, group by milestone, include description. 500 """, 501 """ 502 SELECT p.value AS __color__, 503 (CASE WHEN IFNULL(milestone, '') = '' THEN 'Not Assigned' ELSE milestone||' Release' END) AS __group__, 504 id AS ticket, summary, component, status, version, severity, time AS created, 505 description AS _description_, 506 changetime AS _changetime, reporter AS _reporter 507 FROM ticket t, enum p 508 WHERE status IN ('verified', 'closed') 509 AND p.name = t.priority AND p.type = 'priority' 510 ORDER BY (IFNULL(milestone, '') = '') DESC,milestone, p.value, severity, time 341 511 """)) 342 512 343 513 … … 347 517 348 518 # (table, (column1, column2), ((row1col1, row1col2), (row2col1, row2col2))) 349 519 data = (('component', 350 ('name', 'owner' ),351 (('component1', 'somebody' ),352 ('component2', 'somebody' ))),520 ('name', 'owner', 'qaowner'), 521 (('component1', 'somebody', 'qasomebody'), 522 ('component2', 'somebody', 'qasomebody'))), 353 523 ('milestone', 354 524 ('name', 'time'), 355 525 (('', 0), … … 367 537 (('status', 'new', 1), 368 538 ('status', 'assigned', 2), 369 539 ('status', 'reopened', 3), 370 ('status', 'closed', 4), 540 ('status', 'resolved', 4), 541 ('status', 'verified', 5), 542 ('status', 'closed', 6), 371 543 ('resolution', 'fixed', 1), 372 544 ('resolution', 'invalid', 2), 373 545 ('resolution', 'wontfix', 3), … … 426 598 ('project', 'footer', 427 599 ' Visit the Trac open source project at<br />' 428 600 '<a href="http://trac.edgewall.com/">http://trac.edgewall.com/</a>'), 601 ('ticket', 'workflow_version', str(current_workflow_version)), 429 602 ('ticket', 'default_version', ''), 430 603 ('ticket', 'default_severity', 'normal'), 431 604 ('ticket', 'default_priority', 'normal'), -
trac/Milestone.py
60 60 if not group: 61 61 queries['all_tickets'] = env.href.query({'milestone': milestone}) 62 62 queries['active_tickets'] = env.href.query({ 63 'milestone': milestone, 'status': ['new', 'assigned', 'reopened' ]63 'milestone': milestone, 'status': ['new', 'assigned', 'reopened', 'resolved'] 64 64 }) 65 65 queries['closed_tickets'] = env.href.query({ 66 'milestone': milestone, 'status': 'closed'66 'milestone': milestone, 'status': ['closed', 'verified'] 67 67 }) 68 68 else: 69 69 queries['all_tickets'] = env.href.query({ … … 71 71 }) 72 72 queries['active_tickets'] = env.href.query({ 73 73 'milestone': milestone, grouped_by: group, 74 'status': ['new', 'assigned', 'reopened' ]74 'status': ['new', 'assigned', 'reopened', 'resolved'] 75 75 }) 76 76 queries['closed_tickets'] = env.href.query({ 77 77 'milestone': milestone, grouped_by: group, 78 'status': 'closed'78 'status': ['closed', 'verified'] 79 79 }) 80 80 return queries 81 81 82 82 def calc_ticket_stats(tickets): 83 83 total_cnt = len(tickets) 84 active = [ticket for ticket in tickets if ticket['status'] != 'closed' ]84 active = [ticket for ticket in tickets if ticket['status'] != 'closed' and ticket['status'] != 'verified'] 85 85 active_cnt = len(active) 86 86 closed_cnt = total_cnt - active_cnt 87 87 … … 116 116 if datestr: 117 117 date = self.parse_date(datestr) 118 118 descr = self.args.get('descr', '') 119 owner = self.args.get('owner', '') 119 120 if not id: 120 self.create_milestone(name, date, descr )121 self.create_milestone(name, date, descr, owner) 121 122 else: 122 self.update_milestone(id, name, date, descr )123 self.update_milestone(id, name, date, descr, owner) 123 124 elif id: 124 125 self.req.redirect(self.env.href.milestone(id)) 125 126 else: … … 141 142 'Invalid Date Format') 142 143 return seconds 143 144 144 def create_milestone(self, name, date=0, descr='' ):145 def create_milestone(self, name, date=0, descr='', owner=''): 145 146 self.perm.assert_permission(perm.MILESTONE_CREATE) 146 147 if not name: 147 148 raise TracError('You must provide a name for the milestone.', 148 149 'Required Field Missing') 149 150 cursor = self.db.cursor() 150 151 self.env.log.debug("Creating new milestone '%s'" % name) 151 cursor.execute("INSERT INTO milestone (id, name, time, descr ) "152 "VALUES (NULL, %s, %d, %s )", name, date, descr)152 cursor.execute("INSERT INTO milestone (id, name, time, descr, owner) " 153 "VALUES (NULL, %s, %d, %s, %s)", name, date, descr, owner) 153 154 self.db.commit() 154 155 self.req.redirect(self.env.href.milestone(name)) 155 156 … … 179 180 else: 180 181 self.req.redirect(self.env.href.milestone(id)) 181 182 182 def update_milestone(self, id, name, date, descr ):183 def update_milestone(self, id, name, date, descr, owner): 183 184 self.perm.assert_permission(perm.MILESTONE_MODIFY) 184 185 cursor = self.db.cursor() 185 186 self.env.log.debug("Updating milestone '%s'" % id) … … 189 190 cursor.execute('UPDATE ticket SET milestone = %s ' 190 191 'WHERE milestone = %s', name, id) 191 192 cursor.execute("UPDATE milestone SET name = %s, time = %d, " 192 "desc
