On Mon, 2013-02-11 at 14:24 +0100, Martin Sivak wrote:
---
pyanaconda/ui/gui/spokes/advanced_user.glade | 429 +++++++++++++++++++++++++++
pyanaconda/ui/gui/spokes/password.py | 2 +-
pyanaconda/ui/gui/spokes/user.glade | 363 +++++++++++++++++++++++
pyanaconda/ui/gui/spokes/user.py | 421 ++++++++++++++++++++++++++
4 files changed, 1214 insertions(+), 1 deletion(-)
create mode 100644 pyanaconda/ui/gui/spokes/advanced_user.glade
create mode 100644 pyanaconda/ui/gui/spokes/user.glade
create mode 100644 pyanaconda/ui/gui/spokes/user.py
diff --git a/pyanaconda/ui/gui/spokes/user.py
b/pyanaconda/ui/gui/spokes/user.py
new file mode 100644
index 0000000..6655be6
--- /dev/null
+++ b/pyanaconda/ui/gui/spokes/user.py
@@ -0,0 +1,421 @@
+# User creation spoke
+#
+# Copyright (C) 2012 Red Hat, Inc.
^^ 2013 :)
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions of
+# the GNU General Public License v.2, or (at your option) any later version.
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY expressed or implied, including the implied warranties of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details. You should have received a copy of the
+# GNU General Public License along with this program; if not, write to the
+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
+# source code or documentation are not subject to the GNU General Public
+# License and may only be used or replicated with the express permission of
+# Red Hat, Inc.
+#
+# Red Hat Author(s): Martin Sivak <msivak(a)redhat.com>
+#
+
+import gettext
+_ = lambda x: gettext.ldgettext("anaconda", x)
+N_ = lambda x: x
+
+from gi.repository import Gtk
+
+from pyanaconda.users import cryptPassword, validatePassword
+from pwquality import PWQError
+import string
+
+from pyanaconda.ui.gui.spokes import NormalSpoke
+from pyanaconda.ui.gui import GUIObject
+from pyanaconda.ui.gui.categories.user_settings import UserSettingsCategory
+from pyanaconda.ui.common import FirstbootSpokeMixIn
+from pyanaconda.ui.gui.utils import enlightbox
+
+import unicodedata
+import pwquality
+
+__all__ = ["UserSpoke", "AdvancedUserDialog"]
+
+def strip_accents(s):
+ """This function takes arbitrary unicode string
+ and returns it with all the diacritics removed.
+
+ :param s: arbitrary string
+ :type s: unicode
+
+ :return: s with diacritics removed
+ :rtype: unicode
+
+ """
+ return ''.join((c for c in unicodedata.normalize('NFD', s)
+ if unicodedata.category(c) != 'Mn'))
+
+class AdvancedUserDialog(GUIObject):
+ builderObjects = ["advancedUserDialog", "uid", "gid"]
+ mainWidgetName = "advancedUserDialog"
+ uiFile = "advanced_user.glade"
+
+ def __init__(self, user, groupDict, data):
+ GUIObject.__init__(self, data)
+ self._user = user
+ self._groupDict = groupDict
+
+ def initialize(self):
+ pass
+
+ def _checkboxes(self, _editable, data = None):
+ """Update the state of this screen according to the
+ checkbox states on the screen. It is called from
+ the toggled Gtk event.
+ """
I believe this method should have a better
"action-based" name like
"_update_checkboxes_sensitivity" or something like that.
+ c_home =
self.builder.get_object("c_home").get_active()
+ c_uid = self.builder.get_object("c_uid").get_active()
+ c_gid = self.builder.get_object("c_gid").get_active()
+
+ self.builder.get_object("t_home").set_sensitive(c_home)
+ self.builder.get_object("l_home").set_sensitive(c_home)
+ self.builder.get_object("spin_uid").set_sensitive(c_uid)
+ self.builder.get_object("spin_gid").set_sensitive(c_gid)
+
+ def refresh(self):
+ t_home = self.builder.get_object("t_home")
+ if self._user.homedir:
+ t_home.set_text(self._user.homedir)
+ elif self._user.name:
+ t_home.set_text("/home/%s" % self._user.name)
+
+ groups = []
+ for group_name in self._user.groups:
+ group = self._groupDict[group_name]
+
+ if group.name and group.gid is not None:
+ groups.append("%s (%d)" % (group.name, group.gid))
+ elif group.name:
+ groups.append(group.name)
+ elif group.gid is not None:
+ groups.append("(%d)" % (group.gid,))
+
+ self.builder.get_object("t_groups").set_text(",
".join(groups))
+
+ def run(self):
+ self.window.show()
+ rc = self.window.run()
+ self.window.hide()
+
+ #OK clicked
+ if rc == 1:
+ if self.builder.get_object("c_home").get_active():
+ self._user.homedir =
self.builder.get_object("t_home").get_text()
+ else:
+ self._user.homedir = None
+
+ if self.builder.get_object("c_uid").get_active():
+ self._user.uid =
int(self.builder.get_object("uid").get_value())
+ else:
+ self._user.uid = None
+
+ if self.builder.get_object("c_gid").get_active():
+ pass
+ #self._user.gid =
int(self.builder.get_widget("gid").get_value())
+ else:
+ #self._user.gid = None
+ pass
Some leftovers?
+
+ groups =
self.builder.get_object("t_groups").get_text().split(",")
+ self._user.groups = []
+ for group in groups:
+ group = group.strip()
+ if group not in self._groupDict:
+ self._groupDict[group] = self.data.GroupData(name = group)
+ self._user.groups.append(group)
+
+ #Cancel clicked, window destroyed...
+ else:
+ pass
+
+ return rc
+
+
+
+class UserSpoke(FirstbootSpokeMixIn, NormalSpoke):
+ builderObjects = ["userCreationWindow"]
+
+ mainWidgetName = "userCreationWindow"
+ uiFile = "spokes/user.glade"
+
+ category = UserSettingsCategory
+
+ icon = "avatar-default-symbolic"
+ title = N_("_USER CREATION")
+
+ def __init__(self, *args):
+ NormalSpoke.__init__(self, *args)
+ self._oldweak = None
+ self._error = None
+
+ def initialize(self):
+ NormalSpoke.initialize(self)
+ self._user = self.data.UserData()
+ self._wheel = self.data.GroupData(name = "wheel")
+ self._groupDict = {"wheel": self._wheel}
+
+ # place holders for the text boxes
+ self.fullname = self.builder.get_object("t_fullname")
+ self.username = self.builder.get_object("t_username")
+ self.pw = self.builder.get_object("t_password")
+ self.confirm = self.builder.get_object("t_verifypassword")
+ self.admin = self.builder.get_object("c_admin")
+ self.usepassword = self.builder.get_object("c_usepassword")
+
+ self.guesser = {
+ self.username: True
+ }
+
+ self.pw.connect("changed", self._checkPassword)
+ self.confirm.connect("changed", self._checkPassword)
+ self.fullname.connect("changed", self._guessNames)
+ self.username.connect("changed", self._guessNameDisabler)
+ self.usepassword.connect("toggled", self._passwordDisabler)
These should go to the .glade file, if possible.
--
Vratislav Podzimek
Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic