You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bloodhound.apache.org by ju...@apache.org on 2013/01/11 15:20:22 UTC

svn commit: r1432059 - in /incubator/bloodhound/branches/bep_0003_multiproduct: bloodhound_multiproduct/multiproduct/env.py bloodhound_multiproduct/multiproduct/hooks.py trac/trac/hooks.py trac/trac/web/main.py

Author: jure
Date: Fri Jan 11 14:20:22 2013
New Revision: 1432059

URL: http://svn.apache.org/viewvc?rev=1432059&view=rev
Log:
Towards integrating #115 and #288, still wip


Modified:
    incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/env.py
    incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py
    incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/hooks.py
    incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/web/main.py

Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/env.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/env.py?rev=1432059&r1=1432058&r2=1432059&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/env.py (original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/env.py Fri Jan 11 14:20:22 2013
@@ -24,15 +24,41 @@ from urlparse import urlsplit
 from trac.config import ConfigSection, Option
 from trac.core import Component, ComponentManager, implements
 from trac.db.api import with_transaction
-from trac.env import Environment, ISystemInfoProvider
 from trac.util import get_pkginfo, lazy
 from trac.util.compat import sha1
 from trac.versioncontrol import RepositoryManager
 from trac.web.href import Href
 
+import trac.env
+
 from multiproduct.model import Product
 from multiproduct.dbcursor import BloodhoundIterableCursor
 
+class Environment(trac.env.Environment):
+    """Bloodhound environment manager
+
+    This class is intended as monkey-patch replacement for
+    trac.env.Environment. Required database access methods/properties
+    are replaced to provide global view of the database in contrast
+    to ProductEnvironment that features per-product view of the database
+    (in the context of selected product).
+    """
+    def __init__(self, path, create=False, options=[]):
+        super(Environment, self).__init__(path, create=create, options=options)
+        # global environment w/o parent
+        self.env = None
+        self.product = None
+
+    @property
+    def db_query(self):
+        BloodhoundIterableCursor.set_env(self)
+        return super(Environment, self).db_query
+
+    @property
+    def db_transaction(self):
+        BloodhoundIterableCursor.set_env(self)
+        return super(Environment, self).db_transaction
+
 class ProductEnvironment(Component, ComponentManager):
     """Bloodhound product-aware environment manager.
 
@@ -54,7 +80,7 @@ class ProductEnvironment(Component, Comp
     See https://issues.apache.org/bloodhound/wiki/Proposals/BEP-0003
     """
 
-    implements(ISystemInfoProvider)
+    implements(trac.env.ISystemInfoProvider)
 
     @property
     def system_info_providers(self):
@@ -197,6 +223,7 @@ class ProductEnvironment(Component, Comp
 
         self.env = env
         self.product = product
+        self.path = self.env.path
         self.systeminfo = []
         self._href = self._abs_href = None
 
@@ -208,14 +235,14 @@ class ProductEnvironment(Component, Comp
         return self.env.get_system_info()
 
     # Same as parent environment's . Avoid duplicated code
-    component_activated = Environment.component_activated.im_func
-    _component_name = Environment._component_name.im_func
-    _component_rules = Environment._component_rules
-    enable_component = Environment.enable_component.im_func
-    get_known_users = Environment.get_known_users.im_func
-    get_systeminfo = Environment.get_system_info.im_func
-    get_repository = Environment.get_repository.im_func
-    is_component_enabled = Environment.is_component_enabled.im_func
+    component_activated = trac.env.Environment.component_activated.im_func
+    _component_name = trac.env.Environment._component_name.im_func
+    _component_rules = trac.env.Environment._component_rules
+    enable_component = trac.env.Environment.enable_component.im_func
+    get_known_users = trac.env.Environment.get_known_users.im_func
+    get_systeminfo = trac.env.Environment.get_system_info.im_func
+    get_repository = trac.env.Environment.get_repository.im_func
+    is_component_enabled = trac.env.Environment.is_component_enabled.im_func
 
     def get_db_cnx(self):
         """Return a database connection from the connection pool

Modified: incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py?rev=1432059&r1=1432058&r2=1432059&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py (original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py Fri Jan 11 14:20:22 2013
@@ -15,16 +15,31 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
+import re
+
 from trac.hooks import EnvironmentFactoryBase, GlobalHooksBase
 import trac.env
 import trac.db.util
+
 from multiproduct.dbcursor import BloodhoundIterableCursor
+from multiproduct.env import Environment, ProductEnvironment
+
+PRODUCT_RE = re.compile(r'^/products/(?P<pid>[^/]*)(?P<pathinfo>.*)')
 
 class MultiProductEnvironmentFactory(EnvironmentFactoryBase):
-    def open_environment(self, environ, env_path, use_cache=False):
-        return None
+    def open_environment(self, environ, env_path, global_env, use_cache=False):
+        env = pid = None
+        path_info = environ.get('PATH_INFO')
+        if not path_info:
+            return env
+        m = PRODUCT_RE.match(path_info)
+        if m:
+            pid = m.group('pid')
+        if pid:
+            env = ProductEnvironment(global_env, pid)
+        return env
 
 class MultiProductGlobalHooks(GlobalHooksBase):
     def install_hooks(self, environ, env_path):
-        # trac.env.Environment = BloodhoundEnvironment
+        trac.env.Environment = Environment
         trac.db.util.IterableCursor = BloodhoundIterableCursor

Modified: incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/hooks.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/hooks.py?rev=1432059&r1=1432058&r2=1432059&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/hooks.py (original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/hooks.py Fri Jan 11 14:20:22 2013
@@ -24,7 +24,7 @@ from config import Configuration
 __all__ = ['environment_factory', 'install_global_hooks']
 
 class EnvironmentFactoryBase(object):
-    def open_environment(self, environ, env_path, use_cache=False):
+    def open_environment(self, environ, env_path, global_env, use_cache=False):
         return None
 
 class GlobalHooksBase(object):
@@ -48,21 +48,21 @@ def _hook_load(env_path, hook_path):
 def _get_hook_class(env_path, hook_path, class_type):
     module = _hook_load(env_path, hook_path)
     for (name, cls) in inspect.getmembers(module, inspect.isclass):
-        if issubclass(cls, class_type):
+        if issubclass(cls, class_type) and \
+           not cls is class_type:
             return cls
     return None
 
-def environment_factory(environ, env_path):
-    config = _get_config(env_path)
-    hook_path = config.get('hooks', 'environment_factory', default=None)
-    return _get_hook_class(env_path, hook_path, EnvironmentFactoryBase) if hook_path else None
-
 def install_global_hooks(environ, env_path):
     config = _get_config(env_path)
-    hook_paths = config.get('hooks', 'global_hooks', default=None)
+    hook_paths = config.get('trac', 'global_hooks', default=None)
     if hook_paths:
         for hook_path in hook_paths.split(','):
             cls = _get_hook_class(env_path, hook_path, GlobalHooksBase)
             if cls:
                 cls().install_hooks(environ, env_path)
     return
+
+def environment_factory(env):
+    hook_path = env.config.get('trac', 'environment_factory', default=None)
+    return _get_hook_class(env.path, hook_path, EnvironmentFactoryBase) if hook_path else None

Modified: incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/web/main.py
URL: http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/web/main.py?rev=1432059&r1=1432058&r2=1432059&view=diff
==============================================================================
--- incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/web/main.py (original)
+++ incubator/bloodhound/branches/bep_0003_multiproduct/trac/trac/web/main.py Fri Jan 11 14:20:22 2013
@@ -437,9 +437,11 @@ def dispatch_request(environ, start_resp
     try:
         from trac.hooks import environment_factory, install_global_hooks
         install_global_hooks(environ, env_path)
-        factory = environment_factory(environ, env_path)
-        env = factory().open_environment(environ, env_path, use_cache=not run_once) if factory \
-                else open_environment(env_path, use_cache=not run_once)
+        global_env = open_environment(env_path, use_cache=not run_once)
+        factory = environment_factory(global_env)
+        factory_env = factory().open_environment(environ, env_path, global_env, use_cache=not run_once) if factory \
+                        else None
+        env = factory_env if factory_env else global_env
         if env.base_url_for_redirect:
             environ['trac.base_url'] = env.base_url