Skip to:
Content

BuddyPress.org

Ticket #5911: 5911.03.patch

File 5911.03.patch, 18.4 KB (added by dcavins, 10 years ago)
  • src/bp-groups/bp-groups-classes.php

    diff --git src/bp-groups/bp-groups-classes.php src/bp-groups/bp-groups-classes.php
    index 24fed9c..90bbaf7 100644
    class BP_Groups_Member { 
    24412441         * @param string $type If 'sent', results are limited to those
    24422442         *        invitations that have actually been sent (non-draft).
    24432443         *        Default: 'sent'.
     2444         * @param int $inviter_id ID of the user who invited
    24442445         * @return int|null The ID of the invitation if found, otherwise null.
    24452446         */
    2446         public static function check_has_invite( $user_id, $group_id, $type = 'sent' ) {
    2447                 global $wpdb, $bp;
     2447        public static function check_has_invite( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
     2448                global $wpdb;
     2449                $bp = buddypress();
    24482450
    2449                 if ( empty( $user_id ) )
     2451                if ( empty( $user_id ) ) {
    24502452                        return false;
     2453                }
    24512454
    2452                 $sql = "SELECT id FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND inviter_id != 0";
     2455                $sql = array(
     2456                        'select' => "SELECT id FROM {$bp->groups->table_name_members}",
     2457                        'where'  => array(
     2458                                'user'      => $wpdb->prepare( 'user_id = %d', $user_id ),
     2459                                'group'     => $wpdb->prepare( 'group_id = %d', $group_id ),
     2460                                'confirmed' => 'is_confirmed = 0',
     2461                                'inviter'   => 'inviter_id != 0',
     2462                        ),
     2463                );
    24532464
    2454                 if ( 'sent' == $type )
    2455                         $sql .= " AND invite_sent = 1";
     2465                if ( ! empty( $inviter_id ) ) {
     2466                        $sql['where']['inviter'] = $wpdb->prepare( 'inviter_id = %d', $inviter_id );
     2467                }
     2468
     2469                if ( 'sent' == $type ) {
     2470                        $sql['where']['sent'] = 'invite_sent = 1';
     2471                }
     2472
     2473                $where = ' WHERE ' . join( ' AND ', $sql['where'] );
     2474                $query = $sql['select'] . $where;
    24562475
    2457                 return $wpdb->get_var( $wpdb->prepare( $sql, $user_id, $group_id ) );
     2476                return $wpdb->get_var( $query );
    24582477        }
    24592478
    24602479        /**
    class BP_Groups_Member { 
    24622481         *
    24632482         * @param int $user_id ID of the user.
    24642483         * @param int $group_id ID of the group.
     2484         * @param string $type If 'sent', results are limited to those
     2485         *        invitations that have actually been sent (non-draft).
     2486         *        Default: 'sent'.
     2487         * @param int $inviter_id ID of the user who invited
    24652488         * @return int Number of records deleted.
    24662489         */
    2467         public static function delete_invite( $user_id, $group_id ) {
    2468                 global $wpdb, $bp;
     2490        public static function delete_invite( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
     2491                global $wpdb;
     2492                $bp = buddypress();
    24692493
    2470                 if ( empty( $user_id ) )
     2494                if ( empty( $user_id ) ) {
    24712495                        return false;
     2496                }
     2497
     2498                $sql = array(
     2499                        'delete' => "DELETE FROM {$bp->groups->table_name_members}",
     2500                        'where'  => array(
     2501                                'user'      => $wpdb->prepare( 'user_id = %d', $user_id ),
     2502                                'group'     => $wpdb->prepare( 'group_id = %d', $group_id ),
     2503                                'confirmed' => 'is_confirmed = 0',
     2504                                'inviter'   => 'inviter_id != 0',
     2505                        ),
     2506                );
     2507
     2508                if ( ! empty( $inviter_id ) ) {
     2509                        $sql['where']['inviter'] = $wpdb->prepare( 'inviter_id = %d', $inviter_id );
     2510                }
     2511
     2512                if ( 'sent' == $type ) {
     2513                        $sql['where']['sent'] = 'invite_sent = 1';
     2514                }
     2515
     2516                $where = ' WHERE ' . join( ' AND ', $sql['where'] );
     2517                $query = $sql['delete'] . $where;
    24722518
    2473                 return $wpdb->query( $wpdb->prepare( "DELETE FROM {$bp->groups->table_name_members} WHERE user_id = %d AND group_id = %d AND is_confirmed = 0 AND inviter_id != 0 AND invite_sent = 1", $user_id, $group_id ) );
     2519                return $wpdb->query( $query );
    24742520        }
    24752521
    24762522        /**
  • src/bp-groups/bp-groups-functions.php

    diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
    index c83e743..330b5ca 100644
    function groups_leave_group( $group_id, $user_id = 0 ) { 
    362362                }
    363363        }
    364364
    365         // This is exactly the same as deleting an invite, just is_confirmed = 1 NOT 0.
    366         if ( !groups_uninvite_user( $user_id, $group_id ) ) {
     365        // This is exactly the same as rejecting an invite, just is_confirmed = 1 NOT 0.
     366        if ( ! groups_reject_invite( $user_id, $group_id ) ) {
    367367                return false;
    368368        }
    369369
    function groups_invite_user( $args = '' ) { 
    891891                'is_confirmed'  => 0
    892892        );
    893893
    894         $args = wp_parse_args( $args, $defaults );
    895         extract( $args, EXTR_SKIP );
     894        $r = wp_parse_args( $args, $defaults );
    896895
    897         if ( empty( $user_id ) || empty( $group_id ) )
     896        if ( empty( $r['user_id'] ) || empty( $r['group_id'] ) ) {
    898897                return false;
     898        }
    899899
    900         // if the user has already requested membership, accept the request
    901         if ( $membership_id = groups_check_for_membership_request( $user_id, $group_id ) ) {
    902                 groups_accept_membership_request( $membership_id, $user_id, $group_id );
     900        // bail if the user is already a member
     901        if ( groups_is_user_member( $r['user_id'], $r['group_id'] ) ) {
     902                return false;
    903903
    904904        // Otherwise, create a new invitation
    905         } else if ( ! groups_is_user_member( $user_id, $group_id ) && ! groups_check_user_has_invite( $user_id, $group_id, 'all' ) ) {
     905        } else if ( ! groups_check_user_has_invite( $r['user_id'], $r['group_id'], 'all', $r['inviter_id'] ) ) {
    906906                $invite                = new BP_Groups_Member;
    907                 $invite->group_id      = $group_id;
    908                 $invite->user_id       = $user_id;
    909                 $invite->date_modified = $date_modified;
    910                 $invite->inviter_id    = $inviter_id;
    911                 $invite->is_confirmed  = $is_confirmed;
     907                $invite->group_id      = $r['group_id'];
     908                $invite->user_id       = $r['user_id'];
     909                $invite->date_modified = $r['date_modified'];
     910                $invite->inviter_id    = $r['inviter_id'];
     911                $invite->is_confirmed  = $r['is_confirmed'];
    912912
    913                 if ( !$invite->save() )
     913                if ( ! $invite->save() ) {
    914914                        return false;
     915                }
    915916
    916                 do_action( 'groups_invite_user', $args );
     917                do_action( 'groups_invite_user', $r );
    917918        }
    918919
    919920        return true;
    function groups_invite_user( $args = '' ) { 
    926927 *
    927928 * @param int $user_id ID of the user.
    928929 * @param int $group_id ID of the group.
     930 * @param int $inviter_id ID of the user who invited.
    929931 * @return bool True on success, false on failure.
    930932 */
    931 function groups_uninvite_user( $user_id, $group_id ) {
     933function groups_uninvite_user( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
    932934
    933         if ( !BP_Groups_Member::delete( $user_id, $group_id ) )
     935        if ( ! BP_Groups_Member::delete_invite( $user_id, $group_id, $type, $inviter_id ) ) {
    934936                return false;
     937        }
    935938
    936         do_action( 'groups_uninvite_user', $group_id, $user_id );
     939        do_action( 'groups_uninvite_user', $group_id, $user_id, $inviter_id );
    937940
    938941        return true;
    939942}
    function groups_accept_invite( $user_id, $group_id ) { 
    975978                $member->delete_request( $user_id, $group_id );
    976979        }
    977980
     981        // Remove all invites
     982        groups_uninvite_user( $user_id, $group_id, 'all' );
     983
    978984        // Modify group meta
    979985        groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() );
    980986
    function groups_send_invites( $user_id, $group_id ) { 
    10311037        $group = groups_get_group( array( 'group_id' => $group_id ) );
    10321038
    10331039        for ( $i = 0, $count = count( $invited_users ); $i < $count; ++$i ) {
     1040                $membership_id = groups_check_for_membership_request( $invited_users[$i], $group_id );
     1041
     1042                if ( ! empty( $membership_id ) ) {
     1043                        groups_accept_membership_request( $membership_id, $invited_users[$i], $group_id );
     1044                        groups_uninvite_user( $invited_users[$i], $group_id, 'all', $user_id );
     1045                        continue;
     1046                }
     1047
    10341048                $member = new BP_Groups_Member( $invited_users[$i], $group_id );
    10351049
    10361050                // Send the actual invite
    function groups_get_invites_for_group( $user_id, $group_id ) { 
    10581072 * @param int $group_id ID of potential group.
    10591073 * @param string $type Optional. Use 'sent' to check for sent invites, 'all' to
    10601074 *        check for all. Default: 'sent'.
     1075 * @param int $inviter_id ID of the user who invited
    10611076 * @return bool True if an invitation is found, otherwise false.
    10621077 */
    1063 function groups_check_user_has_invite( $user_id, $group_id, $type = 'sent' ) {
    1064         return BP_Groups_Member::check_has_invite( $user_id, $group_id, $type );
     1078function groups_check_user_has_invite( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) {
     1079        return BP_Groups_Member::check_has_invite( $user_id, $group_id, $type, $inviter_id );
    10651080}
    10661081
    10671082/**
  • src/bp-groups/bp-groups-template.php

    diff --git src/bp-groups/bp-groups-template.php src/bp-groups/bp-groups-template.php
    index d487aeb..59a6a4b 100644
    function bp_group_invite_user_remove_invite_url() { 
    44924492        }
    44934493
    44944494/**
     4495 * Output an information if the invited user has previously requested a membership
     4496 *
     4497 * @since BuddyPress (2.2.0)
     4498 *
     4499 * @uses  bp_get_group_membership_requested()
     4500 */
     4501function bp_group_membership_requested() {
     4502        echo bp_get_group_membership_requested();
     4503}
     4504add_action( 'bp_group_send_invites_item', 'bp_group_membership_requested' );
     4505
     4506        /**
     4507         * Returns an information if the invited user has previously requested a membership
     4508         *
     4509         * @since BuddyPress (2.2.0)
     4510         *
     4511         * @uses  groups_check_for_membership_request() to check if the member has requested a membership
     4512         * @uses  apply_filters() calls 'bp_get_group_membership_requested' to override output
     4513         * @return string HTML Output
     4514         */
     4515        function bp_get_group_membership_requested() {
     4516                global $invites_template;
     4517
     4518                $user_id  = intval( $invites_template->invite->user->id );
     4519                $group_id = intval( $invites_template->invite->group_id );
     4520                $output   = '';
     4521
     4522                if ( ! groups_check_for_membership_request( $user_id, $group_id ) ) {
     4523                        return $output;
     4524                }
     4525
     4526                $output = '<p class="description">' . sprintf( __( '%s has previously requested to join this group. Sending an invitation will automatically add the member to the group.', 'buddypress' ), $invites_template->invite->user->user_link ) . '</p>';
     4527
     4528                return apply_filters( 'bp_get_group_membership_requested', $output, $user_id, $group_id );
     4529        }
     4530
     4531/**
     4532 * Output sent status of invitation
     4533 * Hopefully helps users understand the two-step invitation process
     4534 *
     4535 * @since BuddyPress (2.2.0)
     4536 *
     4537 * @uses  bp_get_invitation_status_message()
     4538 */
     4539function bp_invitation_status_message() {
     4540        echo bp_get_invitation_status_message();
     4541}
     4542add_action( 'bp_group_send_invites_item', 'bp_invitation_status_message' );
     4543
     4544        /**
     4545         * Output sent status of invitation
     4546         * Hopefully helps users understand the two-step invitation process
     4547         *
     4548         * @since BuddyPress (2.2.0)
     4549         *
     4550         * @uses  apply_filters() calls 'bp_get_invitation_status_message' to override output
     4551         * @return string HTML Output
     4552         */
     4553        function bp_get_invitation_status_message() {
     4554                global $invites_template;
     4555
     4556                $output = '';
     4557
     4558                if ( $invites_template->invite->user->invite_sent ) {
     4559                        $invited_date = bp_core_time_since( strtotime( $invites_template->invite->user->date_modified ) );
     4560                        $output .= '<p class="invite-status meta">' . __( 'Invited', 'buddypress') . ' ' . $invited_date . '</p>';
     4561                } else {
     4562                        $output .= '<p class="invite-status meta alert">' . __( 'Invitation has not yet been sent.', 'buddypress' ) . '</p>';
     4563                }
     4564
     4565                return apply_filters( 'bp_get_invitation_status_message', $output, $invites_template->invite->user );
     4566        }
     4567
     4568/**
    44954569 * Output pagination links for group invitations.
    44964570 *
    44974571 * @since BuddyPress (2.0.0)
  • src/bp-templates/bp-legacy/buddypress-functions.php

    diff --git src/bp-templates/bp-legacy/buddypress-functions.php src/bp-templates/bp-legacy/buddypress-functions.php
    index dbd36cc..727a16d 100644
    function bp_legacy_theme_ajax_invite_user() { 
    10371037
    10381038        if ( 'invite' == $_POST['friend_action'] ) {
    10391039                $group = groups_get_group( $group_id );
     1040                $user_status = 'is_invited';
    10401041
    10411042                // Users who have previously requested membership do not need
    10421043                // another invitation created for them
    10431044                if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
    10441045                        $user_status = 'is_pending';
     1046                }
    10451047
    10461048                // Create the user invitation
    1047                 } else if ( groups_invite_user( array( 'user_id' => $friend_id, 'group_id' => $group_id ) ) ) {
    1048                         $user_status = 'is_invited';
     1049                if ( ! groups_invite_user( array( 'user_id' => $friend_id, 'group_id' => $group_id ) ) ) {
     1050                        return;
     1051                }
    10491052
    1050                 // Miscellaneous failure
    1051                 } else {
     1053                if ( ! empty( $_POST['is_new_template'] ) ) {
    10521054                        return;
    10531055                }
    10541056
    function bp_legacy_theme_ajax_invite_user() { 
    10721074                exit;
    10731075
    10741076        } elseif ( 'uninvite' == $_POST['friend_action'] ) {
    1075                 // Users who have previously requested membership should not
    1076                 // have their requests deleted on the "uninvite" action
    1077                 if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {
    1078                         return;
    1079                 }
    10801077
    10811078                // Remove the unsent invitation
    1082                 if ( ! groups_uninvite_user( $friend_id, $group_id ) ) {
     1079                if ( ! groups_uninvite_user( $friend_id, $group_id, 'all', bp_loggedin_user_id() ) ) {
    10831080                        return;
    10841081                }
    10851082
  • src/bp-templates/bp-legacy/js/buddypress.js

    diff --git src/bp-templates/bp-legacy/js/buddypress.js src/bp-templates/bp-legacy/js/buddypress.js
    index 1107c9f..04e7668 100644
    jq(document).ready( function() { 
    10351035                        friend_action = 'uninvite';
    10361036                }
    10371037
     1038                ajaxdata = {
     1039                        action: 'groups_invite_user',
     1040                        'friend_action'   : friend_action,
     1041                        'cookie'          : bp_get_cookies(),
     1042                        '_wpnonce'        : jq('#_wpnonce_invite_uninvite_user').val(),
     1043                        'friend_id'       : friend_id,
     1044                        'group_id'        : jq('#group_id').val(),
     1045                        'is_new_template' : 1,
     1046                };
     1047
    10381048                if ( ! invites_new_template ) {
    10391049                        jq( '.item-list-tabs li.selected' ).addClass( 'loading' );
     1050                        ajaxdata.is_new_template = 0;
    10401051                }
    10411052
    1042                 jq.post( ajaxurl, {
    1043                         action: 'groups_invite_user',
    1044                         'friend_action': friend_action,
    1045                         'cookie': bp_get_cookies(),
    1046                         '_wpnonce': jq('#_wpnonce_invite_uninvite_user').val(),
    1047                         'friend_id': friend_id,
    1048                         'group_id': jq('#group_id').val()
    1049                 },
     1053                jq.post( ajaxurl, ajaxdata,
    10501054                function(response)
    10511055                {
    10521056                        if ( jq('#message') ) {
  • tests/phpunit/testcases/groups/functions.php

    diff --git tests/phpunit/testcases/groups/functions.php tests/phpunit/testcases/groups/functions.php
    index fbfa4d9..42f8f57 100644
    Bar!'; 
    628628                groups_accept_invite( $u2, $g );
    629629                $this->assertEquals( 0, groups_get_invite_count_for_user( $u2 ) );
    630630        }
     631
     632        /**
     633         * @group invites
     634         * @group BP5911
     635         */
     636        public function test_groups_invite_user_private_group() {
     637                $u1 = $this->create_user();
     638                $u2 = $this->create_user();
     639                $u3 = $this->create_user();
     640
     641                $g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     642
     643                self::add_user_to_group( $u3, $g );
     644
     645                // create invitation
     646                $invite_not_member = groups_invite_user( array(
     647                        'user_id'    => $u2,
     648                        'group_id'   => $g,
     649                        'inviter_id' => $u1,
     650                ) );
     651
     652                // create invitation
     653                $invite_is_member = groups_invite_user( array(
     654                        'user_id'    => $u3,
     655                        'group_id'   => $g,
     656                        'inviter_id' => $u1,
     657                ) );
     658
     659                $this->assertTrue( $invite_not_member );
     660                $this->assertFalse( $invite_is_member );
     661        }
     662
     663        /**
     664         * @group invites
     665         * @group BP5911
     666         */
     667        public function test_groups_invite_user_multiple_invites() {
     668                $u1 = $this->create_user();
     669                $u2 = $this->create_user();
     670                $u3 = $this->create_user();
     671                $u4 = $this->create_user();
     672
     673                $g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     674
     675                // Add u3 so that he can invite
     676                self::add_user_to_group( $u3, $g );
     677
     678                // u2 is requesting membership
     679                groups_send_membership_request( $u2, $g );
     680
     681                // u1 invites u2
     682                $invite_not_member = groups_invite_user( array(
     683                        'user_id'    => $u2,
     684                        'group_id'   => $g,
     685                        'inviter_id' => $u1,
     686                ) );
     687
     688                // u1 invites u4
     689                $invite_not_member = groups_invite_user( array(
     690                        'user_id'    => $u4,
     691                        'group_id'   => $g,
     692                        'inviter_id' => $u1,
     693                ) );
     694
     695                // u3 is also inviting u4
     696                $invite_is_member = groups_invite_user( array(
     697                        'user_id'    => $u4,
     698                        'group_id'   => $g,
     699                        'inviter_id' => $u3,
     700                ) );
     701
     702                // Send invites
     703                groups_send_invites( $u1, $g );
     704                groups_send_invites( $u3, $g );
     705
     706                // Check u2 is now a member
     707                $this->assertEquals( 1, groups_is_user_member( $u2, $g ) );
     708
     709                // Check u4 has invites
     710                $this->assertNotEmpty( groups_check_user_has_invite( $u4, $g ) );
     711
     712                // u4 is accepting the invite
     713                groups_accept_invite( $u4, $g );
     714
     715                // Check u2 is now a member
     716                $this->assertEquals( 1, groups_is_user_member( $u2, $g ) );
     717
     718                // Check u1 & u3 has no more invites
     719                $this->assertEmpty( groups_get_invites_for_group( $u1, $g ) );
     720                $this->assertEmpty( groups_get_invites_for_group( $u3, $g ) );
     721        }
     722
     723        /**
     724         * @group invites
     725         * @group BP5911
     726         */
     727        public function test_groups_send_membership_request_has_multiple_invites() {
     728                $u1 = $this->create_user();
     729                $u2 = $this->create_user();
     730                $u3 = $this->create_user();
     731
     732                $g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     733
     734                // Add u3 so that he can invite
     735                self::add_user_to_group( $u3, $g );
     736
     737                // u1 invites u2
     738                $invite_not_member = groups_invite_user( array(
     739                        'user_id'    => $u2,
     740                        'group_id'   => $g,
     741                        'inviter_id' => $u1,
     742                ) );
     743
     744                // u3 invites u2
     745                $invite_not_member = groups_invite_user( array(
     746                        'user_id'    => $u2,
     747                        'group_id'   => $g,
     748                        'inviter_id' => $u3,
     749                ) );
     750
     751                // Send invites
     752                groups_send_invites( $u1, $g );
     753                groups_send_invites( $u3, $g );
     754
     755                // u2 is requesting membership
     756                groups_send_membership_request( $u2, $g );
     757
     758                // Check u2 is now a member
     759                $this->assertEquals( 1, groups_is_user_member( $u2, $g ) );
     760
     761                // Check u1 & u3 has no more invites
     762                $this->assertEmpty( groups_get_invites_for_group( $u1, $g ) );
     763                $this->assertEmpty( groups_get_invites_for_group( $u3, $g ) );
     764        }
     765
     766        /**
     767         * @group invites
     768         * @group BP5911
     769         */
     770        public function test_groups_reject_invite_multiple_invites() {
     771                $u1 = $this->create_user();
     772                $u2 = $this->create_user();
     773                $u3 = $this->create_user();
     774
     775                $g = $this->factory->group->create( array( 'creator_id' => $u1, 'status' => 'private' ) );
     776
     777                // Add u3 so that he can invite
     778                self::add_user_to_group( $u3, $g );
     779
     780                // u1 invites u2
     781                $invite_not_member = groups_invite_user( array(
     782                        'user_id'    => $u2,
     783                        'group_id'   => $g,
     784                        'inviter_id' => $u1,
     785                ) );
     786
     787                // u3 invites u2
     788                $invite_not_member = groups_invite_user( array(
     789                        'user_id'    => $u2,
     790                        'group_id'   => $g,
     791                        'inviter_id' => $u3,
     792                ) );
     793
     794                // Send invites
     795                groups_send_invites( $u1, $g );
     796                groups_send_invites( $u3, $g );
     797
     798                groups_reject_invite( $u2, $g );
     799
     800                // Check u2 is not a member
     801                $this->assertEmpty( groups_is_user_member( $u2, $g ) );
     802
     803                // Check u1 & u3 has no more invites
     804                $this->assertEmpty( groups_get_invites_for_group( $u1, $g ) );
     805                $this->assertEmpty( groups_get_invites_for_group( $u3, $g ) );
     806        }
    631807}