On 20.10.2015 16:07, Martin Basti wrote:


On 20.10.2015 15:57, Martin Basti wrote:
https://fedorahosted.org/freeipa/ticket/5344

Patch attached.

Test are failing, a fix in UserTracker has to be done (partially in my patch 329)


SelfNACK, I forgot to add stageuser tests


Updated patch attached.

I extracted tests to the separate patch, tests do not work, I had issues with user and stageuser trackers.

From 250c5d3f2f5e47b19c628115ecd9df8a71d357dc Mon Sep 17 00:00:00 2001
From: Martin Basti <mba...@redhat.com>
Date: Tue, 20 Oct 2015 18:39:57 +0200
Subject: [PATCH] Allow multiple managers per user - CLI part

https://fedorahosted.org/freeipa/ticket/5344
---
 API.txt                    | 12 ++++++------
 VERSION                    |  4 ++--
 ipalib/plugins/baseuser.py |  7 +++++--
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/API.txt b/API.txt
index 873c6d54221a0c1657b5457bd9dceedb4adf06b3..896df430aaa1952c0fe4af4672b78f1ad11da45e 100644
--- a/API.txt
+++ b/API.txt
@@ -4225,7 +4225,7 @@ option: Str('krbprincipalname', attribute=True, autofill=True, cli_name='princip
 option: Str('l', attribute=True, cli_name='city', multivalue=False, required=False)
 option: Str('loginshell', attribute=True, cli_name='shell', multivalue=False, required=False)
 option: Str('mail', attribute=True, cli_name='email', multivalue=True, required=False)
-option: Str('manager', attribute=True, cli_name='manager', multivalue=False, required=False)
+option: Str('manager', attribute=True, cli_name='manager', multivalue=True, required=False)
 option: Str('mobile', attribute=True, cli_name='mobile', multivalue=True, required=False)
 option: Flag('no_members', autofill=True, default=False, exclude='webui')
 option: Str('ou', attribute=True, cli_name='orgunit', multivalue=False, required=False)
@@ -4285,7 +4285,7 @@ option: Str('krbprincipalname', attribute=True, autofill=False, cli_name='princi
 option: Str('l', attribute=True, autofill=False, cli_name='city', multivalue=False, query=True, required=False)
 option: Str('loginshell', attribute=True, autofill=False, cli_name='shell', multivalue=False, query=True, required=False)
 option: Str('mail', attribute=True, autofill=False, cli_name='email', multivalue=True, query=True, required=False)
-option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=False, query=True, required=False)
+option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=True, query=True, required=False)
 option: Str('mobile', attribute=True, autofill=False, cli_name='mobile', multivalue=True, query=True, required=False)
 option: Flag('no_members', autofill=True, default=False, exclude='webui')
 option: Str('not_in_group*', cli_name='not_in_groups', csv=True)
@@ -4342,7 +4342,7 @@ option: DateTime('krbprincipalexpiration', attribute=True, autofill=False, cli_n
 option: Str('l', attribute=True, autofill=False, cli_name='city', multivalue=False, required=False)
 option: Str('loginshell', attribute=True, autofill=False, cli_name='shell', multivalue=False, required=False)
 option: Str('mail', attribute=True, autofill=False, cli_name='email', multivalue=True, required=False)
-option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=False, required=False)
+option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=True, required=False)
 option: Str('mobile', attribute=True, autofill=False, cli_name='mobile', multivalue=True, required=False)
 option: Flag('no_members', autofill=True, default=False, exclude='webui')
 option: Str('ou', attribute=True, autofill=False, cli_name='orgunit', multivalue=False, required=False)
