Inherit content review settings from siteconfig or parent page

This commit is contained in:
Stig Lindqvist 2014-02-21 13:33:01 +13:00
parent 78d84a57c6
commit 0ad06c49fd
2 changed files with 101 additions and 67 deletions

View File

@ -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;
}

View File

@ -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
*