annotate examples/trac/trac/wiki/web_ui.py @ 39:93b4dcbafd7b trunk

Copy Trac to main branch.
author cmlenz
date Mon, 03 Jul 2006 18:53:27 +0000
parents
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2003-2006 Edgewall Software
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2003-2005 Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 # Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 # All rights reserved.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 # This software is licensed as described in the file COPYING, which
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 # you should have received as part of this distribution. The terms
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10 # are also available at http://trac.edgewall.com/license.html.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 # This software consists of voluntary contributions made by many
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13 # individuals. For the exact contribution history, see the revision
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 # history and logs, available at http://projects.edgewall.com/trac/.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 #
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 # Author: Jonas Borgström <jonas@edgewall.com>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17 # Christopher Lenz <cmlenz@gmx.de>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 import os
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 import re
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 import StringIO
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 from trac.attachment import attachments_to_hdf, Attachment, AttachmentModule
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 from trac.core import *
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25 from trac.perm import IPermissionRequestor
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 from trac.Search import ISearchSource, search_to_sql, shorten_result
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 from trac.Timeline import ITimelineEventProvider
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 from trac.util import get_reporter_id
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 from trac.util.datefmt import format_datetime, pretty_timedelta
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30 from trac.util.text import shorten_line
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 from trac.util.markup import html, Markup
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 from trac.versioncontrol.diff import get_diff_options, hdf_diff
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34 from trac.web import HTTPNotFound, IRequestHandler
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 from trac.wiki.api import IWikiPageManipulator, WikiSystem
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 from trac.wiki.model import WikiPage
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 from trac.wiki.formatter import wiki_to_html, wiki_to_oneliner
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 from trac.mimeview.api import Mimeview, IContentConverter
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 class InvalidWikiPage(TracError):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 """Exception raised when a Wiki page fails validation."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 class WikiModule(Component):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 implements(INavigationContributor, IPermissionRequestor, IRequestHandler,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 ITimelineEventProvider, ISearchSource, IContentConverter)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 page_manipulators = ExtensionPoint(IWikiPageManipulator)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 # IContentConverter methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 def get_supported_conversions(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 yield ('txt', 'Plain Text', 'txt', 'text/x-trac-wiki', 'text/plain', 9)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 def convert_content(self, req, mimetype, content, key):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 return (content, 'text/plain;charset=utf-8')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 # INavigationContributor methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61 def get_active_navigation_item(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 return 'wiki'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64 def get_navigation_items(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 if not req.perm.has_permission('WIKI_VIEW'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 yield ('mainnav', 'wiki',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68 html.A('Wiki', href=req.href.wiki(), accesskey=1))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 yield ('metanav', 'help',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70 html.A('Help/Guide', href=req.href.wiki('TracGuide'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 accesskey=6))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73 # IPermissionRequestor methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 def get_permission_actions(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 actions = ['WIKI_CREATE', 'WIKI_DELETE', 'WIKI_MODIFY', 'WIKI_VIEW']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 return actions + [('WIKI_ADMIN', actions)]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79 # IRequestHandler methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 def match_request(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82 match = re.match(r'^/wiki(?:/(.*))?', req.path_info)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 if match:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 if match.group(1):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85 req.args['page'] = match.group(1)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 return 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 def process_request(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 action = req.args.get('action', 'view')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 pagename = req.args.get('page', 'WikiStart')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91 version = req.args.get('version')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 if pagename.endswith('/'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 req.redirect(req.href.wiki(pagename.strip('/')))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 page = WikiPage(self.env, pagename, version, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 add_stylesheet(req, 'common/css/wiki.css')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 if req.method == 'POST':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102 if action == 'edit':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 latest_version = WikiPage(self.env, pagename, None, db).version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 if req.args.has_key('cancel'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 req.redirect(req.href.wiki(page.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106 elif int(version) != latest_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 action = 'collision'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 self._render_editor(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 elif req.args.has_key('preview'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 action = 'preview'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 self._render_editor(req, db, page, preview=True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 self._do_save(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 elif action == 'delete':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115 self._do_delete(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 elif action == 'diff':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 get_diff_options(req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 req.redirect(req.href.wiki(page.name, version=page.version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 action='diff'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 elif action == 'delete':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121 self._render_confirm(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122 elif action == 'edit':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 self._render_editor(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124 elif action == 'diff':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 self._render_diff(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 elif action == 'history':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 self._render_history(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129 format = req.args.get('format')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 if format:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 Mimeview(self.env).send_converted(req, 'text/x-trac-wiki',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 page.text, format, page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 self._render_view(req, db, page)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 req.hdf['wiki.action'] = action
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 req.hdf['wiki.current_href'] = req.href.wiki(page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 return 'wiki.cs', None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 # ITimelineEventProvider methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 def get_timeline_filters(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 if req.perm.has_permission('WIKI_VIEW'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143 yield ('wiki', 'Wiki changes')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 def get_timeline_events(self, req, start, stop, filters):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 if 'wiki' in filters:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 wiki = WikiSystem(self.env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148 format = req.args.get('format')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 href = format == 'rss' and req.abs_href or req.href
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 cursor.execute("SELECT time,name,comment,author,version "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 "FROM wiki WHERE time>=%s AND time<=%s",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 (start, stop))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 for t,name,comment,author,version in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 title = Markup('<em>%s</em> edited by %s',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157 wiki.format_page_name(name), author)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158 diff_link = html.A('diff', href=href.wiki(name, action='diff',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 version=version))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 if format == 'rss':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 comment = wiki_to_html(comment or '--', self.env, req, db,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 absurls=True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 comment = wiki_to_oneliner(comment, self.env, db,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 shorten=True)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 if version > 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 comment = Markup('%s (%s)', comment, diff_link)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 yield 'wiki', href.wiki(name), title, t, author, comment
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170 # Attachments
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 def display(id):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 return Markup('ticket ', html.EM('#', id))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 att = AttachmentModule(self.env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 for event in att.get_timeline_events(req, db, 'wiki', format,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175 start, stop,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 lambda id: html.EM(id)):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 yield event
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 # Internal methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 def _set_title(self, req, page, action):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182 title = name = WikiSystem(self.env).format_page_name(page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 if action:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 title += ' (%s)' % action
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 req.hdf['wiki.page_name'] = name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 req.hdf['title'] = title
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187 return title
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 def _do_delete(self, req, db, page):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 if page.readonly:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 req.perm.assert_permission('WIKI_ADMIN')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 req.perm.assert_permission('WIKI_DELETE')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 if req.args.has_key('cancel'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 req.redirect(req.href.wiki(page.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 version = int(req.args.get('version', 0)) or None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 old_version = int(req.args.get('old_version', 0)) or version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 if version and old_version and version > old_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 # delete from `old_version` exclusive to `version` inclusive:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 for v in range(old_version, version):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 page.delete(v + 1, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 # only delete that `version`, or the whole page if `None`
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 page.delete(version, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 db.commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 if not page.exists:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 req.redirect(req.href.wiki())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 req.redirect(req.href.wiki(page.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 def _do_save(self, req, db, page):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 if page.readonly:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 req.perm.assert_permission('WIKI_ADMIN')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 elif not page.exists:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 req.perm.assert_permission('WIKI_CREATE')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 req.perm.assert_permission('WIKI_MODIFY')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 page.text = req.args.get('text')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 if req.perm.has_permission('WIKI_ADMIN'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 # Modify the read-only flag if it has been changed and the user is
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 # WIKI_ADMIN
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227 page.readonly = int(req.args.has_key('readonly'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 # Give the manipulators a pass at post-processing the page
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 for manipulator in self.page_manipulators:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 for field, message in manipulator.validate_wiki_page(req, page):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 if field:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 raise InvalidWikiPage("The Wiki page field %s is invalid: %s"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234 % (field, message))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 raise InvalidWikiPage("Invalid Wiki page: %s" % message)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 page.save(get_reporter_id(req, 'author'), req.args.get('comment'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 req.remote_addr)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 req.redirect(req.href.wiki(page.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242 def _render_confirm(self, req, db, page):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243 if page.readonly:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 req.perm.assert_permission('WIKI_ADMIN')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 req.perm.assert_permission('WIKI_DELETE')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 version = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 if req.args.has_key('delete_version'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250 version = int(req.args.get('version', 0))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 old_version = int(req.args.get('old_version', 0)) or version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 self._set_title(req, page, 'delete')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254 req.hdf['wiki'] = {'mode': 'delete'}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255 if version is not None:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256 num_versions = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257 for v,t,author,comment,ipnr in page.get_history():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258 if v >= old_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259 num_versions += 1;
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260 if num_versions > 1:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262 req.hdf['wiki'] = {'version': version, 'old_version': old_version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263 'only_version': num_versions == 1}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 def _render_diff(self, req, db, page):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266 req.perm.assert_permission('WIKI_VIEW')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 if not page.exists:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269 raise TracError("Version %s of page %s does not exist" %
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270 (req.args.get('version'), page.name))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
271
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
272 add_stylesheet(req, 'common/css/diff.css')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
273
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
274 self._set_title(req, page, 'diff')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
275
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
276 # Ask web spiders to not index old versions
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
277 req.hdf['html.norobots'] = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
278
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
279 old_version = req.args.get('old_version')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
280 if old_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
281 old_version = int(old_version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
282 if old_version == page.version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
283 old_version = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
284 elif old_version > page.version: # FIXME: what about reverse diffs?
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
285 old_version, page = page.version, \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
286 WikiPage(self.env, page.name, old_version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
287 latest_page = WikiPage(self.env, page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
288 new_version = int(page.version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
289 info = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
290 'version': new_version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
291 'latest_version': latest_page.version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
292 'history_href': req.href.wiki(page.name, action='history')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
293 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
294
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
295 num_changes = 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
296 old_page = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
297 prev_version = next_version = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
298 for version,t,author,comment,ipnr in latest_page.get_history():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
299 if version == new_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
300 if t:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
301 info['time'] = format_datetime(t)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
302 info['time_delta'] = pretty_timedelta(t)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
303 info['author'] = author or 'anonymous'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
304 info['comment'] = wiki_to_html(comment or '--',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
305 self.env, req, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
306 info['ipnr'] = ipnr or ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
307 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
308 if version < new_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
309 num_changes += 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
310 if not prev_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
311 prev_version = version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
312 if (old_version and version == old_version) or \
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
313 not old_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
314 old_page = WikiPage(self.env, page.name, version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
315 info['num_changes'] = num_changes
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
316 info['old_version'] = version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
317 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
318 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
319 next_version = version
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
320 req.hdf['wiki'] = info
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
321
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
322 # -- prev/next links
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
323 if prev_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
324 add_link(req, 'prev', req.href.wiki(page.name, action='diff',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
325 version=prev_version),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
326 'Version %d' % prev_version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
327 if next_version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
328 add_link(req, 'next', req.href.wiki(page.name, action='diff',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
329 version=next_version),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
330 'Version %d' % next_version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
331
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
332 # -- text diffs
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
333 diff_style, diff_options = get_diff_options(req)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
334
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
335 oldtext = old_page and old_page.text.splitlines() or []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
336 newtext = page.text.splitlines()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
337 context = 3
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
338 for option in diff_options:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
339 if option.startswith('-U'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
340 context = int(option[2:])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
341 break
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
342 if context < 0:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
343 context = None
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
344 changes = hdf_diff(oldtext, newtext, context=context,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
345 ignore_blank_lines='-B' in diff_options,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
346 ignore_case='-i' in diff_options,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
347 ignore_space_changes='-b' in diff_options)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
348 req.hdf['wiki.diff'] = changes
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
349
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
350 def _render_editor(self, req, db, page, preview=False):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
351 req.perm.assert_permission('WIKI_MODIFY')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
352
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
353 if req.args.has_key('text'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
354 page.text = req.args.get('text')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
355 if preview:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
356 page.readonly = req.args.has_key('readonly')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
357
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
358 author = get_reporter_id(req, 'author')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
359 comment = req.args.get('comment', '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
360 editrows = req.args.get('editrows')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
361 if editrows:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
362 pref = req.session.get('wiki_editrows', '20')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
363 if editrows != pref:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
364 req.session['wiki_editrows'] = editrows
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
365 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
366 editrows = req.session.get('wiki_editrows', '20')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
367
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
368 self._set_title(req, page, 'edit')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
369 info = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
370 'page_source': page.text,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
371 'version': page.version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
372 'author': author,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
373 'comment': comment,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
374 'readonly': page.readonly,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
375 'edit_rows': editrows,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
376 'scroll_bar_pos': req.args.get('scroll_bar_pos', '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
377 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
378 if page.exists:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
379 info['history_href'] = req.href.wiki(page.name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
380 action='history')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
381 info['last_change_href'] = req.href.wiki(page.name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
382 action='diff',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
383 version=page.version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
384 if preview:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
385 info['page_html'] = wiki_to_html(page.text, self.env, req, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
386 info['comment_html'] = wiki_to_oneliner(comment, self.env, req, db)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
387 info['readonly'] = int(req.args.has_key('readonly'))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
388 req.hdf['wiki'] = info
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
389
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
390 def _render_history(self, req, db, page):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
391 """Extract the complete history for a given page and stores it in the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
392 HDF.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
393
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
394 This information is used to present a changelog/history for a given
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
395 page.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
396 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
397 req.perm.assert_permission('WIKI_VIEW')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
398
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
399 if not page.exists:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
400 raise TracError, "Page %s does not exist" % page.name
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
401
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
402 self._set_title(req, page, 'history')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
403
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
404 history = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
405 for version, t, author, comment, ipnr in page.get_history():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
406 history.append({
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
407 'url': req.href.wiki(page.name, version=version),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
408 'diff_url': req.href.wiki(page.name, version=version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
409 action='diff'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
410 'version': version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
411 'time': format_datetime(t),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
412 'time_delta': pretty_timedelta(t),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
413 'author': author,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
414 'comment': wiki_to_oneliner(comment or '', self.env, db),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
415 'ipaddr': ipnr
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
416 })
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
417 req.hdf['wiki.history'] = history
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
418
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
419 def _render_view(self, req, db, page):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
420 req.perm.assert_permission('WIKI_VIEW')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
421
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
422 page_name = self._set_title(req, page, '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
423 if page.name == 'WikiStart':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
424 req.hdf['title'] = ''
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
425
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
426 version = req.args.get('version')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
427 if version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
428 # Ask web spiders to not index old versions
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
429 req.hdf['html.norobots'] = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
430
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
431 # Add registered converters
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
432 for conversion in Mimeview(self.env).get_supported_conversions(
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
433 'text/x-trac-wiki'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
434 conversion_href = req.href.wiki(page.name, version=version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
435 format=conversion[0])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
436 add_link(req, 'alternate', conversion_href, conversion[1],
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
437 conversion[3])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
438
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
439 latest_page = WikiPage(self.env, page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
440 req.hdf['wiki'] = {'exists': page.exists,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
441 'version': page.version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
442 'latest_version': latest_page.version,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
443 'readonly': page.readonly}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
444 if page.exists:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
445 req.hdf['wiki'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
446 'page_html': wiki_to_html(page.text, self.env, req),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
447 'history_href': req.href.wiki(page.name, action='history'),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
448 'last_change_href': req.href.wiki(page.name, action='diff',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
449 version=page.version)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
450 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
451 if version:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
452 req.hdf['wiki'] = {
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
453 'comment_html': wiki_to_oneliner(page.comment or '--',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
454 self.env, db),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
455 'author': page.author,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
456 'age': pretty_timedelta(page.time)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
457 }
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
458 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
459 if not req.perm.has_permission('WIKI_CREATE'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
460 raise HTTPNotFound('Page %s not found', page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
461 req.hdf['wiki.page_html'] = html.P('Describe "%s" here' % page_name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
462
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
463 # Show attachments
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
464 req.hdf['wiki.attachments'] = attachments_to_hdf(self.env, req, db,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
465 'wiki', page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
466 if req.perm.has_permission('WIKI_MODIFY'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
467 attach_href = req.href.attachment('wiki', page.name)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
468 req.hdf['wiki.attach_href'] = attach_href
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
469
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
470 # ISearchSource methods
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
471
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
472 def get_search_filters(self, req):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
473 if req.perm.has_permission('WIKI_VIEW'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
474 yield ('wiki', 'Wiki')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
475
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
476 def get_search_results(self, req, terms, filters):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
477 if not 'wiki' in filters:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
478 return
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
479 db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
480 sql_query, args = search_to_sql(db, ['w1.name', 'w1.author', 'w1.text'], terms)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
481 cursor = db.cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
482 cursor.execute("SELECT w1.name,w1.time,w1.author,w1.text "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
483 "FROM wiki w1,"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
484 "(SELECT name,max(version) AS ver "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
485 "FROM wiki GROUP BY name) w2 "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
486 "WHERE w1.version = w2.ver AND w1.name = w2.name "
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
487 "AND " + sql_query, args)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
488
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
489 for name, date, author, text in cursor:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
490 yield (req.href.wiki(name), '%s: %s' % (name, shorten_line(text)),
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
491 date, author, shorten_result(text, terms))
Copyright (C) 2012-2017 Edgewall Software