Search code examples
bugzillaissue-trackingyoutrack

Bugzilla's "Request System": do other issue tracking tools have it?


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:

  • Does any other product offer similar functionality?
  • And if not, then is there a way to mimic it (using labels or custom fields or something)?

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:

A sample list of unset flags

Next, someone can set the flag and ask for a followup. The screen shot shows me (dcherk) setting the DJiNNInput flag for [email protected]:

A sample flag requested

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:

A sample flag, accepted

Alternatively, [email protected] might not be able to accept the request. In that case, he would deny it:

A sample flag, denied

Needless to say, all these changes are tracked in the issue history, and can be searched and reported on.


Solution

  • FYI:

    This is what we ended up doing in YouTrack:

    Created two user[*] fields:

    • Input Requesting (i.e. the person requesting input)
    • Input Requested (i.e. the user whose input is needed)

    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.