From b79a221d2b9f793f2bc792f1899f13e44cac9b33 Mon Sep 17 00:00:00 2001 From: k054 Date: Fri, 10 Jun 2016 15:47:35 -0500 Subject: [PATCH] 4.6.18 --- CRM/ACL/BAO/Cache.php | 12 +--- CRM/Contact/BAO/GroupContactCache.php | 61 ++++++++++++------ CRM/Contact/BAO/Query.php | 1 + CRM/Contact/Import/Parser/Contact.php | 36 ++++++++++- CRM/Contribute/BAO/Contribution.php | 6 +- CRM/Contribute/Form/CancelSubscription.php | 11 ++-- CRM/Core/BAO/CustomField.php | 6 ++ CRM/Core/IDS.php | 3 +- CRM/Mailing/Event/BAO/TrackableURLOpen.php | 11 +++- CRM/Upgrade/Incremental/sql/4.6.18.mysql.tpl | 4 ++ CRM/Utils/Date.php | 19 ------ CRM/Utils/Hook.php | 11 ++++ CRM/Utils/SQL.php | 62 +++++++++++++++++++ css/civicrmNavigation.css | 11 +++- sql/civicrm_generated.mysql | 2 +- .../Form/Contribution/OnBehalfOf.tpl | 7 ++- templates/CRM/common/navigation.js.tpl | 22 +++++-- tools/scripts/composer/dompdf-cleanup.sh | 10 ++- xml/schema/ACL/Cache.xml | 4 +- xml/schema/Contact/Group.xml | 6 +- xml/version.xml | 2 +- 21 files changed, 234 insertions(+), 73 deletions(-) create mode 100644 CRM/Upgrade/Incremental/sql/4.6.18.mysql.tpl create mode 100644 CRM/Utils/SQL.php diff --git a/CRM/ACL/BAO/Cache.php b/CRM/ACL/BAO/Cache.php index 0379ec29cd..2da204d9cf 100644 --- a/CRM/ACL/BAO/Cache.php +++ b/CRM/ACL/BAO/Cache.php @@ -153,20 +153,14 @@ WHERE contact_id = %1 // reset any static caching self::$_cache = NULL; - // reset any db caching - $config = CRM_Core_Config::singleton(); - $smartGroupCacheTimeout = CRM_Contact_BAO_GroupContactCache::smartGroupCacheTimeout(); - - //make sure to give original timezone settings again. - $now = CRM_Utils_Date::getUTCTime(); - $query = " DELETE FROM civicrm_acl_cache WHERE modified_date IS NULL - OR (TIMESTAMPDIFF(MINUTE, modified_date, $now) >= $smartGroupCacheTimeout) + OR (modified_date <= %1) "; - CRM_Core_DAO::singleValueQuery($query); + $params = array(1 => array(CRM_Contact_BAO_GroupContactCache::getCacheInvalidDateTime(), 'String')); + CRM_Core_DAO::singleValueQuery($query, $params); // CRM_Core_DAO::singleValueQuery("TRUNCATE TABLE civicrm_acl_contact_cache"); // No, force-commits transaction // CRM_Core_DAO::singleValueQuery("DELETE FROM civicrm_acl_contact_cache"); // Transaction-safe diff --git a/CRM/Contact/BAO/GroupContactCache.php b/CRM/Contact/BAO/GroupContactCache.php index 9446fcb36a..ff98be94de 100644 --- a/CRM/Contact/BAO/GroupContactCache.php +++ b/CRM/Contact/BAO/GroupContactCache.php @@ -68,19 +68,18 @@ class CRM_Contact_BAO_GroupContactCache extends CRM_Contact_DAO_GroupContactCach * the sql query which lists the groups that need to be refreshed */ public static function groupRefreshedClause($groupIDClause = NULL, $includeHiddenGroups = FALSE) { - $smartGroupCacheTimeout = self::smartGroupCacheTimeout(); - $now = CRM_Utils_Date::getUTCTime(); + $smartGroupCacheTimeoutDateTime = self::getCacheInvalidDateTime(); $query = " SELECT g.id FROM civicrm_group g WHERE ( g.saved_search_id IS NOT NULL OR g.children IS NOT NULL ) AND g.is_active = 1 -AND ( g.cache_date IS NULL OR - ( TIMESTAMPDIFF(MINUTE, g.cache_date, $now) >= $smartGroupCacheTimeout ) OR - ( $now >= g.refresh_date ) - ) -"; +AND ( + g.cache_date IS NULL + OR cache_date <= $smartGroupCacheTimeoutDateTime + OR NOW() >= g.refresh_date +)"; if (!$includeHiddenGroups) { $query .= "AND (g.is_hidden = 0 OR g.is_hidden IS NULL)"; @@ -178,7 +177,7 @@ AND ( g.cache_date IS NULL OR if (!empty($refreshGroupIDs)) { $refreshGroupIDString = CRM_Core_DAO::escapeString(implode(', ', $refreshGroupIDs)); - $time = CRM_Utils_Date::getUTCTime(self::smartGroupCacheTimeout() * 60); + $time = self::getRefreshDateTime(); $query = " UPDATE civicrm_group g SET g.refresh_date = $time @@ -266,8 +265,7 @@ AND g.refresh_date IS NULL // only update cache entry if we had any values if ($processed) { // also update the group with cache date information - //make sure to give original timezone settings again. - $now = CRM_Utils_Date::getUTCTime(); + $now = date('YmdHis'); $refresh = 'null'; } else { @@ -304,7 +302,7 @@ WHERE id IN ( $groupIDs ) static $invoked = FALSE; // typically this needs to happy only once per instance - // this is especially TRUE in import, where we dont need + // this is especially TRUE in import, where we don't need // to do this all the time // this optimization is done only when no groupID is passed // i.e. cache is reset for all groups @@ -329,14 +327,20 @@ WHERE id IN ( $groupIDs ) } $refresh = NULL; - $params = array(); $smartGroupCacheTimeout = self::smartGroupCacheTimeout(); + $now = CRM_Utils_Date::getUTCTime(); $refreshTime = CRM_Utils_Date::getUTCTime($smartGroupCacheTimeout * 60); // HACK: Hardcoded delete limit. $deleteLimit = 1000; + $params = array( + 1 => array(self::getCacheInvalidDateTime(), 'String'), + 2 => array(self::getRefreshDateTime(), 'String'), + ); + + if (!isset($groupID)) { if ($smartGroupCacheTimeout == 0) { $query = " @@ -371,12 +375,10 @@ WHERE g.cache_date <= %1 "; $refresh = " UPDATE civicrm_group g -SET refresh_date = $refreshTime -WHERE g.cache_date > %1 +SET refresh_date = %2 +WHERE g.cache_date < %1 AND refresh_date IS NULL "; - $cacheTime = date('Y-m-d H-i-s', strtotime("- $smartGroupCacheTimeout minutes")); - $params = array(1 => array($cacheTime, 'String')); } } elseif (is_array($groupID)) { @@ -465,10 +467,10 @@ WHERE id = %1 return; } - // grab a lock so other processes dont compete and do the same query + // grab a lock so other processes don't compete and do the same query $lock = Civi\Core\Container::singleton()->get('lockManager')->acquire("data.core.group.{$groupID}"); if (!$lock->isAcquired()) { - // this can cause inconsistent results since we dont know if the other process + // this can cause inconsistent results since we don't know if the other process // will fill up the cache before our calling routine needs it. // however this routine does not return the status either, so basically // its a "lets return and hope for the best" @@ -719,4 +721,27 @@ ORDER BY gc.contact_id, g.children } } + /** + * Get the datetime from which the cache should be considered invalid. + * + * Ie if the smartgroup cache timeout is 5 minutes ago then the cache is invalid if it was + * refreshed 6 minutes ago, but not if it was refreshed 4 minutes ago. + * + * @return string + */ + public static function getCacheInvalidDateTime() { + return date('Ymdhis', strtotime("-" . self::smartGroupCacheTimeout() . " Minutes")); + } + + /** + * Get the date when the cache should be refreshed from. + * + * Ie. now + the offset & we will delete anything prior to then. + * + * @return string + */ + public static function getRefreshDateTime() { + return date('Ymdhis', strtotime("+ " . self::smartGroupCacheTimeout() . " Minutes")); + } + } diff --git a/CRM/Contact/BAO/Query.php b/CRM/Contact/BAO/Query.php index 4bf2395ece..6b53342e9e 100644 --- a/CRM/Contact/BAO/Query.php +++ b/CRM/Contact/BAO/Query.php @@ -5796,6 +5796,7 @@ AND displayRelType.is_active = 1 * list(string $orderByClause, string $additionalFromClause). */ protected function prepareOrderBy($sort, $sortByChar, $sortOrder, $additionalFromClause) { + $order = NULL; $config = CRM_Core_Config::singleton(); if ($config->includeOrderByClause || isset($this->_distinctComponentClause) diff --git a/CRM/Contact/Import/Parser/Contact.php b/CRM/Contact/Import/Parser/Contact.php index 1fc0cde3a8..96464689bb 100644 --- a/CRM/Contact/Import/Parser/Contact.php +++ b/CRM/Contact/Import/Parser/Contact.php @@ -1139,7 +1139,23 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser { if (empty($params['contact_type'])) { $params['contact_type'] = 'Individual'; } - $customFields = CRM_Core_BAO_CustomField::getFields($params['contact_type'], FALSE, FALSE, $csType); + + // get array of subtypes - CRM-18708 + if (in_array($csType, array('Individual', 'Organization', 'Household'))) { + $csType = self::getSubtypes($params['contact_type']); + } + + if (is_array($csType)) { + // fetch custom fields for every subtype and add it to $customFields array + // CRM-18708 + $customFields = array(); + foreach ($csType as $cType) { + $customFields += CRM_Core_BAO_CustomField::getFields($params['contact_type'], FALSE, FALSE, $cType); + } + } + else { + $customFields = CRM_Core_BAO_CustomField::getFields($params['contact_type'], FALSE, FALSE, $csType); + } $addressCustomFields = CRM_Core_BAO_CustomField::getFields('Address'); $customFields = $customFields + $addressCustomFields; @@ -2142,4 +2158,22 @@ class CRM_Contact_Import_Parser_Contact extends CRM_Contact_Import_Parser { return $allowToCreate; } + /** + * get subtypes given the contact type + * + * @param string $contactType + * @return array $subTypes + */ + public static function getSubtypes($contactType) { + $subTypes = array(); + $types = CRM_Contact_BAO_ContactType::subTypeInfo($contactType); + + if (count($types) > 0) { + foreach ($types as $type) { + $subTypes[] = $type['name']; + } + } + return $subTypes; + } + } diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 9406e75b53..803ac6b92f 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -3801,10 +3801,8 @@ WHERE con.id = {$contributionId} do { $creditNoteNum++; $creditNoteId = CRM_Utils_Array::value('credit_notes_prefix', $prefixValue) . "" . $creditNoteNum; - $result = civicrm_api3('Contribution', 'getcount', array( - 'sequential' => 1, - 'creditnote_id' => $creditNoteId, - )); + $params = array(1 => array($creditNoteId, 'String')); + $result = CRM_Core_DAO::singleValueQuery("SELECT count(id) FROM civicrm_contribution WHERE creditnote_id = %1", $params); } while ($result > 0); return $creditNoteId; diff --git a/CRM/Contribute/Form/CancelSubscription.php b/CRM/Contribute/Form/CancelSubscription.php index 59a0c0f754..5ded40fa3d 100644 --- a/CRM/Contribute/Form/CancelSubscription.php +++ b/CRM/Contribute/Form/CancelSubscription.php @@ -76,12 +76,13 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Core_Form { } if ($this->_mid) { - if (CRM_Member_BAO_Membership::isSubscriptionCancelled($this->_mid)) { - CRM_Core_Error::fatal(ts('The auto renewal option for this membership looks to have been cancelled already.')); - } $this->_mode = 'auto_renew'; - $this->_paymentProcessorObj = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_mid, 'membership', 'obj'); - $this->_subscriptionDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($this->_mid, 'membership'); + // CRM-18468: crid is more accurate than mid for getting + // subscriptionDetails, so don't get them again. + if (!$this->_crid) { + $this->_paymentProcessorObj = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_mid, 'membership', 'obj'); + $this->_subscriptionDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($this->_mid, 'membership'); + } $membershipTypes = CRM_Member_PseudoConstant::membershipType(); $membershipTypeId = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $this->_mid, 'membership_type_id'); diff --git a/CRM/Core/BAO/CustomField.php b/CRM/Core/BAO/CustomField.php index 785ff96a55..717459a10e 100644 --- a/CRM/Core/BAO/CustomField.php +++ b/CRM/Core/BAO/CustomField.php @@ -834,6 +834,12 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { $qf->add('text', $elementName . '_to', ts('To'), $field->attributes); } else { + if ($field->text_length) { + $field->attributes .= ' maxlength=' . $field->text_length; + if ($field->text_length < 20) { + $field->attributes .= ' size=' . $field->text_length; + } + } $element = &$qf->add('text', $elementName, $label, $field->attributes, $useRequired && !$search diff --git a/CRM/Core/IDS.php b/CRM/Core/IDS.php index 889fa27e38..ea7538f9fe 100644 --- a/CRM/Core/IDS.php +++ b/CRM/Core/IDS.php @@ -58,7 +58,8 @@ class CRM_Core_IDS { */ public function check(&$args) { // lets bypass a few civicrm urls from this check - static $skip = array('civicrm/admin/setting/updateConfigBackend', 'civicrm/admin/messageTemplates'); + $skip = array('civicrm/admin/setting/updateConfigBackend', 'civicrm/admin/messageTemplates'); + CRM_Utils_Hook::idsException($skip); $path = implode('/', $args); if (in_array($path, $skip)) { return NULL; diff --git a/CRM/Mailing/Event/BAO/TrackableURLOpen.php b/CRM/Mailing/Event/BAO/TrackableURLOpen.php index 3c17ae7c9e..2f349f6d0d 100755 --- a/CRM/Mailing/Event/BAO/TrackableURLOpen.php +++ b/CRM/Mailing/Event/BAO/TrackableURLOpen.php @@ -81,9 +81,16 @@ class CRM_Mailing_Event_BAO_TrackableURLOpen extends CRM_Mailing_Event_DAO_Track ); if (!$search->fetch()) { - /* Whoops, error, don't track it. Return the base url. */ + // Can't find either the URL or the queue. If we can find the URL then + // return the URL without tracking. Otherwise return the base URL. - return CRM_Utils_System::baseURL(); + $search->query("SELECT $turl.url as url from $turl + WHERE $turl.id = " . CRM_Utils_Type::escape($url_id, 'Integer') + ); + if (!$search->fetch()) { + return CRM_Utils_System::baseURL(); + } + return $search->url; } $open = new CRM_Mailing_Event_BAO_TrackableURLOpen(); diff --git a/CRM/Upgrade/Incremental/sql/4.6.18.mysql.tpl b/CRM/Upgrade/Incremental/sql/4.6.18.mysql.tpl new file mode 100644 index 0000000000..09edb02619 --- /dev/null +++ b/CRM/Upgrade/Incremental/sql/4.6.18.mysql.tpl @@ -0,0 +1,4 @@ +{* file to handle db changes in 4.6.18 during upgrade *} +-- CRM-18516 Convert the date fields relating to group caching and acl caching timestamp +ALTER TABLE civicrm_group CHANGE cache_date cache_date timestamp NULL DEFAULT NULL , CHANGE refresh_date refresh_date timestamp NULL DEFAULT NULL; +ALTER TABLE civicrm_acl_cache CHANGE modified_date modified_date timestamp NULL DEFAULT NULL; diff --git a/CRM/Utils/Date.php b/CRM/Utils/Date.php index f58994f6b3..1a313cfc1b 100644 --- a/CRM/Utils/Date.php +++ b/CRM/Utils/Date.php @@ -1785,25 +1785,6 @@ class CRM_Utils_Date { return $format; } - /** - * Get the time in UTC for the current time. You can optionally send an offset from the current time if needed - * - * @param int $offset - * the offset from the current time in seconds. - * - * @return string - * the time in UTC - */ - public static function getUTCTime($offset = 0) { - $originalTimezone = date_default_timezone_get(); - date_default_timezone_set('UTC'); - $time = time() + $offset; - $now = date('YmdHis', $time); - date_default_timezone_set($originalTimezone); - return $now; - } - - /** * @param $date * @param $dateType diff --git a/CRM/Utils/Hook.php b/CRM/Utils/Hook.php index 6fd64ff70a..9d1ac30517 100644 --- a/CRM/Utils/Hook.php +++ b/CRM/Utils/Hook.php @@ -1978,4 +1978,15 @@ abstract class CRM_Utils_Hook { ); } + /** + * This hook is called for bypass a few civicrm urls from IDS check + * @param array $skip list of civicrm url; + */ + public static function idsException(&$skip) { + return self::singleton()->invoke(1, $skip, self::$_nullObject, + self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, + 'civicrm_idsException' + ); + } + } diff --git a/CRM/Utils/SQL.php b/CRM/Utils/SQL.php new file mode 100644 index 0000000000..b46e4396c2 --- /dev/null +++ b/CRM/Utils/SQL.php @@ -0,0 +1,62 @@ +addSelectWhereClause() as $field => $vals) { + if ($vals && $field == $joinColumn) { + $clauses = array_merge($clauses, (array) $vals); + } + elseif ($vals) { + $subclauses[] = "$field " . implode(" AND $field ", (array) $vals); + } + } + if ($subclauses) { + $clauses[] = "IN (SELECT `$joinColumn` FROM `" . $bao->tableName() . "` WHERE " . implode(' AND ', $subclauses) . ")"; + } + return $clauses; + } + +} diff --git a/css/civicrmNavigation.css b/css/civicrmNavigation.css index feb8325a3d..b45a5389ca 100644 --- a/css/civicrmNavigation.css +++ b/css/civicrmNavigation.css @@ -132,4 +132,13 @@ li.menu-separator{ width: 16px; height: 16px; vertical-align:middle; -} \ No newline at end of file +} + +/* No results */ +.crm-quickSearch-results.ui-menu-disabled { + opacity: .9; + background-color: #f8f8f8; +} +.crm-quickSearch-results.ui-menu-disabled li { + cursor: default; +} diff --git a/sql/civicrm_generated.mysql b/sql/civicrm_generated.mysql index 489fc1ec2c..3d1c0aaf49 100644 --- a/sql/civicrm_generated.mysql +++ b/sql/civicrm_generated.mysql @@ -399,7 +399,7 @@ UNLOCK TABLES; LOCK TABLES `civicrm_domain` WRITE; /*!40000 ALTER TABLE `civicrm_domain` DISABLE KEYS */; -INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `config_backend`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,NULL,'4.6.17',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}'); +INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `config_backend`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,NULL,'4.6.18',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}'); /*!40000 ALTER TABLE `civicrm_domain` ENABLE KEYS */; UNLOCK TABLES; diff --git a/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl b/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl index 8b5eee6d35..09821c2d1d 100644 --- a/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl +++ b/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl @@ -264,7 +264,12 @@ function setLocationDetails(contactID , reset) { else { // do not set defaults to file type fields if (cj('#' + ele).attr('type') != 'file') { - cj('#' + ele ).val(data[ele].value).change(); + if (ele.split("_").pop() == 'display') { + cj("[id^='"+ele+"']").val(data[ele].value).change(); + } + else { + cj('#' + ele ).val(data[ele].value).change(); + } } } } diff --git a/templates/CRM/common/navigation.js.tpl b/templates/CRM/common/navigation.js.tpl index 9745d71502..2dc8896ddc 100644 --- a/templates/CRM/common/navigation.js.tpl +++ b/templates/CRM/common/navigation.js.tpl @@ -103,10 +103,14 @@ $('#civicrm-menu').ready(function() { }; CRM.api3('contact', 'getquick', params).done(function(result) { var ret = []; - if (result.values) { + if (result.values.length > 0) { + $('#sort_name_navigation').autocomplete('widget').menu('option', 'disabled', false); $.each(result.values, function(k, v) { ret.push({value: v.id, label: v.data}); - }) + }); + } else { + $('#sort_name_navigation').autocomplete('widget').menu('option', 'disabled', true); + ret.push({value: '0', label: {/literal}'{ts escape='js'}None found.{/ts}'{literal}}); } response(ret); }) @@ -115,12 +119,16 @@ $('#civicrm-menu').ready(function() { return false; }, select: function (event, ui) { - document.location = CRM.url('civicrm/contact/view', {reset: 1, cid: ui.item.value}); + if (ui.item.value > 0) { + document.location = CRM.url('civicrm/contact/view', {reset: 1, cid: ui.item.value}); + } return false; }, create: function() { // Place menu in front - $(this).autocomplete('widget').css('z-index', $('#civicrm-menu').css('z-index')); + $(this).autocomplete('widget') + .addClass('crm-quickSearch-results') + .css('z-index', $('#civicrm-menu').css('z-index')); } }) .keydown(function() { @@ -167,8 +175,10 @@ $('#civicrm-menu').ready(function() { var $menu = $('#sort_name_navigation').autocomplete('widget'); if ($('li.ui-menu-item', $menu).length === 1) { var cid = $('li.ui-menu-item', $menu).data('ui-autocomplete-item').value; - document.location = CRM.url('civicrm/contact/view', {reset: 1, cid: cid}); - return false; + if (cid > 0) { + document.location = CRM.url('civicrm/contact/view', {reset: 1, cid: cid}); + return false; + } } }); // Close menu after selecting an item diff --git a/tools/scripts/composer/dompdf-cleanup.sh b/tools/scripts/composer/dompdf-cleanup.sh index b56c5b4888..9ee2e377e2 100755 --- a/tools/scripts/composer/dompdf-cleanup.sh +++ b/tools/scripts/composer/dompdf-cleanup.sh @@ -109,15 +109,23 @@ Download the latest version and copy the font files from the lib/fonts directori EOREADME } +## usage: simple_replace +## This is a bit like 'sed -i', but dumber and more cross-platform. +function simple_replace() { + php -r 'file_put_contents($argv[1], str_replace($argv[2], $argv[3], file_get_contents($argv[1])));' "$@" +} + ############################################################################## ## Remove example/CLI scripts. They're not needed and increase the attack-surface. safe_delete vendor/dompdf/dompdf/dompdf.php safe_delete vendor/dompdf/dompdf/load_font.php safe_delete vendor/dompdf/dompdf/www -safe_delete vendor/dompdf/dompdf/lib/html5lib/TreeBuilder.php safe_delete vendor/phenx/php-font-lib/www # Remove DejaVu fonts. They add 12mb. safe_delete vendor/dompdf/dompdf/lib/fonts/DejaVu* make_font_cache > vendor/dompdf/dompdf/lib/fonts/dompdf_font_family_cache.dist.php make_font_readme > vendor/dompdf/dompdf/lib/fonts/README.DejaVuFonts.txt + +# Remove debug_print_backtrace(), which can leak system details. Put backtrace in log. +simple_replace vendor/dompdf/dompdf/lib/html5lib/TreeBuilder.php 'debug_print_backtrace();' 'CRM_Core_Error::backtrace("backTrace", TRUE);' diff --git a/xml/schema/ACL/Cache.xml b/xml/schema/ACL/Cache.xml index 52f34f9b46..3c1c44a793 100644 --- a/xml/schema/ACL/Cache.xml +++ b/xml/schema/ACL/Cache.xml @@ -51,7 +51,9 @@ modified_date - date + Cache Modified Date + timestamp + false When was this cache entry last modified 1.6 diff --git a/xml/schema/Contact/Group.xml b/xml/schema/Contact/Group.xml index 6f68023e73..5f09e4147e 100644 --- a/xml/schema/Contact/Group.xml +++ b/xml/schema/Contact/Group.xml @@ -123,15 +123,17 @@ cache_date - datetime + timestamp Group Cache Date + false Date when we created the cache for a smart group 2.1 refresh_date - datetime + timestamp Next Group Refresh Time + false Date and time when we need to refresh the cache next. 4.3 diff --git a/xml/version.xml b/xml/version.xml index 76883249b2..f10f3fc3a4 100644 --- a/xml/version.xml +++ b/xml/version.xml @@ -1,4 +1,4 @@ - 4.6.17 + 4.6.18 -- 2.25.1