diff examples/trac/trac/wiki/model.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/examples/trac/trac/wiki/model.py
@@ -0,0 +1,158 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2003-2005 Edgewall Software
+# Copyright (C) 2003-2005 Jonas Borgström <jonas@edgewall.com>
+# Copyright (C) 2005 Christopher Lenz <cmlenz@gmx.de>
+# All rights reserved.
+#
+# This software is licensed as described in the file COPYING, which
+# you should have received as part of this distribution. The terms
+# are also available at http://trac.edgewall.com/license.html.
+#
+# This software consists of voluntary contributions made by many
+# individuals. For the exact contribution history, see the revision
+# history and logs, available at http://projects.edgewall.com/trac/.
+#
+# Author: Jonas Borgström <jonas@edgewall.com>
+#         Christopher Lenz <cmlenz@gmx.de>
+
+import time
+
+from trac.core import *
+from trac.wiki.api import WikiSystem
+
+
+class WikiPage(object):
+    """Represents a wiki page (new or existing)."""
+
+    def __init__(self, env, name=None, version=None, db=None):
+        self.env = env
+        self.name = name
+        if name:
+            self._fetch(name, version, db)
+        else:
+            self.version = 0
+            self.text = ''
+            self.readonly = 0
+        self.old_text = self.text
+        self.old_readonly = self.readonly
+
+    def _fetch(self, name, version=None, db=None):
+        if not db:
+            db = self.env.get_db_cnx()
+        cursor = db.cursor()
+        if version:
+            cursor.execute("SELECT version,time,author,text,comment,readonly "
+                           "FROM wiki "
+                           "WHERE name=%s AND version=%s",
+                           (name, int(version)))
+        else:
+            cursor.execute("SELECT version,time,author,text,comment,readonly "
+                           "FROM wiki "
+                           "WHERE name=%s ORDER BY version DESC LIMIT 1",
+                           (name,))
+        row = cursor.fetchone()
+        if row:
+            version,time,author,text,comment,readonly = row
+            self.version = int(version)
+            self.author = author
+            self.time = time
+            self.text = text
+            self.comment = comment
+            self.readonly = readonly and int(readonly) or 0
+        else:
+            self.version = 0
+            self.text = self.comment = self.author = ''
+            self.time = self.readonly = 0
+
+    exists = property(fget=lambda self: self.version > 0)
+
+    def delete(self, version=None, db=None):
+        assert self.exists, 'Cannot delete non-existent page'
+        if not db:
+            db = self.env.get_db_cnx()
+            handle_ta = True
+        else:
+            handle_ta = False
+
+        page_deleted = False
+        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
+            for attachment in Attachment.select(self.env, 'wiki', self.name, db):
+                attachment.delete(db)
+
+        if handle_ta:
+            db.commit()
+
+        # Let change listeners know about the deletion
+        if not self.exists:
+            for listener in WikiSystem(self.env).change_listeners:
+                listener.wiki_page_deleted(self)
+        else:
+            for listener in WikiSystem(self.env).change_listeners:
+                if hasattr(listener, 'wiki_page_version_deleted'):
+                    listener.wiki_page_version_deleted(self)
+
+
+    def save(self, author, comment, remote_addr, t=None, db=None):
+        if not db:
+            db = self.env.get_db_cnx()
+            handle_ta = True
+        else:
+            handle_ta = False
+
+        if t is None:
+            t = time.time()
+
+        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, 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')
+
+        if handle_ta:
+            db.commit()
+
+        for listener in WikiSystem(self.env).change_listeners:
+            if self.version == 1:
+                listener.wiki_page_added(self)
+            else:
+                listener.wiki_page_changed(self, self.version, t, comment,
+                                           author, remote_addr)
+
+        self.old_readonly = self.readonly
+        self.old_text = self.text
+
+    def get_history(self, db=None):
+        if not db:
+            db = self.env.get_db_cnx()
+        cursor = db.cursor()
+        cursor.execute("SELECT version,time,author,comment,ipnr FROM wiki "
+                       "WHERE name=%s AND version<=%s "
+                       "ORDER BY version DESC", (self.name, self.version))
+        for version,time,author,comment,ipnr in cursor:
+            yield version,time,author,comment,ipnr
Copyright (C) 2012-2017 Edgewall Software