Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/15
This commit was merged in pull request #15.
This commit is contained in:
@@ -4,11 +4,14 @@
|
||||
по манифестам provisioning.json (единый источник правды по колонкам).
|
||||
|
||||
.DESCRIPTION
|
||||
Обходит ВСЕ манифесты forms/**/provisioning.json (в т.ч. подпапки approval/) и для
|
||||
каждого:
|
||||
1) создаёт список (если его ещё нет);
|
||||
2) при необходимости переименовывает колонку Title;
|
||||
3) обеспечивает колонки.
|
||||
Обходит ВСЕ манифесты forms/**/provisioning.json (в т.ч. подпапки approval/)
|
||||
ДВУМЯ проходами:
|
||||
1) создаёт ВСЕ списки (которых ещё нет);
|
||||
2) по каждому манифесту: при необходимости переименовывает колонку Title и
|
||||
обеспечивает колонки.
|
||||
Проходы разделены из-за Lookup'ов между формами: список-источник должен
|
||||
существовать раньше колонки, а при перекрёстных ссылках (две формы ссылаются
|
||||
друг на друга) одним проходом это недостижимо ни при каком порядке обхода.
|
||||
|
||||
Имена списков НУМЕРОВАННЫЕ: «<Форма> <N> — данные» / «<Форма> <N> — согласование».
|
||||
Номер собирает сам скрипт из имени в манифесте (см. Get-NumberedListTitle) — в
|
||||
@@ -170,6 +173,7 @@ function Ensure-SiteColumn {
|
||||
}
|
||||
'Choice' { Add-PnPField -InternalName $Col.internalName -DisplayName $Col.title -Type Choice -Choices $Col.choices -Group $g | Out-Null }
|
||||
'Number' { Add-PnPField -InternalName $Col.internalName -DisplayName $Col.title -Type Number -Group $g | Out-Null }
|
||||
'Url' { Add-PnPField -InternalName $Col.internalName -DisplayName $Col.title -Type URL -Group $g | Out-Null }
|
||||
default { throw "Неизвестный тип столбца сайта '$($Col.type)'" }
|
||||
}
|
||||
Write-Host " [+эталон] $($Col.internalName) — «$($Col.title)» [$($Col.type)]" -ForegroundColor Green
|
||||
@@ -214,6 +218,7 @@ function Add-ListColumn {
|
||||
}
|
||||
}
|
||||
'Choice' { Add-PnPField -List $List -InternalName $Col.internalName -DisplayName $Col.title -Type Choice -Choices $Col.choices -AddToDefaultView | Out-Null }
|
||||
'Url' { Add-PnPField -List $List -InternalName $Col.internalName -DisplayName $Col.title -Type URL -AddToDefaultView | Out-Null }
|
||||
'Number' {
|
||||
if ($null -ne $Col.decimals) {
|
||||
$xml = "<Field Type='Number' DisplayName='$(ConvertTo-XmlSafe $Col.title)' Name='$($Col.internalName)' Decimals='$($Col.decimals)' />"
|
||||
@@ -325,21 +330,35 @@ if ($ListNumber -eq 1 -and -not $SkipRename) {
|
||||
}
|
||||
}
|
||||
|
||||
# Проход 1: САМИ СПИСКИ — все до единого, ДО колонок.
|
||||
#
|
||||
# Раньше список и его колонки создавались одним проходом по манифесту, и Lookup на
|
||||
# список ДРУГОЙ формы (WorkplaceSetup.SourceHire → «Прием на работу … — данные»)
|
||||
# резолвился только если та форма попадалась в обходе раньше — то есть держался на
|
||||
# алфавитном везении, а для взаимных ссылок был бы невозможен в принципе. Поэтому
|
||||
# сначала все списки, потом все колонки: к моменту разрешения любого Lookup'а
|
||||
# список-источник уже существует.
|
||||
Write-Host "`n=== Списки ===" -ForegroundColor Cyan
|
||||
foreach ($manifest in $manifests) {
|
||||
$def = Get-Content -Path $manifest.FullName -Raw -Encoding UTF8 | ConvertFrom-Json
|
||||
$listTitle = Get-NumberedListTitle -Title $def.dataListTitle -Number $ListNumber
|
||||
|
||||
if (-not (Get-PnPList -Identity $listTitle -ErrorAction SilentlyContinue)) {
|
||||
New-PnPList -Title $listTitle -Template GenericList -EnableVersioning | Out-Null
|
||||
Write-Host " [+] создан список «$listTitle»" -ForegroundColor Green
|
||||
}
|
||||
else {
|
||||
Write-Host " [=] список уже существует: «$listTitle»" -ForegroundColor DarkGray
|
||||
}
|
||||
}
|
||||
|
||||
# Проход 2: колонки (и переименование Title) — по одному манифесту за раз.
|
||||
foreach ($manifest in $manifests) {
|
||||
$def = Get-Content -Path $manifest.FullName -Raw -Encoding UTF8 | ConvertFrom-Json
|
||||
$listTitle = Get-NumberedListTitle -Title $def.dataListTitle -Number $ListNumber
|
||||
Write-Host "`n=== Форма: $($manifest.Directory.Name) → список «$listTitle» ===" -ForegroundColor Cyan
|
||||
|
||||
# 1) Список (идемпотентно)
|
||||
if (-not (Get-PnPList -Identity $listTitle -ErrorAction SilentlyContinue)) {
|
||||
New-PnPList -Title $listTitle -Template GenericList -EnableVersioning | Out-Null
|
||||
Write-Host " [+] создан список" -ForegroundColor Green
|
||||
}
|
||||
else {
|
||||
Write-Host " [=] список уже существует" -ForegroundColor DarkGray
|
||||
}
|
||||
|
||||
# 2) Переименование Title (если задано)
|
||||
# 1) Переименование Title (если задано)
|
||||
if ($def.titleColumnName) {
|
||||
try {
|
||||
Set-PnPField -List $listTitle -Identity 'Title' -Values @{ Title = $def.titleColumnName } | Out-Null
|
||||
@@ -350,7 +369,7 @@ foreach ($manifest in $manifests) {
|
||||
}
|
||||
}
|
||||
|
||||
# 3) Колонки (идемпотентно): не-Lookup — через эталоны (столбцы сайта), Lookup — на список.
|
||||
# 2) Колонки (идемпотентно): не-Lookup — через эталоны (столбцы сайта), Lookup — на список.
|
||||
foreach ($col in $def.columns) {
|
||||
Add-ColumnToList -List $listTitle -Col $col
|
||||
}
|
||||
|
||||
@@ -25,12 +25,15 @@
|
||||
| `DateTime` | дата/время | — |
|
||||
| `Boolean` | да/нет | — |
|
||||
| `User` | пользователь | — |
|
||||
| `Url` | гиперссылка (адрес + подпись) | — |
|
||||
| `Lookup` | подстановка | `lookupList` (заголовок источника), `lookupShowField` (по умолч. `Title`) |
|
||||
|
||||
Плюс на уровне формы: `titleColumnName` — переименовать стандартную колонку `Title`.
|
||||
|
||||
> **Порядок для Lookup:** список-источник должен существовать раньше, чем колонка,
|
||||
> которая на него ссылается. Если источник в другой форме — сначала прогоните её манифест.
|
||||
> которая на него ссылается — но следить за этим руками не нужно: скрипт сначала
|
||||
> создаёт ВСЕ списки, и только потом колонки, поэтому порядок обхода манифестов
|
||||
> не важен (и взаимные ссылки тоже разрешимы).
|
||||
|
||||
## Разовая подготовка
|
||||
|
||||
|
||||
Reference in New Issue
Block a user