Dokumentation des Produkts Zopilot - DTML Document -------------------------------------------------- (C) netEstate GmbH, www.netestate.de 1. Basisinstallation -Entpacken Sie das Archiv ZopilotDTMLDocument.tgz im Verzeichnis lib/python/Products der Zope-Installation und starten Sie Zope neu. -Legen Sie in Ihrem Startverzeichnis an: -Ein python-Skript HolePreis mit dem Inhalt "return 0" -Ein python-Skript HoleBenutzerGruppen mit dem Inhalt "return 'all'" -Eine DTML-Methode SeitenKopf -Eine DTML-Methode SeitenFuss Sie können nun Objekte des Typs "Zopilot - DTML Document" anlegen. Diese werden beim Abruf automatisch um SeitenKopf und SeitenFuss ergänzt. 2. Anmeldepflichtige Dokumente Beim Aufruf wird über die Python-Funktion HoleBenutzerGruppen bestimmt, für welche Benutzergruppen das Dokument zugänglich ist. Der Rückgabewert ist dabei die durch Kommas getrennte Liste der zulässigen Gruppen. Ist der Rückgabewert 'all', so ist das Dokument nicht anmeldepflichtig. Ist der Rückgabewert nicht 'all', wird geprüft ob das Python-Skript 'OhneAnmeldung' existiert. Falls es nicht existiert oder mit 0 zurückkehrt wird - sofern nicht bereits vorhanden - eine Zope-Session erzeugt und darin das Objekt "webdocument" abgelegt. Dieses ist ein Dictionary aus folgenden Keys: REQUEST.SESSION["webdocument"] = cookiesActive Cookies aktiv ? Defaultmäßig 0 id session.id userID Defaultmäßig '' userGroups Defaultmäßig [] Enthält die Liste userGroups eine der für das Dokument zulässigen Gruppen, wird es normal dargestellt. Ist userGroups leer, wird die DTML-Methode "NichtAngemeldet" aufgerufen. Enthält userGroups keine der zulässigen Gruppen, wird die DTML-Methode NichtInGruppe aufgerufen. Das Dokument NichtAngemeldet sollte Möglichkeiten zur Anmeldung und Registrierung eröffnen. Die Anmeldeskripten müssen userID und userGroups entsprechend setzen und auf das Dokument zurückleiten. Die Rücksprungadresse kann von NichtAngemeldet z.B. über die externe Methode VolleUrl aus common.py ermittelt werden. Beispiel: --------- Ändern Sie den Inhalt von HoleBenutzerGruppen in "return context.benutzerGruppen" und definieren Sie "benutzerGruppen" mit dem Wert "all" als Property Ihres Startverzeichnisses. Legen Sie eine DTML-Methode "NichtAngemeldet" mit folgendem Inhalt an: Sie wurden angemeldet !
Weiter Legen Sie ein Python-Skript "Anmelden" mit folgendem Inhalt an: s=context.REQUEST.SESSION s['webdocument']['userID']='User' s['webdocument']['userGroups']=['gast'] return Legen Sie nun ein Webdocument an und setzen Sie für dieses die Property "benutzerGruppen" auf "gast". Legen Sie nun eine DTML-Methode "NichtInGruppe" an: Sie gehören zu keiner der folgenden zulässigen Gruppen:
Ändern Sie die Property "benutzerGruppen" des Testdokuments auf "restricted" und versuchen Sie, das Dokument abzurufen. 4. Kostenpflichtige Dokumente und Dateien Liefert die Methode HolePreis bei einem Dokument einen Wert!=0, so wird - sofern nicht schon vorhanden - eine Zope-Session erzeugt und darin das oben dokumentierte Objekt "webdocument" abgelegt. Dann wird über die Python-Funktion HoleGruppe() die DokumentenGruppe bestimmt. Die spätere Freischaltung bezieht sich auf die gesamte DokumentenGruppe. Schließlich wird die Python-Methode Bezahlt(Session,User,Gruppe) aufgerufen, um festzustellen, ob die betreffende Dokumentengruppe für den angemeldeten User oder in dieser Session freigeschaltet ist. Eine Anmeldepflicht für das Dokument bzw. den Benutzer ist nicht obligatorisch. Ist das Ergebnis von Bezahlt 1 oder nicht leer, wird AktualisiereBezahlt(Session,User,Gruppe) aufgerufen, um den Abruf der Dokumentengruppe zu dokumentieren. Danach wird das Dokument ausgegeben. Ist das Ergebnis von Bezahlt 0 oder leer, wird das Python-Skript ErzeugeKassenDaten() und danach die DTML-Methode NichtBezahlt aufgerufen. Es ist Aufgabe von ErzeugeKassenDaten, wichtige Parameter wie Preis (HolePreis), DokumentenGruppe (HoleGruppe) und RücksprungURL (VolleURL) zu speichern (z.B. in der Session), damit NichtBezahlt sowie die darüber erreichbaren Zahlungsarten Zugriff auf diese Informationen haben. Die Zahlungsarten müssen dann letztendlich dafür sorgen, dass Bezahlt nach der Zahlung 1 bzw. einen nicht leeren Werte zurückliefert - z.B. indem ein Datenbankeintrag mit Session,User,Dokumentengruppe gemacht wird. Beispiel: --------- -Ändern Sie das Python-Skript HolePreis in "return context.preis" und definieren Sie eine Property "preis" des Startverzeichnisses mit dem Wert 0 (typ float). -Definieren Sie eine Property "gruppe" des Startverzeichnisses mit einer leeren Zeichenkette als Wert (typ String) -Erzeugen Sie ein Python-Skript HoleGruppe mit folgendem Inhalt: g = context.gruppe if not g: return context.VolleUrl() else: return g -Erzeugen Sie ein Python-Skript Bezahlt mit den Argumenten Session, User, Gruppe und folgendem Inhalt: if User=='': User=Session s=context.REQUEST.SESSION if s.has_key(User): if s[User].has_key(Gruppe): return s[User][Gruppe] return 0 -Erzeugen Sie ein Python-Skript AktualisiereBezahlt mit den Argumenten Session, User, Gruppe und folgendem Inhalt: if User=='': User=Session s=context.REQUEST.SESSION if s.has_key(User): if s[User].has_key(Gruppe): s[User][Gruppe]=s[User][Gruppe]-1 return -Erzeugen Sie ein Python-Skript ErzeugeKassenDaten mit folgendem Inhalt: s=context.REQUEST.SESSION kd={} user=s["webdocument"]["userID"] if user=='': user=s["webdocument"]["id"] kd["user"]=user kd["gruppe"]=context.HoleGruppe() kd["preis"]=context.HolePreis() kd["url"]=context.VolleUrl() s["kassendaten"]=kd -Erzeugen Sie ein Python-Skript Bezahlen mit folgendem Inhalt: s=context.REQUEST.SESSION user=s["kassendaten"]["user"] gruppe=s["kassendaten"]["gruppe"] url=s["kassendaten"]["url"] if not s.has_key(user): s[user]={} s[user][gruppe]=5 # 5 Abrufe erlaubt return "Weiter zum Dokument" -Erzeugen Sie eine DTML-Methode NichtBezahlt mit folgendem Inhalt: Preis:
Bezahlen -Erzeugen Sie nun ein neues Dokument und setzen Sie die Property preis auf 1.0 (typ Float). 5. Sonstiges Existiert eine Property set_last_modified_header und ist diese nicht leer, wird der Last-Modified-Header ensprechend dem Modifikationsdatum des Dokuments gesetzt.