Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: daija am 27.10.06 - 22:52:48
-
Hallo,
ich habe die Discussion DB in der Maske MainTopic um Leser und Autorenfelder erweitert.
Hat sich schon mal jemand mit dem Agent auseinander gesetzt und kann mir sagen, was ich anpassen muss, damit der Agent nicht die Dokumente in der Zusammenfassung auflistet, auf die der User keinen Lesezugriff hat?
Hintergrund: Auf die DB haben mehrere User Zugriff und jeder kann sich in seinem Interessenprofil über bestimmte Dokumente benachrichtigen lassen. In der Zusammenfassungs-Mail an den User sollen aber nicht die Dokumente auftauchen, auf die er keinen Zugriff hat, da sonst ein kl. privacy Problem entsteht und der User z.b. das Thema lesen kann.
-
Wenn der Newsletteragent als lokaler periodischer AGent vom Benutzer gestartet wird, ist das alles keine Frage, da er im Userkontext abläuft und nur die Dokumente sammelt, die der Benutzer auch sehen kann, wenn du ein UNPROCESSEDFTSEARCH verwendest. (schau dir dazu das Beispiel der Hilfe zu Examples: FormatMsgWithDoclinks method an). Der Wesentliche Teil ist die Zweistufigkeit des Prozesses. Die Suche nach den UNPROCESSEDDOCUMENTS muß die Leserfelder nämlich berücksichtigen.
Testen.
-
Danke für deinen Beitrag.
Blöde Frage; aber wie konfiguriere ich den Agent, dass er als lokaler periodischer Agent vom Benutzer gestartet wird?
Ich habe alle Design-Elemente mit der Server-ID signiert und der Agent versendet nun mit dem Servernamen als Absender, d.h. der Server führt den Agent aus.
-
Da ich unter "Newsletter-Agent" eine zentrale Instanz verstehe, die Mails für viele User automatisch und periodisch erstellt, würde ich sagen, dass eine Umstellung auf ein Prinzip "Mach's Dir doch selber" wenig zielführend ist.
In diesem Fall bleibt Dir aber nur:
Ermittele beim Versand der Newsletter jeweils die Rechte der (einzelnen!) Empfänger aus Deinem Leserfeld - wenn dort Gruppen oder gar verschachtelte Gruppen möglich sind, dann wird dies eine spannende, aber lösbare Programmieraufgabe.
Bevor ich jetzt weiter nachdenke (mir würde da als simple Lösung auch ein (oder mehrere) Ordner mit den Dokumenten für den Newsletter einfallen - da sieht ja auch jeder nur die Dokumente, für die er autorisiert ist), sag bitte an, wie Du zu der Problematik "scheduled agent vs. private agent" stehst. Wie gesagt, macht meiner Meinung nach Variante zwei kaum Sinn - DAS könntge man dann ja ganz anders lösen.
Bernhard
-
Ich habe keineswegs gemeint, daß ich ein "Do-it-yourself"-Verfahren für besonders sinnvoll halte. Ich glaube eigentlich sogar, daß ein "verbogenes Diskussionsforum", in dem die Angeschriebenen nicht einmal das Subject bestimmter Artikel lesen können dürfen sollen, kein sinnvolles Instrument für die Verteilung von Newslettern ist.
Für die "spannende, aber lösbare" Aufgabe der (rekursiven) Namensauflösung aller Lesereinträge einmal die Fälle, die dabei zu berücksichtigen sind:
Albert Einstein/Firma/DE
Gruppe im Betrieb
*/Teilbetrieb/Firma/DE
[Entscheider]
Und wenn die Firma groß genug ist, kommt man bei der Auflösung bei großen Gruppen auch über die 64kB-Begrenzung eines Einzelfelds hinaus. Und noch ein kleiner Hinweis beim Herangehen an diese Aufgabe:
für die Gruppenfelder muß man sich merken, welche Gruppen man bereits untersucht hat, sonst fällt eine zyklische Gruppenstruktur auf die Nase.
Gruß
Norbert
-
Also Hintergrund ist eigentlich, dass wir die Discussion DB als einfaches DMS verwenden und nicht wirklich als Diskussionsforum. Daher die Erweiterung von Leser und Autorenfelder.
Das Featcher "Send Newsletter" fanden wir ganz brauchbar sind aber jetzt über die anfangs beschriebene Problematik gestolpert.
Wie könnte denn eine Lösung als private Agent aussehen?
-
Hallo,
Du erstellst einen Agenten, der aus dem Actions-Menü gestartet werden kann,
der über new & modified Documents läuft.
Dann sollte die session.Database.UnprocessedDocuments Collection alle Dokumente enthalten, die zu diesem Zeitpunkt neu oder verändert sind.
Du erzeugst ein Document und ein RichtextItem und schreibst per Schleife alle Dokumente (evtl. Autoren oder Interest Profile aussortieren) als Doclink in das item.
Dieses Dokument wird mit einer zu erstellenden Maske im Workspace geöffnet.
Problem wird sein, das das Doc meines Wissens gespeichert werden muss bevor man es anzeigen kann, da sonst der Inhalt des RTItems nicht sichtbar ist. D.h.: per periodischem Agenten regelmässig ein Cleanup durchführen und ganz wichtig: sicherstellen das diese Docs nicht in den Ansichten auftauchen.
Zweite Methode wäre die von Bernhard(koehlerbv) vorgeschlagene Aktion die Dokumente in einen private Folder zu verschieben, dann muss man aber den Folder erst leeren, bevor man neue Docs reinschiebt.
Sinn des Newsletters ist es täglich eine e-mail mit den Neuigkeiten zu erhalten ohne di DB zu öffnen,
da ich dort, sofern sie nicht abgeschaltet wurden, durch die unread Markierungen sehe was neu oder verändert ist.
Wenn Deine SW-Discussion eine ähnliche ist wie die, an der ich schon einmal herumgedoktort habe, würde ich folgendes tun:
Die Newsletter werden für die Personen erzeugt, die ein Interest Profile erstellt haben,
d.h.: ich habe einen Benutzernamen gegen den ich abgleichen kann.
Die Rollen in der ACL kann man mit:
Public Function GetPersonsACLRoles(sname As NotesName)
Dim s As New NotesSession
Dim db As NotesDatabase
Dim uroles
Dim ret() As String
Dim count As Integer
Redim ret(0 To 0) As String
ret (0) = ""
count = 0
Set db = s.CurrentDatabase
uroles = db.QueryAccessRoles(Cstr(sname.Canonical))
If Isarray(uroles) Then
If "" <> uroles(0) Then
uroles = Arrayunique(uroles)
Forall x In uroles
If "[WE_" <> Left$(Cstr(x), 4) Then
Redim Preserve ret(0 To count) As String
ret(count) = Cstr(x)
count = count + 1
End If
End Forall
End If
Else
If "" <> uroles Then
ret(0) = uroles
End If
End If
GetPersonsACLRoles = ret
End Function
auslesen.
Die Gruppen in dem Leserfeld mit:
Private Function SolveGroupDomino(groupname As String)
Dim ret
Dim s As New NotesSession
Dim dt As New NotesDateTime("21.01.1971")
Dim db As NotesDatabase
Dim searchstring As String
Dim dc As NotesDocumentCollection
Dim person As NotesDocument
' db mit N&A belegen
If db Is Nothing Then
Redim ret(0 To 0)
ret(0) = ""
SolveGroupDomino = ret
Exit Function
End If
searchstring = "Form = ""Group"" & @ismember("""+ groupname +""";ListName)"
Set dc = db.Search(searchstring, dt, 0)
Redim ret(0 To 0)
ret(0) = ""
If 0 <> dc.Count Then
Set person = dc.GetFirstDocument
ret = person.GetItemValue("Members")
End If
SolveGroupDomino = ret
End Function
auflösen. Bei mir war der Fall, dass die Gruppen nicht verschachtelt waren, wenn das der Fall ist muss man die Fkt. noch anpassen.
Den Newsletter Agenten anzupassen ist zwar etwas aufwendig, bietet den Anwendern aber einen gewissen Comfort.
Gruss
Andreas