def __getattribute__(self, name): """ Get Attribute from module At this point, Reviewboard extensions dont provide a way to get Request object during every page load. The Dashboard hook gets its entries when its loaded and uses it for all pages. This method uses a (ugly) hack to get the stacktrace from the current page and get the request object(and hence the user object) so I can do user specific things. This will change in the future when RB provides per-page hooks (as in NavigationBarHook) """ if name == 'entries': import sys f = sys._getframe() username = None while f: request = f.f_locals.get('request') if isinstance(request, HttpRequest): username = request.user.username break f = f.f_back site_root = settings.SITE_ROOT entries = [ { 'label': 'My Feeds', 'url': '#', 'subitems': [ { 'label': 'RSS', 'url': "%sfeeds/feed/%s" % (site_root, username) }, { 'label': 'Atom 1', 'url': "%sfeeds/feed/%s?type=atom" % (site_root, username) } ] }, { 'label': 'All Review Feeds', 'url': "%sfeeds/r/" % (site_root,) } ] return entries else: return DashboardHook.__getattribute__(self, name)
def test_dashboard_hook(self): """Testing dashboard sidebar extension hooks""" entry = { 'label': 'My Hook', 'url': 'foo-url', } hook = DashboardHook(extension=self.extension, entries=[entry]) context = Context({ 'dashboard_hook': hook, }) entries = hook.entries self.assertEqual(len(entries), 1) self.assertEqual(entries[0], entry) t = Template("{% load rb_extensions %}" "{% for hook in dashboard_hook.entries %}" "{{hook.label}} - {{hook.url}}" "{% endfor %}") self.assertEqual( t.render(context).strip(), '%(label)s - %(url)s' % entry)
from django.conf import settings from django.conf.urls.defaults import patterns, include from reviewboard.extensions.base import Extension {%- if dashboard_link is not none %} from reviewboard.extensions.hooks import DashboardHook, URLHook {% endif %} {%- if dashboard_link is not none %} class {{class_name}}URLHook(URLHook): def __init__(self, extension, *args, **kwargs): pattern = patterns('', (r'^{{package_name}}/', include('{{package_name}}.urls'))) super({{class_name}}URLHook, self).__init__(extension, pattern) class {{class_name}}DashboardHook(DashboardHook): def __init__(self, extension, *args, **kwargs): entries = [{ 'label': '{{dashboard_link}}', 'url': settings.SITE_ROOT + '{{package_name}}/', }] super({{class_name}}DashboardHook, self).__init__(extension, entries=entries, *args, **kwargs) {%- endif %} class {{class_name}}(Extension): {%- if is_configurable %} is_configurable = True {%- endif %} def __init__(self, *args, **kwargs):
def __getattribute__(self, name): """ Get Attribute from module At this point, Reviewboard extensions dont provide a way to get Request object during every page load. The Dashboard hook gets its entries when its loaded and uses it for all pages. This method uses a (ugly) hack to get the stacktrace from the current page and get the request object(and hence the user object) so I can do user specific things. This will change in the future when RB provides per-page hooks (as in NavigationBarHook) """ if name == 'entries': import sys f = sys._getframe() username = None while f: request = f.f_locals.get('request') if isinstance(request, HttpRequest): username = request.user.username break f = f.f_back if len(self.extension.settings['selected_reports']) == 0: return # Set the basic details for the hooks (minus subitems) entries = [ { 'label': 'Reports', 'url': '#', 'subitems': [] } ] # Populate the subitems with what reports have been configured for report in self.extension.settings['selected_reports']: if report in self.report_details: entries[0]['subitems'].append(self.report_details[report]) user = User.objects.filter(username=username) repositories = Repository.objects.filter(Q(public=1) | Q(users__in=user) | Q(review_groups__users__in=user)) if len(repositories) == 0: return entries else: if 'filter_by_repo' in \ self.extension.settings['selected_reports']: filter_entries = { 'label': 'Filter by Repository', 'url': '#', } subitems = [] for repo in repositories: subitem = {'label': str(repo.name), 'url': settings.SITE_ROOT + "customreports/?name=filter_by_repo&object=" + str(repo.id) } subitems.append(subitem) filter_entries['subitems'] = subitems entries.append(filter_entries) return entries else: return DashboardHook.__getattribute__(self, name)