예제 #1
0
 def __init__(self, parent, task, *args, **kwargs):
     super(BudgetPage, self).__init__(parent, task, *args, **kwargs)
     # Boxes:
     budgetBox = widgets.BoxWithFlexGridSizer(self, label=_('Budget'), cols=3)
     revenueBox = widgets.BoxWithFlexGridSizer(self, label=_('Revenue'), cols=3)
     # Editable entries:
     self._budgetEntry = TimeDeltaEntry(budgetBox, task.budget())
     self._hourlyFeeEntry = AmountEntry(revenueBox, task.hourlyFee())
     self._fixedFeeEntry = AmountEntry(revenueBox, task.fixedFee())
     # Readonly entries:
     if task.children():
         recursiveBudget = render.budget(task.budget(recursive=True))
         recursiveTimeSpent = render.timeSpent(task.timeSpent(recursive=True))
         recursiveBudgetLeft = render.budget(task.budgetLeft(recursive=True))
         recursiveFixedFee = render.amount(task.fixedFee(recursive=True))
         recursiveRevenue = render.amount(task.revenue(recursive=True))
     else:
         recursiveBudget = recursiveTimeSpent = recursiveBudgetLeft = \
         recursiveFixedFee = recursiveRevenue = ''
     # Fill the boxes:
     self.addHeaders(budgetBox)
     for entry in [_('Budget'), self._budgetEntry, recursiveBudget,
                   _('Time spent'), render.budget(task.timeSpent()), recursiveTimeSpent,
                   _('Budget left'), render.budget(task.budgetLeft()), recursiveBudgetLeft]:
         budgetBox.add(entry, flag=wx.ALIGN_RIGHT)
     
     self.addHeaders(revenueBox)
     for entry in [_('Hourly fee'), self._hourlyFeeEntry, '',
                   _('Fixed fee'), self._fixedFeeEntry, recursiveFixedFee,
                   _('Revenue'), render.amount(task.revenue()), recursiveRevenue]:
         revenueBox.add(entry, flag=wx.ALIGN_RIGHT)
     for box in budgetBox, revenueBox:
         box.fit()
         self.add(box, proportion=0, flag=wx.EXPAND|wx.ALL, border=5)
     self.fit()
예제 #2
0
 def _createColumns(self):
     return [widgets.Column(name, columnHeader, eventType, 
             renderCallback=renderCallback, width=self.getColumnWidth(name),
             resizeCallback=self.onResizeColumn) \
         for name, columnHeader, eventType, renderCallback in \
         ('period', _('Period'), 'effort.duration', self.renderPeriod),
         ('task', _('Task'), effort.Effort.taskChangedEventType(), lambda effort: effort.task().subject(recursive=True)),
         ('description', _('Description'), effort.Effort.descriptionChangedEventType(), lambda effort: effort.description())] + \
         [widgets.Column('categories', _('Categories'),
          width=self.getColumnWidth('categories'),
          renderCallback=self.renderCategory, 
          renderDescriptionCallback=lambda effort: effort.description(),
          resizeCallback=self.onResizeColumn)] + \
         [widgets.Column('totalCategories', _('Overall categories'),
          width=self.getColumnWidth('totalCategories'),
          renderCallback=lambda effort: self.renderCategory(effort, recursive=True),
          renderDescriptionCallback=lambda effort: effort.description(),
          resizeCallback=self.onResizeColumn)] + \
         [widgets.Column(name, columnHeader, eventType, 
          width=self.getColumnWidth(name), resizeCallback=self.onResizeColumn,
          renderCallback=renderCallback, alignment=wx.LIST_FORMAT_RIGHT) \
         for name, columnHeader, eventType, renderCallback in \
         ('timeSpent', _('Time spent'), 'effort.duration', 
             lambda effort: render.timeSpent(effort.duration())),
         ('revenue', _('Revenue'), 'effort.revenue', 
             lambda effort: render.amount(effort.revenue())),
         ('totalTimeSpent', _('Total time spent'), 'effort.totalDuration',  
              lambda effort: render.timeSpent(effort.duration(recursive=True))),
         ('totalRevenue', _('Total revenue'), 'effort.totalRevenue',
              lambda effort: render.amount(effort.revenue(recursive=True)))] + \
          [widgets.Column(name, columnHeader, eventType, 
           renderCallback=renderCallback, alignment=wx.LIST_FORMAT_RIGHT,
           width=self.getColumnWidth(name), resizeCallback=self.onResizeColumn) \
          for name, columnHeader, eventType, renderCallback in \
             ('monday', _('Monday'), 'effort.duration',  
              lambda effort: self.renderTimeSpentOnDay(effort, 0)),                             
             ('tuesday', _('Tuesday'), 'effort.duration',  
              lambda effort: self.renderTimeSpentOnDay(effort, 1)),
             ('wednesday', _('Wednesday'), 'effort.duration',  
              lambda effort: self.renderTimeSpentOnDay(effort, 2)),
             ('thursday', _('Thursday'), 'effort.duration',  
              lambda effort: self.renderTimeSpentOnDay(effort, 3)),
             ('friday', _('Friday'), 'effort.duration',  
              lambda effort: self.renderTimeSpentOnDay(effort, 4)),
             ('saturday', _('Saturday'), 'effort.duration',  
              lambda effort: self.renderTimeSpentOnDay(effort, 5)),
             ('sunday', _('Sunday'), 'effort.duration',  
              lambda effort: self.renderTimeSpentOnDay(effort, 6))      
          ]
예제 #3
0
 def __init__(self, parent, amount=0.0, readonly=False, *args, **kwargs):
     super(AmountEntry, self).__init__(parent, *args, **kwargs)
     if readonly:
         self._entry = wx.StaticText(self, label=render.amount(amount))
     else:
         self._entry = masked.NumCtrl(self, fractionWidth=2, allowNegative=False, value=amount)
     self.add(self._entry)
     self.fit()
