From e310f18dae76c5d8e95cb98f91eaa435d919af7b Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 19 Jan 2016 05:47:18 +1300 Subject: [PATCH 01/16] advanceReviewDate() should be cleared after a review, don't use unless there are any --- code/extensions/SiteTreeContentReview.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/code/extensions/SiteTreeContentReview.php b/code/extensions/SiteTreeContentReview.php index d6c0d3e..e221df8 100644 --- a/code/extensions/SiteTreeContentReview.php +++ b/code/extensions/SiteTreeContentReview.php @@ -425,11 +425,14 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider $nextDate = false; $options = $this->getOptions(); - if ($options && $options->ReviewPeriodDays) { + if ($options && $options->ReviewPeriodDays > 0) { $nextDate = date('Y-m-d', strtotime('+ ' . $options->ReviewPeriodDays . ' days', SS_Datetime::now()->format('U'))); $this->owner->NextReviewDate = $nextDate; $this->owner->write(); + } else { + $this->owner->NextReviewDate = null; + $this->owner->write(); } return (bool) $nextDate; @@ -454,8 +457,12 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider $options = $this->getOptions(); - if ($options->OwnerGroups()->count() == 0 && $options->OwnerUsers()->count() == 0) { + if (!$options) { return false; + } else { + if ($options->OwnerGroups()->count() == 0 && $options->OwnerUsers()->count() == 0) { + return false; + } } if (!$member) { From f4372ceeb5cd6895bcf58a205232e19053b3d134 Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 19 Jan 2016 05:47:36 +1300 Subject: [PATCH 02/16] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e43b0f9..dde2f7d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +.idea/* \ No newline at end of file From 1da54d6538731de646cbf02bb10e2f22b2a599b3 Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 19 Jan 2016 16:11:03 +1300 Subject: [PATCH 03/16] fix overly nested if statement --- code/extensions/SiteTreeContentReview.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/extensions/SiteTreeContentReview.php b/code/extensions/SiteTreeContentReview.php index e221df8..37bc4eb 100644 --- a/code/extensions/SiteTreeContentReview.php +++ b/code/extensions/SiteTreeContentReview.php @@ -459,10 +459,8 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider if (!$options) { return false; - } else { - if ($options->OwnerGroups()->count() == 0 && $options->OwnerUsers()->count() == 0) { - return false; - } + } elseif ($options->OwnerGroups()->count() == 0 && $options->OwnerUsers()->count() == 0) { + return false; } if (!$member) { From e0e6758626f656baba65f6824ed1fd9a7d91e382 Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 23 Aug 2016 15:34:28 +1200 Subject: [PATCH 04/16] add extra field label definitions to the lang file --- lang/en.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lang/en.yml b/lang/en.yml index c45cc11..fed6657 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -12,6 +12,7 @@ en: EMAILFROM: 'From email address' EMAILSUBJECT: 'Subject line' EMAILTEMPLATE: 'Email template' + FIRSTREVIEWDAYSBEFORE: 'First review reminder # days before final review' INHERIT: 'Inherit from parent page' MARKREVIEWED: 'Mark as reviewed' NEXTREVIEWDATADESCRIPTION: 'Leave blank for no review' @@ -25,10 +26,12 @@ en: REVIEWFREQUENCY: 'Review frequency' REVIEWFREQUENCYDESCRIPTION: 'The review date will be set to this far in the future whenever the page is published' REVIEWHEADER: 'Content review' + REVIEWINFO: 'Review information' REVIEWNOTES: 'Review notes' 'REVIEWNOTESDESCRIPTION ': 'Add comments for the content of this page.' REVIEWSUCCESSFUL: 'Content reviewed successfully' SAVE: Save + SECONDREVIEWDAYSBEFORE: 'Second review reminder # days before final review' SETTINGSFROM: 'Options are' ContentReviewEmails: REVIEWPAGELINK: 'Review the page in the CMS' From 4f287bb508880e708fd75b17b3ae1ff71426e49e Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 23 Aug 2016 15:35:06 +1200 Subject: [PATCH 05/16] styling for review info on the quick review panel --- css/contentreview.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/css/contentreview.css b/css/contentreview.css index 4d44bba..b6bc585 100644 --- a/css/contentreview.css +++ b/css/contentreview.css @@ -11,6 +11,13 @@ margin: 0 0 4px 10px; } +.cms .ss-ui-action-tabset.action-menus.ss-tabset .ui-tabs-panel .review-notes .quick-info { + padding: 6px; + margin: 4px 8px; + border: 1px solid #b3b3b3; + border-radius: 4px; +} + .cms .ss-ui-action-tabset.action-menus.ss-tabset .ui-tabs-panel .review-notes .cms-sitetree-information p.meta-info { color: #f46b00; font-weight: bold; From 1e4880998dd65bb34e7248daa2b7045d9386ca3c Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 23 Aug 2016 15:36:16 +1200 Subject: [PATCH 06/16] add a new field for Review Info, and display it when it has data on the quick review panel, as well as in the main cms screen --- code/extensions/SiteTreeContentReview.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/code/extensions/SiteTreeContentReview.php b/code/extensions/SiteTreeContentReview.php index 004e614..472b543 100644 --- a/code/extensions/SiteTreeContentReview.php +++ b/code/extensions/SiteTreeContentReview.php @@ -25,6 +25,7 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider "NextReviewDate" => "Date", "LastEditedByName" => "Varchar(255)", "OwnerNames" => "Varchar(255)", + "ReviewInfo" => "Text" ); /** @@ -126,13 +127,22 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider "" ); + if (strlen($this->owner->ReviewInfo) > 0) { + $reviewInfo = LiteralField::create( + "ReviewContentInfo", + "

" . $this->owner->ReviewInfo . "

