def task_from_xml(task,xmlnode) : cur_task = task cur_stat = "%s" %xmlnode.getAttribute("status") uuid = "%s" %xmlnode.getAttribute("uuid") cur_task.set_uuid(uuid) donedate = cleanxml.readTextNode(xmlnode,"donedate") cur_task.set_status(cur_stat,donedate=dates.strtodate(donedate)) #we will fill the task with its content cur_task.set_title(cleanxml.readTextNode(xmlnode,"title")) #the subtasks sub_list = xmlnode.getElementsByTagName("subtask") for s in sub_list : sub_tid = s.childNodes[0].nodeValue cur_task.add_child(sub_tid) attr_list = xmlnode.getElementsByTagName("attribute") for a in attr_list: if len(a.childNodes): content = a.childNodes[0].nodeValue else: content = "" key = a.getAttribute("key") namespace = a.getAttribute("namespace") cur_task.set_attribute(key, content, namespace=namespace) tasktext = xmlnode.getElementsByTagName("content") if len(tasktext) > 0 : if tasktext[0].firstChild : tas = "<content>%s</content>" %tasktext[0].firstChild.nodeValue content = xml.dom.minidom.parseString(tas) cur_task.set_text(content.firstChild.toxml()) #pylint: disable-msg=E1103 cur_task.set_due_date(dates.strtodate(cleanxml.readTextNode(xmlnode,"duedate"))) cur_task.set_start_date(dates.strtodate(cleanxml.readTextNode(xmlnode,"startdate"))) cur_tags = xmlnode.getAttribute("tags").replace(' ','').split(",") if "" in cur_tags: cur_tags.remove("") for tag in cur_tags: cur_task.tag_added(saxutils.unescape(tag)) #REMOTE TASK IDS remote_ids_list = xmlnode.getElementsByTagName("task-remote-ids") for remote_id in remote_ids_list: if remote_id.childNodes: node = remote_id.childNodes[0] backend_id = node.firstChild.nodeValue remote_task_id = node.childNodes[1].firstChild.nodeValue task.add_remote_id(backend_id, remote_task_id) modified_string = cleanxml.readTextNode(xmlnode,"modified") if modified_string: modified_datetime = datetime.datetime.strptime(modified_string,\ "%Y-%m-%dT%H:%M:%S") cur_task.set_modified(modified_datetime) return cur_task
def date_changed(self,widget,data): text = widget.get_text() validdate = False if not text : validdate = True datetoset = dates.no_date else : datetoset = dates.strtodate(text) if datetoset : validdate = True if validdate : #If the date is valid, we write with default color in the widget # "none" will set the default color. widget.modify_text(gtk.STATE_NORMAL, None) widget.modify_base(gtk.STATE_NORMAL, None) if data == "start" : self.task.set_start_date(datetoset) elif data == "due" : self.task.set_due_date(datetoset) elif data == "closed" : self.task.set_closed_date(datetoset) #Set the due date to be equal to the start date # when it happens that the start date is later than the due date start_date = self.task.get_start_date() due_date = self.task.get_due_date() if start_date and (start_date > due_date): self.task.set_due_date(self.task.get_start_date()) else : #We should write in red in the entry if the date is not valid widget.modify_text(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F00")) widget.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse("#F88"))
def modify_task(self, tid, task_data): """ Updates the task with ID tid using the provided information in the task_data structure. Note that any fields left blank or undefined in task_data will clear the value in the task, so the best way to update a task is to first retrieve it via get_task(tid), modify entries as desired, and send it back via this function. """ task = self.req.get_task(tid) task.set_status(task_data["status"], donedate=dates.strtodate(task_data["donedate"])) task.set_title(task_data["title"]) task.set_due_date(dates.strtodate(task_data["duedate"])) task.set_start_date(dates.strtodate(task_data["startdate"])) task.set_text(task_data["text"]) for tag in task_data["tags"]: task.add_tag(tag) for sub in task_data["subtask"]: task.add_child(sub) return task_to_dict(task)
def new_task(self, status, title, duedate, startdate, donedate, tags, text, subtasks): """ Generate a new task object and return the task data as a dict @param status: One of 'Active', 'Dismiss', or 'Done' @param title: String name of the task @param duedate: Date the task is due, such as "2010-05-01". also supports 'now', 'soon', 'later' @param startdate: Date the task will be started @param donedate: Date the task was finished @param tags: List of strings for tags to apply for this task @param text: String description @param subtasks: A list of task ids of tasks to add as children @return: A dictionary with the data of the newly created task """ nt = self.req.new_task(tags=tags) for sub in subtasks: nt.add_child(sub) nt.set_status(status, donedate=dates.strtodate(donedate)) nt.set_title(title) nt.set_due_date(dates.strtodate(duedate)) nt.set_start_date(dates.strtodate(startdate)) nt.set_text(text) return task_to_dict(nt)
def refresh_editor(self, title=None, refreshtext=False): if self.window == None: return to_save = False #title of the window if title : self.window.set_title(title) to_save = True else : self.window.set_title(self.task.get_title()) status = self.task.get_status() if status == Task.STA_DISMISSED: self.donebutton.set_label(GnomeConfig.MARK_DONE) self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) self.donebutton.set_icon_name("gtg-task-done") self.dismissbutton.set_label(GnomeConfig.MARK_UNDISMISS) self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_UNDISMISS_TOOLTIP) self.dismissbutton.set_icon_name("gtg-task-undismiss") elif status == Task.STA_DONE: self.donebutton.set_label(GnomeConfig.MARK_UNDONE) self.donebutton.set_tooltip_text(GnomeConfig.MARK_UNDONE_TOOLTIP) self.donebutton.set_icon_name("gtg-task-undone") self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_DISMISS_TOOLTIP) self.dismissbutton.set_icon_name("gtg-task-dismiss") else: self.donebutton.set_label(GnomeConfig.MARK_DONE) self.donebutton.set_tooltip_text(GnomeConfig.MARK_DONE_TOOLTIP) self.donebutton.set_icon_name("gtg-task-done") self.dismissbutton.set_label(GnomeConfig.MARK_DISMISS) self.dismissbutton.set_tooltip_text(GnomeConfig.MARK_DISMISS_TOOLTIP) self.dismissbutton.set_icon_name("gtg-task-dismiss") self.donebutton.show() self.tasksidebar.show() #Refreshing the status bar labels and date boxes if status in [Task.STA_DISMISSED, Task.STA_DONE]: self.builder.get_object("label2").hide() self.builder.get_object("hbox1").hide() self.builder.get_object("label4").show() self.builder.get_object("hbox4").show() else: self.builder.get_object("label4").hide() self.builder.get_object("hbox4").hide() self.builder.get_object("label2").show() self.builder.get_object("hbox1").show() #refreshing the due date field duedate = self.task.get_due_date() prevdate = dates.strtodate(self.duedate_widget.get_text()) if duedate != prevdate or type(duedate) is not type(prevdate): zedate = str(duedate).replace("-", date_separator) self.duedate_widget.set_text(zedate) # refreshing the closed date field closeddate = self.task.get_closed_date() prevcldate = dates.strtodate(self.closeddate_widget.get_text()) if closeddate != prevcldate or type(closeddate) is not type(prevcldate): zecldate = str(closeddate).replace("-", date_separator) self.closeddate_widget.set_text(zecldate) #refreshing the day left label #If the task is marked as done, we display the delay between the #due date and the actual closing date. If the task isn't marked #as done, we display the number of days left. if status in [Task.STA_DISMISSED, Task.STA_DONE]: delay = self.task.get_days_late() if delay is None: txt = "" elif delay == 0: txt = "Completed on time" elif delay >= 1: txt = ngettext("Completed %(days)d day late", "Completed %(days)d days late", delay) % {'days': delay} elif delay <= -1: abs_delay = abs(delay) txt = ngettext("Completed %(days)d day early", "Completed %(days)d days early", abs_delay) % {'days': abs_delay} else: result = self.task.get_days_left() if result is None: txt = "" elif result > 0: txt = ngettext("Due tomorrow!", "%(days)d days left", result) % {'days': result} elif result == 0: txt = _("Due today!") elif result < 0: abs_result = abs(result) txt = ngettext("Due yesterday!", "Was %(days)d days ago", abs_result) % {'days': abs_result} window_style = self.window.get_style() color = str(window_style.text[gtk.STATE_INSENSITIVE]) self.dayleft_label.set_markup("<span color='"+color+"'>"+txt+"</span>") startdate = self.task.get_start_date() prevdate = dates.strtodate(self.startdate_widget.get_text()) if startdate != prevdate or type(startdate) is not type(prevdate): zedate = str(startdate).replace("-",date_separator) self.startdate_widget.set_text(zedate) #Refreshing the tag list in the insert tag button taglist = self.req.get_used_tags() menu = gtk.Menu() tag_count = 0 for tagname in taglist: tag_object = self.req.get_tag(tagname) if not tag_object.is_special() and \ not self.task.has_tags(tag_list=[tagname]): tag_count += 1 mi = gtk.MenuItem(label = tagname, use_underline=False) mi.connect("activate", self.inserttag, tagname) mi.show() menu.append(mi) if tag_count > 0 : self.inserttag_button.set_menu(menu) if refreshtext: self.textview.modified(refresheditor=False) if to_save: self.light_save()