[Freeipa-devel] [PATCH] new user group management

Kevin McCarthy kmccarth at redhat.com
Mon Oct 1 18:24:49 UTC 2007


This patch adds the group management code to the new user screen.

-Kevin

-------------- next part --------------
# HG changeset patch
# User Kevin McCarthy <kmccarth at redhat.com>
# Date 1191263182 25200
# Node ID 23d9775392a14cb7dc860675deaec6889431b28d
# Parent  0a3bb27f723b0d70253613460b0d266aa1acb36a
Allow group selection on the create user page.

diff -r 0a3bb27f723b -r 23d9775392a1 ipa-server/ipa-gui/ipagui/controllers.py
--- a/ipa-server/ipa-gui/ipagui/controllers.py	Fri Sep 28 16:01:42 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/controllers.py	Mon Oct 01 11:26:22 2007 -0700
@@ -116,7 +116,7 @@ class Root(controllers.RootController):
         if tg_errors:
             turbogears.flash("There was a problem with the form!")
 
-        return dict(form=user_new_form)
+        return dict(form=user_new_form, user={})
 
     @expose()
     @identity.require(identity.not_anonymous())
@@ -130,8 +130,12 @@ class Root(controllers.RootController):
 
         tg_errors, kw = self.usercreatevalidate(**kw)
         if tg_errors:
-            return dict(form=user_new_form, tg_template='ipagui.templates.usernew')
-
+            return dict(form=user_new_form, user=kw,
+                    tg_template='ipagui.templates.usernew')
+
+        #
+        # Update the user itself
+        #
         try:
             new_user = ipa.user.User()
             new_user.setValue('uid', kw.get('uid'))
@@ -143,15 +147,67 @@ class Root(controllers.RootController):
                 new_user.setValue('nsAccountLock', 'true')
 
             rv = client.add_user(new_user)
-            turbogears.flash("%s added!" % kw['uid'])
-            raise turbogears.redirect('/usershow', uid=kw['uid'])
         except ipaerror.exception_for(ipaerror.LDAP_DUPLICATE):
             turbogears.flash("Person with login '%s' already exists" %
                     kw.get('uid'))
-            return dict(form=user_new_form, tg_template='ipagui.templates.usernew')
+            return dict(form=user_new_form, user=kw,
+                    tg_template='ipagui.templates.usernew')
         except ipaerror.IPAError, e:
             turbogears.flash("User add failed: " + str(e))
-            return dict(form=user_new_form, tg_template='ipagui.templates.usernew')
+            return dict(form=user_new_form, user=kw,
+                    tg_template='ipagui.templates.usernew')
+
+        #
+        # NOTE: from here on, the user account now exists.
+        #       on any error, we redirect to the _edit_ user page.
+        #       this code does data setup, similar to useredit()
+        #
+        user = client.get_user_by_uid(kw['uid'], user_fields)
+        user_dict = user.toDict()
+
+        user_groups_dicts = []
+        user_groups_data = b64encode(dumps(user_groups_dicts))
+
+        # store a copy of the original user for the update later
+        user_data = b64encode(dumps(user_dict))
+        user_dict['user_orig'] = user_data
+        user_dict['user_groups_data'] = user_groups_data
+
+        # preserve group add info in case of errors
+        user_dict['dnadd'] = kw.get('dnadd')
+        user_dict['dn_to_info_json'] = kw.get('dn_to_info_json')
+
+        #
+        # Password change
+        # TODO
+        #
+
+        #
+        # Add groups
+        #
+        failed_adds = []
+        try:
+            dnadds = kw.get('dnadd')
+            if dnadds != None:
+                if not(isinstance(dnadds,list) or isinstance(dnadds,tuple)):
+                    dnadds = [dnadds]
+                failed_adds = client.add_groups_to_user(
+                        utf8_encode_values(dnadds), user.dn)
+                kw['dnadd'] = failed_adds
+        except ipaerror.IPAError, e:
+            failed_adds = dnadds
+
+        if len(failed_adds) > 0:
+            message = "Person successfully updated.<br />"
+            message += "There was an error adding groups.<br />"
+            message += "Failures have been preserved in the add/remove lists."
+            turbogears.flash(message)
+            return dict(form=user_edit_form, user=user_dict,
+                        user_groups=user_groups_dicts,
+                        tg_template='ipagui.templates.useredit')
+
+        turbogears.flash("%s added!" % kw['uid'])
+        raise turbogears.redirect('/usershow', uid=kw['uid'])
 
     @expose("ipagui.templates.dynamiceditsearch")
     @identity.require(identity.not_anonymous())
