<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[BuddyPress][9398] trunk: On multisite configs, make sure unspamming the user from the Users Network Administration screen is updating the .</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="http://buddypress.trac.wordpress.org/changeset/9398">9398</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"http://buddypress.trac.wordpress.org/changeset/9398","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>imath</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2015-01-22 13:31:56 +0000 (Thu, 22 Jan 2015)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>On multisite configs, make sure unspamming the user from the Users Network Administration screen is updating the .

When a user is marked as spam from the front end, then marked as ham from the network-users administration screen using the 'unspam' bulk action, we need to be sure the  field of the users table is updated so that BuddyPress effectively takes in account the user has been unspammed.

This commit also makes sure the user's cache has been cleared.

Fixes <a href="http://buddypress.trac.wordpress.org/ticket/5275">#5275</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcbpmembersbpmembersfunctionsphp">trunk/src/bp-members/bp-members-functions.php</a></li>
<li><a href="#trunktestsphpunittestcasesmembersfunctionsphp">trunk/tests/phpunit/testcases/members/functions.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcbpmembersbpmembersfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/bp-members/bp-members-functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/bp-members/bp-members-functions.php     2015-01-21 23:58:19 UTC (rev 9397)
+++ trunk/src/bp-members/bp-members-functions.php       2015-01-22 13:31:56 UTC (rev 9398)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -785,13 +785,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        remove_action( 'make_spam_user', 'bp_core_mark_user_spam_admin' );
</span><span class="cx" style="display: block; padding: 0 10px">        remove_action( 'make_ham_user',  'bp_core_mark_user_ham_admin'  );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        // Determine if we are on an admin page
-       $is_admin = is_admin();
-       if ( $is_admin && ! defined( 'DOING_AJAX' ) ) {
-               $is_admin = (bool) ( buddypress()->members->admin->user_page !== get_current_screen()->id );
-       }
-
-       // When marking as spam in the Dashboard, these actions are handled by WordPress
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // force the cleanup of WordPress content and status for multisite configs
</ins><span class="cx" style="display: block; padding: 0 10px">         if ( $do_wp_cleanup ) {
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Get the blogs for the user
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -812,35 +806,36 @@
</span><span class="cx" style="display: block; padding: 0 10px">                if ( is_multisite() ) {
</span><span class="cx" style="display: block; padding: 0 10px">                        update_user_status( $user_id, 'spam', $is_spam );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        }
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                // Always set single site status
-               $wpdb->update( $wpdb->users, array( 'user_status' => $is_spam ), array( 'ID' => $user_id ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ // Update the user status
+       $wpdb->update( $wpdb->users, array( 'user_status' => $is_spam ), array( 'ID' => $user_id ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        // Clean user cache
+       clean_user_cache( $user_id );
+
+       if ( ! is_multisite() ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                 // Call multisite actions in single site mode for good measure
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( !is_multisite() ) {
-                       if ( true === $is_spam ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( true === $is_spam ) {
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                /**
-                                * Fires at end of processing spammer in Dashboard if not multisite and user is spam.
-                                *
-                                * @since BuddyPress (1.5.0)
-                                *
-                                * @param int $value Displayed user ID.
-                                */
-                               do_action( 'make_spam_user', bp_displayed_user_id() );
-                       } else {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 /**
+                        * Fires at end of processing spammer in Dashboard if not multisite and user is spam.
+                        *
+                        * @since BuddyPress (1.5.0)
+                        *
+                        * @param int $value user ID.
+                        */
+                       do_action( 'make_spam_user', $user_id );
+               } else {
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                /**
-                                * Fires at end of processing spammer in Dashboard if not multisite and user is not spam.
-                                *
-                                * @since BuddyPress (1.5.0)
-                                *
-                                * @param int $value Displayed user ID.
-                                */
-                               do_action( 'make_ham_user', bp_displayed_user_id() );
-                       }
-
-
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 /**
+                        * Fires at end of processing spammer in Dashboard if not multisite and user is not spam.
+                        *
+                        * @since BuddyPress (1.5.0)
+                        *
+                        * @param int $value user ID.
+                        */
+                       do_action( 'make_ham_user', $user_id );
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunktestsphpunittestcasesmembersfunctionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/tests/phpunit/testcases/members/functions.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/testcases/members/functions.php       2015-01-21 23:58:19 UTC (rev 9397)
+++ trunk/tests/phpunit/testcases/members/functions.php 2015-01-22 13:31:56 UTC (rev 9398)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -450,6 +450,90 @@
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span><span class="cx" style="display: block; padding: 0 10px">         * @group bp_core_process_spammer_status
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        public function test_bp_core_process_spammer_status() {
+               if ( is_multisite() ) {
+                       return;
+               }
+
+               $bp = buddypress();
+               $displayed_user = $bp->displayed_user;
+
+               $u1 = $this->factory->user->create();
+               $bp->displayed_user->id = $u1;
+
+               // Spam the user
+               bp_core_process_spammer_status( $u1, 'spam' );
+
+               $this->assertTrue( bp_is_user_spammer( $u1 ) );
+
+               // Unspam the user
+               bp_core_process_spammer_status( $u1, 'ham' );
+
+               $this->assertFalse( bp_is_user_spammer( $u1 ) );
+
+               // Reset displayed user
+               $bp->displayed_user = $displayed_user;
+       }
+
+       /**
+        * @group bp_core_process_spammer_status
+        */
+       public function test_bp_core_process_spammer_status_ms_bulk_spam() {
+               if ( ! is_multisite() ) {
+                       return;
+               }
+
+               $bp = buddypress();
+               $displayed_user = $bp->displayed_user;
+
+               $u1 = $this->factory->user->create();
+               $bp->displayed_user->id = $u1;
+
+               // Bulk spam in network admin uses update_user_status
+               update_user_status( $u1, 'spam', '1' );
+
+               $this->assertTrue( bp_is_user_spammer( $u1 ) );
+
+               // Unspam the user
+               bp_core_process_spammer_status( $u1, 'ham' );
+
+               $this->assertFalse( bp_is_user_spammer( $u1 ) );
+
+               // Reset displayed user
+               $bp->displayed_user = $displayed_user;
+       }
+
+       /**
+        * @group bp_core_process_spammer_status
+        */
+       public function test_bp_core_process_spammer_status_ms_bulk_ham() {
+               if ( ! is_multisite() ) {
+                       return;
+               }
+
+               $bp = buddypress();
+               $displayed_user = $bp->displayed_user;
+
+               $u1 = $this->factory->user->create();
+               $bp->displayed_user->id = $u1;
+
+               // Spam the user
+               bp_core_process_spammer_status( $u1, 'spam' );
+
+               $this->assertTrue( bp_is_user_spammer( $u1 ) );
+
+               // Bulk unspam in network admin uses update_user_status
+               update_user_status( $u1, 'spam', '0' );
+
+               $this->assertFalse( bp_is_user_spammer( $u1 ) );
+
+               // Reset displayed user
+               $bp->displayed_user = $displayed_user;
+       }
+
+       /**
+        * @group bp_core_process_spammer_status
+        */
</ins><span class="cx" style="display: block; padding: 0 10px">         public function test_bp_core_process_spammer_status_make_spam_user_filter() {
</span><span class="cx" style="display: block; padding: 0 10px">                add_filter( 'make_spam_user', array( $this, 'notification_filter_callback' ) );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre>
</div>
</div>

</body>
</html>