Вопрос

Все -

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

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

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

Спасибо!

Это было полезно?

Решение

Создайте библиотеку документов для хранения резюме.Затем предоставьте отделу кадров (группе пользователей SharePoint) разрешения "читать / записывать все" для библиотеки, предоставьте всем остальным права "читать / записывать свои собственные".Создайте тип контента под названием "Резюме" на основе готового типа контента документа.Затем добавьте поле, содержащее сотрудника (поле SPUser), которого касается резюме, к типу контента (и любые другие обязательные поля, т.е.имя, адрес и т.д.).Попросите отдел кадров правильно заполнить это при создании списка (сделайте поля обязательными).

Затем напишите 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();

Другие советы

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

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

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

С помощью пользовательского экрана загрузки вы могли бы изменить контекст текущего пользователя перед выполнением загрузки.Для этого требуется выполнить поиск пользовательского токена, используя что-то вроде следующего (это фрагменты рабочего кода с удаленной обработкой ошибок и другими материалами).Обратите внимание, что 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;
}

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

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top