Dokumentation des netEstate Datenbankinterface für Zope ------------------------------------------------------- (C) netEstate GmbH, www.netestate.de 1. Installation -Installieren Sie das CSV-Modul für python so, dass es der von Zope verwendete python-Interpreter verwenden kann (http://www.object-craft.com.au/projects/csv/). -Installieren Sie common.py gemäß der Anleitung -Installieren Sie die Produkte Zopilot - DTML Document und Zopilot - File gemäß der Anleitung. -Kopieren Sie db.py in das Extensions-Verzeichnis von Zope -Erzeugen Sie im Startverzeichnis eine SQL-Datenbankverbindung. Nennen Sie diese "DB_Connection". Setzen Sie die Property DatenbankName des Startverzeichnisses auf den Namen der Datenbank. -Importieren Sie Db.zexp in Ihr Startverzeichnis. Setzen Sie die Property DatenbankWurzelVerzeichnis auf den Pfad (beginnend mit /) zum neu erzeugten Verzeichnis Db. -Erzeugen Sie im Verzeichnis Db eine Rolle namens 'DBAdmin' und geben Sie sich selbst diese Rolle. Schränken Sie die Erlaubnis für 'View' auf diese Rolle sowie Manager und Owner ein. -Erzeugen Sie in Db ein Verzeichnis DbFiles. Geben Sie die Erlaubnis für View der Rolle Anonymous. -Setzen Sie folgende SQL-Kommandos ab, um die Tabellen pks, tabellenzugriff und feldzugriff zu erzeugen: create table pks ( tab varchar(40) binary not null, unique tab_ind (tab), col varchar(40) binary not null ); create table tabellenzugriff ( rolle varchar(40) binary not null, tabelle varchar(40) binary not null, berechtigung enum('Tabelle editieren','Dateien loeschen','DS loeschen', 'Feld anlegen','Tabelle anlegen','Tabelle loeschen','Feld loeschen') DEFAULT 'Tabelle editieren' ); create table feldzugriff ( rolle varchar(40) binary not null, tabelle varchar(40) binary not null, feld varchar(40) binary not null, berechtigung enum('Nur Anzeigen','Aus') DEFAULT 'Nur Anzeigen' ); create table autoselect ( feld varchar(255) not null, PRIMARY KEY(feld), wertetabelle varchar(255) not null, wertefeld1 varchar(255) not null, wertefeld2 varchar(255) not null, sortierfeld varchar(255) not null ); -Setzen Sie die Property TabellenAusschliessen des Startverzeichnisses auf den Wert "pks". -Setzen Sie folgende SQL-Kommandos ab, um der Rolle DBAdmin alle Rechte zu geben: insert into tabellenzugriff values ('DBAdmin','Alle','Tabelle editieren'); insert into tabellenzugriff values ('DBAdmin','Alle','Dateien loeschen'); insert into tabellenzugriff values ('DBAdmin','Alle','DS loeschen'); insert into tabellenzugriff values ('DBAdmin','Alle','Feld anlegen'); insert into tabellenzugriff values ('DBAdmin','Alle','Tabelle anlegen'); insert into tabellenzugriff values ('DBAdmin','Alle','Tabelle loeschen'); insert into tabellenzugriff values ('DBAdmin','Alle','Feld loeschen'); -Legen Sie innerhalb von Db die Verzeichnisse "feldzugriff", "autoselect" und "tabellenzugriff" an. -Richten Sie auf dem Apache-Webserver eine transparente Umleitung vom Verzeichnis /Db auf das entsprechende Verzeichnis des Zope-Servers: ProxyPass /Db http://zopeserver/Servername/Db -Gehen Sie auf das Objekt "TabellenErgebnis" und dann auf "View". Sie sehen alle Tabellen der Datenbank und können neue anlegen. Das Arbeiten in einer nicht durch das Datenbankinterface angelegten Tabelle ist erst möglich, wenn Sie in Db ein gleichnamiges Verzeichnis anlegen. 2. Beschreibung 2.1. Übersicht Das Datenbankinterface erlaubt das WWW-basierte Erstellen und Verwalten von Datenbanktabellen sowie die Vergabe von Zugriffsberechtigungen. Hierbei kann prinzipiell jede Maske für eine bestimmte Datenbanktabelle individualisiert werden. Ist keine solche individuelle Maske vorhanden, wird die voreingestellte verwendet. Bei Tabellen mit Primärschlüssel können zu jedem Datensatz beliebige Dateien hochgeladen werden, welche mit dem Pfad Db/DbFiles/Tabellenname/Primärschlüsselwert/Dateiname abgespeichert werden. Der Primärschlüsselwert wird hierbei mit PKDateiname aus dem Modul common.py codiert. Über das Pluggable Brain "DBBrain" können außerdem die zu einem Datensatz hochgeladenen Dateien automatisch in DTML eingebaut werden. Voraussetzung für das Hochladen von Dateien ist die Existenz des Verzeichnisses Db/DbFiles/Tabellenname, welches automatisch angelegt wird, sofern beim Anlegen der Tabelle über das Datenbaninterface "Ünterstützung für Dateien" aktiviert wird. Wird die Checkbox "Webfile" vor dem Hochladen einer Datei aktiviert, so wird diese als WebFile anstatt File angelegt. 2.2. Berechtigungen Über die Vergabe von Zope-Rollen und die Tabellen "tabellenzugriff" sowie "feldzugriff" können Sie die Berechtigungen für den Zugriff auf die Tabellen steuern. Bitte beachten Sie, dass die Berechtigungen lediglich die Steuerelemente für die nicht erlaubten Funktionen ausblenden. Der Zugriffsschutz kann also lediglich dazu dienen, versehentliche Manipulation von Daten zu verhindern. 2.2.1. Tabelle tabellenzugriff Hier wird eine Berechtigung erteilt, sofern für eine der Rollen des Benutzers bei der entsprechenden Tabelle oder für die Tabelle 'Alle' ein entsprechender Datensatz existiert. -Tabelle Editieren Gibt - sofern über die Tabelle feldzugriff keine Beschränkungen definiert wurden - dem Benutzer die Möglichkeit, alle Daten und Dateien einzusehen und zu ändern, sowie Dateien hochzuladen. -DS Löschen Gibt dem Benutzer zusätzlich die Möglichkeit, Datensätze zu löschen. -Dateien Löschen Gibt dem Benutzer zusätzlich die Möglichkeit, Dateien zu löschen. -Feld anlegen / Feld loeschen / Tabelle loeschen Ermöglicht dem Benutzer die entsprechende Aktion. -Tabelle anlegen Nur Sinnvoll mit Tabelle 'Alle'. Ermöglicht dem Benutzer das Anlegen neuer Tabellen. 2.2.2. Tabelle feldzugriff In der Voreinstellung hat der Benutzer mit "Tabelle Editieren" aus tabellenzugriff die Berechtigung, alle Felder zu sehen und zu verändern. Dies kann mit feldzugriff für einzelne Felder verändert werden. 2.3. Tabelle autoselect Enthält ein Feld den Primärschlüssel einer anderen Tabelle, kann für dieses Feld in den Eingabemasken anstatt eines Eingabefeldes ein Auswahlfeld mit den Werten aus der anderen Tabelle erzeugt werden. Hierzu wird ein Datensatz in autoselect angelegt: -feld: Angabe des betroffenen Feldes in der Form Tabellenname.Feldname -wertetabelle: Tabelle mit der Liste der Werte -wertefeld1: Feld aus der Wertetabelle mit den Werten, die in der Ausgangstabelle eingefügt werden sollen -wertefeld2: Feld aus der Wertetabelle mit den Werten, die im Auswahlfeld angezeigt werden sollen (kann mit wertefeld1 übereinstimmen) -sortierfeld: Bestimmt die Sortierung der Werte im Auswahlfeld 2.4. Individualisierung Die Objekte des Datenbankinterface lassen sich in drei Klassen einteilen: 1) Formular für Funktion X (Webdocument mit Name 'Form') Dieses zeigt auf 2) Ergebnisseite für Funktion X (Webdocument mit Name 'Ergebnis') Diese ruft auf: 3) Programmierlogik für Funktion X (Python-Skript mit Name '') Die Funktion aller WebDocuments in Db kann dadurch für eine Tabelle überschrieben werden, dass ein gleichnamiges WebDocument in Db/Tabellenname angelegt wird. Die Funktion der Python-Skripten Suchen, Loeschen und Aktualisieren kann dadurch für eine Tabelle überschrieben werden, dass eine gleichnamige Z-SQL-Methode in Db/Tabellenname angelegt wird. Die Funktion anderer Python-Skripten kann im Moment nicht überschrieben werden. Funktionen ---------- -Einfuegen: Datensatz einfügen. -Suchen Datensätze suchen. Das normale Suchen liefert alle Datensätze einer Tabelle. Das normale SuchenForm liefert sofort SuchenErgebnis zurück. -Aktualisieren: Datensätze editieren. -Loeschen: Datensätze löschen -ErstelleTabelle: dito -FeldEinfuegen: dito -FeldLoeschen: dito -Hochladen: Datei hochladen -LoescheDatei: dito -TabelleLoeschen: dito Sonstige wichtige Python-Skripten --------------------------------- -Hole Sucht einen Datensatz anhand der Formulardaten. Wird in AktualisierenForm, LoeschenForm und Objektliste verwendet. -TabellenErgebnis Ruft SqlTabellen auf und erzeugt Tabellenübersicht mit Formularbuttons -ObjektListe Liste der Dateien eines Datensatzes mit entsprechenden Formularen. Wird von AktualisierenForm eingebunden. Formulardaten ------------- Feldwerte werden als Formulardaten mit folgenden Namen übergeben: _akt = Aktueller Wert des Datenbankfeldes (Für Hole) _new = Neuer Wert des Datenbankfeldes (Für Aktualisieren,Einfügen) _akt dient Hole dazu, den entsprechenden Datensatz zu finden. Hat die Tabelle einen Primärschlüssel, so wird nur dieser dazu verwendet. Suchen und SuchenErgebnis brauchen im Formularfeld "columns" die durch Komma getrennte Liste der Feldnamen, falls nicht alle Felder im Suchergebnis enthalten sind bzw. angezeigt werden sollen. An das Formular EinfuegenForm lassen sich über die Parameter _new voreingestellte Werte übergeben. 2.5. DBBrain Sofern diese Klasse über den Reiter "Advanced" einer SQL-Methode als Pluggable Brain eingebunden wird, stehen innerhalb von DTML-Templates die Methoden dr(Tabellenname,Dateiname,Defaultdatei) dr(Tabellenname,Dateiname) dr(Tabellenname,Feldname,'') zur Verfügung. Die ersten zwei Varianten binden die zum Datensatz gehörende Datei mit dem Namen Dateiname ein bzw. Defaultdatei falls diese nicht existiert. Die Defaultdatei sollte dabei direkt in Db/DbFiles/Tabellenname abgelegt sein. Die dritte Variante evaluiert den DTML-Code im Datenbankfeld Feldname und gibt ihn zurück. Hierbei kann innerhalb des DTML-Codes verwendet werden, um eine dem Datensatz zugeordnete Datei einzubinden. 2.6. Sonstiges Über das Attribut feldreihenfolge_ kann die Feldreihenfolge in den Masken verändert werden. Hierzu enthält es Listen der Form feld1,feld2,feld3,... Durch diese Anweisung folgen feld2,feld3,etc. auf feld1 - egal wo feld2,feld3,etc. normalerweise stehen würden. Die Position von feld1 selbst wird nicht verändert. Mehrere dieser Anweisungen/Listen können mit ; getrennt werden. Beispiel: feld3,feld7,feld9;feld4,feld3,feld2 feld7+9 sollen auf feld3 folgen und feld3+2 sollen auf feld4 folgen. Die Position des ersten Feldes der Tabelle (normalerweise der Primärschlüssel) kann nicht verändert werden. Die Attribute "rows", "cols" und "wrap" von textarea-Eingabefeldern können über die Properties "textareaRows", textareaCols" und "textareaWrap" gesteuert werden. Die DTML-Methode "DatensatzLinks" ist normalerweise leer und kann innerhalb eines Tabellenverzeichnisses überschrieben werden, um das Formular zum Aktualisieren eines Datensatzes zu erweitern. Im folgenden Beispiel für DatensatzLinks wird z.b. auf eine Ausgabemaske für den Datensatz gelinkt:
Webansicht
Die Zuordnung der Datentypen aus dem Datenbankinterface zu den SQL-Datentypen findet sich in dem Skript HoleFeldDefinition. Sofern nicht über das Datenbankinterface erstellte Tabellen einen Primärschlüssel haben, empfiehlt es sich, in pks (Primary KeyS) einen Datensatz mit Tabellenname und Feldname anzulegen, da sonst gewisse Datensätze ggf. nicht editiert werden können. Ebenso ist dies notwendig für den Upload von Dateien (Hat eine Tabelle keinen Eintrag in pks, werden die entsprechenden Formulare für Dateien ausgeblendet). 3. Sonstige verwendete Python-Funktionen -EscSql(string) SQL-Sonderzeichen Escapen. -FormularFeldWert(feld) Liefert den aktuellen Feldwert entsprechend der Formulardaten. -Funktion(Funktionsname) Das Python-Skript Funktionsname wird ausgehend vom Tabellenverzeichnis gesucht und aufgerufen. 'Suche' wird so aufgerufen da sonst kein überschreiben durch eine SQL-Methode im Tabellenverzeichnis möglich wäre. -HatFeldZugriff(tabelle,feld) Ergebnis 2: Lesen/Schreiben Ergebnis 1: Lesen Sonst: Kein Zugriff -HiddenVariablen Generiert hidden-Input-Felder entsprechend der aktuellen Formulardaten. -HoleFeldDefinition(name,typ,enums,default) Gibt entsprechenden SQL-Feldtyp zurück. -HoleFunktionsName() Liefert ausgehend vom letzten Element im Zugriffspfad den Namen der aktuell gewählten Funktion. -HoleObjektListe() Liefert ausgehend von den Formulardaten die Liste der zu einem Datensatz gehörenden Datei-IDs. -HoleTabellenName() Liefert ausgehend vom Pfad den Namen der aktuellen Tabelle. -IstBerechtigt(tabelle,berechtigung) Liefert 0 oder 1 für die entsprechende Berechtigung. -IstDbIdentifikator(string) Testet ob eine Zeichenkette als SQL-Bezeichner geeignet ist. -TabelleDarstellen(Tabelle) Bestimmt, ob die Tabelle gemäß der Property TabellenAusschliessen angezeigt werden soll.