Christian Boos wrote:
> Erik Bray wrote:
>
>> ...
>> Much, much nicer than having to write:
>> def _foo(self, env, db=None):
>> ...
>> def foo(self, env, db=None):
>> transaction(env, db, self._foo)
>>
>> over and over and over again...
>>
>>
>
> Not really. If you look carefully at the changeset, you'll see that the
> _foo and foo methods aren't the same.
> The foo (like "delete") does a transaction, then notifies the listeners
> (and that needs to be outside the transaction).
>
> However, this is not the final form, it can be simplified further.
> I only used a secondary foo_ method in order to minimize the changes to
> model.py, something wise to do for branches...
>
> The final form will look something like:
>
Well, after some actual testing:
def delete(self, version=None, db=None):
assert self.exists, 'Cannot delete non-existent page'
def do_delete(db):
cursor = db.cursor()
...
transaction(self.env, db, do_delete)
# Let change listeners know about the deletion
if not self.exists:
...
That's as clean as it can get, IMO.
-- Christian
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Trac
Development" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/trac-dev?hl=en
-~----------~----~----~----~------~----~------~--~---
Index: trac/wiki/model.py
===================================================================
--- trac/wiki/model.py (revision 7336)
+++ trac/wiki/model.py (working copy)
@@ -82,8 +82,28 @@
def delete(self, version=None, db=None):
assert self.exists, 'Cannot delete non-existent page'
- transaction(self.env, db, self._delete, version)
+ def do_delete(db):
+ cursor = db.cursor()
+ if version is None:
+ # Delete a wiki page completely
+ cursor.execute("DELETE FROM wiki WHERE name=%s", (self.name,))
+ self.env.log.info('Deleted page %s' % self.name)
+ else:
+ # Delete only a specific page version
+ cursor.execute("DELETE FROM wiki WHERE name=%s and version=%s",
+ (self.name, version))
+ self.env.log.info('Deleted version %d of page %s'
+ % (version, self.name))
+ if version is None or version == self.version:
+ self._fetch(self.name, None, db)
+
+ if not self.exists:
+ from trac.attachment import Attachment
+ # Delete orphaned attachments
+ Attachment.delete_all(self.env, 'wiki', self.name, db)
+ transaction(self.env, db, do_delete)
+
# Let change listeners know about the deletion
if not self.exists:
for listener in WikiSystem(self.env).change_listeners:
@@ -93,27 +113,6 @@
if hasattr(listener, 'wiki_page_version_deleted'):
listener.wiki_page_version_deleted(self)
- def _delete(self, db, version):
- cursor = db.cursor()
- if version is None:
- # Delete a wiki page completely
- cursor.execute("DELETE FROM wiki WHERE name=%s", (self.name,))
- self.env.log.info('Deleted page %s' % self.name)
- else:
- # Delete only a specific page version
- cursor.execute("DELETE FROM wiki WHERE name=%s and version=%s",
- (self.name, version))
- self.env.log.info('Deleted version %d of page %s'
- % (version, self.name))
-
- if version is None or version == self.version:
- self._fetch(self.name, None, db)
-
- if not self.exists:
- from trac.attachment import Attachment
- # Delete orphaned attachments
- Attachment.delete_all(self.env, 'wiki', self.name, db)
-
def rename(self, new_name, db=None):
"""Rename wiki page in-place, keeping the history intact.
@@ -128,30 +127,49 @@
if other.exists:
raise TracError(_("Can't rename to existing %(new_name)s page.",
new_name=new_name))
- transaction(self.env, db, self._rename, new_name)
+ def do_rename(db):
+ old_name = self.name
+ self.name = new_name
+ cursor = db.cursor()
+ cursor.execute("UPDATE wiki SET name=%s WHERE name=%s",
+ (new_name, old_name))
+ self.env.log.info('Renamed page %s in-place' % self.name)
+
+ self._fetch(self.name, None, db)
+
+ from trac.attachment import Attachment
+ # Also rename attachments
+ Attachment.reparent_all(self.env, 'wiki', old_name,
+ 'wiki', new_name, db)
+ transaction(self.env, db, do_rename)
+
for listener in WikiSystem(self.env).change_listeners:
if hasattr(listener, 'wiki_page_renamed'):
listener.wiki_page_renamed(self, old_name)
- def _rename(self, db, new_name):
- old_name = self.name
- self.name = new_name
-
- cursor = db.cursor()
- cursor.execute("UPDATE wiki SET name=%s WHERE name=%s",
- (new_name, old_name))
- self.env.log.info('Renamed page %s in-place' % self.name)
-
- self._fetch(self.name, None, db)
-
- from trac.attachment import Attachment
- # Also rename attachments
- Attachment.reparent_all(self.env, 'wiki', old_name, 'wiki', new_name,
- db)
-
def save(self, author, comment, remote_addr, t=None, db=None):
- transaction(self.env, db, self._save, author, comment, remote_addr, t)
+ def do_save(db):
+ changed = t
+ if changed is None:
+ changed = datetime.now(utc)
+
+ if self.text != self.old_text:
+ cursor = db.cursor()
+ cursor.execute("INSERT INTO wiki (name,version,time,author,"
+ "ipnr,text,comment,readonly) "
+ "VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",
+ (self.name, self.version + 1,
+ to_timestamp(changed), author, remote_addr,
+ self.text, comment, self.readonly))
+ self.version += 1
+ elif self.readonly != self.old_readonly:
+ cursor = db.cursor()
+ cursor.execute("UPDATE wiki SET readonly=%s WHERE name=%s",
+ (self.readonly, self.name))
+ else:
+ raise TracError(_('Page not modified'))
+ transaction(self.env, db, do_save)
for listener in WikiSystem(self.env).change_listeners:
if self.version == 1:
listener.wiki_page_added(self)
@@ -162,25 +180,6 @@
self.old_readonly = self.readonly
self.old_text = self.text
- def _save(self, db, author, comment, remote_addr, t):
- if t is None:
- t = datetime.now(utc)
-
- if self.text != self.old_text:
- cursor = db.cursor()
- cursor.execute("INSERT INTO wiki (name,version,time,author,ipnr,"
- "text,comment,readonly) VALUES (%s,%s,%s,%s,%s,%s,"
- "%s,%s)", (self.name, self.version + 1,
- to_timestamp(t), author, remote_addr,
- self.text, comment, self.readonly))
- self.version += 1
- elif self.readonly != self.old_readonly:
- cursor = db.cursor()
- cursor.execute("UPDATE wiki SET readonly=%s WHERE name=%s",
- (self.readonly, self.name))
- else:
- raise TracError(_('Page not modified'))
-
def get_history(self, db=None):
if not db:
db = self.env.get_db_cnx()