Author: matevz
Date: Fri Mar 15 09:38:32 2013
New Revision: 1456836

URL: http://svn.apache.org/r1456836
Log:
#325 - Multiproduct UI: Dashboard (initial implementation - product widget)

Added:
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/product.py
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/templates/widget_product.html
Modified:
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/layouts/templates/bs_grid_full.html
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/web_ui.py
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/setup.py
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_theme/bhtheme/theme.py

Modified: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/layouts/templates/bs_grid_full.html
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/layouts/templates/bs_grid_full.html?rev=1456836&r1=1456835&r2=1456836&view=diff
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/layouts/templates/bs_grid_full.html
 (original)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/layouts/templates/bs_grid_full.html
 Fri Mar 15 09:38:32 2013
@@ -22,13 +22,15 @@
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
 <html xmlns="http://www.w3.org/1999/xhtml";
       xmlns:py="http://genshi.edgewall.org/";
-      xmlns:xi="http://www.w3.org/2001/XInclude";>
+      xmlns:xi="http://www.w3.org/2001/XInclude";
+      py:with="is_global = req.perm.env.product is None">
   <xi:include href="layout.html" />
   <head>
     <title>$title</title>
   </head>
 
   <body>
+    <h2 py:if="not is_global">Dashboard for product 
<i>${req.perm.env.product.name}</i></h2>
     <xi:include href="bs_grid.html" />
     <div id="ft" class="row">
       <div id="help">

Modified: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/web_ui.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/web_ui.py?rev=1456836&r1=1456835&r2=1456836&view=diff
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/web_ui.py
 (original)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/web_ui.py
 Fri Mar 15 09:38:32 2013
@@ -47,6 +47,7 @@ from trac.web.chrome import add_ctxtnav,
 
 from bhdashboard.api import DashboardSystem, InvalidIdentifier
 from bhdashboard import _json
+from multiproduct.env import ProductEnvironment
 
 class DashboardModule(Component):
     """Web frontend for dashboard infrastructure.
@@ -71,6 +72,9 @@ class DashboardModule(Component):
         """
         if data is not None :
             data['bhdb'] = DashboardChrome(self.env)
+            if isinstance(req.perm.env, ProductEnvironment) and \
+                data.get('product_list'):
+                data['resourcepath_template'] = 'bh_path_general.html'
         for item in req.chrome['nav'].get('mainnav', []):
             self.log.debug('%s' % (item,))
             if item['name'] == 'tickets':
@@ -89,6 +93,7 @@ class DashboardModule(Component):
         return bool(re.match(r'^/dashboard(/.)?', req.path_info))
 
     def process_request(self, req):
+        req.perm.require('PRODUCT_VIEW')
         """Initially this will render static widgets. With time it will be 
         more and more dynamic and flexible.
         """
@@ -149,8 +154,8 @@ class DashboardModule(Component):
                                 {
                                     '_class' : 'span8',
                                     'widgets' : ['my tickets', 'active 
tickets',
-                                                 'versions', 'milestones',
-                                                 'components']
+                                                 'products', 'versions',
+                                                 'milestones', 'components']
                                 },
                                 {
                                     '_class' : 'span4',
@@ -218,6 +223,9 @@ class DashboardModule(Component):
                     'activity': {
                             'args' : ['Timeline', None, {'args' : {}}]
                         },
+                    'products': {
+                            'args' : ['Product', None, {'args': {}}]
+                        },
                }
         }
 

Added: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/product.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/product.py?rev=1456836&view=auto
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/product.py
 (added)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/product.py
 Fri Mar 15 09:38:32 2013
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+
+r"""Project dashboard for Apache(TM) Bloodhound
+
+Widgets displaying product information (multiproduct).
+"""
+
+from trac.util.translation import _
+
+from bhdashboard.util import WidgetBase, check_widget_name, pretty_wrapper
+
+from multiproduct.env import Product, ProductEnvironment
+
+
+__metaclass__ = type
+
+class ProductWidget(WidgetBase):
+    """Display products available to the user.
+    """
+    def get_widget_params(self, name):
+        """Return a dictionary containing arguments specification for
+        the widget with specified name.
+        """
+        return {
+                'max' : {
+                        'desc' : """Limit the number of products displayed""",
+                        'type' : int
+                    },
+            }
+
+    get_widget_params = pretty_wrapper(get_widget_params, check_widget_name)
+
+    def render_widget(self, name, context, options):
+        """Gather product list and render data in compact view
+        """
+        data = {}
+        req = context.req
+        title = ''
+
+        if not isinstance(req.perm.env, ProductEnvironment):
+            data['product_list'] = [p for p in Product.select(self.env)
+                if 'PRODUCT_VIEW' in req.product_perm(p.prefix)]
+            title = _('Products')
+
+        return 'widget_product.html', \
+            { 'title': title, 'data': data, }, context
+
+    render_widget = pretty_wrapper(render_widget, check_widget_name)
+

