Zope 2
Up one levelZope2: ZODB-Inhalte mit GenericSetup exportieren und importieren
Wenn Konfigurationsobjekte in der ZODB liegen kann man sie mit Products.GenericSetup exportieren und dann in eine Versionsverwaltung stecken.
Ich habe meine ersten Schritte mit Products.GenericSetup (Version 1.2) in Zope 2.8 gemacht. Diese Versionen sind zwar nicht mehr ganz aktuell, aber das Prinzip sollte auch mit aktuellen Versionen ähnlich sein.
Voraussetzungen
Für einen Export braucht man folgende Dinge:
- Export/Import-Handler für das zu exportierende Objekt
- Registrierung des Handlers in ZCML
- Exporter (um das Objekt in der ZODB zu finden und dann zu exportieren)
- Profil
- Registrierung des Exporters
- in ZCML registrierten Export/Import-Handler (wie beim Export)
- Importer (um das Elternobjekt in der ZODB zu finden und da zu importieren)
- Registrierung des Importers
Export/Import-Handler
Dieser Handler ist eine Klasse, Basis dafür ist Products.GenericSetup.utils.XMLAdapterBase. Beispiel für eine Klasse, die alle Properies eines Objektes exportieren und importieren kann: (In Anlehnung an Products.GenericSetup.OFSP.exportimport.FolderXMLAdapter)
class ELWTicket(Products.GenericSetup.utils.XMLAdapterBase,
Products.GenericSetup.utils.PropertyManagerHelpers):
# __uses_for__ ist nur ein Hinweis für den Entwickler, es wird sonst nicht
# benutzt.
__used_for__ = mypackage.IELWTicket
# damit wird der Name angegeben der im Log erscheint.
_LOGGER_ID = 'elwticket'
def _exportNode(self):
"""Export the object as a DOM node."""
# Anlegen des Objekts im XML
node = self._getObjectNode('object')
# speichern der Properties
node.appendChild(self._extractProperties())
# Nachricht an den Logger über erfolgreichen Export.
self._logger.info('ELWTicket exported.')
return node
def _importNode(self, node):
"""Import the object from the DOM node."""
# Säubern der Properties vor Import, wenn erforderlich.
if self.environ.shouldPurge():
self._purgeProperties()
# Properties schreiben.
self._initProperties(node)
self._logger.info('ELWTicket imported.')
def _importSimpleNode(self, node):
"""Import node attributes set in WebTickets.xml file."""
# Beim Import wird erwartet, dass das erstellte Objekt eine ID hat, aber
# die wird nirgends gesetzt. GenericSetup ist sonst wohl eher for Tools
# gedacht.
obj = self.context
obj.id = str(node.getAttribute('name'))
# auf _importSimpleNode wird über eine Property zugegriffen, die noch zu bauen
# ist
node = property(
Products.GenericSetup.utils.XMLAdapterBase._exportSimpleNode,
_importSimpleNode)
ZCML-Registrierung des Handlers
Der Handler muss als Multiadapter für das Interface Products.GenericSetup.interfaces.IBody registriert werden:
<zope:adapter
factory=".exportimport.ELWTicket"
provides="Products.GenericSetup.interfaces.IBody"
for="mypackage.interfaces.IELWTicket
Products.GenericSetup.interfaces.ISetupEnviron"
/>
Es muss (zumindest in Zope 2.8) das Interface des Objektes angegeben werden, das exportiert werden soll, damit der Adapter auch gefunden wird.
Exporter
Der Exporter ist eine Funktion, die das zu exportierende Objekt findet und den Export auslöst.
def exportELWTickets(context):
"""Exporter."""
# Die Site auf dem context liefert den Ordner in dem das setup_tool
# (GenericSetup-Objekt) liegt.
parent = context.getSite()
folder = getattr(parent, 'WebTickets')
Products.GenericSetup.utils.exportObjects(
folder, '/Auftritte/', context)
Meinem Exporter liegen folgende Annahmen zu grunde:
- Das GenericSetup-Werkzeug (Tool) liegt in /Auftritte
- Die zu exportierenden ELWTickets liegen in /Auftritte/WebTickets (einem gewöhnlichen Folder)
Der Export führt dann dazu, dass der Ordner WebTickets und die darin liegenden ELWTickets exportiert werden.
Profil
Im Profil wird der Exporter registriert und dort können die Ergebnisse des Exports abgelegt werden, damit beim Import nicht ein Dokument hochgeladen werden muss. Das Profil ist ein Ordner und liegt in einem Ordner mit dem Namen profiles. Es ist per ZCML zu registrien:
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
i18n_domain="genericsetup">
<genericsetup:registerProfile
name="default"
title="Webtickets"
description="Im- and export the webticket objects."
/>
</configure>
Das hier registriere Profil heißt default, es muss also einen Ordner profiles/default neben configure.zcml geben. Titel und Beschreibung (description) werden in der Benutzungsoberfläche von GenericSetup angezeigt.
Registrierung des Exporters
Der Exporter wird leider nicht per ZCML sondern über ein eigenes XML-Format registriert. Das Dokument dazu muss export_steps.xml heißen und in profiles/default liegen.
<?xml version="1.0"?>
<export-steps>
<export-step
id="elw_tickets"
handler="mypackage.exportimport.exportELWTickets"
title="Export ELWTickets.">
</export-step>
</export-steps>
Export
Exportiert wird über setup_tool --> Export. Dort wird „Export ELWTickets.“ als Schritt (Step) angezeigt. Wenn man exportieren auswählt erhält man ein Dokument (mit tar und gzip verpackt), welches eine XML-Repräsentation der exportierten Objekte enthält.
- Category(s)
- Zope 2
- The URL to Trackback this entry is:
- http://blog.gocept.com/zodb-inhalte-mit-genericsetup-exportieren/tbping