ОБСУЖДЕНИЕ

свойства базы

7 ответов 5,2 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Пожалуйста помогите написать код на LotusScript для запрета удаления документа (или нескольких документов сразу) по кнопке Del пользователями, у которых нет прав администратора, а также запрет для таких пользователей переход в режим редактирования по двойному клику.
 
Для защиты от удаления используйте Database Script, событие Querydocumentdelete.
Для защиты от открытия в режиме редактирования используйте события Querymodechange и Queryopen формы. Queryopen для не нового документа для защиты от открытия из вида сразу на редактирование по Ctrl+E.
Вот похожий пример из Help про Querymodechange.

Код:
'This script checks whether the user is switching from Read mode to Edit mode. 
'If so, and if the Status field reads "Closed," the script displays a message and prevents the user
'from switching to Edit mode.

Sub Querymodechange(Source As Notesuidocument, _
Continue As Variant)
If Not ( source.EditMode ) Then
currentStatus = source.FieldGetText( "Status" )
If ( currentStatus = "Closed" ) Then
Messagebox _
( "Document available for browsing only." )
continue = False
End If
End If
End Sub

пользователями, у которых нет прав администратора
если речь о специальной роли, то в условии можно использовать Evaluate({@UserRoles})
если же речь об уровне доступа, то можно использовать свойство CurrentAccessLevel класса NotesDatebase
вот аналогичный пример

Код:
If (db.CurrentAccessLevel<5) Then
Messagebox "Для работы с настройками базы Вам необходимы права доступа не ниже Дизайнера.", 48, "Информация"
Exit Sub
End If
 
А обязательно код? ACL - это единственное правильное решение, все скриптовые методы обходятся (если уметь).
Запретить уделение всем кроме админа. Если же необходимо, что бы пользователи при каких-то условиях могли удалять док-ты, то реализуйте не удаление, а выставление некоего флага (в какое-либо поле пишите что-либо и по этому полю\значению определяйте в логике программы что док-т удален), а реальное удаление пусть производит некий агент по расписанию (ночью) и при этом лучше что бы это было Soft удаление (мягкое удаление), настойте базу на SoftDeletion сделайте вид для удаленных и если что там сможете найти дак-т, или же другой способ - перенос док-та в другую базу где так же по прошествии некоего времени удалять.
Для упращения администрирования прав смотрите так же в сторону ролей и груп.

Что бы пользователи не могли править док-ты используйте права доступа к базе (ACL) Автор и в документах прописывайте поля с типом Author...
Если необходимо ТОЛЬКО двойной клик обрезать, а по кнопке переводить в режим правки - то тут "в лоб" не получится, leiba уже описал основные принципы по блокированию открытия на правку через события формы. Добавте в форму кнопку "Править" в которой, помимо перевода в режим правки документа, стоит прописывание некоего флага, например в нотес.ини, и на событии формы анализировать этот флаг (не забутьте его там очистить...)
 
Добавте в форму кнопку "Править" в которой, помимо перевода в режим правки документа, стоит прописывание некоего флага, например в нотес.ини, и на событии формы анализировать этот флаг (не забутьте его там очистить...)
Зачем засорять инишку? Достаточно объявить Public переменную в разделе Globals формы. В кнопке Правка присваиваем ей True, в QueryModeChange присваиваем её значение параметру Cancel, а ей самой — False.
 
nvy
Помню на этом форуме старожилы меня чуть было не закидали, когда я завел речь о Globals))
 
nvy
Помню на этом форуме старожилы меня чуть было не закидали, когда я завел речь о Globals))
Globals бывает разный ;). Если объявить глобальную переменную i в Globals корневой библиотеки (которую используют все другие), то можно нарваться на очень интересные эфекты ;). Согласен, что глобальными переменными злоупотр*цензура*ть не следует. Сам объявляю только ThisDB, ThisSession в Globals корневой библиотеки (инициализируются в Initialize), ThisUIDoc, ThisDoc, AllowSetEdit в Globals формы (инициализируются в PostOpen), ThisUIView, ThisView в Globals представления (инициализируются в QueryOpen).
 
Мама мия......
ACL вам в помощь от удаления.
о редактировании: как говорил мне Akupaka Help читать нуна ;)

Код:
Sub Postopen(Source As Notesuidocument)
'Let document pass if new or not in EditMode
'Otherwise if existing document is in EditMode
' Set allowEdit so Querymodechange doesn't reprocess
' Turn EditMode off so document opens in Read mode
' Tell the user to use the action
If source.EditMode And Not source.IsNewDoc Then
allowEdit = True
source.EditMode = False
Messagebox _
"Use Edit mode action to edit document"
Else
allowEdit = False
End If
End Sub


Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
'Allow user to proceed, and turn off allowEdit if
' user clicked the action (allowEdit on)
' already processed by Postopen (allowEdit on)
' trying to get out of Edit mode
' (allowEdit off but EditMode on)
'Tell user to click action if changing existing document
' to Edit mode and not already processed by Postopen
' (allowEdit and EditMode off)
If allowEdit Or (source.EditMode And Not allowEdit) Then
allowEdit = False
Else
Messagebox _
"Use Edit mode action to edit document"
continue = False
End If
End Sub


Declarations

Dim allowEdit As Variant


Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
'Turn on allowEdit so Querymodechange will let it pass
'Turn on EditMode
allowEdit = True
uidoc.EditMode = True
End Sub
 
+1 к ACL. :)
Если возможность удаления/неудаления/редактирования/нередактирования относится ко всем документам, а не лишь к некоторым (например в зависимости от их статуса), то нечего лезть в дебри.
 
Статус
Закрыто для дальнейших ответов.

Статистика тем

Создано
Yarotskaya,
Последний ответ от
alik86,
Ответы
7
Просмотры
5 182