3 Stimmen

Wie kann ich nachverfolgen, wer einen Kommentar zu einem TFS Work Item eingegeben hat?

Bei der Arbeit an einem Problem in anderen Bug-Tracking-Systemen gibt es Möglichkeiten, Notizen zu Einträgen hinzuzufügen, die deutlich mit dem Benutzernamen des Autors und dem eingegebenen Datum gekennzeichnet sind. Ich suche nach einer ähnlichen Funktion in den Arbeitsaufgaben von TFS. Gibt es eine solche Funktion?

Derzeit verwenden wir ein System, das es uns ermöglicht, die aktuelle Uhrzeit und den Benutzernamen per Tastendruck in die mehrzeiligen Textfelder einzufügen. Alle Benutzer wissen, dass sie diese Informationen über ihren eigenen Eingaben einfügen müssen. Dies geschieht zwar manuell, ist aber akzeptabel und einfach. Zum Beispiel:

5/1/2009 1:20:00 am - AManagr-
Defered to next version, and here's why...

4/24/2009 1:20:00 am - ADev - 
QA machine had out of date XYZ gizmo component. Here's the convoluted way this can happen... blah blah... This is difficult to fix.

4/22/2009 1:20:00 am - QAGuy - 
I can't save reports to PDF files.

Andere Tools, die ich verwendet habe (Mantis vielleicht?), hatten eine eingebaute "Notizen"-Funktion. So konnte ich nicht vergessen, meinen Namen auf Kommentare zu setzen, oder wissen, ob neue Notizen an den Anfang oder das Ende eines Feldes kommen, usw...

Die manuelle Eingabe Ihres Namens und des Datums/der Uhrzeit ist keine (gute) Option. Aber eine einzelne Taste oder eine Schaltfläche in der Symbolleiste zu drücken, wäre OK.

Ich bin nicht auf der Suche nach Ratschlägen für die Zerlegung langer "Notizen" wie dieser in mehrere spezifische Einzelfelder. Ich kenne auch die Registerkarte "Historie" bei Arbeitsaufgaben, aber das reicht nicht aus. Es muss klar sein, wer was wann geschrieben hat, und zwar in der gleichen Ansicht wie der Text.

更新情報

Stellen Sie sich vor, mehrere Teammitglieder recherchieren zu einem Thema. Alle fügen Informationen zum Arbeitsauftrag hinzu, jeder fügt mehr Text zum selben Feld hinzu. Wie können Sie leicht feststellen, wer welchen Teil hinzugefügt hat?

Das Verlaufsprotokoll zeigt eine Zeile für jede Änderung des Benutzers und sogar die Änderung des Feldes an. Diese Zeile befindet sich jedoch auf einem anderen Bildschirm und es ist schwierig, die angezeigten Daten mental zu analysieren.

Sie könnten jeden Teil des Textes "unterschreiben" - aber das ist ohne die Hilfe des Tools mühsam.

Vielleicht ist die Kommentarfunktion von Stackoverflows auch ein gutes Beispiel.

3voto

Robert Kozak Punkte 2045

Ja, das können Sie. TFS-Arbeitsaufgaben sind anpassbar. Nicht so sehr, wie ich es mir in dieser Version wünschen würde, aber man kann tun, was man will.

Versuchen wir es mit den folgenden Felddefinitionen. Die Felder Notizen Datum und Notizen Autor sind schreibgeschützt und erhalten ihre Standardwerte vom System. Das Feld Notizen ist ein HTML-Feld, in das Sie eingeben können, was Sie wollen. Sie können dies im Feld TFS-Prozess-Editor .

 <FIELD reportable="dimension" type="DateTime" name="Notes Date" refname="System.VSTS.Notes.Date">
    <DEFAULT from="clock" />
    <READONLY not="[Global]\Team Foundation Administrators" />
  </FIELD>
  <FIELD reportable="dimension" type="String" name="Notes Author" refname="System.VSTS.Notes.Author">
    <DEFAULT from="currentuser" />
    <READONLY not="[Global]\Team Foundation Administrators" />
  </FIELD>
  <FIELD type="HTML" name="Notes" refname="System.VSTS.Notes" />
</FIELDS>

Natürlich müssen Sie noch Steuerelemente zu Ihrem Formular hinzufügen.

Sie können auch versuchen, nur das Feld Notizen beizubehalten, sich für ein WorkItemChanged-Ereignis zu registrieren und einen Webservice zu schreiben, der das Feld Notizen mit Datum und Autor aktualisiert. Die Felder Changed BY und Changed Date liefern Ihnen diese Informationen. In diesem Artikel von Brian A. Randell erfahren Sie mehr über die verfügbaren Ereignisse und wie man sie abonniert. Team Foundation System Ereignisdienst

