Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 130 additions & 2 deletions SemanticTasks.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
* @defgroup SemanticTasks Semantic Tasks
*/

use ContentHandler;
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\SlotRecord;
use MediaWiki\Title\Title;
use MWException;
use ST\SemanticTasksMailer;

SemanticTasks::load();
Expand Down Expand Up @@ -42,6 +46,84 @@ public static function initExtension( $credits = [] ) {
}
}

/**
* @see https://github.com/SemanticMediaWiki/KnowledgeGraph/blob/main/includes/KnowledgeGraph.php
*
* @return bool
*/
private static function ensureSemanticTasksMessagesExists() {
global $stgMessagesArticle;

if ( !$stgMessagesArticle ) {
return false;
}

$title = Title::newFromText( $stgMessagesArticle );
if ( !$title ) {
throw new MWException( 'Title for SemanticTasksMessage not valid' );
}

if ( $title->isKnown() ) {
return true;
}

// Create page content
$filePath = __DIR__ . '/data/SemanticTasksMessages.wikitext';

if ( !file_exists( $filePath ) ) {
wfDebugLog( 'SemanticTasks', 'Missing SemanticTasksMessages.wikitext.' );
return;
}

$text = file_get_contents( $filePath );

$content = ContentHandler::makeContent(
$text,
$title
);

$user = User::newSystemUser( 'MediaWiki default', [ 'steal' => true ] );

$wikiPage = MediaWikiServices::getInstance()
->getWikiPageFactory()->newFromTitle( $title );

$pageUpdater = $wikiPage->newPageUpdater( $user );
$pageUpdater->setContent( SlotRecord::MAIN, $content );
$pageUpdater->saveRevision(
CommentStoreComment::newUnsavedComment( 'Initialize KnowledgeGraphOptions' ),
EDIT_SUPPRESS_RC
);
}

/**
* @param Title $title
* @return WikiPage
*/
public static function getEffectiveArticle( $title ) {
if ( !$title->isTalkPage() ) {
return MediaWikiServices::getInstance()->getWikiPageFactory()->newFromTitle( $title );
}

$subjectTitle = $title->getSubjectPage();
return MediaWikiServices::getInstance()
->getWikiPageFactory()->newFromTitle( $subjectTitle );
}

/**
* @param WikiPage $wikiPage
* @return WikiPage
*/
public static function getEffectiveArticleFromPage( $wikiPage ) {
$title = $wikiPage->getTitle();
if ( !$title->isTalkPage() ) {
return $wikiPage;
}

$subjectTitle = $title->getSubjectPage();
return MediaWikiServices::getInstance()
->getWikiPageFactory()->newFromTitle( $subjectTitle );
}

/**
* @since 1.0
*/
Expand All @@ -58,12 +140,18 @@ public static function onExtensionFunction() {
}
}

self::ensureSemanticTasksMessagesExists();

$assignees = new \ST\Assignees();

// Register extension hooks.
$hookContainer = MediaWikiServices::getInstance()->getHookContainer();

$semanticTasksMessages = MediaWikiServices::getInstance()->getService( 'SemanticTasksMessages' );

