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()

Reply via email to