root/trunk/src/kitCreator.py @ 74

Revision 74, 38.0 KB (checked in by pcabido, 5 years ago)
  • Property svn:executable set to *
Line 
1# -*- coding: utf-8 -*-
2from metapackagehandler import mtpkgHandler
3
4import warnings
5warnings.filterwarnings("ignore", "apt API not stable yet", FutureWarning)
6
7import pygtk
8pygtk.require('2.0')
9import gtk
10import gtk.glade
11
12import os
13import sys
14import gobject
15import threading
16
17import apt
18import apt_pkg
19
20from time import strftime
21from util import util, aptutil, xmlutil
22from util import SearchWidget
23from gettext import textdomain, gettext as _
24
25__title__ = _("Kits Creator")
26__version__ = "0.0.1"
27__comments__ = _("GTK frontend for Kits Creator.")
28__authors__= ["Paulo Cabido <paulo.cabido@gmail.com>"]
29__copyright__ = "Paulo Cabido"
30__license__ = _("GNU GPL v3")
31
32
33#main function
34class kitCreatorGTK:
35   
36    def delete(self, widget, event, data=None):
37        """
38        Exits gtk.
39        """
40        gtk.main_quit()
41        return False
42   
43    def loadImage(self, image, path):
44        """
45        Sets a image.
46        """
47        try:
48            image.set_from_file(path)
49            return True
50        except:
51            pass
52            return False
53   
54    def errorDialog(self, header, msg):
55         """
56         Show an error message.
57         """
58
59         dialog = gtk.MessageDialog(parent=self.window,
60                               flags=gtk.DIALOG_MODAL,
61                               type=gtk.MESSAGE_ERROR,
62                               buttons=gtk.BUTTONS_CLOSE)
63         dialog.set_title("")
64         dialog.set_markup("<big><b>%s</b></big>\n\n%s" % (header, msg))
65         dialog.realize()
66         dialog.window.set_functions(gtk.gdk.FUNC_MOVE)
67         dialog.run()
68         dialog.destroy()
69   
70    def sucessDialog(self, header, msg):
71        """
72        Show an sucess message.
73        """
74
75        dialog = gtk.MessageDialog(parent=self.window,
76                               flags=gtk.DIALOG_MODAL,
77                               type=gtk.MESSAGE_INFO,
78                               buttons=gtk.BUTTONS_CLOSE)
79        dialog.set_title("")
80        dialog.set_markup("<big><b>%s</b></big>\n\n%s" % (header, msg))
81        dialog.realize()
82        dialog.window.set_functions(gtk.gdk.FUNC_MOVE)
83        dialog.run()
84        dialog.destroy()
85#
86# Package list
87#       
88    def setupPackageList(self, ignore=True):
89        """
90        Creates the package list from the current system cache.
91        """
92       
93        self.dialogProgress.realize()
94        self.dialogProgress.set_transient_for(self.window)
95        self.pbar.set_fraction(0)
96        self.lblMessage.set_label(_("<big><b>Generating the package list.</b></big>"))
97        self.dialogProgress.show()
98       
99        self.window.set_sensitive(False)
100        while gtk.events_pending():
101                    gtk.main_iteration()
102       
103        self.pkgCache = aptutil.getCachePackages()       
104       
105        self.pkgCache.sort()
106        self.pkgCache = util.removeDuplicates(self.pkgCache)
107       
108        fraction = (1.0/len(self.pkgCache))
109        progress=0
110        setFraction = 0
111        for elm in self.pkgCache:
112            self.listStore.append(elm)
113            while gtk.events_pending():
114                    gtk.main_iteration()
115            if (progress + fraction) <= 1:
116                progress += fraction
117                if setFraction != util.pbarValue(progress):
118                    setFraction = util.pbarValue(progress)
119                    self.pbar.set_fraction(setFraction)
120       
121        self.rendererText = gtk.CellRendererText()
122       
123        self.rendererToggle = gtk.CellRendererToggle()
124        self.rendererToggle.set_property('activatable', True)
125        self.rendererToggle.connect('toggled', self.colToggledClicked, self.listStore)
126       
127        self.colToggle = gtk.TreeViewColumn("", self.rendererToggle )
128        self.colToggle.add_attribute( self.rendererToggle, "active", 0)
129       
130        self.treeview.append_column(self.colToggle)
131       
132        colPacote = gtk.TreeViewColumn(_("Package"), self.rendererText, text=1)
133        colPacote.set_resizable(True)
134        colPacote.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
135        colPacote.set_fixed_width( 125 )
136        #colPacote.set_sort_column_id(1)
137       
138        colVersion = gtk.TreeViewColumn(_("Version"), self.rendererText, text=2)
139        colVersion.set_resizable(True)
140        colVersion.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
141        colVersion.set_fixed_width( 125 )
142        #colVersion.set_sort_column_id(2)
143       
144        colDesc = gtk.TreeViewColumn(_("Description"), self.rendererText, text=3)
145        colDesc.set_resizable(True)
146        colDesc.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
147        colDesc.set_fixed_width( 350 )
148        #colDesc.set_sort_column_id(3)
149       
150        self.treeview.append_column(colPacote)
151        self.treeview.append_column(colVersion)
152        self.treeview.append_column(colDesc)
153       
154        self.treeview.set_model(self.listStore)
155        self.treeview.set_search_column(1)
156       
157        self.dialogProgress.hide()
158        self.window.set_sensitive(True)
159        return True
160       
161    def colToggledClicked( self, cell, path, model ):
162        """
163        Sets the toggled state on the toggle button to true or false.
164        """
165
166        if self.setListStoreSearch:
167                model = self.listStoreSearch
168         
169        model[path][0] = not model[path][0]
170        if model[path][0]:
171            #add version here
172            self.packageList[model[path][1]] = model[path][2]
173   
174            util.changePackageListValue(self.pkgCache, 1,
175                                        model[path][1], 2,
176                                        model[path][2], 0,
177                                        model[path][0])
178        else:
179            del self.packageList[model[path][1]]
180            util.changePackageListValue(self.pkgCache, 1,
181                                        model[path][1], 2,
182                                        model[path][2], 0,
183                                        model[path][0])
184           
185        return
186   
187    def searchPackageList(self, widget, query):
188        """
189        Searches the packages list and sets the Treeview with the results.
190        """
191        self.listStoreSearch = gtk.ListStore(gobject.TYPE_BOOLEAN, str, str, str)
192       
193        if query:
194            for elm in self.pkgCache:
195                if (query in elm[1]) or (query in elm[2]) or (query in elm[3]):
196                    self.listStoreSearch.append(elm)
197                   
198            self.treeview.set_model(self.listStoreSearch)
199            self.treeview.set_search_column(1)
200            self.setListStoreSearch = True
201        else:
202            self.listStore.clear()
203            for elm in self.pkgCache:
204                if (query in elm[1]) or (query in elm[2]) or (query in elm[3]):
205                    self.listStore.append(elm)
206                   
207            self.treeview.set_model(self.listStore)
208            self.treeview.set_search_column(1)
209            self.setListStoreSearch = False
210           
211        return True
212#
213# aboutdialog
214#
215    def closeAbout(self, widget, data=None):
216        """
217        Closes the about dialog.
218        """
219        self.aboutDialog.hide()
220        return True
221   
222    def showAbout(self, widget, data=None):
223        """
224        Create the about dialog.
225        @param widget: Current widget
226        @type widget: gtk widget
227        """
228       
229        #self.aboutDialogIcon = gtk.gdk.pixbuf_new_from_file("pixmaps/kitsalinex.svg")
230        self.aboutDialog = self.wTree.get_widget("aboutdialogCriarkits")
231        self.aboutDialog.set_name(__title__)
232        self.aboutDialog.set_version(__version__)
233        self.aboutDialog.set_comments(__comments__)
234        self.aboutDialog.set_copyright(__copyright__)
235        self.aboutDialog.set_authors(__authors__)
236        self.aboutDialog.set_license(__license__)
237        #self.aboutDialog.set_logo(self.aboutDialogIcon)
238       
239        self.aboutDialog.connect("destroy", self.closeAbout)
240        self.aboutDialog.connect("delete_event", self.closeAbout)
241        self.aboutDialog.connect("response", self.closeAbout)
242        self.aboutDialog.show()
243        return True
244   
245#
246#funcoes relacionadas com os metapacotes
247#
248    def resetFields(self, widget, data=None):
249        self.entryFilename.set_text("")
250        self.entryName.set_text("")
251        self.cmbPriority.set_active(0)
252        self.cmbSection.set_active(0)
253        self.entryVersion.set_text("")
254        self.cmbArch.set_active(0)
255        self.entryMaintainer.set_text("")
256        self.entrySDesc.set_text("")
257        self.textviewLDesc.get_buffer().set_text("")
258        self.textPostinst.get_buffer().set_text("")
259       
260        self.packageList = {}
261        self.listStore.clear()
262        for val in self.pkgCache:
263                if val[0]:
264                    val[0] = False
265                self.listStore.append(val)
266                   
267        self.treeview.set_model(self.listStore)
268        self.treeview.set_search_column(1)
269        return True
270   
271    def createSystemKit(self, widget, data=None):
272       
273        #self.listStore.clear()
274        #for val in self.pkgCache:
275        #    for pkg in installedPackages:
276        #        if val[1] == pkg:
277        #            val[0] = True
278        #            self.packageList[val[1]] = val[2]
279        #            break
280        #    self.listStore.append(val)
281        #
282        #self.treeview.set_model(self.listStore)
283        #self.treeview.set_search_column(1)
284       
285        self.dialogProgress.realize()
286        self.dialogProgress.set_transient_for(self.window)
287        self.pbar.set_fraction(0)
288        self.lblMessage.set_label(_("<big><b>Checking the system for installed packages.</b></big>"))
289        self.dialogProgress.show()
290       
291        self.window.set_sensitive(False)
292       
293        installedPackages = aptutil.readAptInstalled2List()
294        item = self.listStore.get_iter_first()
295        fraction = (1.0/len(self.pkgCache))
296        progress = 0
297        setFraction = 0
298        while ( item != None ):
299            for pkg in installedPackages:
300                if self.listStore.get_value(item, 1) == pkg:
301                    self.listStore.set_value(item, 0, True)
302                    break
303            item = self.listStore.iter_next(item)
304            while gtk.events_pending():
305                    gtk.main_iteration()
306            if (progress + fraction) <= 1:
307                progress += fraction
308                if setFraction != util.pbarValue(progress, 10):
309                    setFraction = util.pbarValue(progress, 10)
310                    self.pbar.set_fraction(setFraction)
311       
312        timestamp = strftime("%Y%m%d%H%M")
313        if not self.entryFilename.get_text():
314            self.entryFilename.set_text("Kit-SystemBackup_" + timestamp + ".deb")
315       
316        if not self.entryName.get_text():
317            self.entryName.set_text("Kit-SystemBackup")
318        #self.cmbPriority.set_active(3)
319        if not self.entrySDesc.get_text():
320            self.entrySDesc.set_text(_("System/backup Kit"))
321       
322        start = self.textviewLDesc.get_buffer().get_start_iter()
323        end = self.textviewLDesc.get_buffer().get_end_iter()
324        if not self.textviewLDesc.get_buffer().get_text(start, end, True):
325            stime = strftime("%d-%m-%Y")
326            self.textviewLDesc.get_buffer().set_text(_("System state (backup) %s.\n"
327                                                       "This Kit restores or duplicates the system state.") % stime)
328       
329        self.dialogProgress.hide()
330        self.window.set_sensitive(True)
331       
332        return True
333   
334    def openKit(self, widget, data=None):
335        dialog = gtk.FileChooserDialog(_("Open Kit"),
336                               None,
337                               gtk.FILE_CHOOSER_ACTION_OPEN,
338                               (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
339                                gtk.STOCK_OPEN, gtk.RESPONSE_OK))
340       
341        dialog.set_default_response(gtk.RESPONSE_OK)
342       
343        filter = gtk.FileFilter()
344        filter.set_name("Kits")
345        filter.add_pattern("*.kit")
346        filter.add_pattern("*.deb")
347        dialog.add_filter(filter)
348       
349        response = dialog.run()
350        kitType = ""
351        if response == gtk.RESPONSE_OK:
352            kitFile = dialog.get_filename()
353            tmpKitFile = os.path.splitext(kitFile)
354           
355            if tmpKitFile[1] != "":
356                if tmpKitFile[1] == ".deb":
357                    kitType = "deb"
358                elif tmpKitFile[1] == ".kit":
359                    kitType = "xml"
360                else:
361                    print "error"
362        elif response == gtk.RESPONSE_CANCEL:
363            dialog.destroy()
364            return
365        else:
366            dialog.destroy()
367            return
368       
369        dialog.destroy()
370       
371        if kitType == "deb":
372            kitDic = mtpkgHandler.readMetapackageFile(kitFile)
373            #preencher os campos
374            self.entryName.set_text(kitDic['Package'])
375
376            tmpModel = self.cmbPriority.get_model()
377            item = tmpModel.get_iter_first()
378            i=-1
379            self.cmbPriority.set_active(i)
380            while ( item != None ):
381                i += 1
382                if tmpModel.get_value (item, 0) == kitDic['Priority']:
383                    self.cmbPriority.set_active(i)
384                    break
385                item = tmpModel.iter_next(item)
386           
387            tmpModel = self.cmbSection.get_model()
388            item = tmpModel.get_iter_first()
389            i=-1
390            self.cmbSection.set_active(i)
391            while ( item != None ):
392                i += 1
393                if tmpModel.get_value (item, 0) == self.parseSection.getSections()[kitDic['Section']]:
394                    self.cmbSection.set_active(i)
395                    break
396                item = tmpModel.iter_next(item)
397           
398            self.entryVersion.set_text(kitDic['Version'])
399           
400            tmpModel = self.cmbArch.get_model()
401            item = tmpModel.get_iter_first()
402            i=-1
403            self.cmbArch.set_active(i)
404            while ( item != None ):
405                i += 1
406                if tmpModel.get_value (item, 0) == kitDic['Architecture']:
407                    self.cmbArch.set_active(i)
408                    break
409                item = tmpModel.iter_next(item)
410           
411            self.entryMaintainer.set_text(kitDic['Maintainer'])
412            self.entrySDesc.set_text( aptutil.getShortDesc(kitDic['Description']) )
413            self.textviewLDesc.get_buffer().set_text( aptutil.getLongDesc(kitDic['Description']).replace(".\n", "\n") )
414           
415            self.entryFilename.set_text(kitFile.split("/")[len(kitFile.split("/"))-1])
416           
417            #self.textPostinst.get_buffer().set_text("")
418           
419            #####
420            self.dialogProgress.realize()
421            self.dialogProgress.set_transient_for(self.window)
422            self.lblMessage.set_label(_("<big><b>Checking selected packages.</b></big>"))
423            self.pbar.set_fraction(0)
424            self.dialogProgress.show()
425           
426            self.window.set_sensitive(False)
427           
428            installedPackages = aptutil.readAptInstalled2List()
429            item = self.listStore.get_iter_first()
430            fraction = (1.0/len(self.pkgCache))
431            progress = 0
432            setFraction = 0
433            while ( item != None ):
434                for pkg in kitDic['Depends']:
435                    if self.listStore.get_value(item, 1) == pkg:
436                        self.listStore.set_value(item, 0, True)
437                item = self.listStore.iter_next(item)
438                while gtk.events_pending():
439                        gtk.main_iteration()
440                if (progress + fraction) <= 1:
441                    progress += fraction
442                    if setFraction != util.pbarValue(progress):
443                        setFraction = util.pbarValue(progress)
444                        self.pbar.set_fraction(setFraction)
445                       
446            self.dialogProgress.hide()
447            self.window.set_sensitive(True)
448            #####
449        elif kitType == "xml":
450            xmlKit = xmlutil.parseKit(kitFile)
451            kitDic = xmlKit.getKit()
452           
453            self.entryFilename.set_text(kitDic['kitFilename'])
454            self.entryName.set_text(kitDic['kitName'])
455           
456            tmpModel = self.cmbPriority.get_model()
457            item = tmpModel.get_iter_first()
458            i=-1
459            self.cmbPriority.set_active(i)
460            while ( item != None ):
461                i += 1
462                if tmpModel.get_value (item, 0) == kitDic['priority']:
463                    self.cmbPriority.set_active(i)
464                    break
465                item = tmpModel.iter_next(item)
466           
467            tmpModel = self.cmbSection.get_model()
468            item = tmpModel.get_iter_first()
469            i=-1
470            self.cmbSection.set_active(i)
471            while ( item != None ):
472                i += 1
473                if tmpModel.get_value (item, 0) == kitDic['section']:
474                    self.cmbSection.set_active(i)
475                    break
476                item = tmpModel.iter_next(item)
477           
478            self.entryVersion.set_text(kitDic['version'])
479           
480            tmpModel = self.cmbArch.get_model()
481            item = tmpModel.get_iter_first()
482            i=-1
483            self.cmbArch.set_active(i)
484            while ( item != None ):
485                i += 1
486                if tmpModel.get_value (item, 0) == kitDic['arch']:
487                    self.cmbArch.set_active(i)
488                    break
489                item = tmpModel.iter_next(item)
490           
491            self.entryMaintainer.set_text(kitDic['kitMaintainer'])
492            self.entrySDesc.set_text(kitDic['kitSDesc'])
493            self.textviewLDesc.get_buffer().set_text(kitDic['kitLDesc'])
494            self.textPostinst.get_buffer().set_text(kitDic['kitPostinst'])
495           
496            #####
497            self.dialogProgress.realize()
498            self.dialogProgress.set_transient_for(self.window)
499            self.lblMessage.set_label(_("<big><b>Checking selected packages.</b></big>"))
500            self.pbar.set_fraction(0)
501            self.dialogProgress.show()
502           
503            self.window.set_sensitive(False)
504           
505            installedPackages = aptutil.readAptInstalled2List()
506            item = self.listStore.get_iter_first()
507            fraction = (1.0/len(self.pkgCache))
508            progress = 0
509            setFraction = 0
510            while ( item != None ):
511                for pkg in kitDic['Depends']:
512                    if self.listStore.get_value(item, 1) == pkg:
513                        self.listStore.set_value(item, 0, True)
514                item = self.listStore.iter_next(item)
515                while gtk.events_pending():
516                        gtk.main_iteration()
517                if (progress + fraction) <= 1:
518                    progress += fraction
519                    if setFraction != util.pbarValue(progress):
520                        setFraction = util.pbarValue(progress)
521                        self.pbar.set_fraction(setFraction)
522                       
523            self.dialogProgress.hide()
524            self.window.set_sensitive(True)
525            #####
526        else:
527            pass
528       
529        return True
530       
531    def saveKit(self, widget, data=None):
532        dialog = gtk.FileChooserDialog(_("Save Kit"),
533                               None,
534                               gtk.FILE_CHOOSER_ACTION_SAVE,
535                               (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
536                                gtk.STOCK_SAVE, gtk.RESPONSE_OK))
537       
538        dialog.set_default_response(gtk.RESPONSE_OK)
539       
540        filter = gtk.FileFilter()
541        filter.set_name("Kits")
542        filter.add_pattern("*.kit")
543        filter.add_pattern("*.deb")
544        dialog.add_filter(filter)
545       
546        response = dialog.run()
547       
548        if response == gtk.RESPONSE_OK:
549            kitFile = os.path.splitext(dialog.get_filename())
550            if kitFile[1] == ".kit":
551                tmpKitFile = kitFile[0] + kitFile[1]
552            else:
553                tmpKitFile = kitFile[0] + ".kit"
554        elif response == gtk.RESPONSE_CANCEL:
555            dialog.destroy()
556            return
557        else:
558            dialog.destroy()
559            return
560       
561        dialog.destroy()
562       
563        xmlKit = xmlutil.parseKit(tmpKitFile.replace(" ", "-"))
564       
565        start = self.textviewLDesc.get_buffer().get_start_iter()
566        end = self.textviewLDesc.get_buffer().get_end_iter()
567        ldesc = self.textviewLDesc.get_buffer().get_text(start,end, True)
568       
569        start = self.textPostinst.get_buffer().get_start_iter()
570        end = self.textPostinst.get_buffer().get_end_iter()
571        postinst = self.textPostinst.get_buffer().get_text(start,end, True)
572       
573        #####
574        depends = []
575        self.dialogProgress.realize()
576        self.dialogProgress.set_transient_for(self.window)
577        self.lblMessage.set_label(_("<big><b>Checking selected packages.</b></big>"))
578        self.pbar.set_fraction(0)
579        self.dialogProgress.show()
580       
581        self.window.set_sensitive(False)
582       
583        installedPackages = aptutil.readAptInstalled2List()
584        item = self.listStore.get_iter_first()
585        fraction = (1.0/len(self.pkgCache))
586        progress = 0
587        setFraction = 0
588        while ( item != None ):
589            if self.listStore.get_value(item, 0):
590                depends.append(self.listStore.get_value(item, 1))
591            item = self.listStore.iter_next(item)
592            while gtk.events_pending():
593                    gtk.main_iteration()
594            if (progress + fraction) <= 1:
595                progress += fraction
596                if setFraction != util.pbarValue(progress):
597                    setFraction = util.pbarValue(progress)
598                    self.pbar.set_fraction(setFraction)
599                   
600        self.dialogProgress.hide()
601        self.window.set_sensitive(True)
602        #####
603       
604        result = xmlKit.writeKit(self.entryName.get_text(),
605                                 self.entryMaintainer.get_text(),
606                                 self.entryVersion.get_text(),
607                                 self.cmbArch.get_active_text(),
608                                 self.cmbSection.get_active_text(),
609                                 self.cmbPriority.get_active_text(),
610                                 self.entrySDesc.get_text(),
611                                 ldesc,
612                                 postinst,
613                                 self.entryFilename.get_text(),
614                                 self.buttonPath.get_filename(),
615                                 depends)
616        if not result:
617            #TODO: error dialog
618            print "saveKit: erro"
619            return False
620       
621        return True
622 
623    def generateMetapackage(self, widget, data=None):
624       
625        self.entrySearchbox.set_text("")
626       
627        tmpFilename = os.path.splitext(self.entryFilename.get_text())
628        self._filename = tmpFilename[0]
629        if not self._filename:
630            self.errorDialog(_("File name"),
631                             _("The file name must be defined."))
632            self.entryFilename.grab_focus()
633            return False
634        else:
635            if tmpFilename[1] != "":
636                if tmpFilename[1] == ".deb":
637                    self._filename.replace(' ','-')
638                    self._filename += tmpFilename[1]
639                else:
640                    self._filename.replace(' ','-')
641                    self._filename += ".deb"
642            else:
643                self._filename.replace(' ','-')
644                self._filename += ".deb"
645            self.entryFilename.set_text(self._filename)
646       
647        self._path = self.buttonPath.get_filename()
648        if not self._path:
649            self.errorDialog(_("Location"),
650                             _("The location where to save the Kit must be defined."))
651            self.buttonPath.grab_focus()
652            return False
653        else:
654            self._path.replace(' ','\ ')
655       
656        self._name = self.entryName.get_text()
657        if not self._name:
658            self.errorDialog(_("Kit Name"),
659                             _("The Kit name must be defined."))
660            self.notebook.set_current_page(0)
661            self.entryName.grab_focus()
662            return False
663        elif util.iligalChars(self._name):
664            self.errorDialog(_("Kit Name"),
665                             _("The Kit name has illegal characters."))
666            self.notebook.set_current_page(0)
667            self.entryName.grab_focus()
668            return False
669        else:
670            self._name.replace(' ','-')
671       
672        self._priority = self.cmbPriority.get_active_text()
673        if not self._priority:
674            self.errorDialog(_("Kit Priority"),
675                             _("The Kit priority must be defined."))
676            self.notebook.set_current_page(0)
677            self.cmbPriority.grab_focus()
678            return False
679       
680        self._section = util.dicKey(self.parseSection.getSections(), self.cmbSection.get_active_text())
681        if not self._section:
682            self.errorDialog(_("Kit Section"),
683                             _("The Kit section must be defined."))
684            self.notebook.set_current_page(0)
685            self.cmbSection.grab_focus()
686            return False
687       
688        self._version = self.entryVersion.get_text()
689        if not self._version:
690            self.errorDialog(_("Kit Version"),
691                             _("The Kit version must be defined."))
692            self.notebook.set_current_page(0)
693            self.entryVersion.grab_focus()
694            return False
695        elif util.iligalChars(self._version):
696            self.errorDialog(_("Kit Version"),
697                             _("The Kit version has illegal characters."))
698            self.notebook.set_current_page(0)
699            self.entryVersion.grab_focus()
700            return False
701       
702        self._arch = self.cmbArch.get_active_text()
703        if not self._arch:
704            self.errorDialog(_("Kit Architecture"),
705                             _("The Kit architecture must be defined."))
706            self.notebook.set_current_page(0)
707            self.cmbArch.grab_focus()
708            return False
709       
710        self._maintainer = self.entryMaintainer.get_text()
711        if not self._maintainer:
712            self.errorDialog(_("Kit Maintainer"),
713                             _("The Kit maintainer must be defined."))
714            self.notebook.set_current_page(0)
715            self.entryMaintainer.grab_focus()
716            return False
717        elif util.iligalChars(self._maintainer, [':']):
718            self.errorDialog(_("Kit Maintainer"),
719                             _("The Kit maintainer has illegal characters."))
720            self.notebook.set_current_page(0)
721            self.entryMaintainer.grab_focus()
722            return False
723           
724        start = self.textviewLDesc.get_buffer().get_start_iter()
725        end = self.textviewLDesc.get_buffer().get_end_iter()
726        sdesc = self.entrySDesc.get_text()
727        ldesc = self.textviewLDesc.get_buffer().get_text(start,end, True)
728        if not sdesc:
729            self.errorDialog(_("Kit Synopsis"),
730                             _("The Kit synopsis must be defined."))
731            self.notebook.set_current_page(1)
732            self.entrySDesc.grab_focus()
733            return False
734        elif util.iligalChars(sdesc, [':']):
735            self.errorDialog(_("Kit Synopsis"),
736                             _("The Kit synopsis has illegal characters."))
737            self.notebook.set_current_page(1)
738            self.entrySDesc.grab_focus()
739            return False
740       
741        if not ldesc:
742            self.errorDialog(_("Kit Description"),
743                             _("The Kit description must be defined."))
744            self.notebook.set_current_page(1)
745            self.textviewLDesc.grab_focus()
746            return False
747        #elif util.iligalChars(ldesc, [':']):
748        #    self.errorDialog(_("Descrição Longa"),
749        #                     _("A Descrição Longa do Kit tem caracteres ilegais."))
750        #    self.notebook.set_current_page(1)
751        #    self.textviewLDesc.grab_focus()
752        #    return False
753        #esta tudo ok com as desc's
754        self._desc = aptutil.setDescription(sdesc, ldesc)
755       
756        #self._depends = aptutil.getDependsFromDic(self.packageList)
757        self._depends = []
758        #####
759        self.dialogProgress.realize()
760        self.dialogProgress.set_transient_for(self.window)
761        self.lblMessage.set_label(_("<big><b>Checking selected packages.</b></big>"))
762        self.pbar.set_fraction(0)
763        self.dialogProgress.show()
764       
765        self.window.set_sensitive(False)
766       
767        installedPackages = aptutil.readAptInstalled2List()
768        item = self.listStore.get_iter_first()
769        fraction = (1.0/len(self.pkgCache))
770        progress = 0
771        setFraction = 0
772        while ( item != None ):
773            if self.listStore.get_value(item, 0):
774                self._depends.append(self.listStore.get_value(item, 1))
775            item = self.listStore.iter_next(item)
776            while gtk.events_pending():
777                    gtk.main_iteration()
778            if (progress + fraction) <= 1:
779                progress += fraction
780                if setFraction != util.pbarValue(progress):
781                    setFraction = util.pbarValue(progress)
782                    self.pbar.set_fraction(setFraction)
783       
784        self._depends = util.removeDuplicates(self._depends)
785        self.dialogProgress.hide()
786        self.window.set_sensitive(True)
787        #####
788       
789        if not self._depends:
790            self.errorDialog(_("Kit Packages"),
791                             _("At least one package has to be selected."))
792            self.notebook.set_current_page(2)
793            return False
794       
795        start = self.textPostinst.get_buffer().get_start_iter()
796        end = self.textPostinst.get_buffer().get_end_iter()
797        self._postinst = self.textPostinst.get_buffer().get_text(start,end, True)
798       
799        mtpkg = mtpkgHandler.metapackage('/' + self._filename,
800                                         self._path,
801                                         self._name,
802                                         self._priority,
803                                         self._section,
804                                         self._version,
805                                         self._arch,
806                                         self._maintainer,
807                                         "",
808                                         "",
809                                         self._desc,
810                                         aptutil.getDependsFromList(self._depends),
811                                         self._postinst)
812       
813        result = mtpkg.createBaseFiles(self.tmpDirRoot + "/metapackage")
814        if result == 0:
815            self.errorDialog(_("Error"),
816                             _("An error occurred during the Kit creation."))
817            return False
818       
819        result = mtpkg.generateMetapackage(self.tmpDirRoot,
820                                           self.tmpDirRoot + "/metapackage")
821        if result == 0:
822            self.errorDialog(_("Error"),
823                             _("An error occurred during the Kit creation."))
824            return False
825       
826        #dialog, msg de sucesso
827        self.sucessDialog(_("Kit created successfully!"),
828                          (_("Kit <b>%s</b> was created with success and saved at <b>%s/%s</b>.") % (self._name, self._path, self._filename)))
829       
830        return True       
831
832#
833# __init__
834#
835    def __init__(self):     
836        self.localPath = os.path.realpath(os.path.dirname(sys.argv[0]))
837       
838        self.tmpDirRoot = "/tmp/kitsalinex"
839        self.sectionsFile = self.localPath + "/data/sections.xml"
840       
841        self.gladefile = self.localPath + "/data/kitCreator.glade"
842        self.wTree = gtk.glade.XML(self.gladefile)
843       
844        #menu
845        self.aboutMenu = self.wTree.get_widget("aboutMenu")
846        self.quitMenu = self.wTree.get_widget("quitMenu")
847        self.systemkitMenu = self.wTree.get_widget("systemkitMenu")
848        self.newMenu = self.wTree.get_widget("newMenu")
849        self.openMenu = self.wTree.get_widget("openMenu")
850        self.saveMenu = self.wTree.get_widget("saveMenu")
851       
852        #botoes do notebook
853        self.buttonNext = self.wTree.get_widget("buttonNext")
854        self.buttonNext2 = self.wTree.get_widget("buttonNext2")
855        self.buttonNext3 = self.wTree.get_widget("buttonNext3")
856        self.buttonNext4 = self.wTree.get_widget("buttonNext4")
857        self.buttonBack = self.wTree.get_widget("buttonBack")
858        self.buttonBack2 = self.wTree.get_widget("buttonBack2")
859        self.buttonBack3 = self.wTree.get_widget("buttonBack3")
860        self.buttonBack4 = self.wTree.get_widget("buttonBack4")
861       
862        self.notebook = self.wTree.get_widget("notebook")
863        self.imageDadosGerais = self.wTree.get_widget("imageDadosGerais")
864        self.imageDesc = self.wTree.get_widget("imageDesc")
865        self.imagePackages = self.wTree.get_widget("imagePackages")
866        self.imagePostInst = self.wTree.get_widget("imagePostInst")
867        self.imageGenerate = self.wTree.get_widget("imageGenerate")
868       
869        self.treeview = self.wTree.get_widget("treeviewPackages")
870        self.listStore = gtk.ListStore(gobject.TYPE_BOOLEAN, str, str, str)
871        self.sectionStore = gtk.ListStore(str)
872       
873        self.vboxSectioncmb = self.wTree.get_widget("vboxSectioncmb")
874        self.cmbSection = gtk.combo_box_new_text()
875        self.vboxSectioncmb.add(self.cmbSection)
876        self.cmbSection.show()
877       
878        self.packageList = {}
879        self.setListStoreSearch = False
880       
881        #entry's (textboxes)
882        self.entryName = self.wTree.get_widget("entryName")
883        self.entryMaintainer = self.wTree.get_widget("entryMaintainer")
884        self.entryVersion = self.wTree.get_widget("entryVersion")
885       
886        #combo boxes
887        self.cmbArch = self.wTree.get_widget("cmbArch")
888        #self.cmbSection = self.wTree.get_widget("cmbSection")
889        self.cmbPriority = self.wTree.get_widget("cmbPriority")
890       
891        #desc
892        self.entrySDesc = self.wTree.get_widget("entrySDesc")
893        self.textviewLDesc = self.wTree.get_widget("textviewLDesc")
894       
895        #postinst
896        self.textPostinst = self.wTree.get_widget("textPostinst")
897       
898        self.entryFilename = self.wTree.get_widget("entryFilename")
899        self.buttonPath = self.wTree.get_widget("buttonPath")
900        self.buttonGenerateKit = self.wTree.get_widget("buttonGenerateKit")
901       
902        #Progress dialog   
903        self.dialogProgress = self.wTree.get_widget("dialogProgress")
904        self.pbar = self.wTree.get_widget("pbarCache")
905        self.lblMessage = self.wTree.get_widget("lblMessage")
906       
907        self.window = self.wTree.get_widget("window_criarkit")
908        if (self.window):
909            self.window.set_title(__title__)
910            self.window.connect("destroy", gtk.main_quit)
911            self.window.connect("delete_event", self.delete)
912            #self.buttonQuit.connect("clicked", gtk.main_quit)
913             
914            #define as imagens dos tabs
915            self.loadImage(self.imageDadosGerais, self.localPath + "/data/icons/package_development.png")
916            self.loadImage(self.imageDesc, self.localPath + "/data/icons/emblem-documents.png")
917            self.loadImage(self.imagePackages, self.localPath + "/data/icons/file-roller.png")
918            self.loadImage(self.imagePostInst, self.localPath + "/data/icons/emblem-package.png")
919            self.loadImage(self.imageGenerate, self.localPath + "/data/icons/application-x-deb.png")
920           
921            #searchbox
922            self.hboxSearch = self.wTree.get_widget("hboxSearch")
923            self.entrySearchbox = SearchWidget.SearchEntry(gtk.icon_theme_get_default())
924            self.hboxSearch.add(self.entrySearchbox)
925            self.entrySearchbox.connect("terms-changed", self.searchPackageList)
926            self.entrySearchbox.show()
927           
928            #notebook navigation
929            self.buttonNext.connect("clicked", lambda w: self.notebook.next_page())
930            self.buttonNext2.connect("clicked", lambda w: self.notebook.next_page())
931            self.buttonNext3.connect("clicked", lambda w: self.notebook.next_page())
932            self.buttonNext4.connect("clicked", lambda w: self.notebook.next_page())
933            self.buttonBack.connect("clicked", lambda w: self.notebook.prev_page())
934            self.buttonBack2.connect("clicked", lambda w: self.notebook.prev_page())
935            self.buttonBack3.connect("clicked", lambda w: self.notebook.prev_page())
936            self.buttonBack4.connect("clicked", lambda w: self.notebook.prev_page())
937            #o glade poe o expand False, e preciso mudar manualmente
938            for n in range(self.notebook.get_n_pages()):
939                self.notebook.set_tab_label_packing(self.notebook.get_nth_page(n),
940                                                    True, True, gtk.PACK_START)
941               
942            #menubar
943            self.quitMenu.connect('activate', gtk.main_quit)
944            self.aboutMenu.connect('activate', self.showAbout)
945            self.systemkitMenu.connect('activate', self.createSystemKit)
946            self.newMenu.connect('activate', self.resetFields)
947            self.openMenu.connect('activate', self.openKit)
948            self.saveMenu.connect('activate', self.saveKit)
949           
950            #sections
951            self.parseSection = xmlutil.parseSection(self.sectionsFile)
952            self.parseSection.run()
953            sections = self.parseSection.getSections().items()
954            sections.sort()
955           
956            self.cmbSection.append_text("")
957            for section in sections:
958                self.cmbSection.append_text(section[1])
959            self.cmbSection.set_active(0)
960            self.cmbSection.set_wrap_width(1)
961           
962            #other buttons
963            self.buttonPath.set_filename(os.getenv('HOME'))
964            self.buttonGenerateKit.connect('clicked', self.generateMetapackage)
965           
966            self.setupPackageList()
967           
968def main():
969    hwg = kitCreatorGTK()
970    gtk.main()
971    return 0
972
973#if __name__ == "__main__":
974#    hwg = CreateKitGTK()
975#    main()
Note: See TracBrowser for help on using the browser.