@@ -5172,7 +5172,7 @@ option: Str('krbprincipalname', attribute=True, autofill=True, cli_name='princip
 option: Str('l', attribute=True, cli_name='city', multivalue=False, required=False)
 option: Str('loginshell', attribute=True, cli_name='shell', multivalue=False, required=False)
 option: Str('mail', attribute=True, cli_name='email', multivalue=True, required=False)
-option: Str('manager', attribute=True, cli_name='manager', multivalue=False, required=False)
+option: Str('manager', attribute=True, cli_name='manager', multivalue=True, required=False)
 option: Str('mobile', attribute=True, cli_name='mobile', multivalue=True, required=False)
 option: Flag('no_members', autofill=True, default=False, exclude='webui')
 option: Flag('noprivate', autofill=True, cli_name='noprivate', default=False)
@@ -5261,7 +5261,7 @@ option: Str('krbprincipalname', attribute=True, autofill=False, cli_name='princi
 option: Str('l', attribute=True, autofill=False, cli_name='city', multivalue=False, query=True, required=False)
 option: Str('loginshell', attribute=True, autofill=False, cli_name='shell', multivalue=False, query=True, required=False)
 option: Str('mail', attribute=True, autofill=False, cli_name='email', multivalue=True, query=True, required=False)
-option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=False, query=True, required=False)
+option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=True, query=True, required=False)
 option: Str('mobile', attribute=True, autofill=False, cli_name='mobile', multivalue=True, query=True, required=False)
 option: Flag('no_members', autofill=True, default=False, exclude='webui')
 option: Str('not_in_group*', cli_name='not_in_groups', csv=True)
@@ -5321,7 +5321,7 @@ option: DateTime('krbprincipalexpiration', attribute=True, autofill=False, cli_n
 option: Str('l', attribute=True, autofill=False, cli_name='city', multivalue=False, required=False)
 option: Str('loginshell', attribute=True, autofill=False, cli_name='shell', multivalue=False, required=False)
 option: Str('mail', attribute=True, autofill=False, cli_name='email', multivalue=True, required=False)
-option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=False, required=False)
+option: Str('manager', attribute=True, autofill=False, cli_name='manager', multivalue=True, required=False)
 option: Str('mobile', attribute=True, autofill=False, cli_name='mobile', multivalue=True, required=False)
 option: Flag('no_members', autofill=True, default=False, exclude='webui')
 option: Bool('nsaccountlock', attribute=True, autofill=False, cli_name='nsaccountlock', multivalue=False, required=False)
diff --git a/VERSION b/VERSION
index cdda198c6ce3148dcf785149dc3ce050782e8caa..6bcd9ee8e0557555f790db0940af57f9e9ed4f42 100644
--- a/VERSION
+++ b/VERSION
@@ -90,5 +90,5 @@ IPA_DATA_VERSION=20100614120000
 #                                                      #
 ########################################################
 IPA_API_VERSION_MAJOR=2
-IPA_API_VERSION_MINOR=157
-# Last change: mbabinsk - hide segment direction from topology commands
+IPA_API_VERSION_MINOR=158
+# Last change: mbasti - allow to specify multiple managers per user
diff --git a/ipalib/plugins/baseuser.py b/ipalib/plugins/baseuser.py
index b974e3fb18659e7eb6e75557e0d4db3ec1197dcd..40114d6e994d0c1f814ce0c5b362c9cf4848f850 100644
--- a/ipalib/plugins/baseuser.py
+++ b/ipalib/plugins/baseuser.py
@@ -338,7 +338,7 @@ class baseuser(LDAPObject):
         Str('title?',
             label=_('Job Title'),
         ),