@@ -227,6 +283,7 @@ class Root(controllers.RootController):
                         tg_template='ipagui.templates.useredit')
 
         password_change = False
+        user_modified = False
 
         #
         # Update the user itself
@@ -262,6 +319,7 @@ class Root(controllers.RootController):
             # need to make sure a subsequent submit doesn't try to update
             # the user again.
             #
+            user_modified = True
             kw['user_orig'] = b64encode(dumps(new_user.toDict()))
         except ipaerror.exception_for(ipaerror.LDAP_EMPTY_MODLIST), e:
             # could be a password change
@@ -299,10 +357,7 @@ class Root(controllers.RootController):
                         utf8_encode_values(dnadds), new_user.dn)
                 kw['dnadd'] = failed_adds
         except ipaerror.IPAError, e:
-            turbogears.flash("Group update failed: " + str(e))
-            return dict(form=user_edit_form, user=kw,
-                        user_groups=user_groups_dicts,
-                        tg_template='ipagui.templates.useredit')
+            failed_adds = dnadds
 
         #
         # Remove groups
@@ -317,14 +372,15 @@ class Root(controllers.RootController):
                         utf8_encode_values(dndels), new_user.dn)
                 kw['dndel'] = failed_dels
         except ipaerror.IPAError, e:
-            turbogears.flash("Group update failed: " + str(e))
-            return dict(form=user_edit_form, user=kw,
-                        user_groups=user_groups_dicts,
-                        tg_template='ipagui.templates.useredit')
+            failed_dels = dndels
 
         if (len(failed_adds) > 0) or (len(failed_dels) > 0):
             message = "There was an error updating groups.<br />"
             message += "Failures have been preserved in the add/remove lists."
+            if user_modified:
+                message = "User Details successfully updated.<br />" + message
+            if password_change:
+                message = "User password successfully updated.<br />" + message
             turbogears.flash(message)
             return dict(form=user_edit_form, user=kw,
                         user_groups=user_groups_dicts,
diff -r 0a3bb27f723b -r 23d9775392a1 ipa-server/ipa-gui/ipagui/forms/user.py
--- a/ipa-server/ipa-gui/ipagui/forms/user.py	Fri Sep 28 16:01:42 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/forms/user.py	Mon Oct 01 11:26:22 2007 -0700
@@ -46,7 +46,9 @@ class UserNewForm(widgets.Form):
     params = ['user']
 
     fields = [UserFields.uid, UserFields.givenname,
-              UserFields.sn, UserFields.mail]
+              UserFields.sn, UserFields.mail,
+              UserFields.dn_to_info_json,
+             ]
 
     validator = UserNewValidator()
 
diff -r 0a3bb27f723b -r 23d9775392a1 ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js
--- a/ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js	Fri Sep 28 16:01:42 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js	Mon Oct 01 11:26:22 2007 -0700
@@ -169,3 +169,18 @@ function preSubmit() {
   $('form_dn_to_info_json').value = json;
   return true;
 }
+
+function enterDoSearch(e) {
+  var keyPressed;
+  if (window.event) {
+    keyPressed = window.event.keyCode;
+  } else {
+    keyPressed = e.which; 
+  }
+
+  if (keyPressed == 13) {
+    return doSearch();
+  } else {
+    return true;
+  }
+}
diff -r 0a3bb27f723b -r 23d9775392a1 ipa-server/ipa-gui/ipagui/templates/groupeditform.kid
--- a/ipa-server/ipa-gui/ipagui/templates/groupeditform.kid	Fri Sep 28 16:01:42 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/groupeditform.kid	Mon Oct 01 11:26:22 2007 -0700
@@ -21,21 +21,6 @@ from ipagui.helpers import ipahelper
       } else {
         gidnumberField.disabled = true;
         $('form_editprotected').value = '';
-      }
-    }
-
-    function enterDoSearch(e) {
-      var keyPressed;
-      if (window.event) {
-        keyPressed = window.event.keyCode;
-      } else {
-        keyPressed = e.which; 
-      }
-
-      if (keyPressed == 13) {
-        return doSearch();
-      } else {
-        return true;
       }
     }
 
diff -r 0a3bb27f723b -r 23d9775392a1 ipa-server/ipa-gui/ipagui/templates/usereditform.kid
--- a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid	Fri Sep 28 16:01:42 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid	Mon Oct 01 11:26:22 2007 -0700
@@ -33,21 +33,6 @@ from ipagui.helpers import ipahelper
       }
     }
 