Added: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/templates/widget_product.html
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/templates/widget_product.html?rev=1456836&view=auto
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/templates/widget_product.html
 (added)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/bhdashboard/widgets/templates/widget_product.html
 Fri Mar 15 09:38:32 2013
@@ -0,0 +1,38 @@
+<!--!
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<div id="content" class="product"
+  xmlns="http://www.w3.org/1999/xhtml";
+  xmlns:py="http://genshi.edgewall.org/";
+  xmlns:xi="http://www.w3.org/2001/XInclude";>
+  <table py:if="product_list">
+    <thead>
+      <tr>
+        <th>${_('Name')}</th>
+        <th>${_('Prefix')}</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr py:for="p in product_list">
+        <td>$p.name</td>
+        <td><a href="${href.products(p.prefix)}">$p.prefix</a></td>
+      </tr>
+    </tbody>
+  </table>
+</div>

Modified: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/setup.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/setup.py?rev=1456836&r1=1456835&r2=1456836&view=diff
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/setup.py
 (original)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_dashboard/setup.py
 Fri Mar 15 09:38:32 2013
@@ -122,6 +122,7 @@ ENTRY_POINTS = r"""
                bhdashboard.macros = bhdashboard.macros
                bhdashboard.layouts.bootstrap = bhdashboard.layouts.bootstrap
                bhdashboard.widgets.containers = bhdashboard.widgets.containers
+               bhdashboard.widgets.product = bhdashboard.widgets.product
                bhdashboard.widgets.query = bhdashboard.widgets.query
                bhdashboard.widgets.report = bhdashboard.widgets.report
                bhdashboard.widgets.ticket = bhdashboard.widgets.ticket

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=1456836&r1=1456835&r2=1456836&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 Mar 15 09:38:32 2013
@@ -78,8 +78,9 @@ class ProductRequestWithSession(RequestW
     def __init__(self, env, environ, start_response):
         super(ProductRequestWithSession, self).__init__(environ, 
start_response)
         self.base_url = env.base_url
-        self.href = ProductizedHref(self.href, env.href.base)
-        self.abs_href = ProductizedHref(self.abs_href, env.abs_href.base)
+        if isinstance(env, multiproduct.env.ProductEnvironment):
+            self.href = ProductizedHref(self.href, env.href.base)
+            self.abs_href = ProductizedHref(self.abs_href, env.abs_href.base)
 
     def product_perm(self, product, resource=None):
         """Helper for per product permissions"""
@@ -95,7 +96,4 @@ class ProductRequestWithSession(RequestW
 
 class ProductRequestFactory(RequestFactoryBase):
     def create_request(self, env, environ, start_response):
-        if isinstance(env, multiproduct.env.ProductEnvironment):
-            return ProductRequestWithSession(env, environ, start_response)
-        else:
-            return RequestWithSession(environ, start_response)
\ No newline at end of file
+        return ProductRequestWithSession(env, environ, start_response)
\ No newline at end of file

Modified: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_theme/bhtheme/theme.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_theme/bhtheme/theme.py?rev=1456836&r1=1456835&r2=1456836&view=diff
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_theme/bhtheme/theme.py
 (original)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_theme/bhtheme/theme.py
 Fri Mar 15 09:38:32 2013
@@ -351,11 +351,7 @@ class BloodhoundTheme(ThemeBase):
         product_list = []
         is_product_scope = isinstance(req.perm.env, ProductEnvironment)
         for product in Product.select(self.env):
-            if is_product_scope:
-                if 'PRODUCT_VIEW' in req.product_perm(product.prefix, 
product.resource):
-                    product_list.append((product.prefix, product.name,
-                        href_fcn(product.prefix)))
-            else:
+            if 'PRODUCT_VIEW' in req.product_perm(product.prefix, 
product.resource):
                 product_list.append((product.prefix, product.name,
                     href_fcn(product.prefix)))
         return product_list


Reply via email to