Activity - More accurate calculation of permittedActivityTypes
authorcolemanw <coleman@civicrm.org>
Sun, 17 Sep 2023 18:56:17 +0000 (14:56 -0400)
committercolemanw <coleman@civicrm.org>
Wed, 20 Sep 2023 11:30:24 +0000 (07:30 -0400)
The strict array key comparison seemed wrong, array_diff_key works better.
I was hoping this would be more efficient by skipping the where clause for
privledge users, but it doesn't. Oh well at least this is more correct.

CRM/Activity/BAO/Activity.php
tests/phpunit/CRM/Contact/SelectorTest.php

index 37ece7b6fdd6d898112d23053b717a521e888a7f..4aaa2e596d2541d3d4792931dedf4868e0ef5772 100644 (file)
@@ -806,13 +806,13 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
   public function addSelectWhereClause() {
     $clauses = [];
     $permittedActivityTypeIDs = self::getPermittedActivityTypes();
-    $allActivityTypes = self::buildOptions('activity_type_id');
+    $allActivityTypes = self::buildOptions('activity_type_id', 'validate');
     if (empty($permittedActivityTypeIDs)) {
       // This just prevents a mysql fail if they have no access - should be extremely edge case.
       $permittedActivityTypeIDs = [0];
     }
-    if (array_keys($allActivityTypes) !== array_keys($permittedActivityTypeIDs)) {
-      $clauses['activity_type_id'] = ('IN (' . implode(', ', $permittedActivityTypeIDs) . ')');
+    if (array_diff_key($allActivityTypes, $permittedActivityTypeIDs)) {
+      $clauses['activity_type_id'] = ['IN (' . implode(', ', $permittedActivityTypeIDs) . ')'];
     }
 
     $contactClause = CRM_Utils_SQL::mergeSubquery('Contact');
index 7d4c33846a9d1db8abd966913a9fe44a9cbec40f..e08455d31fd6962abad582df5c9cbdba859a85ee 100644 (file)
@@ -455,8 +455,8 @@ class CRM_Contact_SelectorTest extends CiviUnitTestCase {
           'searchDescendentGroups' => FALSE,
           'expected_query' => [
             0 => 'SELECT contact_a.id as contact_id, source_contact.id as source_contact_id',
-            2 => 'WHERE ( source_contact.id IS NOT NULL ) AND ( 1 ) AND (contact_a.is_deleted = 0)',
           ],
+          'where_contains' => 'WHERE ( source_contact.id IS NOT NULL ) AND ( 1 ) AND (contact_a.is_deleted = 0)',
         ],
       ],
       'Test display relationships' => [