-    function enterDoSearch(e) {
-      var keyPressed;
-      if (window.event) {
-        keyPressed = window.event.keyCode;
-      } else {
-        keyPressed = e.which; 
-      }
-
-      if (keyPressed == 13) {
-        return doSearch();
-      } else {
-        return true;
-      }
-    }
-
     function doSearch() {
       $('searchresults').update("Searching...");
       new Ajax.Updater('searchresults',
diff -r 0a3bb27f723b -r 23d9775392a1 ipa-server/ipa-gui/ipagui/templates/usernew.kid
--- a/ipa-server/ipa-gui/ipagui/templates/usernew.kid	Fri Sep 28 16:01:42 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/usernew.kid	Mon Oct 01 11:26:22 2007 -0700
@@ -8,6 +8,6 @@
 <body>
     <h2>Add Person</h2>
 
-    ${form.display(action="usercreate")}
+    ${form.display(action="usercreate", value=user)}
 </body>
 </html>
diff -r 0a3bb27f723b -r 23d9775392a1 ipa-server/ipa-gui/ipagui/templates/usernewform.kid
--- a/ipa-server/ipa-gui/ipagui/templates/usernewform.kid	Fri Sep 28 16:01:42 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/usernewform.kid	Mon Oct 01 11:26:22 2007 -0700
@@ -1,6 +1,41 @@
 <div xmlns:py="http://purl.org/kid/ns#"
   class="simpleroster">
-  <form action="${action}" name="${name}" method="${method}" class="tableform">
+  <form action="${action}" name="${name}" method="${method}" class="tableform"
+    onsubmit="preSubmit()">
+
+<?python
+from ipagui.helpers import ipahelper
+?>
+
+  <script type="text/javascript" charset="utf-8"
+    src="${tg.url('/static/javascript/dynamicedit.js')}"></script>
+
+  <?python searchurl = tg.url('/useredit_search') ?>
+
+  <script type="text/javascript">
+    function doSearch() {
+      $('searchresults').update("Searching...");
+      new Ajax.Updater('searchresults',
+          '${searchurl}',
+          {  asynchronous:true,
+             parameters: { criteria: $('criteria').value },
+             evalScripts: true });
+      return false;
+    }
+
+    // override dynamicedit.js version
+    // we don't need to show [group] nor italize groups
+    function renderMemberInfo(newdiv, info) {
+      if (info.type == "group") {
+        newdiv.appendChild(document.createTextNode(
+          info.name.escapeHTML() + " "));
+      }
+    }
+  </script>
+
+  <div py:for="field in hidden_fields"
+    py:replace="field.display(value_for(field), **params_for(field))" 
+    />
 
     <div class="formsection">Identity Details</div>
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
@@ -181,6 +216,28 @@
       </tr>
     </table>
 
+    <div style="clear:both">
+      <div class="formsection">Add Groups</div>
+
+      <div class="floatlist">
+        <div class="floatheader">To Add:</div>
+        <div id="newmembers">
+        </div>
+      </div>
+
+      <div>
+        <div id="search">
+          <input id="criteria" type="text" name="criteria"
+            onkeypress="return enterDoSearch(event);" />
+          <input type="button" value="Find"
+            onclick="return doSearch();"
+          />
+        </div>
+        <div id="searchresults">
+        </div>
+      </div>
+    </div>
+
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
       <tr>
         <th></th>
@@ -192,4 +249,33 @@
     </table>
 
   </form>
+
+  <script type="text/javascript">
+    /*
+     * This section restores the contents of the add and remove lists
+     * dynamically if we have to refresh the page
+     */
+    if ($('form_dn_to_info_json').value != "") {
+      dn_to_info_hash = new Hash($('form_dn_to_info_json').value.evalJSON());
+    }
+  </script>
+
+  <?python
+  dnadds = value.get('dnadd', [])
+  if not(isinstance(dnadds,list) or isinstance(dnadds,tuple)):
+      dnadds = [dnadds]
+  ?>
+
+  <script py:for="dnadd in dnadds">
+    <?python
+    dnadd_esc = ipahelper.javascript_string_escape(dnadd)
+    ?>
+    var dn = "${dnadd_esc}";
+    var info = dn_to_info_hash[dn];
+    var newdiv = addmember(dn, info);
+    if (newdiv != null) {
+      newdiv.style.display = 'block';
+    }
+  </script>
+
 </div>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4054 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/freeipa-devel/attachments/20071001/c42cc1ad/attachment.bin>


More information about the Freeipa-devel mailing list