Modify

Opened 2 years ago

Closed 17 months ago

#10207 closed defect (duplicate)

Cannot update a ticket while changing child ticket to parent ticket (and vice versa) with a 'comment'.

Reported by: anonymous Owned by: rjollos
Priority: normal Component: MasterTicketsPlugin
Severity: normal Keywords:
Cc: Trac Release: 0.12

Description (last modified by rjollos)

While changing child ticket to parent ticket in a ticket ,If we give some comment and submit both then there is no update in ticket and There is Integrity Error

IntegrityError: columns ticket, time, field are not unique

File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/web/main.py", line 511, in _dispatch_request
  dispatcher.dispatch(req)
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/web/main.py", line 237, in dispatch
  resp = chosen_handler.process_request(req)
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/ticket/web_ui.py", line 169, in process_request
  return self._process_ticket_request(req)
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/ticket/web_ui.py", line 541, in _process_ticket_request
  self._do_save(req, ticket, action)
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/ticket/web_ui.py", line 1238, in _do_save
  cnum=internal_cnum):
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/ticket/model.py", line 360, in save_changes
  listener.ticket_changed(self, comment, author, old_values)
File "C:/SDWorkbenchServer/python/lib/site-packages/tracmastertickets-3.0.2-py2.7.egg/mastertickets/api.py", line 120, in ticket_changed
  links.save(author, comment, tkt.time_changed, db)
File "C:/SDWorkbenchServer/python/lib/site-packages/tracmastertickets-3.0.2-py2.7.egg/mastertickets/model.py", line 83, in save
  (n, when_ts, author, 'comment', '', '(In #%s) %s'%(self.tkt.id, comment)))
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/db/util.py", line 65, in execute
  return self.cursor.execute(sql_escape_percent(sql), args)
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/db/sqlite_backend.py", line 78, in execute
  result = PyFormatCursor.execute(self, *args)
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/db/sqlite_backend.py", line 56, in execute
  args or [])
File "C:/SDWorkbenchServer/python/lib/site-packages/trac-0.12.2-py2.7.egg/trac/db/sqlite_backend.py", line 48, in _rollback_on_error
  return function(self, *args, **kwargs)

Attachments (1)

model.py (5.4 KB) - added by anonymous 2 years ago.
Modified file

Download all attachments as: .zip

Change History (7)

comment:1 Changed 2 years ago by anonymous

When we updating parent/child ticket with comment , the logic (for loop) was iterating 2 times to modify "parent field" and "child field" each in model.py .
Each time while modifying if comment is given in field , it was updating that also.
In first iteration the comment field was modified so in second iteration while changing it was throwing error.
By making comment field to change only in one time, we can prevent the error.
check out modified script(model.py) as attachment.

Changed 2 years ago by anonymous

Modified file

comment:2 Changed 2 years ago by rjollos

  • Description modified (diff)

comment:3 Changed 22 months ago by rjollos

Unified diff is the preferred format for a patch. If I diff against the latest revision of model.py, I get:

  • model.py

    old new  
    1 import copy 
     1# Created by Noah Kantrowitz on 2007-07-04. 
     2# Copyright (c) 2007 Noah Kantrowitz. All rights reserved. 
     3import copy 
    24from datetime import datetime 
    35 
    46from trac.ticket.model import Ticket 
     
    79 
    810class TicketLinks(object): 
    911    """A model for the ticket links used MasterTickets.""" 
    10      
     12 
    1113    def __init__(self, env, tkt, db=None): 
    1214        self.env = env 
    1315        if not isinstance(tkt, Ticket): 
     
    4648            (new_blocked_by, self._old_blocked_by, 'blocking', ('dest', 'source')), 
    4749        ] 
    4850         
    49         comment_enable_flag = True  
    5051        for new_ids, old_ids, field, sourcedest in to_check: 
    5152            for n in new_ids | old_ids: 
    5253                update_field = None 
     
    7071                    cursor.execute('INSERT INTO ticket_change (ticket, time, author, field, oldvalue, newvalue) VALUES (%s, %s, %s, %s, %s, %s)',  
    7172                                   (n, when_ts, author, field, old_value, new_value)) 
    7273                                    
    73                     if comment and comment_enable_flag == True: # comment field shound modify once even for multiple changes 
     74                    if comment: 
    7475                        cursor.execute('INSERT INTO ticket_change (ticket, time, author, field, oldvalue, newvalue) VALUES (%s, %s, %s, %s, %s, %s)',  
    7576                                       (n, when_ts, author, 'comment', '', '(In #%s) %s'%(self.tkt.id, comment))) 
    76                         comment_enable_flag = False  
     77                                   
    7778                            
    7879                    cursor.execute('UPDATE ticket_custom SET value=%s WHERE ticket=%s AND name=%s', 
    7980                                   (new_value, n, field)) 
     
    8485                    if not cursor.rowcount: 
    8586                        cursor.execute('INSERT INTO ticket_custom (ticket, name, value) VALUES (%s, %s, %s)', 
    8687                                       (n, field, new_value)) 
    87         
     88         
     89        # cursor.execute('DELETE FROM mastertickets WHERE source=%s OR dest=%s', (self.tkt.id, self.tkt.id)) 
     90        # data = [] 
     91        # for tkt in self.blocking: 
     92        #     if isinstance(tkt, Ticket): 
     93        #         tkt = tkt.id 
     94        #     data.append((self.tkt.id, tkt)) 
     95        # for tkt in self.blocked_by: 
     96        #     if isisntance(tkt, Ticket): 
     97        #         tkt = tkt.id 
     98        #     data.append((tkt, self.tkt.id)) 
     99        #  
     100        # cursor.executemany('INSERT INTO mastertickets (source, dest) VALUES (%s, %s)', data) 
    88101         
    89102        if handle_commit: 
    90103            db.commit() 
     
    105118               (self.tkt.id, l(getattr(self, 'blocking', [])), l(getattr(self, 'blocked_by', []))) 
    106119 
    107120    @staticmethod 
    108     def walk_tickets(env, tkt_ids): 
     121    def walk_tickets(env, tkt_ids, full=False): 
    109122        """Return an iterable of all links reachable directly above or below those ones.""" 
    110         def visit(tkt, memo, next_fn): 
     123        def visit(tkt, memo, next_fn, full=False): 
    111124            if tkt in memo: 
    112125                return False 
    113126             
     
    120133        memo1 = {} 
    121134        memo2 = {} 
    122135        for id in tkt_ids: 
    123             visit(id, memo1, lambda links: links.blocking) 
    124             visit(id, memo2, lambda links: links.blocked_by) 
     136            if full: 
     137                visit(id, memo1, lambda links: links.blocking|links.blocked_by) 
     138            else: 
     139                visit(id, memo1, lambda links: links.blocking) 
     140                visit(id, memo2, lambda links: links.blocked_by) 
    125141        memo1.update(memo2) 
    126142        return memo1.itervalues() 

comment:4 Changed 22 months ago by rjollos

  • Owner changed from coderanger to rjollos
  • Status changed from new to assigned

comment:5 Changed 17 months ago by rjollos

  • Summary changed from Cannot update a ticket while changing child ticket to patent ticket(and vice versa) with a 'comment'. to Cannot update a ticket while changing child ticket to parent ticket (and vice versa) with a 'comment'.

comment:6 Changed 17 months ago by rjollos

  • Resolution set to duplicate
  • Status changed from assigned to closed

It looks like my diff in commment:3 was backwards. Anyway, Duplicate of #10194.

Add Comment

Modify Ticket

Action
as closed .
as The resolution will be set. Next status will be 'closed'.
to The owner will be changed from rjollos. Next status will be 'closed'.
The resolution will be deleted. Next status will be 'reopened'.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.