[PATCH] Rework the repo editor screen to be more modular.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 iw/task_gui.py |  416 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 219 insertions(+), 197 deletions(-)

diff --git a/iw/task_gui.py b/iw/task_gui.py
index 495a2c4..7779183 100644
--- a/iw/task_gui.py
+++ b/iw/task_gui.py
@@ -35,177 +35,131 @@ import yum.Errors
 import logging
 log = logging.getLogger("anaconda")
 
-class TaskWindow(InstallWindow):
-    def getNext(self):
-        if self.xml.get_widget("customRadio").get_active():
-            self.dispatch.skipStep("group-selection", skip = 0)
-        else:
-            self.dispatch.skipStep("group-selection", skip = 1)
-
-        tasks = self.xml.get_widget("taskList").get_model()
-        for (cb, task, grps) in tasks:
-            if cb:
-                map(self.backend.selectGroup, grps)
-            else:
-                map(self.backend.deselectGroup, grps)
-
-        if self.anaconda.id.instClass.allowExtraRepos:
-            repos = self.xml.get_widget("repoList").get_model()
-            for (cb, reponame, repo) in repos:
-                if cb:
-                    repo.enable()
-
-                    # Setup any repositories that were in the installclass's
-                    # default list.
-                    self._setupRepo(repo)
-                else:
-                    repo.disable()
-
-    def groupsInstalled(self, lst):
-        # FIXME: yum specific
-        rc = False
-        for gid in lst:
-            g = self.backend.ayum.comps.return_group(gid)
-            if g and not g.selected:
-                return False
-            elif g:
-                rc = True
-        return rc
+def setupRepo(anaconda, repo):
+    try:
+        anaconda.backend.doRepoSetup(anaconda, thisrepo = repo.id, fatalerrors = False)
+        log.info("added repository %s with with source URL %s" % (repo.name, repo.baseurl[0]))
+    except yum.Errors.RepoError, e:
+        anaconda.intf.messageWindow(_("Error"),
+              _("Unable to read package metadata from repository.  "
+                "This may be due to a missing repodata directory.  "
+                "Please ensure that your repository has been "
+                "correctly generated.\n\n%s" %(e,)),
+                                type="ok", custom_icon="error")
+        anaconda.backend.ayum.repos.delete(self.repo.id)
+        return False
+
+    if not repo.groups_added:
+        anaconda.intf.messageWindow(_("Warning"),
+                       _("Unable to find a group file for %s.  "
+                         "This will prevent manual selection of packages "
+                         "from the repository from working") %(repo.id,),
+                                type="warning")
+
+    return True
+
+class RepoEditor:
+    def __init__(self, anaconda, repoObj):
+        self.anaconda = anaconda
+        self.backend = self.anaconda.backend
+        self.intf = self.anaconda.intf
+        self.repo = repoObj
+
+        (self.dxml, self.dialog) = gui.getGladeWidget("addrepo.glade", "addRepoDialog")
+        self.nameEntry = self.dxml.get_widget("nameEntry")
+        self.baseurlButton = self.dxml.get_widget("baseurlButton")
+        self.baseurlEntry = self.dxml.get_widget("baseurlEntry")
+        self.mirrorlistButton = self.dxml.get_widget("mirrorlistButton")
+        self.mirrorlistEntry = self.dxml.get_widget("mirrorlistEntry")
+        self.proxyCheckbox = self.dxml.get_widget("proxyCheckbox")
+        self.proxyEntry = self.dxml.get_widget("proxyEntry")
+        self.proxyTable = self.dxml.get_widget("proxyTable")
+        self.usernameEntry = self.dxml.get_widget("usernameEntry")
+        self.passwordEntry = self.dxml.get_widget("passwordEntry")
+
+    def _enableRepo(self, repourl):
+        # Only do this for the real base repo, as that's what will get
+        # written out to anaconda-ks.cfg as the method.
+        if not self.repo.addon and not self.repo.name.startswith("Driver Disk"):
+            self.anaconda.setMethodstr(repourl)
+
+            # Ideally we should be able to unmount here, but if not
+            # it's probably not a big deal.
+            try:
+                isys.umount(self.backend.ayum.tree)
+
+                if self.backend.ayum.isodir:
+                    isys.umount(self.backend.ayum.isodir)
+            except:
+                pass
 
