Compare commits

...

5 Commits

Author SHA1 Message Date
Guy Sartorelli
9ddc1f71ff
API Update API to reflect changes to CLI interaction 2024-09-27 09:00:58 +12:00
Guy Sartorelli
ef588a5ee0
Merge branch '5' into 6
# Conflicts:
#	composer.json
#	src/Tasks/ContentReviewEmails.php
2024-09-26 09:24:45 +12:00
Guy Sartorelli
40e45cda53
API Deprecate isValidEmail() method (#262) 2024-09-25 16:11:45 +12:00
Guy Sartorelli
3f09b871c3
Merge pull request #260 from creative-commoners/pulls/5/framework-version
DEP Increase minimum version of silverstripe/framework
2024-09-24 09:39:51 +12:00
Steve Boyd
9150258f90 DEP Increase minimum version of silverstripe/framework 2024-09-23 15:15:09 +12:00
6 changed files with 52 additions and 73 deletions

View File

@ -39,10 +39,7 @@ composer require silverstripe/contentreview
composer require silverstripe/contentreview
```
You'll also need to run `dev/build`.
Run dev/build either via the web server by opening the URL `http://<your-host>/dev/build?flush` or
by running the dev/build via a CLI: `sake dev/build flush=1`
You'll also need to build the database either via the web server by opening the URL `http://<your-host>/dev/build?flush` or via a CLI: `sake db:build --flush`
## Documentation

View File

@ -11,7 +11,7 @@ The module is set up in the `Settings` section of the CMS, see the [User guide](
In order for the contentreview module to send emails, you need to *either*:
* Setup the `ContentReviewEmails` script to run daily via a system cron job.
* Install the [queuedjobs](https://github.com/symbiote/silverstripe-queuedjobs) module and follow the configuration steps to create a cron job for that module. Once installed, you can just run `dev/build` to have a job created, which will run at 9am every day by default.
* Install the [queuedjobs](https://github.com/symbiote/silverstripe-queuedjobs) module and follow the configuration steps to create a cron job for that module. Once installed, you can just run `sake db:build` to have a job created, which will run at 9am every day by default.
## Using

View File

@ -5,9 +5,11 @@ namespace SilverStripe\ContentReview\Jobs;
use SilverStripe\ContentReview\Tasks\ContentReviewEmails;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Core\Config\Config;
use SilverStripe\PolyExecution\PolyOutput;
use Symbiote\QueuedJobs\Services\AbstractQueuedJob;
use Symbiote\QueuedJobs\Services\QueuedJob;
use Symbiote\QueuedJobs\Services\QueuedJobService;
use Symfony\Component\Console\Input\ArrayInput;
if (!class_exists(AbstractQueuedJob::class)) {
return;
@ -94,7 +96,10 @@ class ContentReviewNotificationJob extends AbstractQueuedJob implements QueuedJo
$this->queueNextRun();
$task = ContentReviewEmails::create();
$task->run(new HTTPRequest("GET", "/dev/tasks/ContentReviewEmails"));
$output = PolyOutput::create(PolyOutput::FORMAT_ANSI);
$input = new ArrayInput([]);
$input->setInteractive(false);
$task->run($input, $output);
$this->currentStep = 1;
$this->isComplete = true;

View File

@ -3,12 +3,12 @@
namespace SilverStripe\ContentReview\Tasks;
use Page;
use RuntimeException;
use SilverStripe\ContentReview\Compatibility\ContentReviewCompatability;
use SilverStripe\Control\Email\Email;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Dev\BuildTask;
use SilverStripe\PolyExecution\PolyOutput;
use SilverStripe\Model\List\ArrayList;
use SilverStripe\Dev\Deprecation;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\Model\List\SS_List;
@ -16,6 +16,8 @@ use SilverStripe\Security\Member;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\Model\ArrayData;
use SilverStripe\View\SSViewer;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
/**
* Daily task to send emails to the owners of content items when the review date rolls around.
@ -24,19 +26,22 @@ class ContentReviewEmails extends BuildTask
{
private array $invalid_emails = [];
/**
* @param HTTPRequest $request
* @throws RuntimeException
*/
public function run($request)
protected static string $commandName = 'content-review-emails';
protected static string $description = 'Daily task to send emails to the owners of content items when the review'
. ' date rolls around';
protected function execute(InputInterface $input, PolyOutput $output): int
{
if (!$this->isValidEmail($senderEmail = SiteConfig::current_site_config()->ReviewFrom)) {
throw new RuntimeException(
$senderEmail = SiteConfig::current_site_config()->ReviewFrom;
if (!Deprecation::withSuppressedNotice(fn() => $this->isValidEmail($senderEmail))) {
$output->writeln(
sprintf(
'Provided sender email address is invalid: "%s".',
'<error>Provided sender email address is invalid: "%s".</>',
$senderEmail
)
);
return Command::FAILURE;
}
$compatibility = ContentReviewCompatability::start();
@ -57,13 +62,16 @@ class ContentReviewEmails extends BuildTask
if (is_array($this->invalid_emails) && count($this->invalid_emails) > 0) {
$plural = count($this->invalid_emails) > 1 ? 's are' : ' is';
throw new RuntimeException(
$output->writeln(
sprintf(
'Provided email' . $plural . ' invalid: "%s".',
'<error>Provided email' . $plural . ' invalid: "%s".</>',
implode(', ', $this->invalid_emails)
)
);
return Command::FAILURE;
}
return Command::SUCCESS;
}
/**
@ -116,7 +124,7 @@ class ContentReviewEmails extends BuildTask
$siteConfig = SiteConfig::current_site_config();
$owner = Member::get()->byID($ownerID);
if (!$this->isValidEmail($owner->Email)) {
if (!Deprecation::withSuppressedNotice(fn() => $this->isValidEmail($owner->Email))) {
$this->invalid_emails[] = $owner->Name . ': ' . $owner->Email;
return;
@ -191,9 +199,11 @@ class ContentReviewEmails extends BuildTask
/**
* Check validity of email
* @deprecated 5.4.0 Use SilverStripe\Control\Email\Email::is_valid_address() instead.
*/
protected function isValidEmail(?string $email): bool
{
Deprecation::notice('5.4.0', 'Use ' . Email::class . '::is_valid_address() instead.');
return (bool) filter_var($email, FILTER_VALIDATE_EMAIL);
}
}

View File

@ -1,47 +0,0 @@
<?php
namespace SilverStripe\ContentReview\Tasks;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Dev\BuildTask;
use SilverStripe\Dev\Deprecation;
use SilverStripe\ORM\DB;
/**
* Task which migrates the ContentReview Module's SiteTree->OwnerID column to a new column name.
* @deprecated 5.4.0 Will be removed without equivalent functionality to replace it
*/
class ContentReviewOwnerMigrationTask extends BuildTask
{
public function __construct()
{
parent::__construct();
Deprecation::withSuppressedNotice(function () {
Deprecation::notice(
'5.4.0',
'Will be removed without equivalent functionality to replace it',
Deprecation::SCOPE_CLASS
);
});
}
/**
* @param HTTPRequest $request
*/
public function run($request)
{
$results = DB::query("SHOW columns from \"SiteTree\" WHERE \"field\" = 'OwnerID'");
if ($results->numRecords() == 0) {
echo "<h1>No need to run task. SiteTree->OwnerID doesn't exist</h1>";
} else {
DB::query("UPDATE \"SiteTree\" SET \"ContentReviewOwnerID\" = \"OwnerID\"");
DB::query("UPDATE \"SiteTree_Live\" SET \"ContentReviewOwnerID\" = \"OwnerID\"");
DB::query("UPDATE \"SiteTree_versions\" SET \"ContentReviewOwnerID\" = \"OwnerID\"");
DB::query("ALTER TABLE \"SiteTree\" DROP COLUMN \"OwnerID\"");
DB::query("ALTER TABLE \"SiteTree_Live\" DROP COLUMN \"OwnerID\"");
DB::query("ALTER TABLE \"SiteTree_Versions\" DROP COLUMN \"OwnerID\"");
echo "<h1>Migrated 3 tables. Dropped obsolete OwnerID column</h1>";
}
}
}

View File

@ -12,12 +12,16 @@ use SilverStripe\ContentReview\Extensions\ContentReviewOwner;
use SilverStripe\ContentReview\Extensions\SiteTreeContentReview;
use SilverStripe\ContentReview\Tasks\ContentReviewEmails;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Dev\Deprecation;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\Security\Group;
use SilverStripe\Security\Member;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\ContentReview\Models\ContentReviewLog;
use SilverStripe\PolyExecution\PolyOutput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
class ContentReviewNotificationTest extends SapphireTest
{
@ -58,7 +62,11 @@ class ContentReviewNotificationTest extends SapphireTest
$childParentPage->write();
$task = new ContentReviewEmails();
$task->run(new HTTPRequest('GET', '/dev/tasks/ContentReviewEmails'));
$buffer = new BufferedOutput();
$output = new PolyOutput(PolyOutput::FORMAT_ANSI, wrappedOutput: $buffer);
$input = new ArrayInput([]);
$input->setInteractive(false);
$task->run($input, $output);
// Set template variables (as per variable case)
$ToEmail = 'author@example.com';
@ -124,7 +132,11 @@ class ContentReviewNotificationTest extends SapphireTest
$this->assertCount(1, $childParentPage->ReviewLogs());
$task = new ContentReviewEmails();
$task->run(new HTTPRequest('GET', '/dev/tasks/ContentReviewEmails'));
$buffer = new BufferedOutput();
$output = new PolyOutput(PolyOutput::FORMAT_ANSI, wrappedOutput: $buffer);
$input = new ArrayInput([]);
$input->setInteractive(false);
$task->run($input, $output);
// Expecting to not send the email as content review for page is done
$email = $this->findEmail($member->Email);
@ -145,12 +157,14 @@ class ContentReviewNotificationTest extends SapphireTest
$member = $this->objFromFixture(Member::class, 'author');
$task = new ContentReviewEmails();
$this->assertTrue($method->invokeArgs($task, [$member->Email]));
$this->assertTrue($method->invokeArgs($task, ['correct.email@example.com']));
Deprecation::withSuppressedNotice(function () use ($method, $task, $member) {
$this->assertTrue($method->invokeArgs($task, [$member->Email]));
$this->assertTrue($method->invokeArgs($task, ['correct.email@example.com']));
$this->assertFalse($method->invokeArgs($task, [null]));
$this->assertFalse($method->invokeArgs($task, ['broken.email']));
$this->assertFalse($method->invokeArgs($task, ['broken@email']));
$this->assertFalse($method->invokeArgs($task, [null]));
$this->assertFalse($method->invokeArgs($task, ['broken.email']));
$this->assertFalse($method->invokeArgs($task, ['broken@email']));
});
}
/**