SharePoint / WSS: изменить поле «созданный»? - PullRequest
2 голосов
/ 18 июня 2009

Все -

Я использую WSS 3.0. В настоящее время HR будет загружать внутреннее резюме сотрудника в библиотеку документов на нашем сайте, но по соображениям конфиденциальности мы должны затем ограничить доступ к этой библиотеке документов, что вынуждает пользователей проходить через HR каждый раз, когда они хотят обновить свое резюме.

Моя мысль состоит в том, чтобы создать список с включенными вложениями, который позволит пользователям только просматривать / редактировать свои собственные элементы, а затем давать разрешение HR для управления всеми записями. Это работает за исключением того, что HR должен будет создать начальный элемент списка и прикрепить резюме, что означает, что элемент списка будет «создан {hr}» и не будет видимым / редактируемым конечным пользователем, чье резюме прилагается.

Есть ли какие-либо идеи о том, как я могу разрешить HR изменять поле «создано» при загрузке, чтобы конечные пользователи увидели и могли редактировать свое резюме, или по-другому?

Спасибо!

Ответы [ 5 ]

7 голосов
/ 27 июня 2009

Создать библиотеку документов для хранения резюме. Затем дайте отделу кадров (группа пользователей SharePoint) полномочия «читать / писать все» для библиотеки, а всем остальным - «читать / писать свои собственные» права. Создайте тип контента под названием «Возобновить» на основе «вне» поле Тип содержимого документа. Затем добавьте поле, содержащее сотрудника (поле SPUser), к которому относится резюме, относящееся к типу содержимого (и любые другие необходимые поля, например, имя, адрес и т. д.). HR должен правильно заполнить это при создании элемента списка (заполните обязательные поля).

Затем напишите itemeventreceiver, связанный с типом контента, который вы только что создали, и переопределите событие ItemUpdated.

Код будет выглядеть примерно так:

public override void ItemUpdated(SPItemEventProperties properties)
{
  SPSecurity.RunWithElevatedPrivileges(delegate
  {
    using (SPWeb web = properties.OpenWeb())
    {
       web.AllowUnsafeUpdates = true; 
       var item = web.Lists[properties.ListId].GetItemById(properties.ListItemId);
       if (item != null)
       {
         if (item.Fields.ContainsField("Employee"))
         {
           item["Author"] = item["Employee"]; 
           // Author is the internal name of the Created by field, 
           // always use Internal Names!
           DisableEventFiring();
           item.SystemUpdate();
           EnableEventFiring();
         }
       }
     }
   });
}

вы можете привязать ItemEventReceiver с помощью FeatureReceiver к типу контента следующим образом:

SPContentType docCt = web.ContentTypes[new SPContentTypeId("CONTENTYPE ID GOES HERE")];
docCt.EventReceivers.Add(SPEventReceiverType.ItemUpdated, "ASSEMBLYNAME, Version=1.0.0.0, Culture=neutral, PublicKeyToken=TOKEN", "FULLY QUALIFIED CLASSNAME");
docCt.Update();
3 голосов
/ 18 июня 2009

Почему бы просто не использовать библиотеку документов для резюме? (вместо списка с вложениями.) Вы можете предоставить HR полное чтение / запись для всех документов в пределах, и владелец резюме будет иметь полномочия вносить вклад только в свое собственное резюме.

2 голосов
/ 22 февраля 2012

Я нашел способ изменить поле «Создано» с помощью SharePoint Designer для создания рабочего процесса.

  1. Создайте в своем списке фиктивное поле с легко определяемым именем, например, XYZZY. Сделайте это поле "человеком или группой".
  2. В SharePoint Designer создайте рабочий процесс для своего списка. Разрешить ручной запуск и запуск автоматически при создании нового элемента.
  3. Действия -> Установить поле в текущем элементе -> Установить XYZZY на поле в вашем списке, содержащее учетную запись пользователя, которую вы хотите добавить в Создано.
  4. Нажмите Готово
  5. Теперь откройте ваш рабочий файл .xoml с помощью Блокнота. Заменить "XYZZY" на "Автор". Сохраните файл .xoml.
  6. Открыть рабочий процесс в Designer. Нажмите «Готово», чтобы выполнить повторную обработку с новым кодом.
  7. Удалить пустое поле из списка.
  8. Запустите рабочий процесс для каждого существующего элемента в вашем списке. Новые предметы будут автоматически исправляться.
0 голосов
/ 18 июня 2009

У меня была похожая ситуация (миграция в sharepoint), когда мне пришлось добавить файл с правами администратора в библиотеку документов, а затем «изменить» пользователей. Я сделал это так, может помочь вам несколько:

using (var root = site.RootWeb)
 {
   var users = root.SiteUsers;
   var user = users["domain\username"];
   file.Item[SPBuiltInFieldId.Created_x0020_By] = user.ID;
   file.Item[SPBuiltInFieldId.Modified_x0020_By] = user.ID;
   file.Item.UpdateOverwriteVersion();
0 голосов
/ 18 июня 2009

С помощью пользовательского экрана загрузки вы можете изменить контекст текущего пользователя перед загрузкой. Это требует поиска пользовательского токена, используя что-то вроде следующего (это фрагменты рабочего кода с обработкой ошибок и прочим удаленным материалом). Обратите внимание, что EnsureUser потребует, чтобы текущий пользователь был в основном администратором / владельцем.

using (SPSite site = GetImpersonatedSite(runAsUser))
{
    using (SPWeb web = site.OpenWeb())
    {
        // Do stuff here
    }
}

private SPSite GetImpersonatedSite(string username)
{
    user = SPContext.Current.Web.EnsureUser(username);
    SPSite site = new SPSite(SPContext.Current.Web.Url, user.UserToken);
    return site;
}
...