def taskNode(self, task): node = self.baseCompositeNode(task, 'task', self.taskNode) node.setAttribute('status', str(task.getStatus())) if task.startDate() != date.Date(): node.setAttribute('startdate', str(task.startDate())) if task.dueDate() != date.Date(): node.setAttribute('duedate', str(task.dueDate())) if task.completionDate() != date.Date(): node.setAttribute('completiondate', str(task.completionDate())) if task.recurrence(): node.appendChild(self.recurrenceNode(task.recurrence())) if task.budget() != date.TimeDelta(): node.setAttribute('budget', self.budgetAsAttribute(task.budget())) if task.priority() != 0: node.setAttribute('priority', str(task.priority())) if task.hourlyFee() != 0: node.setAttribute('hourlyFee', str(task.hourlyFee())) if task.fixedFee() != 0: node.setAttribute('fixedFee', str(task.fixedFee())) if task.reminder() != None: node.setAttribute('reminder', str(task.reminder())) if task.shouldMarkCompletedWhenAllChildrenCompleted != None: node.setAttribute('shouldMarkCompletedWhenAllChildrenCompleted', str(task.shouldMarkCompletedWhenAllChildrenCompleted)) for effort in task.efforts(): node.appendChild(self.effortNode(effort)) for note in task.notes(): node.appendChild(self.noteNode(note)) for attachment in task.attachments(): node.appendChild(self.attachmentNode(attachment)) return node
def __init__(self, parent, task, *args, **kwargs): super(DatesPage, self).__init__(parent, task, *args, **kwargs) datesBox = widgets.BoxWithFlexGridSizer(self, label=_("Dates"), cols=3) self.addHeaders(datesBox) for label, taskMethodName in [ (_("Start date"), "startDate"), (_("Due date"), "dueDate"), (_("Completion date"), "completionDate"), ]: datesBox.add(label) taskMethod = getattr(task, taskMethodName) entry = DateEntry(datesBox, taskMethod(), callback=self.onDateChanged) setattr(self, "_%sEntry" % taskMethodName, entry) datesBox.add(entry) if task.children(): recursiveEntry = DateEntry(datesBox, taskMethod(recursive=True), readonly=True) else: recursiveEntry = (0, 0) datesBox.add(recursiveEntry) reminderBox = widgets.BoxWithFlexGridSizer(self, label=_("Reminder"), cols=2) reminderBox.add(_("Reminder")) self._reminderDateTimeEntry = widgets.DateTimeCtrl(reminderBox, task.reminder()) # If the users has not set a reminder, make sure that the default # date time in the reminder entry is a reasonable suggestion: if self._reminderDateTimeEntry.GetValue() == date.DateTime.max: self.suggestReminder() reminderBox.add(self._reminderDateTimeEntry) recurrenceBox = widgets.BoxWithFlexGridSizer(self, label=_("Recurrence"), cols=2) recurrenceBox.add(_("Recurrence")) self._recurrenceEntry = wx.Choice(recurrenceBox, choices=[_("None"), _("Daily"), _("Weekly"), _("Monthly")]) self._recurrenceEntry.Bind(wx.EVT_CHOICE, self.onRecurrenceChanged) recurrenceBox.add(self._recurrenceEntry) recurrenceBox.add(_("Maximum number of recurrences")) panel = wx.Panel(recurrenceBox) panelSizer = wx.BoxSizer(wx.HORIZONTAL) self._maxRecurrenceCheckBox = wx.CheckBox(panel) self._maxRecurrenceCheckBox.Bind(wx.EVT_CHECKBOX, self.onMaxRecurrenceChecked) panelSizer.Add(self._maxRecurrenceCheckBox, flag=wx.ALIGN_CENTER_VERTICAL) panelSizer.Add((3, -1)) self._maxRecurrenceCountEntry = wx.SpinCtrl( panel, size=(50, -1), value=str(task.maxRecurrenceCount()), style=wx.SP_ARROW_KEYS ) # Can't use sys.maxint because Python and wxPython disagree on what the # maximum integer is on Suse 10.0 x86_64. Using sys.maxint will cause # an Overflow exception, so we use a constant: maxint = 2147483647 self._maxRecurrenceCountEntry.SetRange(1, maxint) self.setRecurrence(task.recurrence()) panelSizer.Add(self._maxRecurrenceCountEntry) panel.SetSizerAndFit(panelSizer) recurrenceBox.add(panel) for box in datesBox, reminderBox, recurrenceBox: box.fit() self.add(box, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) self.fit()
def taskNode(self, parentNode, task): # pylint: disable=W0621 maxDateTime = self.maxDateTime node = self.baseCompositeNode(parentNode, task, 'task', self.taskNode) node.attrib['status'] = str(task.getStatus()) if task.plannedStartDateTime() != maxDateTime: node.attrib['plannedstartdate'] = str(task.plannedStartDateTime()) if task.dueDateTime() != maxDateTime: node.attrib['duedate'] = str(task.dueDateTime()) if task.actualStartDateTime() != maxDateTime: node.attrib['actualstartdate'] = str(task.actualStartDateTime()) if task.completionDateTime() != maxDateTime: node.attrib['completiondate'] = str(task.completionDateTime()) if task.percentageComplete(): node.attrib['percentageComplete'] = str(task.percentageComplete()) if task.recurrence(): self.recurrenceNode(node, task.recurrence()) if task.budget() != date.TimeDelta(): node.attrib['budget'] = self.budgetAsAttribute(task.budget()) if task.priority(): node.attrib['priority'] = str(task.priority()) if task.hourlyFee(): node.attrib['hourlyFee'] = str(task.hourlyFee()) if task.fixedFee(): node.attrib['fixedFee'] = str(task.fixedFee()) reminder = task.reminder() if reminder != maxDateTime and reminder != None: node.attrib['reminder'] = str(reminder) reminderBeforeSnooze = task.reminder(includeSnooze=False) if reminderBeforeSnooze != None and reminderBeforeSnooze < task.reminder(): node.attrib['reminderBeforeSnooze'] = str(reminderBeforeSnooze) prerequisiteIds = ' '.join([prerequisite.id() for prerequisite in \ sortedById(task.prerequisites())]) if prerequisiteIds: node.attrib['prerequisites'] = prerequisiteIds if task.shouldMarkCompletedWhenAllChildrenCompleted() != None: node.attrib['shouldMarkCompletedWhenAllChildrenCompleted'] = \ str(task.shouldMarkCompletedWhenAllChildrenCompleted()) for effort in sortedById(task.efforts()): self.effortNode(node, effort) for eachNote in sortedById(task.notes()): self.noteNode(node, eachNote) for attachment in sortedById(task.attachments()): self.attachmentNode(node, attachment) return node
def taskNode(self, task): # pylint: disable-msg=W0621 maxDateTime = self.maxDateTime node = self.baseCompositeNode(task, 'task', self.taskNode) node.setAttribute('status', str(task.getStatus())) if task.startDateTime() != maxDateTime: node.setAttribute('startdate', str(task.startDateTime())) if task.dueDateTime() != maxDateTime: node.setAttribute('duedate', str(task.dueDateTime())) if task.completionDateTime() != maxDateTime: node.setAttribute('completiondate', str(task.completionDateTime())) if task.percentageComplete() != 0: node.setAttribute('percentageComplete', str(task.percentageComplete())) if task.recurrence(): node.appendChild(self.recurrenceNode(task.recurrence())) if task.budget() != date.TimeDelta(): node.setAttribute('budget', self.budgetAsAttribute(task.budget())) if task.priority() != 0: node.setAttribute('priority', str(task.priority())) if task.hourlyFee() != 0: node.setAttribute('hourlyFee', str(task.hourlyFee())) if task.fixedFee() != 0: node.setAttribute('fixedFee', str(task.fixedFee())) if task.reminder() != None: node.setAttribute('reminder', str(task.reminder())) prerequisiteIds = ' '.join([prerequisite.id() for prerequisite in \ task.prerequisites()]) if prerequisiteIds: node.setAttribute('prerequisites', prerequisiteIds) if task.shouldMarkCompletedWhenAllChildrenCompleted() != None: node.setAttribute('shouldMarkCompletedWhenAllChildrenCompleted', str(task.shouldMarkCompletedWhenAllChildrenCompleted())) for effort in task.efforts(): node.appendChild(self.effortNode(effort)) for eachNote in task.notes(): node.appendChild(self.noteNode(eachNote)) for attachment in task.attachments(): node.appendChild(self.attachmentNode(attachment)) return node
def taskNode(self, task): # pylint: disable-msg=W0621 node = self.baseCompositeNode(task, "task", self.taskNode) node.setAttribute("status", str(task.getStatus())) if task.startDateTime() != date.DateTime(): node.setAttribute("startdate", str(task.startDateTime())) if task.dueDateTime() != date.DateTime(): node.setAttribute("duedate", str(task.dueDateTime())) if task.completionDateTime() != date.DateTime(): node.setAttribute("completiondate", str(task.completionDateTime())) if task.percentageComplete() != 0: node.setAttribute("percentageComplete", str(task.percentageComplete())) if task.recurrence(): node.appendChild(self.recurrenceNode(task.recurrence())) if task.budget() != date.TimeDelta(): node.setAttribute("budget", self.budgetAsAttribute(task.budget())) if task.priority() != 0: node.setAttribute("priority", str(task.priority())) if task.hourlyFee() != 0: node.setAttribute("hourlyFee", str(task.hourlyFee())) if task.fixedFee() != 0: node.setAttribute("fixedFee", str(task.fixedFee())) if task.reminder() != None: node.setAttribute("reminder", str(task.reminder())) prerequisiteIds = " ".join([prerequisite.id() for prerequisite in task.prerequisites()]) if prerequisiteIds: node.setAttribute("prerequisites", prerequisiteIds) if task.shouldMarkCompletedWhenAllChildrenCompleted() != None: node.setAttribute( "shouldMarkCompletedWhenAllChildrenCompleted", str(task.shouldMarkCompletedWhenAllChildrenCompleted()) ) for effort in task.efforts(): node.appendChild(self.effortNode(effort)) for eachNote in task.notes(): node.appendChild(self.noteNode(eachNote)) for attachment in task.attachments(): node.appendChild(self.attachmentNode(attachment)) return node
def addRecurrenceBox(self, task): recurrenceBox = widgets.BoxWithFlexGridSizer(self, label=_('Recurrence'), cols=2) recurrenceBox.add(_('Recurrence')) panel = wx.Panel(recurrenceBox) panelSizer = wx.BoxSizer(wx.HORIZONTAL) self._recurrenceEntry = wx.Choice(panel, choices=[_('None'), _('Daily'), _('Weekly'), _('Monthly'), _('Yearly')]) self._recurrenceEntry.Bind(wx.EVT_CHOICE, self.onRecurrenceChanged) panelSizer.Add(self._recurrenceEntry, flag=wx.ALIGN_CENTER_VERTICAL) panelSizer.Add((3,-1)) staticText = wx.StaticText(panel, label=_(', every')) panelSizer.Add(staticText, flag=wx.ALIGN_CENTER_VERTICAL) panelSizer.Add((3,-1)) self._recurrenceFrequencyEntry = widgets.SpinCtrl(panel, size=(50,-1), min=1) panelSizer.Add(self._recurrenceFrequencyEntry, flag=wx.ALIGN_CENTER_VERTICAL) panelSizer.Add((3,-1)) self._recurrenceStaticText = wx.StaticText(panel, label='reserve some space') panelSizer.Add(self._recurrenceStaticText, flag=wx.ALIGN_CENTER_VERTICAL) panelSizer.Add((3, -1)) self._recurrenceSameWeekdayCheckBox = wx.CheckBox(panel, label=_('keeping dates on the same weekday')) panelSizer.Add(self._recurrenceSameWeekdayCheckBox, proportion=1, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) panel.SetSizerAndFit(panelSizer) self._recurrenceSizer = panelSizer recurrenceBox.add(panel) recurrenceBox.add(_('Maximum number\nof recurrences')) panel = wx.Panel(recurrenceBox) panelSizer = wx.BoxSizer(wx.HORIZONTAL) self._maxRecurrenceCheckBox = wx.CheckBox(panel) self._maxRecurrenceCheckBox.Bind(wx.EVT_CHECKBOX, self.onMaxRecurrenceChecked) panelSizer.Add(self._maxRecurrenceCheckBox, flag=wx.ALIGN_CENTER_VERTICAL) panelSizer.Add((3,-1)) self._maxRecurrenceCountEntry = widgets.SpinCtrl(panel, size=(50,-1), min=1) panelSizer.Add(self._maxRecurrenceCountEntry) panel.SetSizerAndFit(panelSizer) recurrenceBox.add(panel) self.setRecurrence(task.recurrence()) return recurrenceBox
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