-    def groupsExist(self, lst):
-        # FIXME: yum specific
-        for gid in lst:
-            g = self.backend.ayum.comps.return_group(gid)
-            if not g:
-                return False
         return True
 
-    def _setupRepo(self, repo):
-        try:
-            self.backend.doRepoSetup(self.anaconda, thisrepo = repo.id, fatalerrors = False)
-            log.info("added repository %s with with source URL %s" % (repo.name, repo.baseurl[0]))
-        except yum.Errors.RepoError, e:
-            self.intf.messageWindow(_("Error"),
-                  _("Unable to read package metadata from repository.  "
-                    "This may be due to a missing repodata directory.  "
-                    "Please ensure that your repository has been "
-                    "correctly generated.\n\n%s" %(e,)),
-                                    type="ok", custom_icon="error")
-            self.backend.ayum.repos.delete(repo.id)
-            return False
-
-        if not repo.groups_added:
-            self.intf.messageWindow(_("Warning"),
-                           _("Unable to find a group file for %s.  "
-                             "This will prevent manual selection of packages "
-                             "from the repository from working") %(repo.id,),
-                                    type="warning")
+    def _proxyToggled(self, *args):
+        self.proxyTable.set_sensitive(self.proxyCheckbox.get_active())
 
-        return True
+    def _radioChanged(self, *args):
+        active = self.baseurlButton.get_active()
+        self.baseurlEntry.set_sensitive(active)
+        self.mirrorlistEntry.set_sensitive(not active)
 
     def _validURL(self, url):
         return len(url) > 0 and (url.startswith("http://";) or
                                  url.startswith("https://";) or
                                  url.startswith("ftp://";))
 
-    def _addRepo(self, *args):
-        repo = None
-        editing = False
-
-        if not network.hasActiveNetDev():
-            net = NetworkConfigurator(self.anaconda.id.network)
-            ret = net.run()
-            net.destroy()
-            if ret == gtk.RESPONSE_CANCEL:
-                return gtk.RESPONSE_CANCEL
+    def createDialog(self):
+        if self.repo:
+            self.nameEntry.set_text(self.repo.name)
 
-        # If we were passed an extra argument, it's the repo store and we
-        # are editing an existing repo as opposed to adding a new one.
-        if len(args) > 1:
-            (model, iter) = args[1].get_selection().get_selected()
-            if iter:
-                repo = model.get_value(iter, 2)
-                editing = True
+            if self.repo.mirrorlist:
+                self.mirrorlistEntry.set_text(self.repo.mirrorlist)
+                self.mirrorlistButton.set_active(True)
             else:
-                return
+                self.baseurlEntry.set_text(self.repo.baseurl[0])
+                self.baseurlButton.set_active(True)
 
-        (self.dxml, dialog) = gui.getGladeWidget("addrepo.glade", "addRepoDialog")
-        nameEntry = self.dxml.get_widget("nameEntry")
-        baseurlButton = self.dxml.get_widget("baseurlButton")
-        baseurlEntry = self.dxml.get_widget("baseurlEntry")
-        mirrorlistButton = self.dxml.get_widget("mirrorlistButton")
-        mirrorlistEntry = self.dxml.get_widget("mirrorlistEntry")
-        proxyCheckbox = self.dxml.get_widget("proxyCheckbox")
-        proxyEntry = self.dxml.get_widget("proxyEntry")
-        proxyTable = self.dxml.get_widget("proxyTable")
-        usernameEntry = self.dxml.get_widget("usernameEntry")
-        passwordEntry = self.dxml.get_widget("passwordEntry")
-
-        # If we are editing an existing repo, use the existing values to
-        # populate the UI.
-        # FIXME: this is yum specific
-        if editing:
-            nameEntry.set_text(repo.name)
-
-            if repo.mirrorlist:
-                mirrorlistEntry.set_text(repo.mirrorlist)
-                mirrorlistButton.set_active(True)
-            else:
-                baseurlEntry.set_text(repo.baseurl[0])
-                baseurlButton.set_active(True)
+            if self.repo.proxy:
+                self.proxyCheckbox.set_active(True)
+                self.proxyTable.set_sensitive(True)
+                self.proxyEntry.set_text(self.repo.proxy)
+                self.usernameEntry.set_text(self.repo.proxy_username)
+                self.passwordEntry.set_text(self.repo.proxy_password)
 