" + ); + } else { + $reviewInfo = ''; + } + $ReviewNotes = LiteralField::create("ReviewNotes", ""); $quickReviewAction = FormAction::create("savereview", _t("ContentReview.MARKREVIEWED", "Mark as reviewed")) ->setAttribute("data-icon", "pencil") ->setAttribute("data-text-alternate", _t("ContentReview.MARKREVIEWED", "Mark as reviewed")); - $allFields = CompositeField::create($reviewTitle, $ReviewNotes, $quickReviewAction) + $allFields = CompositeField::create($reviewTitle, $reviewInfo, $ReviewNotes, $quickReviewAction) ->addExtraClass('review-notes field'); $reviewTab = Tab::create('ReviewContent', $allFields); @@ -383,6 +393,8 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider ->addExtraClass('custom-setting') ->setDescription(_t("ContentReview.REVIEWFREQUENCYDESCRIPTION", "The review date will be set to this far in the future whenever the page is published")); + $reviewInfoField = TextareaField::create("ReviewInfo", _t("ContentReview.REVIEWINFO", "Review information")); + $notesField = GridField::create("ReviewNotes", "Review Notes", $this->owner->ReviewLogs(), GridFieldConfig_RecordEditor::create()); $fields->addFieldsToTab("Root.ContentReview", array( @@ -395,6 +407,7 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider $reviewFrequency )->addExtraClass("review-settings"), ReadonlyField::create("ROContentOwners", _t("ContentReview.CONTENTOWNERS", "Content Owners"), $this->getOwnerNames()), + $reviewInfoField, $notesField, )); } From c280c29a6fd6124f1d0011338a1a99b79ca3a9fa Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 23 Aug 2016 15:36:53 +1200 Subject: [PATCH 07/16] add two additional fields to siteconfig to allow defining of the pre-deadline review period in days --- .../extensions/ContentReviewDefaultSettings.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/code/extensions/ContentReviewDefaultSettings.php b/code/extensions/ContentReviewDefaultSettings.php index 5e958fa..4526cf2 100644 --- a/code/extensions/ContentReviewDefaultSettings.php +++ b/code/extensions/ContentReviewDefaultSettings.php @@ -18,6 +18,8 @@ class ContentReviewDefaultSettings extends DataExtension 'ReviewFrom' => 'Varchar(255)', 'ReviewSubject' => 'Varchar(255)', 'ReviewBody' => 'HTMLText', + 'FirstReviewDaysBefore' => 'Int', + 'SecondReviewDaysBefore' => 'Int' ); /** @@ -28,6 +30,7 @@ class ContentReviewDefaultSettings extends DataExtension private static $defaults = array( 'ReviewSubject' => 'Page(s) are due for content review', 'ReviewBody' => '

Page(s) due for review

There are $PagesCount pages that are due for review today by you.

