GTG

Merge lp:~tomkadwill/gtg/delete-tag2 into lp:~gtg/gtg/old-trunk

Proposed by Tom Kadwill
Status: Rejected
Rejected by: Izidor Matušov
Proposed branch: lp:~tomkadwill/gtg/delete-tag2
Merge into: lp:~gtg/gtg/old-trunk
Diff against target: 123 lines (+63/-2)
4 files modified
CHANGELOG (+1/-0)
GTG/gtk/browser/browser.py (+11/-2)
GTG/gtk/delete_dialog.py (+40/-0)
GTG/gtk/manager.py (+11/-0)
To merge this branch: bzr merge lp:~tomkadwill/gtg/delete-tag2
Reviewer Review Type Date Requested Status
Izidor Matušov Disapprove
Review via email: mp+141682@code.launchpad.net

Description of the change

Have fixed bug Bug #1044639

To post a comment you must log in.
Revision history for this message
Izidor Matušov (izidor) wrote :

Sorry for the late answer. When I run your code, I encounter the following traceback:

<code>
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/liblarch/processqueue.py", line 43, in process_queue
    func(*action[1:])
  File "/usr/lib/python2.7/dist-packages/liblarch/tree.py", line 269, in _modify_node
    self._callback('node-modified', node_id)
  File "/usr/lib/python2.7/dist-packages/liblarch/tree.py", line 78, in _callback
    func(node_id)
  File "/usr/lib/python2.7/dist-packages/liblarch/viewcount.py", line 85, in __modify
    displayed &= filt.is_displayed(nid)
  File "/usr/lib/python2.7/dist-packages/liblarch/filters_bank.py", line 42, in is_displayed
    value = self.func(task, parameters=self.dic)
  File "/home/izidor/projects/gtg/trunk/GTG/core/treefactory.py", line 146, in tag_filter
    return node.has_tags([tag])
  File "/home/izidor/projects/gtg/trunk/GTG/core/task.py", line 767, in has_tags
    toreturn = children_tag(tagname)
  File "/home/izidor/projects/gtg/trunk/GTG/core/task.py", line 751, in children_tag
    for tagc_name in tag.get_children():
AttributeError: 'NoneType' object has no attribute 'get_children'
</code>

At the moment, only one tag could be selected & removed. Please, change the text in the dialog to something like:

"Do you want to remove tag <b>[tag name]</b>?"

Make it different from the normal delete dialog.

Please, comment properly method

def ask_delete_tags(self, tags):

It took me quite a moment to understand how it work and why it works so. Please, use a loop instead of tags[0].

review: Needs Fixing (code,run)
Revision history for this message
Izidor Matušov (izidor) wrote :

Closing, no activity in year.

review: Disapprove

Unmerged revisions

1267. By Tom Kadwill

Fixed bug #1095451: can now delete tags

1266. By Tom Kadwill

