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
44Known 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