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()
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)) ]
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()
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