Repository navigation
Expand file tree
/
Copy pathSemanticTasks.php
More file actions
160 lines (128 loc) · 4.9 KB
/
Copy pathSemanticTasks.php
File metadata and controls
160 lines (128 loc) · 4.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
/**
* @see https://github.com/SemanticMediaWiki/SemanticTasks
*
* @defgroup SemanticTasks Semantic Tasks
*/
use MediaWiki\MediaWikiServices;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\SlotRecord;
use MediaWiki\Title\Title;
use ST\SemanticTasksMailer;
SemanticTasks::load();
/**
* @codeCoverageIgnore
*/
class SemanticTasks {
public static function load() {
if ( is_readable( __DIR__ . '/vendor/autoload.php' ) ) {
include_once __DIR__ . '/vendor/autoload.php';
}
}
/**
* @since 1.0
* @see https://www.mediawiki.org/wiki/Manual:Extension.json/Schema#callback
*/
public static function initExtension( $credits = [] ) {
$version = 'UNKNOWN';
// See https://phabricator.wikimedia.org/T151136
if ( isset( $credits['version'] ) ) {
$version = $credits['version'];
}
define( 'SEMANTIC_TASKS', $version );
// https://phabricator.wikimedia.org/T212738
if ( !defined( 'MW_VERSION' ) ) {
define( 'MW_VERSION', $GLOBALS['wgVersion'] );
}
}
/**
* @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
*/
public static function onExtensionFunction() {
// Check requirements after LocalSetting.php has been processed
if ( !defined( 'SMW_VERSION' ) ) {
if ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) {
die( "\nThe 'Semantic Tasks' extension requires the 'Semantic MediaWiki' extension to be installed and enabled.\n" );
} else {
die(
'<b>Error:</b> The <a href="https://github.com/SemanticMediaWiki/SemanticTasks">Semantic Tasks</a> extension' .
' requires the <a href="https://www.semantic-mediawiki.org/wiki/Semantic_MediaWiki">Semantic MediaWiki</a> extension to be installed and enabled.<br />'
);
}
}
$assignees = new \ST\Assignees();
// Register extension hooks.
$hookContainer = MediaWikiServices::getInstance()->getHookContainer();
$semanticTasksMessages = MediaWikiServices::getInstance()->getService( 'SemanticTasksMessages' );
$semanticTasksMessages->ensureSemanticTasksMessagesExists();
$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, $semanticTasksMessages ) {
// @see includes/Storage/PageUpdater.php
$mainContent = $revisionRecord->getContent( SlotRecord::MAIN, RevisionRecord::RAW );
$minoredit = $editResult->isNullEdit() || ( $flags & EDIT_MINOR )
// *** this is for the use in conjunction with WSSlots
|| ( $flags & EDIT_INTERNAL );
$watchthis = null;
$sectionanchor = null;
SemanticTasksMailer::mailAssigneesUpdatedTask(
$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 );
} );
}
}