Mattflaschen has submitted this change and it was merged.

Change subject: Include Flow topics in Nuke
......................................................................


Include Flow topics in Nuke

Bug: T115695
Change-Id: I09aeb876066554496fc7f533e60bd0cea842777b
Depends-On: Ia9dc16b3a4a623ef213adbcf18f44b497f2d9f27
---
M Flow.php
M Hooks.php
2 files changed, 170 insertions(+), 0 deletions(-)

Approvals:
  Mattflaschen: Verified; Looks good to me, approved



diff --git a/Flow.php b/Flow.php
index 000d7be..8c0308c 100644
--- a/Flow.php
+++ b/Flow.php
@@ -173,6 +173,10 @@
 $wgHooks['GetBetaFeaturePreferences'][] = 
'FlowHooks::onGetBetaFeaturePreferences';
 $wgHooks['UserSaveOptions'][] = 'FlowHooks::onUserSaveOptions';
 
+// Nuke
+$wgHooks['NukeGetNewPages'][] = 'FlowHooks::onNukeGetNewPages';
+$wgHooks['NukeDeletePage'][] = 'FlowHooks::onNukeDeletePage';
+
 // Extension initialization
 $wgExtensionFunctions[] = 'FlowHooks::initFlowExtension';
 
diff --git a/Hooks.php b/Hooks.php
index 4aa7289..a42167d 100644
--- a/Hooks.php
+++ b/Hooks.php
@@ -11,6 +11,7 @@
 use Flow\OccupationController;
 use Flow\SpamFilter\AbuseFilter;
 use Flow\TalkpageManager;
+use Flow\WorkflowLoader;
 use Flow\WorkflowLoaderFactory;
 use Flow\Data\Listener\RecentChangesListener;
 
@@ -1825,4 +1826,169 @@
 
                return true;
        }