', + 'FirstReviewDaysBefore' => 'Int' ); /** @@ -112,6 +115,20 @@ class ContentReviewDefaultSettings extends DataExtension $fields->addFieldToTab('Root.ContentReview', $reviewFrequency); + $FirstReviewDaysBefore = NumericField::create( + 'FirstReviewDaysBefore', + _t('ContentReview.FIRSTREVIEWDAYSBEFORE', 'First review reminder # days before final review') + ); + + $fields->addFieldToTab('Root.ContentReview', $FirstReviewDaysBefore); + + $SecondReviewDaysBefore = NumericField::create( + 'SecondReviewDaysBefore', + _t('ContentReview.SECONDREVIEWDAYSBEFORE', 'Second review reminder # days before final review') + ); + + $fields->addFieldToTab('Root.ContentReview', $SecondReviewDaysBefore); + $users = Permission::get_members_by_permission(array( 'CMS_ACCESS_CMSMain', 'ADMIN', From dbb0dc264f0f5f1e0b3a4d7fea4ae1d5aa3a9609 Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 23 Aug 2016 15:37:27 +1200 Subject: [PATCH 08/16] progress toward calculating what changes to the emailing will be needed --- code/tasks/ContentReviewEmails.php | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/code/tasks/ContentReviewEmails.php b/code/tasks/ContentReviewEmails.php index 11fb08f..c1a67de 100644 --- a/code/tasks/ContentReviewEmails.php +++ b/code/tasks/ContentReviewEmails.php @@ -12,9 +12,28 @@ class ContentReviewEmails extends BuildTask { $compatibility = ContentReviewCompatability::start(); + $now = SS_Datetime::now(); + // First grab all the pages with a custom setting $pages = Page::get() - ->filter('NextReviewDate:LessThanOrEqual', SS_Datetime::now()->URLDate()); + ->filter('NextReviewDate:LessThanOrEqual', $now->URLDate()); + + // Calculate whether today is the date a First or Second review should occur + $config = SiteConfig::current_site_config(); + $firstReview = $config->FirstReviewDaysBefore; + $secondReview = $config->SecondReviewDaysBefore; + // Subtract the number of days prior to the review, from the current date + + // Get all pages where the NextReviewDate is still in the future + $pendingPages = Page::get()->filter('NextReviewDate:GreaterThan', $now->URLDate()); + + // for each of these pages, check if today is the date the First or Second reminder should be sent + foreach ($pendingPages as $page) { + $notifyDate1 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $firstReview . ' day')); + $notifyDate2 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $secondReview . ' day')); + } + + die(); $overduePages = $this->getOverduePagesForOwners($pages); @@ -83,7 +102,9 @@ class ContentReviewEmails extends BuildTask 'Recipient' => $owner, 'Pages' => $pages, )); - $email->send(); + + Debug::show($email); + //$email->send(); } /** From 0059b14d64b3a75d22fcfd20c3314a8519f0d82e Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 24 Aug 2016 10:57:49 +1200 Subject: [PATCH 09/16] additional config items --- lang/en.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lang/en.yml b/lang/en.yml index fed6657..f963b22 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -10,8 +10,12 @@ en: DEFAULTSETTINGSHELP: 'These content review settings will apply to all pages that does not have specific Content Review schedule.' DISABLE: 'Disable content review' EMAILFROM: 'From email address' - EMAILSUBJECT: 'Subject line' - EMAILTEMPLATE: 'Email template' + EMAILSUBJECTFIRSTREMINDER: 'Subject line - First reminder' + EMAILSUBJECTSECONDREMINDER: 'Subject line - Second reminder' + EMAILSUBJECT: 'Subject line - Review due' + EMAILTEMPLATEFIRSTREMINDER: 'Email template - First reminder' + EMAILTEMPLATESECONDREMINDER: 'Email template - Second reminder' + EMAILTEMPLATE: 'Email template - Review due' FIRSTREVIEWDAYSBEFORE: 'First review reminder # days before final review' INHERIT: 'Inherit from parent page' MARKREVIEWED: 'Mark as reviewed' From bb4bd9d6528520e35be257b7f15d389b3938757b Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 24 Aug 2016 10:58:27 +1200 Subject: [PATCH 10/16] ensure the emails have the right context --- code/tasks/ContentReviewEmails.php | 93 +++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/code/tasks/ContentReviewEmails.php b/code/tasks/ContentReviewEmails.php index c1a67de..0a6f2dd 100644 --- a/code/tasks/ContentReviewEmails.php +++ b/code/tasks/ContentReviewEmails.php @@ -27,20 +27,40 @@ class ContentReviewEmails extends BuildTask // Get all pages where the NextReviewDate is still in the future $pendingPages = Page::get()->filter('NextReviewDate:GreaterThan', $now->URLDate()); - // for each of these pages, check if today is the date the First or Second reminder should be sent + // for each of these pages, check if today is the date the First or Second + // reminder should be sent, and if so, add it to the appropriate ArrayList + $pendingPagesFirstReminder = new ArrayList(); + $pendingPagesSecondReminder = new ArrayList(); + foreach ($pendingPages as $page) { - $notifyDate1 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $firstReview . ' day')); - $notifyDate2 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $secondReview . ' day')); + $notifyDate1 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $firstReview . ' days')); + $notifyDate2 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $secondReview . ' days')); + + if ($notifyDate1 == $now->URLDate()) { + $pendingPagesFirstReminder->push($page); + } + if ($notifyDate2 == $now->URLDate()) { + $pendingPagesSecondReminder->push($page); + } } - die(); + $overduePages = $this->getNotifiablePagesForOwners($pages, "due"); + $firstReminderPages = $this->getNotifiablePagesForOwners($pendingPagesFirstReminder, "first"); + $secondReminderPages = $this->getNotifiablePagesForOwners($pendingPagesSecondReminder, "second"); - $overduePages = $this->getOverduePagesForOwners($pages); - - // Lets send one email to one owner with all the pages in there instead of no of pages - // of emails. + // 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->notifyOwner($memberID, $pages); + $this->notifyOwner($memberID, $pages, "due"); + } + + // Send a separate email with a different subject line for the first reminder + foreach ($firstReminderPages as $memberID => $pages) { + $this->notifyOwner($memberID, $pages, "first"); + } + + // Send a separate email with a different subject line for the second reminder + foreach ($secondReminderPages as $memberID => $pages) { + $this->notifyOwner($memberID, $pages, "second"); } ContentReviewCompatability::done($compatibility); @@ -51,13 +71,26 @@ class ContentReviewEmails extends BuildTask * * @return array */ - protected function getOverduePagesForOwners(SS_list $pages) + protected function getNotifiablePagesForOwners(SS_list $pages, $type) { $overduePages = array(); foreach ($pages as $page) { - if (!$page->canBeReviewedBy()) { - continue; + + if ($type == "first") { + if (!$page->canRemind()) { + continue; + } + } + if ($type == "second") { + if (!$page->canRemindAgain()) { + continue; + } + } + if ($type == "due") { + if (!$page->canBeReviewedBy()) { + continue; + } } $option = $page->getOptions(); @@ -77,22 +110,27 @@ class ContentReviewEmails extends BuildTask /** * @param int $ownerID * @param array|SS_List $pages + * @param string $type */ - protected function notifyOwner($ownerID, SS_List $pages) + protected function notifyOwner($ownerID, SS_List $pages, $type) { // Prepare variables $siteConfig = SiteConfig::current_site_config(); $owner = Member::get()->byID($ownerID); - $templateVariables = $this->getTemplateVariables($owner, $siteConfig, $pages); + $templateVariables = $this->getTemplateVariables($owner, $siteConfig, $pages, $type); // Build email $email = new Email(); $email->setTo($owner->Email); $email->setFrom($siteConfig->ReviewFrom); - $email->setSubject($siteConfig->ReviewSubject); + + if ($type == "first"){$subject = $siteConfig->ReviewSubjectFirstReminder;} + if ($type == "second"){$subject = $siteConfig->ReviewSubjectSecondReminder;} + if ($type == "due"){$subject = $siteConfig->ReviewSubject;} + $email->setSubject($subject); // Get user-editable body - $body = $this->getEmailBody($siteConfig, $templateVariables); + $body = $this->getEmailBody($siteConfig, $templateVariables, $type); // Populate mail body with fixed template $email->setTemplate($siteConfig->config()->content_review_template); @@ -115,9 +153,18 @@ class ContentReviewEmails extends BuildTask * * @return HTMLText */ - protected function getEmailBody($config, $variables) + protected function getEmailBody($config, $variables, $type) { - $template = SSViewer::fromString($config->ReviewBody); + if ($type == "first") { + $template = SSViewer::fromString($config->ReviewBodyFirstReminder); + } + if ($type == "second") { + $template = SSViewer::fromString($config->ReviewBodySecondReminder); + } + if ($type == "due") { + $template = SSViewer::fromString($config->ReviewBody); + } + $value = $template->process(new ArrayData($variables)); // Cast to HTML @@ -133,18 +180,24 @@ class ContentReviewEmails extends BuildTask * @param Member $recipient * @param SiteConfig $config * @param SS_List $pages + * @param string $type * * @return array */ - protected function getTemplateVariables($recipient, $config, $pages) + protected function getTemplateVariables($recipient, $config, $pages, $type) { + if ($type == "first") {$subject = $config->ReviewSubjectFirstReminder;} + if ($type == "second") {$subject = $config->ReviewSubjectSecondReminder;} + if ($type == "due") {$subject = $config->ReviewSubject;} + return array( - 'Subject' => $config->ReviewSubject, + 'Subject' => $subject, 'PagesCount' => $pages->count(), 'FromEmail' => $config->ReviewFrom, 'ToFirstName' => $recipient->FirstName, 'ToSurname' => $recipient->Surname, 'ToEmail' => $recipient->Email, + 'Type' => $type ); } } From 3b0796e49987e1208a14ee8c5aabba653ee46ee7 Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 24 Aug 2016 10:59:05 +1200 Subject: [PATCH 11/16] functions to check if reminder should go ahead --- code/extensions/SiteTreeContentReview.php | 77 +++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/code/extensions/SiteTreeContentReview.php b/code/extensions/SiteTreeContentReview.php index 472b543..f8f209b 100644 --- a/code/extensions/SiteTreeContentReview.php +++ b/code/extensions/SiteTreeContentReview.php @@ -450,6 +450,83 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider return (bool) $nextDate; } + + public function canRemind(Member $member = null) { + if (!$this->owner->obj("NextReviewDate")->exists()) { + return false; + } + + // If today is not the date of the first reminder, return false + $config = SiteConfig::current_site_config(); + $firstReview = $config->FirstReviewDaysBefore; + $now = SS_Datetime::now(); + $notifyDate1 = date('Y-m-d', strtotime($this->owner->NextReviewDate . ' -' . $firstReview . ' days')); + + // If today is not the first reminder date + if (!$notifyDate1 == $now->URLDate()) { + return false; + } + + $options = $this->getOptions(); + + if (!$options) { + return false; + } elseif ($options->OwnerGroups()->count() == 0 && $options->OwnerUsers()->count() == 0) { + return false; + } + + if (!$member) { + return true; + } + + if ($member->inGroups($options->OwnerGroups())) { + return true; + } + + if ($options->OwnerUsers()->find("ID", $member->ID)) { + return true; + } + + return false; + } + + public function canRemindAgain(Member $member = null) { + if (!$this->owner->obj("NextReviewDate")->exists()) { + return false; + } + + // If today is not the date of the second reminder, return false + $config = SiteConfig::current_site_config(); + $secondReview = $config->SecondReviewDaysBefore; + $now = SS_Datetime::now(); + $notifyDate2 = date('Y-m-d', strtotime($this->owner->NextReviewDate . ' -' . $secondReview . ' days')); + + if (!$notifyDate2 == $now->URLDate()) { + return false; + } + + $options = $this->getOptions(); + + if (!$options) { + return false; + } elseif ($options->OwnerGroups()->count() == 0 && $options->OwnerUsers()->count() == 0) { + return false; + } + + if (!$member) { + return true; + } + + if ($member->inGroups($options->OwnerGroups())) { + return true; + } + + if ($options->OwnerUsers()->find("ID", $member->ID)) { + return true; + } + + return false; + } /** * Check if a review is due by a member for this owner. From d73a96fa8f7bc3fc5208077596383b87c15a79d9 Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 24 Aug 2016 10:59:23 +1200 Subject: [PATCH 12/16] additional settings for emalis --- .../ContentReviewDefaultSettings.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/code/extensions/ContentReviewDefaultSettings.php b/code/extensions/ContentReviewDefaultSettings.php index 4526cf2..69f5e77 100644 --- a/code/extensions/ContentReviewDefaultSettings.php +++ b/code/extensions/ContentReviewDefaultSettings.php @@ -17,7 +17,11 @@ class ContentReviewDefaultSettings extends DataExtension 'ReviewPeriodDays' => 'Int', 'ReviewFrom' => 'Varchar(255)', 'ReviewSubject' => 'Varchar(255)', + 'ReviewSubjectFirstReminder' => 'Varchar(255)', + 'ReviewSubjectSecondReminder' => 'Varchar(255)', 'ReviewBody' => 'HTMLText', + 'ReviewBodyFirstReminder' => 'HTMLText', + 'ReviewBodySecondReminder' => 'HTMLText', 'FirstReviewDaysBefore' => 'Int', 'SecondReviewDaysBefore' => 'Int' ); @@ -28,9 +32,14 @@ class ContentReviewDefaultSettings extends DataExtension * @var array */ private static $defaults = array( + 'ReviewSubjectFirstReminder' => 'Page(s) are 1 month from content review', + 'ReviewSubjectSecondReminder' => 'Page(s) are 1 week from content review', 'ReviewSubject' => 'Page(s) are due for content review', + 'ReviewBodyFirstReminder' => '

