Skip to content

Commit 6c74f37

Browse files
author
Richard Jones
committed
Part-way to having the metakit backend handle "content" property changes.
1 parent 9ffe88b commit 6c74f37

File tree

1 file changed

+41
-32
lines changed

1 file changed

+41
-32
lines changed

roundup/backends/back_metakit.py

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $Id: back_metakit.py,v 1.64 2004-03-19 04:58:52 richard Exp $
1+
# $Id: back_metakit.py,v 1.65 2004-03-19 05:27:55 richard Exp $
22
'''Metakit backend for Roundup, originally by Gordon McMillan.
33
44
Known Current Bugs:
@@ -448,7 +448,7 @@ def create(self, **propvalues):
448448
raise ValueError, "Need something to create!"
449449
self.fireAuditors('create', None, propvalues)
450450
newid = self.create_inner(**propvalues)
451-
# self.set() (called in self.create_inner()) does reactors)
451+
self.fireReactors('create', newid, None)
452452
return newid
453453

454454
def create_inner(self, **propvalues):
@@ -524,14 +524,17 @@ class or a KeyError is raised.
524524
If the value of a Link or Multilink property contains an invalid
525525
node id, a ValueError is raised.
526526
'''
527+
self.fireAuditors('set', nodeid, propvalues)
528+
propvalues, oldnode = self.set_inner(nodeid, **propvalues)
529+
self.fireReactors('set', nodeid, oldnode)
530+
531+
def set_inner(self, nodeid, **propvalues):
532+
'''Called outside of auditors'''
527533
isnew = 0
528534
if propvalues.has_key('#ISNEW'):
529535
isnew = 1
530536
del propvalues['#ISNEW']
531-
if not isnew:
532-
self.fireAuditors('set', nodeid, propvalues)
533-
if not propvalues:
534-
return propvalues
537+
535538
if propvalues.has_key('id'):
536539
raise KeyError, '"id" is reserved'
537540
if self.db.journaltag is None:
@@ -763,7 +766,7 @@ class or a KeyError is raised.
763766

764767
# nothing to do?
765768
if not propvalues:
766-
return propvalues
769+
return propvalues, oldnode
767770
if not propvalues.has_key('activity'):
768771
row.activity = int(time.time())
769772
if not propvalues.has_key('actor'):
@@ -775,15 +778,14 @@ class or a KeyError is raised.
775778
row.creator = int(self.db.getuid())
776779

777780
self.db.dirty = 1
781+
778782
if self.do_journal:
779783
if isnew:
780-
self.db.addjournal(self.classname, nodeid, _CREATE, {})
781-
self.fireReactors('create', nodeid, None)
784+
self.db.addjournal(self.classname, nodeid, _CREATE, changes)
782785
else:
783786
self.db.addjournal(self.classname, nodeid, _SET, changes)
784-
self.fireReactors('set', nodeid, oldnode)
785787

786-
return propvalues
788+
return propvalues, oldnode
787789

788790
def retire(self, nodeid):
789791
'''Retire a node.
@@ -1718,44 +1720,51 @@ def __init__(self, db, classname, **properties):
17181720
properties['type'] = hyperdb.String()
17191721
Class.__init__(self, db, classname, **properties)
17201722

1723+
def gen_filename(self, nodeid):
1724+
nm = '%s%s' % (self.classname, nodeid)
1725+
sd = str(int(int(nodeid) / 1000))
1726+
d = os.path.join(self.db.config.DATABASE, 'files', self.classname, sd)
1727+
if not os.path.exists(d):
1728+
os.makedirs(d)
1729+
return os.path.join(d, nm)
1730+
17211731
def get(self, nodeid, propname, default=_marker, cache=1):
1722-
x = Class.get(self, nodeid, propname, default)
1723-
poss_msg = 'Possibly an access right configuration problem.'
17241732
if propname == 'content':
1725-
if x.startswith('file:'):
1726-
fnm = x[5:]
1727-
try:
1728-
f = open(fnm, 'rb')
1729-
except IOError, (strerror):
1730-
# XXX by catching this we donot see an error in the log.
1731-
return 'ERROR reading file: %s%s\n%s\n%s'%(
1732-
self.classname, nodeid, poss_msg, strerror)
1733-
x = f.read()
1734-
f.close()
1733+
poss_msg = 'Possibly an access right configuration problem.'
1734+
fnm = self.gen_filename(nodeid)
1735+
try:
1736+
f = open(fnm, 'rb')
1737+
except IOError, (strerror):
1738+
# XXX by catching this we donot see an error in the log.
1739+
return 'ERROR reading file: %s%s\n%s\n%s'%(
1740+
self.classname, nodeid, poss_msg, strerror)
1741+
x = f.read()
1742+
f.close()
1743+
else:
1744+
x = Class.get(self, nodeid, propname, default)
17351745
return x
17361746

17371747
def create(self, **propvalues):
17381748
if not propvalues:
17391749
raise ValueError, "Need something to create!"
17401750
self.fireAuditors('create', None, propvalues)
1751+
17411752
content = propvalues['content']
17421753
del propvalues['content']
1754+
17431755
newid = Class.create_inner(self, **propvalues)
17441756
if not content:
17451757
return newid
1746-
nm = bnm = '%s%s' % (self.classname, newid)
1747-
sd = str(int(int(newid) / 1000))
1748-
d = os.path.join(self.db.config.DATABASE, 'files', self.classname, sd)
1749-
if not os.path.exists(d):
1750-
os.makedirs(d)
1751-
nm = os.path.join(d, nm)
1758+
1759+
# figure a filename
1760+
nm = self.gen_filename(newid)
17521761
open(nm, 'wb').write(content)
1753-
self.set(newid, content = 'file:'+nm)
1762+
17541763
mimetype = propvalues.get('type', self.default_mime_type)
17551764
self.db.indexer.add_text((self.classname, newid, 'content'), content,
17561765
mimetype)
1757-
def undo(fnm=nm, action1=os.remove, indexer=self.db.indexer):
1758-
action1(fnm)
1766+
def undo(fnm=nm):
1767+
os.remove(fnm)
17591768
self.rollbackaction(undo)
17601769
return newid
17611770

0 commit comments

Comments
 (0)