Mercurial > genshi > mirror
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