예제 #4
0
 def _createColumns(self):
     kwargs = dict(renderDescriptionCallback=lambda task: task.description(),
                   resizeCallback=self.onResizeColumn)
     columns = [widgets.Column('subject', _('Subject'), 
             task.Task.subjectChangedEventType(), 
             'task.completionDate', 'task.dueDate', 'task.startDate',
             task.Task.trackStartEventType(), task.Task.trackStopEventType(), 
             sortCallback=uicommand.ViewerSortByCommand(viewer=self,
                 value='subject'),
             width=self.getColumnWidth('subject'), 
             imageIndexCallback=self.subjectImageIndex,
             renderCallback=self.renderSubject, **kwargs)] + \
         [widgets.Column('description', _('Description'), 
             task.Task.descriptionChangedEventType(), 
             sortCallback=uicommand.ViewerSortByCommand(viewer=self,
                 value='description'),
             renderCallback=lambda task: task.description(), 
             width=self.getColumnWidth('description'), **kwargs)] + \
         [widgets.Column('attachments', '', 
             task.Task.attachmentsChangedEventType(),
             width=self.getColumnWidth('attachments'),
             alignment=wx.LIST_FORMAT_LEFT,
             imageIndexCallback=self.attachmentImageIndex,
             headerImageIndex=self.imageIndex['attachment'],
             renderCallback=lambda task: '', **kwargs)]
     if self.settings.getboolean('feature', 'notes'):
         columns.append(widgets.Column('notes', '', 
             task.Task.notesChangedEventType(),
             width=self.getColumnWidth('notes'),
             alignment=wx.LIST_FORMAT_LEFT,
             imageIndexCallback=self.noteImageIndex,
             headerImageIndex=self.imageIndex['note'],
             renderCallback=lambda task: '', **kwargs))
     columns.extend(
         [widgets.Column('categories', _('Categories'), 
             task.Task.categoryAddedEventType(), 
             task.Task.categoryRemovedEventType(), 
             task.Task.categorySubjectChangedEventType(),
             sortCallback=uicommand.ViewerSortByCommand(viewer=self,
                                                        value='categories'),
             width=self.getColumnWidth('categories'),
             renderCallback=self.renderCategory, **kwargs)] + \
         [widgets.Column('totalCategories', _('Overall categories'),
             task.Task.totalCategoryAddedEventType(),
             task.Task.totalCategoryRemovedEventType(),
             task.Task.totalCategorySubjectChangedEventType(),
             sortCallback=uicommand.ViewerSortByCommand(viewer=self,
                                                        value='totalCategories'),
             renderCallback=lambda task: self.renderCategory(task, recursive=True),
             width=self.getColumnWidth('totalCategories'), **kwargs)])
     effortOn = self.settings.getboolean('feature', 'effort')
     dependsOnEffortFeature = ['budget', 'totalBudget', 
                               'timeSpent', 'totalTimeSpent', 
                               'budgetLeft', 'totalBudgetLeft',
                               'hourlyFee', 'fixedFee', 'totalFixedFee',
                               'revenue', 'totalRevenue']
     for name, columnHeader, renderCallback, eventType in [
         ('startDate', _('Start date'), lambda task: render.date(task.startDate()), None),
         ('dueDate', _('Due date'), lambda task: render.date(task.dueDate()), None),
         ('timeLeft', _('Days left'), lambda task: render.daysLeft(task.timeLeft(), task.completed()), None),
         ('completionDate', _('Completion date'), lambda task: render.date(task.completionDate()), None),
         ('recurrence', _('Recurrence'), lambda task: render.recurrence(task.recurrence()), None),
         ('budget', _('Budget'), lambda task: render.budget(task.budget()), None),
         ('totalBudget', _('Total budget'), lambda task: render.budget(task.budget(recursive=True)), None),
         ('timeSpent', _('Time spent'), lambda task: render.timeSpent(task.timeSpent()), None),
         ('totalTimeSpent', _('Total time spent'), lambda task: render.timeSpent(task.timeSpent(recursive=True)), None),
         ('budgetLeft', _('Budget left'), lambda task: render.budget(task.budgetLeft()), None),
         ('totalBudgetLeft', _('Total budget left'), lambda task: render.budget(task.budgetLeft(recursive=True)), None),
         ('priority', _('Priority'), lambda task: render.priority(task.priority()), None),
         ('totalPriority', _('Overall priority'), lambda task: render.priority(task.priority(recursive=True)), None),
         ('hourlyFee', _('Hourly fee'), lambda task: render.amount(task.hourlyFee()), task.Task.hourlyFeeChangedEventType()),
         ('fixedFee', _('Fixed fee'), lambda task: render.amount(task.fixedFee()), None),
         ('totalFixedFee', _('Total fixed fee'), lambda task: render.amount(task.fixedFee(recursive=True)), None),
         ('revenue', _('Revenue'), lambda task: render.amount(task.revenue()), None),
         ('totalRevenue', _('Total revenue'), lambda task: render.amount(task.revenue(recursive=True)), None),
         ('reminder', _('Reminder'), lambda task: render.dateTime(task.reminder()), None)]:
         eventType = eventType or 'task.'+name
         if (name in dependsOnEffortFeature and effortOn) or name not in dependsOnEffortFeature:
             columns.append(widgets.Column(name, columnHeader, eventType, 
                 sortCallback=uicommand.ViewerSortByCommand(viewer=self, value=name),
                 renderCallback=renderCallback, width=self.getColumnWidth(name),
                 alignment=wx.LIST_FORMAT_RIGHT, **kwargs))
     return columns