コード例 #1
0
    def apply_action_side_effects(self, req, ticket, action):
        """Add a cross-reference comment to the other ticket"""
        # TODO: This needs a lot more error checking.
        id = 'action_%s_xref' % action
        ticketnum = req.args.get(id).strip('#')
        actions = self.get_configurable_workflow().actions
        author = req.authname

        # Add a comment to the "remote" ticket to indicate this ticket is
        # related to it.
        format_string = actions[action].get(
            'xref', "Ticket %s is related "
            "to this ticket")
        comment = format_string % ('#%s' % ticket.id)
        # FIXME: we need a cnum to avoid messing up
        xticket = model.Ticket(self.env, ticketnum)
        # FIXME: We _assume_ we have sufficient permissions to comment on the
        # other ticket.
        now = datetime.now(utc)
        xticket.save_changes(author, comment, now)

        # Send notification on the other ticket
        event = TicketChangeEvent('changed', xticket, now, author)
        try:
            NotificationSystem(self.env).notify(event)
        except Exception, e:
            self.log.exception(
                "Failure sending notification on change to "
                "ticket #%s: %s", ticketnum, e)
コード例 #2
0
ファイル: commit_updater.py プロジェクト: zxfly/trac
 def _notify(self, ticket, date, author, comment):
     """Send a ticket update notification."""
     if not self.notify:
         return
     event = TicketChangeEvent('changed', ticket, date, author, comment)
     try:
         NotificationSystem(self.env).notify(event)
     except Exception as e:
         self.log.error(
             "Failure sending notification on change to "
             "ticket #%s: %s", ticket.id, exception_to_unicode(e))
コード例 #3
0
 def send_notification(self, ticket, author):
     if TicketNotifyEmail:
         tn = TicketNotifyEmail(self.env)
         tn.notify(ticket, newticket=False, modtime=ticket['changetime'])
     else:
         event = TicketChangeEvent('changed', ticket, ticket['changetime'],
                                   author)
         try:
             NotificationSystem(self.env).notify(event)
         except Exception as e:
             self.log.error(
                 "Failure sending notification on change to "
                 "ticket #%s: %s", ticket.id, exception_to_unicode(e))
コード例 #4
0
 def update(self,
            req,
            id,
            comment,
            attributes={},
            notify=False,
            author='',
            when=None):
     """ Update a ticket, returning the new ticket in the same form as
     get(). 'New-style' call requires two additional items in attributes:
     (1) 'action' for workflow support (including any supporting fields
     as retrieved by getActions()),
     (2) '_ts' changetime token for detecting update collisions (as received
     from get() or update() calls).
     ''Calling update without 'action' and '_ts' changetime token is
     deprecated, and will raise errors in a future version.'' """
     t = model.Ticket(self.env, id)
     # custom author?
     if author and not (req.authname == 'anonymous' \
                         or 'TICKET_ADMIN' in req.perm(t.resource)):
         # only allow custom author if anonymous is permitted or user is admin
         self.log.warn(
             "RPC ticket.update: %r not allowed to change author "
             "to %r for comment on #%d", req.authname, author, id)
         author = ''
     author = author or req.authname
     # custom change timestamp?
     if when and not 'TICKET_ADMIN' in req.perm(t.resource):
         self.log.warn(
             "RPC ticket.update: %r not allowed to update #%d "
             "with non-current timestamp (%r)", author, id, when)
         when = None
     when = when or to_datetime(None, utc)
     # never try to update 'time' and 'changetime' attributes directly
     if 'time' in attributes:
         del attributes['time']
     if 'changetime' in attributes:
         del attributes['changetime']
     # and action...
     if not 'action' in attributes:
         # FIXME: Old, non-restricted update - remove soon!
         self.log.warning(
             "Rpc ticket.update for ticket %d by user %s "
             "has no workflow 'action'.", id, req.authname)
         req.perm(t.resource).require('TICKET_MODIFY')
         time_changed = attributes.pop('_ts', None)
         if time_changed and \
                 str(time_changed) != str(to_utimestamp(t.time_changed)):
             raise TracError("Ticket has been updated since last get().")
         for k, v in attributes.iteritems():
             t[k] = v
         t.save_changes(author, comment, when=when)
     else:
         ts = TicketSystem(self.env)
         tm = TicketModule(self.env)
         # TODO: Deprecate update without time_changed timestamp
         time_changed = attributes.pop('_ts', to_utimestamp(t.time_changed))
         try:
             time_changed = int(time_changed)
         except ValueError:
             raise TracError("RPC ticket.update: Wrong '_ts' token " \
                             "in attributes (%r)." % time_changed)
         action = attributes.get('action')
         avail_actions = ts.get_available_actions(req, t)
         if not action in avail_actions:
             raise TracError("Rpc: Ticket %d by %s " \
                     "invalid action '%s'" % (id, req.authname, action))
         controllers = list(tm._get_action_controllers(req, t, action))
         all_fields = [field['name'] for field in ts.get_ticket_fields()]
         for k, v in attributes.iteritems():
             if k in all_fields and k != 'status':
                 t[k] = v
         # TicketModule reads req.args - need to move things there...
         req.args.update(attributes)
         req.args['comment'] = comment
         # Collision detection: 0.11+0.12 timestamp
         req.args['ts'] = str(from_utimestamp(time_changed))
         # Collision detection: 0.13/1.0+ timestamp
         req.args['view_time'] = str(time_changed)
         changes, problems = tm.get_ticket_changes(req, t, action)
         for warning in problems:
             add_warning(req, "Rpc ticket.update: %s" % warning)
         valid = problems and False or tm._validate_ticket(req, t)
         if not valid:
             raise TracError(" ".join(
                 [warning for warning in req.chrome['warnings']]))
         else:
             tm._apply_ticket_changes(t, changes)
             self.log.debug("Rpc ticket.update save: %r", t.values)
             t.save_changes(author, comment, when=when)
             # Apply workflow side-effects
             for controller in controllers:
                 controller.apply_action_side_effects(req, t, action)
     if notify:
         try:
             event = TicketChangeEvent('changed', t, when, author, comment,
                                       changes, action)
             NotificationSystem(self.env).notify(event)
         except Exception, e:
             self.log.exception(
                 "Failure sending notification on change of "
                 "ticket #%s: %s", t.id, e)