Вхождение юзера в группу

Тема в разделе "Lotus - Программирование", создана пользователем NetWood, 16 июл 2010.

  1. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    Вот так проверяю:
    Код (Text):
        ismemb = False
    Forall dr In vDoc.AuthorizedReaders 'получить из дока допустимые группы
    Set docUserGroup = viewreg.GetDocumentByKey(dr,True) ' найти группу с юзерами
    If Not (docUserGroup Is Nothing) Then
    Forall memb In docUserGroup.Members ' в этой группе ищем юзера
    If user = memb Then
    ismemb = True
    Else                                           
    ''ismemb = False
    End If
    End Forall
    End If
    End Forall
    Результатом должен стать флажок ismemb. Я его далее использую.
    Полагаю, что вышеописанный код далеко не оптимален. Пока в группе юзеров не много - работает быстро.

    Может есть более красивое решение узнать входит юзер в группу или нет?
    или перефразирую
    Быстро узнать имеет юзер доступ к доку или нет? (это задается в vDoc.AuthorizedReaders группой)
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    по приведенному коду. Поле - массив, т.е. проверять arraygetindex(docUserGroup.Members, memb) не лучше?
    или еще может подойдет Exit Forall
    If user = memb Then
    ismemb = True
    Exit Forall
    вроде еще что-то на формулах было, я сейчас не вспомню... хотя - может, только для текущего юзера, тогда это может не подойти.
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Код (LotusScript):
    Function HasDocAccess(doc as NotesDocument, AccessItemName as String) As Boolean
    'doc - документ, AccessItemName - имя поля с именами пользователей, групп, ролей, которым разрешён доступ к документу
    Dim v as Variant
    v = Evaluate(AccessItemName + { *= @UserNamesList}, doc)
    HasDocAccess = v(0)
    End Function
    P.S. Только для текущего пользователя. И почему у функций @UserNamesList, @UserRoles нет аргумента UserName?...
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    NetWood
    Код (LotusScript):
    Forall memb In docUserGroup.Members ' в этой группе ищем юзера
    If user = memb Then
    ismemb = True
    Else                                           
    ''ismemb = False
    End If
    End Forall
    ужасно!

    Код (LotusScript):
    if instr(implode(docUserGroup.Members), user)>0 then ismemb = True
    для большей уверенности луче всё еще снабдить lcase чтобы точно сошлось и косые поотсекать

    ну а если совсем поправильному то лучше свою процедуру написать но никак не циклами это дело гонять
     
  5. Darker

    Darker Гость

    ismemb=instr(implode(docUserGroup.Members), user)>0
    еще короче))
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Ужасно! ))))) Да еще и после такого поста это писать!
    Немного допишу:
    Код (LotusScript):
    If Not(IsNull(ArrayGetIndex(docUserGroup.Members, user, 5))) Then
    ismemb = True
    End If
    Либо так:
    Код (LotusScript):
    ismemb = Not(IsNull(ArrayGetIndex(docUserGroup.Members, user, 5)))

    Добавлено:
    Чего же? Поиск в массиве классически решается циклом.
     
  7. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    прав. я с параметром накосячила... поздно было, тупила) но идея-то правильная.
    Еще была собака для раскрытия групп @ExpandNameList, но она странноватая и недокументированная и для этой задачи лишняя...
     
  8. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    >> if instr(implode(docUserGroup.Members), user)>0 then ismemb = True
    А вы уверены, что это будет работать быстрее, чем цикл с точным сравнением?

    По сабжу: точно знаю, что есть Notes С API-шная функция, которая сообщает имеет ли право человек редактировать документ. Поищу на досуге.
     
  9. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    для текущего, кстати, есть и скриптовый notesSession.UserGroupNameList, т.е. можно не делать эвалюэйтов
    не внимательно глянула, не совсем то.
     
  10. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Я уж возрадовался, думал то, что мне надо!
    Неа.
    Этот UserGroupNameList возвращает какую-то порнографию: array of notesname/
    Причём про группы там ничего нету.
     
  11. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    точно, она имена со * возвращает
    извините.
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    )))))))
    Вообще, замечательная функция ))) айбиэм радует )))

    <!--QuoteBegin-хЭлп+-->
    <span class="vbquote">(хЭлп)</span><!--QuoteEBegin-->notesSession.UserGroupNameList
    Read-only. The groups to which the current user belongs.

    Data type
    Array of NotesName objects

    Syntax
    To get: notesNameArray = notesSession.UserGroupNameList

    Usage
    The "groups" include the hierarchical parents of the user ID. For Mary Smith/Department One/Acme, for example, the groups include */Department One/Acme and */Acme.
    The groups include those to which the user belongs in the Domino Directory or Personal Address Book where the program is running.[/quote]

    Господа, я полагаю в ваших организациях используется сложная иерархическая структура нотес-имен? ;)
    А в группы вы входите? ;)

    Вот для меня она возвращает такие имена: */Организация/UA; */UA; Developers
    Хотя инетереснее то, что я вхожу не только в эту группу )))
     
  13. Klido

    Klido Гость

  14. RAJ

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
  15. amigolinx

    amigolinx Гость

    в свое время юзал где-то спертую формульную конструкцию:
    Код (LotusScript):
    SelectedPerson:=@PickList([NAME]:[SINGLE]);
    @If(
    SelectedPerson != "";
    @Do(
    ServerName := "server/merver";
    UserName1 := @Name([Canonicalize];SelectedPerson);
    val := @DbLookup( "" : "NoCache"; ServerName : "names.nsf"; "($ServerAccess)"; UserName1;2);
    @If(
    @IsError(val);
    "";
    @Sort(@Explode(val;";"))
    )
    );
    ""
    );
    @Prompt([OkCancelList]; ""; ""; ""; val)
     
  16. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Хорошая, только отдает только прямые группы, т.е. где пользователь явно указан.
    Поэтому, для полного списка, надо разворачивать группы ручками.
    Либо смотреть апишки, если такие есть.
     
  17. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Народ, не трахайте мозг себе левыми решениями. Тоже используем этот класс (NotesGroupManager) уже года 2 и все довольны. Посмотрите его
     
  18. Klido

    Klido Гость

    ну как бы это IBM-решение обсуждаемой темы :) Старенькое, но хватает на все....
     
  19. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Камрады, выложите пожалуйста этот класс "NotesGroupManager"
    Песочницу уже оказывается закопали, а на опеннтф не нашёл.
    Заранее преблагодарен.
     
  20. NetWood

    NetWood Lotus team
    Lotus team

    Регистрация:
    17 апр 2008
    Сообщения:
    308
    Симпатии:
    0
    Действительно: The Lotus Sandbox was closed to all new submissions in 2007. Downloads of previous submissions were still available as an archived resource following that closure, but effective September 2010, downloads from the Lotus Sandbox are no longer available.

    Чем она им помешала? закапывают лотус собственными руками :( - яркий пример победы маркетинга над здравым смыслом.

    ------------
    upd: 2012-10-19
    This is the code sample for the article, "Working with groups in LotusScript."
    1. Ссылка на саму базу с классом на бережно сохраненном Сандбоксе.
    http://www.bananahome.com/ldd/sandbox.nsf/...46?OpenDocument

    2. Вот базулина с этим классом. Резервная ссылка http://sysadmins.ru/files/group_demo_732.zip
    Ну мало тут 1 метра для загрузки. Не загрузить :(
    ----------

    Class NotesGroupManager
    Properties
    Methods
    New
    LoadPublicAddressBooks
    LoadPrivateAddressBooks
    LoadAddressBook
    GetGroup
    CreateGroup
    RenameGroup
    AddToGroup
    RemoveFromGroup
    SortGroup
    SortAll
    SaveAll
    LoadAllGroups
    LoadGroup
    FTSearch
    RemoveGroup
    Uncache
    ClearCache
    Class NotesGroup
    Properties
    Methods
    setModified
    Consolidate
    Save
    AddMembers
    RemoveMembers
    SortMembers
    Remove
     
Загрузка...

Поделиться этой страницей