From 9bc51d9ce97c266ab6949fc72a45344da77c0e31 Mon Sep 17 00:00:00 2001 From: Tom Rix Date: Mon, 2 Nov 2009 04:02:57 +0000 Subject: [PATCH] Added content review module --- LICENSE | 0 README.md | 20 ++++++++ _config.php | 3 ++ code/ContentReviewEmails.php | 52 +++++++++++++++++++ code/PagesDueForReviewSideReport.php | 76 ++++++++++++++++++++++++++++ code/SiteTreeContentReview.php | 71 ++++++++++++++++++++++++++ 6 files changed, 222 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 _config.php create mode 100644 code/ContentReviewEmails.php create mode 100644 code/PagesDueForReviewSideReport.php create mode 100644 code/SiteTreeContentReview.php diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..a24c902 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# Content Review module + +## Maintainer Contact +* Tom Rix (Nickname: trix) + + +## Requirements + * SilverStripe 2.3 or newer + + +## Installation + +Drop it into your installation folder, and refresh your database schema +through `http:///dev/build`. + +## Usage + +When you open a page in the CMS, there will now be a Review tab. + + diff --git a/_config.php b/_config.php new file mode 100644 index 0000000..ac847ab --- /dev/null +++ b/_config.php @@ -0,0 +1,3 @@ +process(); } + function process() { + // Disable subsite filter (if installed) + if (ClassInfo::exists('Subsite')) { + $oldSubsiteState = Subsite::$disable_subsite_filter; + Subsite::$disable_subsite_filter = true; + } + + $pages = DataObject::get('Page', "NextReviewDate = '".date('Y-m-d')."' AND OwnerID != 0"); + if ($pages && $pages->Count()) { + foreach($pages as $page) { + $owner = $page->Owner(); + if ($owner) { + $sender = Security::findAnAdministrator(); + $recipient = $owner; + + $subject = sprintf(_t('ContentReviewEmails.SUBJECT', 'Page %s due for content review'), $page->Title); + + $email = new Email(); + $email->setTo($recipient->Email); + $email->setFrom(($sender->Email) ? $sender->Email : Email::getAdminEmail()); + $email->setTemplate('ContentReviewEmails'); + $email->setSubject($subject); + $email->populateTemplate(array( + "PageCMSLink" => "admin/show/".$page->ID, + "Recipient" => $recipient, + "Sender" => $sender, + "Page" => $page, + "StageSiteLink" => $page->Link()."?stage=stage", + "LiveSiteLink" => $page->Link()."?stage=live", + )); + + return $email->send(); + } + } + } + + // Revert subsite filter (if installed) + if (ClassInfo::exists('Subsite')) { + Subsite::$disable_subsite_filter = $oldSubsiteState; + } + } +} diff --git a/code/PagesDueForReviewSideReport.php b/code/PagesDueForReviewSideReport.php new file mode 100644 index 0000000..d4527f1 --- /dev/null +++ b/code/PagesDueForReviewSideReport.php @@ -0,0 +1,76 @@ +params['ReviewDate']) && $this->params['ReviewDate']) { + $where[] = 'NextReviewDate <= \'' . Convert::raw2sql($this->params['ReviewDate']) . '\''; + } else { + $where[] = 'NextReviewDate <= \'' . SS_Datetime::now()->URLDate() . '\''; + } + + if(isset($this->params['OwnerID'])) { + switch($this->params['OwnerID']) { + case 'any-owner': + break; + case 'no-owner': + $where[] = 'OwnerID = 0'; + default: + $where[] = 'OwnerID = ' . (int) $this->params['OwnerID']; + break; + } + } + + return DataObject::get('SiteTree', $where); + } + + function fieldsToShow() { + return array( + "Title" => array( + "source" => array("NestedTitle", array("2")), + "link" => true, + ), + "Date" => array( + "prefix" => 'Due for review on ', + "source" => "NextReviewDate", + ), + "Owner" => array( + "prefix" => ', owned by ', + "source" => "OwnerName" + ) + ); + } + + function getParameterFields() { + $cmsUsers = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN")); + + $options = array( + 'any-owner' => 'Any owner', + 'no-owner' => 'No owner' + ); + + $options = array_merge($options, $cmsUsers->map('ID', 'Title')); + + return new FieldSet( + new DateField('ReviewDate', 'Review date (YYYY-MM-DD)'), + new DropdownField("OwnerID", 'Page owner', $options) + ); + } +} + +?> diff --git a/code/SiteTreeContentReview.php b/code/SiteTreeContentReview.php new file mode 100644 index 0000000..82d9840 --- /dev/null +++ b/code/SiteTreeContentReview.php @@ -0,0 +1,71 @@ + array( + "ReviewPeriodDays" => "Int", + "NextReviewDate" => "Date", + 'ReviewNotes' => 'Text' + ), + 'has_one' => array( + 'Owner' => 'Member' + ), + ); + } + + function getOwnerName() { + if($this->owner->Owner()) return $this->owner->Owner()->FirstName . ' ' . $this->owner->Owner()->Surname; + } + + public function updateCMSFields(&$fields) { + if(Permission::check("EDIT_CONTENT_REVIEW_FIELDS")) { + + $cmsUsers = Permission::get_members_by_permission(array("CMS_ACCESS_CMSMain", "ADMIN")); + + $fields->addFieldsToTab("Root.Review", array( + new HeaderField(_t('SiteTreeCMSWorkflow.REVIEWHEADER', "Content review"), 2), + new DropdownField("OwnerID", _t("SiteTreeCMSWorkflow.PAGEOWNER", + "Page owner (will be responsible for reviews)"), $cmsUsers->map('ID', 'Title', '(no owner)')), + new CalendarDateField("NextReviewDate", _t("SiteTreeCMSWorkflow.NEXTREVIEWDATE", + "Next review date (leave blank for no review)")), + new DropdownField("ReviewPeriodDays", _t("SiteTreeCMSWorkflow.REVIEWFREQUENCY", + "Review frequency (the review date will be set to this far in the future whenever the page is published.)"), array( + 0 => "No automatic review date", + 1 => "1 day", + 7 => "1 week", + 30 => "1 month", + 60 => "2 months", + 91 => "3 months", + 121 => "4 months", + 152 => "5 months", + 183 => "6 months", + 365 => "12 months", + )), + new TextareaField('ReviewNotes', 'Review Notes') + )); + } + } + + function onBeforeWrite() { + if($this->owner->ReviewPeriodDays && !$this->owner->NextReviewDate) { + $this->owner->NextReviewDate = date('Y-m-d', strtotime('+' . $this->owner->ReviewPeriodDays . ' days')); + } + } + + function providePermissions() { + return array( + "EDIT_CONTENT_REVIEW_FIELDS" => array( + 'name' => "Set content owners and review dates", + 'category' => _t('Permissions.CONTENT_CATEGORY', 'Content permissions'), + 'sort' => 50 + ) + ); + } +}