Какой самый простой способ найти для группы пользователей все членство в группе?

У меня есть одна группа домино (только список управления доступом), назовем их Main_Group. В эту группу входят все сотрудники, о которых я хочу знать, членами каких других домино-групп они являются.

Участники Main_Group:

- John Smith/ORGANIZATION
- Peter Smith/ORGANIZATION
- Jeff Smith/ORGANIZATION

Конечно, этот список намного длиннее, чем эти 3 записи.

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

UserName;DominoGroups
John Smith;Domino_Group1,Domino_Group2,Domino_Group3
Peter Smith;Domino_Group2
Jeff Smith;Domino_Group1,Domino_Group3

Как лучше всего получить эту информацию? Lotus Script, любой вид с формулой? Или уже есть база данных заметок, делающая это?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
281
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это не просто. Человек может находиться в группе через один или несколько уровней косвенности. То есть, человек находится в группе А, и группа А находится в группе Б, и группа Б находится в группе С, и группа С находится в группе D, и, кстати, группа Е, группа F и группа G... Вам придется написать код для рекурсивного обхода групп, обнаружения циклы и составить окончательный список членства в группах. Насколько я знаю, для этого никогда не было открыто API.

См. ниже рекурсивный код, обнаруживающий циклы :-)

Adam 20.03.2023 12:54

Нет простого способа получить желаемое. Вы можете создать представление в адресной книге, использовать представление «Группа» в качестве шаблона и добавить один категоризированный столбец для элемента «Участники». К сожалению, как писал Ричард, вы не получите такого членства во вложенных группах.

Вам нужно будет:

  • Циклический просмотр всех документов группы
  • рекурсивно получить всех членов для каждой группы
  • всякий раз, когда ваш пользователь входит в состав участников, добавьте имя группы в список/массив...
  • экспортировать результат

НО: Если вам просто нужно узнать/увидеть, в каких группах состоит конкретный пользователь, то используйте Domino Administrator Client. Откройте представление «Группы», затем панель «Группы» и выберите «Управление группами». Затем выберите пользователя на самой левой панели и нажмите «Иерархия участников» справа, после чего вы увидите группы, членом которых является этот пользователь, даже вложенные. К сожалению, вы не можете экспортировать эту информацию.

См. ниже рекурсивное решение, которое обнаруживает группы в группах :-)

Adam 20.03.2023 12:56
Ответ принят как подходящий

Этот код создает список динамических массивов, которые действуют как пары ключ/значение (где каждое значение является массивом). Он построен из Group вида в names.nsf. Вместо того, чтобы брать имя каждой группы и загружать членов, он строит его наоборот, поэтому для каждого члена он имеет массив групп. Группы могут быть в других группах, поэтому он рекурсивно проходит через каждую группу. Чтобы предотвратить зацикливание (например, когда группа A находится в группе B и наоборот), он использует массив visited, который завершает эту часть поиска, если группа уже была посещена. Посещенный массив заканчивается после завершения рекурсии списком групп, в которых находится пользователь.

Построение списка ключей/значений на начальном этапе будет быстрее, чем многократный полнотекстовый поиск, особенно если вместо поиска одного имени вы зацикливаете все имена пользователей в named.nsf, поскольку после создания списка ключей/значений нет необходимости запросите базу данных еще раз. Я не создавал цикл для каждого пользователя, но его можно легко добавить в функцию getGroupsForUser.

Код ниже getGroupsForUser функция. Возвращает отформатированную строку каждой группы, в которой находится пользователь. Первым элементом является имя пользователя.

Function getGroupsForUser(userName As String) As String
    If userName = "" Then Exit function
    
    Dim ns As New NotesSession, namesDatabase As NotesDatabase
    Dim visited As Variant, groupKeyValueStore List As Variant
    Dim returnString As String, separator As String, i As Integer
    
    Set namesDatabase = ns.getDatabase(ns.Currentdatabase.Server, "names.nsf", False)
    visited = Null
    
    Call getGroupKeyValues(groupKeyValueStore, namesDatabase)
    Call searchGroupsRecursive(userName, visited, groupKeyValueStore)

    i=0
    returnString = ""
    ForAll item In visited
        If i=0 Then separator = ""
        If i=1 Then separator = ";"
        If i>1 Then separator = "," 
        returnString = returnString + separator + item
        i = i + 1
    End forall

    getGroupsForUser = returnString
End Function

getGroupKeyValues перебирает представление «Группы» в named.nsf и создает список «ключ/значение».

Public Function getGroupKeyValues(groupKeyValueStore List As Variant , namesDatabase As NotesDatabase)
    Dim groupView As NotesView, doc As NotesDocument, members As Variant, groupName As String
    Dim separator As String, values As Variant, i As Integer, tempString(0) As String
    
    Set groupView = namesDatabase.getView("Groups")
    Set doc=groupView.Getfirstdocument()
    
    Do Until doc Is Nothing
        groupName = doc.ListName(0)
        members = doc.getItemValue("Members")
        ForAll member In members
            If IsElement(groupKeyValueStore(member)) Then
                If IsNull(ArrayGetIndex(groupKeyValueStore(member), groupName)) Then
                    values = groupKeyValueStore(member)
                    i = ubound(values) + 1
                    ReDim Preserve values(i)
                    values(i) = groupName
                    groupKeyValueStore(member) = values
                End If
            Else
                tempString(0) = groupName
                groupKeyValueStore(member) = tempString
            End If
        End ForAll
        Set doc=groupView.getNextDocument(doc)
    Loop
End Function

searchGroupsRecursive рекурсивно ищет каждую группу, гарантируя, что ни одна группа не будет посещена дважды.

Public Function searchGroupsRecursive(userName As String, visited As Variant, groupKeyValueStore List As Variant) As Variant
    Dim length As Integer, userNotesName As NotesName, fullUserName As String
    Dim tempArray(0) As String
    
    Set userNotesName = New NotesName(userName)
    fullUserName = userNotesName.Canonical
    
    If IsNull(visited) Then
        tempArray(0) = userName
        visited = tempArray
    Else
        length = UBound(visited)
        ReDim Preserve visited(length + 1)
        visited(length + 1) = userName  
    End If
    
    If Not isElement(groupKeyValueStore(fullUserName)) Then Exit function

    ForAll item In groupKeyValueStore(fullUserName)
        Call searchGroupsRecursive(CStr(item), visited, groupKeyValueStore)
    End ForAll
End Function

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