diff --git a/code/ContentReviewEmails.php b/code/ContentReviewEmails.php index d331219..e6d1771 100644 --- a/code/ContentReviewEmails.php +++ b/code/ContentReviewEmails.php @@ -28,31 +28,32 @@ class ContentReviewEmails extends BuildTask { Subsite::$disable_subsite_filter = true; } + $overduePages = array(); + $now = class_exists('SS_Datetime') ? SS_Datetime::now()->URLDate() : SSDatetime::now()->URLDate(); // First grab all the pages with a custom setting - $pages = Page::get('Page') + $customSettingsPages = Page::get('Page') ->leftJoin('Group_SiteTreeContentReview', '"SiteTree"."ID" = "OwnerGroups"."SiteTreeID"', 'OwnerGroups') ->leftJoin('Member_SiteTreeContentReview', '"SiteTree"."ID" = "OwnerUsers"."SiteTreeID"', "OwnerUsers") - ->where('"SiteTree"."ContentReviewType" != \'Custom\' AND "SiteTree"."NextReviewDate" <= \''.$now.'\' AND' . + ->where('"SiteTree"."ContentReviewType" = \'Custom\' AND "SiteTree"."NextReviewDate" <= \''.$now.'\' AND' . ' ("OwnerGroups"."ID" IS NOT NULL OR "OwnerUsers"."ID" IS NOT NULL)') ; - $this->notify($pages); + $this->getOverduePagesForOwners($customSettingsPages, $overduePages); // Then grab all the pages with that inherits their settings - - $pages = Page::get('Page') + $inheritedSettingsPages = Page::get('Page') ->leftJoin('Group_SiteTreeContentReview', '"SiteTree"."ID" = "OwnerGroups"."SiteTreeID"', 'OwnerGroups') ->leftJoin('Member_SiteTreeContentReview', '"SiteTree"."ID" = "OwnerUsers"."SiteTreeID"', "OwnerUsers") ->where('"SiteTree"."ContentReviewType" = \'Inherit\'') ; - $overduePages = $this->findInheritedSettings($pages); + $this->getOverduePagesForOwners($inheritedSettingsPages, $overduePages); // Lets send one email to one owner with all the pages in there instead of no of pages of emails foreach($overduePages as $memberID => $pages) { - $this->notify_user($memberID, $pages); + $this->notifyOwner($memberID, $pages); } // Revert subsite filter (if installed) @@ -64,33 +65,17 @@ class ContentReviewEmails extends BuildTask { /** * * @param SS_list $pages + * @param array &$pages * @return type */ - protected function findInheritedSettings(SS_list $pages) { - $overduePages = array(); - + protected function getOverduePagesForOwners(SS_list $pages, array &$overduePages) { foreach($pages as $page) { - - $settings = $this->findContentSettingFor($page); - // This page has a parent with the 'Disabled' option - if(!$settings) { + if(!$page->isContentReviewOverdue($page)) { continue; } - $owners = $settings->ContentReviewOwners(); - if(!$owners->count()) { - continue; - } - if(!$settings->ReviewPeriodDays) { - continue; - } - // Calculate next time this page should be reviewed from the LastEdited datea - $nextReviewUnixSec = strtotime($page->LastEdited . ' + '.$settings->ReviewPeriodDays . ' days'); - if($nextReviewUnixSec > time()) { - continue; - } - - foreach($owners as $owner) { + $settings = $page->getContentReviewSetting($page); + foreach($settings->ContentReviewOwners() as $owner) { if(!isset(self::$member_cache[$owner->ID])) { self::$member_cache[$owner->ID] = $owner; } @@ -103,36 +88,14 @@ class ContentReviewEmails extends BuildTask { return $overduePages; } - /** - * - * @param SiteTree $page - * @return DataObject or false if no settings found - */ - protected function findContentSettingFor($page) { - while($parent = $page->Parent()) { - // Root page, use siteconfig - if(!$parent->exists()) { - return SiteConfig::current_site_config(); - } - if($parent->ContentReviewType == 'Custom') { - return $parent; - } - if($parent->ContentReviewType == 'Disabled') { - return false; - } - $page = $parent; - } - throw new Exception('This shouldnt really happen, as usual.'); - } - /** * * @param int $owner * @param array $pages */ - protected function notify_user($ownerID, array $pages) { + protected function notifyOwner($ownerID, array $pages) { $owner = self::$member_cache[$ownerID]; - echo $owner->Email.PHP_EOL; + echo "----- ".$owner->Email." -----".PHP_EOL; foreach($pages as $page) { echo $page->Title.PHP_EOL; } diff --git a/code/extensions/SiteTreeContentReview.php b/code/extensions/SiteTreeContentReview.php index ed0ba76..b8abc71 100644 --- a/code/extensions/SiteTreeContentReview.php +++ b/code/extensions/SiteTreeContentReview.php @@ -53,6 +53,13 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider 365 => "12 months", ); + /** + * @return array + */ + public static function get_schedule() { + return self::$schedule; + } + /** * * @return string @@ -111,13 +118,6 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider return $contentReviewOwners; } - /** - * @return array - */ - public static function get_schedule() { - return self::$schedule; - } - /** * @return ManyManyList */ @@ -140,7 +140,6 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider public function updateSettingsFields(FieldList $fields) { Requirements::javascript('contentreview/javascript/contentreview.js'); - $crFields = new FieldList(); // Display read-only version only if(!Permission::check("EDIT_CONTENT_REVIEW_FIELDS")) { @@ -168,7 +167,6 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider $reviewFreq, $logs )); - // Done! return; } @@ -178,11 +176,6 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider $options["Custom"] = _t('ContentReview.CUSTOM', "Custom settings"); $viewersOptionsField = OptionsetField::create("ContentReviewType", _t('ContentReview.OPTIONS', "Options"), $options); - //$viewersOptionsField->setValue($this->owner->ContentReviewType); - - #var_dump($this->owner->ContentReviewType); - #die(); - $users = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN")); $usersMap = $users->map('ID', 'Title')->toArray(); @@ -253,9 +246,11 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider if($this->owner->ReviewPeriodDays) { $this->owner->NextReviewDate = date('Y-m-d', strtotime('+' . $this->owner->ReviewPeriodDays . ' days')); } else { + $hasNextReview = false; $this->owner->NextReviewDate = null; } + $this->owner->write(); return $hasNextReview; } @@ -265,7 +260,7 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider * @param \FieldList $actions */ public function updateCMSActions(\FieldList $actions) { - if($this->canBeReviewedBy(Member::currentUser())) { + if($this->isContentReviewOverdue($this->owner, Member::currentUser())) { $reviewAction = FormAction::create('reviewed', _t('ContentReview.BUTTONREVIEWED', 'Content reviewed')) ->setAttribute('data-icon', 'pencil') ->setAttribute('data-text-alternate', _t('ContentReview.BUTTONREVIEWED', 'Content reviewed')); @@ -273,6 +268,82 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider } } + /** + * This method calculates if this page review date is over due. + * + * If NextReviewDate is set, it will use the it, otherwise if fallsback to + * LastEdited and ReviewPeriodDays + * + * @param DataObject $settings + * @param Member $null - optional check for a certain Member + * @return boolean + */ + public function isContentReviewOverdue(SiteTree $page, Member $member = null) { + $settings = $this->getContentReviewSetting($page); + + if(!$settings) { + return false; + } + + if(!$settings->ContentReviewOwners()->count()) { + return false; + } + + if($member !== null) { + // member must exists in either owner groups ro owner users + if(!($member->inGroups($settings->OwnerGroups()) || $settings->OwnerUsers()->find('ID', $member->ID))) { + return false; + } + } + + if($page->obj('NextReviewDate')->exists() && !$page->obj('NextReviewDate')->InFuture()) { + return true; + } + + // Fallover to check on ReviewPeriodDays + LastEdited > Now + if(!$settings->ReviewPeriodDays) { + return false; + } + + // Calculate next time this page should be reviewed from the LastEdited datea + $nextReviewUnixSec = strtotime($this->owner->LastEdited . ' + '.$settings->ReviewPeriodDays . ' days'); + + if($nextReviewUnixSec < time()) { + return true; + } + return false; + } + + /** + * Get the object that have the information about the content + * review settings + * + * Will go through parents and root pages will use the siteconfig + * if their setting is Inherit. + * + * @param SiteTree $page + * @return DataObject or false if no settings found + */ + public function getContentReviewSetting($page) { + if($page->ContentReviewType == 'Custom') { + return $page; + } + while($parent = $page->Parent()) { + // Root page, use siteconfig + if(!$parent->exists()) { + return SiteConfig::current_site_config(); + } + if($parent->ContentReviewType == 'Custom') { + return $parent; + } + if($parent->ContentReviewType == 'Disabled') { + return false; + } + $page = $parent; + } + throw new Exception('This shouldn\'t really happen, as per usual developer logic.'); + } + /** * Check if a review is due by a member for this owner *