Edgewall Software

Ticket #6879: change_but_rollback_on_preview_or_failure.2.patch

File change_but_rollback_on_preview_or_failure.2.patch, 2.6 KB (added by trac@…, 4 years ago)

Here is an ever so slightly nicer version of the patch. It's not much different but makes more appropriate use of copy()

  • ticket/web_ui.py

     
    431431                return self._render_diff(req, ticket, data, text_fields) 
    432432        elif req.method == 'POST': # 'Preview' or 'Submit' 
    433433            self._populate(req, ticket) 
    434             valid = self._validate_ticket(req, ticket) 
    435434 
    436435            # Do any action on the ticket? 
    437436            actions = TicketSystem(self.env).get_available_actions( 
     
    441440                # (this should never happen in normal situations) 
    442441            field_changes, problems = self.get_ticket_changes(req, ticket, 
    443442                                                              action) 
     443            valid = True 
    444444            if problems: 
    445445                valid = False 
    446446                for problem in problems: 
     
    451451                                    tag.pre('[trac]\nworkflow = ...\n'), 
    452452                                    tag.p('in your ', tag.tt('trac.ini'), '.')) 
    453453                                ) 
    454             if 'preview' not in req.args: 
    455                 if valid: 
    456                     self._apply_ticket_changes(ticket, field_changes) 
    457                     # redirected if successful 
    458                     self._do_save(req, ticket, action) 
    459                 # else fall through in a preview 
    460                 req.args['preview'] = True 
     454            if valid: 
     455                ## I can't work out how to copy a whole ticket so I only copy 
     456                ## the relevent bits that could change when calling _apply_ticket_changes. 
     457                ## There is almost certainly a better way to do this!!! 
     458                from copy import copy 
     459                workflow_ticket = copy(ticket) 
     460                workflow_ticket.values = copy(ticket.values) 
     461                workflow_ticket.old = copy(ticket._old) 
     462                self._apply_ticket_changes(workflow_ticket, field_changes) 
     463                # redirected if successful 
     464                if self._validate_ticket(req, workflow_ticket): 
     465                    if 'preview' not in req.args: 
     466                        self._do_save(req, workflow_ticket, action) 
     467                        # No need to copy workflow_ticket back to ticket as 
     468                        # _do_save will redirect if all is well :) 
     469                        # If something bad happens, we just want to preview anyway... 
     470            # else fall through in a preview 
     471            req.args['preview'] = True 
    461472 
    462473            # Preview an existing ticket (after a Preview or a failed Save) 
    463474            data.update({