Page(s) 1 month from review

There are $PagesCount pages that are due for review by you 1 month from today.

', + 'ReviewBodySecondReminder' => '

Page(s) 1 week from from review

There are $PagesCount pages that are due for review by you 1 week from today.

', 'ReviewBody' => '

Page(s) due for review

There are $PagesCount pages that are due for review today by you.

', - 'FirstReviewDaysBefore' => 'Int' + 'FirstReviewDaysBefore' => '30', + 'SecondReviewDaysBefore' => '7' ); /** @@ -166,8 +175,12 @@ class ContentReviewDefaultSettings extends DataExtension array( TextField::create('ReviewFrom', _t('ContentReview.EMAILFROM', 'From email address')) ->setRightTitle(_t('Review.EMAILFROM_RIGHTTITLE', 'e.g: do-not-reply@site.com')), - TextField::create('ReviewSubject', _t('ContentReview.EMAILSUBJECT', 'Subject line')), - TextAreaField::create('ReviewBody', _t('ContentReview.EMAILTEMPLATE', 'Email template')), + TextField::create('ReviewSubjectFirstReminder', _t('ContentReview.EMAILSUBJECTFIRSTREMINDER', 'Subject line - First reminder')), + TextField::create('ReviewSubjectSecondReminder', _t('ContentReview.EMAILSUBJECTSECONDREMINDER', 'Subject line - Second reminder')), + TextField::create('ReviewSubject', _t('ContentReview.EMAILSUBJECT', 'Subject line - Review due')), + TextAreaField::create('ReviewBodyFirstReminder', _t('ContentReview.EMAILTEMPLATEFIRSTREMINDER', 'Email template - First reminder')), + TextAreaField::create('ReviewBodySecondReminder', _t('ContentReview.EMAILTEMPLATESECONDREMINDER', 'Email template - Second reminder')), + TextAreaField::create('ReviewBody', _t('ContentReview.EMAILTEMPLATE', 'Email template - Review due')), LiteralField::create('TemplateHelp', $this->owner->renderWith('ContentReviewAdminHelp')), ) ); From e02991ef059ee07899a713051d453016e3058ed3 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 29 Aug 2016 19:13:23 +1200 Subject: [PATCH 13/16] include review info in the in the recorded content review --- code/extensions/ContentReviewCMSExtension.php | 3 +-- code/extensions/SiteTreeContentReview.php | 5 ++++- code/models/ContentReviewLog.php | 8 +++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/code/extensions/ContentReviewCMSExtension.php b/code/extensions/ContentReviewCMSExtension.php index c22b565..1300954 100644 --- a/code/extensions/ContentReviewCMSExtension.php +++ b/code/extensions/ContentReviewCMSExtension.php @@ -31,9 +31,8 @@ class ContentReviewCMSExtension extends LeftAndMainExtension } $notes = (!empty($data["ReviewNotes"]) ? $data["ReviewNotes"] : _t("ContentReview.NOCOMMENTS", "(no comments)")); - $page->addReviewNote(Member::currentUser(), $notes); + $page->addReviewNote(Member::currentUser(), $notes, $page->ReviewInfo); $page->advanceReviewDate(); - $this->owner->getResponse()->addHeader("X-Status", _t("ContentReview.REVIEWSUCCESSFUL", "Content reviewed successfully")); return $this->owner->redirectBack(); } diff --git a/code/extensions/SiteTreeContentReview.php b/code/extensions/SiteTreeContentReview.php index f8f209b..d467261 100644 --- a/code/extensions/SiteTreeContentReview.php +++ b/code/extensions/SiteTreeContentReview.php @@ -418,11 +418,14 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider * @param Member $reviewer * @param string $message */ - public function addReviewNote(Member $reviewer, $message) + public function addReviewNote(Member $reviewer, $message, $reviewInfo = null) { $reviewLog = ContentReviewLog::create(); $reviewLog->Note = $message; $reviewLog->ReviewerID = $reviewer->ID; + if ($reviewInfo) { + $reviewLog->ReviewInfo = $reviewInfo; + } $this->owner->ReviewLogs()->add($reviewLog); } diff --git a/code/models/ContentReviewLog.php b/code/models/ContentReviewLog.php index 4c890c8..d6caeb6 100644 --- a/code/models/ContentReviewLog.php +++ b/code/models/ContentReviewLog.php @@ -7,6 +7,7 @@ class ContentReviewLog extends DataObject */ private static $db = array( "Note" => "Text", + "ReviewInfo" => "Text" ); /** @@ -21,9 +22,10 @@ class ContentReviewLog extends DataObject * @var array */ private static $summary_fields = array( - "Note" => array("title" => "Note"), - "Created" => array("title" => "Reviewed at"), - "Reviewer.Title" => array("title" => "Reviewed by"), + "ReviewInfo" => array("title" => "Review Information"), + "Note" => array("title" => "Note"), + "Created" => array("title" => "Reviewed at"), + "Reviewer.Title" => array("title" => "Reviewed by"), ); /** From 556f3c312622d8638a5d8ef5ee72c69a0d90726a Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 30 Aug 2016 17:01:35 +1200 Subject: [PATCH 14/16] further refactor to send emails to single address --- code/extensions/ContentReviewCMSExtension.php | 3 +- .../ContentReviewDefaultSettings.php | 20 +-- code/extensions/SiteTreeContentReview.php | 40 +---- code/tasks/ContentReviewEmails.php | 150 ++++++++++++------ lang/en.yml | 9 +- templates/ContentReviewReminderEmail.ss | 41 +++++ 6 files changed, 157 insertions(+), 106 deletions(-) create mode 100644 templates/ContentReviewReminderEmail.ss diff --git a/code/extensions/ContentReviewCMSExtension.php b/code/extensions/ContentReviewCMSExtension.php index 1300954..444af70 100644 --- a/code/extensions/ContentReviewCMSExtension.php +++ b/code/extensions/ContentReviewCMSExtension.php @@ -28,8 +28,7 @@ class ContentReviewCMSExtension extends LeftAndMainExtension $page = $this->findRecord($data); if (!$page->canEdit()) { return Security::permissionFailure($this->owner); - } - + } $notes = (!empty($data["ReviewNotes"]) ? $data["ReviewNotes"] : _t("ContentReview.NOCOMMENTS", "(no comments)")); $page->addReviewNote(Member::currentUser(), $notes, $page->ReviewInfo); $page->advanceReviewDate(); diff --git a/code/extensions/ContentReviewDefaultSettings.php b/code/extensions/ContentReviewDefaultSettings.php index 69f5e77..3eba067 100644 --- a/code/extensions/ContentReviewDefaultSettings.php +++ b/code/extensions/ContentReviewDefaultSettings.php @@ -17,11 +17,11 @@ class ContentReviewDefaultSettings extends DataExtension 'ReviewPeriodDays' => 'Int', 'ReviewFrom' => 'Varchar(255)', 'ReviewSubject' => 'Varchar(255)', - 'ReviewSubjectFirstReminder' => 'Varchar(255)', - 'ReviewSubjectSecondReminder' => 'Varchar(255)', + 'ReviewSubjectReminder' => 'Varchar(255)', 'ReviewBody' => 'HTMLText', 'ReviewBodyFirstReminder' => 'HTMLText', 'ReviewBodySecondReminder' => 'HTMLText', + 'ReviewReminderEmail' => 'Text', 'FirstReviewDaysBefore' => 'Int', 'SecondReviewDaysBefore' => 'Int' ); @@ -32,12 +32,12 @@ class ContentReviewDefaultSettings extends DataExtension * @var array */ private static $defaults = array( - 'ReviewSubjectFirstReminder' => 'Page(s) are 1 month from content review', - 'ReviewSubjectSecondReminder' => 'Page(s) are 1 week from content review', + 'ReviewSubjectReminder' => 'Page(s) are approaching content review date', 'ReviewSubject' => 'Page(s) are due for content review', 'ReviewBodyFirstReminder' => '

