Ticket #5911: 5911.03.patch
File 5911.03.patch, 18.4 KB (added by , 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 { 2441 2441 * @param string $type If 'sent', results are limited to those 2442 2442 * invitations that have actually been sent (non-draft). 2443 2443 * Default: 'sent'. 2444 * @param int $inviter_id ID of the user who invited 2444 2445 * @return int|null The ID of the invitation if found, otherwise null. 2445 2446 */ 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(); 2448 2450 2449 if ( empty( $user_id ) ) 2451 if ( empty( $user_id ) ) { 2450 2452 return false; 2453 } 2451 2454 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 ); 2453 2464 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; 2456 2475 2457 return $wpdb->get_var( $ wpdb->prepare( $sql, $user_id, $group_id ));2476 return $wpdb->get_var( $query ); 2458 2477 } 2459 2478 2460 2479 /** … … class BP_Groups_Member { 2462 2481 * 2463 2482 * @param int $user_id ID of the user. 2464 2483 * @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 2465 2488 * @return int Number of records deleted. 2466 2489 */ 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(); 2469 2493 2470 if ( empty( $user_id ) ) 2494 if ( empty( $user_id ) ) { 2471 2495 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; 2472 2518 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 ); 2474 2520 } 2475 2521 2476 2522 /** -
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 ) { 362 362 } 363 363 } 364 364 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 ) ) { 367 367 return false; 368 368 } 369 369 … … function groups_invite_user( $args = '' ) { 891 891 'is_confirmed' => 0 892 892 ); 893 893 894 $args = wp_parse_args( $args, $defaults ); 895 extract( $args, EXTR_SKIP ); 894 $r = wp_parse_args( $args, $defaults ); 896 895 897 if ( empty( $ user_id ) || empty( $group_id ) )896 if ( empty( $r['user_id'] ) || empty( $r['group_id'] ) ) { 898 897 return false; 898 } 899 899 900 // if the user has already requested membership, accept the request901 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; 903 903 904 904 // 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'] ) ) { 906 906 $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']; 912 912 913 if ( ! $invite->save() )913 if ( ! $invite->save() ) { 914 914 return false; 915 } 915 916 916 do_action( 'groups_invite_user', $ args);917 do_action( 'groups_invite_user', $r ); 917 918 } 918 919 919 920 return true; … … function groups_invite_user( $args = '' ) { 926 927 * 927 928 * @param int $user_id ID of the user. 928 929 * @param int $group_id ID of the group. 930 * @param int $inviter_id ID of the user who invited. 929 931 * @return bool True on success, false on failure. 930 932 */ 931 function groups_uninvite_user( $user_id, $group_id ) {933 function groups_uninvite_user( $user_id, $group_id, $type = 'sent', $inviter_id = 0 ) { 932 934 933 if ( ! BP_Groups_Member::delete( $user_id, $group_id ) )935 if ( ! BP_Groups_Member::delete_invite( $user_id, $group_id, $type, $inviter_id ) ) { 934 936 return false; 937 } 935 938 936 do_action( 'groups_uninvite_user', $group_id, $user_id );939 do_action( 'groups_uninvite_user', $group_id, $user_id, $inviter_id ); 937 940 938 941 return true; 939 942 } … … function groups_accept_invite( $user_id, $group_id ) { 975 978 $member->delete_request( $user_id, $group_id ); 976 979 } 977 980 981 // Remove all invites 982 groups_uninvite_user( $user_id, $group_id, 'all' ); 983 978 984 // Modify group meta 979 985 groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() ); 980 986 … … function groups_send_invites( $user_id, $group_id ) { 1031 1037 $group = groups_get_group( array( 'group_id' => $group_id ) ); 1032 1038 1033 1039 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 1034 1048 $member = new BP_Groups_Member( $invited_users[$i], $group_id ); 1035 1049 1036 1050 // Send the actual invite … … function groups_get_invites_for_group( $user_id, $group_id ) { 1058 1072 * @param int $group_id ID of potential group. 1059 1073 * @param string $type Optional. Use 'sent' to check for sent invites, 'all' to 1060 1074 * check for all. Default: 'sent'. 1075 * @param int $inviter_id ID of the user who invited 1061 1076 * @return bool True if an invitation is found, otherwise false. 1062 1077 */ 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 );1078 function 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 ); 1065 1080 } 1066 1081 1067 1082 /** -
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() { 4492 4492 } 4493 4493 4494 4494 /** 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 */ 4501 function bp_group_membership_requested() { 4502 echo bp_get_group_membership_requested(); 4503 } 4504 add_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 */ 4539 function bp_invitation_status_message() { 4540 echo bp_get_invitation_status_message(); 4541 } 4542 add_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 /** 4495 4569 * Output pagination links for group invitations. 4496 4570 * 4497 4571 * @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() { 1037 1037 1038 1038 if ( 'invite' == $_POST['friend_action'] ) { 1039 1039 $group = groups_get_group( $group_id ); 1040 $user_status = 'is_invited'; 1040 1041 1041 1042 // Users who have previously requested membership do not need 1042 1043 // another invitation created for them 1043 1044 if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) { 1044 1045 $user_status = 'is_pending'; 1046 } 1045 1047 1046 1048 // 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 } 1049 1052 1050 // Miscellaneous failure 1051 } else { 1053 if ( ! empty( $_POST['is_new_template'] ) ) { 1052 1054 return; 1053 1055 } 1054 1056 … … function bp_legacy_theme_ajax_invite_user() { 1072 1074 exit; 1073 1075 1074 1076 } elseif ( 'uninvite' == $_POST['friend_action'] ) { 1075 // Users who have previously requested membership should not1076 // have their requests deleted on the "uninvite" action1077 if ( BP_Groups_Member::check_for_membership_request( $friend_id, $group_id ) ) {1078 return;1079 }1080 1077 1081 1078 // 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() ) ) { 1083 1080 return; 1084 1081 } 1085 1082 -
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() { 1035 1035 friend_action = 'uninvite'; 1036 1036 } 1037 1037 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 1038 1048 if ( ! invites_new_template ) { 1039 1049 jq( '.item-list-tabs li.selected' ).addClass( 'loading' ); 1050 ajaxdata.is_new_template = 0; 1040 1051 } 1041 1052 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, 1050 1054 function(response) 1051 1055 { 1052 1056 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!'; 628 628 groups_accept_invite( $u2, $g ); 629 629 $this->assertEquals( 0, groups_get_invite_count_for_user( $u2 ) ); 630 630 } 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 } 631 807 }