changeset 1012:551c7d5ae89d beta

#56 added users/groups autocomplete for repository editing. added docstring for settings controller
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 09 Feb 2011 03:14:00 +0100
parents 9c3e12bde123
children d2a840b29858
files rhodecode/controllers/admin/repos.py rhodecode/model/settings.py rhodecode/templates/admin/repos/repo_edit.html
diffstat 3 files changed, 160 insertions(+), 93 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos.py	Wed Feb 09 02:15:09 2011 +0100
+++ b/rhodecode/controllers/admin/repos.py	Wed Feb 09 03:14:00 2011 +0100
@@ -162,6 +162,8 @@
                                                 c.repo_last_rev) * 100)
 
             c.users_array = repo_model.get_users_js()
+            c.users_groups_array = repo_model.get_users_groups_js()
+
             errors.value.update({'user':c.repo_info.user.username})
             return htmlfill.render(
                 render('admin/repos/repo_edit.html'),
@@ -300,6 +302,7 @@
             defaults.update({'user':replacement_user})
 
         c.users_array = repo_model.get_users_js()
+        c.users_groups_array = repo_model.get_users_groups_js()
 
         for p in c.repo_info.repo_to_perm:
             defaults.update({'perm_%s' % p.user.username:
--- a/rhodecode/model/settings.py	Wed Feb 09 02:15:09 2011 +0100
+++ b/rhodecode/model/settings.py	Wed Feb 09 03:14:00 2011 +0100
@@ -1,8 +1,15 @@
-#!/usr/bin/env python
-# encoding: utf-8
-# Model for RhodeCode settings
-# Copyright (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
-# 
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.model.settings
+    ~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Settings model for RhodeCode
+
+    :created on Nov 17, 2010
+    :author: marcink
+    :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>    
+    :license: GPLv3, see COPYING for more details.
+"""
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
 # as published by the Free Software Foundation; version 2
@@ -17,18 +24,12 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA  02110-1301, USA.
-"""
-Created on Nov 17, 2010
-Model for RhodeCode
-:author: marcink
-"""
 
-from rhodecode.lib import helpers as h
+import logging
+
 from rhodecode.model import BaseModel
 from rhodecode.model.caching_query import FromCache
 from rhodecode.model.db import  RhodeCodeSettings
-from sqlalchemy.orm import joinedload
-import logging
 
 log = logging.getLogger(__name__)
 
--- a/rhodecode/templates/admin/repos/repo_edit.html	Wed Feb 09 02:15:09 2011 +0100
+++ b/rhodecode/templates/admin/repos/repo_edit.html	Wed Feb 09 03:14:00 2011 +0100
@@ -99,7 +99,7 @@
                             <td>${_('read')}</td>
                             <td>${_('write')}</td>
                             <td>${_('admin')}</td>
-                            <td>${_('user')}</td>
+                            <td>${_('member')}</td>
                             <td></td>
                         </tr>
                         
@@ -141,13 +141,14 @@
                         %endfor
 
                         <tr id="add_perm_input">
-                            <td>${h.radio('perm_new_user','repository.none')}</td>
-                            <td>${h.radio('perm_new_user','repository.read')}</td>
-                            <td>${h.radio('perm_new_user','repository.write')}</td>
-                            <td>${h.radio('perm_new_user','repository.admin')}</td>
+                            <td>${h.radio('perm_new_member','repository.none')}</td>
+                            <td>${h.radio('perm_new_member','repository.read')}</td>
+                            <td>${h.radio('perm_new_member','repository.write')}</td>
+                            <td>${h.radio('perm_new_member','repository.admin')}</td>
                             <td class='ac'>
                                 <div class="perm_ac" id="perm_ac">
-                                    ${h.text('perm_new_user_name',class_='yui-ac-input')}
+                                    ${h.text('perm_new_member_name',class_='yui-ac-input')}
+                                    ${h.hidden('perm_new_member_type')}
                                     <div id="perm_container"></div>
                                 </div>
                             </td>
@@ -156,7 +157,7 @@
                         <tr>
                             <td colspan="6">
                                 <span id="add_perm" class="add_icon" style="cursor: pointer;">
-                                ${_('Add another user')}
+                                ${_('Add another member')}
                                 </span>
                             </td>
                         </tr>
@@ -174,7 +175,7 @@
         <script type="text/javascript">
             YAHOO.util.Event.onDOMReady(function(){
                 var D = YAHOO.util.Dom;
-                if(!D.hasClass('perm_new_user_name','error')){
+                if(!D.hasClass('perm_new_member_name','error')){
                     D.setStyle('add_perm_input','display','none');
                 }
                 YAHOO.util.Event.addListener('add_perm','click',function(){
@@ -186,87 +187,78 @@
         </script>
         <script type="text/javascript">    
         YAHOO.example.FnMultipleFields = function(){
-            var myContacts = ${c.users_array|n}
+        	var myUsers = ${c.users_array|n};
+        	var myGroups = ${c.users_groups_array|n};
             
-            // Define a custom search function for the DataSource
-            var matchNames = function(sQuery) {
+            // Define a custom search function for the DataSource of users
+            var matchUsers = function(sQuery) {
                 // Case insensitive matching
-                var query = sQuery.toLowerCase(),
-                    contact,
-                    i=0,
-                    l=myContacts.length,
-                    matches = [];
+                var query = sQuery.toLowerCase();
+                var i=0;
+                var l=myUsers.length;
+                var matches = [];
                 
                 // Match against each name of each contact
                 for(; i<l; i++) {
-                    contact = myContacts[i];
+                    contact = myUsers[i];
                     if((contact.fname.toLowerCase().indexOf(query) > -1) ||
                         (contact.lname.toLowerCase().indexOf(query) > -1) ||
                         (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
                         matches[matches.length] = contact;
                     }
                 }
-        
                 return matches;
             };
-        
-            // Use a FunctionDataSource
-            var oDS = new YAHOO.util.FunctionDataSource(matchNames);
-            oDS.responseSchema = {
+
+            // Define a custom search function for the DataSource of usersGroups
+            var matchGroups = function(sQuery) {
+                // Case insensitive matching
+                var query = sQuery.toLowerCase();
+                var i=0;
+                var l=myGroups.length;
+                var matches = [];
+                
+                // Match against each name of each contact
+                for(; i<l; i++) {
+                    matched_group = myGroups[i];
+                    if(matched_group.grname.toLowerCase().indexOf(query) > -1) {
+                        matches[matches.length] = matched_group;
+                    }
+                }
+                return matches;
+            };         
+            
+            //match all
+            var matchAll = function(sQuery){
+            	u = matchUsers(sQuery);
+            	g = matchGroups(sQuery);
+            	return u.concat(g);
+            };
+            
+            // DataScheme for members
+            var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
+            memberDS.responseSchema = {
+                fields: ["id", "fname", "lname", "nname", "grname", "grmembers"]
+            };
+
+            // DataScheme for owner
+            var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
+            ownerDS.responseSchema = {
                 fields: ["id", "fname", "lname", "nname"]
-            }
-        
+            };          
+            
             // Instantiate AutoComplete for perms
-            var oAC_perms = new YAHOO.widget.AutoComplete("perm_new_user_name", "perm_container", oDS);
-            oAC_perms.useShadow = false;
-            oAC_perms.resultTypeList = false;
+            var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
+            membersAC.useShadow = false;
+            membersAC.resultTypeList = false;
             
             // Instantiate AutoComplete for owner
-            var oAC_owner = new YAHOO.widget.AutoComplete("user", "owner_container", oDS);
-            oAC_owner.useShadow = false;
-            oAC_owner.resultTypeList = false;
-            
+            var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
+            ownerAC.useShadow = false;
+            ownerAC.resultTypeList = false;
             
-            // Custom formatter to highlight the matching letters
-            var custom_formatter = function(oResultData, sQuery, sResultMatch) {
-                var query = sQuery.toLowerCase(),
-                    fname = oResultData.fname,
-                    lname = oResultData.lname,
-                    nname = oResultData.nname || "", // Guard against null value
-                    query = sQuery.toLowerCase(),
-                    fnameMatchIndex = fname.toLowerCase().indexOf(query),
-                    lnameMatchIndex = lname.toLowerCase().indexOf(query),
-                    nnameMatchIndex = nname.toLowerCase().indexOf(query),
-                    displayfname, displaylname, displaynname;
-                    
-                if(fnameMatchIndex > -1) {
-                    displayfname = highlightMatch(fname, query, fnameMatchIndex);
-                }
-                else {
-                    displayfname = fname;
-                }
-        
-                if(lnameMatchIndex > -1) {
-                    displaylname = highlightMatch(lname, query, lnameMatchIndex);
-                }
-                else {
-                    displaylname = lname;
-                }
-        
-                if(nnameMatchIndex > -1) {
-                    displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
-                }
-                else {
-                    displaynname = nname ? "(" + nname + ")" : "";
-                }
-        
-                return displayfname + " " + displaylname + " " + displaynname;
-                
-            };
-            oAC_perms.formatResult = custom_formatter; 
-            oAC_owner.formatResult = custom_formatter;
-                            
-            // Helper function for the formatter
+
+            // Helper highlight function for the formatter
             var highlightMatch = function(full, snippet, matchindex) {
                 return full.substring(0, matchindex) + 
                         "<span class='match'>" + 
@@ -274,21 +266,92 @@
                         "</span>" +
                         full.substring(matchindex + snippet.length);
             };
-        
+            
+            // Custom formatter to highlight the matching letters
+            var custom_formatter = function(oResultData, sQuery, sResultMatch) {
+            	var query = sQuery.toLowerCase();
+            	
+            	if (oResultData.grname != undefined){
+            		var grname = oResultData.grname;
+            		var grmembers = oResultData.grmembers;
+            		var grnameMatchIndex = grname.toLowerCase().indexOf(query);
+            		var grprefix = "${_('Group')}: ";
+            		var grsuffix = " ("+grmembers+"  ${_('members')})";
+            		
+            		if (grnameMatchIndex > -1){
+            			return grprefix+highlightMatch(grname,query,grnameMatchIndex)+grsuffix;
+            		}
+            		
+            		return grprefix+oResultData.grname+grsuffix;
+            	}
+            	else if(oResultData.fname != undefined){
+	                
+	                var fname = oResultData.fname,
+	                    lname = oResultData.lname,
+	                    nname = oResultData.nname || "", // Guard against null value
+	                    fnameMatchIndex = fname.toLowerCase().indexOf(query),
+	                    lnameMatchIndex = lname.toLowerCase().indexOf(query),
+	                    nnameMatchIndex = nname.toLowerCase().indexOf(query),
+	                    displayfname, displaylname, displaynname;
+	                    
+	                if(fnameMatchIndex > -1) {
+	                    displayfname = highlightMatch(fname, query, fnameMatchIndex);
+	                }
+	                else {
+	                    displayfname = fname;
+	                }
+	        
+	                if(lnameMatchIndex > -1) {
+	                    displaylname = highlightMatch(lname, query, lnameMatchIndex);
+	                }
+	                else {
+	                    displaylname = lname;
+	                }
+	        
+	                if(nnameMatchIndex > -1) {
+	                    displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
+	                }
+	                else {
+	                    displaynname = nname ? "(" + nname + ")" : "";
+	                }
+	        
+	                return displayfname + " " + displaylname + " " + displaynname;
+            	}
+            	else{
+            		return '';
+            	}
+            };
+            membersAC.formatResult = custom_formatter; 
+            ownerAC.formatResult = custom_formatter;
+                            
             var myHandler = function(sType, aArgs) {
-                var myAC = aArgs[0]; // reference back to the AC instance
-                var elLI = aArgs[1]; // reference to the selected LI element
+
+                var myAC = aArgs[0];  // reference back to the AC instance
+                var elLI = aArgs[1];  // reference to the selected LI element
                 var oData = aArgs[2]; // object literal of selected item's result data
-                myAC.getInputEl().value = oData.nname;
+                
+                //fill the autocomplete with value
+                if(oData.nname != undefined){
+                	//users
+                	myAC.getInputEl().value = oData.nname;
+                	YUD.get('perm_new_member_type').value = 'user';
+                }
+                else{
+                	//groups
+                	myAC.getInputEl().value = oData.grname;
+                	YUD.get('perm_new_member_type').value = 'users_group';
+                }
+                
             };
 
-            oAC_perms.itemSelectEvent.subscribe(myHandler);
-            oAC_owner.itemSelectEvent.subscribe(myHandler);
+            membersAC.itemSelectEvent.subscribe(myHandler);
+            ownerAC.itemSelectEvent.subscribe(myHandler);
             
             return {
-                oDS: oDS,
-                oAC_perms: oAC_perms,
-                oAC_owner: oAC_owner, 
+                memberDS: memberDS,
+                ownerDS:  ownerDS,
+                membersAC: membersAC,
+                ownerAC: ownerAC, 
             };
         }();