Page(s) 1 month from review

There are $PagesCount pages that are due for review by you 1 month from today.

', 'ReviewBodySecondReminder' => '

Page(s) 1 week from from review

There are $PagesCount pages that are due for review by you 1 week from today.

', 'ReviewBody' => '

Page(s) due for review

There are $PagesCount pages that are due for review today by you.

', + 'ReviewReminderEmail' => 'govt.nz@dia.govt.nz', 'FirstReviewDaysBefore' => '30', 'SecondReviewDaysBefore' => '7' ); @@ -62,6 +62,7 @@ class ContentReviewDefaultSettings extends DataExtension * @var string */ private static $content_review_template = 'ContentReviewEmail'; + private static $content_review_reminder_template = 'ContentReviewReminderEmail'; /** * @return string @@ -175,12 +176,13 @@ class ContentReviewDefaultSettings extends DataExtension array( TextField::create('ReviewFrom', _t('ContentReview.EMAILFROM', 'From email address')) ->setRightTitle(_t('Review.EMAILFROM_RIGHTTITLE', 'e.g: do-not-reply@site.com')), - TextField::create('ReviewSubjectFirstReminder', _t('ContentReview.EMAILSUBJECTFIRSTREMINDER', 'Subject line - First reminder')), - TextField::create('ReviewSubjectSecondReminder', _t('ContentReview.EMAILSUBJECTSECONDREMINDER', 'Subject line - Second reminder')), + TextField::create('ReviewReminderEmail','Review reminder email address') + ->setRightTitle('e.g: review.reminders@site.com'), + TextField::create('ReviewSubjectReminder', _t('ContentReview.EMAILSUBJECTREMINDER', 'Subject line - reminder')), TextField::create('ReviewSubject', _t('ContentReview.EMAILSUBJECT', 'Subject line - Review due')), - TextAreaField::create('ReviewBodyFirstReminder', _t('ContentReview.EMAILTEMPLATEFIRSTREMINDER', 'Email template - First reminder')), - TextAreaField::create('ReviewBodySecondReminder', _t('ContentReview.EMAILTEMPLATESECONDREMINDER', 'Email template - Second reminder')), - TextAreaField::create('ReviewBody', _t('ContentReview.EMAILTEMPLATE', 'Email template - Review due')), + TextAreaField::create('ReviewBodyFirstReminder', _t('ContentReview.EMAILTEMPLATEFIRSTREMINDER', 'Email body - First reminder')), + TextAreaField::create('ReviewBodySecondReminder', _t('ContentReview.EMAILTEMPLATESECONDREMINDER', 'Email body - Second reminder')), + TextAreaField::create('ReviewBody', _t('ContentReview.EMAILTEMPLATE', 'Email body - Review due')), LiteralField::create('TemplateHelp', $this->owner->renderWith('ContentReviewAdminHelp')), ) ); diff --git a/code/extensions/SiteTreeContentReview.php b/code/extensions/SiteTreeContentReview.php index d467261..4f0b53d 100644 --- a/code/extensions/SiteTreeContentReview.php +++ b/code/extensions/SiteTreeContentReview.php @@ -492,45 +492,7 @@ class SiteTreeContentReview extends DataExtension implements PermissionProvider return false; } - - public function canRemindAgain(Member $member = null) { - if (!$this->owner->obj("NextReviewDate")->exists()) { - return false; - } - - // If today is not the date of the second reminder, return false - $config = SiteConfig::current_site_config(); - $secondReview = $config->SecondReviewDaysBefore; - $now = SS_Datetime::now(); - $notifyDate2 = date('Y-m-d', strtotime($this->owner->NextReviewDate . ' -' . $secondReview . ' days')); - - if (!$notifyDate2 == $now->URLDate()) { - return false; - } - - $options = $this->getOptions(); - - if (!$options) { - return false; - } elseif ($options->OwnerGroups()->count() == 0 && $options->OwnerUsers()->count() == 0) { - return false; - } - - if (!$member) { - return true; - } - - if ($member->inGroups($options->OwnerGroups())) { - return true; - } - - if ($options->OwnerUsers()->find("ID", $member->ID)) { - return true; - } - - return false; - } - + /** * Check if a review is due by a member for this owner. * diff --git a/code/tasks/ContentReviewEmails.php b/code/tasks/ContentReviewEmails.php index 0a6f2dd..0e38872 100644 --- a/code/tasks/ContentReviewEmails.php +++ b/code/tasks/ContentReviewEmails.php @@ -18,6 +18,8 @@ class ContentReviewEmails extends BuildTask $pages = Page::get() ->filter('NextReviewDate:LessThanOrEqual', $now->URLDate()); + + // Calculate whether today is the date a First or Second review should occur $config = SiteConfig::current_site_config(); $firstReview = $config->FirstReviewDaysBefore; @@ -29,39 +31,51 @@ class ContentReviewEmails extends BuildTask // for each of these pages, check if today is the date the First or Second // reminder should be sent, and if so, add it to the appropriate ArrayList - $pendingPagesFirstReminder = new ArrayList(); - $pendingPagesSecondReminder = new ArrayList(); + $firstReminderPages = new ArrayList(); + $secondReminderPages = new ArrayList(); foreach ($pendingPages as $page) { $notifyDate1 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $firstReview . ' days')); $notifyDate2 = date('Y-m-d', strtotime($page->NextReviewDate . ' -' . $secondReview . ' days')); if ($notifyDate1 == $now->URLDate()) { - $pendingPagesFirstReminder->push($page); + $firstReminderPages->push($page); } if ($notifyDate2 == $now->URLDate()) { - $pendingPagesSecondReminder->push($page); + $secondReminderPages->push($page); } } - $overduePages = $this->getNotifiablePagesForOwners($pages, "due"); - $firstReminderPages = $this->getNotifiablePagesForOwners($pendingPagesFirstReminder, "first"); - $secondReminderPages = $this->getNotifiablePagesForOwners($pendingPagesSecondReminder, "second"); + + + + +Debug::show('====================================================================FIRST REMINDER'); + foreach ($firstReminderPages as $p) { + Debug::show($p->Title); + } +Debug::show('====================================================================SECOND REMINDER'); + foreach ($secondReminderPages as $p) { + Debug::show($p->Title); + } +Debug::show('====================================================================DUE/OVERDUE'); + foreach ($pages as $p) { + Debug::show($p->Title); + } + //die(); + + + + $overduePages = $this->getNotifiablePagesForOwners($pages); // 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->notifyOwner($memberID, $pages, "due"); + //$this->notifyOwner($memberID, $pages, "due"); } - // Send a separate email with a different subject line for the first reminder - foreach ($firstReminderPages as $memberID => $pages) { - $this->notifyOwner($memberID, $pages, "first"); - } - - // Send a separate email with a different subject line for the second reminder - foreach ($secondReminderPages as $memberID => $pages) { - $this->notifyOwner($memberID, $pages, "second"); - } + // Send an email to the generic address with any first or second reminders + $this->notifyTeam($firstReminderPages, $secondReminderPages); + die(); ContentReviewCompatability::done($compatibility); } @@ -71,28 +85,16 @@ class ContentReviewEmails extends BuildTask * * @return array */ - protected function getNotifiablePagesForOwners(SS_list $pages, $type) + protected function getNotifiablePagesForOwners(SS_list $pages) { $overduePages = array(); foreach ($pages as $page) { - if ($type == "first") { - if (!$page->canRemind()) { - continue; - } + if (!$page->canRemind()) { + continue; } - if ($type == "second") { - if (!$page->canRemindAgain()) { - continue; - } - } - if ($type == "due") { - if (!$page->canBeReviewedBy()) { - continue; - } - } - + $option = $page->getOptions(); foreach ($option->ContentReviewOwners() as $owner) { @@ -105,6 +107,45 @@ class ContentReviewEmails extends BuildTask } return $overduePages; + } + + protected function notifyTeam($firstReminderPages, $secondReminderPages) { + // Prepare variables + $siteConfig = SiteConfig::current_site_config(); + $templateVariables1 = $this->getTemplateVariables('', $siteConfig, $firstReminderPages, 'reminder1'); + $templateVariables2 = $this->getTemplateVariables('', $siteConfig, $secondReminderPages, 'reminder2'); + + // Build email + $email = new Email(); + $email->setTo($siteConfig->Email); + $email->setFrom($siteConfig->ReviewFrom); + + $subject = $siteConfig->ReviewSubject; + $email->setSubject($subject); + + + + + // Get user-editable body + $bodyFirstReminder = $this->getEmailBody($siteConfig, $templateVariables1, 'reminder1'); + $bodySecondReminder = $this->getEmailBody($siteConfig, $templateVariables2, 'reminder2'); + + // Populate mail body with fixed template + $email->setTemplate($siteConfig->config()->content_review_reminder_template); + $email->populateTemplate($templateVariables1, $templateVariables2); + $email->populateTemplate(array( + 'EmailBodyFirstReminder' => $bodyFirstReminder, + 'EmailBodySecondReminder' => $bodySecondReminder, + 'Recipient' => $siteConfig->ReviewReminderEmail, + 'FirstReminderPages' => $firstReminderPages, + 'SecondReminderPages' => $secondReminderPages, + )); + + Debug::show($email); + //$email->send(); + + + } /** @@ -124,9 +165,7 @@ class ContentReviewEmails extends BuildTask $email->setTo($owner->Email); $email->setFrom($siteConfig->ReviewFrom); - if ($type == "first"){$subject = $siteConfig->ReviewSubjectFirstReminder;} - if ($type == "second"){$subject = $siteConfig->ReviewSubjectSecondReminder;} - if ($type == "due"){$subject = $siteConfig->ReviewSubject;} + $subject = $siteConfig->ReviewSubject; $email->setSubject($subject); // Get user-editable body @@ -155,10 +194,10 @@ class ContentReviewEmails extends BuildTask */ protected function getEmailBody($config, $variables, $type) { - if ($type == "first") { + if ($type == "reminder1") { $template = SSViewer::fromString($config->ReviewBodyFirstReminder); } - if ($type == "second") { + if ($type == "reminder2") { $template = SSViewer::fromString($config->ReviewBodySecondReminder); } if ($type == "due") { @@ -184,20 +223,29 @@ class ContentReviewEmails extends BuildTask * * @return array */ - protected function getTemplateVariables($recipient, $config, $pages, $type) + protected function getTemplateVariables($recipient = null, $config, $pages) { - if ($type == "first") {$subject = $config->ReviewSubjectFirstReminder;} - if ($type == "second") {$subject = $config->ReviewSubjectSecondReminder;} - if ($type == "due") {$subject = $config->ReviewSubject;} + if ($recipient != null) { + return array( + 'Subject' => $config->ReviewSubject, + 'PagesCount' => $pages->count(), + 'FromEmail' => $config->ReviewFrom, + 'ToFirstName' => $recipient->FirstName, + 'ToSurname' => $recipient->Surname, + 'ToEmail' => $recipient->Email + ); + } else { + return array( + 'Subject' => $config->ReviewSubjectReminder, + 'FirstReminderPagesCount' => $pages->count(), + 'SecondReminderPagesCount' => $pages->count(), + 'FromEmail' => $config->ReviewFrom, + 'ToEmail' => $config->ReviewReminderEmail + ); + + } + + - return array( - 'Subject' => $subject, - 'PagesCount' => $pages->count(), - 'FromEmail' => $config->ReviewFrom, - 'ToFirstName' => $recipient->FirstName, - 'ToSurname' => $recipient->Surname, - 'ToEmail' => $recipient->Email, - 'Type' => $type - ); } } diff --git a/lang/en.yml b/lang/en.yml index f963b22..bfcf93b 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -10,12 +10,11 @@ en: DEFAULTSETTINGSHELP: 'These content review settings will apply to all pages that does not have specific Content Review schedule.' DISABLE: 'Disable content review' EMAILFROM: 'From email address' - EMAILSUBJECTFIRSTREMINDER: 'Subject line - First reminder' - EMAILSUBJECTSECONDREMINDER: 'Subject line - Second reminder' + EMAILSUBJECTREMINDER: 'Subject line - Reminder' EMAILSUBJECT: 'Subject line - Review due' - EMAILTEMPLATEFIRSTREMINDER: 'Email template - First reminder' - EMAILTEMPLATESECONDREMINDER: 'Email template - Second reminder' - EMAILTEMPLATE: 'Email template - Review due' + EMAILTEMPLATEFIRSTREMINDER: 'Email body - First reminder' + EMAILTEMPLATESECONDREMINDER: 'Email body - Second reminder' + EMAILTEMPLATE: 'Email body - Review due' FIRSTREVIEWDAYSBEFORE: 'First review reminder # days before final review' INHERIT: 'Inherit from parent page' MARKREVIEWED: 'Mark as reviewed' diff --git a/templates/ContentReviewReminderEmail.ss b/templates/ContentReviewReminderEmail.ss new file mode 100644 index 0000000..fd4695a --- /dev/null +++ b/templates/ContentReviewReminderEmail.ss @@ -0,0 +1,41 @@ + + + + + + + + + + <% loop $FirstReminderPages %> + + + + + <% end_loop %> + +
+ $EmailBodyFirstReminder +
$Title<% _t('ContentReviewEmails.REVIEWPAGELINK','Review the page in the CMS') %>
+ <% _t('ContentReviewEmails.VIEWPUBLISHEDLINK','View this page on the website') %> +
+ + + + + + + <% loop $SecondReminderPages %> + + + + + <% end_loop %> + +
+ $EmailBodySecondReminder +
$Title<% _t('ContentReviewEmails.REVIEWPAGELINK','Review the page in the CMS') %>
+ <% _t('ContentReviewEmails.VIEWPUBLISHEDLINK','View this page on the website') %> +
+ + \ No newline at end of file From 6e0240deb351ae4beba849d451ce8b4cf277df8b Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 31 Aug 2016 08:28:09 +1200 Subject: [PATCH 15/16] finalise email behaviour --- .../ContentReviewDefaultSettings.php | 29 ++++++------- code/tasks/ContentReviewEmails.php | 43 +++++-------------- readme.md | 14 ++++++ templates/ContentReviewAdminHelp.ss | 26 ++++++++--- 4 files changed, 57 insertions(+), 55 deletions(-) diff --git a/code/extensions/ContentReviewDefaultSettings.php b/code/extensions/ContentReviewDefaultSettings.php index 3eba067..936fa55 100644 --- a/code/extensions/ContentReviewDefaultSettings.php +++ b/code/extensions/ContentReviewDefaultSettings.php @@ -34,8 +34,8 @@ class ContentReviewDefaultSettings extends DataExtension private static $defaults = array( 'ReviewSubjectReminder' => 'Page(s) are approaching content review date', 'ReviewSubject' => 'Page(s) are due for content review', - 'ReviewBodyFirstReminder' => '

Page(s) 1 month from review

There are $PagesCount pages that are due for review by you 1 month from today.

', - 'ReviewBodySecondReminder' => '

Page(s) 1 week from from review

There are $PagesCount pages that are due for review by you 1 week from today.

', + 'ReviewBodyFirstReminder' => '

Page(s) 1 month from review

There are $FirstReminderPagesCount pages that are due for review by you 1 month from today.

', + 'ReviewBodySecondReminder' => '

Page(s) 1 week from from review

There are $SecondReminderPagesCount pages that are due for review by you 1 week from today.

', 'ReviewBody' => '

Page(s) due for review

There are $PagesCount pages that are due for review today by you.

', 'ReviewReminderEmail' => 'govt.nz@dia.govt.nz', 'FirstReviewDaysBefore' => '30', @@ -125,19 +125,6 @@ class ContentReviewDefaultSettings extends DataExtension $fields->addFieldToTab('Root.ContentReview', $reviewFrequency); - $FirstReviewDaysBefore = NumericField::create( - 'FirstReviewDaysBefore', - _t('ContentReview.FIRSTREVIEWDAYSBEFORE', 'First review reminder # days before final review') - ); - - $fields->addFieldToTab('Root.ContentReview', $FirstReviewDaysBefore); - - $SecondReviewDaysBefore = NumericField::create( - 'SecondReviewDaysBefore', - _t('ContentReview.SECONDREVIEWDAYSBEFORE', 'Second review reminder # days before final review') - ); - - $fields->addFieldToTab('Root.ContentReview', $SecondReviewDaysBefore); $users = Permission::get_members_by_permission(array( 'CMS_ACCESS_CMSMain', @@ -170,12 +157,24 @@ class ContentReviewDefaultSettings extends DataExtension $fields->addFieldToTab('Root.ContentReview', $groupField); + $FirstReviewDaysBefore = NumericField::create( + 'FirstReviewDaysBefore', + _t('ContentReview.FIRSTREVIEWDAYSBEFORE', 'First review reminder # days before final review') + ); + + $SecondReviewDaysBefore = NumericField::create( + 'SecondReviewDaysBefore', + _t('ContentReview.SECONDREVIEWDAYSBEFORE', 'Second review reminder # days before final review') + ); + // Email content $fields->addFieldsToTab( 'Root.ContentReview', array( TextField::create('ReviewFrom', _t('ContentReview.EMAILFROM', 'From email address')) ->setRightTitle(_t('Review.EMAILFROM_RIGHTTITLE', 'e.g: do-not-reply@site.com')), + $FirstReviewDaysBefore, + $SecondReviewDaysBefore, TextField::create('ReviewReminderEmail','Review reminder email address') ->setRightTitle('e.g: review.reminders@site.com'), TextField::create('ReviewSubjectReminder', _t('ContentReview.EMAILSUBJECTREMINDER', 'Subject line - reminder')), diff --git a/code/tasks/ContentReviewEmails.php b/code/tasks/ContentReviewEmails.php index 0e38872..775bdde 100644 --- a/code/tasks/ContentReviewEmails.php +++ b/code/tasks/ContentReviewEmails.php @@ -46,26 +46,6 @@ class ContentReviewEmails extends BuildTask } } - - - - -Debug::show('====================================================================FIRST REMINDER'); - foreach ($firstReminderPages as $p) { - Debug::show($p->Title); - } -Debug::show('====================================================================SECOND REMINDER'); - foreach ($secondReminderPages as $p) { - Debug::show($p->Title); - } -Debug::show('====================================================================DUE/OVERDUE'); - foreach ($pages as $p) { - Debug::show($p->Title); - } - //die(); - - - $overduePages = $this->getNotifiablePagesForOwners($pages); // Send one email to one owner with all the pages in there instead of no of pages of emails. @@ -109,6 +89,12 @@ Debug::show('=================================================================== return $overduePages; } + /** + * Send an email to the configured team indicating which notices are at 'first reminder' or 'second reminder' status + * The 'days before due' value for each of these is configurable in settings. + * ie. a value of 30 for the 'first reminder' setting means a page with a review date exactly 30 days from due, will + * be present in the email sent to the configured address. + */ protected function notifyTeam($firstReminderPages, $secondReminderPages) { // Prepare variables $siteConfig = SiteConfig::current_site_config(); @@ -117,15 +103,12 @@ Debug::show('=================================================================== // Build email $email = new Email(); - $email->setTo($siteConfig->Email); + $email->setTo($siteConfig->ReviewReminderEmail); $email->setFrom($siteConfig->ReviewFrom); - $subject = $siteConfig->ReviewSubject; + $subject = $siteConfig->ReviewSubjectReminder; $email->setSubject($subject); - - - // Get user-editable body $bodyFirstReminder = $this->getEmailBody($siteConfig, $templateVariables1, 'reminder1'); $bodySecondReminder = $this->getEmailBody($siteConfig, $templateVariables2, 'reminder2'); @@ -136,16 +119,11 @@ Debug::show('=================================================================== $email->populateTemplate(array( 'EmailBodyFirstReminder' => $bodyFirstReminder, 'EmailBodySecondReminder' => $bodySecondReminder, - 'Recipient' => $siteConfig->ReviewReminderEmail, 'FirstReminderPages' => $firstReminderPages, 'SecondReminderPages' => $secondReminderPages, )); - Debug::show($email); - //$email->send(); - - - + $email->send(); } /** @@ -180,8 +158,7 @@ Debug::show('=================================================================== 'Pages' => $pages, )); - Debug::show($email); - //$email->send(); + $email->send(); } /** diff --git a/readme.md b/readme.md index a797eda..2f9ac9e 100644 --- a/readme.md +++ b/readme.md @@ -6,6 +6,20 @@ [![License](http://img.shields.io/packagist/l/silverstripe/contentreview.svg?style=flat-square)](license.md) ![helpfulrobot](https://helpfulrobot.io/silverstripe/contentreview/badge) +**Note:** _Govt.nz customisations to this module are as follows_ + +Prior to the due date, the content review task will send an email to the address configured in the settings. + +This email contains two lists: +- a list of pages whose review date is exactly 1 month in the future. +- another list of pages whose review date is exactly 1 week in the future. + +Both these times (1 month and 1 week) are defaults only, and can be configured in the settings area. + +The email body for these reminder emails is also configurable in the settings. + +--- + This module helps keep your website content accurate and up-to-date, which keeps your users happy. It does so by sending reviewers reminder emails to go in and check the content. For a reviewer this diff --git a/templates/ContentReviewAdminHelp.ss b/templates/ContentReviewAdminHelp.ss index 243a541..5682ac8 100644 --- a/templates/ContentReviewAdminHelp.ss +++ b/templates/ContentReviewAdminHelp.ss @@ -1,10 +1,22 @@ -

This is a list of dynamic variables that you can use in the email templates.

+

This is a list of dynamic variables that you can use in the First and Second reminder email templates.

    -
  • $Subject - Email subject line
  • -
  • $PagesCount - Number of pages pending review
  • -
  • $FromEmail - Sender email address
  • -
  • $ToFirstName - The email receivers first name
  • -
  • $ToSurname - The email receivers surname
  • -
  • $ToEmail - The email receivers email
  • +
  • $Subject - Email subject line
  • +
  • $FirstReminderPagesCount - Number of pages approaching review date (first reminder)
  • +
  • $SecondReminderPagesCount - Number of pages approaching review date (second reminder)
  • +
  • $FromEmail - Sender email address
  • +
  • $ToEmail - The email receivers email
  • +
+ +
+ +

This is a list of dynamic variables that you can use in the Due email template.

+ +
    +
  • $Subject - Email subject line
  • +
  • $PagesCount - Number of pages pending review
  • +
  • $FromEmail - Sender email address
  • +
  • $ToFirstName - The email receivers first name
  • +
  • $ToSurname - The email receivers surname
  • +
  • $ToEmail - The email receivers email
From d24786ef4e5443e04222c743f34d447035e7ae49 Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 31 Aug 2016 11:04:38 +1200 Subject: [PATCH 16/16] remove die and comment --- code/tasks/ContentReviewEmails.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/tasks/ContentReviewEmails.php b/code/tasks/ContentReviewEmails.php index 775bdde..7b4bded 100644 --- a/code/tasks/ContentReviewEmails.php +++ b/code/tasks/ContentReviewEmails.php @@ -50,12 +50,11 @@ class ContentReviewEmails extends BuildTask // 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->notifyOwner($memberID, $pages, "due"); + $this->notifyOwner($memberID, $pages, "due"); } // Send an email to the generic address with any first or second reminders $this->notifyTeam($firstReminderPages, $secondReminderPages); - die(); ContentReviewCompatability::done($compatibility); }