[Freeipa-devel] [PATCH] refactor for better group member rendering

Kevin McCarthy kmccarth at redhat.com
Fri Sep 28 15:58:48 UTC 2007


This patch improves the group member rendering code, so group members
and be displayed differently from user members.

Depends on the patches:
freeipa-221-groupedit_use_dns.patch
freeipa-222-nestedgroups.patch
freeipa-224-missing_filters.patch

-Kevin


-------------- next part --------------
# HG changeset patch
# User Kevin McCarthy <kmccarth at redhat.com>
# Date 1190994790 25200
# Node ID a62a925a724305aa6094df2e0b1d729be569c53d
# Parent  0f0476cde60827fb776278f987ff7c33d5b2a304
Refactoring to allow better member rendering.
Created a MemberDisplayInfo to hold the info needed to render a member.
Changed round trip persistance to use that class.
Created a single renderMemberInfo method to render the members.
Changed dynamic as well as static lists to use renderMemberInfo.
Lastly, render groups members in italics.
Change view group to render group members in italics.

diff -r 0f0476cde608 -r a62a925a7243 ipa-server/ipa-gui/ipagui/forms/group.py
--- a/ipa-server/ipa-gui/ipagui/forms/group.py	Thu Sep 27 16:07:05 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/forms/group.py	Fri Sep 28 08:53:10 2007 -0700
@@ -11,7 +11,7 @@ class GroupFields():
 
     group_orig = widgets.HiddenField(name="group_orig")
     member_data = widgets.HiddenField(name="member_data")
-    dn_to_cn_json = widgets.HiddenField(name="dn_to_cn_json")
+    dn_to_info_json = widgets.HiddenField(name="dn_to_info_json")
 
 class GroupNewValidator(validators.Schema):
     cn = validators.String(not_empty=True)
@@ -48,7 +48,7 @@ class GroupEditForm(widgets.Form):
     fields = [GroupFields.gidnumber, GroupFields.description,
               GroupFields.cn_hidden, GroupFields.editprotected_hidden,
               GroupFields.group_orig, GroupFields.member_data,
-              GroupFields.dn_to_cn_json]
+              GroupFields.dn_to_info_json]
 
     validator = GroupEditValidator()
 
diff -r 0f0476cde608 -r a62a925a7243 ipa-server/ipa-gui/ipagui/templates/groupeditform.kid
--- a/ipa-server/ipa-gui/ipagui/templates/groupeditform.kid	Thu Sep 27 16:07:05 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/groupeditform.kid	Fri Sep 28 08:53:10 2007 -0700
@@ -11,9 +11,21 @@ from ipagui.helpers import ipahelper
   <?python searchurl = tg.url('/groupedit_search') ?>
 
   <script type="text/javascript">
+
+    // Stored as the values in the dn_to_info_hash
+    MemberDisplayInfo = Class.create();
+    MemberDisplayInfo.prototype = {
+      initialize: function(name, descr, type) {
+        this.name = name;
+        this.descr = descr;
+        this.type = type;
+      },
+    };
+
+
     // this is used for round-trip recontruction of the names.
     // the hidden fields only contain dns.
-    var dn_to_cn_hash = new Hash();
+    var dn_to_info_hash = new Hash();
 
     // used to filter search results.
     // records dns already in the group
@@ -41,14 +53,33 @@ from ipagui.helpers import ipahelper
     }
 
     /*
+     * Renders the information about the member into the passed in
+     * element.  This is used by addmember and removemember to
+     * consistently create the dom for the member information
+     * (name, descr) and add icons/font changes correct for each type.
+     */
+    function renderMemberInfo(newdiv, info) {
+      if (info.type == "user") {
+        newdiv.appendChild(document.createTextNode(
+          info.name.escapeHTML() + " " + info.descr.escapeHTML() + " "));
+      } else if (info.type == "group") {
+        ital = document.createElement('i');
+        ital.appendChild(document.createTextNode(
+          info.name.escapeHTML() + " " + 
+          info.descr.escapeHTML() + " "));
+        newdiv.appendChild(ital);
+      }
+    }
+
+    /*
      * Callback used for afterFinish in scriptaculous effect
      */
     function removeElement(effect) {
       Element.remove(effect.element);
     }
 
