Merge pull request #9124 from mlutfy/master-crm17991
authorcolemanw <coleman@civicrm.org>
Wed, 28 Sep 2016 13:50:53 +0000 (09:50 -0400)
committerGitHub <noreply@github.com>
Wed, 28 Sep 2016 13:50:53 +0000 (09:50 -0400)
CRM-17991: Fix Safari JS bug in COntribution popups (affects softcredits, pledges).

37 files changed:
CRM/Contact/BAO/SavedSearch.php
CRM/Contact/Form/Task/SaveSearch.php
CRM/Contact/Import/Form/Preview.php
CRM/Contribute/BAO/ContributionSoft.php
CRM/Core/BAO/Dashboard.php
CRM/Core/BAO/OptionValue.php
CRM/Core/I18n/Schema.php
CRM/Core/ManagedEntities.php
CRM/Event/BAO/Participant.php
CRM/Event/BAO/ParticipantStatusType.php
CRM/Logging/Schema.php
CRM/Member/BAO/MembershipStatus.php
CRM/Utils/File.php
ang/crmMailing/BlockMailing.html
api/v3/ActivityType.php
api/v3/ContributionSoft.php
api/v3/Dashboard.php
api/v3/Group.php
api/v3/GroupContact.php
api/v3/Job.php
api/v3/MembershipStatus.php
api/v3/OptionValue.php
api/v3/ParticipantStatusType.php
api/v3/SystemLog.php
api/v3/utils.php
css/dashboard.css
templates/CRM/Contribute/Form/Contribution.tpl
tests/mock/extension_browser_results/single [new file with mode: 0644]
tests/phpunit/CRM/Batch/Form/EntryTest.php
tests/phpunit/CRM/Dedupe/MergerTest.php
tests/phpunit/CRM/Logging/LoggingTest.php [new file with mode: 0644]
tests/phpunit/CiviTest/CiviUnitTestCase.php
tests/phpunit/api/v3/ActivityTest.php
tests/phpunit/api/v3/CustomSearchTest.php
tests/phpunit/api/v3/CustomValueTest.php
tests/phpunit/api/v3/ExtensionTest.php [new file with mode: 0644]
tests/phpunit/api/v3/SyntaxConformanceTest.php

index 90f4ddc53002379823fd093791bced33ef8efa74..bfc6e10f947b9df656bfe458d2e41b3f24d7d2af 100644 (file)
@@ -113,9 +113,14 @@ class CRM_Contact_BAO_SavedSearch extends CRM_Contact_DAO_SavedSearch {
           $value = CRM_Utils_Array::value(key($value), $value);
         }
         if (strpos($id, '_date_low') !== FALSE || strpos($id, '_date_high') !== FALSE) {
-          $result[$id] = date($dateFormat, strtotime($value));
           $entityName = strstr($id, '_date', TRUE);
-          $result["{$entityName}_date_relative"] = 0;
+          if (!empty($result['relative_dates']) && array_key_exists($entityName, $result['relative_dates'])) {
+            $result["{$entityName}_date_relative"] = $result['relative_dates'][$entityName];
+          }
+          else {
+            $result[$id] = date($dateFormat, strtotime($value));
+            $result["{$entityName}_date_relative"] = 0;
+          }
         }
         else {
           $result[$id] = $value;
@@ -389,4 +394,24 @@ LEFT JOIN civicrm_email ON (contact_a.id = civicrm_email.contact_id AND civicrm_
     }
   }
 
+  /**
+   * Store relative dates in separate array format
+   *
+   * @param array $queryParams
+   * @param array $formValues
+   */
+  public static function saveRelativeDates(&$queryParams, $formValues) {
+    $relativeDates = array('relative_dates' => array());
+    foreach ($formValues as $id => $value) {
+      if (preg_match('/_date_relative$/', $id) && !empty($value)) {
+        $entityName = strstr($id, '_date', TRUE);
+        $relativeDates['relative_dates'][$entityName] = $value;
+      }
+    }
+    // merge with original queryParams if relative date value(s) found
+    if (count($relativeDates['relative_dates'])) {
+      $queryParams = array_merge($queryParams, $relativeDates);
+    }
+  }
+
 }
index e4ef5cb0202b04e6ac5132b454a0b3b243e27c43..2e1f7a9e77303bf5098f47e5fd65c977381969d2 100644 (file)
@@ -189,6 +189,7 @@ class CRM_Contact_Form_Task_SaveSearch extends CRM_Contact_Form_Task {
     // Ideally per CRM-17075 we will use entity reference fields heavily in the form layer & convert to the
     // sql operator syntax at the query layer.
     if (!$isSearchBuilder) {
+      CRM_Contact_BAO_SavedSearch::saveRelativeDates($queryParams, $formValues);
       $savedSearch->form_values = serialize($queryParams);
     }
     else {
index 57f8e08aaa9881655ee64e7d0b437cdf5f97df63..c516795b7444a324fd25740a31467a5a5e4d1de3 100644 (file)
@@ -304,12 +304,8 @@ class CRM_Contact_Import_Form_Preview extends CRM_Import_Form_Preview {
     // run the import
     $importJob->runImport($this);
 
-    // update cache after we done with runImport
-    if (!CRM_Core_Permission::check('view all contacts')) {
-      CRM_ACL_BAO_Cache::updateEntry($userID);
-    }
-
-    // clear all caches
+    // Clear all caches, forcing any searches to recheck the ACLs or group membership as the import
+    // may have changed it.
     CRM_Contact_BAO_Contact_Utils::clearContactCaches();
 
     // add all the necessary variables to the form
index 756c22a37c03129f18e6922b98c33faf583d4c33..5d835e957009dfa58aab365a06af6d381b864cdf 100644 (file)
@@ -230,10 +230,16 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
   public static function del($params) {
     //delete from contribution soft table
     $contributionSoft = new CRM_Contribute_DAO_ContributionSoft();
+    $contributionSoft->id = $params['id'];
+    if (!$contributionSoft->find()) {
+      return FALSE;
+    }
+    unset($params['id']);
     foreach ($params as $column => $value) {
       $contributionSoft->$column = $value;
     }
     $contributionSoft->delete();
+    return TRUE;
   }
 
   /**
index ccc82d105c5fd80320df00a4fd5592079b80184d..d64620e3f66e81adb472e6432a7c86e6390d7ad8 100644 (file)
@@ -493,6 +493,9 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard {
   public static function deleteDashlet($dashletID) {
     $dashlet = new CRM_Core_DAO_Dashboard();
     $dashlet->id = $dashletID;
+    if (!$dashlet->find(TRUE)) {
+      return FALSE;
+    }
     $dashlet->delete();
     return TRUE;
   }
index a529d1b18dcf01fa95b64f214a6372c247f301bd..0fc76b3121303967383f80f41c7982cbaef70875 100644 (file)
@@ -240,9 +240,13 @@ class CRM_Core_BAO_OptionValue extends CRM_Core_DAO_OptionValue {
   public static function del($optionValueId) {
     $optionValue = new CRM_Core_DAO_OptionValue();
     $optionValue->id = $optionValueId;
+    if (!$optionValue->find()) {
+      return FALSE;
+    }
     if (self::updateRecords($optionValueId, CRM_Core_Action::DELETE)) {
       CRM_Core_PseudoConstant::flush();
-      return $optionValue->delete();
+      $optionValue->delete();
+      return TRUE;
     }
     return FALSE;
   }
index c51bcb07fe1349e161b1e77c752f491ad610aa98..616cb4940b7967a692887579ab9981610460aef5 100644 (file)
@@ -78,14 +78,18 @@ class CRM_Core_I18n_Schema {
       // drop old indices
       if (isset($indices[$table])) {
         foreach ($indices[$table] as $index) {
-          $queries[] = "DROP INDEX {$index['name']} ON {$table}";
+          if (CRM_Core_BAO_SchemaHandler::checkIfIndexExists($table, $index['name'])) {
+            $queries[] = "DROP INDEX {$index['name']} ON {$table}";
+          }
         }
       }
       // deal with columns
       foreach ($hash as $column => $type) {
         $queries[] = "ALTER TABLE {$table} ADD {$column}_{$locale} {$type}";
-        $queries[] = "UPDATE {$table} SET {$column}_{$locale} = {$column}";
-        $queries[] = "ALTER TABLE {$table} DROP {$column}";
+        if (CRM_Core_BAO_SchemaHandler::checkIfFieldExists($table, $column)) {
+          $queries[] = "UPDATE {$table} SET {$column}_{$locale} = {$column}";
+          $queries[] = "ALTER TABLE {$table} DROP {$column}";
+        }
       }
 
       // add view
index 4de184a28c1b1d11092c1f98481327da4c5e87f4..5021859b01c0ef9a2cbabd1fa397aa7f369d5a34 100644 (file)
@@ -334,14 +334,17 @@ class CRM_Core_ManagedEntities {
         'version' => 3,
         'id' => $dao->entity_id,
       );
-      $result = civicrm_api($dao->entity_type, 'delete', $params);
-      if ($result['is_error']) {
-        $this->onApiError($dao->entity_type, 'delete', $params, $result);
-      }
+      $check = civicrm_api3($dao->entity_type, 'get', $params);
+      if ((bool) $check['count']) {
+        $result = civicrm_api($dao->entity_type, 'delete', $params);
+        if ($result['is_error']) {
+          $this->onApiError($dao->entity_type, 'delete', $params, $result);
+        }
 
-      CRM_Core_DAO::executeQuery('DELETE FROM civicrm_managed WHERE id = %1', array(
-        1 => array($dao->id, 'Integer'),
-      ));
+        CRM_Core_DAO::executeQuery('DELETE FROM civicrm_managed WHERE id = %1', array(
+          1 => array($dao->id, 'Integer'),
+        ));
+      }
     }
   }
 
index 49921a411e938aed2d9d0df83efae17642b79100..b2a608f4664a92d1c42d72f3db0e0c6d8c3342b5 100644 (file)
@@ -870,6 +870,11 @@ WHERE  civicrm_participant.id = {$participantId}
    * @return \CRM_Event_DAO_Participant
    */
   public static function deleteParticipant($id) {
+    $participant = new CRM_Event_DAO_Participant();
+    $participant->id = $id;
+    if (!$participant->find()) {
+      return FALSE;
+    }
     CRM_Utils_Hook::pre('delete', 'Participant', $id, CRM_Core_DAO::$_nullArray);
 
     $transaction = new CRM_Core_Transaction();
@@ -902,8 +907,6 @@ WHERE  civicrm_participant.id = {$participantId}
       CRM_Core_BAO_Note::del($noteId, FALSE);
     }
 
-    $participant = new CRM_Event_DAO_Participant();
-    $participant->id = $id;
     $participant->delete();
 
     $transaction->commit();
index 802c7363d35d198c0e2604d184187ae89efd407f..05308d69b81cc4497a7f199c29a1f6636e09a7b0 100644 (file)
@@ -80,7 +80,9 @@ class CRM_Event_BAO_ParticipantStatusType extends CRM_Event_DAO_ParticipantStatu
 
     $dao = new CRM_Event_DAO_ParticipantStatusType();
     $dao->id = $id;
-    $dao->find(TRUE);
+    if (!$dao->find()) {
+      return FALSE;
+    }
     $dao->delete();
     return TRUE;
   }
index 402a77df526a0adca8689c589355ec696a87270e..2da0f090f964a0ad7522723439fe6addf163fa51 100644 (file)
@@ -396,7 +396,7 @@ AND    (TABLE_NAME LIKE 'log_civicrm_%' $nonStandardTableNameString )
       if (!empty($cols[$alterType])) {
         foreach ($cols[$alterType] as $col) {
           $line = $this->_getColumnQuery($col, $create);
-          CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table {$alterType} {$line}");
+          CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table {$alterType} {$line}", array(), TRUE, NULL, FALSE, FALSE);
         }
       }
     }
@@ -407,7 +407,7 @@ AND    (TABLE_NAME LIKE 'log_civicrm_%' $nonStandardTableNameString )
       foreach ($cols['OBSOLETE'] as $col) {
         $line = $this->_getColumnQuery($col, $create);
         // This is just going to make a not null column to nullable
-        CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table MODIFY {$line}");
+        CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table MODIFY {$line}", array(), TRUE, NULL, FALSE, FALSE);
       }
     }
 
@@ -426,7 +426,7 @@ AND    (TABLE_NAME LIKE 'log_civicrm_%' $nonStandardTableNameString )
    * @return array
    */
   private function _getCreateQuery($table) {
-    $dao = CRM_Core_DAO::executeQuery("SHOW CREATE TABLE {$table}");
+    $dao = CRM_Core_DAO::executeQuery("SHOW CREATE TABLE {$table}", array(), TRUE, NULL, FALSE, FALSE);
     $dao->fetch();
     $create = explode("\n", $dao->Create_Table);
     return $create;
index 3e9033b14acbdc4ecfe451ea02e94fda320b161f..5cdd7b9810107f33e7817aebdc7f92e64be2fa82 100644 (file)
@@ -207,6 +207,9 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus {
     //delete from membership Type table
     $membershipStatus = new CRM_Member_DAO_MembershipStatus();
     $membershipStatus->id = $membershipStatusId;
+    if (!$membershipStatus->find()) {
+      throw new CRM_Core_Exception(ts('Cannot delete membership status ' . $membershipStatusId));
+    }
     $membershipStatus->delete();
     CRM_Member_PseudoConstant::flush('membershipStatus');
     $membershipStatus->free();
index 485280bd74388dff1f7e43e6945ee069cb96606b..284b71a5ea31d9b53598fb3d3779830e26779141 100644 (file)
@@ -604,6 +604,8 @@ HTACCESS;
     // make everything absolute from the baseFilePath
     $basePath = ($basePath === NULL) ? self::baseFilePath() : $basePath;
 
+    // ensure that $basePath has a trailing slash
+    $basePath = self::addTrailingSlash($basePath);
     return $basePath . $directory;
   }
 
index 432387719041ebb08d0730ef9d590aec51d542aa..e4556ef6b16ab38b8b176808d470a99c2de760e0 100644 (file)
@@ -61,7 +61,7 @@ It could perhaps be thinned by 30-60% by making more directives.
           ng-model="mailing.recipients.groups.base[0]"
           ng-required="true"
           >
-          <option ng-repeat="grp in crmMailingConst.groupNames | orderBy:'title'" value="{{grp.id}}">{{grp.title}}</option>
+          <option ng-repeat="grp in crmMailingConst.groupNames | filter:{is_hidden:0} | orderBy:'title'" value="{{grp.id}}">{{grp.title}}</option>
         </select>
       </div>
     </span>
index f54c8bf9beb86e146a4acd0fd7f06cc0f0179025..ad15847d1dd9adad1e79ec595faf95c8f3085aff 100644 (file)
@@ -117,5 +117,9 @@ function _civicrm_api3_activity_type_create_spec(&$params) {
  * @deprecated use OptionValue api
  */
 function civicrm_api3_activity_type_delete($params) {
-  return civicrm_api3_create_success(CRM_Core_BAO_OptionValue::del($params['id']), $params);
+  $result = CRM_Core_BAO_OptionValue::del($params['id']);
+  if ($result) {
+    return civicrm_api3_create_success(TRUE, $params);
+  }
+  throw new API_Exception("Failure to delete activity type id {$params['id']}");
 }
index 3bfe307f2f31146b4a1e4400df542eba840bd5f9..30b7a46e68205d6f00a0626336f0b1140938365d 100644 (file)
@@ -65,8 +65,11 @@ function _civicrm_api3_contribution_soft_create_spec(&$params) {
  */
 function civicrm_api3_contribution_soft_delete($params) {
   // Non standard BAO - we have to write custom code to cope.
-  CRM_Contribute_BAO_ContributionSoft::del(array('id' => $params['id']));
-
+  $result = CRM_Contribute_BAO_ContributionSoft::del(array('id' => $params['id']));
+  if (!$result) {
+    throw new API_Exception('Cannot delete contributionSoft ' . $params['id']);
+  }
+  civicrm_api3_create_success(TRUE);
 }
 
 /**
index 904fc837cfe9e3c1883f69923e1ce49947fec301..77f6d30bd6141e0d46e3c67f2b858f32f1101fa3 100644 (file)
@@ -93,6 +93,6 @@ function civicrm_api3_dashboard_delete($params) {
     return civicrm_api3_create_success(1, $params, 'Dashboard', 'delete');
   }
   else {
-    return civicrm_api3_create_error('Could not delete dashlet');
+    throw new API_Exception('Could not delete dashlet');
   }
 }
index c0e1188ea7d118dfe446d88a6532b7c86b3d5e3a..f53172961eaf1d0ed1c80e8881ff38c45f679a27 100644 (file)
@@ -97,7 +97,10 @@ function civicrm_api3_group_get($params) {
  *   API result array
  */
 function civicrm_api3_group_delete($params) {
-
+  $group = civicrm_api3_group_get(array('id' => $params['id']));
+  if ($group['count'] == 0) {
+    throw new API_Exception('Could not delete group ' . $params['id']);
+  }
   CRM_Contact_BAO_Group::discard($params['id']);
   return civicrm_api3_create_success(TRUE);
 }
index 1546b692a9c52f6d27f5093445f05b90519832f0..e296e18297ad20c8cf3c66468f35954fbdb0353d 100644 (file)
@@ -146,6 +146,10 @@ function civicrm_api3_group_contact_create($params) {
  * @deprecated
  */
 function civicrm_api3_group_contact_delete($params) {
+  $groupContact = civicrm_api3('GroupContact', 'get', $params);
+  if ($groupContact['count'] == 0) {
+    throw new API_Exception('Cannot Delete GroupContact');
+  }
   $params['status'] = CRM_Utils_Array::value('status', $params, empty($params['skip_undelete']) ? 'Removed' : 'Deleted');
   // "Deleted" isn't a real option so skip the api wrapper to avoid pseudoconstant validation
   return civicrm_api3_group_contact_create($params);
index e859cf55f515c8b092d581b4b504b7bc84033110..9b9696ecfdc6732be6d503e0eaccd49c19b143e0 100644 (file)
@@ -634,7 +634,7 @@ function civicrm_api3_job_disable_expired_relationships($params) {
 function civicrm_api3_job_group_rebuild($params) {
   $lock = Civi::lockManager()->acquire('worker.core.GroupRebuild');
   if (!$lock->isAcquired()) {
-    throw new API_Exception('Could not acquire lock, another EmailProcessor process is running');
+    throw new API_Exception('Could not acquire lock, another GroupRebuild process is running');
   }
 
   $limit = CRM_Utils_Array::value('limit', $params, 0);
index 499c823fe35736d25460b3c97561462e9aabb7ed..696de0ad4a331d422a6b8350c147fad090c2de88 100644 (file)
@@ -126,7 +126,10 @@ function civicrm_api3_membership_status_update($params) {
 function civicrm_api3_membership_status_delete($params) {
 
   $memberStatusDelete = CRM_Member_BAO_MembershipStatus::del($params['id'], TRUE);
-  return $memberStatusDelete ? civicrm_api3_create_error($memberStatusDelete['error_message']) : civicrm_api3_create_success();
+  if ($memberStatusDelete) {
+    throw new API_Exception($memberStatusDelete['error_message']);
+  }
+  return civicrm_api3_create_success();
 }
 
 /**
index e34f3ec28b44bd0cf8a7ab6f506046a288437960..2e5cd6d4a14030c2888f8d802064c847b553e327 100644 (file)
@@ -106,11 +106,12 @@ function _civicrm_api3_option_value_create_spec(&$params) {
 function civicrm_api3_option_value_delete($params) {
   // We will get the option group id before deleting so we can flush pseudoconstants.
   $optionGroupID = civicrm_api('option_value', 'getvalue', array('version' => 3, 'id' => $params['id'], 'return' => 'option_group_id'));
-  if (CRM_Core_BAO_OptionValue::del((int) $params['id'])) {
+  $result = CRM_Core_BAO_OptionValue::del($params['id']);
+  if ($result) {
     civicrm_api('option_value', 'getfields', array('version' => 3, 'cache_clear' => 1, 'option_group_id' => $optionGroupID));
     return civicrm_api3_create_success();
   }
   else {
-    civicrm_api3_create_error('Could not delete OptionValue ' . $params['id']);
+    throw new API_Exception('Could not delete OptionValue ' . $params['id']);
   }
 }
index fc3549f995fe68667f90382152d59e79ee1ba6a6..c433fc5b9aee790c30bee5b5b5c7f20b295fda10 100644 (file)
@@ -77,5 +77,5 @@ function civicrm_api3_participant_status_type_delete($params) {
     return civicrm_api3_create_success(TRUE);
   }
 
-  return civicrm_api3_create_error(TRUE);
+  throw new API_Exception('Could not delete participant status type id ' . $params['id']);
 }
index 9b624639e44ba2d436c5fb771c21fa20be3abb21..b1248f6c2b8913333d180b9f3c141b4b08abf92a 100644 (file)
@@ -39,7 +39,7 @@
  * @return array
  */
 function civicrm_api3_system_log_delete($params) {
-  return _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, TRUE, 'SystemLog');
+  return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 }
 
 /**
index 078d9717e26993ac76724a5127b1ba309b607a73..96f616b32e60236b1a41c4e78ce17eb6cfbb0b30 100644 (file)
@@ -1457,9 +1457,14 @@ function _civicrm_api3_basic_delete($bao_name, &$params) {
   _civicrm_api3_check_edit_permissions($bao_name, array('id' => $params['id']));
   $args = array(&$params['id']);
   if (method_exists($bao_name, 'del')) {
-    $bao = call_user_func_array(array($bao_name, 'del'), $args);
-    if ($bao !== FALSE) {
-      return civicrm_api3_create_success(TRUE);
+    $dao = new $bao_name();
+    $dao->id = $params['id'];
+    if ($dao->find()) {
+      $bao = call_user_func_array(array($bao_name, 'del'), $args);
+      if ($bao !== FALSE) {
+        return civicrm_api3_create_success();
+      }
+      throw new API_Exception('Could not delete entity id ' . $params['id']);
     }
     throw new API_Exception('Could not delete entity id ' . $params['id']);
   }
index 711f7fae0b3c62aa7193c77c976d82a0ce74edf1..d73bddfbdf824851270131204086b72e22328e06 100644 (file)
@@ -9,10 +9,8 @@
   float: left;
   margin: 0;
   /* padding-bottom and min-height make sure that there is always a sizable drop zone. */
-  min-height: 400px;
-  height: 400px;
-  height: auto !important;
-  padding: 0 0 250px;
+  min-height: 200px;
+  padding: 0 0 40px;
   list-style-type: none;
 }
 
index 78462bdaeb98e2d39842aabf929a047557b16480..1dacf49824e5798f9556fdff22ebb4583b1fea0c 100644 (file)
   {/if}
   {if $contributionMode}
   <div class="help">
-    {if $contactId}
-      {ts 1=$displayName 2=$contributionMode|upper}Use this form to {if $payNow} edit {else} submit a new {/if} contribution on behalf of %1. <strong>A
-        %2 transaction will be submitted</strong> using the selected payment processor.{/ts}
+    {if $contactId && $payNow}
+      {ts 1=$displayName 2=$contributionMode|upper}Use this form to edit a contribution on behalf of %1. <strong>A
+      %2 transaction will be submitted</strong> using the selected payment processor.{/ts}
+    {elseif $contactId}
+      {ts 1=$displayName 2=$contributionMode|upper}Use this form to submit a new contribution on behalf of %1. <strong>A
+      %2 transaction will be submitted</strong> using the selected payment processor.{/ts}
     {else}
       {ts 1=$displayName 2=$contributionMode|upper}Use this form to submit a new contribution. <strong>A %2 transaction will be submitted</strong> using the selected payment processor.{/ts}
     {/if}
diff --git a/tests/mock/extension_browser_results/single b/tests/mock/extension_browser_results/single
new file mode 100644 (file)
index 0000000..ef9b00a
--- /dev/null
@@ -0,0 +1 @@
+{"org.civicrm.module.cividiscount":"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<extension key=\"org.civicrm.module.cividiscount\" type=\"module\">\n  <file>cividiscount<\/file>\n  <name>CiviDiscount<\/name>\n  <description>Enables discount codes and automatic discounts for events and memberships.<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">\n      http:\/\/civicrm.org\/extension\/cividiscount-extension\n    <\/url>\n    <url desc=\"Documentation\">\n      https:\/\/github.com\/dlobo\/org.civicrm.module.cividiscount\/\n    <\/url>\n    <url desc=\"Support\">http:\/\/civicrm.stackexchange.com<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>CiviCRM LLC<\/author>\n    <email>info@civicrm.org<\/email>\n  <\/maintainer>\n  <releaseDate>2016-03-04<\/releaseDate>\n  <version>3.2<\/version>\n  <compatibility>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>\n    For support, please contact the team on the forums. (http:\/\/forum.civicrm.org)\n  <\/comments>\n  <civix>\n    <namespace>CRM\/CiviDiscount<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/dlobo\/org.civicrm.module.cividiscount\/archive\/3.2.zip<\/downloadUrl><develStage>stable<\/develStage><\/extension>\n","nz.co.fuzion.extendedreport":"<?xml version=\"1.0\"?>\n<extension key=\"nz.co.fuzion.extendedreport\" type=\"module\">\n    <downloadUrl>https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.extendedreport\/archive\/2.4.zip<\/downloadUrl>\n    <file>extendedreport<\/file>\n    <name>ExtendedReport<\/name>\n    <description>Extended reports<\/description>\n    <license>AGPL<\/license>\n    <urls>\n        <url desc=\"Main Extension Page\">http:\/\/civicrm.org<\/url>\n        <url desc=\"Support\">http:\/\/forum.civicrm.org<\/url>\n        <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n    <\/urls>\n    <maintainer>\n        <author>Eileen McNaughton<\/author>\n        <email>eileen@fuzion.co.nz<\/email>\n    <\/maintainer>\n    <releaseDate>2016-07-25<\/releaseDate>\n    <version>2.4<\/version>\n    <develStage>stable<\/develStage>\n    <compatibility>\n        <ver>4.4<\/ver>\n        <ver>4.6<\/ver>\n        <ver>4.7<\/ver>\n    <\/compatibility>\n    <comments>Extended reports create other report options such as crosstab urls, multiple contact custom fields, price\n        set reports\n    <\/comments>\n    <civix>\n        <namespace>CRM\/Extendedreport<\/namespace>\n    <\/civix>\n<\/extension>\n","ca.bidon.reporterror":"<?xml version=\"1.0\"?>\n<extension key=\"ca.bidon.reporterror\" type=\"module\">\n  <file>reporterror<\/file>\n  <name>CiviCRM Report Error<\/name>\n  <description>Advanced error handler for CiviCRM that sends an e-mail with detailed information when fatal errors are encountered.<\/description>\n  <license>AGPL 3<\/license>\n  <maintainer>\n    <author>Mathieu Lutfy<\/author>\n    <email>mathieu@bidon.ca<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/github.com\/mlutfy\/ca.bidon.reporterror<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/mlutfy\/ca.bidon.reporterror\/blob\/master\/README.md<\/url>\n    <url desc=\"Support\">http:\/\/forum.civicrm.org\/index.php\/board,57.0.html<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <releaseDate>2016-03-06<\/releaseDate>\n  <version>2.9<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.2<\/ver>\n    <ver>4.3<\/ver>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n  <civix>\n    <namespace>CRM\/ReportError<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/mlutfy\/ca.bidon.reporterror\/archive\/2.9.zip<\/downloadUrl><\/extension>\n","org.civicrm.multisite":"<?xml version=\"1.0\"?>\n<extension key=\"org.civicrm.multisite\" type=\"module\">\n  <file>multisite<\/file>\n  <name>CiviCRM Multisite<\/name>\n  <description>Multisite permissioning for CiviCRM<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">http:\/\/wiki.civicrm.org\/confluence\/pages\/viewpage.action?pageId=86213708<\/url>\n    <url desc=\"Support\">http:\/\/forum.civicrm.org\/index.php\/board,51.0.html<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <license>AGPL<\/license>\n  <maintainer>\n    <author>CiviCRM LLC<\/author>\n    <email>info@civicrm.org<\/email>\n  <\/maintainer>\n  <releaseDate>2016-07-25<\/releaseDate>\n  <version>2.5<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>This is a port of the CiviCRM multisite module to an extension. You will need to review the changes in this version<\/comments>\n  <civix>\n    <namespace>CRM\/Multisite<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/eileenmcnaughton\/org.civicrm.multisite\/archive\/2.5.zip<\/downloadUrl><\/extension>\n","org.civicrm.sms.twilio":"<?xml version=\"1.0\"?>\n<extension key=\"org.civicrm.sms.twilio\" type=\"module\">\n  <downloadUrl>https:\/\/github.com\/civicrm\/org.civicrm.sms.twilio\/archive\/1.1.1.zip<\/downloadUrl>\n  <file>twilio<\/file>\n  <name>twilio<\/name>\n  <description>Twilio integration allows delivering short message service (SMS) messages through its Twilio Gateway to mobile phone users.<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">http:\/\/civicrm.org<\/url>\n    <url desc=\"Documentation\">http:\/\/wiki.civicrm.org\/confluence\/display\/CRMDOC\/Setting+up+a+SMS+Provider+for+CiviSMS<\/url>\n    <url desc=\"Support\">http:\/\/forum.civicrm.org<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <license>AGPL<\/license>\n  <maintainer>\n    <author>Community Contributed<\/author>\n    <email>info@civicrm.org<\/email>\n  <\/maintainer>\n  <releaseDate>2016-06-24<\/releaseDate>\n  <version>1.1.1<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>For support, please contact project team on the forums.<\/comments>\n<\/extension>\n","com.webaccessglobal.module.civimobile":"<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<extension key=\"com.webaccessglobal.module.civimobile\" type=\"module\">\n  <downloadUrl>https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile\/archive\/2.0.zip<\/downloadUrl>\n  <file>civimobile<\/file>\n  <name>CiviMobile<\/name>\n  <description>Mobile interface for CiviCRM<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">http:\/\/civicrm.org\/extensions\/civimobile<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile<\/url>\n    <url desc=\"Support\">https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile\/issues<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Web Access<\/author>\n    <email>info@webaccessglobal.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-04-12<\/releaseDate>\n  <version>2.0<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>For support, please contact the team on github. (https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile\/issues)<\/comments>\n<\/extension>\n","net.ourpowerbase.sumfields":"<?xml version=\"1.0\"?>\n<extension key=\"net.ourpowerbase.sumfields\" type=\"module\">\n  <file>sumfields<\/file>\n  <name>Summary Fields<\/name>\n  <description>The Summary Fields extension creates read-only custom data fields that extend Contact and are automatically populated with up-to-date totals such as total lifetime contributions, last contribution amount, last attended event, etc.<\/description>\n  <license>GPL version 3<\/license>\n  <maintainer>\n    <author>Jamie McClelland\/Progressive Technology Project<\/author>\n    <email>jamie@progressivetech.org<\/email>\n  <\/maintainer>\n  <releaseDate>2016-07-27<\/releaseDate>\n  <version>2.0.6<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>This extension adds custom data fields and triggers to your database. Disabling this extension will cause the custom data fields to be deleted and triggers removed.<\/comments>\n  <civix>\n    <namespace>CRM\/Sumfields<\/namespace>\n  <\/civix>\n  <urls>\n    <url description=\"Main Extension Page\">https:\/\/github.com\/progressivetech\/net.ourpowerbase.sumfields<\/url>\n    <url description=\"Documentation\">https:\/\/github.com\/progressivetech\/net.ourpowerbase.sumfields<\/url>\n  <\/urls>\n<downloadUrl>https:\/\/github.com\/progressivetech\/net.ourpowerbase.sumfields\/archive\/v2.0.6.zip<\/downloadUrl><\/extension>\n","uk.co.compucorp.civicrm.booking":"<?xml version=\"1.0\"?>\n<extension key=\"uk.co.compucorp.civicrm.booking\" type=\"module\">\n  <file>booking<\/file>\n  <name>CiviBooking<\/name>\n  <description>A CMS independent extension to allow organisations to manage a group of resources (i.e. rooms) offering these to constituents for a fee.<\/description>\n  <license>the GNU Affero General Public License 3 (GNU AGPL 3) and the CiviCRM Licensing Exception.<\/license>\n  <maintainer>\n    <author>Erawat Chamanont, Jamie Novick, Guanhuan Chen<\/author>\n    <email>jamie@compucorpc.o.uk, guanhuan@compucorp.co.uk<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">http:\/\/civicrm.org\/extensions\/civibooking<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/compucorp\/civibooking<\/url>\n    <url desc=\"Support\">support@compucorp.co.uk<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <documentation\/>\n  <releaseDate>2016-07-25<\/releaseDate>\n  <version>1.5<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n  <civix>\n    <namespace>CRM\/Booking<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/compucorp\/civibooking\/archive\/v1.5.zip<\/downloadUrl><\/extension>\n","org.civicrm.volunteer":"<?xml version=\"1.0\"?>\n<extension key=\"org.civicrm.volunteer\" type=\"module\">\n  <file>volunteer<\/file>\n  <name>CiviVolunteer<\/name>\n  <description>The CiviVolunteer extension provides tools for signing up, managing, and tracking volunteers.<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Ginkgo Street Labs; CiviCRM, LLC; and the CiviCRM community<\/author>\n    <email>inquire@ginkgostreet.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-08-10<\/releaseDate>\n  <version>4.6-2.1.2<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>\n    Developed by Ginkgo Street Labs and CiviCRM, LLC with contributions from the community. Special thanks to Friends of Georgia State Parks &amp; Historic Sites for funding the initial release, and to The Manhattan Neighborhood Network for funding the 1.4 release.\n  <\/comments>\n  <civix>\n    <namespace>CRM\/Volunteer<\/namespace>\n  <\/civix>\n  <urls>\n    <url desc=\"Documentation\">http:\/\/civicrm.github.io\/org.civicrm.volunteer\/docs<\/url>\n  <\/urls>\n<downloadUrl>https:\/\/github.com\/civicrm\/org.civicrm.volunteer\/archive\/v4.6-2.1.2.zip<\/downloadUrl><\/extension>\n","nz.co.fuzion.csvimport":"<?xml version=\"1.0\"?>\n<extension key=\"nz.co.fuzion.csvimport\" type=\"module\">\n  <file>csvimport<\/file>\n  <name>CSV GUI Import to api<\/name>\n  <description>Simply makes gui import available to api<\/description>\n  <license>AGPL<\/license>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.csvimport\/blob\/master\/README<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.csvimport\/blob\/master\/README<\/url>\n    <url desc=\"Support\">http:\/\/forum.civicrm.org<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n  <maintainer>\n    <author>Eileen<\/author>\n    <email>eileen@fuzion.co.nz<\/email>\n  <\/maintainer>\n  <releaseDate>2016-06-11<\/releaseDate>\n  <version>1.2<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>This is module which adds a UI to api create actions. There are no plans to provide free support for it<\/comments>\n  <civix>\n    <namespace>CRM\/Csvimport<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.csvimport\/archive\/1.2.zip<\/downloadUrl><\/extension>\n","com.chrischinchilla.ewayrecurring":"<?xml version=\"1.0\"?>\n<extension key=\"com.chrischinchilla.ewayrecurring\" type=\"module\">\n  <file>ewayrecurring<\/file>\n  <name>eWay Recurring<\/name>\n  <description>Recurring payments payment processor for eWay<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">http:\/\/civicrm.org<\/url>\n    <url desc=\"Documentation\">http:\/\/civicrm.org<\/url>\n    <url desc=\"Support\">http:\/\/civicrm.org<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org<\/url>\n  <\/urls>\n  <license>AGPL<\/license>\n  <maintainer>\n    <author>Melbourne CiviCRM<\/author>\n    <email>noreply@civicrm.org<\/email>\n  <\/maintainer>\n  <releaseDate>2016-09-04<\/releaseDate>\n  <version>1.2<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n    <civix>\n    <namespace>CRM\/Ewayrecurring<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/ChrisChinchilla\/CiviCRM-eWay-recurring-payment-processor\/archive\/1.2.zip<\/downloadUrl><\/extension>\n","nz.co.fuzion.entitysetting":"<?xml version=\"1.0\"?>\n<extension key=\"nz.co.fuzion.entitysetting\" type=\"module\">\n  <file>entitysetting<\/file>\n  <name>Entity Settings Helper Extension<\/name>\n  <description>This module provides a mechanism for managing settings associated with CiviCRM entities without a table per setting<\/description>\n  <license>AGPL<\/license>\n  <maintainer>\n    <author>Eileen<\/author>\n    <email>eileen@fuzion.co.nz<\/email>\n  <\/maintainer>\n  <releaseDate>2016-06-17<\/releaseDate>\n  <urls>\n    <url desc=\"Main Extension Page\">http:\/\/civicrm.org<\/url>\n    <url desc=\"Support\">http:\/\/forum.civicrm.org<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.entitysetting\/blob\/master\/README.md<\/url>\n  <\/urls>\n  <version>1.2<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.2<\/ver>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>This extension is provided to be a 'soft' dependency for other extension. It does not provide functionality itself<\/comments>\n  <civix>\n    <namespace>CRM\/Entitysetting<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.entitysetting\/archive\/1.2.zip<\/downloadUrl><\/extension>\n","biz.jmaconsulting.grantapplications":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<extension key=\"biz.jmaconsulting.grantapplications\" type=\"module\">\n  <downloadUrl>https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/archive\/v1.5.zip<\/downloadUrl>\n  <file>grantapplications<\/file>\n  <name>Grant Applications<\/name>\n  <description>This extension enhances profile creation for Grants. Applicants can submit online grant applications after filling in fields that are configured through CiviProfile. Core and custom grant fields can be added to CiviProfiles to collect information about various applicants that will be applying online for grants. Online grant application pages can be created and managed from the grant dashboard.<\/description>\n  <urls>\n    <url desc=\"Support\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/issues?state=open<\/url>\n    <url desc=\"Main Extension Page\">\n      https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/wiki\/About-grant-applications\n    <\/url>\n    <url desc=\"Installation Instructions for 1.5\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/blob\/4.7\/README.md<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>JMA Consulting<\/author>\n    <email>joe.murray@jmaconsulting.biz<\/email>\n  <\/maintainer>\n  <releaseDate>2016-03-30<\/releaseDate>\n  <version>1.5<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n  <civix>\n    <namespace>CRM\/Grantapplications<\/namespace>\n  <\/civix>\n<\/extension>\n","biz.jmaconsulting.ode":"<?xml version=\"1.0\"?>\n<extension key=\"biz.jmaconsulting.ode\" type=\"module\">\n  <downloadUrl>https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/archive\/v1.4.zip<\/downloadUrl>\n  <file>ode<\/file>\n  <name>Outbound Domain Enforcement<\/name>\n  <description>This CiviCRM extension is designed to preserve the email reputation of your server and its IP by ensuring that all outbound emailis sent from an address with the same domain as the System-generated Mail Settings From Email Address configured at Administer &gt; Communications &gt; Organization Address and Contact Info.<\/description>\n  <urls>\n    <url desc=\"Support\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/issues?state=open<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/blob\/master\/README.md<\/url>\n    <url desc=\"Installation Instructions for 1.4\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/blob\/master\/README.md<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <license>AGPL 3.0<\/license>\n  <maintainer>\n    <author>JMA Consulting<\/author>\n    <email>joe.murray@jmaconsulting.biz<\/email>\n  <\/maintainer>\n  <releaseDate>2016-04-04<\/releaseDate>\n  <version>1.4<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>Thanks to Brescia University College for sponsoring the development of this module.<\/comments>\n  <civix>\n    <namespace>CRM\/Ode<\/namespace>\n  <\/civix>\n<\/extension>\n","biz.jmaconsulting.olarkchat":"<?xml version=\"1.0\"?>\n<extension key=\"biz.jmaconsulting.olarkchat\" type=\"module\">\n  <downloadUrl>https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.olarkchat\/archive\/1.3.zip<\/downloadUrl>\n  <file>olarkchat<\/file>\n  <name>Olark Chat Integration<\/name>\n  <description>Olark is a chat service that enables web site visitors to chat with staff of an organization. It has a good set of features for services in this space (http:\/\/www.olark.com\/features). This extension integrates the service with CiviCRM by posting chat transcripts as CiviCRM activities attached to the visitor's existing or newly created contact record and assigned to the relevant staff person's record.<\/description>\n  <urls>\n    <url desc=\"Support\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.olarkchat\/issues?state=open<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.olarkchat\/blob\/1.0\/README.md<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>JMA Consulting<\/author>\n    <email>joe.murray@jmaconsulting.biz<\/email>\n  <\/maintainer>\n  <releaseDate>2016-02-26<\/releaseDate>\n  <version>1.3<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n  <civix>\n    <namespace>CRM\/Olarkchat<\/namespace>\n  <\/civix>\n<\/extension>\n","com.pogstone.fancytokens":"<?xml version=\"1.0\"?>\n<extension key=\"com.pogstone.fancytokens\" type=\"module\">\n  <file>fancytokens<\/file>\n  <name>Save time preparing newsletters: Fancy tokens for upcoming events, contribution pages, and forms<\/name>\n  <description>Additional tokens for contribution pages, upcoming event lists, individual event registration pages, and stand-alone CiviCRM profiles. If Drupal WebForm is in use, then any webforms that use CiviCRM integration will also be available as a token.  All hyperlinks include the recipient checksum as appropriate. To see the additional tokens, start composing an email and click 'insert tokens'.<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/civicrm.org\/extensions\/fancy-tokens<\/url>\n    <url desc=\"Documentation\">https:\/\/civicrm.org\/extensions\/fancy-tokens<\/url>\n    <url desc=\"Support\">https:\/\/github.com\/sgladstone\/com.pogstone.fancytokens\/issues<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Sarah Gladstone<\/author>\n    <email>info@fountaintribe.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-09-05<\/releaseDate>\n  <version>4.0<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n     <ver>4.6<\/ver>\n     <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n  <civix>\n    <namespace>CRM\/Fancytokens<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/sgladstone\/com.pogstone.fancytokens\/archive\/4.0.zip<\/downloadUrl><\/extension>\n","com.aghstrategies.uscounties":"<?xml version=\"1.0\"?>\n<extension key=\"com.aghstrategies.uscounties\" type=\"module\">\n  <file>uscounties<\/file>\n  <name>US County Loader<\/name>\n  <description>Loads counties of the United States<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Andrew Hunt<\/author>\n    <email>andrew@aghstrategies.com<\/email>\n  <\/maintainer>\n  <releaseDate>2015-06-08<\/releaseDate>\n  <version>1.1<\/version>\n  <develStage>stable<\/develStage>\n  <urls>\n\t  <url desc=\"documentation\">http:\/\/aghstrategies.com\/counties<\/url>\n  <\/urls>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>Use this extension to load counties for the United States.  After installation, this extension does nothing (and can even be disabled).<\/comments>\n<downloadUrl>https:\/\/github.com\/agh1\/com.aghstrategies.uscounties\/archive\/1.1.zip<\/downloadUrl><\/extension>\n","net.ourpowerbase.report.advancedfundraising":"<?xml version=\"1.0\"?>\n<extension key=\"net.ourpowerbase.report.advancedfundraising\" type=\"module\">\n  <file>advancedfundraising<\/file>\n  <name>Advanced Fundraising Reports<\/name>\n  <description>Reports to help fundraisers view their progress sponsored by PTP<\/description>\n  <urls>\n    <url desc=\"specifications\">http:\/\/wiki.civicrm.org\/confluence\/display\/CRM\/CiviEngage+Enhancements+for+fund-raising<\/url>\n  <\/urls>\n  <license>agpl<\/license>\n  <maintainer>\n    <author>Eileen McNaughton<\/author>\n    <email>eileen@fuzion.co.nz<\/email>\n  <\/maintainer>\n  <releaseDate>2016-08-01<\/releaseDate>\n  <version>1.0.5<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n  <civix>\n    <namespace>CRM\/AdvancedFundraising<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/jmcclelland\/net.ourpowerbase.report.advancedfundraising\/archive\/v1.0.5.zip<\/downloadUrl><\/extension>\n","nz.co.fuzion.omnipaymultiprocessor":"<?xml version=\"1.0\"?>\n<extension key=\"nz.co.fuzion.omnipaymultiprocessor\" type=\"module\">\n  <file>omnipaymultiprocessor<\/file>\n  <name>Omnipay multiprocessor support<\/name>\n  <description>Support for Multiple processors using OmniPay library<\/description>\n  <license>AGPL<\/license>\n  <maintainer>\n    <author>eileen<\/author>\n    <email>eileen@fuzion.co.nz<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.omnipaymultiprocessor<\/url>\n    <url desc=\"Documentation\">https:\/\/civicrm.org\/blogs\/eileen\/rethinking-payment-processing<\/url>\n    <url desc=\"Support\">http:\/\/forum.civicrm.org<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <releaseDate>2016-06-17<\/releaseDate>\n  <version>1.9<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>This module integrates the omnipay library with CiviCRM<\/comments>\n  <civix>\n    <namespace>CRM\/Omnipaymultiprocessor<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.omnipaymultiprocessor\/archive\/1.9.zip<\/downloadUrl><\/extension>\n","ca.bidon.civiexportexcel":"<?xml version=\"1.0\"?>\n<extension key=\"ca.bidon.civiexportexcel\" type=\"module\">\n  <file>civiexportexcel<\/file>\n  <name>CiviCRM Export to Excel<\/name>\n  <description>Adds the possibility to export directly to Excel from CiviCRM.<\/description>\n  <license>AGPL3<\/license>\n  <maintainer>\n    <author>Mathieu Lutfy<\/author>\n    <email>mathieu@symbiotic.coop<\/email>\n  <\/maintainer>\n  <releaseDate>2016-08-17<\/releaseDate>\n  <version>1.8<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>Commercial support available from https:\/\/www.SymbioTIC.coop<\/comments>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/github.com\/mlutfy\/ca.bidon.civiexportexcel<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/mlutfy\/ca.bidon.civiexportexcel\/blob\/master\/README.md<\/url>\n    <url desc=\"Support\">http:\/\/forum.civicrm.org\/index.php\/board,57.0.html<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <civix>\n    <namespace>CRM\/CiviExportExcel<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/mlutfy\/ca.bidon.civiexportexcel\/archive\/1.8.zip<\/downloadUrl><\/extension>\n","eu.tttp.civisualize":"<?xml version=\"1.0\"?>\n<extension key=\"eu.tttp.civisualize\" type=\"module\">\n  <file>civisualize<\/file>\n  <name>Civisualize. The missing data visualization extension<\/name>\n  <description>Framework to generate easily (as in, if you know SQL and d3 at least) better visualisation about what's happening in your CiviCRM<\/description>\n  <license>aGPL<\/license>\n  <maintainer>\n    <author>Xavier<\/author>\n    <email>xavier@tttp.eu<\/email>\n  <\/maintainer>\n  <releaseDate>2016-02-23<\/releaseDate>\n  <version>1.42<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.3<\/ver>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <civix>\n    <namespace>CRM\/Civisualize<\/namespace>\n  <\/civix>\n<urls>\n  <url desc=\"Main Extension Page\">http:\/\/github.com\/TechToThePeople\/civisualize<\/url>\n  <url desc=\"Documentation\">http:\/\/github.com\/TechToThePeople\/civisualize<\/url>\n  <url desc=\"Support\">http:\/\/forum.civicrm.org<\/url>\n  <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n<\/urls>\n\n\n<downloadUrl>https:\/\/github.com\/TechToThePeople\/civisualize\/archive\/v1.42.zip<\/downloadUrl><\/extension>\n","biz.jmaconsulting.bugp":"<?xml version=\"1.0\"?>\n<extension key=\"biz.jmaconsulting.bugp\" type=\"module\">\n  <downloadUrl>https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.bugp\/archive\/1.3.zip<\/downloadUrl>\n  <file>bugp<\/file>\n  <name>Batch Update of Grants via Profile<\/name>\n  <description>Batch Update of Grants via Profile\n    This extension provides batch update functionality for grants similar that for contacts in CiviCRM core. Up to 50 grants can be edited simultanously in a table-like grid on a webpage.\n  <\/description>\n  <urls>\n    <url desc=\"Support\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.bugp\/issues?state=open<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.bugp\/blob\/1.3\/README.md<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>JMA Consulting<\/author>\n    <email>joe.murray@jmaconsulting.biz<\/email>\n  <\/maintainer>\n  <releaseDate>2016-02-27<\/releaseDate>\n  <version>1.3<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments\/>\n  <civix>\n    <namespace>CRM\/biz.jmaconsulting.bugp<\/namespace>\n  <\/civix>\n<\/extension>\n","com.pogstone.contenttokens":"<?xml version=\"1.0\"?>\n<extension key=\"com.pogstone.contenttokens\" type=\"module\">\n  <file>contenttokens<\/file>\n  <name>Content Tokens<\/name>\n  <description>This extension provides mail merge tokens that list various content. If running under Drupal, then there are tokens for each content type, taxonomy term, and feed items. If running under WordPress then there are tokens for each post type and post term. If running under Joomla then there are tokens for each type and category. This is meant to help save time when preparing an email newsletter. If used in combination with a CMS aggregator (Such as the core Drupal aggregator module), then tokens are available for virtually any content source, local or remote. <\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Sarah Gladstone<\/author>\n    <email>info@fountaintribe.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-07-26<\/releaseDate>\n  <version>3.1<\/version>\n  <develStage>stable<\/develStage>\n  <urls>\n<url>http:\/\/fountaintribe.com<\/url>\n<url>https:\/\/github.com\/sgladstone\/com.pogstone.contenttokens<\/url>\n<\/urls>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>This extension checks which CMS its running under before attempting to do CMS-specific things. It has been tested primarily with Drupal 6, Drupal 7, and Joomla 3. It should work under WordPress, but testing has been limited. Its safe to install under any CMS or stand-alone. However no useful functionality is provided for CiviCRM stand-alone. (Please help improve this on GitHub at https:\/\/github.com\/sgladstone\/com.pogstone.contenttokens). The formatting of the results is fairly simple: each item is wrapped in a DIV tag and relative URLs are converted to absolute URLs. The original formatting from the content item is not altered. <\/comments>\n  <civix>\n    <namespace>CRM\/Contenttokens<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/sgladstone\/com.pogstone.contenttokens\/archive\/3.1.zip<\/downloadUrl><\/extension>\n","com.webaccessglobal.simpledonate":"<?xml version=\"1.0\"?>\n<extension key=\"com.webaccessglobal.simpledonate\" type=\"module\">\n  <downloadUrl>https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/archive\/1.2.zip<\/downloadUrl>\n  <file>simpledonate<\/file>\n  <name>Simple Donate<\/name>\n  <description>Simplified donation form<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">\n      https:\/\/civicrm.org\/extensions\/simple-donate\n    <\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/blob\/master\/README.md<\/url>\n    <url desc=\"Support\">https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/issues<\/url>\n    <url desc=\"Licensing\">http:\/\/civicrm.org\/licensing<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Web Access<\/author>\n    <email>info@webaccessglobal.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-04-12<\/releaseDate>\n  <version>1.2<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>For support, please contact the team on github. (https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/issues)<\/comments>\n  <civix>\n    <namespace>CRM\/SimpleDonate<\/namespace>\n  <\/civix>\n<\/extension>\n","uk.co.vedaconsulting.module.civicrmpostcodelookup":"<?xml version=\"1.0\"?>\n<extension key=\"uk.co.vedaconsulting.module.civicrmpostcodelookup\" type=\"module\">\n  <file>civicrmpostcodelookup<\/file>\n  <name>CiviCRM Postcode Lookup<\/name>\n  <description>Extension to enable postcode lookup feature in CiviCRM using AFD, Civipostcode, Experian or PostcodeAnywhere.<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Parvez Saleh<\/author>\n    <email>parvez@vedaconsulting.co.uk<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/civicrm.org\/extensions\/postcode-lookup-civicrm<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/veda-consulting\/uk.co.vedaconsulting.module.civicrmpostcodelookup\/blob\/master\/README.md<\/url>\n    <url desc=\"Support\">https:\/\/github.com\/veda-consulting\/uk.co.vedaconsulting.module.civicrmpostcodelookup<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <releaseDate>2016-08-04<\/releaseDate>\n  <version>1.3<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>Developed by Veda NFP Consulting LTD.<\/comments>\n  <civix>\n    <namespace>CRM\/Civicrmpostcodelookup<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/veda-consulting\/uk.co.vedaconsulting.module.civicrmpostcodelookup\/archive\/v1.3.zip<\/downloadUrl><\/extension>\n","org.civicoop.documents":"<?xml version=\"1.0\"?>\n<extension key=\"org.civicoop.documents\" type=\"module\">\n  <file>documents<\/file>\n  <name>Documenten<\/name>\n  <description>Documenten opslag in CiviCRM voor PUM<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>CiviCooP<\/author>\n    <email>helpdesk@civicoop.org<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/guthub.com\/CiviCooP\/org.civicoop.documents<\/url>\n    <url desc=\"documentation\">https:\/\/guthub.com\/CiviCooP\/org.civicoop.documents\/README.md<\/url>\n    <url desc=\"Support\">http:\/\/civicoop.org<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <releaseDate>2016-05-03<\/releaseDate>\n  <version>1.5<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>Extension is live at several clients<\/comments>\n  <civix>\n    <namespace>CRM\/Documents<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/CiviCooP\/org.civicoop.documents\/archive\/1.5.zip<\/downloadUrl><\/extension>\n","com.aghstrategies.idbsurvey":"<?xml version=\"1.0\"?>\n<extension key=\"com.aghstrategies.idbsurvey\" type=\"module\">\n  <file>idbsurvey<\/file>\n  <name>Individual Donor Benchmark Survey 2016<\/name>\n  <description>Calculates donor data to compare to other nonprofits in the Individual Donor Benchmark Survey.<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/civicrm.org\/extensions\/individual-donor-benchmark-survey-report<\/url>\n    <url desc=\"Documentation\">https:\/\/civicrm.org\/extensions\/individual-donor-benchmark-survey-report<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>AGH Strategies<\/author>\n    <email>info@aghstrategies.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-03-08<\/releaseDate>\n  <version>2.0<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <civix>\n    <namespace>CRM\/Idbsurvey<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/aghstrategies\/com.aghstrategies.idbsurvey\/archive\/v2.0.zip<\/downloadUrl><\/extension>\n","biz.jmaconsulting.printgrantpdfs":"<?xml version=\"1.0\"?>\n<extension key=\"biz.jmaconsulting.printgrantpdfs\" type=\"module\">\n  <file>printgrantpdfs<\/file>\n  <name>Print Grants as PDF<\/name>\n  <description>Enhances the print grants to include custom fields and attachments while generating PDFs<\/description>\n  <downloadUrl>https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/archive\/v1.2.zip<\/downloadUrl>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>JMA Consulting<\/author>\n    <email>joe.murray@jmaconsulting.biz<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Support\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/issues?state=open<\/url>\n    <url desc=\"Installation Instructions for 1.2\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/blob\/1.2\/README.md<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/blob\/1.2\/README.md<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <releaseDate>2016-02-27<\/releaseDate>\n  <version>1.2<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>This extension supports printing Grants to PDFs for download. Custom fields and attached files are included in the PDF. Printing Word documents attachments depends on the unoconv library from LibreOffice, which requires about half of LibreOffice to be installed.<\/comments>\n  <civix>\n    <namespace>CRM\/Printgrantpdfs<\/namespace>\n  <\/civix>\n<\/extension>\n","com.aghstrategies.tinymce":"<?xml version=\"1.0\"?>\n<extension key=\"com.aghstrategies.tinymce\" type=\"module\">\n  <file>tinymce<\/file>\n  <name>TinyMCE<\/name>\n  <description>Adds TinyMCE as a WYSIWYG editor for CiviCRM<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Tyrell Cook<\/author>\n    <email>tyrell@aghstrategies.com<\/email>\n  <\/maintainer>\n  <url desc=\"Documentation\">http:\/\/www.tinymce.com<\/url>\n  <url desc=\"Main Extension Page\">https:\/\/civicrm.org\/extensions\/tinymce<\/url>\n  <releaseDate>2016-01-31<\/releaseDate>\n  <version>1.3<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>TinyMCE version 4.3.3<\/comments>\n  <civix>\n    <namespace>CRM\/Tinymce<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/relldoesphp\/com.aghstrategies.tinymce\/archive\/1.3.zip<\/downloadUrl><\/extension>\n","org.woolman.genderselfidentify":"<?xml version=\"1.0\"?>\n<extension key=\"org.woolman.genderselfidentify\" type=\"module\">\n  <file>genderselfidentify<\/file>\n  <name>Gender Self-Identify<\/name>\n  <description>A more inclusive way to input gender in CiviCRM.<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Coleman Watts<\/author>\n    <email>coleman@civicrm.org<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/civicrm.org\/extensions\/gender-self-identify<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <releaseDate>2015-10-17<\/releaseDate>\n  <version>1.2<\/version>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>There are no configuration options for this extension. Simply install it and users will be able to enter gender in an unrestricted way.<\/comments>\n  <civix>\n    <namespace>CRM\/Genderselfidentify<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/woolman\/genderselfidentify\/archive\/1.2.zip<\/downloadUrl><develStage>stable<\/develStage><\/extension>\n","org.civicrm.angularprofiles":"<?xml version=\"1.0\"?>\n<extension key=\"org.civicrm.angularprofiles\" type=\"module\">\n  <file>angularprofiles<\/file>\n  <name>Angular Profiles<\/name>\n  <description>A Utility extension that provides Profile support to AngularJS pages<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Tobias Lounsbury<\/author>\n    <email>toby@ginkgostreet.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-06-20<\/releaseDate>\n  <version>4.6-1.0.2<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>\n    This extension is a utility for allowing AngularJS pages to load CiviCRM's Backbone.js-based profile editor\/selector\n    widget. It comes prebuilt with a service for loading Backbone.js and necessary files as well as an AngularJS directive\n    to turn a standard input into the profile widget.\n  <\/comments>\n  <civix>\n    <namespace>CRM\/AngularProfiles<\/namespace>\n  <\/civix>\n  <urls>\n    <url desc=\"Documentation\">https:\/\/github.com\/ginkgostreet\/org.civicrm.angularprofiles<\/url>\n  <\/urls>\n<downloadUrl>https:\/\/github.com\/ginkgostreet\/org.civicrm.angularprofiles\/archive\/v4.6-1.0.2.zip<\/downloadUrl><\/extension>\n","coop.palantetech.nodrilldown":"<?xml version=\"1.0\"?>\n<extension key=\"coop.palantetech.nodrilldown\" type=\"module\">\n  <file>nodrilldown<\/file>\n  <name>No Drill Down<\/name>\n  <description>When viewing reports, clicking on a contact's name brings you to the contact's record, not their Contact Detail Report or Contribution Detail Report.<\/description>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Jon Goldberg<\/author>\n    <email>jon@palantetech.coop<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown\/README.md<\/url>\n    <url desc=\"Support\">https:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown<\/url>\n    <url desc=\"Licensing\">http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n  <\/urls>\n  <releaseDate>2016-02-10<\/releaseDate>\n  <version>1.0<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>There is no unpaid support for this module - but if you submit a bugfix, I'll try to merge it.<\/comments>\n  <civix>\n    <namespace>CRM\/Nodrilldown<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown\/archive\/1.0.zip<\/downloadUrl><\/extension>\n","eu.tttp.bootstrapvisualize":"<?xml version=\"1.0\"?>\n<extension key=\"eu.tttp.bootstrapvisualize\" type=\"module\">\n  <file>bootstrapvisualize<\/file>\n  <name>Bootstrap layout for civisualize<\/name>\n  <description>If you theme is already based on boostrap, civisualize works fine out of the box. If you don't, enable this extension that will add the missing stylesheets so the default datavisualisations work fine<\/description>\n  <license>MIT<\/license>\n  <maintainer>\n    <author>xavier<\/author>\n    <email>xavier@tttp.eu<\/email>\n  <\/maintainer>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/github.com\/TechToThePeople\/bootstrapvisualize<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/TechToThePeople\/bootstrapvisualize<\/url>\n    <url desc=\"Support\">https:\/\/github.com\/TechToThePeople\/bootstrapvisualize<\/url>\n    <url desc=\"Licensing\">https:\/\/opensource.org\/licenses\/MIT<\/url>\n  <\/urls>\n  <releaseDate>2016-02-23<\/releaseDate>\n  <version>1.0<\/version>\n  <compatibility>\n    <ver>4.2<\/ver>\n    <ver>4.3<\/ver>\n    <ver>4.4<\/ver>\n    <ver>4.5<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>I'm not sure about the license, take the one from bootstrap<\/comments>\n  <civix>\n    <namespace>CRM\/Bootstrapvisualize<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/TechToThePeople\/bootstrapvisualize\/archive\/v1.0.zip<\/downloadUrl><develStage>stable<\/develStage><\/extension>\n","com.cividesk.email.sparkpost":"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<extension key=\"com.cividesk.email.sparkpost\" type=\"module\">\n  <file>sparkpost<\/file>\n  <name>SparkPost integration<\/name>\n  <description>This extension allows CiviCRM to send emails and process bounces through the SparkPost service.<\/description>\n  <urls>\n    <url desc=\"Main Extension Page\">https:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost<\/url>\n    <url desc=\"Documentation\">https:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost<\/url>\n    <url desc=\"Support\">https:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost\/issues?state=open<\/url>\n  <\/urls>\n  <license>AGPL-3.0<\/license>\n  <maintainer>\n    <author>Cividesk<\/author>\n    <email>info@cividesk.com<\/email>\n  <\/maintainer>\n  <releaseDate>2016-05-18<\/releaseDate>\n  <version>1.1<\/version>\n  <develStage>stable<\/develStage>\n  <compatibility>\n    <ver>4.4<\/ver>\n    <ver>4.6<\/ver>\n    <ver>4.7<\/ver>\n  <\/compatibility>\n  <comments>As always, read the documentation first! Once the extension is enabled, go to Administer &gt;&gt; System Settings &gt;&gt; Outboud Email (SparkPost) to configure and send a test email.<\/comments>\n  <civix>\n    <namespace>CRM\/Sparkpost<\/namespace>\n  <\/civix>\n<downloadUrl>https:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost\/archive\/v1.1.zip<\/downloadUrl><\/extension>\n"}
\ No newline at end of file
index ad5e4c696ea591121bbf8850b521b97b440f8598..ef40bb28e6135a4f66e5f2d9dd57e1fb82274006 100644 (file)
@@ -146,7 +146,9 @@ class CRM_Batch_Form_EntryTest extends CiviUnitTestCase {
     if ($this->callAPISuccessGetCount('membership', array('id' => $this->_membershipTypeID))) {
       $this->membershipTypeDelete(array('id' => $this->_membershipTypeID));
     }
-    $this->membershipStatusDelete($this->_membershipStatusID);
+    if ($this->callAPISuccessGetCount('MembershipStatus', array('id' => $this->_membershipStatusID))) {
+      $this->membershipStatusDelete($this->_membershipStatusID);
+    }
     $this->contactDelete($this->_contactID);
     $this->contactDelete($this->_contactID2);
     $this->contactDelete($this->_orgContactID);
index 9b120d08a91c6b461d42794824f08418573e5d8b..97dd6d5a65c0a66b2b0db0c13a92506ecc6f8866 100644 (file)
@@ -319,7 +319,7 @@ class CRM_Dedupe_MergerTest extends CiviUnitTestCase {
       FALSE
     );
 
-    $this->assertEquals(array(
+    $expectedPairs = array(
       0 => array(
         'srcID' => $this->contacts[5]['id'],
         'srcName' => 'Walt Disney Ltd',
@@ -352,7 +352,26 @@ class CRM_Dedupe_MergerTest extends CiviUnitTestCase {
         'weight' => 10,
         'canMerge' => TRUE,
       ),
-    ), $pairs);
+    );
+    usort($pairs, array(__CLASS__, 'compareDupes'));
+    usort($expectedPairs, array(__CLASS__, 'compareDupes'));
+    $this->assertEquals($expectedPairs, $pairs);
+  }
+
+  /**
+   * Function to sort $duplicate records in a stable way.
+   *
+   * @param array $a
+   * @param array $b
+   * @return int
+   */
+  public static function compareDupes($a, $b) {
+    foreach (array('srcName', 'dstName', 'srcID', 'dstID') as $field) {
+      if ($a[$field] != $b[$field]) {
+        return ($a[$field] < $b[$field]) ? 1 : -1;
+      }
+    }
+    return 0;
   }
 
   /**
diff --git a/tests/phpunit/CRM/Logging/LoggingTest.php b/tests/phpunit/CRM/Logging/LoggingTest.php
new file mode 100644 (file)
index 0000000..f0422ca
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Class CRM_Core_DAOTest
+ * @group headless
+ */
+class CRM_Logging_LoggingTest extends CiviUnitTestCase {
+
+  public function setUp() {
+    parent::setUp();
+  }
+
+  public function tearDown() {
+    CRM_Core_I18n_Schema::makeSinglelingual('en_US');
+    $logging = new CRM_Logging_Schema();
+    $logging->dropAllLogTables();
+    parent::tearDown();
+  }
+
+  /**
+   * Test creating logging schema when database is in multilingual mode.
+   */
+  public function testMultilingualLogging() {
+    CRM_Core_I18n_Schema::makeMultilingual('en_US');
+    $logging = new CRM_Logging_Schema();
+    $logging->enableLogging();
+    $value = CRM_Core_DAO::singleValueQuery("SELECT id FROM log_civicrm_contact LIMIT 1", array(), FALSE, FALSE);
+    $this->assertNotNull($value, 'Logging not enabled successfully');
+    $logging->disableLogging();
+  }
+
+
+  /**
+   * Test creating logging schema when database is in multilingual mode.
+   * Also test altering a multilingual table.
+   */
+  public function testMultilingualAlterSchemaLogging() {
+    CRM_Core_I18n_Schema::makeMultilingual('en_US');
+    $logging = new CRM_Logging_Schema();
+    $logging->enableLogging();
+    $value = CRM_Core_DAO::singleValueQuery("SELECT id FROM log_civicrm_contact LIMIT 1", array(), FALSE, FALSE);
+    $this->assertNotNull($value, 'Logging not enabled successfully');
+    $logging->disableLogging();
+    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_option_value` ADD COLUMN `logging_test` INT DEFAULT NULL", array(), FALSE, NULL, FALSE, TRUE);
+    CRM_Core_I18n_Schema::rebuildMultilingualSchema(array('en_US'));
+    $logging->enableLogging();
+    $query = CRM_Core_DAO::executeQuery("SHOW CREATE TABLE `log_civicrm_option_value`", array(), TRUE, NULL, FALSE, FALSE);
+    $query->fetch();
+    $create = explode("\n", $query->Create_Table);
+    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_option_value` DROP COLUMN `logging_test`", array(), FALSE, NULL, FALSE, TRUE);
+    $this->assertTrue(in_array("  `logging_test` int(11) DEFAULT NULL", $create));
+    $logging->disableLogging();
+  }
+
+}
index 1d952657b92634345cd269ef53dec5f253606855..0aab1a3d55c53307fa3034bd383012205d447115 100644 (file)
@@ -1266,7 +1266,10 @@ class CiviUnitTestCase extends PHPUnit_Extensions_Database_TestCase {
    */
   public function relationshipTypeDelete($relationshipTypeID) {
     $params['id'] = $relationshipTypeID;
-    $this->callAPISuccess('relationship_type', 'delete', $params);
+    $check = $this->callAPISuccess('relationship_type', 'get', $params);
+    if (!empty($check['count'])) {
+      $this->callAPISuccess('relationship_type', 'delete', $params);
+    }
   }
 
   /**
@@ -1621,7 +1624,10 @@ class CiviUnitTestCase extends PHPUnit_Extensions_Database_TestCase {
     $params = array(
       'id' => $participantID,
     );
-    return $this->callAPISuccess('Participant', 'delete', $params);
+    $check = $this->callAPISuccess('Participant', 'get', $params);
+    if ($check['count'] > 0) {
+      return $this->callAPISuccess('Participant', 'delete', $params);
+    }
   }
 
   /**
index 27611c362dc9ad9cd8cd3bd5e48867581333182d..21e7f236cf77e30c54841a20be86eda4deb996e4 100644 (file)
@@ -106,7 +106,10 @@ class api_v3_ActivityTest extends CiviUnitTestCase {
       'civicrm_uf_match',
     );
     $this->quickCleanup($tablesToTruncate, TRUE);
-    $this->callAPISuccess('option_value', 'delete', array('id' => $this->test_activity_type_id));
+    $type = $this->callAPISuccess('optionValue', 'get', array('id' => $this->test_activity_type_id));
+    if (!empty($type['count'])) {
+      $this->callAPISuccess('option_value', 'delete', array('id' => $this->test_activity_type_id));
+    }
   }
 
   /**
index e6c38ea2be326a087a3245513e88adb718403b0a..ebf7cc31134d86c524eaf7cc678a84d2f998ce85 100644 (file)
@@ -57,10 +57,12 @@ class api_v3_CustomSearchTest extends CiviUnitTestCase {
       AND option_group_id IN (SELECT id from civicrm_option_group WHERE name = "custom_search") ');
     $this->assertDBQuery(1, 'SELECT is_active FROM civicrm_option_value
       WHERE name = "CRM_Contact_Form_Search_Custom_Examplez"');
-
-    $result = $this->callAPISuccess('CustomSearch', 'delete', array(
-      'id' => $entityId,
-    ));
+    $check = $this->callAPISuccess('CustomSearch', 'get', array('id' => $entityId));
+    if (!empty($check['count'])) {
+      $result = $this->callAPISuccess('CustomSearch', 'delete', array(
+        'id' => $entityId,
+      ));
+    }
     $this->assertEquals(1, $result['count']);
     $this->assertDBQuery(0, 'SELECT count(*) FROM civicrm_option_value
       WHERE name = "CRM_Contact_Form_Search_Custom_Examplez"
index 6e63b6e7983c20de3dea10f0ecad5df031c8c20a..7bfd07f05241dc5492f7593e566d2641c2476a9e 100644 (file)
@@ -94,7 +94,10 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
     if (!empty($this->optionGroup)) {
       foreach ($this->optionGroup as $type => $value) {
         if (!empty($value['id'])) {
-          $this->callAPISuccess('OptionGroup', 'delete', array('id' => $value['id']));
+          $count = $this->callAPISuccess('OptionGroup', 'get', array('id' => $value['id']));
+          if ((bool) $count['count']) {
+            $this->callAPISuccess('OptionGroup', 'delete', array('id' => $value['id']));
+          }
         }
       }
     }
diff --git a/tests/phpunit/api/v3/ExtensionTest.php b/tests/phpunit/api/v3/ExtensionTest.php
new file mode 100644 (file)
index 0000000..1c044d2
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.7                                                |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2016                                |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *  Test APIv3 civicrm_extension_* functions
+ *
+ * @package CiviCRM_APIv3
+ * @subpackage API_Core
+ */
+
+/**
+ * Class api_v3_ExtensionTest.
+ * @group headless
+ */
+class api_v3_ExtensionTest extends CiviUnitTestCase {
+
+  public function setUp() {
+    $url = 'file://' . dirname(dirname(dirname(dirname(__FILE__)))) . '/mock/extension_browser_results';
+    Civi::settings()->set('ext_repo_url', $url);
+  }
+
+  public function tearDown() {
+    Civi::settings()->revert('ext_repo_url');
+  }
+
+  /**
+   * Test getremote.
+   */
+  public function testGetremote() {
+    $result = $this->callAPISuccess('extension', 'getremote', array());
+    $this->assertEquals('org.civicrm.module.cividiscount', $result['values'][0]['key']);
+    $this->assertEquals('module', $result['values'][0]['type']);
+    $this->assertEquals('CiviDiscount', $result['values'][0]['name']);
+  }
+
+}
index 78cfdfe20f3fed33a652ecd9987ed5bbbc79f306..3fdf2d19893753fbacf054501f73a9553ee5db37 100644 (file)
@@ -1081,6 +1081,9 @@ class api_v3_SyntaxConformanceTest extends CiviUnitTestCase {
     if ($Entity === 'Setting') {
       $this->markTestSkipped('It seems OK for setting to skip here as it silently sips invalid params');
     }
+    if ($Entity == 'Product') {
+      $this->markTestSkipped('At the moment product API does not complain if no params are passed need fixing');
+    }
     // should create php complaining that a param is missing
     civicrm_api3($Entity, 'Create');
   }
@@ -1363,11 +1366,8 @@ class api_v3_SyntaxConformanceTest extends CiviUnitTestCase {
    * @throws \PHPUnit_Framework_IncompleteTestError
    */
   public function testInvalidID_delete($Entity) {
-    // turn test off for now
-    $this->markTestIncomplete("Entity [ $Entity ] cannot be mocked - no known DAO");
-    return;
     if (in_array($Entity, $this->toBeImplemented['delete'])) {
-      // $this->markTestIncomplete("civicrm_api3_{$Entity}_delete to be implemented");
+      $this->markTestIncomplete("civicrm_api3_{$Entity}_delete to be implemented");
       return;
     }
     $result = $this->callAPIFailure($Entity, 'Delete', array('id' => 999));