MarkAHershberger has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/370774 )

Change subject: Add the ability to notify watchers of parent categories
......................................................................

Add the ability to notify watchers of parent categories

Needs to be tested.

Change-Id: Ic7d32294a573fcb95b96e8c00f6792c39abdb5d8
---
M CategoryWatch.php
M README.md
2 files changed, 100 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/CategoryWatch 
refs/changes/74/370774/1

diff --git a/CategoryWatch.php b/CategoryWatch.php
index cfd3fca..aca8f23 100644
--- a/CategoryWatch.php
+++ b/CategoryWatch.php
@@ -223,6 +223,97 @@
                                }
                        }
                }
+
+               global $wgCategoryWatchNotifyParentWatchers;
+               if ( $wgCategoryWatchNotifyParentWatchers ) {
+                       self::notifyParentWatchers();
+               }
+       }
+
+       /**
+        * Notify the watchers of parent categories
+        */
+       protected static function notifyParentWatchers() {
+               self::$watcher->allparents = [];
+               self::$watcher->i = 0;
+               self::$watcher->findCategoryParents( self::$watcher->after );
+               ## For each active parent category, send the mail
+               if ( self::$watcher->allparents ) {
+                       $page     = $article->getTitle();
+                       $pageurl  = $page->getFullUrl();
+                       foreach ( self::$watcher->allparents as $cat ) {
+                               $title   = Title::newFromText( $cat, 
NS_CATEGORY );
+                               $message = wfMessage(
+                                       'categorywatch-catchange', $page,
+                                       self::$watcher->friendlyCat( $cat )
+                               );
+                               self::$watcher->notifyWatchers(
+                                       $title, $user, $message, $summary, 
$medit, $pageurl
+                               );
+                       }
+               }
+       }
+
+       /**
+        * Recursively find all parents of the given categories
+        *
+        * @param array $catarray the categories
+        */
+       protected function findCategoryParents( array $catarray ) {
+               $this->i++;
+               if ( $this->i == 200 ) {
+                       return;
+               }
+
+               if ( $catarray ) {
+                       foreach ( $catarray as $catname ) {
+                               self::$watcher->allparents[] = $catname;
+                               $id = self::$watcher->getCategoryArticleId( 
$catname );
+                               if ( is_numeric( $id ) ) {
+                                       $parentCat = 
self::$watcher->getParentCategories( $id );
+                                       if ( $parentCat ) {
+                                               self::$watcher->allparents[] = 
$parentCat;
+                                               
self::$watcher->findCategoryParents( [ $parentCat ] );
+                                       }
+                               }
+                       }
+                       self::$watcher->allparents = array_unique( 
self::$watcher->allparents );
+               }
+       }
+
+       /**
+        * Return the parent categories
+        * @param int $id Category Article id
+        * @return parents
+        */
+       protected function getParentCategories( $id ) {
+               $dbr  = wfGetDB( DB_SLAVE );
+               $cl   = $dbr->tableName( 'categorylinks' );
+               $res  = $dbr->select(
+                       $cl, 'cl_to', "cl_from = $id", __METHOD__,
+                       [ 'ORDER BY' => 'cl_sortkey' ]
+               );
+               $row = $dbr->fetchRow( $res );
+               $dbr->freeResult( $res );
+               if ( empty( $row[0] ) ) {
+                       return false;
+               }
+               return $row[0];
+       }
+
+       /**
+        * Load page ID of one category
+        *
+        * @param string $catname name of category
+        * @return int
+        */
+       protected function getCategoryArticleId( $catname ) {
+               $dbr = wfGetDB( DB_SLAVE );
+               $cl  = $dbr->tableName( 'page' );
+               $res = $dbr->select( $cl, 'page_id', "page_title = '$catname'", 
__METHOD__ );
+               $row = $dbr->fetchRow( $res );
+               $dbr->freeResult( $res );
+               return $row[0];
        }
 
        /**
diff --git a/README.md b/README.md
index 1fb356e..6433bdf 100644
--- a/README.md
+++ b/README.md
@@ -18,14 +18,19 @@
 $wgCategoryWatchNotifyEditor = true;
 ```
 
-Set this to give every user a unique category that they're automatically 
watching. The format of the category name is defined on the 
"categorywatch-autocat" localisation message (i.e. 
[[MediaWiki:categorywatch-autocat]])
+Give every user a unique category that they're automatically watching. The 
format of the category name is defined on the "categorywatch-autocat" 
localisation message (i.e. [[MediaWiki:categorywatch-autocat]])
 ```php
-$wgCategoryWatchUseAutoCat = false;
+$wgCategoryWatchUseAutoCat = true;
 ```
 
-Set this to make the categorisation work by realname instead of username
+Make the categorisation work by realname instead of username
 ```php
-$wgCategoryWatchUseAutoCatRealName = false;
+$wgCategoryWatchUseAutoCatRealName = true;
+```
+
+Notify watchers of parent categories as well
+```php
+$wgCategoryWatchNotifyParentWatchers = true;
 ```
 
 ## How to debug

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic7d32294a573fcb95b96e8c00f6792c39abdb5d8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/CategoryWatch
Gerrit-Branch: master
Gerrit-Owner: MarkAHershberger <m...@nichework.com>

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

Reply via email to