[WebService(Namespace = "http://mynamespace.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class UpdateWorkItem : System.Web.Services.WebService
{
    private static TeamFoundationServer _Tfs;
    private static WorkItemStore _WorkItemStore;

    private static List<WorkItem> _ChangedWorkItems = new List<WorkItem>();

    [SoapDocumentMethod(Action = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify", RequestNamespace = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03")]
    [WebMethod]
    public void Notify(string eventXml, string tfsIdentityXml)
    {

        EventLog.WriteEntry("TFS Services", "Log Started: Notify Webmethod");

        // Load the recieved XML into a XMLDocument
        XmlDocument eventXmlDoc = new XmlDocument();
        eventXmlDoc.LoadXml(eventXml);
        XmlElement eventData = eventXmlDoc.DocumentElement;

        // Validate event data
        if (eventData != null)
        {
            // Get Work Item id from event data
            int id = GetWorkItemId(eventData);

            //EventLog.WriteEntry("TFS Services", String.Format("eventXmlDoc {0}", eventXmlDoc.InnerXml));
            EventLog.WriteEntry("TFS Services", String.Format("Got Id {0}", id));
            string changedby = GetWorkItemChangedBy(eventData);
            EventLog.WriteEntry("TFS Services", String.Format("Got changedby {0}", changedby));
            if (changedby != "TFSSERVICE")
            {
                //Add a 15 second delay in order to make sure all workitems are saved first before starting to update them
                Thread.Sleep(15000);
                EventLog.WriteEntry("TFS Services", "Calling UpdateWorkItemInternal");
                UpdateWorkItemInternal(id);
            }
        }
    }

    private int GetWorkItemId(XmlElement eventData)
    {
        return Convert.ToInt32(eventData.SelectSingleNode("CoreFields/IntegerFields/Field[ReferenceName='System.Id']/NewValue").InnerText);
    }

    private string GetWorkItemChangedBy(XmlElement eventData)
    {
        return Convert.ToString(eventData.SelectSingleNode("CoreFields/StringFields/Field[ReferenceName='System.ChangedBy']/NewValue").InnerText);
    }

    private static void UpdateWorkItemInternal(int id)
    {
        //Connect To TFS Server 
        EventLog.WriteEntry("TFS Services", string.Format("Updating Work Item {0}", id));
        _Tfs = TeamFoundationServerFactory.GetServer("TeamServer");

        _WorkItemStore = (WorkItemStore)_Tfs.GetService(typeof(WorkItemStore));
        WorkItem workItem = _WorkItemStore.GetWorkItem(id);

        switch ((string)workItem.Fields["System.WorkItemType"].Value)
        {
            case "Bug":
                UpdateNotes(workItem);
                break;
            default:
                break;
        }

        foreach (WorkItem item in _ChangedWorkItems)
        {
            if (item.IsDirty)
            {
                foreach (Field field in item.Fields)
                {
                    if (!field.IsValid)
                    {
                        Console.Write("Not valid");
                    }
                }
                EventLog.WriteEntry("TFS Services", string.Format("Saving WorkItem: {0}", item.Id));
                try
                {
                    item.Save();
                }
                catch (Exception ex)
                {
                }
            }
        }

        _ChangedWorkItems.Clear();
    }

    private static void UpdateNotes(WorkItem workItem)
    {
       Field notes = workitem.Fields["System.VSTS.Notes"];
       if (notes != null)
       {
         notes = string.Format("{0} - {1}", workItem.ChangedDate, workItem.ChangedBy);
       } 

       if (workItem.IsDirty)
       {
           if (!_ChangedWorkItems.Contains(workItem))
           {
               _ChangedWorkItems.Add(workItem);
           }
       }
    }
 }

Dies ist nur schnell und schmutzig mit einigen Kopieren und Einfügen von meinem bestehenden Code so überprüfen Sie es sorgfältig, um sicherzustellen, dass ich nicht ein Tippfehler eingeführt.

0voto

Ich bin neugierig auf das Problem mit der Registerkarte Verlauf? Sie enthält das Datum/die Uhrzeit und den Namen des Benutzers in einem grauen Balken mit dem Kommentar, den er direkt darunter abgegeben hat.

Wenn sie keinen Kommentar abgegeben, aber andere Änderungen am Workitem vorgenommen haben, gibt es eine eingeklappte Überschrift namens Geänderte Felder anzeigen. Der Kommentar ist jedoch immer sichtbar.

Update

Sie können eine benutzerdefinierte Workitem-Steuerung erstellen, die Ihre eigene Ansicht der Workitem-Historie bietet.

http://msdn.microsoft.com/en-us/library/bb286959.aspx

Siehe auch Benutzerdefinierte Steuerelemente für die TFS-Arbeitsaufgabenverfolgung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X