Fixed bug #1095451: can now delete tags

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CHANGELOG'
2--- CHANGELOG 2013-01-01 16:24:57 +0000
3+++ CHANGELOG 2013-01-02 23:31:24 +0000
4@@ -6,6 +6,7 @@
5 * Fix for bug #1047753: Changing due date doesn't update "days left" information, by Codee
6 * Fix for bug #1090301: "Deactivating the untouched tasks plugin leaves "add @untouched tag" in plugins menu", by Nimit Shah
7 * Fix for bug #1039651: Urgency coloring of parent tasks in collapsed view, by Parin Porecha
8+ * Fix for bug #1095451: Can now delete tags from Tags Sidebar
9
10 2012-11-06 Getting Things GNOME! 0.3
11 * Hide tasks with due date someday, #931376
12
13=== modified file 'GTG/gtk/browser/browser.py'
14--- GTG/gtk/browser/browser.py 2012-12-13 15:44:18 +0000
15+++ GTG/gtk/browser/browser.py 2013-01-02 23:31:24 +0000
16@@ -620,12 +620,12 @@
17 self.config.set('tasklist_sort_column', sort_column)
18 self.config.set('tasklist_sort_order', sort_order)
19
20- def on_move(self, widget = None, data = None):
21+ def on_move(self, widget=None, data=None):
22 xpos, ypos = self.window.get_position()
23 self.config.set('x_pos', xpos)
24 self.config.set('y_pos', ypos)
25
26- def on_size_allocate(self, widget = None, data = None):
27+ def on_size_allocate(self, widget=None, data=None):
28 width, height = self.window.get_size()
29 self.config.set('width', width)
30 self.config.set('height', height)
31@@ -868,6 +868,9 @@
32 keyname = gtk.gdk.keyval_name(event.keyval)
33 is_shift_f10 = (keyname == "F10" and
34 event.get_state() & gtk.gdk.SHIFT_MASK)
35+ if keyname == "Delete":
36+ self.on_delete_tags()
37+ return True
38 if is_shift_f10 or keyname == "Menu":
39 selected_tags = self.get_selected_tags(nospecial=True)
40 selected_search = self.get_selected_search()
41@@ -885,6 +888,12 @@
42 self.reset_cursor()
43 return True
44
45+ def on_delete_tags(self, widget=None, tid=None):
46+ selected_tags = self.get_selected_tags(nospecial=True)
47+ Log.debug("going to delete %s" % selected_tags)
48+ if self.vmanager.ask_delete_tags(selected_tags):
49+ self.req.remove_tag(selected_tags[0])
50+
51 def on_task_treeview_button_press_event(self, treeview, event):
52 """ Pop up context menu on right mouse click in the main
53 task tree view """
54
55=== modified file 'GTG/gtk/delete_dialog.py'
56--- GTG/gtk/delete_dialog.py 2012-12-02 12:25:37 +0000
57+++ GTG/gtk/delete_dialog.py 2013-01-02 23:31:24 +0000
58@@ -131,3 +131,43 @@
59 return tasklist
60 else:
61 return []
62+
63+ def delete_tags(self, tags):
64+ # We fill the text and the buttons' labels according to the number
65+ # of tasks to delete
66+ label = self.builder.get_object("label1")
67+ label_text = label.get_text()
68+ cdlabel2 = self.builder.get_object("cd-label2")
69+ cdlabel3 = self.builder.get_object("cd-label3")
70+ cdlabel4 = self.builder.get_object("cd-label4")
71+ singular = len(tags)
72+ label_text = ngettext("Deleting a tag cannot be undone, "
73+ "and will delete the following tag: ",
74+ "Deleting a tag cannot be undone, "
75+ "and will delete the following tags: ",
76+ singular)
77+ cdlabel2.set_label(ngettext("Are you sure you want to delete this "
78+ "tag?",
79+ "Are you sure you want to delete these "
80+ "tag?",
81+ singular))
82+
83+ cdlabel3.set_label(ngettext("Keep selected tag",
84+ "Keep selected tag",
85+ singular))
86+ cdlabel4.set_label(ngettext("Permanently remove tag",
87+ "Permanently remove tag",
88+ singular))
89+ label_text = label_text[0:label_text.find(":") + 1]
90+
91+ delete_dialog = self.builder.get_object("confirm_delete")
92+ titles = "".join("\n - " + tag for tag in tags)
93+ label.set_text(label_text + titles)
94+ delete_dialog.resize(1, 1)
95+ cancel_button = self.builder.get_object("cancel")
96+ cancel_button.grab_focus()
97+ if delete_dialog.run() != 1:
98+ delete_dialog.hide()
99+ else:
100+ delete_dialog.hide()
101+ return True
102
103=== modified file 'GTG/gtk/manager.py'
104--- GTG/gtk/manager.py 2012-12-13 15:44:18 +0000
105+++ GTG/gtk/manager.py 2013-01-02 23:31:24 +0000
106@@ -238,6 +238,17 @@
107 if t.get_id() in self.opened_task:
108 self.close_task(t.get_id())
109
110+ def ask_delete_tags(self, tags):
111+ self.delete_dialog = DeletionUI(self.req)
112+ if self.delete_dialog.delete_tags(tags):
113+ requester = self.plugin_api.get_requester()
114+ closed_tree = requester.get_tasks_tree(name = 'inactive')
115+ closed_tasks = [requester.get_task(tid) for tid in \
116+ closed_tree.get_all_nodes()]
117+ for task in closed_tasks:
118+ task.remove_tag(tags[0])
119+ return True
120+
121 def open_tag_editor(self, tag):
122 if not self.tag_editor_dialog:
123 self.tag_editor_dialog = TagEditor(self.req, self, tag)

Subscribers

People subscribed via source and target branches

to status/vote changes: