Ticket #2974: pdf_attachment_browser.diff
| File pdf_attachment_browser.diff, 19.7 KB (added by cboos, 3 years ago) |
|---|
-
trac/attachment.py
79 79 path = property(_get_path) 80 80 81 81 def href(self, req, *args, **dict): 82 return req.href.attachment(self.parent_type, self.parent_id, 83 self.filename, *args, **dict) 82 base, filename = 'attachment', self.filename 83 if 'format' in dict: 84 format = dict.pop('format') 85 base += ';format=' + format # format passed in a segment parameter 86 else: # HTML preview 87 format = 'html' 88 if format != 'raw': 89 filename += '.' + format 90 return req.href(base, self.parent_type, self.parent_id, filename, 91 *args, **dict) 84 92 85 93 def parent_href(self, req): 86 94 return req.href(self.parent_type, self.parent_id) … … 250 258 # IRequestHandler methods 251 259 252 260 def match_request(self, req): 253 match = re.match(r'^/attachment/(ticket|wiki)(?:[/:](.*))?$', 261 match = re.match(r'^/attachment(;format=[^/]+)?/' 262 '(ticket|wiki)(?:[/:](.*))?$', 254 263 req.path_info) 255 264 if match: 256 req.args['type'] = match.group(1) 257 req.args['path'] = match.group(2).replace(':', '/') 265 req.args['type'] = match.group(2) 266 req.args['path'] = match.group(3).replace(':', '/') 267 format = match.group(1) 268 if format: 269 req.args['format'] = format[8:] 258 270 return True 259 271 260 272 def process_request(self, req): 261 273 parent_type = req.args.get('type') 262 274 path = req.args.get('path') 275 format = req.args.get('format') 263 276 if not parent_type or not path: 264 277 raise HTTPBadRequest('Bad request') 265 278 if not parent_type in ['ticket', 'wiki']: … … 272 285 segments = path.split('/') 273 286 parent_id = '/'.join(segments[:-1]) 274 287 filename = segments[-1] 288 if not format and filename.endswith('.html'): 289 filename = filename[:-5] 275 290 if len(segments) == 1 or not filename: 276 291 raise HTTPBadRequest('Bad request') 277 292 attachment = Attachment(self.env, parent_type, parent_id, filename) … … 299 314 self._render_form(req, attachment) 300 315 else: 301 316 add_link(req, 'up', parent_link, parent_text) 302 self._render_view(req, attachment )317 self._render_view(req, attachment, format) 303 318 304 319 add_stylesheet(req, 'common/css/code.css') 305 320 return 'attachment.cs', None … … 393 408 req.hdf['attachment'] = {'mode': 'new', 394 409 'author': util.get_reporter_id(req)} 395 410 396 def _render_view(self, req, attachment ):411 def _render_view(self, req, attachment, format): 397 412 perm_map = {'ticket': 'TICKET_VIEW', 'wiki': 'WIKI_VIEW'} 398 413 req.perm.assert_permission(perm_map[attachment.parent_type]) 399 414 … … 420 435 mime_type = mimeview.get_mimetype(attachment.filename, str_data) 421 436 422 437 # Eventually send the file directly 423 format = req.args.get('format')424 438 if format in ('raw', 'txt'): 425 439 if not self.render_unsafe_content and not binary: 426 440 # Force browser to download HTML/SVG/etc pages that may -
trac/mimeview/rst.py
54 54 def _browser(href, args): 55 55 path = args[0] 56 56 rev = len(args) == 2 and args[1] or '' 57 return href.browser(path, rev=rev) 57 from trac.versioncontrol.web_ui.browser import BrowserModule 58 return BrowserModule(self.env).href(req, path, rev=rev) 58 59 59 60 # TracLink REs and callback functions 60 61 LINKS = [(TICKET_LINK, _ticket), -
trac/versioncontrol/web_ui/util.py
69 69 } 70 70 return changes 71 71 72 def get_path_links( href, path, rev):72 def get_path_links(browser, req, path, rev): 73 73 links = [] 74 74 parts = path.split('/') 75 75 if not parts[-1]: … … 79 79 path = path + part + '/' 80 80 links.append({ 81 81 'name': part or 'root', 82 'href': href.browser(path, rev=rev)82 'href': browser.href(req, path, rev=rev) 83 83 }) 84 84 return links 85 85 -
trac/versioncontrol/web_ui/changeset.py
34 34 from trac.versioncontrol import Changeset, Node 35 35 from trac.versioncontrol.diff import get_diff_options, hdf_diff, unified_diff 36 36 from trac.versioncontrol.svn_authz import SubversionAuthorizer 37 from trac.versioncontrol.web_ui.browser import BrowserModule 37 38 from trac.versioncontrol.web_ui.util import render_node_property 38 39 from trac.web import IRequestHandler 39 40 from trac.web.chrome import INavigationContributor, add_link, add_stylesheet … … 264 265 265 266 def _render_html(self, req, repos, chgset, restricted, diff, diff_options): 266 267 """HTML version""" 268 browser = BrowserModule(self.env) 267 269 req.hdf['changeset'] = { 268 270 'chgset': chgset and True, 269 271 'restricted': restricted, 270 272 'href': { 271 273 'new_rev': req.href.changeset(diff.new_rev), 272 274 'old_rev': req.href.changeset(diff.old_rev), 273 'new_path': req.href.browser(diff.new_path, rev=diff.new_rev),274 'old_path': req.href.browser(diff.old_path, rev=diff.old_rev)275 'new_path': browser.href(req, diff.new_path, rev=diff.new_rev), 276 'old_path': browser.href(req, diff.old_path, rev=diff.old_rev) 275 277 } 276 278 } 277 279 … … 375 377 info['path.old'] = old_node.path 376 378 info['rev.old'] = old_node.rev 377 379 info['shortrev.old'] = repos.short_rev(old_node.rev) 378 old_href = req.href.browser(old_node.created_path,379 rev=old_node.created_rev)380 old_href = browser.href(req, old_node.created_path, 381 rev=old_node.created_rev) 380 382 # Reminder: old_node.path may not exist at old_node.rev 381 383 # as long as old_node.rev==old_node.created_rev 382 384 # ... and diff.old_rev may have nothing to do … … 386 388 info['path.new'] = new_node.path 387 389 info['rev.new'] = new_node.rev # created rev. 388 390 info['shortrev.new'] = repos.short_rev(new_node.rev) 389 new_href = req.href.browser(new_node.created_path,390 rev=new_node.created_rev)391 new_href = browser.href(req, new_node.created_path, 392 rev=new_node.created_rev) 391 393 # (same remark as above) 392 394 info['browser_href.new'] = new_href 393 395 return info -
trac/versioncontrol/web_ui/log.py
24 24 from trac.util import http_date 25 25 from trac.util.markup import html 26 26 from trac.versioncontrol import Changeset 27 from trac.versioncontrol.web_ui.browser import BrowserModule 27 28 from trac.versioncontrol.web_ui.changeset import ChangesetModule 28 29 from trac.versioncontrol.web_ui.util import * 29 30 from trac.web import IRequestHandler … … 78 79 if repos.rev_older_than(rev, stop_rev): 79 80 rev, stop_rev = stop_rev, rev 80 81 82 browser = BrowserModule(self.env) 83 81 84 req.hdf['title'] = path + ' (log)' 82 85 req.hdf['log'] = { 83 86 'mode': mode, … … 85 88 'rev': rev, 86 89 'verbose': verbose, 87 90 'stop_rev': stop_rev, 88 'browser_href': req.href.browser(path),91 'browser_href': browser.href(req, path), 89 92 'changeset_href': req.href.changeset(), 90 93 'log_href': req.href.log(path, rev=rev) 91 94 } 92 95 93 path_links = get_path_links( req.href, path, rev)96 path_links = get_path_links(browser, req, path, rev) 94 97 req.hdf['log.path'] = path_links 95 98 if path_links: 96 99 add_link(req, 'up', path_links[-1]['href'], 'Parent directory') … … 116 119 'rev': str(old_rev), 117 120 'path': old_path, 118 121 'log_href': req.href.log(old_path, rev=old_rev), 119 'browser_href': req.href.browser(old_path, rev=old_rev),122 'browser_href': browser.href(req, old_path, rev=old_rev), 120 123 'changeset_href': req.href.changeset(old_rev), 121 124 'restricted_href': req.href.changeset(old_rev, new_path=old_path), 122 125 'change': old_chg -
trac/versioncontrol/web_ui/browser.py
57 57 glob patterns, i.e. "*" can be used as a wild card) 58 58 (''since 0.10'')""") 59 59 60 def href(self, req, path, *args, **dict): 61 base = 'browser' 62 if 'format' in dict: 63 format = dict.pop('format') 64 base += ';format=' + format # format passed in a segment parameter 65 else: # HTML preview 66 format = 'html' 67 if format != 'raw': 68 path += '.' + format 69 return req.href(base, path, *args, **dict) 70 71 60 72 # INavigationContributor methods 61 73 62 74 def get_active_navigation_item(self, req): … … 77 89 78 90 def match_request(self, req): 79 91 import re 80 match = re.match(r'/( browser|file)(?:(/.*))?', req.path_info)92 match = re.match(r'/(raw|txt)?(browser|file)(?:(/.*))?', req.path_info) 81 93 if match: 82 req.args['path'] = match.group( 2) or '/'83 if match.group( 1) == 'file':84 req.redirect( req.href.browser(req.args.get('path'),85 rev=req.args.get('rev'),86 format=req.args.get('format')),94 req.args['path'] = match.group(3) or '/' 95 if match.group(2) == 'file': 96 req.redirect(self.href(req, req.args.get('path'), 97 rev=req.args.get('rev'), 98 format=req.args.get('format')), 87 99 permanent=True) 100 format = match.group(1) 101 if format: 102 req.args['format'] = format 88 103 return True 89 104 90 105 def process_request(self, req): 91 106 path = req.args.get('path', '/') 92 107 rev = req.args.get('rev') or None 108 format = req.args.get('format') 93 109 110 if format: 111 if path.endswith('.txt'): 112 path = path[:-4] 113 elif path.endswith('.html'): 114 path = path[:-5] 115 94 116 # Find node for the requested path/rev 95 117 repos = self.env.get_repository(req.authname) 96 118 if rev: … … 114 136 'path': path, 115 137 'revision': rev, 116 138 'props': properties, 117 'href': req.href.browser(path, rev=rev),139 'href': self.href(req, path, rev=rev), 118 140 'log_href': req.href.log(path, rev=rev), 119 141 'restr_changeset_href': req.href.changeset(node.rev, 120 142 node.created_path), 121 143 'anydiff_href': req.href.anydiff(), 122 144 } 123 145 124 path_links = get_path_links( req.href, path, rev)146 path_links = get_path_links(self, req, path, rev) 125 147 if len(path_links) > 1: 126 148 add_link(req, 'up', path_links[-2]['href'], 'Parent directory') 127 149 req.hdf['browser.path'] = path_links … … 130 152 req.hdf['browser.is_dir'] = True 131 153 self._render_directory(req, repos, node, rev) 132 154 else: 133 self._render_file(req, repos, node, rev )155 self._render_file(req, repos, node, rev, format) 134 156 135 157 add_stylesheet(req, 'common/css/browser.css') 136 158 return 'browser.cs', None … … 152 174 'rev': entry.rev, 153 175 'permission': 1, # FIXME 154 176 'log_href': req.href.log(entry.path, rev=rev), 155 'browser_href': req.href.browser(entry.path, rev=rev)177 'browser_href': self.href(req, entry.path, rev=rev) 156 178 }) 157 179 changes = get_changes(self.env, repos, [i['rev'] for i in info]) 158 180 … … 179 201 180 202 switch_ordering_hrefs = {} 181 203 for col in ('name', 'size', 'date'): 182 switch_ordering_hrefs[col] = req.href.browser(183 node.path, rev=rev, order=col,204 switch_ordering_hrefs[col] = self.href( 205 req, node.path, rev=rev, order=col, 184 206 desc=(col == order and not desc and 1 or None)) 185 207 186 208 # ''Zip Archive'' alternate link … … 196 218 'items': info, 'changes': changes, 197 219 'order_href': switch_ordering_hrefs} 198 220 199 def _render_file(self, req, repos, node, rev =None):221 def _render_file(self, req, repos, node, rev, format): 200 222 req.perm.assert_permission('FILE_VIEW') 201 223 202 224 mimeview = Mimeview(self.env) … … 210 232 mime_type or 'text/plain' 211 233 212 234 # Eventually send the file directly 213 format = req.args.get('format')214 235 if format in ['raw', 'txt']: 215 236 req.send_response(200) 216 237 req.send_header('Content-Type', … … 247 268 248 269 # add ''Plain Text'' alternate link if needed 249 270 if not is_binary(chunk) and mime_type != 'text/plain': 250 plain_href = req.href.browser(node.path, rev=rev, format='txt')271 plain_href = self.href(req, node.path, rev=rev, format='txt') 251 272 add_link(req, 'alternate', plain_href, 'Plain Text', 252 273 'text/plain') 253 274 254 275 # add ''Original Format'' alternate link (always) 255 raw_href = req.href.browser(node.path, rev=rev, format='raw')276 raw_href = self.href(req, node.path, rev=rev, format='raw') 256 277 add_link(req, 'alternate', raw_href, 'Original Format', mime_type) 257 278 258 279 self.log.debug("Rendering preview of node %s@%s with mime-type %s" … … 287 308 else: 288 309 anchor = '' 289 310 label = urllib.unquote(label) 290 return html.A(href=formatter.href.browser(path, rev=rev) + anchor, 291 class_='source')[label] 311 href = formatter.href.browser(path, rev=rev) 312 if formatter.req: 313 href = self.href(formatter.req, path, rev=rev) 314 return html.A(label, href=href+anchor, class_='source') -
trac/Search.py
237 237 return req.href.milestone(kwd[len('milestone:'):]) 238 238 # Source quickjump 239 239 elif kwd[0] == '/': 240 return req.href.browser(kwd) 240 from trac.versioncontrol.web_ui.browser import BrowserModule 241 return BrowserModule(self.env).href(req, kwd) 241 242 elif kwd[0:len('source:')] == 'source:': 242 return req.href.browser(kwd[len('source:'):]) 243 from trac.versioncontrol.web_ui.browser import BrowserModule 244 return BrowserModule(self.env).href(req, kwd[len('source:'):]) 243 245 # Wiki quickjump 244 246 elif kwd[0:len('wiki:')] == 'wiki:': 245 247 r = "((^|(?<=[^A-Za-z]))[!]?[A-Z][a-z/]+(?:[A-Z][a-z/]+)+)" -
trac/wiki/api.py
227 227 # IWikiSyntaxProvider methods 228 228 229 229 def get_wiki_syntax(self): 230 from trac.wiki.formatter import Formatter 230 231 yield (r"!?(?<!/)\b[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+" 231 232 "(?:#[A-Za-z0-9]+)?(?=:?\Z|:?\s|[.,;!?\)}\]])", 232 233 lambda x, y, z: self._format_link(x, 'wiki', y, y, 233 234 self.ignore_missing_pages)) 235 yield (r"!?(\[%s\])" % Formatter.QUOTED_STRING, 236 lambda x, y, z: self._format_link(x, 'wiki', y, y, False)) 234 237 235 238 def get_link_resolvers(self): 236 239 yield ('wiki', self._format_fancy_link) -
trac/wiki/tests/formatter.py
127 127 % (msg, self.file, self.line, self.title, formatter.flavor)) 128 128 129 129 def formatter(self): 130 return Formatter(self.env) 130 return Formatter(self.env, self.env) 131 # Well, in the above, we fake `req` using `self.env`, as all we care about 132 # is the `href` attribute (at least for those unit tests!) 131 133 132 134 def shortDescription(self): 133 135 return 'Test ' + self.title -
trac/wiki/tests/macros.py
1 1 import unittest 2 2 3 3 import trac.wiki.macros 4 from trac.versioncontrol.web_ui.browser import BrowserModule 4 5 from trac.wiki.tests import formatter 5 6 6 7 IMAGE_MACRO_TEST_CASES=u""" -
trac/wiki/formatter.py
149 149 ENDBLOCK_TOKEN = r"\}\}\}" 150 150 ENDBLOCK = "}}}" 151 151 152 LINK_SCHEME = r"[ \w.+-]+" # as per RFC 2396152 LINK_SCHEME = r"[a-zA-Z][a-zA-Z0-9.+-]*" # as per RFC 3986 153 153 INTERTRAC_SCHEME = r"[a-zA-Z.+-]*?" # no digits (support for shorthand links) 154 154 155 155 QUOTED_STRING = r"'[^']+'|\"[^\"]+\"" -
trac/wiki/macros.py
288 288 raise Exception("%s module can't have attachments" % parts[0]) 289 289 elif len(parts) == 2: 290 290 from trac.versioncontrol.web_ui import BrowserModule 291 browser = BrowserModule(self.env) 291 292 try: 292 browser_links = [link for link,_ in 293 BrowserModule(self.env).get_link_resolvers()]293 browser_links = [link for link,_ in 294 browser.get_link_resolvers()] 294 295 except Exception: 295 296 browser_links = [] 296 297 if parts[0] in browser_links: # source:path … … 298 299 rev = None 299 300 if '@' in file: 300 301 file, rev = file.split('@') 301 url = self.env.href.browser(file, rev=rev)302 raw_url = self.env.href.browser(file, rev=rev, format='raw')302 url = browser.href(req, file, rev=rev) 303 raw_url = browser.href(req, file, rev=rev, format='raw') 303 304 desc = filespec 304 305 else: # #ticket:attachment or WikiPage:attachment 305 306 # FIXME: do something generic about shorthand forms...
