Merge lp:~dobey/lptools/my-reviews into lp:~dobey/lptools/trunk

Proposed by dobey
Status: Merged
Approved by: dobey
Approved revision: 15
Merged at revision: 15
Proposed branch: lp:~dobey/lptools/my-reviews
Merge into: lp:~dobey/lptools/trunk
Diff against target: 251 lines (+42/-171)
1 file modified
bin/lp-review-list (+42/-171)
To merge this branch: bzr merge lp:~dobey/lptools/my-reviews
Reviewer Review Type Date Requested Status
dobey Approve
Review via email: mp+27191@code.launchpad.net

Commit message

Get rid of the preferences, and just get all the uesr's relevant proposals from launchpad's getRequestedReviews() call on person and teams

To post a comment you must log in.
Revision history for this message
dobey (dobey) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/lp-review-list'
2--- bin/lp-review-list 2010-03-31 15:15:49 +0000
3+++ bin/lp-review-list 2010-06-09 18:23:26 +0000
4@@ -41,121 +41,6 @@
5 "Needs Information" : "#909090",
6 }
7
8-class Preferences(object):
9-
10- def __init__(self):
11- self.filename = os.path.join(xdg_config_home, "lptools",
12- "lptools.conf")
13- self.config = ConfigParser()
14- self.config.read(self.filename)
15- if not os.path.isdir(os.path.dirname(self.filename)):
16- os.makedirs(os.path.dirname(self.filename))
17-
18- if not self.config.has_section("lptools"):
19- self.config.add_section("lptools")
20-
21- if self.config.has_option("lptools", "projects"):
22- self.projects = self.config.get("lptools",
23- "projects").split(",")
24- else:
25- self.projects = []
26-
27- # XXX: Not currently honoured - not sure if it ever worked.
28- if self.config.has_option("lptools", "server"):
29- self.api_server = self.config.get("lptools", "server")
30- else:
31- self.api_server = EDGE_SERVICE_ROOT
32-
33- # gtk.ListStore for the dialog
34- self.store = None
35- self.dialog = self.__build_dialog()
36-
37- def __build_dialog(self):
38- dialog = gtk.Dialog()
39- dialog.set_title("Pending Reviews Preferences")
40- dialog.set_destroy_with_parent(True)
41- dialog.set_has_separator(False)
42- dialog.set_default_size(240, 320)
43-
44- area = dialog.get_content_area()
45-
46- vbox = gtk.VBox(spacing=6)
47- vbox.set_border_width(12)
48- area.add(vbox)
49- vbox.show()
50-
51- label = gtk.Label("<b>%s</b>" % "_Projects")
52- label.set_use_underline(True)
53- label.set_use_markup(True)
54- label.set_alignment(0.0, 0.5)
55- vbox.pack_start(label, expand=False, fill=False)
56- label.show()
57-
58- hbox = gtk.HBox(spacing=12)
59- vbox.pack_start(hbox, expand=True, fill=True)
60- hbox.show()
61-
62- misc = gtk.Label()
63- hbox.pack_start(misc, expand=False, fill=False)
64- misc.show()
65-
66- scrollwin = gtk.ScrolledWindow()
67- scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
68- hbox.pack_start(scrollwin, expand=True, fill=True)
69- scrollwin.show()
70-
71- self.store = gtk.ListStore(str)
72-
73- view = gtk.TreeView(self.store)
74- label.set_mnemonic_widget(view)
75- view.set_headers_visible(False)
76- scrollwin.add(view)
77- view.show()
78-
79- cell = gtk.CellRendererText()
80- cell.set_property("editable", True)
81- cell.connect("editing_started", self.__edit_started)
82- cell.connect("edited", self.__edit_finished)
83- col = gtk.TreeViewColumn("Project", cell, markup=0)
84- view.append_column(col)
85-
86- dialog.connect("close", self.__dialog_closed, 0)
87- dialog.connect("response", self.__dialog_closed)
88-
89- return dialog
90-
91- def __edit_started(self, cell, editable, path):
92- return
93-
94- def __edit_finished(self, sell, path, text):
95- if text == "Click here to add a project...":
96- return
97- treeiter = self.store.get_iter_from_string(path)
98- label = "<i>%s</i>" % "Click here to add a project..."
99- self.store.set(treeiter, 0, label)
100- self.projects.append(text)
101- self.store.append([text,])
102-
103- def __dialog_closed(self, dialog, response):
104- dialog.hide()
105- if len(self.projects) > 0:
106- self.config.set("lptools", "projects",
107- ",".join(self.projects))
108- with open(self.filename, "w+b") as f:
109- self.config.write(f)
110-
111- def show_dialog(self, parent):
112- if not self.dialog.get_transient_for():
113- self.dialog.set_transient_for(parent)
114- self.store.clear()
115- text = "<i>%s</i>" % "Click here to add a project..."
116- self.store.append([text,])
117- if len(self.projects) != 0:
118- for project in self.projects:
119- self.store.append([project,])
120- self.dialog.run()
121-
122-
123 class Window(gtk.Window):
124
125 def __init__(self):
126@@ -178,11 +63,6 @@
127 toolbar.insert(button, -1);
128 button.show()
129
130- button = gtk.ToolButton(gtk.STOCK_PREFERENCES)
131- button.connect("clicked", self.__edit_prefs)
132- toolbar.insert(button, -1)
133- button.show()
134-
135 scrollwin = gtk.ScrolledWindow()
136 scrollwin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
137 vbox.pack_start(scrollwin, expand=True, fill=True)
138@@ -202,11 +82,6 @@
139 self.launchpad = None
140 self.me = None
141
142- self.config = Preferences()
143- if len(self.config.projects) == 0:
144- text = "<i>%s</i>" % "No projects specified"
145- self.store.append((text, ""))
146-
147 self.thread = None
148 self.id = 0
149 Thread(target=self.__lp_login).start()
150@@ -230,9 +105,6 @@
151 self.id = gobject.timeout_add_seconds(5 * 60, self.__timeout)
152 return False
153
154- def __edit_prefs(self, button, data=None):
155- self.config.show_dialog(self)
156-
157 def __open_link(self, view, path, column, data=None):
158 row = self.store.get_iter(path)
159 url, = self.store.get(row, 1)
160@@ -245,49 +117,48 @@
161 dialog.destroy()
162
163 def __load_merges(self):
164- for project in self.config.projects:
165- lp_project = None
166- try:
167- lp_project = self.launchpad.projects[project]
168- except AttributeError:
169- print "Project %s has no development focus." % project
170- continue
171- except KeyError:
172- print "Project %s not found." % project
173- continue
174-
175- for c in lp_project.getMergeProposals(status="Needs review"):
176- votes = {}
177- for key in VOTES.keys():
178- votes[key] = 0
179-
180- for vote in c.votes:
181- if not vote.comment:
182- continue
183- else:
184- votes[vote.comment.vote] += 1
185-
186- for key in votes.keys():
187- if votes[key] == 0:
188- votes.pop(key, None)
189-
190- vstr = ", ".join(
191- ["<span color='%s'>%s</span>: %d" \
192- % (VOTES[key], key, votes[key]) \
193- for key in votes.keys()]
194- )
195- if vstr == "":
196- vstr = "No Reviews"
197- status = "%s\n%s" % (c.source_branch.display_name,
198- vstr)
199- urlp = re.compile(
200- 'http[s]?://api\.(.*)launchpad\.net/[^/]+/')
201- merge_url = urlp.sub(
202- 'http://launchpad.net/', c.self_link)
203-
204- gtk.gdk.threads_enter()
205- self.store.append((status, merge_url))
206- gtk.gdk.threads_leave()
207+ merges = []
208+ mine = self.me.getRequestedReviews(status=[u'Needs review'])
209+ for merge in mine:
210+ merges.append(merge)
211+
212+ for team in self.me.super_teams:
213+ for merge in team.getRequestedReviews(status=[u'Needs review']):
214+ if merge not in merges:
215+ merges.append(merge)
216+
217+ for merge in merges:
218+ votes = {}
219+ for key in VOTES.keys():
220+ votes[key] = 0
221+
222+ for vote in merge.votes:
223+ if not vote.comment:
224+ continue
225+ else:
226+ votes[vote.comment.vote] += 1
227+
228+ for key in votes.keys():
229+ if votes[key] == 0:
230+ votes.pop(key, None)
231+
232+ vstr = ", ".join(
233+ ["<span color='%s'>%s</span>: %d" \
234+ % (VOTES[key], key, votes[key]) \
235+ for key in votes.keys()]
236+ )
237+ if vstr == "":
238+ vstr = "No Reviews"
239+ status = "%s\n%s" % (merge.source_branch.display_name,
240+ vstr)
241+ urlp = re.compile(
242+ 'http[s]?://api\.(.*)launchpad\.net/[^/]+/')
243+ merge_url = urlp.sub(
244+ 'http://launchpad.net/', merge.self_link)
245+
246+ gtk.gdk.threads_enter()
247+ self.store.append((status, merge_url))
248+ gtk.gdk.threads_leave()
249
250 def __timeout(self):
251 self.store.clear()

Subscribers

People subscribed via source and target branches

to all changes: