Edgewall Software

Ticket #2618: mid_air_collision_retry-bboisvert.patch

File mid_air_collision_retry-bboisvert.patch, 6.3 KB (added by bboisvert@…, 6 years ago)

Implements a Retry button with a manual merge form on Mid-Air collision errros. Is an EXTENSION of attachment:mid_air_collision_retry-r3341.patch

  • trac/ticket/web_ui.py

     
    257257 
    258258        if req.method == 'POST': 
    259259            if not req.args.has_key('preview'): 
    260                 self._do_save(req, db, ticket) 
     260                return self._do_save(req, db, ticket) 
    261261            else: 
    262262                # Use user supplied values 
    263263                ticket.populate(req.args) 
    264264                self._validate_ticket(req, ticket) 
    265  
    266                 req.hdf['ticket.action'] = action 
    267                 req.hdf['ticket.ts'] = req.args.get('ts') 
    268                 req.hdf['ticket.reassign_owner'] = req.args.get('reassign_owner') \ 
    269                                                    or req.authname 
    270                 req.hdf['ticket.resolve_resolution'] = req.args.get('resolve_resolution') 
    271                 reporter_id = req.args.get('author') 
    272                 comment = req.args.get('comment') 
    273                 if comment: 
    274                     req.hdf['ticket.comment'] = comment 
    275                     # Wiki format a preview of comment 
    276                     req.hdf['ticket.comment_preview'] = wiki_to_html(comment, 
    277                                                                      self.env, 
    278                                                                      req, db) 
     265                self._populate_misc(req, db) 
    279266        else: 
    280267            req.hdf['ticket.reassign_owner'] = req.authname 
    281268            # Store a timestamp in order to detect "mid air collisions" 
     
    492479 
    493480        # Mid air collision? 
    494481        if int(req.args.get('ts')) != ticket.time_changed: 
    495             raise TracError("Sorry, can not save your changes. " 
    496                             "This ticket has been modified by someone else " 
    497                             "since you started", 'Mid Air Collision') 
     482            self._insert_ticket_data(req, None, ticket, 
     483                                     req.args.get('author')) 
     484            self._populate_misc(req, db) 
     485            req.hdf.hdf.copy('newticket', req.hdf.hdf.getObj('ticket')) 
     486            ticket = Ticket(self.env, ticket.id, db=db) 
     487            self._insert_ticket_data(req, None, ticket, 
     488                                     req.args.get('author')) 
     489            self._populate_misc(req, db) 
     490            return 'ticket_error_midair.cs', None 
    498491 
    499492        self._validate_ticket(req, ticket) 
    500493 
     
    598591        actions = TicketSystem(self.env).get_available_actions(ticket, req.perm) 
    599592        for action in actions: 
    600593            req.hdf['ticket.actions.' + action] = '1' 
     594 
     595    def _populate_misc(self, req, db): 
     596        req.hdf['ticket.action'] = req.args.get('action', 'view') 
     597        req.hdf['ticket.ts'] = req.args.get('ts') 
     598        req.hdf['ticket.reassign_owner'] = req.args.get('reassign_owner') \ 
     599                                           or req.authname 
     600        req.hdf['ticket.resolve_resolution'] = req.args.get('resolve_resolution') 
     601        reporter_id = req.args.get('author') 
     602        comment = req.args.get('comment') 
     603        if comment: 
     604            req.hdf['ticket.comment'] = comment 
     605            # Wiki format a preview of comment 
     606            req.hdf['ticket.comment_preview'] = wiki_to_html( 
     607                comment, self.env, req, db) 
     608 
  • templates/ticket_error_midair.cs

     
     1<?cs include "header.cs"?> 
     2 
     3<div id="ctxtnav" class="nav"></div> 
     4 
     5<div id="content" class="error"> 
     6 <h1>Mid Air Collision</h1> 
     7  <div class="message"> 
     8   <strong>Sorry, can not save your changes.</strong> 
     9   <p>This ticket has been modified by someone else since you started.</p> 
     10  </div> 
     11 
     12 <script type="text/javascript"> 
     13   function setField(name, selector) { 
     14     if (selector == "") { // we want the merge field, so no need to update 
     15       return; 
     16     } 
     17     var key = selector + "_" + name; 
     18     document.getElementById(name).value = document.getElementById(key).value; 
     19   } 
     20 </script> 
     21 <form action="<?cs var:ticket.href ?>#preview" method="post"> 
     22 <input type="hidden" name="author" value="<?cs var:ticket.reporter_id ?>" /> 
     23 <table cellspacing="0" border="1"> 
     24  <tr> 
     25   <th>&nbsp;</th> 
     26   <th colspan="2">Committed</th> 
     27   <th colspan="2">Yours</th> 
     28   <th colspan="2">Merged</th> 
     29  </tr><?cs 
     30  each:field = ticket.fields ?><?cs 
     31   if:ticket[name(field)] == newticket[name(field)] ?> 
     32   <input type="hidden" name="<?cs var:name(field) ?>" value="<?cs var:newticket[name(field)] ?>" /><?cs 
     33   else ?> 
     34    <tr> 
     35     <th><?cs var:name(field) ?></th> 
     36     <td><input type="radio" name="sel_<?cs var:name(field) ?>" id="sel_<?cs var:name(field) ?>_old" onclick="setField('<?cs var:name(field) ?>', 'old');" /></td> 
     37     <td><label for="sel_<?cs var:name(field) ?>_old"><?cs var:text_html(ticket[name(field)]) ?></label></td> 
     38     <td><input type="radio" name="sel_<?cs var:name(field) ?>" id="sel_<?cs var:name(field) ?>_new" checked="checked" onclick="setField('<?cs var:name(field)?>', 'new');" /></td> 
     39     <td><label for="sel_<?cs var:name(field) ?>_new"><?cs var:text_html(newticket[name(field)]) ?></label></td> 
     40     <td><input type="radio" name="sel_<?cs var:name(field) ?>" id="sel_<?cs var:name(field) ?>" onclick="setField('<?cs var:name(field) ?>', '');" /></td> 
     41     <td> 
     42      <input type="hidden" id="old_<?cs var:name(field) ?>" value="<?cs var:ticket[name(field)] ?>" /> 
     43      <input type="hidden" id="new_<?cs var:name(field) ?>" value="<?cs var:newticket[name(field)] ?>" /> 
     44      <input type="text" name="<?cs var:name(field) ?>" id="<?cs var:name(field) ?>" value="<?cs var:newticket[name(field)] ?>" onchange="document.getElementById('sel_<?cs var:name(field) ?>').checked=true;" /> 
     45     </td> 
     46    </tr><?cs 
     47   /if ?><?cs 
     48  /each ?> 
     49  <input type="hidden" name="reassign_owner" value="<?cs var:ticket.reassign_owner ?>" /> 
     50  <input type="hidden" name="action" value="<?cs var:ticket.action ?>" /> 
     51  <input type="hidden" name="ts" value="<?cs var:ticket.ts ?>" /> 
     52  <input type="hidden" name="comment" value="<?cs var:ticket.comment ?>" /> 
     53 </table> 
     54 
     55  <div class="buttons"> 
     56   <input type="submit" name="preview" value="Retry"  />&nbsp; 
     57  </div> 
     58 </form> 
     59</div> 
     60 
     61<?cs include "footer.cs"?>