Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/15
Провижининг списков SharePoint
Автоматическое создание списков данных для форм портала заявок из манифестов
provisioning.json (по одному на форму, лежат в папке каждой формы).
Списки согласования пока не создаются — только данные.
Как это работает
- Каждая форма описывает свои колонки в
src/webparts/requestPortal/forms/<Форма>/provisioning.json. - Скрипт
Provision-Lists.ps1читает все такие манифесты и идемпотентно создаёт списки и колонки: перед созданием колонки проверяется, что её ещё нет; повторный запуск ничего не ломает и не дублирует.
Добавить колонку/форму = отредактировать/добавить provisioning.json и перезапустить скрипт.
Поддерживаемые типы колонок (type в манифесте)
| type | Что это | Доп. поля |
|---|---|---|
Text |
однострочный текст | — |
Note |
многострочный текст | — |
Number |
число | decimals (знаков после запятой) |
Choice |
выбор из вариантов | choices (массив) |
DateTime |
дата/время | — |
Boolean |
да/нет | — |
User |
пользователь | — |
Url |
гиперссылка (адрес + подпись) | — |
Lookup |
подстановка | lookupList (заголовок источника), lookupShowField (по умолч. Title) |
Плюс на уровне формы: titleColumnName — переименовать стандартную колонку Title.
Порядок для Lookup: список-источник должен существовать раньше, чем колонка, которая на него ссылается — но следить за этим руками не нужно: скрипт сначала создаёт ВСЕ списки, и только потом колонки, поэтому порядок обхода манифестов не важен (и взаимные ссылки тоже разрешимы).
Разовая подготовка
- Установить модуль PnP PowerShell (нужен PowerShell 7+):
Install-Module PnP.PowerShell -Scope CurrentUser - Зарегистрировать приложение с правом
Sites.Selectedи сертификатом в хранилище:Запомнить Client Id из вывода.Register-PnPEntraIDApp -ApplicationName "PnP-Provisioning-Scoped" -Tenant "<тенант>.onmicrosoft.com" -SharePointApplicationPermissions "Sites.Selected" -Store CurrentUser - Администратор один раз:
- одобряет запрос на согласие приложения (Admin consent),
- выдаёт приложению доступ только к нужному сайту:
Grant-PnPAzureADAppSitePermission -AppId "<client-id>" -DisplayName "PnP-Provisioning-Scoped" -Permissions FullControl -Site "https://<тенант>.sharepoint.com/sites/<сайт>"
Запуск
Узнать отпечаток сертификата (Thumbprint):
Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*PnP-Provisioning-Scoped*" } | Select-Object Subject, Thumbprint
Запустить провижининг (вход по сертификату, без пароля в коде):
cd provisioning
./Provision-Lists.ps1 `
-SiteUrl "https://<тенант>.sharepoint.com/sites/<сайт>" `
-ClientId "<client-id>" `
-Tenant "<тенант>.onmicrosoft.com" `
-Thumbprint "<отпечаток>"
Лог: [+] — создано, [=] — уже существовало, [~] — переименовано, [!] — предупреждение.
Важно про имена колонок
В манифесте у колонки два имени:
internalName— латиницей, без пробелов, ≤32 символов (техническое имя в SharePoint);title— отображаемое, любое (рус., с пробелами).
Так мы избегаем проблемы, когда SharePoint кодирует пробелы в _x0020_ и обращения к
полю ломаются. Не создавайте колонки с русским internalName.
Проверка на тесте
Сначала прогоните на тестовом сайте, убедитесь, что списки и колонки создались правильно, и только потом — на боевом.