root/retriever.py

Revision 80, 9.5 kB (checked in by ploum@…, 4 weeks ago)

gros commit tout pourri

Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3import sys, time
4import string, threading
5
6import gettext
7_ = gettext.gettext
8
9
10try:
11        import pygtk
12        pygtk.require("2.0")
13except:
14        pass
15try:
16        import gobject
17        import gtk
18        import gtk.glade
19        import gobject
20        import desktop
21except:
22        sys.exit(1)
23from page import *
24from definitions import *
25
26class retriever :
27
28        def __init__(self, zbts, notebook,glade_file) :
29                self.bts = zbts
30                self.bugs_tabs = notebook
31                self.glade = glade_file
32
33
34        def display(self, dic) :
35                # TODO : a nice animation here instead of a simple label
36                tab_tmp = gtk.Label(_("Please wait..."))
37                tab_tmp.show()
38                page_tmp = page(tab_tmp,dic)
39                to_remove = self.insert_tab(page_tmp)
40                t = threading.Thread(target=self.__retrieve,args=[dic,to_remove])
41                t.start()
42
43        def waiting(self) :
44                focus = self.bugs_tabs.get_current_page()
45                tab_page = self.bugs_tabs.get_nth_page(focus)
46                to_remove = tab_page.get_children()[0]
47                tab_tmp = gtk.Label(_("Please wait..."))
48                tab_tmp.show()
49                dic =xml2dic(tab_descr(tab_page))
50                page_tmp = page(tab_tmp,dic)
51                tab_page.remove(to_remove)
52                tab_page.add(page_tmp.get_widget())
53
54        def refresh(self) :
55                focus = self.bugs_tabs.get_current_page()
56                tab_page = self.bugs_tabs.get_nth_page(focus)
57                dic =xml2dic(tab_descr(tab_page))
58                to_remove = tab_page.get_children()[0]
59                t = threading.Thread(target=self.__retrieve,args=[dic,to_remove])
60                t.start()
61               
62
63        def __retrieve(self,dic,to_remove) :
64                # bug #59 is really solved now !
65                def bug_callback(self, zebug):
66                        tab_page = self.__bugDisplay(zebug,dic)
67                        label = to_remove.get_children()[0]
68                        to_remove.remove(label)
69                        to_remove.add(tab_page.get_widget())
70                def search_callback(self,store):
71                        tab_page = self.__searchDisplay(store,dic)
72                        label = to_remove.get_children()[0]
73                        to_remove.remove(label)
74                        to_remove.add(tab_page.get_widget())
75                search_type = dic["method"]
76                if search_type == 1 :
77                        zebug = self.bts.retrieveBug(dic["bug"])
78                        gobject.idle_add(bug_callback,self,zebug)
79                elif search_type == 2 :
80                        zestore = self.bts.genericSearch(dic["search"])
81                        gobject.idle_add(search_callback,self,zestore)
82                elif search_type == 3 :
83                        zestore = self.bts.packageSearch(dic["product"],dic["search"])
84                        gobject.idle_add(search_callback,self,zestore)
85                       
86                return
87
88        # Adding a tab
89        # we receive as arguments an objet page
90        def insert_tab(self,tab_page):
91                #close tab button callback
92                tab = tab_page.get_widget()
93                name = tab_page.get_title()
94                def closeTab(widget, data):
95                        page = self.bugs_tabs.page_num(data)
96                        self.bugs_tabs.remove_page(page)
97                #this is ugly ! I don't want to use glade for this
98                dic = {"on_close_tab_clicked" : lambda close: closeTab(close, tab) }
99                label_widget=gtk.glade.XML("conseil.glade", root="tab_label")
100                label_widget.signal_autoconnect(dic)
101                label=label_widget.get_widget("label_closetab1")
102                label.set_text(name)
103                top=label_widget.get_widget("hbox_closetab")
104                top.unparent()         
105                self.bugs_tabs.insert_page(tab, top)
106                return tab
107
108        # This function initialize an empty result tree
109        def __treeInit__(self):
110                def callback_click(widget, event) :
111                        #middle click, open in background
112                        if event.button == 2 :
113                                print _("TODO : open bug in background")
114                        #right click menu
115                        elif event.button == 3 :
116                                zetuple = widget.get_selection().get_selected()
117                                itera = zetuple[1]
118                                store = zetuple[0]
119                                def browser_callback(menuitem) :
120                                        #if we have not yet left clicked in the results
121                                        # itera will be None
122                                        # Fixme !
123                                        if itera != None :
124                                                bugnbr = store.get_value(itera,0)
125                                                desktop.url_show(self.bts.getBugUrl(bugnbr))
126                                browser = gtk.MenuItem(_("Open in a web browser"))
127                                browser.connect("activate", browser_callback)
128                                browser.show()
129                                menu = gtk.Menu()
130                                menu.append(browser)
131                                menu.popup(None, None, None, event.button, event.time)
132                #We add an empty tree result first
133                listing = gtk.ListStore(gobject.TYPE_INT,gobject.TYPE_STRING)
134                tree = gtk.TreeView(listing)
135                tree.connect("button-press-event",callback_click)
136                renderer = gtk.CellRendererText()
137                column = gtk.TreeViewColumn(_("Bug #"), renderer, text=0)
138                column.set_resizable(1)
139                column.set_sort_column_id(0)
140                column2 = gtk.TreeViewColumn(_("Product"), renderer, text=1)
141                column2.set_resizable(1)
142                column2.set_sort_column_id(1)
143                column3 = gtk.TreeViewColumn(_("Titre"), renderer, text=2)
144                column3.set_resizable(1)
145                column3.set_sort_column_id(2)
146                column4 = gtk.TreeViewColumn(_("Importance"), renderer, text=3)
147                column4.set_resizable(1)
148                column4.set_sort_column_id(3)
149                column5 = gtk.TreeViewColumn(_("Status"), renderer, text=4)
150                column5.set_resizable(1)
151                column5.set_sort_column_id(4)
152                tree.append_column(column)
153                tree.append_column(column2)
154                tree.append_column(column3)
155                tree.append_column(column4)
156                tree.append_column(column5)
157                tree.show()
158                return tree
159
160
161        #Callback for the row_activated in a search view
162        def __row_clicked(self,path, view_column, user_param1,data) :
163                zetuple = data.get_selected()
164                bug_nbr = zetuple[0].get_value(zetuple[1],0)
165                dic = makedict()
166                dic["method"] = 1
167                dic["bug"] = str(bug_nbr)
168                dic["bts"] = self.bts.btsName()
169                self.display(dic)
170
171        #We did a simple search
172        def __searchDisplay(self,store,args):
173                #First, we ask for the result as it can takes some times
174                if len(store) == 0 :
175                        tab = gtk.Label(_("No result matching your search"))
176                        tab.show()
177                else :
178                        tree=self.__treeInit__()
179                        tree.connect("row-activated", self.__row_clicked, tree.get_selection())
180                        tree.set_headers_clickable(1)
181                        tree.set_rules_hint(1)
182                        tree.set_model(store)
183                        tab = gtk.ScrolledWindow()
184                        tab.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
185                        tab.show()
186                        tab.add(tree)
187                zepage = page(tab, args)
188                return zepage   
189
190        # This function takes a bug Object and then display it nicely
191        # (it will be nice one day, I swear...)
192        def __bugDisplay(self, zebug, descr) :
193                nbr = zebug.getNbr()
194                def callback_click(widget, event) :
195                        #middle click, open in background
196                        if event.button == 2 :
197                                print "What do you want to do with middle click ?"
198                        #right click menu
199                        elif event.button == 3 :
200                                def browser_callback(menuitem) :
201                                        desktop.url_show(self.bts.getBugUrl(nbr))
202                                browser = gtk.MenuItem(_("Open in a web browser"))
203                                browser.connect("activate", browser_callback)
204                                browser.show()
205                                menu = gtk.Menu()
206                                menu.append(browser)
207                                menu.popup(None, None, None, event.button, event.time) 
208
209                def callback_postcom(widget,buff,nbr) :
210                        def posting(nbr,title,content) :
211                                gobject.idle_add(self.waiting)
212                                self.bts.postComment(nbr,title,content)
213                                gobject.idle_add(self.refresh)
214                        itera = buff.get_bounds()
215                        content = buff.get_text(itera[0],itera[1])
216                        if content.strip() != '' :
217                                #FIXME : support title in comments
218                                title=_("Dummy title")
219                                t = threading.Thread(target=posting,args=[nbr,title,content])
220                                t.start()
221                                #self.bts.postComment(nbr,title,content)
222
223                def callback_browser(button,bugnbr) :
224                        desktop.url_show(self.bts.getBugUrl(bugnbr))
225       
226                if nbr < 0 :
227                        main_widget = gtk.Label(_("This specific bug doesnt exist"))
228                        main_widget.show()
229                else :
230                        bugnbr=str(nbr)
231                        bugwidget = gtk.glade.XML("conseil.glade", root="bug_template")
232                        widget_comments_nbr = bugwidget.get_widget("comments_nbr")
233                        textcom = bugwidget.get_widget("text_comment")
234                        postbutton = bugwidget.get_widget("post_button")
235                        postbutton.connect("clicked",callback_postcom, textcom.get_buffer(),bugnbr)
236                        browser_button = bugwidget.get_widget("browser_button")
237                        browser_button.connect("clicked",callback_browser, bugnbr)
238                        post_comment = bugwidget.get_widget("add_comment_expander")
239                        # handle nicely plurals
240                        bugtotal = zebug.comNbr()
241                        if bugtotal > 1 :
242                                com_text = _("<b><big>%d comments : </big></b>")%bugtotal
243                        else :
244                                com_text = _("<b><big>%d comment : </big></b>")%bugtotal
245                        widget_comments_nbr.set_markup(com_text)
246                        widget_comments = bugwidget.get_widget("comments")
247                        widget_nbr = bugwidget.get_widget("number")
248                        title_bugnbr = _("<b><big>Bug #%s :</big></b>") %bugnbr
249                        widget_nbr.set_markup(title_bugnbr)
250                        widget_title = bugwidget.get_widget("title")
251                        title_title = _("<big>%s</big>") %zebug.getTitle()
252                        widget_title.set_markup(title_title)
253                        widget_description = bugwidget.get_widget("description")
254                        widget_description.set_text(zebug.getDescription())
255                        widget_status= bugwidget.get_widget("status")
256                        widget_status.set_text(zebug.getStatus())
257                        widget_importance= bugwidget.get_widget("importance")
258                        widget_importance.set_text(zebug.getImportance())
259                        widget_assignee= bugwidget.get_widget("assigned")
260                        assignee_assignee = "<i>%s</i>" %zebug.getAssignee()
261                        widget_assignee.set_markup(assignee_assignee)
262                        widget_package= bugwidget.get_widget("package")
263                        package_package = "<b>%s</b>" %zebug.getPackage()
264                        widget_package.set_markup(package_package)
265                        #inserting comments
266                        hbox = gtk.VBox(spacing=2)
267                        hbox.show()
268                        for i in zebug.getAllComments():
269                                comwidget = gtk.glade.XML("conseil.glade",root="comment")
270                                auth_auth = "<b>%s</b>" %i.getAuthor()
271                                comwidget.get_widget("poster").set_markup(auth_auth)
272                                title_title = "<i>%s</i>" %i.getTitle()
273                                comwidget.get_widget("title").set_markup(title_title)
274                                comwidget.get_widget("date").set_text(i.getDate())
275                                comwidget.get_widget("comment_body").set_text(i.getContent())
276                                commentbox = comwidget.get_widget("comment")
277                                commentbox.unparent()
278                                hbox.add(commentbox)
279
280                        widget_comments.add(hbox)
281                        if zebug.isCommentable() :
282                                post_comment.show()
283                        #We take the vbox to insert it
284                        main_widget = bugwidget.get_widget("bug_main")
285                        main_widget.connect("button-press-event",callback_click)
286                        main_widget.unparent()
287               
288                zepage = page(main_widget, descr)
289                return zepage
Note: See TracBrowser for help on using the browser.