[PATCH 5/5] Update the API which controls where should spokes be displayed

Martin Sivak msivak at redhat.com
Wed Dec 19 15:09:16 UTC 2012


This patch adds two pieces to Spoke classes:

should_run(environment_id, data)
This method should return True if the spoke is to be displayed
in the environment (currently only "anaconda" and "firstboot"
are supported)

@property configured()
This property should return list of strings that will be
stored to a config file, which will be passed to firstboot and
GIE and will control whether spokes are to be displayed again
or not.
---
 pyanaconda/ui/common.py              | 56 ++++++++++++++++++++++++++++--------
 pyanaconda/ui/gui/hubs/__init__.py   |  4 +++
 pyanaconda/ui/gui/spokes/password.py |  7 ++---
 pyanaconda/ui/tui/hubs/__init__.py   |  4 +++
 4 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/pyanaconda/ui/common.py b/pyanaconda/ui/common.py
index 69d0390..f4e3d21 100644
--- a/pyanaconda/ui/common.py
+++ b/pyanaconda/ui/common.py
@@ -116,25 +116,37 @@ class UIObject(object):
         return self._data
 
 class FirstbootSpokeMixIn(object):
-    """This MixIn class marks Spokes as usable for Firstboot."""
-
+    """This MixIn class marks Spokes as usable for Firstboot
+       and Anaconda.
+    """
     @classmethod
-    def configure_tag(cls):
-        """This method defines textual id (or list of those) that will
-           be written into the after-install customization status
-           file for the firstboot and GIE to know that the spoke was
-           configured in anaconda."""
-        return None
+    def should_run(cls, environment, data):
+        """This method is responsible for beginning Spoke initialization
+           in the firstboot environment (even before __init__).
 
+           It should return True if the spoke is to be shown on the
+           FirstbootHub and False if it should be skipped.
+
+           It might be called multiple times, with or without (None)
+           the data argument.
+        """
+        return environment in ("anaconda", "firstboot")
+
+class FirstbootOnlySpokeMixIn(object):
+    """This MixIn class marks Spokes as usable for Firstboot."""
     @classmethod
-    def firstboot(cls):
+    def should_run(cls, environment, data):
         """This method is responsible for beginning Spoke initialization
            in the firstboot environment (even before __init__).
 
            It should return True if the spoke is to be shown on the
-           FirstbootHub and False if it should be skipped."""
-        return True
-    
+           FirstbootHub and False if it should be skipped.
+
+           It might be called multiple times, with or without (None)
+           the data argument.
+        """
+        return environment in ("firstboot")
+
 class Spoke(UIObject):
     """A Spoke is a single configuration screen.  There are several different
        places where a Spoke can be displayed, each of which will have its own
@@ -197,6 +209,18 @@ class Spoke(UIObject):
         self.instclass = instclass
         self.applyOnSkip = False
 
+    @classmethod
+    def should_run(cls, environment, data):
+        """This method is responsible for beginning Spoke initialization.
+
+           It should return True if the spoke is to be shown while in
+           <environment> and False if it should be skipped.
+
+           It might be called multiple times, with or without (None)
+           the data argument.
+        """
+        return environment in ("anaconda")
+
     def apply(self):
         """Apply the selections made on this Spoke to the object's preset
            data object.  This method must be provided by every subclass.
@@ -204,6 +228,14 @@ class Spoke(UIObject):
         raise NotImplementedError
 
     @property
+    def configured(self):
+        """This method returns a list of textual ids that should
+           be written into the after-install customization status
+           file for the firstboot and GIE to know that the spoke was
+           configured and what value groups were provided."""
+        return ["%s.%s" % (self.__class__.__module__, self.__class__.__name__)]
+
+    @property
     def completed(self):
         """Has this spoke been visited and completed?  If not and the spoke is
            mandatory, a special warning icon will be shown on the Hub beside the
diff --git a/pyanaconda/ui/gui/hubs/__init__.py b/pyanaconda/ui/gui/hubs/__init__.py
index 3975b37..1f5141a 100644
--- a/pyanaconda/ui/gui/hubs/__init__.py
+++ b/pyanaconda/ui/gui/hubs/__init__.py
@@ -147,6 +147,10 @@ class Hub(GUIObject, common.Hub):
 
             selectors = []
             for spokeClass in sorted(cats_and_spokes[c], key=lambda s: s.title):
+                # Check if this spoke is to be shown in anaconda
+                if not spokeClass.should_run("anaconda", self.data):
+                    continue
+    
                 # Create the new spoke and populate its UI with whatever data.
                 # From here on, this Spoke will always exist.
                 spoke = spokeClass(self.data, self.storage, self.payload, self.instclass)
diff --git a/pyanaconda/ui/gui/spokes/password.py b/pyanaconda/ui/gui/spokes/password.py
index 1bd424c..44be1ca 100644
--- a/pyanaconda/ui/gui/spokes/password.py
+++ b/pyanaconda/ui/gui/spokes/password.py
@@ -31,12 +31,13 @@ import string
 
 from pyanaconda.ui.gui.spokes import NormalSpoke
 from pyanaconda.ui.gui.categories.user_settings import UserSettingsCategory
+from pyanaconda.ui.common import FirstbootSpokeMixIn
 #from _isys import isCapsLockEnabled
 
 __all__ = ["PasswordSpoke"]
 
 
-class PasswordSpoke(NormalSpoke):
+class PasswordSpoke(FirstbootSpokeMixIn, NormalSpoke):
     builderObjects = ["passwordWindow"]
 
     mainWidgetName = "passwordWindow"
@@ -47,10 +48,6 @@ class PasswordSpoke(NormalSpoke):
     icon = "dialog-password-symbolic"
     title = N_("ROOT PASSWORD")
 
-    @classmethod
-    def firstboot(cls):
-        return True
-    
     def __init__(self, *args):
         NormalSpoke.__init__(self, *args)
         self._password = None
diff --git a/pyanaconda/ui/tui/hubs/__init__.py b/pyanaconda/ui/tui/hubs/__init__.py
index d669bc7..7d16ff3 100644
--- a/pyanaconda/ui/tui/hubs/__init__.py
+++ b/pyanaconda/ui/tui/hubs/__init__.py
@@ -56,6 +56,10 @@ class TUIHub(TUIObject, common.Hub):
 
             # sort them according to their priority
             for s in sorted(spokes, key = lambda s: s.priority):
+                # Check if this spoke is to be shown in anaconda
+                if not s.should_run("anaconda", self.data):
+                    continue
+                
                 spoke = s(app, data, storage, payload, instclass)
                 spoke.initialize()
 
-- 
1.7.11.7



More information about the anaconda-patches mailing list