diff --git a/trac/admin/web_ui.py b/trac/admin/web_ui.py
|
a
|
b
|
|
| 33 | 33 | from trac.util.text import to_unicode |
| 34 | 34 | from trac.util.translation import _ |
| 35 | 35 | from trac.web import HTTPNotFound, IRequestHandler |
| 36 | | from trac.web.chrome import add_script, add_stylesheet, add_warning, Chrome, \ |
| 37 | | INavigationContributor, ITemplateProvider |
| | 36 | from trac.web.chrome import add_notice, add_script, add_stylesheet, \ |
| | 37 | add_warning, Chrome, INavigationContributor, \ |
| | 38 | ITemplateProvider |
| 38 | 39 | |
| 39 | 40 | try: |
| 40 | 41 | from webadmin import IAdminPageProvider |
| … |
… |
|
| 190 | 191 | for option in ('name', 'url', 'descr'): |
| 191 | 192 | self.config.set('project', option, req.args.get(option)) |
| 192 | 193 | self.config.save() |
| | 194 | add_notice(req, _("Your changes have been saved.")) |
| 193 | 195 | req.redirect(req.href.admin(cat, page)) |
| 194 | 196 | |
| 195 | 197 | data = { |
| … |
… |
|
| 274 | 276 | |
| 275 | 277 | if changed: |
| 276 | 278 | self.config.save() |
| | 279 | add_notice(req, _("Your changes have been saved.")) |
| 277 | 280 | req.redirect(req.href.admin(cat, page)) |
| 278 | 281 | |
| 279 | 282 | data = { |
| … |
… |
|
| 321 | 324 | req.perm.require(action) |
| 322 | 325 | if (subject, action) not in all_permissions: |
| 323 | 326 | perm.grant_permission(subject, action) |
| | 327 | add_notice(req, _("The user %(user)s has been granted " |
| | 328 | "the permission %(perm)s.", user=subject, |
| | 329 | perm=action)) |
| 324 | 330 | req.redirect(req.href.admin(cat, page)) |
| 325 | 331 | else: |
| 326 | 332 | add_warning(req, |
| … |
… |
|
| 338 | 344 | % (subject, group, action)) |
| 339 | 345 | else: |
| 340 | 346 | req.perm.require(action) |
| 341 | | if (subject,group) not in all_permissions: |
| | 347 | if (subject, group) not in all_permissions: |
| 342 | 348 | perm.grant_permission(subject, group) |
| | 349 | add_notice(req, _("The user '%(user)s' has been added to " |
| | 350 | "the group '%(group)s'.", user=subject, |
| | 351 | group=group)) |
| 343 | 352 | req.redirect(req.href.admin(cat, page)) |
| 344 | 353 | else: |
| 345 | 354 | add_warning(req, |
| … |
… |
|
| 355 | 364 | subject, action = key.split(':', 1) |
| 356 | 365 | if (subject, action) in perm.get_all_permissions(): |
| 357 | 366 | perm.revoke_permission(subject, action) |
| | 367 | add_notice(req, _("The selected permissions have been " |
| | 368 | "revoked.")) |
| 358 | 369 | req.redirect(req.href.admin(cat, page)) |
| 359 | 370 | |
| 360 | 371 | return 'admin_perms.html', { |
diff --git a/trac/prefs/web_ui.py b/trac/prefs/web_ui.py
|
a
|
b
|
|
| 25 | 25 | from trac.util.datefmt import all_timezones, get_timezone, localtz |
| 26 | 26 | from trac.util.translation import _ |
| 27 | 27 | from trac.web import HTTPNotFound, IRequestHandler |
| 28 | | from trac.web.chrome import add_stylesheet, INavigationContributor, \ |
| 29 | | ITemplateProvider |
| | 28 | from trac.web.chrome import add_notice, add_stylesheet, \ |
| | 29 | INavigationContributor, ITemplateProvider |
| 30 | 30 | |
| 31 | 31 | |
| 32 | 32 | class PreferencesModule(Component): |
| … |
… |
|
| 125 | 125 | elif field in req.session and (field in req.args or |
| 126 | 126 | field + '_cb' in req.args): |
| 127 | 127 | del req.session[field] |
| | 128 | add_notice(req, _("Your preferences have been saved.")) |
| 128 | 129 | |
| 129 | 130 | def _do_load(self, req): |
| 130 | 131 | if req.authname == 'anonymous': |
diff --git a/trac/ticket/admin.py b/trac/ticket/admin.py
|
a
|
b
|
|
| 21 | 21 | from trac.util.datefmt import utc, parse_date, get_date_format_hint, \ |
| 22 | 22 | get_datetime_format_hint |
| 23 | 23 | from trac.util.translation import _ |
| 24 | | from trac.web.chrome import add_link, add_script |
| | 24 | from trac.web.chrome import add_link, add_notice, add_script |
| 25 | 25 | |
| 26 | 26 | |
| 27 | 27 | class TicketAdminPanel(Component): |
| … |
… |
|
| 62 | 62 | comp.owner = req.args.get('owner') |
| 63 | 63 | comp.description = req.args.get('description') |
| 64 | 64 | comp.update() |
| | 65 | add_notice(req, _("Your changes have been saved.")) |
| 65 | 66 | req.redirect(req.href.admin(cat, page)) |
| 66 | 67 | elif req.args.get('cancel'): |
| 67 | 68 | req.redirect(req.href.admin(cat, page)) |
| … |
… |
|
| 82 | 83 | if req.args.get('owner'): |
| 83 | 84 | comp.owner = req.args.get('owner') |
| 84 | 85 | comp.insert() |
| | 86 | add_notice(req, _("The component '%(name)s' has been " |
| | 87 | "added.", name=name)) |
| 85 | 88 | req.redirect(req.href.admin(cat, page)) |
| 86 | 89 | else: |
| 87 | 90 | raise TracError(_('Component %s already exists.') % name) |
| … |
… |
|
| 98 | 101 | comp = model.Component(self.env, name, db=db) |
| 99 | 102 | comp.delete(db=db) |
| 100 | 103 | db.commit() |
| | 104 | add_notice(req, _("The selected components have been " |
| | 105 | "removed.")) |
| 101 | 106 | req.redirect(req.href.admin(cat, page)) |
| 102 | 107 | |
| 103 | 108 | # Set default component |
| … |
… |
|
| 107 | 112 | self.log.info('Setting default component to %s', name) |
| 108 | 113 | self.config.set('ticket', 'default_component', name) |
| 109 | 114 | self.config.save() |
| | 115 | add_notice(req, _("Your changes have been saved.")) |
| 110 | 116 | req.redirect(req.href.admin(cat, page)) |
| 111 | 117 | |
| 112 | 118 | default = self.config.get('ticket', 'default_component') |
| … |
… |
|
| 166 | 172 | _('Invalid Completion Date')) |
| 167 | 173 | mil.description = req.args.get('description', '') |
| 168 | 174 | mil.update() |
| | 175 | add_notice(req, _("Your changes have been saved.")) |
| 169 | 176 | req.redirect(req.href.admin(cat, page)) |
| 170 | 177 | elif req.args.get('cancel'): |
| 171 | 178 | req.redirect(req.href.admin(cat, page)) |
| … |
… |
|
| 188 | 195 | mil.due = parse_date(req.args.get('duedate'), |
| 189 | 196 | req.tz) |
| 190 | 197 | mil.insert() |
| | 198 | add_notice(req, _("The milestone '%(name)s' has been " |
| | 199 | "added.", name=name)) |
| 191 | 200 | req.redirect(req.href.admin(cat, page)) |
| 192 | 201 | else: |
| 193 | 202 | raise TracError(_('Milestone %s already exists.') % name) |
| … |
… |
|
| 205 | 214 | mil = model.Milestone(self.env, name, db=db) |
| 206 | 215 | mil.delete(db=db, author=req.authname) |
| 207 | 216 | db.commit() |
| | 217 | add_notice(req, _("The selected milestones have been " |
| | 218 | "removed.")) |
| 208 | 219 | req.redirect(req.href.admin(cat, page)) |
| 209 | 220 | |
| 210 | 221 | # Set default milestone |
| … |
… |
|
| 214 | 225 | self.log.info('Setting default milestone to %s', name) |
| 215 | 226 | self.config.set('ticket', 'default_milestone', name) |
| 216 | 227 | self.config.save() |
| | 228 | add_notice(req, _("Your changes have been saved.")) |
| 217 | 229 | req.redirect(req.href.admin(cat, page)) |
| 218 | 230 | |
| 219 | 231 | # Get ticket count |
| … |
… |
|
| 258 | 270 | ver.time = None # unset |
| 259 | 271 | ver.description = req.args.get('description') |
| 260 | 272 | ver.update() |
| | 273 | add_notice(req, _("Your changes have been saved.")) |
| 261 | 274 | req.redirect(req.href.admin(cat, page)) |
| 262 | 275 | elif req.args.get('cancel'): |
| 263 | 276 | req.redirect(req.href.admin(cat, page)) |
| … |
… |
|
| 279 | 292 | ver.time = parse_date(req.args.get('time'), |
| 280 | 293 | req.tz) |
| 281 | 294 | ver.insert() |
| | 295 | add_notice(req, _("The version '%(name)s' has been " |
| | 296 | "added.", name=name)) |
| 282 | 297 | req.redirect(req.href.admin(cat, page)) |
| 283 | 298 | else: |
| 284 | 299 | raise TracError(_('Version %s already exists.') % name) |
| … |
… |
|
| 295 | 310 | ver = model.Version(self.env, name, db=db) |
| 296 | 311 | ver.delete(db=db) |
| 297 | 312 | db.commit() |
| | 313 | add_notice(req, _("The selected versions have been " |
| | 314 | "removed.")) |
| 298 | 315 | req.redirect(req.href.admin(cat, page)) |
| 299 | 316 | |
| 300 | 317 | # Set default version |
| … |
… |
|
| 304 | 321 | self.log.info('Setting default version to %s', name) |
| 305 | 322 | self.config.set('ticket', 'default_version', name) |
| 306 | 323 | self.config.save() |
| | 324 | add_notice(req, _("Your changes have been saved.")) |
| 307 | 325 | req.redirect(req.href.admin(cat, page)) |
| 308 | 326 | |
| 309 | 327 | data = { |
| … |
… |
|
| 339 | 357 | if req.args.get('save'): |
| 340 | 358 | enum.name = req.args.get('name') |
| 341 | 359 | enum.update() |
| | 360 | add_notice(req, _("Your changes have been saved.")) |
| 342 | 361 | req.redirect(req.href.admin(cat, page)) |
| 343 | 362 | elif req.args.get('cancel'): |
| 344 | 363 | req.redirect(req.href.admin(cat, page)) |
| … |
… |
|
| 357 | 376 | enum = self._enum_cls(self.env) |
| 358 | 377 | enum.name = name |
| 359 | 378 | enum.insert() |
| | 379 | add_notice(req, _("The %(field)s '%(name)s' has been " |
| | 380 | "added.", |
| | 381 | field=self._label[0].lower(), |
| | 382 | name=name)) |
| 360 | 383 | req.redirect(req.href.admin(cat, page)) |
| 361 | 384 | else: |
| 362 | 385 | raise TracError(_('%s %s already exists') % (self._type.title(), name)) |
| … |
… |
|
| 373 | 396 | enum = self._enum_cls(self.env, name, db=db) |
| 374 | 397 | enum.delete(db=db) |
| 375 | 398 | db.commit() |
| | 399 | add_notice(req, _("The selected %(fields)s have been " |
| | 400 | "removed.", |
| | 401 | fields=self._label[1].lower())) |
| 376 | 402 | req.redirect(req.href.admin(cat, page)) |
| 377 | 403 | |
| 378 | 404 | # Appy changes |
| … |
… |
|
| 403 | 429 | enum.update(db=db) |
| 404 | 430 | db.commit() |
| 405 | 431 | |
| | 432 | add_notice(req, _("Your changes have been saved.")) |
| 406 | 433 | req.redirect(req.href.admin(cat, page)) |
| 407 | 434 | |
| 408 | 435 | data.update(dict(enums=list(self._enum_cls.select(self.env)), |
diff --git a/trac/ticket/report.py b/trac/ticket/report.py
|
a
|
b
|
|
| 34 | 34 | from trac.util.text import to_unicode, unicode_urlencode |
| 35 | 35 | from trac.util.translation import _ |
| 36 | 36 | from trac.web.api import IRequestHandler, RequestDone |
| 37 | | from trac.web.chrome import add_ctxtnav, add_link, add_stylesheet, \ |
| 38 | | INavigationContributor, Chrome |
| | 37 | from trac.web.chrome import add_ctxtnav, add_link, add_notice, \ |
| | 38 | add_stylesheet, INavigationContributor, Chrome |
| 39 | 39 | from trac.wiki import IWikiSyntaxProvider, WikiParser |
| 40 | 40 | |
| 41 | 41 | |
| … |
… |
|
| 152 | 152 | cursor = db.cursor() |
| 153 | 153 | cursor.execute("DELETE FROM report WHERE id=%s", (id,)) |
| 154 | 154 | db.commit() |
| | 155 | add_notice(req, _("The report has been deleted.")) |
| 155 | 156 | req.redirect(req.href.report()) |
| 156 | 157 | |
| 157 | 158 | def _do_save(self, req, db, id): |
| … |
… |
|
| 166 | 167 | cursor.execute("UPDATE report SET title=%s,query=%s,description=%s " |
| 167 | 168 | "WHERE id=%s", (title, query, description, id)) |
| 168 | 169 | db.commit() |
| | 170 | add_notice(req, _("Your changes have been saved.")) |
| 169 | 171 | req.redirect(req.href.report(id)) |
| 170 | 172 | |
| 171 | 173 | def _render_confirm_delete(self, req, db, id): |
diff --git a/trac/ticket/roadmap.py b/trac/ticket/roadmap.py
|
a
|
b
|
|
| 39 | 39 | from trac.ticket.query import Query |
| 40 | 40 | from trac.timeline.api import ITimelineEventProvider |
| 41 | 41 | from trac.web import IRequestHandler |
| 42 | | from trac.web.chrome import add_link, add_stylesheet, add_warning, \ |
| 43 | | INavigationContributor |
| | 42 | from trac.web.chrome import add_link, add_notice, add_stylesheet, \ |
| | 43 | add_warning, INavigationContributor |
| 44 | 44 | from trac.wiki.api import IWikiSyntaxProvider |
| 45 | 45 | from trac.wiki.formatter import format_to |
| 46 | 46 | |
| | 47 | |
| 47 | 48 | class ITicketGroupStatsProvider(Interface): |
| 48 | 49 | def get_ticket_group_stats(ticket_ids): |
| 49 | 50 | """ Gather statistics on a group of tickets. |
| … |
… |
|
| 585 | 586 | retarget_to = req.args.get('target') or None |
| 586 | 587 | milestone.delete(retarget_to, req.authname) |
| 587 | 588 | db.commit() |
| | 589 | add_notice(req, _("The milestone has been deleted.")) |
| 588 | 590 | req.redirect(req.href.roadmap()) |
| 589 | 591 | |
| 590 | 592 | def _do_save(self, req, db, milestone): |
| … |
… |
|
| 655 | 657 | milestone.insert() |
| 656 | 658 | db.commit() |
| 657 | 659 | |
| | 660 | add_notice(req, _("Your changes have been saved.")) |
| 658 | 661 | req.redirect(req.href.milestone(milestone.name)) |
| 659 | 662 | |
| 660 | 663 | def _render_confirm(self, req, db, milestone): |
diff --git a/trac/web/api.py b/trac/web/api.py
|
a
|
b
|
|
| 180 | 180 | 'incookie': Request._parse_cookies, |
| 181 | 181 | '_inheaders': Request._parse_headers |
| 182 | 182 | } |
| | 183 | self.redirect_handlers = [] |
| 183 | 184 | |
| 184 | 185 | self.base_url = self.environ.get('trac.base_url') |
| 185 | 186 | if not self.base_url: |
| … |
… |
|
| 223 | 224 | server_port = property(fget=lambda self: int(self.environ['SERVER_PORT']), |
| 224 | 225 | doc='Port number the server is bound to') |
| 225 | 226 | |
| | 227 | def add_redirect_handler(self, handler): |
| | 228 | """Add a callable to be called prior to executing a redirect. |
| | 229 | |
| | 230 | The callable is passed the arguments to the `redirect()` call. |
| | 231 | """ |
| | 232 | self.redirect_handlers.append(handler) |
| | 233 | |
| 226 | 234 | def get_header(self, name): |
| 227 | 235 | """Return the value of the specified HTTP header, or `None` if there's |
| 228 | 236 | no such header in the request. |
| … |
… |
|
| 290 | 298 | `url` may be relative or absolute, relative URLs will be translated |
| 291 | 299 | appropriately. |
| 292 | 300 | """ |
| | 301 | for handler in self.redirect_handlers: |
| | 302 | handler(self, url, permanent) |
| | 303 | |
| 293 | 304 | if self.session: |
| 294 | 305 | self.session.save() # has to be done before the redirect is sent |
| 295 | 306 | |
diff --git a/trac/web/chrome.py b/trac/web/chrome.py
|
a
|
b
|
|
| 15 | 15 | # Author: Christopher Lenz <cmlenz@gmx.de> |
| 16 | 16 | |
| 17 | 17 | import datetime |
| | 18 | import itertools |
| 18 | 19 | import os.path |
| 19 | 20 | import pkg_resources |
| 20 | 21 | import pprint |
| … |
… |
|
| 436 | 437 | |
| 437 | 438 | chrome = {'links': {}, 'scripts': [], 'ctxtnav': [], 'warnings': [], |
| 438 | 439 | 'notices': []} |
| | 440 | def on_redirect(req, url, permanent): |
| | 441 | """Save warnings and notices in case of redirect, so that they can |
| | 442 | be displayed after the redirect.""" |
| | 443 | for type_ in ['warnings', 'notices']: |
| | 444 | for (i, message) in enumerate(req.chrome[type_]): |
| | 445 | req.session['chrome.%s.%d' % (type_, i)] = message |
| | 446 | req.add_redirect_handler(on_redirect) |
| 439 | 447 | |
| 440 | 448 | # This is ugly... we can't pass the real Request object to the |
| 441 | 449 | # add_xxx methods, because it doesn't yet have the chrome attribute |
| … |
… |
|
| 707 | 715 | method = {'text/html': 'xhtml', |
| 708 | 716 | 'text/plain': 'text'}.get(content_type, 'xml') |
| 709 | 717 | |
| | 718 | if method == "xhtml": |
| | 719 | # Retrieve post-redirect messages saved in session |
| | 720 | for type_ in ['warnings', 'notices']: |
| | 721 | try: |
| | 722 | for i in itertools.count(): |
| | 723 | req.chrome[type_].append( |
| | 724 | req.session.pop('chrome.%s.%d' % (type_, i))) |
| | 725 | except KeyError: |
| | 726 | pass |
| | 727 | |
| 710 | 728 | template = self.load_template(filename, method=method) |
| 711 | 729 | data = self.populate_data(req, data) |
| 712 | 730 | |
diff --git a/trac/web/tests/chrome.py b/trac/web/tests/chrome.py
|
a
|
b
|
|
| 56 | 56 | |
| 57 | 57 | def test_htdocs_location(self): |
| 58 | 58 | req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'), |
| 59 | | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='') |
| | 59 | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='', |
| | 60 | add_redirect_handler=lambda handler: None) |
| 60 | 61 | info = Chrome(self.env).prepare_request(req) |
| 61 | 62 | self.assertEqual('/trac.cgi/chrome/common/', info['htdocs_location']) |
| 62 | 63 | |
| 63 | 64 | def test_logo(self): |
| 64 | 65 | req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'), |
| 65 | | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='') |
| | 66 | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='', |
| | 67 | add_redirect_handler=lambda handler: None) |
| 66 | 68 | |
| 67 | 69 | # Verify that no logo data is put in the HDF if no logo is configured |
| 68 | 70 | self.env.config.set('header_logo', 'src', '') |
| … |
… |
|
| 99 | 101 | |
| 100 | 102 | def test_default_links(self): |
| 101 | 103 | req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'), |
| 102 | | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='') |
| | 104 | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='', |
| | 105 | add_redirect_handler=lambda handler: None) |
| 103 | 106 | links = Chrome(self.env).prepare_request(req)['links'] |
| 104 | 107 | self.assertEqual('/trac.cgi/wiki', links['start'][0]['href']) |
| 105 | 108 | self.assertEqual('/trac.cgi/search', links['search'][0]['href']) |
| … |
… |
|
| 109 | 112 | |
| 110 | 113 | def test_icon_links(self): |
| 111 | 114 | req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'), |
| 112 | | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='') |
| | 115 | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='', |
| | 116 | add_redirect_handler=lambda handler: None) |
| 113 | 117 | chrome = Chrome(self.env) |
| 114 | 118 | |
| 115 | 119 | # No icon set in config, so no icon links |
| … |
… |
|
| 148 | 152 | def get_navigation_items(self, req): |
| 149 | 153 | yield 'metanav', 'test', 'Test' |
| 150 | 154 | req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'), |
| 151 | | href=Href('/trac.cgi'), path_info='/', base_path='/trac.cgi') |
| | 155 | href=Href('/trac.cgi'), path_info='/', base_path='/trac.cgi', |
| | 156 | add_redirect_handler=lambda handler: None) |
| 152 | 157 | nav = Chrome(self.env).prepare_request(req)['nav'] |
| 153 | 158 | self.assertEqual({'name': 'test', 'label': 'Test', 'active': False}, |
| 154 | 159 | nav['metanav'][0]) |
| … |
… |
|
| 161 | 166 | def get_navigation_items(self, req): |
| 162 | 167 | yield 'metanav', 'test', 'Test' |
| 163 | 168 | req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'), |
| 164 | | href=Href('/trac.cgi'), path_info='/', base_path='/trac.cgi') |
| | 169 | href=Href('/trac.cgi'), path_info='/', base_path='/trac.cgi', |
| | 170 | add_redirect_handler=lambda handler: None) |
| 165 | 171 | handler = TestNavigationContributor(self.env) |
| 166 | 172 | nav = Chrome(self.env).prepare_request(req, handler)['nav'] |
| 167 | 173 | self.assertEqual({'name': 'test', 'label': 'Test', 'active': True}, |
| … |
… |
|
| 181 | 187 | def get_navigation_items(self, req): |
| 182 | 188 | yield 'metanav', 'test2', 'Test 2' |
| 183 | 189 | req = Mock(chrome={}, abs_href=Href('http://example.org/trac.cgi'), |
| 184 | | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='/') |
| | 190 | href=Href('/trac.cgi'), base_path='/trac.cgi', path_info='/', |
| | 191 | add_redirect_handler=lambda handler: None) |
| 185 | 192 | chrome = Chrome(self.env) |
| 186 | 193 | |
| 187 | 194 | # Test with both items set in the order option |
diff --git a/trac/wiki/web_ui.py b/trac/wiki/web_ui.py
|
a
|
b
|
|
| 36 | 36 | from trac.util.text import shorten_line |
| 37 | 37 | from trac.util.translation import _ |
| 38 | 38 | from trac.versioncontrol.diff import get_diff_options, diff_blocks |
| 39 | | from trac.web.chrome import add_link, add_script, add_stylesheet, \ |
| 40 | | add_ctxtnav, add_warning, prevnext_nav, \ |
| | 39 | from trac.web.chrome import add_ctxtnav, add_link, add_notice, add_script, \ |
| | 40 | add_stylesheet, add_warning, prevnext_nav, \ |
| 41 | 41 | INavigationContributor, ITemplateProvider |
| 42 | 42 | from trac.web import IRequestHandler |
| 43 | 43 | from trac.wiki.api import IWikiPageManipulator, WikiSystem |
| … |
… |
|
| 254 | 254 | db.commit() |
| 255 | 255 | |
| 256 | 256 | if not page.exists: |
| | 257 | add_notice(req, _("The page '%(name)s' has been deleted.", |
| | 258 | name=page.name)) |
| 257 | 259 | req.redirect(req.href.wiki()) |
| 258 | 260 | else: |
| | 261 | if version and old_version and version > old_version: |
| | 262 | add_notice(req, _("The versions %(from_)d to %(to)d of the " |
| | 263 | "page '%(name)s' have been deleted.", |
| | 264 | from_=old_version + 1, to=version)) |
| | 265 | else: |
| | 266 | add_notice(req, _("The version %(version)d of the page " |
| | 267 | "'%(name)s' has been deleted.", |
| | 268 | version=version, name=page.name)) |
| 259 | 269 | req.redirect(req.href.wiki(page.name)) |
| 260 | 270 | |
| 261 | 271 | def _do_save(self, req, page): |
| … |
… |
|
| 276 | 286 | page.save(get_reporter_id(req, 'author'), |
| 277 | 287 | req.args.get('comment'), |
| 278 | 288 | req.remote_addr) |
| | 289 | add_notice(req, _("Your changes have been saved.")) |
| 279 | 290 | req.redirect(get_resource_url(self.env, page.resource, req.href, |
| 280 | 291 | version=None)) |
| 281 | 292 | except TracError: |