From: Maurits v. R. <svn...@pl...> - 2008-08-21 18:52:23
|
Author: maurits Date: Thu Aug 21 18:52:20 2008 New Revision: 70294 Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/bookings.py Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/iterations.py Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/offers.py Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/poi.py Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/projects.py Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/stories.py Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/tasks.py Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/xmbase.py Log: Using zope.cachedescriptors.property.Lazy to avoid getting portal_workflow or portal_catalog far too many times. Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/bookings.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/bookings.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/bookings.py Thu Aug 21 18:52:20 2008 @@ -1,7 +1,7 @@ -from Products.CMFCore.utils import getToolByName +from zope.cachedescriptors.property import Lazy from DateTime import DateTime -from Products.Five.browser import BrowserView from Acquisition import aq_inner +from Products.CMFCore.utils import getToolByName from xm.booking.timing.interfaces import IActualHours from Products.eXtremeManagement.browser.xmbase import XMBaseView @@ -111,7 +111,7 @@ return DateTime.latestTime(DateTime(year, month, day)) -class BookingsDetailedView(BrowserView): +class BookingsDetailedView(XMBaseView): """Return a list of Bookings. """ request = None @@ -119,9 +119,7 @@ bookinglist = [] def __init__(self, context, request, year=None, month=None, memberid=None): - self.context = context - self.request = request - self.catalog = getToolByName(context, 'portal_catalog') + super(BookingsDetailedView, self).__init__(context, request) self.year = year or self.request.form.get('year', DateTime().year()) self.month = month or self.request.form.get('month', DateTime().month()) @@ -133,7 +131,8 @@ self.next = self.request.form.get('next') self.memberid = memberid or self.request.form.get('memberid') if self.memberid is None: - member = context.portal_membership.getAuthenticatedMember() + membership = getToolByName(context, 'portal_membership') + member = membership.getAuthenticatedMember() self.memberid = member.id if self.previous: @@ -186,12 +185,15 @@ ) return month_info + @Lazy + def toLocalizedTime(self): + """Get the toLocalizedTime method from the plone view.""" + context = aq_inner(self.context) + return context.restrictedTraverse('@@plone').toLocalizedTime + def bookingbrain2extended_dict(self, bookingbrain): """Get a dict with extended info from this booking brain. - """ - context = aq_inner(self.context) - """ booking = bookingbrain.getObject() project = booking.getProject() # This would wake up all objects between the Booking and the Project... @@ -223,9 +225,8 @@ search_filter = dict(portal_type=['Task', 'PoiTask'], path=path) taskbrain = self.catalog(**search_filter)[0] - toLocalizedTime = context.restrictedTraverse('@@plone').toLocalizedTime returnvalue = dict( - booking_date = toLocalizedTime(bookingbrain.getBookingDate), + booking_date = self.toLocalizedTime(bookingbrain.getBookingDate), day_of_week = bookingbrain.getBookingDate.Day(), project_title = project_title, task_url = taskbrain.getURL(), @@ -316,8 +317,8 @@ day_of_week = 0 daylist = [] raw_total = 0.0 - days_bookings = DayBookingOverview(context, request, - memberid=self.memberid) + days_bookings = DayBookingOverview( + context, request, memberid=self.memberid) week_billable = 0.0 worked_days = 0 while day_of_week < 7: @@ -383,15 +384,13 @@ self.perc_billable = self.perc_billable / num_weeks -class YearBookingOverview(BrowserView): +class YearBookingOverview(XMBaseView): request = None context = None months_list = [] def __init__(self, context, request): super(YearBookingOverview, self).__init__(context, request) - self.catalog = getToolByName(context, 'portal_catalog') - self.base_year = int(self.request.form.get('base_year', DateTime().year())) self.base_month = DateTime().month() @@ -443,7 +442,6 @@ """Get a dict with info from this Booking. """ context = aq_inner(self.context) - workflow = getToolByName(context, 'portal_workflow') anno = IActualHours(context, None) if anno is not None: actual = anno.actual_time @@ -465,18 +463,17 @@ return returnvalue -class DayBookingOverview(BrowserView): +class DayBookingOverview(XMBaseView): request = None context = None def __init__(self, context, request, memberid=None): super(DayBookingOverview, self).__init__(context, request) - self.catalog = getToolByName(context, 'portal_catalog') - self.memberid = memberid or self.request.form.get('memberid') memberid = memberid or self.request.form.get('memberid') if self.memberid is None: - member = context.portal_membership.getAuthenticatedMember() + membership = getToolByName(context, 'portal_membership') + member = membership.getAuthenticatedMember() self.memberid = member.id self.searchpath = '/'.join(context.getPhysicalPath()) Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/iterations.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/iterations.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/iterations.py Thu Aug 21 18:52:20 2008 @@ -19,7 +19,6 @@ """Get a dict with info from this Context. """ context = aq_inner(self.context) - workflow = getToolByName(context, 'portal_workflow') anno = IActualHours(context, None) if anno is not None: actual = anno.actual_time @@ -39,7 +38,7 @@ size_estimate = sum([item.size_estimate for item in items if item.size_estimate is not None]) - review_state = workflow.getInfoFor(context, 'review_state') + review_state = self.workflow.getInfoFor(context, 'review_state') if review_state in ['completed', 'invoiced']: budget_left = None else: @@ -86,10 +85,6 @@ """ context = aq_inner(self.context) review_state_id = brain.review_state - # TODO: the following two lines are executed for every story: better - # just grab them once with an @Lazy. [reinout] - workflow = getToolByName(context, 'portal_workflow') - catalog = getToolByName(context, 'portal_catalog') # compute progress percentage is_completed = (review_state_id == 'completed') @@ -106,12 +101,12 @@ path=searchpath) unfinished_states = ('open', 'to-do', ) filter['review_state'] = unfinished_states - open_tasks = len(catalog.searchResults(**filter)) + open_tasks = len(self.catalog.searchResults(**filter)) # compute completed task count finished_states = ('completed', ) filter['review_state'] = finished_states - completed_tasks = len(catalog.searchResults(**filter)) + completed_tasks = len(self.catalog.searchResults(**filter)) estimate = brain.estimate actual = brain.actual_time @@ -128,7 +123,7 @@ difference = formatTime(estimate - actual), progress = progress, review_state = review_state_id, - review_state_title = workflow.getTitleForStateOnType( + review_state_title = self.workflow.getTitleForStateOnType( review_state_id, 'Story'), is_completed = is_completed, open_tasks = open_tasks, Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/offers.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/offers.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/offers.py Thu Aug 21 18:52:20 2008 @@ -27,7 +27,6 @@ story_list = [] - workflow = getToolByName(context, 'portal_workflow') membership = getToolByName(context, 'portal_membership') for storybrain in storybrains: @@ -49,7 +48,7 @@ main_text = story_obj.getMainText(), size_estimate = storybrain.size_estimate, review_state = review_state, - review_state_title = workflow.getTitleForStateOnType( + review_state_title = self.workflow.getTitleForStateOnType( review_state, 'Story'), show_draft_story = show_draft and is_draft, draft_class = draft_class, Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/poi.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/poi.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/poi.py Thu Aug 21 18:52:20 2008 @@ -3,12 +3,12 @@ from Acquisition import aq_inner, aq_parent from zope import interface from zope.component import getMultiAdapter -from Products.Five import BrowserView from Products.CMFCore.utils import getToolByName from Products.Archetypes.interfaces import IReferenceable from Products.statusmessages.interfaces import IStatusMessage from Products.eXtremeManagement.interfaces.xmissuegetter import IXMIssueGetter +from Products.eXtremeManagement.browser.xmbase import XMBaseView def abbreviate(text, width=15, ellipsis='...'): @@ -58,7 +58,7 @@ """ -class PoiView(BrowserView): +class PoiView(XMBaseView): request = None context = None @@ -87,7 +87,8 @@ return ([i for i in issues if i not in ignore], ignore) def get_open_issues_in_project(self, **kwargs): - return getMultiAdapter((self.context, self.request), + context = aq_inner(self.context) + return getMultiAdapter((context, self.request), IXMIssueGetter).get_issues(**kwargs) def get_open_stories_in_project(self, **kwargs): @@ -147,7 +148,6 @@ return [] value = [] - workflow = getToolByName(self.context, 'portal_workflow') tasks = self.context.getBRefs('task_issues') tasks = sorted(tasks, @@ -158,7 +158,7 @@ dict(iterationid=task.getPhysicalPath()[-3], title=abbreviate(task.Title() or task.getId(), width=25), url=task.absolute_url(), - state=workflow.getInfoFor(task, 'review_state'))) + state=self.workflow.getInfoFor(task, 'review_state'))) return value def stories_to_add_to(self): Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/projects.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/projects.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/projects.py Thu Aug 21 18:52:20 2008 @@ -1,6 +1,5 @@ from Acquisition import aq_inner from Products.CMFCore.utils import getToolByName -from Products.Five.browser import BrowserView from zope.cachedescriptors.property import Lazy from plone.memoize.view import memoize from zope.component import getMultiAdapter @@ -16,7 +15,7 @@ from Products.eXtremeManagement.utils import formatTime -class MyProjects(BrowserView): +class MyProjects(XMBaseView): """Return the projects that I have tasks in. """ request = None @@ -29,8 +28,7 @@ def projectlist(self): context = aq_inner(self.context) # Get a list of all projects - catalog = getToolByName(context, 'portal_catalog') - projectbrains = catalog.searchResults(portal_type='Project') + projectbrains = self.catalog.searchResults(portal_type='Project') if len(projectbrains) <= 1: # If there is maximal 1 project: return it... @@ -56,7 +54,7 @@ plist = [] for projectbrain in projectbrains: searchpath = projectbrain.getPath() - taskbrains = catalog.searchResults(portal_type=['Task', + taskbrains = self.catalog.searchResults(portal_type=['Task', 'PoiTask'], getAssignees=memberid, review_state=self.states, @@ -75,17 +73,16 @@ context = aq_inner(self.context) searchpath = '/'.join(context.getPhysicalPath()) # Get a list of all projects - catalog = getToolByName(context, 'portal_catalog') - projectbrains = catalog.searchResults(portal_type='Project', + projectbrains = self.catalog.searchResults(portal_type='Project', path=searchpath) plist = [] for projectbrain in projectbrains: searchpath = projectbrain.getPath() # Search for Iterations that are ready to get invoiced - iterationbrains = catalog.searchResults(portal_type='Iteration', - review_state='completed', - path=searchpath) + iterationbrains = self.catalog.searchResults( + portal_type='Iteration', review_state='completed', + path=searchpath) if len(iterationbrains) > 0: iteration_list = [] for iterationbrain in iterationbrains: @@ -99,9 +96,7 @@ def iterationbrain2dict(self, brain): """Get a dict with info from this iteration brain. """ - context = aq_inner(self.context) review_state_id = brain.review_state - workflow = getToolByName(context, 'portal_workflow') estimate = brain.estimate actual = brain.actual_time returnvalue = dict( @@ -114,7 +109,7 @@ actual = formatTime(actual), difference = formatTime(estimate - actual), review_state = review_state_id, - review_state_title = workflow.getTitleForStateOnType( + review_state_title = self.workflow.getTitleForStateOnType( review_state_id, 'Iteration'), brain= brain, ) @@ -123,7 +118,6 @@ def projectbrain2dict(self, brain): """Get a dict with info from this project brain. """ - context = aq_inner(self.context) returnvalue = dict( url = brain.getURL(), title = brain.Title, @@ -140,7 +134,6 @@ """Get a dict with info from this context. """ context = aq_inner(self.context) - workflow = getToolByName(context, 'portal_workflow') returnvalue = dict( title = context.Title(), description = context.Description(), Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/stories.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/stories.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/stories.py Thu Aug 21 18:52:20 2008 @@ -18,7 +18,6 @@ """Get a dict with info from this Story. """ context = aq_inner(self.context) - workflow = getToolByName(context, 'portal_workflow') # get info for previous and next links iteration = aq_parent(context) @@ -33,7 +32,7 @@ description = context.Description(), cooked_body = context.CookedBody(), rough_estimate = context.getRoughEstimate(), - review_state = workflow.getInfoFor(context, 'review_state'), + review_state = self.workflow.getInfoFor(context, 'review_state'), prev = prev, next = next, ) Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/tasks.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/tasks.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/tasks.py Thu Aug 21 18:52:20 2008 @@ -22,7 +22,6 @@ def __init__(self, context, request): super(TaskView, self).__init__(context, request) - propstool = getToolByName(context, 'portal_properties') self.friendlyDateFormat = propstool.site_properties.getProperty( 'friendlyDateFormat', None) @@ -31,7 +30,6 @@ """Get a dict with info from this Task. """ context = aq_inner(self.context) - workflow = getToolByName(self.context, 'portal_workflow') anno = IActualHours(context, None) if anno is not None: actual = anno.actual_time @@ -51,7 +49,7 @@ estimate = formatTime(estimate), actual = formatTime(actual), difference = formatTime(estimate - actual), - review_state = workflow.getInfoFor(context, 'review_state'), + review_state = self.workflow.getInfoFor(context, 'review_state'), assignees = [{'niceName': context.poi_niceName(username=x), 'username': x, 'active': True} @@ -62,10 +60,9 @@ def bookings(self): context = aq_inner(self.context) current_path = '/'.join(context.getPhysicalPath()) - catalog = getToolByName(context, 'portal_catalog') - bookingbrains = catalog.searchResults(portal_type='Booking', - sort_on='getBookingDate', - path=current_path) + bookingbrains = self.catalog.searchResults(portal_type='Booking', + sort_on='getBookingDate', + path=current_path) booking_list = [] for bookingbrain in bookingbrains: @@ -78,9 +75,7 @@ """Get a dict with info from this booking brain. """ context = aq_inner(self.context) - realDate = brain.getBookingDate - ploneview = context.restrictedTraverse('@@plone') date = ploneview.toLocalizedTime(realDate, self.friendlyDateFormat) @@ -106,7 +101,7 @@ return returnvalue -class TasksDetailedView(BrowserView): +class TasksDetailedView(XMBaseView): """Return a list of Tasks for everyone with all states. """ request = None @@ -114,7 +109,6 @@ def __init__(self, context, request): super(TasksDetailedView, self).__init__(context, request) - self.catalog = getToolByName(context, 'portal_catalog') self.filter = dict(portal_type=['Task', 'PoiTask'], sort_on='getObjPositionInParent') @@ -175,9 +169,7 @@ def taskbrain2dict(self, brain): """Get a dict with info from this task brain. """ - context = aq_inner(self.context) review_state_id = brain.review_state - workflow = getToolByName(context, 'portal_workflow') # Get info about parent Story parentPath = '/'.join(brain.getPath().split('/')[:-1]) @@ -197,7 +189,7 @@ actual = formatTime(actual), difference = formatTime(estimate - actual), review_state = review_state_id, - review_state_title = workflow.getTitleForStateOnType( + review_state_title = self.workflow.getTitleForStateOnType( review_state_id, 'Task'), assignees = brain.getAssignees, ) @@ -262,7 +254,6 @@ def __init__(self, context, request): super(EmployeeTotalsView, self).__init__(context, request) - self.catalog = getToolByName(context, 'portal_catalog') def totals(self): context = aq_inner(self.context) Modified: Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/xmbase.py ============================================================================== --- Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/xmbase.py (original) +++ Products.eXtremeManagement/trunk/Products/eXtremeManagement/browser/xmbase.py Thu Aug 21 18:52:20 2008 @@ -1,4 +1,7 @@ +from Acquisition import aq_inner +from Products.CMFCore.utils import getToolByName from Products.Five.browser import BrowserView +from zope.cachedescriptors.property import Lazy class XMBaseView(BrowserView): @@ -15,3 +18,13 @@ """Get a dict with info from this object. """ return {} + + @Lazy + def workflow(self): + context = aq_inner(self.context) + return getToolByName(context, 'portal_workflow') + + @Lazy + def catalog(self): + context = aq_inner(self.context) + return getToolByName(context, 'portal_catalog') |