From 62d8d3ac03bb42ddbd8699eb1eb2fb0cbcb588b6 Mon Sep 17 00:00:00 2001
From: Vincent Pelletier <vincent@nexedi.com>
Date: Fri, 9 Dec 2016 06:06:23 +0100
Subject: [PATCH] Use PAS API: take 2.

---
 .../Baobab_getUserAssignment.py               |  2 +-
 .../Base_activateSimpleView.py                |  7 +++--
 .../Base_activateReport.py                    |  6 ++---
 product/ERP5/Tool/NotificationTool.py         | 27 +++++++++----------
 product/ERP5/tests/testAccounting_l10n_fr.py  |  5 ++--
 product/ERP5/tests/testQueryModule.py         |  4 +--
 product/ERP5/tests/testTask.py                |  4 +--
 .../ERP5/tests/testTaskReportDivergence.py    |  2 +-
 product/ERP5/tests/testZODBHistory.py         |  2 +-
 product/ERP5Form/tests/testGUIwithSecurity.py |  2 +-
 product/ERP5OOo/tests/testDeferredStyle.py    |  4 +--
 product/ERP5OOo/tests/testDms.py              |  2 +-
 product/ERP5Security/ERP5KeyAuthPlugin.py     | 10 +++----
 .../ERP5Security/tests/testERP5Security.py    |  2 +-
 product/ERP5Type/tests/ERP5TypeTestCase.py    |  2 +-
 .../tests/testDynamicClassGeneration.py       |  2 +-
 16 files changed, 41 insertions(+), 42 deletions(-)

diff --git a/bt5/erp5_banking_core/SkinTemplateItem/portal_skins/erp5_banking_core/Baobab_getUserAssignment.py b/bt5/erp5_banking_core/SkinTemplateItem/portal_skins/erp5_banking_core/Baobab_getUserAssignment.py
index 8ba881d623..fe5e2b2455 100644
--- a/bt5/erp5_banking_core/SkinTemplateItem/portal_skins/erp5_banking_core/Baobab_getUserAssignment.py
+++ b/bt5/erp5_banking_core/SkinTemplateItem/portal_skins/erp5_banking_core/Baobab_getUserAssignment.py
@@ -1,7 +1,7 @@
 if user_id is None:
   person = context.portal_membership.getAuthenticatedMember().getUserValue()
 else:
-  person_list = [x for x in context.acl_users.searchUsers(login=user_id, exact_match=True) if 'path' in x]
+  person_list = [x for x in context.acl_users.searchUsers(id=user_id, exact_match=True) if 'path' in x]
   if person_list:
     person, = person_list
     person = context.getPortalObject().restrictedTraverse(person['path'])
diff --git a/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style/Base_activateSimpleView.py b/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style/Base_activateSimpleView.py
index 3f442288e9..6b6b6a9d02 100644
--- a/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style/Base_activateSimpleView.py
+++ b/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style/Base_activateSimpleView.py
@@ -7,7 +7,8 @@ skin_name = request.get('deferred_portal_skin', portal.portal_skins.getDefaultSk
 tag = 'active-report-wrapped-%s' % random.randint(0, 1000)
 priority = 3
 
-person_value = portal.ERP5Site_getAuthenticatedMemberPersonValue()
+user = portal.portal_membership.getAuthenticatedMember()
+person_value = user.getUserValue()
 if person_value is None:
   portal.changeSkin(None)
   return context.Base_redirect('view', keep_items=dict(
@@ -20,8 +21,6 @@ if person_value.getDefaultEmailText('') in ('', None):
               portal_status_message=translateString(
                         "You haven't defined your email address")))
   
-user_name = person_value.getReference()
-
 # save request parameters
 # XXX we exclude some reserved names in a very ad hoc way
 request_form = {}
@@ -62,7 +61,7 @@ activity_context.activate(
            skin_name=skin_name,
            request_form=request_form,
            deferred_style_dialog_method=deferred_style_dialog_method,
-           user_name=user_name,
+           user_name=user.getId(),
            params=params,
           )
 
diff --git a/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style_core/Base_activateReport.py b/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style_core/Base_activateReport.py
index 70341a513d..5cc2086556 100644
--- a/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style_core/Base_activateReport.py
+++ b/bt5/erp5_deferred_style/SkinTemplateItem/portal_skins/erp5_deferred_style_core/Base_activateReport.py
@@ -3,7 +3,8 @@ request = container.REQUEST
 portal = context.getPortalObject()
 N_ = portal.Base_translateString
 
-person_value = portal.ERP5Site_getAuthenticatedMemberPersonValue()
+user = portal.portal_membership.getAuthenticatedMember()
+person_value = user.getUserValue()
 if person_value is None:
   portal.changeSkin(None)
   return context.Base_redirect('view', keep_items=dict(
@@ -15,7 +16,6 @@ if person_value.getDefaultEmailText('') in ('', None):
               portal_status_message=N_("You haven't defined your email address")))
 
 
-user_name = person_value.getReference()
 tag = 'active-report-%s' % random.randint(0, 1000)
 priority = 2
 format = request.get('format', '')
@@ -43,7 +43,7 @@ context.activate(activity="SQLQueue", tag=tag, after_tag=after_tag,
   priority=priority).Base_computeReportSection(
     form=form.getId(), 
     request_other=request_other, 
-    user_name=user_name, 
+    user_name=user.getId(),
     tag=tag,
     skin_name=skin_name, 
     format=format,
diff --git a/product/ERP5/Tool/NotificationTool.py b/product/ERP5/Tool/NotificationTool.py
index e3607c8f7e..f99cf106ce 100644
--- a/product/ERP5/Tool/NotificationTool.py
+++ b/product/ERP5/Tool/NotificationTool.py
@@ -245,10 +245,9 @@ class NotificationTool(BaseTool):
       This method provides only high-level functionality so that you can't use email address
       for sender and recipient, or raw data for attachments.
 
-      sender -- a login name(reference of Person document) or a Person document
+      sender -- a user id or a user document
 
-      recipient -- a login name(reference of Person document) or a Person document,
-                   a list of thereof
+      recipient -- a user id or a user document, or a list thereof
 
       subject -- the subject of the message
 
@@ -282,14 +281,13 @@ class NotificationTool(BaseTool):
       event_keyword_argument_dict -- additional keyword arguments which is used for
                                      constructor of event document.
 
-      portal_type_list -- Portal Type of Users
-
     TODO: support default notification email
     """
     portal = self.getPortalObject()
-    catalog_tool = getToolByName(self, 'portal_catalog')
-    if portal_type_list is None:
-      portal_type_list = ('Person',)
+    searchUsers = self.acl_users.searchUsers
+    def getUserValueByUserId(user_id):
+      user, = searchUsers(id=user_id, exact_match=True)
+      return portal.restrictedTraverse(user['path'])
 
     if notifier_list is None:
       # XXX TODO: Use priority_level. Need to implement default notifier query system.
@@ -304,8 +302,7 @@ class NotificationTool(BaseTool):
     # Find "From" Person
     from_person = None
     if isinstance(sender, basestring):
-      sender = catalog_tool.getResultValue(portal_type=portal_type_list,
-                                           reference=sender)
+      sender = getUserValueByUserId(sender)
     if sender is not None:
       email_value = sender.getDefaultEmailValue()
       if email_value is not None and email_value.asText():
@@ -313,15 +310,17 @@ class NotificationTool(BaseTool):
 
     # Find "To" Person list
     to_person_list = []
+    # XXX: evaluating a document as boolean is bad, as __bool__ may be
+    # overloaded to (for example) return False if there are no children (which
+    # would have unintended effects here).
     if recipient:
       if not isinstance(recipient, (list, tuple)):
-        recipient = (recipient,)
+        recipient = (recipient, )
       for person in recipient:
         if isinstance(person, basestring):
-          person_value = catalog_tool.getResultValue(portal_type=portal_type_list,
-                                                     reference=person)
+          person_value = getUserValueByUserId(person)
           if person_value is None:
-            raise ValueError("Can't find person document which reference is '%s'" % person)
+            raise ValueError("Can't find user with id %r" % (person, ))
           person = person_value
         to_person_list.append(person)
 
diff --git a/product/ERP5/tests/testAccounting_l10n_fr.py b/product/ERP5/tests/testAccounting_l10n_fr.py
index aa60dc6299..7846e3ba22 100644
--- a/product/ERP5/tests/testAccounting_l10n_fr.py
+++ b/product/ERP5/tests/testAccounting_l10n_fr.py
@@ -74,7 +74,8 @@ class TestAccounting_l10n_fr(AccountingTestCase):
   def createUserAndlogin(self, name=username):
     # create a user with an email address
     person_module = self.portal.person_module
-    if person_module._getOb('pers', None) is None:
+    person = person_module._getOb('pers', None)
+    if person is None:
       person = person_module.newContent(id='pers', portal_type='Person',
                                         reference=self.username,
                                         first_name=self.first_name,
@@ -85,7 +86,7 @@ class TestAccounting_l10n_fr(AccountingTestCase):
 
     uf = self.portal.acl_users
     uf.zodb_roles.assignRoleToPrincipal('Assignor', self.username)
-    user = uf.getUserById(self.username).__of__(uf)
+    user = uf.getUser(self.username).__of__(uf)
     newSecurityManager(None, user)
 
   def test_FEC(self):
diff --git a/product/ERP5/tests/testQueryModule.py b/product/ERP5/tests/testQueryModule.py
index 0427a2fc1b..836bee17e5 100644
--- a/product/ERP5/tests/testQueryModule.py
+++ b/product/ERP5/tests/testQueryModule.py
@@ -99,8 +99,8 @@ class TestQueryModule(ERP5TypeTestCase):
     assignment.validate()
     self.tic()
     uf = self.portal.acl_users
-    owner_user = uf.getUser('owner_user').__of__(uf)
-    question_user = uf.getUser('question_user').__of__(uf)
+    owner_user = uf.getUserById('owner_user').__of__(uf)
+    question_user = uf.getUserById('question_user').__of__(uf)
 
     # add Author local roles on person and query modules
     self.portal.person_module.manage_setLocalRoles('owner_user', ['Author'])
diff --git a/product/ERP5/tests/testTask.py b/product/ERP5/tests/testTask.py
index aaf9637f4a..9d3c864cab 100644
--- a/product/ERP5/tests/testTask.py
+++ b/product/ERP5/tests/testTask.py
@@ -127,7 +127,7 @@ class TestTaskMixin:
 #  def stepLogin(self, **kw):
 #    portal = self.getPortal()
 #    uf = portal.acl_users
-#    if not uf.getUser('dummy'):
+#    if not uf.getUserById('dummy'):
 #      uf._doAddUser('manager', '', ['Manager'], [])
 #      self.login('manager')
 #      person_module = portal.getDefaultModule(self.person_portal_type)
@@ -718,7 +718,7 @@ class TestTask(TestTaskMixin, ERP5TypeTestCase):
 
     simulation_tool = self.getPortal().portal_simulation
     uf = self.getPortal().acl_users
-    if not uf.getUser('manager'):
+    if not uf.getUserById('manager'):
       uf._doAddUser('manager', '', ['Manager'], [])
     self.login('manager')
     try:
diff --git a/product/ERP5/tests/testTaskReportDivergence.py b/product/ERP5/tests/testTaskReportDivergence.py
index 3cad2e0af7..88e756046b 100644
--- a/product/ERP5/tests/testTaskReportDivergence.py
+++ b/product/ERP5/tests/testTaskReportDivergence.py
@@ -99,7 +99,7 @@ class TestTaskReportDivergenceMixin(TestTaskMixin, SecurityTestCase):
     simulation_tool = portal.portal_simulation
     rule_tool = portal.portal_rules
     uf = self.getPortal().acl_users
-    if not uf.getUser('manager'):
+    if not uf.getUserById('manager'):
       uf._doAddUser('manager', '', ['Manager'], [])
     self.login('manager')
     simulation_tool.Base_setDefaultSecurity()
diff --git a/product/ERP5/tests/testZODBHistory.py b/product/ERP5/tests/testZODBHistory.py
index 411c10185a..c013f46f4a 100644
--- a/product/ERP5/tests/testZODBHistory.py
+++ b/product/ERP5/tests/testZODBHistory.py
@@ -73,7 +73,7 @@ class TestZODBHistory(ERP5TypeTestCase):
   def addUser(self, user_name, role=['Member', 'Owner', 'Assignor']):
     """ Create a test user."""
     uf = self.portal.acl_users
-    if not uf.getUser(user_name):
+    if not uf.getUserById(user_name):
       uf._doAddUser(user_name, '', role, [])
 
   def _clearCache(self):
diff --git a/product/ERP5Form/tests/testGUIwithSecurity.py b/product/ERP5Form/tests/testGUIwithSecurity.py
index 7996ceb3a4..9a34dbc31a 100644
--- a/product/ERP5Form/tests/testGUIwithSecurity.py
+++ b/product/ERP5Form/tests/testGUIwithSecurity.py
@@ -61,7 +61,7 @@ class TestGUISecurity(ERP5TypeTestCase):
 
   def loginAs(self, id='user'):
     uf = self.getPortal().acl_users
-    user = uf.getUserById(id).__of__(uf)
+    user = uf.getUser(id).__of__(uf)
     newSecurityManager(None, user)
 
   def stepCreateObjects(self, sequence = None, sequence_list = None, **kw):
diff --git a/product/ERP5OOo/tests/testDeferredStyle.py b/product/ERP5OOo/tests/testDeferredStyle.py
index f2009cbc2b..936d29e348 100644
--- a/product/ERP5OOo/tests/testDeferredStyle.py
+++ b/product/ERP5OOo/tests/testDeferredStyle.py
@@ -72,8 +72,8 @@ class TestDeferredStyle(ERP5TypeTestCase, ZopeTestCase.Functional):
 
   def loginAsUser(self, username):
     uf = self.portal.acl_users
-    uf.zodb_roles.assignRoleToPrincipal('Manager', username)
-    user = uf.getUserById(username).__of__(uf)
+    user = uf.getUser(username).__of__(uf)
+    uf.zodb_roles.assignRoleToPrincipal('Manager', user.getId())
     newSecurityManager(None, user)
 
   def test_skin_selection(self):
diff --git a/product/ERP5OOo/tests/testDms.py b/product/ERP5OOo/tests/testDms.py
index 750a19cb97..5418421699 100644
--- a/product/ERP5OOo/tests/testDms.py
+++ b/product/ERP5OOo/tests/testDms.py
@@ -2090,7 +2090,7 @@ return 1
     """
     # Create a root level zope user
     root_user_folder = self.getPortalObject().aq_parent.acl_users
-    if not root_user_folder.getUser('zope_user'):
+    if not root_user_folder.getUserById('zope_user'):
       root_user_folder._doAddUser('zope_user', '', ['Manager',], [])
       self.commit()
     # Create document with good content
diff --git a/product/ERP5Security/ERP5KeyAuthPlugin.py b/product/ERP5Security/ERP5KeyAuthPlugin.py
index b4efdf9f64..ad023b6abe 100644
--- a/product/ERP5Security/ERP5KeyAuthPlugin.py
+++ b/product/ERP5Security/ERP5KeyAuthPlugin.py
@@ -335,15 +335,15 @@ class ERP5KeyAuthPlugin(ERP5UserManager, CookieAuthHelper):
           return None
 
         #Search the user by his login
-        user_list = self.getUserByLogin(login)
-        if len(user_list) != 1:
+        user = self.getUser(login)
+        if user is None:
           raise _AuthenticationFailure()
-        user = user_list[0]
+        user_value = user.getUserValue()
 
         if True:
           try:
             # get assignment list
-            assignment_list = [x for x in user.contentValues(portal_type="Assignment") \
+            assignment_list = [x for x in user_value.contentValues(portal_type="Assignment") \
                                  if x.getValidationState() == "open"]
             valid_assignment_list = []
             # check dates if exist
@@ -359,7 +359,7 @@ class ERP5KeyAuthPlugin(ERP5UserManager, CookieAuthHelper):
 
             # validate
             if len(valid_assignment_list) > 0:
-              return (login, login)
+              return (user.getId(), user.getUserName())
           finally:
             pass
 
diff --git a/product/ERP5Security/tests/testERP5Security.py b/product/ERP5Security/tests/testERP5Security.py
index dcb3c006b6..514f3be909 100644
--- a/product/ERP5Security/tests/testERP5Security.py
+++ b/product/ERP5Security/tests/testERP5Security.py
@@ -115,7 +115,7 @@ class TestUserManagement(ERP5TypeTestCase):
     from Products.PluggableAuthService.interfaces.plugins import\
                                                       IAuthenticationPlugin
     uf = self.getUserFolder()
-    self.assertNotEquals(uf.getUserById(login, None), None)
+    self.assertNotEquals(uf.getUser(login), None)
     for plugin_name, plugin in uf._getOb('plugins').listPlugins(
                                 IAuthenticationPlugin ):
       if plugin.authenticateCredentials(
diff --git a/product/ERP5Type/tests/ERP5TypeTestCase.py b/product/ERP5Type/tests/ERP5TypeTestCase.py
index 46520abadf..c79d7bab95 100644
--- a/product/ERP5Type/tests/ERP5TypeTestCase.py
+++ b/product/ERP5Type/tests/ERP5TypeTestCase.py
@@ -260,7 +260,7 @@ class ERP5TypeTestCaseMixin(ProcessingNodeTestCase, PortalTestCase):
       '''Creates the default user.'''
       uf = self.portal.acl_users
       # do nothing if the user already exists
-      if not uf.getUser(user_name):
+      if not uf.getUserById(user_name):
         uf._doAddUser(user_name, 'secret', ['Member'], [])
 
     def _setUpDummyMailHost(self):
diff --git a/product/ERP5Type/tests/testDynamicClassGeneration.py b/product/ERP5Type/tests/testDynamicClassGeneration.py
index f8e3b7ceef..d01e9160b2 100644
--- a/product/ERP5Type/tests/testDynamicClassGeneration.py
+++ b/product/ERP5Type/tests/testDynamicClassGeneration.py
@@ -1419,7 +1419,7 @@ class _TestZodbComponent(SecurityTestCase):
     otherwise it should not be importable at all
     """
     uf = self.portal.acl_users
-    if not uf.getUser('ERP5TypeTestCase_NonDeveloper'):
+    if not uf.getUserById('ERP5TypeTestCase_NonDeveloper'):
       uf._doAddUser('ERP5TypeTestCase_NonDeveloper',
                     '', ['Manager', 'Member', 'Assignee',
                          'Assignor', 'Author', 'Auditor', 'Associate'], [])
-- 
2.30.9