From 10cbfe87876f536a51f3420945429cd82b7716b6 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Fri, 10 Aug 2007 16:31:59 -0700 Subject: Split userform into edit and new forms. (They will likely diverge so no sense forcing them together). Add css for required fields. Add "_orig" hidden fields to the edit form in prep for sending only modified fields. --- ipa-server/ipa-gui/ipagui/controllers.py | 43 ++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 19 deletions(-) (limited to 'ipa-server/ipa-gui/ipagui/controllers.py') diff --git a/ipa-server/ipa-gui/ipagui/controllers.py b/ipa-server/ipa-gui/ipagui/controllers.py index 361a5cbd..ec4b8719 100644 --- a/ipa-server/ipa-gui/ipagui/controllers.py +++ b/ipa-server/ipa-gui/ipagui/controllers.py @@ -7,7 +7,6 @@ from turbogears import error_handler # from model import * # import logging # log = logging.getLogger("ipagui.controllers") -# import ipa.rpcclient import ipa.config import ipa.ipaclient import ipa.user @@ -15,7 +14,8 @@ import xmlrpclib import forms.user ipa.config.init_config() -user_form = forms.user.UserFormWidget() +user_new_form = forms.user.UserNewForm() +user_edit_form = forms.user.UserEditForm() client = ipa.ipaclient.IPAClient(True) client.set_principal("test@FREEIPA.ORG") @@ -32,8 +32,12 @@ def user_to_hash(user): 'sn' : user.getValue('sn'), 'mail' : user.getValue('mail'), 'telephoneNumber': user.getValue('telephoneNumber'), - 'uidNumber': user.getValue('uidNumber'), - 'gidNumber': user.getValue('gidNumber'), + 'uidNumber' : user.getValue('uidNumber'), + 'gidNumber' : user.getValue('gidNumber'), + 'givenName_orig' : user.getValue('givenName'), + 'sn_orig' : user.getValue('sn'), + 'mail_orig' : user.getValue('mail'), + 'telephoneNumber_orig': user.getValue('telephoneNumber'), } class Root(controllers.RootController): @@ -53,7 +57,7 @@ class Root(controllers.RootController): if tg_errors: turbogears.flash("There was a problem with the form!") - return dict(form=user_form) + return dict(form=user_new_form) @expose() def usercreate(self, **kw): @@ -63,12 +67,11 @@ class Root(controllers.RootController): turbogears.flash("Add user cancelled") raise turbogears.redirect('/userlist') - tg_errors, kw = self.uservalidate(**kw) + tg_errors, kw = self.usercreatevalidate(**kw) if tg_errors: - return dict(form=user_form, tg_template='ipagui.templates.usernew') + return dict(form=user_new_form, tg_template='ipagui.templates.usernew') try: - # rv = ipa.rpcclient.add_user(kw) newuser = ipa.user.User(None) newuser.setValue('uid', kw['uid']) newuser.setValue('givenName', kw['givenName']) @@ -87,7 +90,7 @@ class Root(controllers.RootController): raise turbogears.redirect('/usershow', uid=kw['uid']) except xmlrpclib.Fault, f: turbogears.flash("User add failed: " + str(f.faultString)) - return dict(form=user_form, tg_template='ipagui.templates.usernew') + return dict(form=user_new_form, tg_template='ipagui.templates.usernew') @expose("ipagui.templates.useredit") @@ -96,9 +99,8 @@ class Root(controllers.RootController): if tg_errors: turbogears.flash("There was a problem with the form!") - # user = ipa.rpcclient.get_user(uid) user = client.get_user(uid) - return dict(form=user_form, user=user_to_hash(user)) + return dict(form=user_edit_form, user=user_to_hash(user)) @expose() def userupdate(self, **kw): @@ -108,24 +110,24 @@ class Root(controllers.RootController): turbogears.flash("Edit user cancelled") raise turbogears.redirect('/usershow', uid=kw.get('uid')) - tg_errors, kw = self.uservalidate(**kw) + tg_errors, kw = self.userupdatevalidate(**kw) if tg_errors: - return dict(form=user_form, user={}, tg_template='ipagui.templates.useredit') + return dict(form=user_edit_form, user=kw, + tg_template='ipagui.templates.useredit') try: - # rv = ipa.rpcclient.add_user(kw) turbogears.flash("%s updated!" % kw['uid']) raise turbogears.redirect('/usershow', uid=kw['uid']) except xmlrpclib.Fault, f: turbogears.flash("User add failed: " + str(f.faultString)) - return dict(form=user_form, user={}, tg_template='ipagui.templates.useredit') + return dict(form=user_edit_form, user=kw, + tg_template='ipagui.templates.useredit') @expose("ipagui.templates.userlist") @paginate('users', limit=3, allow_limit_override=True) def userlist(self): """Retrieve a list of all users and display them in one huge list""" - # users = ipa.rpcclient.get_all_users() users = client.get_all_users() return dict(users=users) @@ -134,15 +136,18 @@ class Root(controllers.RootController): def usershow(self, uid): """Retrieve a single user for display""" try: - # user = ipa.rpcclient.get_user(uid) user = client.get_user(uid) return dict(user=user_to_hash(user)) except xmlrpclib.Fault, f: turbogears.flash("User show failed: " + str(f.faultString)) raise turbogears.redirect("/") - @validate(form=user_form) - def uservalidate(self, tg_errors=None, **kw): + @validate(form=user_new_form) + def usercreatevalidate(self, tg_errors=None, **kw): + return tg_errors, kw + + @validate(form=user_edit_form) + def userupdatevalidate(self, tg_errors=None, **kw): return tg_errors, kw @expose() -- cgit From 2ef4792fd12efc84237e005add0ed0081425d599 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Tue, 14 Aug 2007 09:40:13 -0700 Subject: - Add password generator method to controller. This uses the random.SystemRandom() method to generate an 8-digit alphanumeric password. - Add ajax call to usernew and useredit forms to generate a new password - Add the prototype javascript library: http://www.prototypejs.org/ prototype is distributed with the MIT license. - Add a checkbox to toggle editing (and displaying) the password. - Change usershow template to use same field labels as the edit and new forms. --- ipa-server/ipa-gui/ipagui/controllers.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'ipa-server/ipa-gui/ipagui/controllers.py') diff --git a/ipa-server/ipa-gui/ipagui/controllers.py b/ipa-server/ipa-gui/ipagui/controllers.py index ec4b8719..acf1bd37 100644 --- a/ipa-server/ipa-gui/ipagui/controllers.py +++ b/ipa-server/ipa-gui/ipagui/controllers.py @@ -1,3 +1,4 @@ +import random import cherrypy import turbogears from turbogears import controllers, expose, flash @@ -17,6 +18,8 @@ ipa.config.init_config() user_new_form = forms.user.UserNewForm() user_edit_form = forms.user.UserEditForm() +password_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + client = ipa.ipaclient.IPAClient(True) client.set_principal("test@FREEIPA.ORG") @@ -137,7 +140,7 @@ class Root(controllers.RootController): """Retrieve a single user for display""" try: user = client.get_user(uid) - return dict(user=user_to_hash(user)) + return dict(user=user_to_hash(user), fields=forms.user.UserFields()) except xmlrpclib.Fault, f: turbogears.flash("User show failed: " + str(f.faultString)) raise turbogears.redirect("/") @@ -154,6 +157,16 @@ class Root(controllers.RootController): def userindex(self): raise turbogears.redirect("/userlist") + @expose() + def generate_password(self): + password = "" + generator = random.SystemRandom() + for char in range(8): + index = generator.randint(0, len(password_chars) - 1) + password += password_chars[index] + + return password + ######### # Group # -- cgit From 0ddf0699a5dd47c575a7e757f38819c8c74340f9 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Thu, 16 Aug 2007 15:05:36 -0700 Subject: Add update user to gui. Fix fields to be lowercase in web gui (server now returns them lowercase). Fix ipaclient.py to refer to lowercase fields when adding a user. Fix user.getValue() to check isinstance(value,list) instead of value[0]. --- ipa-server/ipa-gui/ipagui/controllers.py | 82 ++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 31 deletions(-) (limited to 'ipa-server/ipa-gui/ipagui/controllers.py') diff --git a/ipa-server/ipa-gui/ipagui/controllers.py b/ipa-server/ipa-gui/ipagui/controllers.py index acf1bd37..dd2ecffb 100644 --- a/ipa-server/ipa-gui/ipagui/controllers.py +++ b/ipa-server/ipa-gui/ipagui/controllers.py @@ -1,4 +1,7 @@ import random +from pickle import dumps, loads +from base64 import b64encode, b64decode + import cherrypy import turbogears from turbogears import controllers, expose, flash @@ -8,6 +11,7 @@ from turbogears import error_handler # from model import * # import logging # log = logging.getLogger("ipagui.controllers") + import ipa.config import ipa.ipaclient import ipa.user @@ -28,20 +32,26 @@ def restrict_post(): turbogears.flash("This method only accepts posts") raise turbogears.redirect("/") -def user_to_hash(user): - return { - 'uid' : user.getValue('uid'), - 'givenName' : user.getValue('givenName'), - 'sn' : user.getValue('sn'), - 'mail' : user.getValue('mail'), - 'telephoneNumber': user.getValue('telephoneNumber'), - 'uidNumber' : user.getValue('uidNumber'), - 'gidNumber' : user.getValue('gidNumber'), - 'givenName_orig' : user.getValue('givenName'), - 'sn_orig' : user.getValue('sn'), - 'mail_orig' : user.getValue('mail'), - 'telephoneNumber_orig': user.getValue('telephoneNumber'), - } +def to_ldap_hash(orig): + """LDAP hashes expect all values to be a list. This method converts single + entries to a list.""" + new={} + for (k,v) in orig.iteritems(): + if v == None: + continue + if not isinstance(v, list) and k != 'dn': + v = [v] + new[k] = v + + return new + +def set_ldap_value(hash, key, value): + """Converts unicode strings to normal strings + (because LDAP is choking on unicode strings""" + if value != None: + value = str(value) + hash[key] = value + class Root(controllers.RootController): @@ -75,20 +85,14 @@ class Root(controllers.RootController): return dict(form=user_new_form, tg_template='ipagui.templates.usernew') try: - newuser = ipa.user.User(None) - newuser.setValue('uid', kw['uid']) - newuser.setValue('givenName', kw['givenName']) - newuser.setValue('sn', kw['sn']) - newuser.setValue('mail', kw['mail']) - newuser.setValue('telephoneNumber', kw['telephoneNumber']) - newuser2 = { - 'uid' : kw['uid'], - 'givenName' : kw['givenName'], - 'sn' : kw['sn'], - 'mail' : kw['mail'], - 'telephoneNumber': kw['telephoneNumber'] - } - rv = client.add_user(newuser2) + new_user = {} + set_ldap_value(new_user, 'uid', kw.get('uid')) + set_ldap_value(new_user, 'givenname', kw.get('givenname')) + set_ldap_value(new_user, 'sn', kw.get('sn')) + set_ldap_value(new_user, 'mail', kw.get('mail')) + set_ldap_value(new_user, 'telephonenumber', kw.get('telephonenumber')) + + rv = client.add_user(new_user) turbogears.flash("%s added!" % kw['uid']) raise turbogears.redirect('/usershow', uid=kw['uid']) except xmlrpclib.Fault, f: @@ -103,7 +107,11 @@ class Root(controllers.RootController): turbogears.flash("There was a problem with the form!") user = client.get_user(uid) - return dict(form=user_edit_form, user=user_to_hash(user)) + user_hash = user.toDict() + # store a copy of the original user for the update later + user_data = b64encode(dumps(user_hash)) + user_hash['user_orig'] = user_data + return dict(form=user_edit_form, user=user_hash) @expose() def userupdate(self, **kw): @@ -119,10 +127,22 @@ class Root(controllers.RootController): tg_template='ipagui.templates.useredit') try: + orig_user = loads(b64decode(kw.get('user_orig'))) + + new_user = dict(orig_user) + set_ldap_value(new_user, 'givenname', kw.get('givenname')) + set_ldap_value(new_user, 'sn', kw.get('sn')) + set_ldap_value(new_user, 'mail', kw.get('mail')) + set_ldap_value(new_user, 'telephonenumber', kw.get('telephonenumber')) + + orig_user = to_ldap_hash(orig_user) + new_user = to_ldap_hash(new_user) + + rv = client.update_user(orig_user, new_user) turbogears.flash("%s updated!" % kw['uid']) raise turbogears.redirect('/usershow', uid=kw['uid']) except xmlrpclib.Fault, f: - turbogears.flash("User add failed: " + str(f.faultString)) + turbogears.flash("User update failed: " + str(f.faultString)) return dict(form=user_edit_form, user=kw, tg_template='ipagui.templates.useredit') @@ -140,7 +160,7 @@ class Root(controllers.RootController): """Retrieve a single user for display""" try: user = client.get_user(uid) - return dict(user=user_to_hash(user), fields=forms.user.UserFields()) + return dict(user=user.toDict(), fields=forms.user.UserFields()) except xmlrpclib.Fault, f: turbogears.flash("User show failed: " + str(f.faultString)) raise turbogears.redirect("/") -- cgit