Hello,
In the previous versions of Zope (like : 2.4.2); I used two
external
methods to make entire backup and restore of all the
Zope
documents, see : the source script and procedure below.
Now, I install Zope
2.7.2 and then add my two external methods as
usual to
restore all my applications from the previous version (2.4.2).
It works very well but when I try to
use the backup method I
receive
the following error :
“Attempt to store an
object from a foreign database connection”
Is it a bug or some modified
functionality of Zope ? Somebody
could
guide me ?
Thierry
Thierry.Goyvaerts@skynet.be
Procedure
to install and use the full backup/restore methods :
Create a module, backup.py,
with the contents of
the source
(given in
the tied code file) within the Extensions directory of your
e-Solution instance.
Create
two external methods, "restore" and "backup" in your root
folder by
pointing them at Extensions/backup.py -> restore
and
Extensions/backup.py -> backup.
After
creating the two external methods, protect each of them
with a
management-level permission.
To back
up your e-Solution, visit the "test" tab of the backup
external method. A file named
"e-Solution_backup.zexp" will be
downloaded to your local machine via your browser.
To
restore your e-solution, place the "e-Solution_backup.zexp"
file in
the "import" directory of your e-Solution instance, and
press the
"test" tab of the restore external method. Be careful,
this
overwrites anything that exists with the same name.
Note that
the "zexp" file created by 'backup' may not successfully
be
imported using the standard import feature, it needs to be
imported
via the "restore" external method.
Source file Extensions\backup.py :
import Globals
import os
from Acquisition import aq_base
from cStringIO import StringIO
from Globals import MessageDialog
from ZODB.PersistentMapping import PersistentMapping
def backup(self, REQUEST=None, download=1,
filename='e-Solution_backup.zexp'):
""" saves backup file to var or allows download of backup
file"""
if download: f = StringIO()
else: f
= os.path.join(Globals.data_dir, filename)
self.c = PersistentMapping()
for k, v in self.objectItems(): self.c[k] = aq_base(v)
get_transaction().commit()
self.c._p_jar.exportFile(self.c._p_oid, f)
del self.c
if download:
REQUEST.RESPONSE.setHeader('Content-type', 'application/data')
REQUEST.RESPONSE.setHeader('Content-Disposition',
'inline;filename=%s' %
filename)
return f.getvalue()
else:
return MessageDialog(
title="e-Solution backed up successfully",
message="<EM>All items in root</EM> sucessfully\
exported to <pre>%s</pre>." % f,
action="manage_main")
def restore(self, REQUEST=None, filename='e-Solution_backup.zexp'):
""" restores backup file from 'import' """
dirname, file=os.path.split(filename)
if dirname:
raise 'Bad Request', 'Invalid file name %s' %
filename
instance_home = INSTANCE_HOME
software_home = os.path.join(SOFTWARE_HOME, '..%s..'
% os.sep)
software_home = os.path.normpath(software_home)
for impath in (instance_home, software_home):
filepath = os.path.join(impath, 'import', filename)
if
os.path.exists(filepath):
break
else:
raise 'Bad Request', 'File does not exist: %s' %
filename
conn = self._p_jar
ob = conn.importFile(filepath)
for k, v in ob.items():
try:
self._delObject(k)
except AttributeError: pass
self._setObject(k, v)
return MessageDialog(
title="e-Solution restored successfully",
message="All items from <EM>%s</EM> sucessfully\
imported into <pre>root</pre>." % filepath,
action="manage_main")