$hookContainer->register( 'MultiContentSave', [ $assignees, 'saveAssigneesMultiContentSave' ] );
$hookContainer->register( 'PageSaveComplete', static function ( WikiPage $wikiPage, MediaWiki\User\UserIdentity $user, string $summary, int $flags, MediaWiki\Revision\RevisionRecord $revisionRecord, MediaWiki\Storage\EditResult $editResult ) use ( $assignees ) {

$hookContainer->register( 'PageSaveComplete', static function ( WikiPage $wikiPage, MediaWiki\User\UserIdentity $user, string $summary, int $flags, MediaWiki\Revision\RevisionRecord $revisionRecord, MediaWiki\Storage\EditResult $editResult ) use ( $assignees, $semanticTasksMessages ) {
// @see includes/Storage/PageUpdater.php
$mainContent = $revisionRecord->getContent( MediaWiki\Revision\SlotRecord::MAIN, MediaWiki\Revision\RevisionRecord::RAW );
$minoredit = $editResult->isNullEdit() || ( $flags & EDIT_MINOR )
Expand All @@ -76,7 +164,47 @@ public static function onExtensionFunction() {
$assignees, $wikiPage, $user, $mainContent,
$summary, $minoredit, $watchthis, $sectionanchor, $flags, $revisionRecord
);

$semanticTasksMessages->handlePageUpdate( $wikiPage->getTitle() );
} );

$hookContainer->register( 'PageDelete', static function ( $wikiPage, $deleter, string $reason, StatusValue $status, bool $suppress ) use ( $assignees ) {
$assignees->saveAssigneesPageDelete( $wikiPage );
} );
}

// @see https://github.com/SemanticMediaWiki/SemanticTasks/issues/67
$hookContainer->register( 'PageDeleteComplete', static function ( $pageRecord, $deleter, $reason, $pageID, $deletedRev, $logEntry, $archivedRevisionCount ) use ( $assignees, $semanticTasksMessages ) {
global $stgNotifyOnDeleteTaskArticle;
global $stgNotifyOnTalkPageEditOfTaskArticle;
$user = $deleter->getUser();
$text = null;
$revision = null;

$title = $pageRecord->getTitle();

$semanticTasksMessages->handlePageUpdate( $title );

// directly send email
if ( !$title->isTalkPage() ) {
if ( !$stgNotifyOnDeleteTaskArticle ) {
return;
}

$wikiPage = $pageRecord;
$status = SemanticTasksMailer::DELETED;

// retrieve subject article
} else {
if ( !$stgNotifyOnTalkPageEditOfTaskArticle ) {
return;
}

$wikiPage = SemanticTasks::getEffectiveArticle( $title );
$status = SemanticTasksMailer::TALK_DELETED;
}

SemanticTasksMailer::mailAssignees( $wikiPage, $text, $user, $status, $assignees, $revision );
} );

}
}
45 changes: 45 additions & 0 deletions data/SemanticTasksMessages.wikitext
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
__NOTOC__
== New task ==
semantictasks-newtask-subject|New task: $1
semantictasks-newtask-body-1|The task "$1" has just been created.
semantictasks-newtask-body-2|Here is the task description:

== Task updated ==
semantictasks-taskupdated-subject|Task updated: $1
semantictasks-taskupdated-body-1|The task "$1" has just been updated.
semantictasks-taskupdated-body-2|Here are the differences:

== Task closed ==
semantictasks-taskclosed-subject|Task closed: $1
semantictasks-taskclosed-body-1|The task "$1" has just been closed.
semantictasks-taskclosed-body-2|Here is the task description:

== Task unassigned ==
semantictasks-taskunassigned-subject|Task unassigned: $1
semantictasks-taskunassigned-body-1|You have just been unassigned from the task "$1".
semantictasks-taskunassigned-body-2|Here is the task description:

== Talk page of Task created ==
semantictasks-talkpageoftaskcreated-subject|Talk page of task article has been created
semantictasks-talkpageoftaskcreated-body-1|Talk page related to task article "$1" has been created

== Talk page of Task edited ==
semantictasks-talkpageoftaskedited-subject|Talk page of task article has been edited
semantictasks-talkpageoftaskedited-body-1|Talk page related to task article "$1" has been edited

== Task deleted ==
semantictasks-taskdeleted-subject|Article with assigned tasks deleted
semantictasks-taskdeleted-body-1|The article "$1" with assigned tasks has been deleted.

== Talk page of task deleted ==
semantictasks-talkpageoftaskdeleted-subject|Talk page of article with assigned tasks deleted
semantictasks-talkpageoftaskdeleted-body-1|The talk page of the article "$1" with assigned tasks has been deleted.

== Task assigned ==
semantictasks-taskassigned-subject|Task assigned: $1
semantictasks-taskassigned-body-1|The task "$1" has just been assigned to you.
semantictasks-taskassigned-body-2|Here is the task description:

