jenkins-bot has submitted this change and it was merged. Change subject: Record topic imports to Special:Log ......................................................................
Record topic imports to Special:Log Bug: T87795 Change-Id: I0ce69cca9ab017fc0b9357a65245defd98c71f0f --- M Flow.php M autoload.php M container.php M i18n/en.json M i18n/qqq.json M includes/Import/ImportSource.php M includes/Import/LiquidThreadsApi/Objects.php A includes/Import/Postprocessor/SpecialLogTopic.php R includes/Log/ActionFormatter.php A includes/Log/LqtImportFormatter.php M tests/phpunit/Mock/MockImportTopic.php 11 files changed, 161 insertions(+), 9 deletions(-) Approvals: Mattflaschen: Looks good to me, approved jenkins-bot: Verified diff --git a/Flow.php b/Flow.php index f136b9e..b64bb54 100644 --- a/Flow.php +++ b/Flow.php @@ -240,15 +240,16 @@ // Some actions are more complex closures - to be added manually. if ( is_string( $log ) ) { - $wgLogActionsHandlers["$log/flow-$action"] = 'Flow\Log\Formatter'; + $wgLogActionsHandlers["$log/flow-$action"] = 'Flow\Log\ActionFormatter'; } } } -// Manually add the more complex actions -$wgLogActionsHandlers['delete/flow-restore-post'] = 'Flow\Log\Formatter'; -$wgLogActionsHandlers['suppress/flow-restore-post'] = 'Flow\Log\Formatter'; -$wgLogActionsHandlers['delete/flow-restore-topic'] = 'Flow\Log\Formatter'; -$wgLogActionsHandlers['suppress/flow-restore-topic'] = 'Flow\Log\Formatter'; +// Manually add that more complex actions +$wgLogActionsHandlers['delete/flow-restore-post'] = 'Flow\Log\ActionFormatter'; +$wgLogActionsHandlers['suppress/flow-restore-post'] = 'Flow\Log\ActionFormatter'; +$wgLogActionsHandlers['delete/flow-restore-topic'] = 'Flow\Log\ActionFormatter'; +$wgLogActionsHandlers['suppress/flow-restore-topic'] = 'Flow\Log\ActionFormatter'; +$wgLogActionsHandlers['import/lqt-to-flow-topic'] = 'Flow\Log\LqtImportFormatter'; // Register URL actions foreach( $wgFlowActions as $action => $options ) { diff --git a/autoload.php b/autoload.php index d947a65..5b0f6e1 100644 --- a/autoload.php +++ b/autoload.php @@ -214,13 +214,15 @@ 'Flow\\Import\\Postprocessor\\PostprocessingException' => __DIR__ . '/includes/Import/Postprocessor/PostprocessingException.php', 'Flow\\Import\\Postprocessor\\Postprocessor' => __DIR__ . '/includes/Import/Postprocessor/Postprocessor.php', 'Flow\\Import\\Postprocessor\\ProcessorGroup' => __DIR__ . '/includes/Import/Postprocessor/ProcessorGroup.php', + 'Flow\\Import\\Postprocessor\\SpecialLogTopic' => __DIR__ . '/includes/Import/Postprocessor/SpecialLogTopic.php', 'Flow\\Import\\TalkpageImportOperation' => __DIR__ . '/includes/Import/Importer.php', 'Flow\\Import\\TopicImportState' => __DIR__ . '/includes/Import/Importer.php', 'Flow\\Import\\Wikitext\\ConversionStrategy' => __DIR__ . '/includes/Import/Wikitext/ConversionStrategy.php', 'Flow\\Import\\Wikitext\\ImportSource' => __DIR__ . '/includes/Import/Wikitext/ImportSource.php', 'Flow\\LinksTableUpdater' => __DIR__ . '/includes/LinksTableUpdater.php', - 'Flow\\Log\\Formatter' => __DIR__ . '/includes/Log/Formatter.php', + 'Flow\\Log\\ActionFormatter' => __DIR__ . '/includes/Log/ActionFormatter.php', 'Flow\\Log\\Logger' => __DIR__ . '/includes/Log/Logger.php', + 'Flow\\Log\\LqtImportFormatter' => __DIR__ . '/includes/Log/LqtImportFormatter.php', 'Flow\\Log\\PostModerationLogger' => __DIR__ . '/includes/Log/PostModerationLogger.php', 'Flow\\Model\\AbstractRevision' => __DIR__ . '/includes/Model/AbstractRevision.php', 'Flow\\Model\\AbstractSummary' => __DIR__ . '/includes/Model/AbstractSummary.php', diff --git a/container.php b/container.php index 4b8d8ac..07d20bd 100644 --- a/container.php +++ b/container.php @@ -1130,13 +1130,19 @@ } ); $c['importer'] = $c->share( function( $c ) { - return new Flow\Import\Importer( + $importer = new Flow\Import\Importer( $c['storage'], $c['factory.loader.workflow'], $c['memcache.buffered'], $c['db.factory'], $c['deferred_queue'] ); + + $importer->addPostprocessor( new Flow\Import\Postprocessor\SpecialLogTopic( + $c['occupation_controller']->getTalkpageManager() + ) ); + + return $importer; } ); return $c; diff --git a/i18n/en.json b/i18n/en.json index 89e4c53..cf4183a 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -21,6 +21,7 @@ "logentry-delete-flow-restore-topic": "$1 {{GENDER:$2|restored}} a [$4 topic] on [[$3]]", "logentry-suppress-flow-suppress-topic": "$1 {{GENDER:$2|suppressed}} a [$4 topic] on [[$3]]", "logentry-suppress-flow-restore-topic": "$1 {{GENDER:$2|deleted}} a [$4 topic] on [[$3]]", + "logentry-import-lqt-to-flow-topic": "[[$1|$2]] on [[$3]] was imported from LiquidThreads to Flow", "flow-user-moderated": "Moderated user", "flow-board-header-browse-topics-link": "Browse topics", "flow-edit-header-link": "Edit header", diff --git a/i18n/qqq.json b/i18n/qqq.json index 6353546..55f9d10 100644 --- a/i18n/qqq.json +++ b/i18n/qqq.json @@ -26,6 +26,7 @@ "logentry-delete-flow-restore-topic": "Text for a deletion log entry when a deleted topic was restored. Parameters:\n* $1 - the user: link to the user page\n* $2 - the username. Can be used for GENDER.\n* $3 - the page where the topic was moderated\n* $4 - permalink URL to the moderated topic\n{{Related|Flow-logentry}}", "logentry-suppress-flow-suppress-topic": "Text for a deletion log entry when a topic was suppressed. Parameters:\n* $1 - the user: link to the user page\n* $2 - the username. Can be used for GENDER.\n* $3 - the page where the topic was moderated\n* $4 - permalink URL to the moderated topic\n{{Related|Flow-logentry}}", "logentry-suppress-flow-restore-topic": "Text for a deletion log entry when a suppressed topic was restored. Parameters:\n* $1 - the user: link to the user page\n* $2 - the username. Can be used for GENDER.\n* $3 - the page where the topic was moderated\n* $4 - permalink URL to the moderated topic\n{{Related|Flow-logentry}}", + "logentry-import-lqt-to-flow-topic": "Text for an import log entry when a topic has been imported from LiquidThreads to Flow. Parameters:\n* $1 - The article within the topic namespace the topic was imported to\n* $2 - The title of the thread being imported.\n* $3 - The board that was converted from LiquidThreads to Flow.", "flow-user-moderated": "Name to display when the current user is not allowed to see the users name due to moderation", "flow-board-header-browse-topics-link": "Text to show in the board header which links to the topics list.", "flow-edit-header-link": "Used as text for the button that either allows editing the header in place or brings the user to a page for editing the header.", diff --git a/includes/Import/ImportSource.php b/includes/Import/ImportSource.php index cb0316b..c73bd62 100644 --- a/includes/Import/ImportSource.php +++ b/includes/Import/ImportSource.php @@ -62,6 +62,18 @@ * @return IImportSummary|null The summary, if any, for a topic */ function getTopicSummary(); + + /** + * @return string The subtype to use when logging topic imports + * to Special:Log. It will appear in the log as "import/$logType" + */ + function getLogType(); + + /** + * @return string[string] A k/v map of strings containing additional + * parameters to be stored with the log about importing this topic. + */ + function getLogParameters(); } interface IImportHeader extends IRevisionableObject { diff --git a/includes/Import/LiquidThreadsApi/Objects.php b/includes/Import/LiquidThreadsApi/Objects.php index 7fb0896..b198e2e 100644 --- a/includes/Import/LiquidThreadsApi/Objects.php +++ b/includes/Import/LiquidThreadsApi/Objects.php @@ -186,6 +186,18 @@ public function getObjectKey() { return 'topic' . $this->importSource->getObjectKey( 'thread_id', $this->apiResponse['id'] ); } + + public function getLogType() { + return "lqt-to-flow-topic"; + } + + public function getLogParameters() { + return array( + 'lqt_thread_id' => $this->apiResponse['id'], + 'lqt_orig_title' => $this->getTitle()->getPrefixedText(), + 'lqt_subject' => $this->getText(), + ); + } } class ImportSummary extends PageRevisionedObject implements IImportSummary { diff --git a/includes/Import/Postprocessor/SpecialLogTopic.php b/includes/Import/Postprocessor/SpecialLogTopic.php new file mode 100644 index 0000000..36167fc --- /dev/null +++ b/includes/Import/Postprocessor/SpecialLogTopic.php @@ -0,0 +1,58 @@ +<?php + +namespace Flow\Import\Postprocessor; + +use Flow\Import\IImportHeader; +use Flow\Import\IImportPost; +use Flow\Import\IImportTopic; +use Flow\Import\PageImportState; +use Flow\Import\TopicImportState; +use Flow\Model\UUID; +use ManualLogEntry; +use User; + +/** + * Records topic imports to Special:Log. + */ +class SpecialLogTopic implements PostProcessor { + /** + * @var bool Indicates if new posts have been seen since the last commit operation + */ + protected $newPosts = false; + + /** + * @var User The user to attribute logs to + */ + protected $user; + + public function __construct( User $user ) { + $this->user = $user; + } + + public function afterHeaderImported( PageImportState $state, IImportHeader $topic ) { + // nothing to do + } + + public function afterPostImported( TopicImportState $state, IImportPost $post, UUID $newPostId ) { + $this->newPosts = true; + } + + public function afterTopicImported( TopicImportState $state, IImportTopic $topic ) { + if ( !$this->newPosts ) { + return; + } + $logEntry = new ManualLogEntry( 'import', $topic->getLogType() ); + $logEntry->setTarget( $state->topicWorkflow->getOwnerTitle() ); + $logEntry->setPerformer( $this->user ); + $logEntry->setParameters( array( + 'topic' => $state->topicWorkflow->getArticleTitle()->getPrefixedText(), + ) + $topic->getLogParameters() ); + $logEntry->insert(); + + $this->newPosts = false; + } + + public function importAborted() { + $this->newPosts = false; + } +} diff --git a/includes/Log/Formatter.php b/includes/Log/ActionFormatter.php similarity index 98% rename from includes/Log/Formatter.php rename to includes/Log/ActionFormatter.php index b4e8461..b56bb17 100644 --- a/includes/Log/Formatter.php +++ b/includes/Log/ActionFormatter.php @@ -6,7 +6,7 @@ use Flow\Parsoid\Utils; use Message; -class Formatter extends \LogFormatter { +class ActionFormatter extends \LogFormatter { /** * Formats an activity log entry. * diff --git a/includes/Log/LqtImportFormatter.php b/includes/Log/LqtImportFormatter.php new file mode 100644 index 0000000..3ef5b52 --- /dev/null +++ b/includes/Log/LqtImportFormatter.php @@ -0,0 +1,45 @@ +<?php + +namespace Flow\Log; + +use Message; +use Title; + +class LqtImportFormatter extends \LogFormatter { + + public function getPreloadTitles() { + $titles = array( $this->entry->getTarget() ); + $params = $this->entry->getParameters() + array( + 'topic' => '', + ); + $topic = Title::newFromText( $params['topic'] ); + if ( $topic ) { + $titles[] = $topic; + } + + return $titles; + } + + /** + * Formats an activity log entry. + * + * @return string The log entry + */ + protected function getActionMessage() { + $board = $this->entry->getTarget(); + $params = $this->entry->getParameters() + array( + 'topic' => '', + 'lqt_subject' => '', + ); + $topic = Title::newFromText( $params['topic'] ); + + $message = $this->msg( "logentry-import-lqt-to-flow-topic" ) + ->params( + $topic ? $topic->getPrefixedText() : '', + Message::plaintextParam( $params['lqt_subject'] ), + $board->getPrefixedText() + ); + + return $this->plaintext ? $message->text() : $message->parse(); + } +} diff --git a/tests/phpunit/Mock/MockImportTopic.php b/tests/phpunit/Mock/MockImportTopic.php index 68d31c5..7ff79a7 100644 --- a/tests/phpunit/Mock/MockImportTopic.php +++ b/tests/phpunit/Mock/MockImportTopic.php @@ -32,6 +32,20 @@ /** * {@inheritDoc} */ + public function getLogType() { + "mock-flow-topic-import"; + } + + /** + * {@inheritDoc} + */ + public function getLogParameters() { + return array(); + } + + /** + * {@inheritDoc} + */ public function getObjectKey() { return 'mock-topic:1'; } -- To view, visit https://gerrit.wikimedia.org/r/189909 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I0ce69cca9ab017fc0b9357a65245defd98c71f0f Gerrit-PatchSet: 8 Gerrit-Project: mediawiki/extensions/Flow Gerrit-Branch: master Gerrit-Owner: EBernhardson <ebernhard...@wikimedia.org> Gerrit-Reviewer: EBernhardson <ebernhard...@wikimedia.org> Gerrit-Reviewer: Mattflaschen <mflasc...@wikimedia.org> Gerrit-Reviewer: SG <shah...@gmail.com> Gerrit-Reviewer: Siebrand <siebr...@kitano.nl> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits