From 5e651a6496848f5ee3f6415ef3b56ca140c88556 Mon Sep 17 00:00:00 2001 From: Kevin McCarthy Date: Thu, 18 Oct 2007 14:33:55 -0700 Subject: Finish the email autosuggest. For now I've added a new API call. The field-specific searching is a ways off. --- ipa-python/ipaclient.py | 7 +++++ ipa-python/rpcclient.py | 18 ++++++++++- ipa-server/ipa-gui/ipagui/subcontrollers/user.py | 40 +++++++++--------------- ipa-server/xmlrpc-server/funcs.py | 11 ++++++- ipa-server/xmlrpc-server/ipaxmlrpc.py | 1 + 5 files changed, 49 insertions(+), 28 deletions(-) diff --git a/ipa-python/ipaclient.py b/ipa-python/ipaclient.py index 63cd425f2..7131be48c 100644 --- a/ipa-python/ipaclient.py +++ b/ipa-python/ipaclient.py @@ -98,6 +98,13 @@ class IPAClient: result = self.transport.get_user_by_principal(principal,sattrs) return user.User(result) + def get_user_by_email(self,email,sattrs=None): + """Get a specific user's entry. Return as a dict of values. + Multi-valued fields are represented as lists. + """ + result = self.transport.get_user_by_email(email,sattrs) + return user.User(result) + def get_users_by_manager(self,manager_dn,sattrs=None): """Gets the users the report to a particular manager. If sattrs is not None then only those diff --git a/ipa-python/rpcclient.py b/ipa-python/rpcclient.py index df3d01386..53fb690bb 100644 --- a/ipa-python/rpcclient.py +++ b/ipa-python/rpcclient.py @@ -165,7 +165,23 @@ class RPCClient: raise xmlrpclib.Fault(value, msg) return ipautil.unwrap_binary_data(result) - + + def get_user_by_email(self,email,sattrs=None): + """Get a specific user's entry. Return as a dict of values. + Multi-valued fields are represented as lists. + """ + server = self.setup_server() + if sattrs is None: + sattrs = "__NONE__" + try: + result = server.get_user_by_email(email, sattrs) + except xmlrpclib.Fault, fault: + raise ipaerror.gen_exception(fault.faultCode, fault.faultString) + except socket.error, (value, msg): + raise xmlrpclib.Fault(value, msg) + + return ipautil.unwrap_binary_data(result) + def get_users_by_manager(self,manager_dn,sattrs=None): """Gets the users that report to a manager. If sattrs is not None then only those diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/user.py b/ipa-server/ipa-gui/ipagui/subcontrollers/user.py index 5552bee72..5b804fd69 100644 --- a/ipa-server/ipa-gui/ipagui/subcontrollers/user.py +++ b/ipa-server/ipa-gui/ipagui/subcontrollers/user.py @@ -17,6 +17,7 @@ import ipa.user from ipa.entity import utf8_encode_values from ipa import ipaerror import ipagui.forms.user +import ipa.config log = logging.getLogger(__name__) @@ -27,6 +28,8 @@ user_edit_form = ipagui.forms.user.UserEditForm() user_fields = ['*', 'nsAccountLock'] +email_domain = ipa.config.config.default_realm.lower() + class UserController(IPAController): @expose() @@ -518,31 +521,16 @@ class UserController(IPAController): givenname = givenname.lower() sn = sn.lower() - # TODO - get from config - domain = "freeipa.org" - - return "%s.%s@%s" % (givenname, sn, domain) - - - # TODO - mail is currently not indexed nor searchable. - # implement when it's done - # email = givenname + "." + sn + domain - # users = client.find_users(email, ['mail']) - # if len(filter(lambda u: u['mail'] == email, users[1:])) == 0: - # return email - - # email = self.suggest_uid(givenname, sn) + domain - # users = client.find_users(email, ['mail']) - # if len(filter(lambda u: u['mail'] == email, users[1:])) == 0: - # return email + email = "%s.%s@%s" % (givenname, sn, email_domain) + try: + client.get_user_by_email(email) + except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND): + return email - # suffix = 2 - # template = givenname + "." + sn - # while suffix < 20: - # email = template + str(suffix) + domain - # users = client.find_users(email, ['mail']) - # if len(filter(lambda u: u['mail'] == email, users[1:])) == 0: - # return email - # suffix += 1 + email = "%s@%s" % (self.suggest_uid(givenname, sn), email_domain) + try: + client.get_user_by_email(email) + except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND): + return email - # return "" + return "" diff --git a/ipa-server/xmlrpc-server/funcs.py b/ipa-server/xmlrpc-server/funcs.py index 8ba0efdde..4b2cfc9f3 100644 --- a/ipa-server/xmlrpc-server/funcs.py +++ b/ipa-server/xmlrpc-server/funcs.py @@ -377,7 +377,16 @@ class IPAServer: filter = "(krbPrincipalName="+self.__safe_filter(principal)+")" return self.__get_sub_entry(self.basedn, filter, sattrs, opts) - + + def get_user_by_email (self, email, sattrs=None, opts=None): + """Get a specific user's entry. Return as a dict of values. + Multi-valued fields are represented as lists. + """ + + email = self.__safe_filter(email) + filter = "(mail=" + email + ")" + return self.__get_sub_entry(self.basedn, filter, sattrs, opts) + def get_users_by_manager (self, manager_dn, sattrs=None, opts=None): """Gets the users that report to a particular manager. """ diff --git a/ipa-server/xmlrpc-server/ipaxmlrpc.py b/ipa-server/xmlrpc-server/ipaxmlrpc.py index e9da95869..2785c6807 100644 --- a/ipa-server/xmlrpc-server/ipaxmlrpc.py +++ b/ipa-server/xmlrpc-server/ipaxmlrpc.py @@ -323,6 +323,7 @@ def handler(req, profiling=False): h.register_function(f.update_entry) h.register_function(f.get_user_by_uid) h.register_function(f.get_user_by_principal) + h.register_function(f.get_user_by_email) h.register_function(f.get_users_by_manager) h.register_function(f.add_user) h.register_function(f.get_add_schema) -- cgit