I've used Bugzilla for many years and one of my favourite features is the "request system" (http://www.bugzilla.org/features/#rs), also known as "flags". The issue can flagged (?) to a user; the user can then accept the request (+) or deny it (-).
I am in the process of re-evaluating our issue tracking tools and I can't seem to find anything other than Bugzilla that has this feature.
So I am wondering:
Your advice is appreciated (FYI: I am currently leaning towards YouTrack).
Alex V. asked for more details about Bugzilla's request system functionality. Here's an example:
An arbitrary list of flags can be created in the admin interface. When editing an issue, they are listed in a row, here's an example:
Next, someone can set the flag and ask for a followup. The screen shot shows me (dcherk) setting the DJiNNInput flag for [email protected]:
Note that the same flag can be requested multiple times (not shown).
Later, [email protected] might act on the flag in some way and mark the request as accepted:
Alternatively, [email protected] might not be able to accept the request. In that case, he would deny it:
Needless to say, all these changes are tracked in the issue history, and can be searched and reported on.
FYI:
This is what we ended up doing in YouTrack:
Created two user[*]
fields:
The users can always set these fields manually, but we also added the following workflow rules to speed things up:
Rule 1, relates changes to the two field:
rule Input Requested
when Input Requested.changed {
if (Input Requested.isEmpty) {
Input Requesting.clear;
} else {
Input Requesting.add(loggedInUser);
}
}
Rule 2, closed issues do not need any more input:
rule Clear Input Requests When Issue Becomes Closed
when State.becomes({Closed}) {
Input Requested.clear;
Input Requesting.clear;
}
Rule 3, @mentioning sets the fields; replying clears the fields:
rule Input Requested via @mention
when comments.added.isNotEmpty {
var separators = " `!#%^&*()=[]{}:;'\"\\|,<>/?\n\r\t";
var mentionedUsers = "";
var myComment = comments.added.first;
var originalText = myComment.text;
var text = " " + originalText.lowerCase + " ";
var username = "";
var user = loggedInUser;
var index = -1;
index = text.indexOf("@", opts);
while (index != -1) {
index = index + 1;
username = "";
var nextSymbol = text.substring(index, index + 1);
while (!separators.contains(nextSymbol, opts)) {
username = username + nextSymbol;
index = index + 1;
nextSymbol = text.substring(index, index + 1);
}
if (username.endsWith(".", opts)) {
username = username.substringOfLength(username.length - 1, opts);
}
debug("Extracted @username: |" + username + "|");
if (username.isNotEmpty) {
user = project.getUser(username);
if (user != null && !mentionedUsers.contains("@" + user.login + ",", ignoreCase) && (user.isInGroup(permittedGroup.name) || permittedGroup == null || user == reporter) && (myComment.permittedGroup == null || user.isInGroup(myComment.permittedGroup.name))) {
if (Input Requesting.contains(user)) {
Input Requested.remove(loggedInUser);
if (Input Requested.isEmpty) {
Input Requesting.clear;
}
} else {
Input Requested.add(user);
Input Requesting.add(loggedInUser);
}
mentionedUsers = mentionedUsers + "@" + user.login + ",";
}
}
text = text.substringRelative("@" + username, pos: after);
index = text.indexOf("@", opts);
}
}
Hope that helps anyone along the way.