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']