2011年4月6日水曜日

編集者も他人が作成した文書を削除できないようにする

ACLで編集者アクセスを付与された人は他人が作成した文書を編集することはできますが、削除に関しては権限を別途付与しなければなりません。

編集者アクセスに削除権限を付与した場合、閲覧権限のある文書はすべて削除できてしまいますが、これを制限したいといった要望もあります。

そんなとき、削除の許可を判断するロジックをデータベーススクリプトにある QueryDocumentDelete イベントへ記述します。

以下の記述例では次のような判断を行い、削除を制限しています。
・管理者ロール[Admin]を付与されている場合、削除できる
・自身が(アイテム"CreatedBy"に設定されている)文書の作成者であれば削除できる
・複数の文書を選択した場合、ひとつでも他人が作成した文書があれば削除できない
Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
    Dim dc As NotesDocumentCollection
    Dim doc As NotesDocument
    Dim username$
    Dim dbadmin As Variant
    
    dbadmin = Evaluate(|@IsMember("[Admin]"; @UserRoles)|)
    If dbadmin(0) <> 0 Then Exit Sub
    username = Source.Database.Parent.UserName
    Set dc = Source.Documents
    If dc.count = 0 Then Exit Sub
    Set doc = dc.GetFirstDocument
    While Not doc Is Nothing
        If doc.HasItem( "CreatedBy" ) Then
            If username <> doc.GetItemValue( "CreatedBy" )( 0 ) Then
                Continue = False
                Exit Sub
            End If
        End If
        Set doc = dc.GetNextDocument( doc )
    Wend
End Sub

削除しようと選択した文書は NotesUIDatabase クラスの Documents プロパティから取得できます。
ビューから複数の文書を選択してDeleteキーを押した場合など、複数の文書が戻ることもありますので、戻り値は NotesDocumentCollection です。
文書の削除を続行させたい場合、Continue を True として処理を抜けます。
削除させたくない条件にひっかかったら、 Continue へ False を代入します。

削除できないことを Messagebox などで教えてあげるとより親切ですね。