+
+       public static function onNukeGetNewPages( $username, $pattern, 
$namespace, $limit, &$pages ) {
+               if ( $namespace && $namespace !== NS_TOPIC ) {
+                       // not interested in any Topics
+                       return true;
+               }
+
+               // Remove any pre-existing Topic pages.
+               // They are coming from the recentchanges table.
+               // Most likely the filters were not applied correctly.
+               $pages = array_filter( $pages, function( $entry ) {
+                       /** @var Title $title */
+                       $title = $entry[0];
+                       return $title->getNamespace() !== NS_TOPIC;
+               } );
+
+               if ( $pattern ) {
+                       // pattern is not supported
+                       return true;
+               }
+
+               if ( !RequestContext::getMain()->getUser()->isAllowed( 
'flow-delete' ) ) {
+                       // there's no point adding topics since the current 
user won't be allowed to delete them
+                       return true;
+               }
+
+               // how many are we allowed to retrieve now
+               $newLimit = $limit - count( $pages );
+               if ( $newLimit > 0 ) {
+
+                       $dbr = wfGetDB( DB_SLAVE );
+
+                       $userSelect = array( 'username' => 
"IFNULL(tree_orig_user_ip, user_name)" );
+                       $userWhere = array();
+                       if ( $username ) {
+                               $userSelect = array();
+                               $user = User::newFromName( $username );
+                               if ( $user ) {
+                                       $userWhere = array( 'tree_orig_user_id' 
=> $user->getId() );
+                               } else {
+                                       $userWhere = array( 'tree_orig_user_ip' 
=> $username );
+                               }
+                       }
+
+                       // limit results to the range of RC
+                       global $wgRCMaxAge;
+                       $rcTimeLimit = UUID::getComparisonUUID( 
strtotime("-$wgRCMaxAge seconds") );
+
+                       // get latest revision id for each topic
+                       // by the specified user (optional)
+                       $result = $dbr->select(
+                               array(
+                                       'r' => 'flow_revision',
+                                       'flow_tree_revision',
+                                       'flow_workflow',
+                                       'user'
+                               ),
+                               array_merge( array(
+                                       'revId' => 'MAX(r.rev_id)'
+                               ), $userSelect ),
+                               array_merge( array(
+                                       'tree_parent_id' => null,
+                                       'r.rev_type' => 'post',
+                                       'workflow_wiki' => wfWikiId(),
+                                       'workflow_id > ' . $dbr->addQuotes( 
$rcTimeLimit->getBinary() )
+                               ), $userWhere ),
+                               __METHOD__,
+                               array(
+                                       'GROUP BY' => 'r.rev_type_id'
+                               ),
+                               array(
+                                       'flow_tree_revision' => array( 'INNER 
JOIN', 'r.rev_type_id=tree_rev_descendant_id' ),
+                                       'flow_workflow' => array( 'INNER JOIN', 
'r.rev_type_id=workflow_id' ),
+                                       'user' => array( 'LEFT JOIN', 
'user_id=tree_orig_user_id' )
+                               )
+                       );
+
+                       $revIds = array();
+                       foreach( $result as $r ) {
+                               $revIds[$r->revId] = $username === '' ? 
$r->username : false;
+                       }
+
+                       // get non-moderated revisions
+                       $result = $dbr->select(
+                               'flow_revision',
+                               array(
+                                       'topicId' => 'rev_type_id',
+                                       'revId' => 'rev_id'
+                               ),
+                               array(
+                                       'rev_mod_state' => '',
+                                       'rev_id' => array_keys( $revIds )
+                               ),
+                               __METHOD__,
+                               array(
+                                       'LIMIT' => $newLimit,
+                                       'ORDER BY' => 'rev_type_id DESC'
+                               )
+                       );
+
+                       foreach( $result as $r ) {
+                               $topicTitle = Title::makeTitle( NS_TOPIC, 
UUID::create( $r->topicId )->getAlphadecimal() );
+                               $creatorUsername = $revIds[$r->revId];
+                               $pages[] = array( $topicTitle, $creatorUsername 
);
+                       }
+
+               }
+
+               return true;
+       }
+
+       public static function onNukeDeletePage( Title $title, $reason, 
&$deletionResult ) {
+               if ( $title->getNamespace() !== NS_TOPIC ) {
+                       // we don't handle it
+                       return true;
+               }
+
+               $action = 'moderate-topic';
+               $params = array(
+                       'topic' => array(
+                               'moderationState' => 'delete',
+                               'reason' => $reason,
+                               'page' => $title->getPrefixedText()
+                       ),
+               );
+
+               /** @var WorkflowLoaderFactory $factory */
+               $factory = Container::get( 'factory.loader.workflow' );
+
+               $workflowId = WorkflowLoaderFactory::uuidFromTitle( $title );
+               /** @var WorkflowLoader $loader */
+               $loader = $factory->createWorkflowLoader( $title, $workflowId );
+
+               $blocks = $loader->getBlocks();
+
+               $blocksToCommit = $loader->handleSubmit(
+                       RequestContext::getMain(),
+                       $action,
+                       $params
+               );
+
+               $result = true;
+               $errors = array();
+               foreach ( $blocks as $block ) {
+                       if ( $block->hasErrors() ) {
+                               $result = false;
+                               $errorKeys = $block->getErrors();
+                               foreach ( $errorKeys as $errorKey ) {
+                                       $errors[] = $block->getErrorMessage( 
$errorKey );
+                               }
+                       }
+               }
+
+               if ( $result ) {
+                       $loader->commit( $blocksToCommit );
+                       $deletionResult = true;
+               } else {
+                       $deletionResult = false;
+                       $msg = "Failed to delete {$title->getPrefixedText()}. 
Errors: " . implode( '. ', $errors );
+                       wfLogWarning( $msg );
+               }
+
+               // we've handled the deletion, abort the hook
+               return false;
+       }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/256448
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I09aeb876066554496fc7f533e60bd0cea842777b
Gerrit-PatchSet: 11
Gerrit-Project: mediawiki/extensions/Flow
Gerrit-Branch: master
Gerrit-Owner: Sbisson <sbis...@wikimedia.org>
Gerrit-Reviewer: Mattflaschen <mflasc...@wikimedia.org>
Gerrit-Reviewer: Sbisson <sbis...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to