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

NetWood

Lotus team
17.04.2008
372
19
#1
Вот так проверяю:
Код:
	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 группой)
 

hosm

* so what *
18.05.2009
2 442
6
#2
по приведенному коду. Поле - массив, т.е. проверять arraygetindex(docUserGroup.Members, memb) не лучше?
или еще может подойдет Exit Forall
If user = memb Then
ismemb = True
Exit Forall
Может есть более красивое решение узнать входит юзер в группу или нет?
вроде еще что-то на формулах было, я сейчас не вспомню... хотя - может, только для текущего юзера, тогда это может не подойти.
 

nvyush

Lotus team
22.04.2009
2 317
0
#3
Код:
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?...
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#4
NetWood
Код:
Forall memb In docUserGroup.Members ' в этой группе ищем юзера
If user = memb Then
ismemb = True
Else											
''ismemb = False
End If
End Forall
ужасно!

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

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

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#6
ужасно!

Код:
if instr(implode(docUserGroup.Members), user)>0 then ismemb = True
Ужасно! ))))) Да еще и после такого поста это писать!
Поле - массив, т.е. проверять arraygetindex(docUserGroup.Members, memb) не лучше?
Немного допишу:
Код:
If Not(IsNull(ArrayGetIndex(docUserGroup.Members, user, 5))) Then
ismemb = True
End If
Либо так:
Код:
ismemb = Not(IsNull(ArrayGetIndex(docUserGroup.Members, user, 5)))

Добавлено:
ну а если совсем поправильному то лучше свою процедуру написать но никак не циклами это дело гонять
Чего же? Поиск в массиве классически решается циклом.
 

hosm

* so what *
18.05.2009
2 442
6
#7
прав. я с параметром накосячила... поздно было, тупила) но идея-то правильная.
Еще была собака для раскрытия групп @ExpandNameList, но она странноватая и недокументированная и для этой задачи лишняя...
 

divankin

Senjor developer
13.08.2009
182
0
#8
>> if instr(implode(docUserGroup.Members), user)>0 then ismemb = True
А вы уверены, что это будет работать быстрее, чем цикл с точным сравнением?

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

hosm

* so what *
18.05.2009
2 442
6
#9
для текущего, кстати, есть и скриптовый notesSession.UserGroupNameList, т.е. можно не делать эвалюэйтов
не внимательно глянула, не совсем то.
 

Omh

Lotus team
04.07.2007
2 210
1
#10
для текущего, кстати, есть и скриптовый notesSession.UserGroupNameList, т.е. можно не делать эвалюэйтов
Я уж возрадовался, думал то, что мне надо!
Неа.
Этот UserGroupNameList возвращает какую-то порнографию: array of notesname/
Причём про группы там ничего нету.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#12
Этот UserGroupNameList возвращает какую-то порнографию...
Причём про группы там ничего нету.
)))))))
Вообще, замечательная функция ))) айбиэм радует )))

<!--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
Хотя инетереснее то, что я вхожу не только в эту группу )))
 
A

amigolinx

#15
вроде еще что-то на формулах было
в свое время юзал где-то спертую формульную конструкцию:
Код:
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)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#16
в свое время юзал где-то спертую формульную конструкцию
Хорошая, только отдает только прямые группы, т.е. где пользователь явно указан.
Поэтому, для полного списка, надо разворачивать группы ручками.
Либо смотреть апишки, если такие есть.
 

Omh

Lotus team
04.07.2007
2 210
1
#19
Камрады, выложите пожалуйста этот класс "NotesGroupManager"
Песочницу уже оказывается закопали, а на опеннтф не нашёл.
Заранее преблагодарен.
 

NetWood

Lotus team
17.04.2008
372
19
#20
Действительно: 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