RE: RE: DorothyLocker and Tool diff

"Garth T Kidd" <garth-OnzZ1s1DREKDegMON/[email protected]> Fri, 16 Jul 2004 08:03:39 +1000
Newsgroups gmane.comp.pythin.pyds.devel
Organization Deadly Bloody Serious
Message-ID <[email protected]>
This is a multi-part message in MIME format.

------=_NextPart_000_0185_01C46B0B.68D2E340
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

I liked the ``if _PyDS.verbose`` check when I saw it in CVS. 

Can we have ``pyds-win32`` debug automatically set verbose?  

The attached diff has the rest of the Wiki stuff; either I forgot to send it
in or Georg forgot to put it in. I can probably lose the debugging wrapper
for ``renderNodeOnline``, but the rest of it is pretty vital to make
WikiTool behave if you rename items, etc. 

Regards,
Garth. 

-----Original Message-----
From: pyds-dev-admin-iYtK5bfT9M//Ad8WF/[email protected]
[mailto:pyds-dev-admin-iYtK5bfT9M//Ad8WF/[email protected]] On Behalf Of Georg Bauer
Sent: Friday, 16 July 2004 12:12 AM
To: Garth T Kidd
Cc: pyds-dev-iYtK5bfT9M//Ad8WF/[email protected]
Subject: Re: [Pyds-dev] RE: DorothyLocker and Tool diff

Hi!

> One caveat I forgot to mention: DorothyLocker *is* complicated stuff, 
> and
> *might* induce more errors than it's worth. Georg, you might want to 
> make it optional rather than inbuilt.

Ok, I added your patch and made the self.lock = .... code dependend on
_PyDS.verbose - so if you start with -v, you will get your DorothyLocker, if
you start without, you will use standard RLock. I didn't test this, so if
something breaks with current CVS code, please tell the list.

bye, Georg


_______________________________________________
Pyds-dev mailing list
Pyds-dev-iYtK5bfT9M//Ad8WF/[email protected]
http://www.westfalen.de/cgi-bin/mailman/listinfo/pyds-dev

------=_NextPart_000_0185_01C46B0B.68D2E340
Content-Type: application/octet-stream;
	name="20040716-0757-wikitool.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="20040716-0757-wikitool.diff"

Index: PyDS/WikiTool.py
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /pyds/PyDS/PyDS/WikiTool.py,v
retrieving revision 1.25
diff -c -r1.25 WikiTool.py
*** PyDS/WikiTool.py	6 Jul 2004 08:30:36 -0000	1.25
--- PyDS/WikiTool.py	13 Jul 2004 06:24:04 -0000
***************
*** 571,577 ****
  			if not id:
  				id =3D ''
  			if oldid and text and oldid !=3D id:=20
! 				self.deleteNode(oldid, noRender=3D1) # the addNode will get it
  			if id and text:
  				id =3D self.addNode(id, title, text, template=3Dint(template))
  				return self.getUrl('show_html', id=3Dstr(id))
--- 571,577 ----
  			if not id:
  				id =3D ''
  			if oldid and text and oldid !=3D id:=20
! 				self.renameNode(oldid, id, renderNew=3D0)
  			if id and text:
  				id =3D self.addNode(id, title, text, template=3Dint(template))
  				return self.getUrl('show_html', id=3Dstr(id))
***************
*** 581,609 ****
  				else:
  					return self.getUrl('edit_html', errmsg=3D_('You need to give id =
and text!'))
 =20
! 	# this method deletes an existing node and drops the rendered output
! 	def deleteNode(self, id, noRender=3D0):
  		try:
  			self._acquire()
  			(idx, found) =3D self.nodes.locate({'id':id})
  			if found:
  				self.nodes.delete(idx)
  				self._commit()
! 				self.queue.append(
! 					self._deleteRenderedNode,
! 					id,
! 					None
! 				)
! 			return found
  		finally: self._release()
- 		meshTool =3D self.getToolByNamespace('mesh')
- 		meshTool.delItem(id, self)
- 		if not noRender:
- 			meshTool.renderItemsWithUnresolvedLinks()
 =20
  	def _deleteRenderedNode(self, id, dummy):
! 		mirror =3D self.getToolByNamespace('mirror')
  		self.deleteFile('%s.html' % id)
  		mirror.deleteItem(self, id)
 =20
  	# This method delivers the description of your preferences panels
--- 581,620 ----
  				else:
  					return self.getUrl('edit_html', errmsg=3D_('You need to give id =
and text!'))
 =20
! 	# this method renames an existing node
! 	def renameNode(self, id, newid, renderNew=3D1):=20
! 		self.logVerbose("Renaming Wiki node %s to %s", id, newid)
! 		try:
! 			self._acquire()
! 			(idx, found) =3D self.nodes.locate({'id':id})
! 			if found:
! 				self.unrenderNode(id)
! 				self.nodes[idx].id =3D newid
! 				self._commit()
! 				if renderNew:=20
! 					self.renderNode(newid)
! 				meshTool =3D self.getToolByNamespace('mesh')
! 				meshTool.renItem(id, self.name, newid)
! 		finally: self._release()
! =09
! 	# this method deletes an existing node
! 	def deleteNode(self, id):=20
! 		self.logVerbose("Deleting Wiki node %s", id)
  		try:
  			self._acquire()
  			(idx, found) =3D self.nodes.locate({'id':id})
  			if found:
  				self.nodes.delete(idx)
  				self._commit()
! 				self.unrenderNode(id)
! 			meshTool =3D self.getToolByNamespace('mesh')
! 			meshTool.delItem(id, self)
  		finally: self._release()
 =20
  	def _deleteRenderedNode(self, id, dummy):
! 		self.logVerbose("Deleting rendered output for Wiki node %s", id)
  		self.deleteFile('%s.html' % id)
+ 		mirror =3D self.getToolByNamespace('mirror')
  		mirror.deleteItem(self, id)
 =20
  	# This method delivers the description of your preferences panels
***************
*** 672,677 ****
--- 683,689 ----
  		categoryid, baseid =3D os.path.split(id)
  		macros =3D self.getToolByNamespace('macros')
  		hook =3D ''
+ 		renderjob =3D ()
  		try:
  			self._acquire()
  			pubtime =3D time.time()
***************
*** 691,697 ****
  					if template:
  						if not(oldtemplate):
  							self.unrenderNode(id)
! 					else: self.renderNode(id)
  			else: # NEW!
  				self.nodes.append({
  					'id': id,
--- 703,713 ----
  					if template:
  						if not(oldtemplate):
  							self.unrenderNode(id)
! 					else:=20
! 						self.renderNode(id)
! 						meshTool =3D self.getToolByNamespace('mesh')
! 						renderjob =3D (meshTool.renderInbound, (id, self))
!=20
  			else: # NEW!
  				self.nodes.append({
  					'id': id,
***************
*** 706,715 ****
  				if not(template):
  					self.renderNode(id)
  					meshTool =3D self.getToolByNamespace('mesh')
! 					meshTool.renderItemsWithUnresolvedLinks()
  			return id
  		finally:
  			self._release()
  			if hook and hasattr(macros, hook):
  				getattr(macros, hook)(id)
 =20
--- 722,734 ----
  				if not(template):
  					self.renderNode(id)
  					meshTool =3D self.getToolByNamespace('mesh')
! 					renderjob =3D (meshTool.renderItemsWithUnresolvedLinks, ())
  			return id
  		finally:
  			self._release()
+ 			if renderjob:=20
+ 				method, args =3D renderjob
+ 				method(*args)
  			if hook and hasattr(macros, hook):
  				getattr(macros, hook)(id)
 =20
***************
*** 722,737 ****
 =20
  	# this method renders a single page in the background.
  	def renderNode(self, id):
  		self.queue.append(self.renderNodeOnline, (id,), None)
  		return self.queue.length()
 =20
  	# this method removes the rendered output of a node in the background
  	def unrenderNode(self, id):
  		self.queue.append(self._deleteRenderedNode, id, None)
  		return self.queue.length()
 =20
  	# this method renders a single page, but does it online (not queued)
! 	def renderNodeOnline(self, key, data):
  		(id,) =3D key
  		mirror =3D self.getToolByNamespace('mirror')
  		node =3D self.getNode(id=3Did)
--- 741,782 ----
 =20
  	# this method renders a single page in the background.
  	def renderNode(self, id):
+ 		self.logVerbose("Queueing render for Wiki node %s", id)
  		self.queue.append(self.renderNodeOnline, (id,), None)
  		return self.queue.length()
 =20
  	# this method removes the rendered output of a node in the background
  	def unrenderNode(self, id):
+ 		self.logVerbose("Queueing unrender for Wiki node %s", id)
  		self.queue.append(self._deleteRenderedNode, id, None)
  		return self.queue.length()
 =20
  	# this method renders a single page, but does it online (not queued)
! 	def renderNodeOnline(self, key, data):=20
! 		import time
! 		(id,) =3D key
! 		try:=20
! 			self.logVerbose("Rendering Wiki node %s", id)
! 			begin =3D time.time()
! 			result =3D self.__renderNodeOnline(key, data)
! 			duration =3D time.time() - begin
! 			self.logVerbose("%s rendered in %.3fs", id, duration)
! 		except:
! 			import traceback
! 			(e, d, tb) =3D sys.exc_info()
! 			msg =3D _('Background thread exception %s: %s') % (e, d)
! 			try:=20
! 				msg +=3D _('Exception instance __dict__: %s') % =
(repr(d.__dict__),)
! 			except:=20
! 				pass
! 			msg +=3D '<br><br>'
!=20
! 			for row in traceback.extract_tb(tb):
! 				(file, line, function, source) =3D row
! 				msg +=3D '<br>%s[%s] in %s' % (file, line, function)
! 			self.logError(msg.replace('%', '%%'))
!=20
! 	def __renderNodeOnline(self, key, data):
  		(id,) =3D key
  		mirror =3D self.getToolByNamespace('mirror')
  		node =3D self.getNode(id=3Did)

------=_NextPart_000_0185_01C46B0B.68D2E340--