Author: rjollos
Date: Thu Jun 20 14:56:32 2013
New Revision: 1495037
URL: http://svn.apache.org/r1495037
Log:
Fixes #561: Display a warning and the products list when accessing a
non-existent product. Patch from Olemis, with minor modifications.
Modified:
bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py
bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py
Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py
URL:
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py?rev=1495037&r1=1495036&r2=1495037&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py Thu Jun 20
14:56:32 2013
@@ -50,11 +50,16 @@ class MultiProductEnvironmentFactory(Env
# happen from within trac.web.main.dispatch_request
req = RequestWithSession(environ, None)
global_env._abs_href = req.abs_href
- env = multiproduct.env.ProductEnvironment(global_env,
- product_prefix)
- # shift WSGI environment to the left
- environ['SCRIPT_NAME'] = script_name
- environ['PATH_INFO'] = path_info
+ try:
+ env = multiproduct.env.ProductEnvironment(global_env,
+ product_prefix)
+ except LookupError:
+ # bh:ticket:561 - Display product list and warning message
+ env = global_env
+ else:
+ # shift WSGI environment to the left
+ environ['SCRIPT_NAME'] = script_name
+ environ['PATH_INFO'] = path_info
return env
if pid:
Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py
URL:
http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py?rev=1495037&r1=1495036&r2=1495037&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py Thu Jun 20
14:56:32 2013
@@ -49,33 +49,32 @@ class ProductModule(Component):
def process_request(self, req):
"""process request handler"""
-
- req.perm.require('PRODUCT_VIEW')
-
- path_info = req.args.get('pathinfo')
- if path_info and path_info != '/':
- raise HTTPNotFound(_('Unable to render product page. Wrong
setup?'))
+ req.perm.require('PRODUCT_VIEW')
pid = req.args.get('productid', None)
if pid:
req.perm('product', pid).require('PRODUCT_VIEW')
- action = req.args.get('action', 'view')
-
- products = [p for p in Product.select(self.env)
- if 'PRODUCT_VIEW' in req.perm(Neighborhood('product',
- p.prefix))]
-
- if pid:
- add_link(req, 'up', req.href.products(), _('Products'))
-
+
try:
product = Product(self.env, {'prefix': pid})
except ResourceNotFound:
product = Product(self.env)
-
- data = {'product': product,
- 'context': web_context(req, product.resource)}
-
+
+ path_info = req.args.get('pathinfo')
+ if path_info and path_info != '/':
+ if not product._exists:
+ # bh:ticket:561 - Display product list and warning message
+ if pid:
+ add_warning(req, _("Product %(pid)s not found", pid=pid))
+ return self._render_list(req)
+ else:
+ raise HTTPNotFound(
+ _('Unable to render product page. Wrong setup?'))
+
+ if pid:
+ add_link(req, 'up', req.href.products(), _('Products'))
+
+ action = req.args.get('action', 'view')
if req.method == 'POST':
if 'cancel' in req.args:
req.redirect(req.href.products(product.prefix))
@@ -87,14 +86,27 @@ class ProductModule(Component):
return self._render_editor(req, product)
elif action == 'delete':
raise TracError(_('Product removal is not allowed!'))
-
- if not pid:
- data = {'products': products,
- 'context': web_context(req, Resource('product', None))}
- return 'product_list.html', data, None
-
+
+ if not product._exists:
+ if pid:
+ # bh:ticket:561 - Display product list and warning message
+ add_warning(req, _("Product %(pid)s not found", pid=pid))
+ return self._render_list(req)
+
+ data = {'product': product,
+ 'context': web_context(req, product.resource)}
return 'product_view.html', data, None
-
+
+ def _render_list(self, req):
+ """products list"""
+ print "Rendering list"
+ products = [p for p in Product.select(self.env)
+ if 'PRODUCT_VIEW' in req.perm(Neighborhood('product',
+ p.prefix))]
+ data = {'products': products,
+ 'context': web_context(req, Resource('product', None))}
+ return 'product_list.html', data, None
+
def _render_editor(self, req, product):
"""common processing for creating rendering the edit page"""
if product._exists: