You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by ma...@apache.org on 2013/09/09 14:57:35 UTC
svn commit: r1521084 - in /bloodhound/trunk:
bloodhound_multiproduct/multiproduct/hooks.py
bloodhound_multiproduct/multiproduct/ticket/web_ui.py
bloodhound_multiproduct/multiproduct/web_ui.py
bloodhound_theme/bhtheme/theme.py
Author: matevz
Date: Mon Sep 9 12:57:35 2013
New Revision: 1521084
URL: http://svn.apache.org/r1521084
Log:
#658 - Move away from "default product" (initial implementation)
Modified:
bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py
bloodhound/trunk/bloodhound_multiproduct/multiproduct/ticket/web_ui.py
bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py
bloodhound/trunk/bloodhound_theme/bhtheme/theme.py
Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py
URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py?rev=1521084&r1=1521083&r2=1521084&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/hooks.py Mon Sep 9 12:57:35 2013
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-# these import monkey patch classes required to enable
+# these imports monkey patch classes required to enable
# multi product support
import multiproduct.env
import multiproduct.dbcursor
@@ -32,11 +32,6 @@ from trac.web.href import Href
from trac.web.main import RequestWithSession
PRODUCT_RE = re.compile(r'^/products(?:/(?P<pid>[^/]*)(?P<pathinfo>.*))?')
-REDIRECT_DEFAULT_RE = \
- re.compile(r'^/(?P<section>milestone|roadmap|report|newticket|'
- r'ticket|qct|timeline|diff|batchmodify|search|'
- r'(raw-|zip-)?attachment/(ticket|milestone))(?P<pathinfo>.*)')
-
class MultiProductEnvironmentFactory(EnvironmentFactoryBase):
def open_environment(self, environ, env_path, global_env, use_cache=False):
@@ -74,15 +69,7 @@ class MultiProductEnvironmentFactory(Env
environ['SCRIPT_NAME'] + '/products/' +
pid,
m.group('pathinfo') or '')
- else:
- redirect = REDIRECT_DEFAULT_RE.match(path_info)
- if redirect:
- from multiproduct.api import MultiProductSystem
- default_product_prefix = \
- MultiProductSystem(global_env).default_product_prefix
- env = create_product_env(default_product_prefix,
- environ['SCRIPT_NAME'],
- environ['PATH_INFO'])
+
return env
Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/ticket/web_ui.py
URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/ticket/web_ui.py?rev=1521084&r1=1521083&r2=1521084&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/ticket/web_ui.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/ticket/web_ui.py Mon Sep 9 12:57:35 2013
@@ -37,33 +37,50 @@ from trac.wiki.parser import WikiParser
from multiproduct.api import MultiProductSystem, PRODUCT_SYNTAX_DELIMITER_RE
from multiproduct.env import lookup_product_env, ProductEnvironment
from multiproduct.util import IDENTIFIER
+from multiproduct.model import Product
from multiproduct.web_ui import ProductModule
-REPORT_RE = re.compile(r'/report(?:/(?:([0-9]+)|-1))?$')
-
class ProductTicketModule(TicketModule):
"""Product Overrides for the TicketModule"""
# IRequestHandler methods
#def match_request(self, req):
# override not yet required
-
+
def process_request(self, req):
"""Override for TicketModule process_request"""
ticketid = req.args.get('id')
productid = req.args.get('productid','')
-
- if ticketid:
- if req.path_info in ('/newticket', '/products'):
- raise TracError(_("id can't be set for a new ticket request."))
+ if not ticketid:
+ # if /newticket is executed in global scope (from QCT), redirect
+ # the request to /products/<first_product_in_DB>/newticket
+ if not productid and not isinstance(self.env, ProductEnvironment):
+ products = Product.select(self.env, {'fields': ['prefix']})
+ req.redirect(req.href.products(products[0].prefix, 'newticket'))
+ return self._process_newticket_request(req)
+
+ if req.path_info in ('/newticket', '/products'):
+ raise TracError(_("id can't be set for a new ticket request."))
+
+ if isinstance(self.env, ProductEnvironment):
ticket = Ticket(self.env, ticketid)
if productid and ticket['product'] != productid:
- msg = "Ticket %(id)s in product '%(prod)' does not exist."
+ msg = "Ticket %(id)s in product '%(prod)s' does not exist."
raise ResourceNotFound(_(msg, id=ticketid, prod=productid),
_("Invalid ticket number"))
return self._process_ticket_request(req)
- return self._process_newticket_request(req)
-
+
+ # executed in global scope -> assume ticketid=UID, redirect to product
+ with self.env.db_direct_query as db:
+ rows = db("""SELECT id,product FROM ticket WHERE uid=%s""",
+ (ticketid,))
+ if not rows:
+ msg = "Ticket with uid %(uid)s does not exist."
+ raise ResourceNotFound(_(msg, uid=ticketid),
+ _("Invalid ticket number"))
+ tid, prefix = rows[0]
+ req.redirect(req.href.products(prefix, 'ticket', tid))
+
# INavigationContributor methods
#def get_active_navigation_item(self, req):
Modified: bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py
URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py?rev=1521084&r1=1521083&r2=1521084&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py (original)
+++ bloodhound/trunk/bloodhound_multiproduct/multiproduct/web_ui.py Mon Sep 9 12:57:35 2013
@@ -21,10 +21,12 @@
Provides request filtering to capture product related paths
"""
+import re
+
from trac.core import Component, TracError, implements
from trac.resource import Neighborhood, Resource, ResourceNotFound
from trac.util.translation import _
-from trac.web.api import HTTPNotFound, IRequestHandler
+from trac.web.api import HTTPNotFound, IRequestHandler, IRequestFilter
from trac.web.chrome import (
Chrome, INavigationContributor, add_link, add_notice, add_warning,
prevnext_nav, web_context
@@ -32,12 +34,29 @@ from trac.web.chrome import (
from multiproduct.hooks import PRODUCT_RE
from multiproduct.model import Product
+from multiproduct.env import ProductEnvironment
+
+# requests to the following URLs will be skipped in the global scope
+# (no more redirection to default product)
+IGNORED_REQUESTS_RE = \
+ re.compile(r'^/(?P<section>milestone|roadmap|diff|search|'
+ r'(raw-|zip-)?attachment/(ticket|milestone))(?P<pathinfo>.*)')
class ProductModule(Component):
"""Base Product behaviour"""
- implements(IRequestHandler)
+ implements(IRequestFilter, IRequestHandler)
+
+ # IRequestFilter methods
+ def pre_process_request(self, req, handler):
+ if not isinstance(self.env, ProductEnvironment) and \
+ IGNORED_REQUESTS_RE.match(req.path_info):
+ return None
+ return handler
+
+ def post_process_request(req, template, data, content_type):
+ return template, data, content_type
# IRequestHandler methods
def match_request(self, req):
Modified: bloodhound/trunk/bloodhound_theme/bhtheme/theme.py
URL: http://svn.apache.org/viewvc/bloodhound/trunk/bloodhound_theme/bhtheme/theme.py?rev=1521084&r1=1521083&r2=1521084&view=diff
==============================================================================
--- bloodhound/trunk/bloodhound_theme/bhtheme/theme.py (original)
+++ bloodhound/trunk/bloodhound_theme/bhtheme/theme.py Mon Sep 9 12:57:35 2013
@@ -486,15 +486,7 @@ class QuickCreateTicketDialog(Component)
if self.env.product:
product_field['value'] = self.env.product.prefix
else:
- # Global scope, now check default_product_prefix is valid
- default_prefix = self.config.get('multiproduct',
- 'default_product_prefix')
- try:
- ProductEnvironment.lookup_env(self.env, default_prefix)
- except LookupError:
- product_field['value'] = product_field['options'][0]
- else:
- product_field['value'] = default_prefix
+ product_field['value'] = product_field['options'][0]
product_field['options_desc'] = [
ProductEnvironment.lookup_env(self.env, p).product.name
for p in product_field['options']