Архивация списков #13

Merged
gorbenko.pavel merged 16 commits from archive into main 2026-08-19 09:08:37 +00:00
Showing only changes of commit 1dff7c7112 - Show all commits
@@ -123,12 +123,23 @@ public sealed class SharePointClient(
public async Task<IReadOnlyList<SharePointFieldSchema>> GetCustomFieldsAsync( public async Task<IReadOnlyList<SharePointFieldSchema>> GetCustomFieldsAsync(
string siteUrl, string listServerRelativeUrl, CancellationToken cancellationToken) string siteUrl, string listServerRelativeUrl, CancellationToken cancellationToken)
{ {
// FromBaseType отсеивает колонки базового типа (Title, Author, Created …) — // Ни FromBaseType, ни CanBeDeleted не годятся как признак «колонку явно
// они есть в любом новом списке. Hidden/ReadOnlyField — служебные, их создать // добавили в список»: у переиспользуемых стандартных site-колонок SharePoint
// всё равно нельзя. Фильтр в OData, а не в C#, чтобы не тащить лишнее по сети. // (например, «Department» — встроенная текстовая колонка из схемы v3,
// подключаемая через DelayActivateTemplateBinding) ОБА флага стоят как у
// настоящего системного поля, хотя колонка реально добавлена в список и в
// неё пишут данные. Из-за этого такие колонки тихо выпадали из копирования —
// без ошибки, просто без предупреждения.
//
// Поэтому здесь фильтруем только Hidden/ReadOnlyField (их создать всё равно
// нельзя), а отделять настоящие базовые поля (Title, ID, ContentType …) от
// явно добавленных — задача вызывающего кода: он сравнивает с полями
// ТОЛЬКО ЧТО СОЗДАННОГО пустого списка того же шаблона (см. CloneAsync,
// alreadyThere) — то, что есть на обоих, действительно базовое; то, что
// есть только на источнике, добавлено явно, независимо от флагов SharePoint.
var url = $"{siteUrl.TrimEnd('/')}/_api/web/getList('{Escape(listServerRelativeUrl)}')/fields" + var url = $"{siteUrl.TrimEnd('/')}/_api/web/getList('{Escape(listServerRelativeUrl)}')/fields" +
"?$select=InternalName,SchemaXml,FromBaseType,Hidden,ReadOnlyField" + "?$select=InternalName,SchemaXml,Hidden,ReadOnlyField" +
"&$filter=Hidden eq false and ReadOnlyField eq false and FromBaseType eq false"; "&$filter=Hidden eq false and ReadOnlyField eq false";
var json = await GetAsync(siteUrl, url, cancellationToken); var json = await GetAsync(siteUrl, url, cancellationToken);
var rows = json.TryGetProperty("value", out var value) && value.ValueKind == JsonValueKind.Array var rows = json.TryGetProperty("value", out var value) && value.ValueKind == JsonValueKind.Array