def render_ticket_action_control(self, req, ticket, action): id, grade = self._get_grade(req, action) review_options = self._get_review_options(action) actions = ConfigurableTicketWorkflow(self.env).actions selected_value = grade or review_options[0][0] label = actions[action]['label'] control = tag([ "as: ", tag.select([ tag.option(option, selected=(option == selected_value or None)) for option, status in review_options ], name=id, id=id) ]) if grade: new_status = self._get_new_status(req, ticket, action, review_options) hint = "Next status will be '%s'" % new_status else: hint = "Next status will be one of " + \ ', '.join("'%s'" % status for option, status in review_options) return label, control, hint
def render_ticket_action_control(self, req, ticket, action): """Return a tuple in the form of `(label, control, hint)` `label` is a short text that will be used when listing the action, `control` is the markup for the action control and `hint` should explain what will happen if this action is taken. This method will only be called if the controller claimed to handle the given `action` in the call to `get_ticket_actions`. Note that the radio button for the action has an `id` of `"action_%s" % action`. Any `id`s used in `control` need to be made unique. The method used in the default ITicketActionController is to use `"action_%s_something" % action`. """ project_field_name = self.field_name(action, 'project') delete_field_name = self.field_name(action, 'delete') selected_project = req.args.get(project_field_name) controls = [] controls.append( tag.select([ tag.option(p, selected=(p == selected_project or None)) for p in self.projects() ], name=project_field_name)) controls.append( tag.label( "and Delete Ticket", tag.input(type="checkbox", name=delete_field_name, checked=req.args.get(delete_field_name)))) return ("Move To", controls, """Move to another trac. If not deleted this ticket will be closed with resolution 'duplicate'. WARNING: references to this ticket will not be updated.""")
def render_ticket_action_control(self, req, ticket, action): id = self.id_for_action % action selected_value = req.args.get(id, self.vote_options[0]) render_control = tag.select( [tag.option(x, selected=(x == selected_value or None)) for x in self.vote_options], name=id, id=id) return ("vote", render_control, "Vote on the issue, raising or lowering its priority")
def render_ticket_action_control(self, req, ticket, action): # Need to use the list of all status so you can't manually set # something to an invalid state. selected_value = req.args.get('force_status_value', 'new') all_status = TicketSystem(self.env).get_all_status() render_control = tag.select( [tag.option(x, selected=(x == selected_value and 'selected' or None)) for x in all_status], id='force_status_value', name='force_status_value') return ("force status to", render_control, "The next status will be the selected one")
def render_ticket_action_control(self, req, ticket, action): id = 'vote_%s_result' % (action, ) selected_value = req.args.get(id, 'for') options = ['for', 'against'] return ("vote", tag.select([ tag.option(x, selected=(x == selected_value or None)) for x in options ], name=id, id=id), "Vote on the issue, raising or lowering its priority")
def render_ticket_action_control(self, req, ticket, action): id, selected = self._get_selected(req, action) review_options = self._get_review_options(action) actions = ConfigurableTicketWorkflow(self.env).actions label = actions[action]['label'] control = tag(["as: ", tag.select([ tag.option(option, selected=(option == selected or None)) for option in review_options], name=id, id=id)]) if selected: new_status = self._get_new_status(req, action, review_options) hint = "Next status will be '%s'" % new_status else: hint = "Next status will be one of " + \ ', '.join("'%s'" % st for st in review_options.itervalues()) return label, control, hint
def render_ticket_action_control(self, req, ticket, action): self.log.debug('render_ticket_action_control: action "%s"', action) this_action = self.actions[action] status = this_action['newstate'] operations = this_action['operations'] ticket_owner = ticket._old.get('owner', ticket['owner']) ticket_status = ticket._old.get('status', ticket['status']) author = get_reporter_id(req, 'author') author_info = partial(Chrome(self.env).authorinfo, req, resource=ticket.resource) format_author = partial(Chrome(self.env).format_author, req, resource=ticket.resource) formatted_current_owner = author_info(ticket_owner) exists = ticket_status is not None ticket_system = TicketSystem(self.env) control = [] # default to nothing hints = [] if 'reset_workflow' in operations: control.append(_("from invalid state")) hints.append(_("Current state no longer exists")) if 'del_owner' in operations: hints.append(_("The ticket will be disowned")) if 'set_owner' in operations or 'may_set_owner' in operations: owners = self.get_allowed_owners(req, ticket, this_action) if 'set_owner' in operations: default_owner = author elif 'may_set_owner' in operations: if not exists: default_owner = ticket_system.default_owner else: default_owner = ticket_owner or None if owners is not None and default_owner not in owners: owners.insert(0, default_owner) else: # Protect against future modification for case that another # operation is added to the outer conditional raise AssertionError(operations) id = 'action_%s_reassign_owner' % action if not owners: owner = req.args.get(id, default_owner) control.append( tag_("to %(owner)s", owner=tag.input(type='text', id=id, name=id, value=owner))) if not exists or ticket_owner is None: hints.append(_("The owner will be the specified user")) else: hints.append(tag_("The owner will be changed from " "%(current_owner)s to the specified " "user", current_owner=formatted_current_owner)) elif len(owners) == 1: owner = tag.input(type='hidden', id=id, name=id, value=owners[0]) formatted_new_owner = author_info(owners[0]) control.append(tag_("to %(owner)s", owner=tag(formatted_new_owner, owner))) if not exists or ticket_owner is None: hints.append(tag_("The owner will be %(new_owner)s", new_owner=formatted_new_owner)) elif ticket['owner'] != owners[0]: hints.append(tag_("The owner will be changed from " "%(current_owner)s to %(new_owner)s", current_owner=formatted_current_owner, new_owner=formatted_new_owner)) else: selected_owner = req.args.get(id, default_owner) control.append(tag_("to %(owner)s", owner=tag.select( [tag.option(label, value=value if value is not None else '', selected=(value == selected_owner or None)) for label, value in sorted((format_author(owner), owner) for owner in owners)], id=id, name=id))) if not exists or ticket_owner is None: hints.append(_("The owner will be the selected user")) else: hints.append(tag_("The owner will be changed from " "%(current_owner)s to the selected user", current_owner=formatted_current_owner)) elif 'set_owner_to_self' in operations: formatted_author = author_info(author) if not exists or ticket_owner is None: hints.append(tag_("The owner will be %(new_owner)s", new_owner=formatted_author)) elif ticket_owner != author: hints.append(tag_("The owner will be changed from " "%(current_owner)s to %(new_owner)s", current_owner=formatted_current_owner, new_owner=formatted_author)) elif ticket_status != status: hints.append(tag_("The owner will remain %(current_owner)s", current_owner=formatted_current_owner)) if 'set_resolution' in operations: resolutions = [r.name for r in Resolution.select(self.env)] if 'set_resolution' in this_action: valid_resolutions = set(resolutions) resolutions = this_action['set_resolution'] if any(x not in valid_resolutions for x in resolutions): raise ConfigurationError(_( "Your workflow attempts to set a resolution but uses " "undefined resolutions (configuration issue, please " "contact your Trac admin).")) if not resolutions: raise ConfigurationError(_( "Your workflow attempts to set a resolution but none is " "defined (configuration issue, please contact your Trac " "admin).")) id = 'action_%s_resolve_resolution' % action if len(resolutions) == 1: resolution = tag.input(type='hidden', id=id, name=id, value=resolutions[0]) control.append(tag_("as %(resolution)s", resolution=tag(resolutions[0], resolution))) hints.append(tag_("The resolution will be set to %(name)s", name=resolutions[0])) else: selected_option = req.args.get(id, ticket_system.default_resolution) control.append(tag_("as %(resolution)s", resolution=tag.select( [tag.option(x, value=x, selected=(x == selected_option or None)) for x in resolutions], id=id, name=id))) hints.append(_("The resolution will be set")) if 'del_resolution' in operations: hints.append(_("The resolution will be deleted")) if 'leave_status' in operations: control.append(tag_("as %(status)s", status=ticket_status)) if len(operations) == 1: hints.append(tag_("The owner will remain %(current_owner)s", current_owner=formatted_current_owner) if ticket_owner else _("The ticket will remain with no owner")) elif not operations: if status != '*': if ticket['status'] is None: hints.append(tag_("The status will be '%(name)s'", name=status)) else: hints.append(tag_("Next status will be '%(name)s'", name=status)) return (this_action['label'], tag(separated(control, ' ')), tag(separated(hints, '. ', '.') if hints else ''))