-    function addmember(dn, cn) {
-      dn_to_cn_hash[dn] = cn;
+    function addmember(dn, info) {
+      dn_to_info_hash[dn] = info;
 
       if ((added_hash[dn] == 1) || (member_hash[dn] == 1)) {
         return null;
@@ -56,8 +87,7 @@ from ipagui.helpers import ipahelper
       added_hash[dn] = 1;
 
       var newdiv = document.createElement('div');
-      newdiv.appendChild(document.createTextNode(
-        cn.escapeHTML() + " "));
+      renderMemberInfo(newdiv, info);
 
       var undolink = document.createElement('a');
       undolink.setAttribute('href', '');
@@ -80,8 +110,8 @@ from ipagui.helpers import ipahelper
       return newdiv
     }
 
-    function addmemberHandler(element, dn, cn) {
-      var newdiv = addmember(dn, cn)
+    function addmemberHandler(element, dn, info) {
+      var newdiv = addmember(dn, info)
       if (newdiv != null) {
         new Effect.Fade(Element.up(element));
         new Effect.Appear(newdiv);
@@ -89,12 +119,11 @@ from ipagui.helpers import ipahelper
       }
     }
 
-    function removemember(dn, cn) {
-      dn_to_cn_hash[dn] = cn;
+    function removemember(dn, info) {
+      dn_to_info_hash[dn] = info;
 
       var newdiv = document.createElement('div');
-      newdiv.appendChild(document.createTextNode(
-        cn.escapeHTML() + " "));
+      renderMemberInfo(newdiv, info);
 
       orig_div_id = dn_to_member_div_id[dn];
       var undolink = document.createElement('a');
@@ -118,8 +147,8 @@ from ipagui.helpers import ipahelper
       return newdiv
     }
 
-    function removememberHandler(element, dn, cn) {
-      var newdiv = removemember(dn, cn);
+    function removememberHandler(element, dn, info) {
+      var newdiv = removemember(dn, info);
       new Effect.Fade(Element.up(element));
       new Effect.Appear(newdiv);
       /* Element.up(element).remove(); */
@@ -151,8 +180,8 @@ from ipagui.helpers import ipahelper
     }
 
     function preSubmit() {
-      var json = dn_to_cn_hash.toJSON();
-      $('form_dn_to_cn_json').value = json;
+      var json = dn_to_info_hash.toJSON();
+      $('form_dn_to_info_json').value = json;
       return true;
     }
   </script>
@@ -225,16 +254,30 @@ from ipagui.helpers import ipahelper
 
           member_uid = member.get('uid')
           if member_uid:
-              member_cn = "%s %s (%s)" % (member.get('givenName'),
-                                          member.get('sn'),
-                                          member.get('uid'))
+              member_name = "%s %s" % (member.get('givenName'),
+                                     member.get('sn'))
+              member_descr = "(%s)" % member.get('uid')
+              member_type = "user"
           else:
-              member_cn = "%s [group]" % member.get('cn')
-          member_cn_esc = ipahelper.javascript_string_escape(member_cn)
+              member_name = member.get('cn')
+              member_descr = "[group]"
+              member_type = "group"
+          member_name_esc = ipahelper.javascript_string_escape(member_name)
+          member_descr_esc = ipahelper.javascript_string_escape(member_descr)
+          member_type_esc = ipahelper.javascript_string_escape(member_type)
           ?>
-          ${member_cn}
+          <span id="member-info-${div_counter}"></span>
+          <script type="text/javascript">
+            renderMemberInfo($('member-info-${div_counter}'),
+                         new MemberDisplayInfo('${member_name_esc}',
+                                               '${member_descr_esc}',
+                                               '${member_type_esc}'));
+          </script>
           <a href="#" 
-            onclick="removememberHandler(this, '${member_dn_esc}', '${member_cn_esc}');
+            onclick="removememberHandler(this, '${member_dn_esc}',
+                         new MemberDisplayInfo('${member_name_esc}',
+                                               '${member_descr_esc}',
+                                               '${member_type_esc}'));
                      return false;"
           >remove</a>
           <script type="text/javascript">
@@ -295,8 +338,8 @@ from ipagui.helpers import ipahelper
      * This section restores the contents of the add and remove lists
      * dynamically if we have to refresh the page
      */
-    if ($('form_dn_to_cn_json').value != "") {
-      dn_to_cn_hash = new Hash($('form_dn_to_cn_json').value.evalJSON());
+    if ($('form_dn_to_info_json').value != "") {
+      dn_to_info_hash = new Hash($('form_dn_to_info_json').value.evalJSON());
     }
 
     if ($('form_editprotected').value != "") {
@@ -320,8 +363,8 @@ from ipagui.helpers import ipahelper
     dnadd_esc = ipahelper.javascript_string_escape(dnadd)
     ?>
     var dn = "${dnadd_esc}";
-    var cn = dn_to_cn_hash[dn];
-    var newdiv = addmember(dn, cn);
+    var info = dn_to_info_hash[dn];
+    var newdiv = addmember(dn, info);
     if (newdiv != null) {
       newdiv.style.display = 'block';
     }
@@ -332,8 +375,8 @@ from ipagui.helpers import ipahelper
     dndel_esc = ipahelper.javascript_string_escape(dndel)
     ?>
     var dn = "${dndel_esc}";
-    var cn = dn_to_cn_hash[dn];
-    var newdiv = removemember(dn, cn);
+    var info = dn_to_info_hash[dn];
+    var newdiv = removemember(dn, info);
     newdiv.style.display = 'block';
     orig_div_id = dn_to_member_div_id[dn]
     $(orig_div_id).style.display = 'none';
diff -r 0f0476cde608 -r a62a925a7243 ipa-server/ipa-gui/ipagui/templates/groupeditsearch.kid
--- a/ipa-server/ipa-gui/ipagui/templates/groupeditsearch.kid	Thu Sep 27 16:07:05 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/groupeditsearch.kid	Fri Sep 28 08:53:10 2007 -0700
@@ -20,11 +20,18 @@ from ipagui.helpers import ipahelper
             ent_dn_esc = ipahelper.javascript_string_escape(entity.dn)
             ent_uid = entity.uid
             if ent_uid:
-                ent_cn = "%s %s (%s)" % (entity.givenName, entity.sn, entity.uid)
+                ent_name = "%s %s" % (entity.givenName, entity.sn)
+                ent_descr = "(%s)" % entity.uid
+                ent_type = "user"
             else:
-                ent_cn = "%s [group]" % entity.cn
-            ent_cn_esc = ipahelper.javascript_string_escape(ent_cn)
+                ent_name = entity.cn
+                ent_descr = "[group]"
+                ent_type = "group"
+            ent_name_esc = ipahelper.javascript_string_escape(ent_name)
+            ent_descr_esc = ipahelper.javascript_string_escape(ent_descr)
+            ent_type_esc = ipahelper.javascript_string_escape(ent_type)
             ?>
+            <span id="search-info-${search_div_counter}"></span>
             <script type="text/javascript">
               if ((added_hash["${ent_dn_esc}"] == 1) ||
                   (member_hash["${ent_dn_esc}"] == 1)) {
@@ -32,10 +39,17 @@ from ipagui.helpers import ipahelper
               } else {
                 results_counter = results_counter + 1;
               }
+
+              renderMemberInfo($('search-info-${search_div_counter}'),
+                           new MemberDisplayInfo('${ent_name_esc}',
+                                                 '${ent_descr_esc}',
+                                                 '${ent_type_esc}'));
             </script>
-            ${ent_cn}
             <a href=""
-              onclick="addmemberHandler(this, '${ent_dn_esc}', '${ent_cn_esc}');
+              onclick="addmemberHandler(this, '${ent_dn_esc}',
+                           new MemberDisplayInfo('${ent_name_esc}',
+                                                 '${ent_descr_esc}',
+                                                 '${ent_type_esc}'));
                       return false;"
             >add</a>
             <?python
diff -r 0f0476cde608 -r a62a925a7243 ipa-server/ipa-gui/ipagui/templates/groupshow.kid
--- a/ipa-server/ipa-gui/ipagui/templates/groupshow.kid	Thu Sep 27 16:07:05 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/groupshow.kid	Fri Sep 28 08:53:10 2007 -0700
@@ -40,14 +40,24 @@
       if member_uid:
           member_cn = "%s %s" % (member.get('givenName'), member.get('sn'))
           member_desc = "(%s)" % member_uid
+          member_type = "user"
           view_url = tg.url('usershow', uid=member_uid)
       else:
           member_cn = "%s" % member.get('cn')
           member_desc = "[group]"
+          member_type = "group"
           view_url = tg.url('groupshow', cn=member_cn)
       ?>
-      <a href="${view_url}"
-        >${member_cn}</a> ${member_desc}
+      <span py:if='member_type == "user"'>
+        <a href="${view_url}"
+          >${member_cn}</a> ${member_desc}
+      </span>
+      <span py:if='member_type == "group"'>
+        <i>
+          <a href="${view_url}"
+            >${member_cn}</a> ${member_desc}
+        </i>
+      </span>
     </div>
 
     <br/>
-------------- 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/20070928/fe86b794/attachment.bin>


More information about the Freeipa-devel mailing list