-            if repo.proxy:
-                proxyCheckbox.set_active(True)
-                proxyTable.set_sensitive(True)
-                proxyEntry.set_text(repo.proxy)
-                usernameEntry.set_text(repo.proxy_username)
-                passwordEntry.set_text(repo.proxy_password)
-
-        gui.addFrame(dialog)
+        gui.addFrame(self.dialog)
 
         # Initialize UI elements that should be sensitive or not.
         self._proxyToggled()
         self._radioChanged()
 
-        proxyCheckbox.connect("toggled", self._proxyToggled)
-        baseurlButton.connect("toggled", self._radioChanged)
+        self.proxyCheckbox.connect("toggled", self._proxyToggled)
+        self.baseurlButton.connect("toggled", self._radioChanged)
 
         lbl = self.dxml.get_widget("descLabel")
         txt = lbl.get_text()
         lbl.set_text(txt %(productName,))
 
-        dialog.show_all()
+        self.dialog.show_all()
 
-        while 1:
-            rc = dialog.run()
+    def run(self, createNewRepoObj=False):
+        while True:
+            rc = self.dialog.run()
             if rc == gtk.RESPONSE_CANCEL:
                 break
 
-            reponame = nameEntry.get_text()
+            reponame = self.nameEntry.get_text()
             reponame.strip()
             if len(reponame) == 0:
                 self.intf.messageWindow(_("Invalid Repository Name"),
                                         _("You must provide a repository name."))
                 continue
 
-            if baseurlButton.get_active():
-                repourl = baseurlEntry.get_text()
-            else:
-                repourl = mirrorlistEntry.get_text()
-
-            repourl.strip()
-            if not self._validURL(repourl):
-                self.intf.messageWindow(_("Invalid Repository URL"),
-                                        _("You must provide an HTTP, HTTPS, "
-                                          "or FTP URL to a repository."))
-                continue
-
             proxy = None
             proxy_username = None
             proxy_password = None
 
-            if proxyCheckbox.get_active():
-                proxy = proxyEntry.get_text()
+            if self.proxyCheckbox.get_active():
+                proxy = self.proxyEntry.get_text()
                 proxy.strip()
                 if not self._validURL(proxy):
                     self.intf.messageWindow(_("Invalid Proxy URL"),
@@ -213,88 +167,156 @@ class TaskWindow(InstallWindow):
                                               "or FTP URL to a proxy."))
                     continue
 
-                proxy_username = usernameEntry.get_text()
-                proxy_password = passwordEntry.get_text()
+                proxy_username = self.usernameEntry.get_text()
+                proxy_password = self.passwordEntry.get_text()
 
-            # Don't create a new repo object if we are editing.
-            # FIXME: this is yum specific
-            if editing:
-                if baseurlButton.get_active():
-                    repo.baseurl = [repourl]
-                else:
-                    repo.mirrorlist = repourl
+            if createNewRepoObj:
+                self.repo = AnacondaYumRepo(repoid=reponame.replace(" ", ""))
+            else:
+                self.repo.repoid = reponame.replace(" ", "")
 
-                repo.repoid = reponame.replace(" ", "")
+            if self.baseurlButton.get_active():
+                repourl = self.baseurlEntry.get_text()
             else:
-                repoid = reponame.replace(" ", "")
+                repourl = self.mirrorlistEntry.get_text()
 
-                if baseurlButton.get_active():
-                    repo = AnacondaYumRepo(uri=repourl, repoid=repoid)
-                else:
-                    repo = AnacondaYumRepo(mirrorlist=repourl, repoid=repoid)
+            repourl.strip()
+            if not self._validURL(repourl):
+                self.intf.messageWindow(_("Invalid Repository URL"),
+                                        _("You must provide an HTTP, HTTPS, "
+                                          "or FTP URL to a repository."))
+                continue
+
+            if self.baseurlButton.get_active():
+                self.repo.baseurl = [repourl]
+            else:
+                self.repo.mirrorlist = repourl
 
-            repo.name = reponame
-            repo.basecachedir = self.backend.ayum.conf.cachedir
+            self.repo.name = reponame
+            self.repo.basecachedir = self.backend.ayum.conf.cachedir
 
             if proxy:
-                repo.proxy = proxy
-                repo.proxy_username = proxy_username
-                repo.proxy_password = proxy_password
+                self.repo.proxy = proxy
+                self.repo.proxy_username = proxy_username
+                self.repo.proxy_password = proxy_password
 
-            repo.enable()
+                self.repo.enable()
 
-            if editing:
-                # Only do this for the real base repo, as that's what will get
-                # written out to anaconda-ks.cfg as the method.
-                if not repo.addon and not repo.name.startswith("Driver Disk"):
-                    self.anaconda.setMethodstr(repourl)
+            if not self._enableRepo(repourl):
+                continue
 
-                    # Ideally we should be able to unmount here, but if not
-                    # it's probably not a big deal.
-                    try:
-                        isys.umount(self.backend.ayum.tree)
+            if not setupRepo(self.anaconda, self.repo):
+                continue
 
-                        if self.backend.ayum.isodir:
-                            isys.umount(self.backend.ayum.isodir)
-                    except:
-                        pass
+            break
 
-                if not self._setupRepo(repo):
-                    continue
-            else:
-                try:
-                    self.backend.ayum.repos.add(repo)
-                except yum.Errors.DuplicateRepoError, e:
-                    self.intf.messageWindow(_("Error"),
-                          _("The repository %s has already been added.  Please "
-                            "choose a different repository name and "
-                            "URL.") % reponame, type="ok", custom_icon="error")
-                    continue
+        self.dialog.hide()
+        return rc
 
-                if not self._setupRepo(repo):
-                    continue
+class RepoCreator(RepoEditor):
+    def __init__(self, anaconda):
+        RepoEditor.__init__(self, anaconda, None)
+
+    def _enableRepo(self, repourl):
+        try:
+            self.backend.ayum.repos.add(self.repo)
+        except yum.Errors.DuplicateRepoError, e:
+            self.intf.messageWindow(_("Error"),
+                  _("The repository %s has already been added.  Please "
+                    "choose a different repository name and "
+                    "URL.") % reponame, type="ok", custom_icon="error")
+            return False
 
-                s = self.xml.get_widget("repoList").get_model()
-                s.append([repo.isEnabled(), repo.name, repo])
+        return True
 
-            break
+    def run(self, createNewRepoObj=True):
+        return RepoEditor.run(self, createNewRepoObj)
 