== Reminder ==
semantictasks-reminder-subject|Reminder: $1
semantictasks-reminder-body-1|Just to remind you that the task "$1" ends in $2 {{PLURAL:$2|day|days}}.
16 changes: 14 additions & 2 deletions extension.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "SemanticTasks",
"version": "3.0.0-alpha",
"version": "3.2.0",
"author": [
"Steren Giannini",
"Ryan Lane",
Expand Down Expand Up @@ -32,8 +32,20 @@
"AutoloadClasses": {
"SemanticTasks": "SemanticTasks.php"
},
"ServiceWiringFiles": [
"includes/ServiceWiring.php"
],
"config_prefix": "stg",
"config": {
"MessagesArticle": {
"value": "MediaWiki:SemanticTasksMessages"
},
"NotifyOnDeleteTaskArticle": {
"value": false
},
"NotifyOnTalkPageEditOfTaskArticle": {
"value": true
},
"PropertyAssignedTo": {
"value": "Assigned to"
},
Expand All @@ -55,7 +67,7 @@
"PropertyHasAssignee": {
"value": "Has assignee"
},
"SemanticTasksNotifyIfUnassigned": {
"NotifyIfUnassigned": {
"value": false
},
"NotificationFromSystemAddress": {
Expand Down
52 changes: 37 additions & 15 deletions i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,45 @@
"authors": [
"Kghbln",
"Steren Giannini",
"Tosfos"
"Tosfos",
"thomas-topway-it"
]
},
"semantictasks-desc": "Sends email notifications for assigned or updated tasks",
"semantictasks-name": "Semantic Tasks",
"semantictasks-newtask": "New task:",
"semantictasks-taskassigned": "Task assigned:",
"semantictasks-taskunassigned": "Task unassigned:",
"semantictasks-taskupdated": "Task updated:",
"semantictasks-taskclosed": "Task closed:",
"semantictasks-newtask-msg": "The task \"$1\" has just been created.",
"semantictasks-taskclosed-msg": "The task \"$1\" has just been closed.",
"semantictasks-assignedtoyou-msg2": "The task \"$1\" has just been assigned to you.",
"semantictasks-unassignedtoyou-msg2": "You have just been unassigned from the task \"$1\".",
"semantictasks-updatedtoyou-msg2": "The task \"$1\" has just been updated.",
"semantictasks-reminder": "Reminder:",
"semantictasks-reminder-message2": "Just to remind you that the task \"$1\" ends in $2 {{PLURAL:$2|day|days}}.\n\n$3",
"semantictasks-text-message": "Here is the task description:",
"semantictasks-diff-message": "Here are the differences:"

"semantictasks-newtask-subject": "New task:",
"semantictasks-newtask-body-1": "The task \"$1\" has just been created.",
"semantictasks-newtask-body-2": "Here is the task description:",

"semantictasks-taskupdated-subject": "Task updated:",
"semantictasks-taskupdated-body-1": "The task \"$1\" has just been updated.",
"semantictasks-taskupdated-body-2": "Here are the differences:",

"semantictasks-taskclosed-subject": "Task closed:",
"semantictasks-taskclosed-body-1": "The task \"$1\" has just been closed.",
"semantictasks-taskclosed-body-2": "Here is the task description:",

"semantictasks-taskunassigned-subject": "Task unassigned:",
"semantictasks-taskunassigned-body-1": "You have just been unassigned from the task \"$1\".",
"semantictasks-taskunassigned-body-2": "Here is the task description:",

"semantictasks-talkpageoftaskcreated-subject": "Talk page of task article has been created",
"semantictasks-talkpageoftaskcreated-body-1": "Talk page related to task article \"$1\" has been created",

"semantictasks-talkpageoftaskedited-subject": "Talk page of task article has been edited",
"semantictasks-talkpageoftaskedited-body-1": "Talk page related to task article \"$1\" has been edited",

"semantictasks-taskdeleted-subject": "Article with assigned tasks deleted",
"semantictasks-taskdeleted-body-1": "The article \"$1\" with assigned tasks has been deleted.",

"semantictasks-talkpageoftaskdeleted-subject": "Talk page of article with assigned tasks deleted",
"semantictasks-talkpageoftaskdeleted-body-1": "The talk page of the article \"$1\" with assigned tasks has been deleted.",

"semantictasks-taskassigned-subject": "Task assigned:",
"semantictasks-taskassigned-body-1": "The task \"$1\" has just been assigned to you.",
"semantictasks-taskassigned-body-2": "Here is the task description:",

"semantictasks-reminder-subject": "Reminder:",
"semantictasks-reminder-body-1": "Just to remind you that the task \"$1\" ends in $2 {{PLURAL:$2|day|days}}."
}
14 changes: 14 additions & 0 deletions includes/ServiceWiring.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

use MediaWiki\MediaWikiServices;
use ST\SemanticTasksMessages;

return [
'SemanticTasksMessages' => static function ( MediaWikiServices $services ): SemanticTasksMessages {
$wanCache = $services->getMainWANObjectCache();
$revisionLookup = $services->getRevisionLookup();
$dbProvider = $services->getConnectionProvider();
$srvCache = $services->getObjectCacheFactory()->getLocalServerInstance( CACHE_ANYTHING );
return new SemanticTasksMessages( $dbProvider, $wanCache, $revisionLookup, $srvCache );
},
];
Loading
Loading