-        Str('manager?',
+        Str('manager*',
             label=_('Manager'),
         ),
         Str('carlicense*',
@@ -426,8 +426,11 @@ class baseuser(LDAPObject):
         if not manager:
             return None
 
-        if not isinstance(manager, list):
+        if isinstance(manager, tuple):
+            manager = list(manager)
+        elif not isinstance(manager, list):
             manager = [manager]
+
         try:
             container_dn = DN(container, api.env.basedn)
             for i, mgr in enumerate(manager):
-- 
2.4.3

From 83200aebcb642c48fcf4542753a70d1cff6e5c09 Mon Sep 17 00:00:00 2001
From: Martin Basti <mba...@redhat.com>
Date: Tue, 20 Oct 2015 18:40:36 +0200
Subject: [PATCH] WIP tests: multiple managers per user

---
 ipatests/test_xmlrpc/test_stageuser_plugin.py | 37 +++++++++++++++++++++
 ipatests/test_xmlrpc/test_user_plugin.py      | 48 +++++++++++++++++++++++++++
 2 files changed, 85 insertions(+)

diff --git a/ipatests/test_xmlrpc/test_stageuser_plugin.py b/ipatests/test_xmlrpc/test_stageuser_plugin.py
index b09ef6e84cd95a32061b07d833c5a39f1750f80b..761f8fa48bcdc83fbf66dc4c9eca668adf010fc7 100644
--- a/ipatests/test_xmlrpc/test_stageuser_plugin.py
+++ b/ipatests/test_xmlrpc/test_stageuser_plugin.py
@@ -389,6 +389,18 @@ def user7(request):
     return tracker.make_fixture_restore(request)
 
 
+@pytest.fixture(scope='class')
+def manager1(request):
+    t = UserTracker(u"manager1", u"manager", u"manager1")
+    return t.make_fixture(request)
+
+
+@pytest.fixture(scope='class')
+def manager2(request):
+    t = UserTracker(u"manager2", u"manager", u"manager2")
+    return t.make_fixture(request)
+
+
 class TestNonexistentStagedUser(XMLRPC_test):
     def test_retrieve_nonexistent(self, stageduser):
         stageduser.ensure_missing()
@@ -891,3 +903,28 @@ class TestGroups(XMLRPC_test):
         command = group.make_add_member_command(options={u'user': user.uid})
         result = command()
         group.check_add_member_negative(result)
+
+
+class TestMultipleManagers(XMLRPC_test):
+    """Tests for: https://fedorahosted.org/freeipa/ticket/5344""";
+    def test_multiple_managers_per_stageduser(self, manager1, manager2,
+                                              stageduser):
+        manager1.create()
+        manager2.create()
+        stageduser.create()
+
+        stageduser.update({u"manager": [manager1.name, manager2.name]})
+
+    def test_find_stageuser_with_multiple_managers(self, manager1, manager2,
+                                                   stageduser):
+        command = stageduser.make_find_command(
+            manager=[manager1.name, manager2.name])
+        result = command()
+        stageduser.check_find(result)
+
+    def test_create_new_stageduser_with_multiple_managers(
+                self, manager1, manager2, stageuser2):
+        command = stageuser2.make_create_command(
+            manager=[manager1.name, manager2.name])
+        result = command()
+        stageuser2.check_create(result)
diff --git a/ipatests/test_xmlrpc/test_user_plugin.py b/ipatests/test_xmlrpc/test_user_plugin.py
index 18305ad02906a63baafcdf49bd2c93fa39dc4584..3a1848a2b0e6ba9bf714c9c32ba48db9267e0ca3 100644
--- a/ipatests/test_xmlrpc/test_user_plugin.py
+++ b/ipatests/test_xmlrpc/test_user_plugin.py
@@ -27,6 +27,7 @@ import functools
 import datetime
 import ldap
 import re
+import pytest
 
 from ipalib import api, errors
 from ipatests.test_xmlrpc import objectclasses
@@ -1975,3 +1976,50 @@ class UserTracker(Tracker):
         request.addfinalizer(finish)
 
         return self
+
+
+@pytest.fixture(scope='class')
+def manager1(request):
+    t = UserTracker(u"manager1", u"manager", u"manager1")
+    return t.make_fixture(request)
+
+
+@pytest.fixture(scope='class')
+def manager2(request):
+    t = UserTracker(u"manager2", u"manager", u"manager2")
+    return t.make_fixture(request)
+
+
+@pytest.fixture(scope='class')
+def testuser(request):
+    t = UserTracker(u"user", u"test", u"user")
+    return t.make_fixture(request)
+
+@pytest.fixture(scope='class')
+def testuser2(request):
+    t = UserTracker(u"user2", u"test", u"user2")
+    return t.make_fixture(request)
+
+
+class TestMultipleManagers(XMLRPC_test):
+    """Tests for: https://fedorahosted.org/freeipa/ticket/5344""";
+    def test_multiple_managers_per_user(self, manager1, manager2, testuser):
+        manager1.create()
+        manager2.create()
+        testuser.create()
+
+        testuser.update({u"manager": [manager1.name, manager2.name]})
+
+    def test_find_user_with_multiple_managers(self, manager1, manager2,
+                                              testuser):
+        command = testuser.make_find_command(
+            manager=[manager1.name, manager2.name])
+        result = command()
+        testuser.check_find(result)
+
+    def test_create_new_user_with_multiple_managers(
+                self, manager1, manager2, testuser2):
+        command = testuser2.make_create_command(
+            options={u"manager": [manager1.name, manager2.name]})
+        result = command()
+        testuser2.check_create(result)
-- 
2.4.3

-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to