-        dialog.destroy()
+class TaskWindow(InstallWindow):
+    def getNext(self):
+        if self.xml.get_widget("customRadio").get_active():
+            self.dispatch.skipStep("group-selection", skip = 0)
+        else:
+            self.dispatch.skipStep("group-selection", skip = 1)
+
+        tasks = self.xml.get_widget("taskList").get_model()
+        for (cb, task, grps) in tasks:
+            if cb:
+                map(self.backend.selectGroup, grps)
+            else:
+                map(self.backend.deselectGroup, grps)
+
+        if self.anaconda.id.instClass.allowExtraRepos:
+            repos = self.xml.get_widget("repoList").get_model()
+            for (cb, reponame, repo) in repos:
+                if cb:
+                    repo.enable()
+
+                    # Setup any repositories that were in the installclass's
+                    # default list.
+                    _setupRepo(self.anaconda, repo)
+                else:
+                    repo.disable()
+
+    def groupsInstalled(self, lst):
+        # FIXME: yum specific
+        rc = False
+        for gid in lst:
+            g = self.backend.ayum.comps.return_group(gid)
+            if g and not g.selected:
+                return False
+            elif g:
+                rc = True
         return rc
 
-    def _radioChanged(self, *args):
-        baseurlButton = self.dxml.get_widget("baseurlButton")
-        baseurlEntry = self.dxml.get_widget("baseurlEntry")
-        mirrorlistEntry = self.dxml.get_widget("mirrorlistEntry")
+    def groupsExist(self, lst):
+        # FIXME: yum specific
+        for gid in lst:
+            g = self.backend.ayum.comps.return_group(gid)
+            if not g:
+                return False
+        return True
 
-        active = baseurlButton.get_active()
-        baseurlEntry.set_sensitive(active)
-        mirrorlistEntry.set_sensitive(not active)
+    def _editRepo(self, *args):
+        repo = None
 
-    def _proxyToggled(self, *args):
-        table = self.dxml.get_widget("proxyTable")
-        checkbox = self.dxml.get_widget("proxyCheckbox")
-        table.set_sensitive(checkbox.get_active())
+        if not network.hasActiveNetDev():
+            net = NetworkConfigurator(self.anaconda.id.network)
+            ret = net.run()
+            net.destroy()
+            if ret == gtk.RESPONSE_CANCEL:
+                return gtk.RESPONSE_CANCEL
+
+        # If we were passed an extra argument, it's the repo store and we
+        # are editing an existing repo as opposed to adding a new one.
+        if len(args) > 1:
+            (model, iter) = args[1].get_selection().get_selected()
+            if iter:
+                repo = model.get_value(iter, 2)
+            else:
+                return
+        else:
+            return
+
+        dialog = RepoEditor(self.anaconda, repo)
+        dialog.createDialog()
+        dialog.run()
+
+    def _addRepo(self, *args):
+        if not network.hasActiveNetDev():
+            net = NetworkConfigurator(self.anaconda.id.network)
+            ret = net.run()
+            net.destroy()
+            if ret == gtk.RESPONSE_CANCEL:
+                return gtk.RESPONSE_CANCEL
+
+        dialog = RepoCreator(self.anaconda)
+        dialog.createDialog()
+        if dialog.run() == gtk.RESPONSE_CANCEL:
+            return gtk.RESPONSE_CANCEL
+
+        s = self.xml.get_widget("repoList").get_model()
+        s.append([dialog.repo.isEnabled(), dialog.repo.name, dialog.repo])
 
     def _taskToggled(self, button, row, store):
         i = store.get_iter(int(row))
@@ -381,7 +403,7 @@ class TaskWindow(InstallWindow):
             txt = lbl.get_text()
             lbl.set_text(txt %(productName,))
 
-	custom = not self.dispatch.stepInSkipList("group-selection")
+        custom = not self.dispatch.stepInSkipList("group-selection")
         if custom:
             self.xml.get_widget("customRadio").set_active(True)
         else:
@@ -398,6 +420,6 @@ class TaskWindow(InstallWindow):
             vbox.remove(self.xml.get_widget("addRepoBox"))
 
         self.xml.get_widget("addRepoButton").connect("clicked", self._addRepo)
-        self.xml.get_widget("editRepoButton").connect("clicked", self._addRepo, self.rs)
+        self.xml.get_widget("editRepoButton").connect("clicked", self._editRepo, self.rs)
 
         return vbox
-- 
1.5.3.7

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux