NewWorkflow: patch-newworkflow-r1034.diff
| File patch-newworkflow-r1034.diff, 67.1 KB (added by pkou <pkou at ua.fm>, 7 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), 374 546 ('resolution', 'duplicate', 4), 375 547 ('resolution', 'worksforme', 5), 548 ('resolution', 'moved', 6), 376 549 ('severity', 'blocker', 1), 377 550 ('severity', 'critical', 2), 378 551 ('severity', 'major', 3), … … 426 599 ('project', 'footer', 427 600 ' Visit the Trac open source project at<br />' 428 601 '<a href="http://trac.edgewall.com/">http://trac.edgewall.com/</a>'), 602 ('ticket', 'workflow_version', str(current_workflow_version)), 429 603 ('ticket', 'default_version', ''), 430 604 ('ticket', 'default_severity', 'normal'), 431 605 ('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 "descr = %s WHERE name = %s",193 name, date, descr, id)193 "descr = %s, owner = %s WHERE name = %s", 194 name, date, descr, owner, id) 194 195 self.db.commit() 196 195 197 self.req.redirect(self.env.href.milestone(name)) 196 198 else: 197 199 self.req.redirect(self.env.href.milestone(id)) … … 223 225 224 226 def get_milestone(self, name): 225 227 cursor = self.db.cursor() 226 cursor.execute("SELECT name, time, descr FROM milestone "228 cursor.execute("SELECT name, time, descr, owner FROM milestone " 227 229 "WHERE name = %s ORDER BY time, name", name) 228 230 row = cursor.fetchone() 229 231 cursor.close() … … 238 240 t = row['time'] and int(row['time']) 239 241 if t > 0: 240 242 milestone['date'] = time.strftime('%x', time.localtime(t)) 243 owner = row['owner'] 244 if not owner: owner = '' 245 milestone['owner'] = owner 241 246 return milestone 242 247 243 248 def render(self): -
trac/Query.py
112 112 del constraints[field] 113 113 114 114 cursor = self.db.cursor() 115 add_options('status', constraints, 'query.options.', cursor, 116 "SELECT name FROM enum WHERE type='status' ORDER BY value") 115 if self.env.get_workflow_version() <= 1: 116 add_options('status', constraints, 'query.options.', cursor, 117 "SELECT name FROM enum" \ 118 " WHERE type='status' AND name IN" \ 119 " ('new', 'assigned', 'reopened', 'closed')" \ 120 " ORDER BY value") 121 else: 122 add_options('status', constraints, 'query.options.', cursor, 123 "SELECT name FROM enum WHERE type='status' ORDER BY value") 117 124 add_options('resolution', constraints, 'query.options.', cursor, 118 125 "SELECT name FROM enum WHERE type='resolution' ORDER BY value") 119 126 add_options('component', constraints, 'query.options.', cursor, -
trac/Timeline.py
52 52 REOPENED_TICKET = 4 53 53 WIKI = 5 54 54 MILESTONE = 6 55 VERIFIED_TICKET = 7 56 RESOLVED_TICKET = 8 57 RETESTED_TICKET = 9 55 58 56 59 q = [] 57 60 if changeset: … … 69 72 "FROM ticket_change WHERE field='status' " 70 73 "AND newvalue='reopened' AND time>=%s AND time<=%s" % 71 74 (start, stop)) 72 q.append("SELECT t1.time AS time, t1.ticket AS idata," 73 " t2.newvalue AS tdata, 3 AS type," 74 " t3.newvalue AS message, t1.author AS author" 75 " FROM ticket_change t1" 76 " INNER JOIN ticket_change t2 ON t1.ticket = t2.ticket" 77 " AND t1.time = t2.time" 78 " LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time" 79 " AND t1.ticket = t3.ticket AND t3.field = 'comment'" 80 " WHERE t1.field = 'status' AND t1.newvalue = 'closed'" 81 " AND t2.field = 'resolution'" 82 " AND t1.time >= %s AND t1.time <= %s" % (start,stop)) 75 if self.env.get_workflow_version() <= 1: 76 q.append("SELECT t1.time AS time, t1.ticket AS idata," 77 " t2.newvalue AS tdata, 3 AS type," 78 " t3.newvalue AS message, t1.author AS author" 79 " FROM ticket_change t1" 80 " INNER JOIN ticket_change t2 ON t1.ticket = t2.ticket" 81 " AND t1.time = t2.time" 82 " LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time" 83 " AND t1.ticket = t3.ticket AND t3.field = 'comment'" 84 " WHERE t1.field = 'status' AND t1.newvalue = 'closed'" 85 " AND t2.field = 'resolution'" 86 " AND t1.time >= %s AND t1.time <= %s" % (start,stop)) 87 else: 88 q.append("SELECT time, ticket AS idata, '' AS tdata, 3 AS type, " 89 "'' AS message, author " 90 "FROM ticket_change WHERE field='status' " 91 "AND newvalue='closed' AND time>=%s AND time<=%s" % 92 (start, stop)) 93 q.append("SELECT time, ticket AS idata, '' AS tdata, 7 AS type, " 94 "'' AS message, author " 95 "FROM ticket_change WHERE field='status' " 96 "AND newvalue='verified' AND oldvalue<>'closed' AND time>=%s AND time<=%s" % 97 (start, stop)) 98 q.append("SELECT t1.time AS time, t1.ticket AS idata," 99 " t2.newvalue AS tdata, 8 AS type," 100 " t3.newvalue AS message, t1.author AS author" 101 " FROM ticket_change t1" 102 " INNER JOIN ticket_change t2 ON t1.ticket = t2.ticket" 103 " AND t1.time = t2.time" 104 " LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time" 105 " AND t1.ticket = t3.ticket AND t3.field = 'comment'" 106 " WHERE t1.field = 'status' AND t1.newvalue = 'resolved' AND t1.oldvalue NOT IN ('verified', 'closed')" 107 " AND t2.field = 'resolution'" 108 " AND t1.time >= %s AND t1.time <= %s" % (start,stop)) 109 q.append("SELECT time, ticket AS idata, '' AS tdata, 9 AS type, " 110 "'' AS message, author " 111 "FROM ticket_change WHERE field='status' " 112 "AND newvalue='resolved' AND oldvalue IN ('closed', 'verified') AND time>=%s AND time<=%s" % 113 (start, stop)) 83 114 if wiki: 84 115 q.append("SELECT time, -1 AS idata, name AS tdata, 5 AS type, " 85 116 "comment AS message, author " … … 87 118 (start, stop)) 88 119 if milestone: 89 120 q.append("SELECT time, -1 AS idata, '' AS tdata, 6 AS type, " 90 "name AS message, ''AS author "121 "name AS message, owner AS author " 91 122 "FROM milestone WHERE time>=%s AND time<=%s" % 92 123 (start, stop)) 93 124 -
trac/Roadmap.py
48 48 icalhref += '&show=all' 49 49 self.req.hdf.setValue('roadmap.href.list', 50 50 self.env.href.roadmap()) 51 query = "SELECT name, time, descr FROM milestone " \51 query = "SELECT name, time, descr, owner FROM milestone " \ 52 52 "WHERE name != '' " \ 53 53 "ORDER BY (IFNULL(time, 0) = 0) ASC, time ASC, name" 54 54 else: 55 55 self.req.hdf.setValue('roadmap.showall', '1') 56 56 self.req.hdf.setValue('roadmap.href.list', 57 57 self.env.href.roadmap('all')) 58 query = "SELECT name, time, descr FROM milestone " \58 query = "SELECT name, time, descr, owner FROM milestone " \ 59 59 "WHERE name != '' " \ 60 60 "AND (time IS NULL OR time = 0 OR time > %d) " \ 61 61 "ORDER BY (IFNULL(time, 0) = 0) ASC, time ASC, name" % time() … … 81 81 milestone['descr'] = wiki_to_html(descr, self.req.hdf, 82 82 self.env, self.db) 83 83 milestone['descr_text'] = descr 84 owner = row['owner'] 85 if not owner: owner = '' 86 milestone['owner'] = owner 84 87 if milestone['time'] > 0: 85 88 milestone['date'] = strftime('%x', localtime(milestone['time'])) 86 89 self.milestones.append(milestone) … … 113 116 status = ticket['status'] 114 117 if status == 'new' or status == 'reopened' and not ticket['owner']: 115 118 return 'NEEDS-ACTION' 116 elif status == 'assigned' or status == 'reopened':119 elif status != 'closed': 117 120 return 'IN-PROCESS' 118 121 elif status == 'closed': 119 122 if ticket['resolution'] == 'fixed': return 'COMPLETED' -
trac/upgrades/db8.py
1 sql = """ 2 -- Add statuses 'resolved' and 'verified' 3 UPDATE enum SET value = 6 WHERE type = 'status' AND name = 'closed'; 4 INSERT INTO enum (type, name, value) VALUES ('status', 'resolved', 4); 5 INSERT INTO enum (type, name, value) VALUES ('status', 'verified', 5); 6 7 -- Add resolution 'moved' 8 INSERT INTO enum (type, name, value) VALUES ('resolution', 'moved', 6); 9 10 -- Add QA Contact to 'component' 11 CREATE TEMPORARY TABLE component_backup AS SELECT * FROM component; 12 DROP TABLE component; 13 CREATE TABLE component ( 14 name text PRIMARY KEY, 15 owner text, 16 qaowner text 17 ); 18 INSERT INTO component SELECT name, owner, owner AS qaowner FROM component_backup; 19 DROP TABLE component_backup; 20 21 -- Add Release Manager Contact to 'milestone' 22 CREATE TEMPORARY TABLE milestone_backup AS SELECT * FROM milestone; 23 DROP TABLE milestone; 24 CREATE TABLE milestone ( 25 id integer PRIMARY KEY, 26 name text, 27 time integer, 28 owner text, 29 descr text, 30 UNIQUE(name) 31 ); 32 INSERT INTO milestone SELECT id, name, time, '' AS owner, descr FROM milestone_backup; 33 DROP TABLE milestone_backup; 34 35 -- Modify 'All Tickets by Version' report 36 UPDATE report SET sql = ' 37 SELECT p.value AS __color__, 38 (CASE WHEN IFNULL(version, '''') = '''' THEN ''Not Specified'' ELSE ''Version '' || version END) AS __group__, 39 id AS ticket, summary, component, milestone, severity, 40 (CASE status WHEN ''assigned'' THEN owner||'' *'' ELSE owner END) AS owner, 41 time AS created, 42 changetime AS _changetime, description AS _description, 43 reporter AS _reporter 44 FROM ticket t, enum p 45 WHERE status IN (''new'', ''assigned'', ''reopened'') 46 AND p.name = t.priority AND p.type = ''priority'' 47 ORDER BY (IFNULL(version, '''') = '''') DESC,version, p.value, severity, time 48 ' WHERE title = 'Active Tickets by Version'; 49 50 -- Modify 'All Tickets by Milestone' report 51 UPDATE report SET sql = ' 52 SELECT p.value AS __color__, 53 (CASE WHEN IFNULL(milestone, '''') = '''' THEN ''Not Assigned'' ELSE milestone||'' Release'' END) AS __group__, 54 id AS ticket, summary, component, version, severity, 55 (CASE status WHEN ''assigned'' THEN owner||'' *'' ELSE owner END) AS owner, 56 time AS created, 57 changetime AS _changetime, description AS _description, 58 reporter AS _reporter 59 FROM ticket t, enum p 60 WHERE status IN (''new'', ''assigned'', ''reopened'') 61 AND p.name = t.priority AND p.type = ''priority'' 62 ORDER BY (IFNULL(milestone, '''') = '''') DESC,milestone, p.value, severity, time 63 ', title = 'Active Tickets by Milestone' 64 WHERE title = 'All Tickets by Milestone'; 65 66 -- Modify 'Assigned, Active Tickets by Owner' report 67 UPDATE report SET sql = ' 68 SELECT p.value AS __color__, 69 (CASE WHEN IFNULL(owner, '''') = '''' THEN ''Not Assigned'' ELSE owner END) AS __group__, 70 id AS ticket, summary, component, version, milestone, severity, time AS created, 71 changetime AS _changetime, description AS _description, 72 reporter AS _reporter 73 FROM ticket t,enum p 74 WHERE status = ''assigned'' 75 AND p.name=t.priority AND p.type=''priority'' 76 ORDER BY (IFNULL(owner, '''') = '''') DESC, owner, p.value, severity, time 77 ' WHERE title = 'Assigned, Active Tickets by Owner'; 78 79 -- Modify 'Assigned, Active Tickets by Owner (Full Description)' report 80 UPDATE report SET sql = ' 81 SELECT p.value AS __color__, 82 owner AS __group__, 83 id AS ticket, summary, component, version, milestone, severity, time AS created, 84 description AS _description_, 85 changetime AS _changetime, reporter AS _reporter 86 FROM ticket t, enum p 87 WHERE status = ''assigned'' 88 AND p.name = t.priority AND p.type = ''priority'' 89 ORDER BY owner, p.value, severity, time 90 ' WHERE title = 'Assigned, Active Tickets by Owner (Full Description)'; 91 92 -- Modify 'All Tickets By Milestone (Including closed)' report 93 UPDATE report SET sql = ' 94 SELECT p.value AS __color__, 95 (CASE WHEN IFNULL(t.milestone, '''') = '''' THEN ''Not Assigned'' ELSE t.milestone || '' Release'' END) AS __group__, 96 (CASE status 97 WHEN ''closed'' THEN ''color: #777; background: #ddd; border-color: #ccc;'' 98 ELSE 99 (CASE owner WHEN ''$USER'' THEN ''font-weight: bold'' END) 100 END) AS __style__, 101 id AS ticket, summary, component, status, 102 resolution,version, severity, priority, owner, 103 changetime AS modified, 104 time AS _time,reporter AS _reporter 105 FROM ticket t,enum p 106 WHERE p.name=t.priority AND p.type=''priority'' 107 ORDER BY (IFNULL(milestone, '''') = '''') DESC, milestone DESC, (status = ''closed''), 108 (CASE status WHEN ''closed'' THEN modified ELSE -p.value END) DESC 109 ' WHERE title = 'All Tickets By Milestone (Including closed)'; 110 111 -- Modify 'My Tickets' report 112 UPDATE report SET sql = ' 113 SELECT p.value AS __color__, 114 (CASE status WHEN ''assigned'' THEN ''Assigned'' ELSE ''Owned'' END) AS __group__, 115 id AS ticket, summary, component, status, version, milestone, 116 severity, priority, time AS created, 117 changetime AS _changetime, description AS _description, 118 reporter AS _reporter 119 FROM ticket t, enum p 120 WHERE t.status <> ''closed'' 121 AND p.name = t.priority AND p.type = ''priority'' AND owner = ''$USER'' 122 ORDER BY (status = ''assigned'') DESC, p.value, milestone, severity, time 123 ' WHERE title = 'My Tickets'; 124 125 -- New reports 126 127 INSERT INTO report VALUES(NULL,NULL,'Open Tickets, Mine first',' 128 SELECT p.value AS __color__, 129 (CASE owner 130 WHEN ''$USER'' THEN ''My Tickets'' 131 ELSE ''Open Tickets'' 132 END) AS __group__, 133 id AS ticket, summary, component, status, version, milestone, severity, 134 (CASE status WHEN ''assigned'' THEN owner||'' *'' ELSE owner END) AS owner, 135 time AS created, 136 changetime AS _changetime, description AS _description, 137 reporter AS _reporter 138 FROM ticket t, enum p 139 WHERE status <> ''closed'' 140 AND p.name = t.priority AND p.type = ''priority'' 141 ORDER BY (owner = ''$USER'') DESC, p.value, milestone, severity, time 142 ',' 143 * List all not closed tickets by priority. 144 * Show all tickets owned by the logged in user in a group first. 145 '); 146 147 INSERT INTO report VALUES(NULL,NULL,'Open Tickets by Version',' 148 SELECT p.value AS __color__, 149 (CASE WHEN IFNULL(version, '''') = '''' THEN ''Not Specified'' ELSE ''Version '' || version END) AS __group__, 150 id AS ticket, summary, component, status, milestone, severity, 151 (CASE status WHEN ''assigned'' THEN owner||'' *'' ELSE owner END) AS owner, 152 time AS created, 153 changetime AS _changetime, description AS _description, 154 reporter AS _reporter 155 FROM ticket t, enum p 156 WHERE status <> ''closed'' 157 AND p.name = t.priority AND p.type = ''priority'' 158 ORDER BY (IFNULL(version, '''') = '''') desc,version, p.value, severity, time 159 ',' 160 * List all not closed tickets by priority. 161 * Group results by version. 162 '); 163 164 INSERT INTO report VALUES(NULL,NULL,'Open Tickets by Milestone',' 165 SELECT p.value AS __color__, 166 (CASE WHEN IFNULL(milestone, '''') = '''' THEN ''Not Assigned'' ELSE milestone||'' Release'' END) AS __group__, 167 id AS ticket, summary, component, status, version, severity, 168 (CASE status WHEN ''assigned'' THEN owner||'' *'' ELSE owner END) AS owner, 169 time AS created, 170 changetime AS _changetime, description AS _description, 171 reporter AS _reporter 172 FROM ticket t, enum p 173 WHERE status <> ''closed'' 174 AND p.name = t.priority AND p.type = ''priority'' 175 ORDER BY (IFNULL(milestone, '''') = '''') DESC,milestone, p.value, severity, time 176 ',' 177 * List all not closed tickets by priority. 178 * Group results by milestone. 179 '); 180 181 INSERT INTO report VALUES(NULL,NULL,'Open Tickets by Owner',' 182 SELECT p.value AS __color__, 183 (CASE WHEN IFNULL(owner, '''') = '''' THEN ''Not Assigned'' ELSE owner END) AS __group__, 184 id AS ticket, summary, component, status, version, milestone, severity, 185 time AS created, changetime AS _changetime, description AS _description, 186 reporter AS _reporter 187 FROM ticket t,enum p 188 WHERE status <> ''closed'' 189 AND p.name=t.priority AND p.type=''priority'' 190 ORDER BY (IFNULL(owner, '''') = '''') DESC, owner, p.value, severity, time 191 ',' 192 List not closed tickets, group by ticket owner, sorted by priority. 193 '); 194 195 INSERT INTO report VALUES(NULL,NULL,'Open Tickets by Status',' 196 SELECT p.value AS __color__, 197 status AS __group__, 198 id AS ticket, summary, component, version, milestone, severity, owner, 199 time AS created, 200 changetime AS _changetime, description AS _description, 201 reporter AS _reporter 202 FROM ticket t, enum q, enum p 203 WHERE status <> ''closed'' 204 AND q.name = t.status AND q.type = ''status'' 205 AND p.name = t.priority AND p.type = ''priority'' 206 ORDER BY q.value, p.value, severity, time 207 ',' 208 * List all not closed tickets by priority. 209 * Group results by status. 210 '); 211 212 INSERT INTO report VALUES(NULL,NULL,'Resolved Tickets, Mine first',' 213 SELECT p.value AS __color__, 214 (CASE owner 215 WHEN ''$USER'' THEN ''My Tickets'' 216 ELSE ''Active Tickets'' 217 END) AS __group__, 218 id AS ticket, summary, component, version, milestone, severity, 219 (CASE status WHEN ''assigned'' THEN owner||'' *'' ELSE owner END) AS owner, 220 time AS created, 221 changetime AS _changetime, description AS _description, 222 reporter AS _reporter 223 FROM ticket t, enum p 224 WHERE status = ''resolved'' 225 AND p.name = t.priority AND p.type = ''priority'' 226 ORDER BY (owner = ''$USER'') DESC, p.value, milestone, severity, time 227 ',' 228 * List all resolved tickets by priority. 229 * Show all tickets owned by the logged in user in a group first. 230 '); 231 232 INSERT INTO report VALUES(NULL,NULL,'Resolved Tickets by Milestone',' 233 SELECT p.value AS __color__, 234 (CASE WHEN IFNULL(milestone, '''') = '''' THEN ''Not Assigned'' ELSE milestone||'' Release'' END) AS __group__, 235 id AS ticket, summary, component, version, severity, 236 (CASE status WHEN ''assigned'' THEN owner||'' *'' ELSE owner END) AS owner, 237 time AS created, 238 changetime AS _changetime, description AS _description, 239 reporter AS _reporter 240 FROM ticket t, enum p 241 WHERE status = ''resolved'' 242 AND p.name = t.priority AND p.type = ''priority'' 243 ORDER BY (IFNULL(milestone, '''') = '''') DESC,milestone, p.value, severity, time 244 ',' 245 List resolved tickets, sorted by priority, grouped by milestone 246 '); 247 248 INSERT INTO report VALUES(NULL,NULL,'Resolved Tickets by Owner',' 249 SELECT p.value AS __color__, 250 (CASE WHEN IFNULL(owner, '''') = '''' THEN ''Not Assigned'' ELSE owner END) AS __group__, 251 id AS ticket, summary, component, version, milestone, severity, time AS created, 252 changetime AS _changetime, description AS _description, 253 reporter AS _reporter 254 FROM ticket t,enum p 255 WHERE status = ''resolved'' 256 AND p.name=t.priority AND p.type=''priority'' 257 ORDER BY (IFNULL(owner, '''') = '''') DESC, owner, p.value, severity, time 258 ',' 259 List resolved tickets, group by ticket owner, sorted by priority. 260 '); 261 262 INSERT INTO report VALUES(NULL,NULL,'Verified Tickets by Milestone (Full Description)',' 263 SELECT p.value AS __color__, 264 (CASE WHEN IFNULL(milestone, '''') = '''' THEN ''Not Assigned'' ELSE milestone||'' Release'' END) AS __group__, 265 id AS ticket, summary, component, status, version, severity, time AS created, 266 description AS _description_, 267 changetime AS _changetime, reporter AS _reporter 268 FROM ticket t, enum p 269 WHERE status IN (''verified'', ''closed'') 270 AND p.name = t.priority AND p.type = ''priority'' 271 ORDER BY (IFNULL(milestone, '''') = '''') DESC,milestone, p.value, severity, time 272 ',' 273 Release Notes: List verified and closed tickets, group by milestone, include description. 274 '); 275 """ 276 277 def do_upgrade(env, ver, cursor): 278 cursor.execute(sql) 279 env.set_config('ticket', 'workflow_version', '1') 280 env.save_config() -
trac/Environment.py
163 163 row = cursor.fetchone() 164 164 return row and int(row[0]) 165 165 166 def get_workflow_version(self): 167 return int(self.get_config('ticket', 'workflow_version', str(db_default.current_workflow_version))) 168 166 169 def load_config(self): 167 170 self.cfg = ConfigParser.ConfigParser() 168 171 self.cfg.read(os.path.join(self.path, 'conf', 'trac.ini')) -
trac/Ticket.py
93 93 if not dict.has_key(name): 94 94 self[name] = '0' 95 95 96 def calc_owner(self, db): 97 """Calculate owner field if the owner is not specified or empty. 98 It depends on ticket.status, component.owner, component.qaowner, and 99 milestone.owner""" 100 cursor = db.cursor() 101 status = self.get('status', 'new') 102 component = self.get('component') 103 milestone = self.get('milestone') 104 105 # 1. The owner field defaults to the component owner for active tickets 106 if self.get('owner', '') == '' and component and status in ['new', 'reopened']: 107 cursor.execute('SELECT owner FROM component WHERE name=%s', component) 108 newowner = cursor.fetchone()[0] 109 if newowner: self['owner'] = newowner 110 # 2. The owner field defaults to component QA owner for testing tickets 111 if self.get('owner', '') == '' and component and status == 'resolved': 112 cursor.execute('SELECT qaowner FROM component WHERE name=%s', component) 113 newowner = cursor.fetchone()[0] 114 if newowner: self['owner'] = newowner 115 # 3. The owner field defaults to milestone owner for open tickets 116 if self.get('owner', '') == '' and milestone and status != 'closed': 117 cursor.execute('SELECT owner FROM milestone WHERE name=%s', milestone) 118 newowner = cursor.fetchone()[0] 119 if newowner: self['owner'] = newowner 120 # 4. The owner field defaults to reporter for verified tickets 121 if self.get('owner', '') == '' and status == 'verified': 122 reporter = self.get('reporter', '') 123 if reporter: self['owner'] = reporter 124 96 125 def insert(self, db): 97 126 """Add ticket to database""" 98 127 cursor = db.cursor() … … 132 161 133 162 # If the component is changed on a 'new' ticket then owner field 134 163 # is updated accordingly. (#623). 164 owner_updated = 0 135 165 if self['status'] == 'new' and self._old.has_key('component') and \ 136 166 not self._old.has_key('owner'): 137 167 cursor.execute('SELECT owner FROM component ' … … 140 170 if self['owner'] == old_owner: 141 171 cursor.execute('SELECT owner FROM component ' 142 172 'WHERE name=%s', self['component']) 143 self['owner'] = cursor.fetchone()[0] 144 173 newowner = cursor.fetchone()[0] 174 if newowner: 175 self['owner'] = newowner 176 owner_updated = 1 177 if owner_updated == 0 and self['status'] == 'new' and \ 178 self._old.has_key('milestone') and not self._old.has_key('owner'): 179 cursor.execute('SELECT owner FROM milestone ' 180 'WHERE name=%s', self._old['milestone']) 181 old_owner = cursor.fetchone()[0] 182 if self['owner'] == old_owner: 183 cursor.execute('SELECT owner FROM milestone ' 184 'WHERE name=%s', self['milestone']) 185 newowner = cursor.fetchone()[0] 186 if newowner: 187 self['owner'] = newowner 188 owner_updated = 1 145 189 146 190 for name in self._old.keys(): 147 191 if name[:7] == 'custom_': … … 261 305 ticket = Ticket() 262 306 ticket.populate(self.args) 263 307 ticket.setdefault('reporter',self.req.authname) 308 ticket.calc_owner(self.db) 264 309 265 # The owner field defaults to the component owner266 cursor = self.db.cursor()267 if ticket.get('component') and ticket.get('owner', '') == '':268 cursor.execute('SELECT owner FROM component '269 'WHERE name=%s', ticket['component'])270 owner = cursor.fetchone()[0]271 ticket['owner'] = owner272 273 310 tktid = ticket.insert(self.db) 274 311 275 312 # Notify … … 304 341 self.req.hdf, self.env, self.db)) 305 342 306 343 self.req.hdf.setValue('title', 'New Ticket') 344 self.req.hdf.setValue('workflow_version', str(self.env.get_workflow_version())) 307 345 evals = util.mydict(zip(ticket.keys(), 308 346 map(lambda x: util.escape(x), ticket.values()))) 309 347 util.add_to_hdf(evals, self.req.hdf, 'newticket') … … 336 374 337 375 # TODO: this should not be hard-coded like this 338 376 action = self.args.get('action', None) 339 if action == 'accept': 340 ticket['status'] = 'assigned' 341 ticket['owner'] = self.req.authname 342 if action == 'resolve': 377 wv = self.env.get_workflow_version() 378 if wv == 2 and action == 'verify2': 379 ticket['status'] = 'verified' 380 ticket['owner'] = '' 381 elif wv == 2 and action == 'close2': 343 382 ticket['status'] = 'closed' 383 elif wv == 2 and action == 'retest2': 384 ticket['status'] = 'resolved' 385 ticket['owner'] = '' 386 elif wv == 2 and action == 'resolve': 344 387 ticket['resolution'] = self.args.get('resolve_resolution') 388 ticket['status'] = 'resolved' 389 ticket['owner'] = '' 390 elif wv == 2 and action == 'reassign': 391 newowner = self.args.get('reassign_owner') 392 if ticket['owner'] != newowner: 393 ticket['owner'] = newowner 394 if ticket['status'] == 'assigned': ticket['status'] = 'new' 395 elif wv == 2 and action == 'reopen': 396 ticket['status'] = 'reopened' 397 ticket['resolution'] = '' 398 ticket['owner'] = '' 399 elif wv in [1,2] and action == 'accept': 400 if self.req.authname: 401 ticket['status'] = 'assigned' 402 ticket['owner'] = self.req.authname 403 elif action == 'resolve': 404 ticket['status'] = 'closed' 405 ticket['resolution'] = self.args.get('resolve_resolution') 345 406 elif action == 'reassign': 346 407 ticket['owner'] = self.args.get('reassign_owner') 347 408 ticket['status'] = 'new' … … 350 411 ticket['resolution'] = '' 351 412 352 413 ticket.populate(self.args) 414 ticket.calc_owner(self.db) 353 415 354 416 now = int(time.time()) 355 417 … … 386 448 387 449 self.req.hdf.setValue('ticket.reporter_id', util.escape(reporter_id)) 388 450 self.req.hdf.setValue('title', '#%d (%s)' % (id,ticket['summary'])) 451 self.req.hdf.setValue('workflow_version', str(self.env.get_workflow_version())) 389 452 self.req.hdf.setValue('ticket.description.formatted', 390 453 wiki_to_html(ticket['description'], self.req.hdf, 391 454 self.env, self.db)) … … 427 490 id = int(self.args.get('id')) 428 491 429 492 if not preview \ 430 and action in ['leave', 'accept', 'reopen', 'resolve', 'reassign']: 493 and (action in ['leave', 'accept', 'reopen', 'resolve', 'reassign'] \ 494 or self.env.get_workflow_version() >= 2 \ 495 and action in ['verify2', 'close2', 'retest2']): 431 496 self.save_changes (id) 432 497 433 498 ticket = Ticket(self.db, id) -
trac/WikiFormatter.py
125 125 elif row[1] == 'closed': 126 126 return '<a href="%s" title="CLOSED : %s"><del>#%d</del></a>' % (self._href.ticket(number), summary, number) 127 127 else: 128 return '<a href="%s" title="%s ">#%d</a>' % (self._href.ticket(number), summary, number)128 return '<a href="%s" title="%s : %s">#%d</a>' % (self._href.ticket(number), row[1].upper(), summary, number) 129 129 130 130 def _changesethref_formatter(self, match, fullmatch): 131 131 number = int(match[1:-1]) … … 158 158 elif row[1] == 'closed': 159 159 return self._href.ticket(args), '<del>%s:%s</del>' % (module, args), 0, 'CLOSED: ' + summary 160 160 else: 161 return self._href.ticket(args), '%s:%s' % (module, args), 0, summary161 return self._href.ticket(args), '%s:%s' % (module, args), 0, row[1].upper() + ': ' + summary 162 162 else: 163 163 return self._href.ticket(args), '%s:%s' % (module, args), 1, '' 164 164 elif module == 'wiki': -
templates/ticket.cs
33 33 <div id="ticket"> 34 34 <div class="date"><?cs var:ticket.opened ?></div> 35 35 <h1>Ticket #<?cs var:ticket.id ?> <?cs 36 if:ticket.status == 'closed' ?>(Closed: <?cs var:ticket.resolution ?>)<?cs 36 if:ticket.status == 'closed' || ticket.status == 'verified' || ticket.status == 'resolved' ?> 37 (<?cs var:ticket.status ?>: <?cs var:ticket.resolution ?>)<?cs 37 38 elif:ticket.status != 'new' ?>(<?cs var:ticket.status ?>)<?cs 38 39 /if ?></h1> 39 40 <h2><?cs var:ticket.summary ?></h2> … … 219 220 /def ?> 220 221 <?cs call:action_radio('leave') ?> 221 222 <label for="leave">leave as <?cs var:ticket.status ?></label><br /><?cs 222 if $ticket.status == "new" ?>223 if $ticket.status == "new" || $workflow_version == "2" && $ticket.status == "reopened" ?> 223 224 <?cs call:action_radio('accept') ?> 224 225 <label for="accept">accept ticket</label><br /><?cs 225 226 /if ?><?cs 226 if $ticket.status == "closed" ?>227 <?cs call:action_radio('reopen') ?>228 <label for="reopen">reopen ticket</label><br /><?cs229 /if ?><?cs230 227 if $ticket.status == "new" || $ticket.status == "assigned" || $ticket.status == "reopened" ?> 231 228 <?cs call:action_radio('resolve') ?> 232 229 <label for="resolve">resolve</label> 233 230 <label for="resolve_resolution">as:</label> 234 231 <?cs call:hdf_select(enums.resolution, "resolve_resolution", args.resolve_resolution) ?><br /> 232 <?cs /if ?> 233 234 <?cs if $workflow_version == "2" && $ticket.status == "resolved" ?> 235 <?cs call:action_radio('verify2') ?> 236 <label for="verify2">verify ticket</label><br /><?cs 237 /if ?> 238 239 <?cs if $workflow_version == "2" && ($ticket.status == "resolved" || $ticket.status == "verified") ?> 240 <?cs call:action_radio('close2') ?> 241 <label for="close2">close ticket</label><br /><?cs 242 /if ?> 243 244 <?cs if $ticket.status == "closed" || $workflow_version == "2" && ($ticket.status == "verified" || $ticket.status == "resolved") ?> 245 <?cs call:action_radio('reopen') ?> 246 <label for="reopen">reopen ticket</label><br /><?cs 247 /if ?> 248 249 <?cs if $workflow_version == "2" && ($ticket.status == "verified" || $ticket.status == "closed") ?> 250 <?cs call:action_radio('retest2') ?> 251 <label for="retest2">retest ticket</label><br /><?cs 252 /if ?> 253 254 <?cs 255 if $ticket.status != "closed" ?> 235 256 <?cs call:action_radio('reassign') ?> 236 257 <label for="reassign">reassign</label> 237 258 <label for="reassign_owner">to:</label> … … 239 260 if:args.reassign_to ?><?cs var:args.reassign_to ?><?cs 240 261 else ?><?cs var:trac.authname ?><?cs /if ?>" /><?cs 241 262 /if ?><?cs 242 if $ticket.status == "new" || $ticket.status == "assigned" || $ticket.status == "reopened" ?>263 if $ticket.status != "closed" ?> 243 264 <script type="text/javascript"> 244 var resolve = document.getElementById("resolve"); 265 <?cs if $ticket.status == "new" || $ticket.status == "assigned" || $ticket.status == "reopened" ?> 266 var resolve = document.getElementById("resolve");<?cs /if ?> 245 267 var reassign = document.getElementById("reassign"); 246 268 var updateActionFields = function() { 247 enableControl('resolve_resolution', resolve.checked); 269 <?cs if $ticket.status == "new" || $ticket.status == "assigned" || $ticket.status == "reopened" ?> 270 enableControl('resolve_resolution', resolve.checked);<?cs /if ?> 248 271 enableControl('reassign_owner', reassign.checked); 249 272 }; 250 273 addEvent(window, 'load', updateActionFields); 251 addEvent(document.getElementById("leave"), 'click', updateActionFields);<?cs 252 if $ticket.status == "new" ?> 253 addEvent(document.getElementById("accept"), 'click', updateActionFields);<?cs 254 /if ?> 255 addEvent(resolve, 'click', updateActionFields); 256 addEvent(reassign, 'click', updateActionFields); 274 addEvent(document.getElementById("leave"), 'click', updateActionFields); 275 <?cs if $ticket.status == "new" || $workflow_version == "2" && $ticket.status == "reopened" ?> 276 addEvent(document.getElementById("accept"), 'click', updateActionFields);<?cs /if ?> 277 <?cs if $ticket.status == "new" || $ticket.status == "assigned" || $ticket.status == "reopened" ?> 278 addEvent(resolve, 'click', updateActionFields);<?cs /if ?> 279 <?cs if $workflow_version == "2" && $ticket.status == "resolved" ?> 280 addEvent(document.getElementById("verify2"), 'click', updateActionFields);<?cs /if ?> 281 <?cs if $workflow_version == "2" && ($ticket.status == "resolved" || $ticket.status == "verified") ?> 282 addEvent(document.getElementById("close2"), 'click', updateActionFields);<?cs /if ?> 283 <?cs if $ticket.status == "closed" || $workflow_version == "2" && ($ticket.status == "verified" || $ticket.status == "resolved") ?> 284 addEvent(document.getElementById("reopen"), 'click', updateActionFields);<?cs /if ?> 285 <?cs if $workflow_version == "2" && ($ticket.status == "verified" || $ticket.status == "closed") ?> 286 addEvent(document.getElementById("retest2"), 'click', updateActionFields);<?cs /if ?> 287 addEvent(reassign, 'click', updateActionFields); 257 288 </script><?cs 258 289 /if ?> 259 290 </fieldset> -
templates/roadmap.cs
22 22 var:milestone.name ?></em></a></h2> 23 23 <p class="date"><?cs if:milestone.date ?> 24 24 <?cs var:milestone.date ?><?cs else ?>No date set<?cs /if ?> 25 <?cs if:milestone.owner ?> (<?cs var:milestone.owner ?>)<?cs /if ?> 25 26 </p> 26 27 <?cs with:stats = milestone.stats ?> 27 28 <?cs if:#stats.total_tickets > #0 ?> -
templates/timeline_rss.cs
43 43 $item.href, $item.msg_escwiki) 44 44 ?><?cs elif:item.type == #3 45 45 ?><!-- Closed ticket --> <?cs call:rss_item('Ticket', 46 'Ticket #'+$item.idata+' resolved: '+$item.shortmsg,46 'Ticket #'+$item.idata+' closed: '+$item.shortmsg, 47 47 $item.href, $item.msg_escwiki) 48 48 ?><?cs elif:item.type == #4 49 49 ?><!-- Reopened ticket --><?cs call:rss_item('Ticket', 50 50 '#'+$item.idata+' reopened: '+$item.shortmsg, 51 51 $item.href, $item.msg_escwiki) 52 ?><?cs elif:item.type == #7 53 ?><!-- Verified ticket --><?cs call:rss_item('Ticket', 54 '#'+$item.idata+' verified: '+$item.shortmsg, 55 $item.href, $item.msg_escwiki) 56 ?><?cs elif:item.type == #8 57 ?><!-- Resolved ticket --> <?cs call:rss_item('Ticket', 58 'Ticket #'+$item.idata+' resolved: '+$item.shortmsg, 59 $item.href, $item.msg_escwiki) 60 ?><?cs elif:item.type == #9 61 ?><!-- Retested ticket --><?cs call:rss_item('Ticket', 62 '#'+$item.idata+' retested: '+$item.shortmsg, 63 $item.href, $item.msg_escwiki) 52 64 ?><?cs elif:item.type == #5 53 65 ?><!-- Wiki change --><?cs call:rss_item('Wiki', 54 66 $item.tdata+" page edited.", -
templates/milestone.cs
56 56 var:milestone.name ?>" /> 57 57 </div> 58 58 <div class="field"> 59 <label for="owner">Owner of the milestone (Release Manager):</label><br /> 60 <input type="text" id="owner" name="owner" size="32" value="<?cs 61 var:milestone.owner ?>" /> 62 </div> 63 <div class="field"> 59 64 <label for="datemode">Completion date:</label><br /> 60 65 <select name="datemode" id="datemode" 61 66 onchange="enableControl('date',this.value=='manual'); … … 108 113 <?cs else ?> 109 114 <em class="date"><?cs if:milestone.date ?> 110 115 <?cs var:milestone.date ?><?cs else ?>No date set<?cs /if ?> 116 <?cs if:milestone.owner ?> (<?cs var:milestone.owner ?>)<?cs /if ?> 111 117 </em> 112 118 <div class="descr"><?cs var:milestone.descr ?></div> 113 119 <?cs /if ?> … … 120 126 <thead><tr> 121 127 <th class="name" rowspan="2"><?cs var:milestone.stats.grouped_by ?></th> 122 128 <th class="tickets" scope="col" colspan="2">Tickets</th> 123 <th class="progress" rowspan="2">Percent Resolved</th>129 <th class="progress" rowspan="2">Percent Completed</th> 124 130 </tr><tr> 125 131 <th class="open" scope="col">Active</th> 126 132 <th class="closed" scope="col">Closed</th> -
templates/timeline.cs
73 73 <?cs set:imessage = '' ?> 74 74 <?cs /if ?> 75 75 <?cs call:tlitem(item.href, 'closedticket', 76 'Ticket <em>#'+$item.idata+'</em> resolved by '+$item.author,76 'Ticket <em>#'+$item.idata+'</em> closed by '+$item.author, 77 77 $item.tdata+$imessage) ?> 78 78 <?cs elif:item.type == #4 ?><!-- Reopened ticket --> 79 <?cs call:tlitem(item.href, ' newticket',79 <?cs call:tlitem(item.href, 'reopenedticket', 80 80 'Ticket <em>#'+$item.idata+'</em> reopened by '+$item.author, '') ?> 81 <?cs elif:item.type == #7 ?><!-- Verified ticket --> 82 <?cs call:tlitem(item.href, 'closedticket', 83 'Ticket <em>#'+$item.idata+'</em> verified by '+$item.author, '') ?> 84 <?cs elif:item.type == #8 ?><!-- Resolved ticket --> 85 <?cs if:item.message ?> 86 <?cs set:imessage = ' - ' + $item.message ?> 87 <?cs else ?> 88 <?cs set:imessage = '' ?> 89 <?cs /if ?> 90 <?cs call:tlitem(item.href, 'resolvedticket', 91 'Ticket <em>#'+$item.idata+'</em> resolved by '+$item.author, 92 $item.tdata+$imessage) ?> 93 <?cs elif:item.type == #9 ?><!-- Retested ticket --> 94 <?cs call:tlitem(item.href, 'reopenedticket', 95 'Ticket <em>#'+$item.idata+'</em> retested by '+$item.author, '') ?> 81 96 <?cs elif:item.type == #5 ?><!-- Wiki change --> 82 97 <?cs call:tlitem(item.href, 'wiki', 83 98 '<em>'+$item.tdata+'</em> edited by '+$item.author, item.message) ?>
