вторник, 29 мая 2012 г.

PowerShell-скрипт для генерации задач

В посте Генерация большого числа записей в список SharePoint я описывал, как можно легко сгенерировать много записей и вставить их в произвольный список. Однако, всегда хочется иметь в качестве тестовых более-менее реалистичные данные, разнообразные и полные. В этом посте я хочу привести скрипт для генерации записей для стандартного списка задач.
На основе этого скрипта, я верю, что вам удастся сформировать решения для генерации более реалистичных данных для ваших тестов.
Для каждого из типов полей я написал собственную маленькую функцию для генерации значений этого поля.
Например, вот эта функция:
$random = New-Object System.Random
function RandomDay()
{
    $start = New-Object System.DateTime(1995, 1, 1);

    $range = ([System.TimeSpan]([System.DateTime]::Today - $start)).Days;           
    return [System.DateTime]$start.AddDays($random.Next($range));
}

, вернет случайную дату. Полученные с её помощью значения можно использовать для заполнения колонок “Start Date” и “Due Date”.

Функции по генерации приоритета, статуса и прогресса задачи также довольно простые:
function RandomPriority()
{
    $priorities = "(1) High","(2) Normal","(2) Normal","(2) Normal","(3) Low"
    return [System.String]$priorities[$random.Next(0,5)]
}
function RandomStatus()
{
    $status = "Completed","Deferred","In Progress","Not Started"
    return [System.String]$status[$random.Next(0,4)]
}
function RandomProgress()
{
    $r = ($random.Next(0,20) * 5);
    if ($r -lt 10)
    {
       return [System.String]"0.0" + $r
    }
    else
    {
       return [System.String]"0." + $r
    }
}

Более интересна функция по генерации заголовка задачи. Она определяет список действий и список контрагентов (названия контрагентов взяты из базы NorthWind), берет по одному значению из каждого списка, и склеивает их в единую строку. Вот так:
function RandomTitle()
{
    $agents = "Alfreds Futterkiste","Ana Trujillo Emparedados y helados","Antonio Moreno Taqueria","Around the Horn","Berglunds snabbkop",
        "Blauer See Delikatessen","Blondesddsl pere et fils","Bolido Comidas preparadas","Bon app","Bottom-Dollar Markets",
        "B's Beverages","Cactus Comidas para llevar","Centro comercial Moctezuma","Chop-suey Chinese","Comercio Mineiro",
        "Consolidated Holdings","Drachenblut Delikatessen","Du monde entier","Eastern Connection","Ernst Handel",
        "Familia Arquibaldo","FISSA Fabrica Inter. Salchichas S.A.","Folies gourmandes","Folk och fa HB","Frankenversand",
        "France restauration","Franchi S.p.A.","Furia Bacalhau e Frutos do Mar","Galeria del gastronomo","Godos Cocina Tipica",
        "Gourmet Lanchonetes","Great Lakes Food Market","Hanari Carnes","GROSELLA-Restaurante","HILARION-Abastos"
    $actions = "Arrange a meeting with ","Demonstrate the product to ","Call ","Meet ","Discuss possibilities with ",
        "Sign contract with ", "Implement request from ", "Prepare materials for ", "Prepare documents for ", "Accord document with ",
        "Prepare advertisement for "
    return [System.String]$actions[$random.Next(0,12)] + $agents[$random.Next(0,35)]
}

Наконец, нужно определить функцию, которая генерит XML для массового добавления записей через ProcessBatchData:
function Generate50Tasks($listID)
{
  $method = "<Method ID=""{0}""><SetList>" + $listID + "</SetList>`n";
  $method += "<SetVar Name=""Cmd"">Save</SetVar>`n<SetVar Name=""ID"">New</SetVar>`n";
  $method += "<SetVar Name=""urn:schemas-microsoft-com:office:office#Title"">{1}</SetVar>`n"
  $method += "<SetVar Name=""urn:schemas-microsoft-com:office:office#StartDate"">{2}</SetVar>`n"
  $method += "<SetVar Name=""urn:schemas-microsoft-com:office:office#DueDate"">{3}</SetVar>`n"
  $method += "<SetVar Name=""urn:schemas-microsoft-com:office:office#Priority"">{4}</SetVar>`n"
  $method += "<SetVar Name=""urn:schemas-microsoft-com:office:office#Status"">{5}</SetVar>`n"
  $method += "<SetVar Name=""urn:schemas-microsoft-com:office:office#PercentComplete"">{6}</SetVar>`n"
  $method += "</Method>`n"
  $methods = ""
  for($i = 1;$i -le 50; $i++)
  {
    $title = RandomTitle
    $startDate = RandomDay
    $dueDate = RandomDay
    $priority = RandomPriority
    $status = RandomStatus
    $percentComplete = RandomProgress
    $methods = $methods + [System.String]::Format($method, $i, $title, $startDate.ToString("s"), $dueDate.ToString("s"), $priority, $status, $percentComplete.ToString().Replace(",","."))
  }
  return [System.String]::Format("<?xml version=""1.0"" encoding=""UTF-8""?><ows:Batch OnError=""Return"">{0}</ows:Batch>", $methods);
}

Генерация 50 записей обеспечивает относительную уникальность заголовков. Конечно, можно генерировать и по 150 записей, и нагенерить несколько тысяч задач, – но это требуется не так часто.

Давайте, наконец, сгенерируем записи:
$web = Get-SPWeb http://localhost
$list = $web.Lists["Tasks"]
$xml = Generate50Tasks $list.ID
$web.ProcessBatchData($xml)

Здесь исправьте хост/порт и заголовок списка на тот, который соответствует вашему порталу.

Также, вы можете скачать скрипт в виде файла. Если у вас русский портал, у меня есть и русская версия скрипта.

После генерации, получите примерно такую картинку:

image

Если использовать русский скрипт, картинка будет немного другой:

6 комментариев:

  1. Вот здесь выложил генерилку данных для SharePoint.
    http://spsdatagenerator.codeplex.com/

    ОтветитьУдалить
    Ответы
    1. Привет Александр, спасибо за ссылку!

      Подход мне нравится, с помещением ссылки в List Settings. Попробую использовать.

      Удалить
    2. Александр, ссылка на генерацию данных появляется только для настраиваемых списков. Если CustomAction деплоить на ContentType 0x, будет для всех списков ;)

      Удалить
    3. Спасибо за совет. Мне это известно. Просто пока геренация работает только для списков.
      Как будет время добавлю для библиотек. Да и вообще там ещё много чего можно сделать.
      В частности понадобилось самому такая функция - уже есть куча данных, и нужно random занести в определённые колонки.

      Удалить
  2. Ребят, а не поделитесь еще раз генерилкой данных? )

    ОтветитьУдалить
    Ответы
    1. Ой давно это было.
      Где-то у меня проект валяется, но его доделывать нужно.

      Удалить

Внимание! Реклама и прочий спам будут беспощадно удаляться.