Zope - MySql connectstring programmatisch ändern

  • Hallo,
    ich arbeite seit einem halben Jahr begeistert mit Zope. Jetzt habe ich aber ein Problem, das ich nicht gelöst bekomme. Mein Zope Programm greift auf eine externe MySql Datenbank zu, deren Zugangsdaten sich pro Kunde ändern.
    Weiß Jemand, wie ich programmatisch auf den connectstring des Zope MySql objektes zugreife?

    Eine andere Lösung wäre, eine Rolle einzuführen, die genau das MySql Property Sheet mit dem Connectstring freischaltet. Das Property Sheet wird aber nur mit der Admin Rolle dargestellt. Bei allen anderen Rollen kann ich alle Berechtigungen anklicken, das Property Sheet wird nicht angezeigt.

    Vielen Dank

    Gero

  • Hallo,

    via Python, kannst du in einer Browser View jederzeit den connection string einer Datenbank-Anbindung ändern. Die Properties könntest du mit einem ZCML-Overwrite für jeden zugänglich machen, aber das alles löst dein Problem nicht.

    Was du eigentlich haben möchtest ist eine Form die abhängig vom Nutzer Daten aus der MySQL ausliest oder schreibt. Da ist die beste Lösung eine Form oder Browser-View in der du SQLAlchemy nutzt um diese sachen zu machen.

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Hallo Marcel,
    die MySql Datenbank gehört nicht zur Zope Software. Das Zope MySql Objekt connected sich lediglich auf die Kunden MySqldatenbank. Daher muss bei jeder neuen Installation für jeden Kunden ein neuer Connectstring eingetragen werden. Am liebsten würde ich dafür eine Form bereitstellen, wo der Kunde das selber machen kann.
    Ich bekomme jedoch keinen Zugriff auf das Property "Database Connection String" des "Z MySQL Database Connection" Objektes hin wie bei anderen Objekten wie dem Folder.

    Vielen Dank
    Gero

  • Hallo,

    es ist doch nicht ganz verständlich was du möchtest, hier nochmal die möglichen Varianten die man verstehen kann:

    1. nach der Installation eines Portals soll der MySQL-Connection String initial für das Portal gesetzt werden.
    2. nach dem hinzufügen eines Kunden soll für diesen Kunden im Portal der durch Ihn festgelegt Connection-String für alle Abfragen an die Datenbank genutzt werden.

    Hierzu auch noch die Klarstellung, das MySQL nicht zu Zope gehört ist allgemein bekannt, das sie in der Regel auch nicht zu einer Cluster Installation gehört auch, das man eine beliebige Relationale Datenbank über Connectoren und andere Wege anbinden kann ist typisch für Zope.

    Zu 1: Relativ trivial, da es hier nur um ein Configlet zu einem bestehenden Backend in der ZMI handelt, dieses würde auch von der Permission für ein manage_portal deckungsgleich sein, was das Backendmodul benötigt.

    Zu 2: Mit dem Z MySQL Database Connector nicht machbar, aber trotzdem ohne Probleme in Zope/Plone umsetztbar. Der Trick ist die Nutzer spezifische persistente Speicherung des Connection Strings, am einfachsten durch erweiterung der portal_memberdata und der Form für die Persönlichen Einstellungen. Der MySQL Connector wird durch einen weiteren Python Abstraction Layer - SQLAlchemy - gekappselt. SQLAlchemy erlaubt genau das gleiche was der MySQL Connector macht, bloss das du pro Aufruf einen Connection String übergeben kannst.

    Also bitte genau den Use Case beschreiben was du möchtest, wenn du genauere Erklärungen oder Beispiel Code brauchst.

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Also es ist eine Applikation, eine Ergänzung zu einem anderen Program. Jeder, der dieses Programm bekommt, verbindet das Programm mit seiner MySql Datenbank. Da ich den Admin Zugang von Zope nicht freigeben möchte, ist die Frage, wie mache ich das? Wie kann der Kunde den Connectstring übergeben.
    Wie du schreibst : dem Z MySQL Database Connector nich machbar

    Ist natürlich nicht schön. Ich kann jetzt keinen neuen DB Layer einziehen. Das Programm ist fertig. Das es keinen Zugriff auf Properties von Objekten gibt, hatte ich nicht erwartet. Letztlich muss doch auch Zope die Propertie übergeben?

  • Also nochmal, da ich denke das wir aneinander vorbei reden:

    Wie sieht deine Zope Anwendung aus?
    1. Ist es natives Zope oder ist da ein System wie Plone on top in dem der Kunde arbeitet?
    2. hat jeder Kunde ein eigenes Zope oder sind mehrere Portale / Kopien des Programms in deinem Zope?
    3. wenn es eine ordentliche Anwendung in Zope ist, hast du den zope Root acl_users und in jeder Zope-Applikation / Portal einen eigenen acl_users der nur für den Bereich gilt.
    4. Der Zugriff auf das Propertie ist natürlich möglich, bedraf aber bestimmter Rechte in Zope, welche Rechte haben deine User, gibt es einen Bereichsadmin?.

    Ich habe mehrere Anwendungen wo ich via einer Form auf den Connection String einen psycopg2 Connector, das äpuivalent zu Z MySQL Connector für PostgreSQL, zugreifen und änderen kann. Ich kann auch jedem Nutzer für eine Abfrage einen eigenen connection-String für verschiedene Datenbanken nutzen lassen. Beides ist programmatisch simple, aber man muss den UseCase verstehen und erklären können, um eine sinnvolle Lösung implementieren zu können.

    Deine Aussage das man keinen neuen DB-Layer einziehen kann weil das Programm fertig ist, ist eine kommische Aussage, denn entweder kannst du mit deinem Zope Programm schon so auf die Datenbank zugreifen wie du möchtest, oder das Programm ist nicht fertig, oder bezieht es sich auf die Datenbank, das diese fertig sei. Wenn es zweites ist, hast du mich nicht verstanden, weil ich dir mit SQLAlchemy einen Datenbank-Wrapper für Python den man in Zope sehr gut nutzen kann um auf Datenbanken Zugriffsversuche zu vermitteln.

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Kein Portal, kein Plone, nur Zope
    Die Anwendung greift über Z MySQL Connector auf die Kundendaten zu. (Das Programm läuft beim Kunden und greift auf dessen MySql Datenbank zu)
    Ich muss den Connectstring des Z MySQL Connectors bei der Installation bei jedem Kunden auf dessen Gegebenheiten neu setzen und möchte den Adminport von Zope nicht freigeben.
    Wie komme ich mit native Zope/Python an den Connectstring des Z MySQL Connectors und kann ihn mit Daten setzen

  • Hallo,

    also prinzipiell zwei Lösungsmöglichkeiten:

    1. Die Security settings für den MySQLConnector überschreiben und so das es eine Rolle des Nutzer machen darf.
    2. Ein Property Form schreiben was den Connection String aufnimmt unf für den Nutzer sichtbar und änderbar ist, und dann via File System Python Script bei Speichern der Form den Connection String im Connector überschreiben. Muss ein FilesystemString sein, da sonst RestrictedPython in Zope zuschlagen könnte und es nciht erlaubt auszuführen.

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller

  • Das ist js genau mein Problem.
    Was muss ich genau tun, damit ich die Security settings für den MySQLConnector überschreiben kann

    oder

    Bei der Form muss ich Zugriff auf den Connectstring haben. Beides habe ich nicht geschafft.

    Danke Gero

  • Securtity Settings kann man mit einem zcml-overwrite machen.

    Bei der Form, ist das ein einfaches Pythonscript, das sich den String holt und schreibt, der Trick liegt dadrin via einem FileSystem Produkt das Restricted Python innerhalb des Zope zu umgehen.

    Beispiel Code-Schnipsel:

    Gruss Pumukel

    Die beste Informationsquelle sind Leute, die versprochen haben, nichts weiterzuerzählen.

    Marcel Mart
    frz. Schriftsteller