Плагин TFS - предотвращение сохранения рабочего элемента, если не соблюдены определенные логические ограничения

Мы пытаемся рассчитать параметры в плагине TFS на стороне сервера. Я пытаюсь запретить пользователям переводить PBI в состояние "Зафиксировано", если все их дочерние задачи не имеют значения в поле "оставшаяся работа".

Эта базовая логика работает, я могу пройти через дочерние элементы и получить все значения, независимо от того, существует или нет. Я не могу понять, \Accomplish, как предотвратить действие Сохранить в случае, если задача не имеет значения.

if (taskswithoutrw.Count() != 0)
{
    permitted = false;
    TeamFoundationApplicationCore.Log("changedpermitted to false", 0, EventLogEntryType.Information);
    throw new Exception("Some tasks does not contain \"Remaining Work\" value");
}
else
{
    var tasks = childs.Where(x => TFStringComparer.WorkItemTypeName.Equals(x.Type.Name, Task));
    double workSum = 0;

    foreach (var task in tasks)
    {
        workSum += Convert.ToDouble(task.Fields["Remaining Work"].Value) / 6;
        TeamFoundationApplicationCore.Log("Remaining Work sum: " + workSum.ToString(), 0, EventLogEntryType.Information);
    }
    wi.Fields["Story Points"].Value = workSum.ToString();
    wi.Save();
}

если выдается исключение, я устанавливаю EventNotificationStatus как ActionDenied

    catch (Exception ex)
    {
            // Log error (Should be logged to the windows event log by default)
            TeamFoundationApplicationCore.LogException(requestContext, "Exception occurd in ", ex);
            TeamFoundationApplicationCore.Log("outercatch", 0, EventLogEntryType.Information);
            statusCode = -1;
            return EventNotificationStatus.ActionDenied;
    }

 Method must return this value
 return EventNotificationStatus.ActionPermitted;

Но, похоже, это не помогает, я что-то упустил?

1 ответ

Вы можете просто добавить ОБЯЗАТЕЛЬНОЕ правило в поле рабочего элемента, чтобы избежать нулевого значения. С этим правилом пользователи не могут сохранить рабочий элемент, пока не назначат значения для всех обязательных полей. Например:

<FieldDefinition name="Effort" refname="Microsoft.VSTS.Scheduling.Effort" type="Double" reportable="measure">
  <REQUIRED />
  <HELPTEXT>The estimated effort to implemented the backlog item</HELPTEXT>
</FieldDefinition>

Другой способ - предотвратить сохранение рабочего элемента, если значение field1 равно нулю, добавить еще одно поле field2, которое будет заполнено, если значение field1 равно нулю. Когда значение filed1 равно нулю, значение filed2 является недействительным, что препятствует сохранению рабочего элемента.

Чтобы выполнить задачу, когда при изменении состояния рабочего элемента PBI на Committed необходимо найти значение дочерних рабочих элементов Task в поле "оставшаяся работа", а затем отключить изменение состояния. Для этого вам нужно захватить событие onChange раскрывающегося состояния:

1. добавить метод AddEventHandler(), который добавляет событие к рабочему элементу.

private void AddEventHandler()
        {
              workItem.FieldChanged += new WorkItemFieldChangeEventHandler (this.workItem_FieldChanged);
        }

2. Вызовите этот метод в свойстве WorkItemDatasource.

object IWorkItemControl.WorkItemDatasource
        {
            get
            {
                return workItem;
            }
            set
            {
                workItem = (WorkItem)value;
                AddEventHandler();
            }
        }

3. Теперь выполните необходимые функции в методе workItem_FieldChanged.

Согласно вашему требованию, вам нужно определить, является ли измененное поле состоянием, и установлено ли оно в значение Committed. Это может быть достигнуто путем проверки аргументов события, как показано ниже.

(e.Field.Name == "State" && e.Field.Value.ToString() == "Committed")

Убедившись, что вы захватываете нужное событие, выясните, есть ли дочерние элементы для этого рабочего элемента. Также проверьте, является ли ссылка дочерней. Затем проверьте значение в поле "оставшаяся работа".

Вы можете проверить этот блог для получения дополнительной информации, которая должна вам помочь: http://www.codeproject.com/Articles/730928/Close-a-Work-Item-only-if-Child-Work-items-are-c

Другие вопросы по тегам