Example #1
0
 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
Example #2
0
    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
Example #4
0
 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
Example #5
0
 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
Example #6
0
 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
Example #7
0
    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
Example #8
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