Skip to:
Content

BuddyPress.org

Ticket #7820: 7820.2.diff

File 7820.2.diff, 13.2 KB (added by boonebgorges, 6 years ago)
  • src/bp-groups/bp-groups-filters.php

    diff --git src/bp-groups/bp-groups-filters.php src/bp-groups/bp-groups-filters.php
    index d0a42a003..5214c336a 100644
    add_filter( 'bp_activity_at_name_do_notifications', 'bp_groups_disable_at_mentio 
    7474add_filter( 'bp_core_avatar_default',       'bp_groups_default_avatar', 10, 3 );
    7575add_filter( 'bp_core_avatar_default_thumb', 'bp_groups_default_avatar', 10, 3 );
    7676
     77// Personal data export.
     78add_filter( 'wp_privacy_personal_data_exporters', 'bp_groups_register_personal_data_exporters' );
     79
    7780/**
    7881 * Filter output of Group Description through WordPress's KSES API.
    7982 *
    function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a 
    362365
    363366}
    364367add_filter( 'bp_user_can', 'bp_groups_user_can_filter', 10, 5 );
     368
     369/**
     370 * Registers Groups personal data exporters.
     371 *
     372 * @since 4.0.0
     373 *
     374 * @param array $exporters  An array of personal data exporters.
     375 * @return array An array of personal data exporters.
     376 */
     377function bp_groups_register_personal_data_exporters( $exporters ) {
     378        $exporters['buddypress-groups-memberships'] = array(
     379                'exporter_friendly_name' => __( 'BuddyPress Group Memberships', 'buddypress' ),
     380                'callback'               => 'bp_groups_memberships_personal_data_exporter',
     381        );
     382
     383        $exporters['buddypress-groups-pending-requests'] = array(
     384                'exporter_friendly_name' => __( 'BuddyPress Pending Group Membership Requests', 'buddypress' ),
     385                'callback'               => 'bp_groups_pending_requests_personal_data_exporter',
     386        );
     387
     388        $exporters['buddypress-groups-pending-received-invitations'] = array(
     389                'exporter_friendly_name' => __( 'BuddyPress Pending Group Invitations (Received)', 'buddypress' ),
     390                'callback'               => 'bp_groups_pending_received_invitations_personal_data_exporter',
     391        );
     392
     393        $exporters['buddypress-groups-pending-sent-invitations'] = array(
     394                'exporter_friendly_name' => __( 'BuddyPress Pending Group Invitations (Sent)', 'buddypress' ),
     395                'callback'               => 'bp_groups_pending_sent_invitations_personal_data_exporter',
     396        );
     397
     398        return $exporters;
     399}
  • src/bp-groups/bp-groups-functions.php

    diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
    index 24ca400f0..74eb2f421 100644
    function bp_remove_group_type_on_group_delete( $group_id = 0 ) { 
    26112611        bp_groups_set_group_type( $group_id, '' );
    26122612}
    26132613add_action( 'groups_delete_group', 'bp_remove_group_type_on_group_delete' );
     2614
     2615/**
     2616 * Finds and exports group membership data associated with an email address.
     2617 *
     2618 * @since 4.0.0
     2619 *
     2620 * @param string $email_address  The user's email address.
     2621 * @param int    $page           Batch number.
     2622 * @return array An array of personal data.
     2623 */
     2624function bp_groups_memberships_personal_data_exporter( $email_address, $page ) {
     2625        $number = 20;
     2626
     2627        $email_address = trim( $email_address );
     2628
     2629        $data_to_export = array();
     2630
     2631        $user = get_user_by( 'email', $email_address );
     2632
     2633        if ( ! $user ) {
     2634                return array(
     2635                        'data' => array(),
     2636                        'done' => true,
     2637                );
     2638        }
     2639
     2640        $memberships = BP_Groups_Member::get_user_memberships( $user->ID, array(
     2641                'type'     => 'membership',
     2642                'page'     => $page,
     2643                'per_page' => $number,
     2644        ) );
     2645
     2646        foreach ( $memberships as $membership ) {
     2647                $group = groups_get_group( $membership->group_id );
     2648
     2649                $item_data = array(
     2650                        array(
     2651                                'name'  => __( 'Group Name', 'buddypress' ),
     2652                                'value' => bp_get_group_name( $group ),
     2653                        ),
     2654                        array(
     2655                                'name'  => __( 'Group URL', 'buddypress' ),
     2656                                'value' => bp_get_group_permalink( $group ),
     2657                        ),
     2658                );
     2659
     2660                if ( $membership->inviter_id ) {
     2661                        $item_data[] = array(
     2662                                'name'  => __( 'Invited By', 'buddypress' ),
     2663                                'value' => bp_core_get_userlink( $membership->inviter_id ),
     2664                        );
     2665                }
     2666
     2667                if ( $group->creator_id === $user->ID ) {
     2668                        $group_role = __( 'Creator', 'buddypress' );
     2669                } elseif ( $membership->is_admin ) {
     2670                        $group_role = __( 'Admin', 'buddypress' );
     2671                } elseif ( $membership->is_mod ) {
     2672                        $group_role = __( 'Moderator', 'buddypress' );
     2673                } else {
     2674                        $group_role = __( 'Member', 'buddypress' );
     2675                }
     2676
     2677                $item_data[] = array(
     2678                        'name'  => __( 'Group Role', 'buddypress' ),
     2679                        'value' => $group_role,
     2680                );
     2681
     2682                $item_data[] = array(
     2683                        'name'  => __( 'Date Joined', 'buddypress' ),
     2684                        'value' => $membership->date_modified,
     2685                );
     2686
     2687                $data_to_export[] = array(
     2688                        'group_id'    => 'bp_groups_memberships',
     2689                        'group_label' => __( 'Group Memberships', 'buddypress' ),
     2690                        'item_id'     => "bp-group-membership-{$group->id}",
     2691                        'data'        => $item_data,
     2692                );
     2693        }
     2694
     2695        // Tell core if we have more items to process.
     2696        $done = count( $memberships ) < $number;
     2697
     2698        return array(
     2699                'data' => $data_to_export,
     2700                'done' => $done,
     2701        );
     2702}
     2703
     2704/**
     2705 * Finds and exports data on pending group membership requests associated with an email address.
     2706 *
     2707 * @since 4.0.0
     2708 *
     2709 * @param string $email_address  The user's email address.
     2710 * @param int    $page           Batch number.
     2711 * @return array An array of personal data.
     2712 */
     2713function bp_groups_pending_requests_personal_data_exporter( $email_address, $page ) {
     2714        $number = 20;
     2715
     2716        $email_address = trim( $email_address );
     2717
     2718        $data_to_export = array();
     2719
     2720        $user = get_user_by( 'email', $email_address );
     2721
     2722        if ( ! $user ) {
     2723                return array(
     2724                        'data' => array(),
     2725                        'done' => true,
     2726                );
     2727        }
     2728
     2729        $requests = BP_Groups_Member::get_user_memberships( $user->ID, array(
     2730                'type'     => 'pending_request',
     2731                'page'     => $page,
     2732                'per_page' => $number,
     2733        ) );
     2734
     2735        foreach ( $requests as $request ) {
     2736                $group = groups_get_group( $request->group_id );
     2737
     2738                $item_data = array(
     2739                        array(
     2740                                'name'  => __( 'Group Name', 'buddypress' ),
     2741                                'value' => bp_get_group_name( $group ),
     2742                        ),
     2743                        array(
     2744                                'name'  => __( 'Group URL', 'buddypress' ),
     2745                                'value' => bp_get_group_permalink( $group ),
     2746                        ),
     2747                        array(
     2748                                'name'  => __( 'Date Sent', 'buddypress' ),
     2749                                'value' => $request->date_modified,
     2750                        ),
     2751                );
     2752
     2753                $data_to_export[] = array(
     2754                        'group_id'    => 'bp_groups_pending_requests',
     2755                        'group_label' => __( 'Pending Group Membership Requests', 'buddypress' ),
     2756                        'item_id'     => "bp-group-pending-request-{$group->id}",
     2757                        'data'        => $item_data,
     2758                );
     2759        }
     2760
     2761        // Tell core if we have more items to process.
     2762        $done = count( $requests ) < $number;
     2763
     2764        return array(
     2765                'data' => $data_to_export,
     2766                'done' => $done,
     2767        );
     2768}
     2769
     2770/**
     2771 * Finds and exports data on pending group invitations sent by a user associated with an email address.
     2772 *
     2773 * @since 4.0.0
     2774 *
     2775 * @param string $email_address  The user's email address.
     2776 * @param int    $page           Batch number.
     2777 * @return array An array of personal data.
     2778 */
     2779function bp_groups_pending_sent_invitations_personal_data_exporter( $email_address, $page ) {
     2780        $number = 20;
     2781
     2782        $email_address = trim( $email_address );
     2783
     2784        $data_to_export = array();
     2785
     2786        $user = get_user_by( 'email', $email_address );
     2787
     2788        if ( ! $user ) {
     2789                return array(
     2790                        'data' => array(),
     2791                        'done' => true,
     2792                );
     2793        }
     2794
     2795        $invitations = BP_Groups_Member::get_user_memberships( $user->ID, array(
     2796                'type'     => 'pending_sent_invitation',
     2797                'page'     => $page,
     2798                'per_page' => $number,
     2799        ) );
     2800
     2801        foreach ( $invitations as $invitation ) {
     2802                $group = groups_get_group( $invitation->group_id );
     2803
     2804                $item_data = array(
     2805                        array(
     2806                                'name'  => __( 'Group Name', 'buddypress' ),
     2807                                'value' => bp_get_group_name( $group ),
     2808                        ),
     2809                        array(
     2810                                'name'  => __( 'Group URL', 'buddypress' ),
     2811                                'value' => bp_get_group_permalink( $group ),
     2812                        ),
     2813                        array(
     2814                                'name'  => __( 'Sent To', 'buddypress' ),
     2815                                'value' => bp_core_get_userlink( $invitation->user_id ),
     2816                        ),
     2817                        array(
     2818                                'name'  => __( 'Date Sent', 'buddypress' ),
     2819                                'value' => $invitation->date_modified,
     2820                        ),
     2821                );
     2822
     2823                $data_to_export[] = array(
     2824                        'group_id'    => 'bp_groups_pending_sent_invitations',
     2825                        'group_label' => __( 'Pending Group Invitations (Sent)', 'buddypress' ),
     2826                        'item_id'     => "bp-group-pending-sent-invitation-{$group->id}",
     2827                        'data'        => $item_data,
     2828                );
     2829        }
     2830
     2831        // Tell core if we have more items to process.
     2832        $done = count( $invitations ) < $number;
     2833
     2834        return array(
     2835                'data' => $data_to_export,
     2836                'done' => $done,
     2837        );
     2838}
     2839
     2840/**
     2841 * Finds and exports data on pending group invitations received by a user associated with an email address.
     2842 *
     2843 * @since 4.0.0
     2844 *
     2845 * @param string $email_address  The user's email address.
     2846 * @param int    $page           Batch number.
     2847 * @return array An array of personal data.
     2848 */
     2849function bp_groups_pending_received_invitations_personal_data_exporter( $email_address, $page ) {
     2850        $number = 20;
     2851
     2852        $email_address = trim( $email_address );
     2853
     2854        $data_to_export = array();
     2855
     2856        $user = get_user_by( 'email', $email_address );
     2857
     2858        if ( ! $user ) {
     2859                return array(
     2860                        'data' => array(),
     2861                        'done' => true,
     2862                );
     2863        }
     2864
     2865        $invitations = BP_Groups_Member::get_user_memberships( $user->ID, array(
     2866                'type'     => 'pending_received_invitation',
     2867                'page'     => $page,
     2868                'per_page' => $number,
     2869        ) );
     2870
     2871        foreach ( $invitations as $invitation ) {
     2872                $group = groups_get_group( $invitation->group_id );
     2873
     2874                $item_data = array(
     2875                        array(
     2876                                'name'  => __( 'Group Name', 'buddypress' ),
     2877                                'value' => bp_get_group_name( $group ),
     2878                        ),
     2879                        array(
     2880                                'name'  => __( 'Group URL', 'buddypress' ),
     2881                                'value' => bp_get_group_permalink( $group ),
     2882                        ),
     2883                        array(
     2884                                'name'  => __( 'Invited By', 'buddypress' ),
     2885                                'value' => bp_core_get_userlink( $invitation->inviter_id ),
     2886                        ),
     2887                        array(
     2888                                'name'  => __( 'Date Sent', 'buddypress' ),
     2889                                'value' => $invitation->date_modified,
     2890                        ),
     2891                );
     2892
     2893                $data_to_export[] = array(
     2894                        'group_id'    => 'bp_groups_pending_received_invitations',
     2895                        'group_label' => __( 'Pending Group Invitations (Received)', 'buddypress' ),
     2896                        'item_id'     => "bp-group-pending-received-invitation-{$group->id}",
     2897                        'data'        => $item_data,
     2898                );
     2899        }
     2900
     2901        // Tell core if we have more items to process.
     2902        $done = count( $invitations ) < $number;
     2903
     2904        return array(
     2905                'data' => $data_to_export,
     2906                'done' => $done,
     2907        );
     2908}
  • tests/phpunit/testcases/groups/functions.php

    diff --git tests/phpunit/testcases/groups/functions.php tests/phpunit/testcases/groups/functions.php
    index fddbc0bdc..6f48a1649 100644
     
    55 * @group functions
    66 */
    77class BP_Tests_Groups_Functions extends BP_UnitTestCase {
     8        static public $group_ids;
     9        static public $user_ids;
     10
     11        static public function wpSetUpBeforeClass( $factory ) {
     12                self::$group_ids = $factory->group->create_many( 2 );
     13                self::$user_ids  = $factory->user->create_many( 2 );
     14        }
     15
    816        public function test_creating_new_group_as_authenticated_user() {
    917                $u = self::factory()->user->create();
    1018                wp_set_current_user( $u );
    Bar!'; 
    849857                $this->assertNull( groups_get_id_by_previous_slug( 'woohoo' ) );
    850858        }
    851859
     860        /**
     861         * @ticket BP7820
     862         * @ticket BP7698
     863         */
     864        public function test_bp_groups_memberships_personal_data_exporter() {
     865                groups_join_group( self::$group_ids[0], self::$user_ids[0] );
     866
     867                $test_user = new WP_User( self::$user_ids[0] );
     868
     869                $actual = bp_groups_memberships_personal_data_exporter( $test_user->user_email, 1 );
     870
     871                $this->assertTrue( $actual['done'] );
     872                $this->assertCount( 1, $actual['data'] );
     873                $this->assertSame( 'bp-group-membership-' . self::$group_ids[0], $actual['data'][0]['item_id'] );
     874        }
     875
     876        /**
     877         * @ticket BP7820
     878         * @ticket BP7698
     879         */
     880        public function test_bp_groups_pending_requests_personal_data_exporter() {
     881                groups_send_membership_request( self::$user_ids[0], self::$group_ids[0] );
     882
     883                $test_user = new WP_User( self::$user_ids[0] );
     884
     885                $actual = bp_groups_pending_requests_personal_data_exporter( $test_user->user_email, 1 );
     886
     887                $this->assertTrue( $actual['done'] );
     888                $this->assertCount( 1, $actual['data'] );
     889                $this->assertSame( 'bp-group-pending-request-' . self::$group_ids[0], $actual['data'][0]['item_id'] );
     890        }
     891
     892        /**
     893         * @ticket BP7820
     894         * @ticket BP7698
     895         */
     896        public function test_bp_groups_pending_sent_invitations_personal_data_exporter() {
     897                groups_invite_user( array(
     898                        'user_id'    => self::$user_ids[1],
     899                        'group_id'   => self::$group_ids[0],
     900                        'inviter_id' => self::$user_ids[0],
     901                ) );
     902
     903                $test_user = new WP_User( self::$user_ids[0] );
     904
     905                $actual = bp_groups_pending_sent_invitations_personal_data_exporter( $test_user->user_email, 1 );
     906
     907                $this->assertTrue( $actual['done'] );
     908                $this->assertCount( 1, $actual['data'] );
     909                $this->assertSame( 'bp-group-pending-sent-invitation-' . self::$group_ids[0], $actual['data'][0]['item_id'] );
     910        }
     911
     912        /**
     913         * @ticket BP7820
     914         * @ticket BP7698
     915         */
     916        public function test_bp_groups_pending_received_invitations_personal_data_exporter() {
     917                groups_invite_user( array(
     918                        'user_id'    => self::$user_ids[0],
     919                        'group_id'   => self::$group_ids[0],
     920                        'inviter_id' => self::$user_ids[1],
     921                ) );
     922
     923                $test_user = new WP_User( self::$user_ids[0] );
     924
     925                $actual = bp_groups_pending_received_invitations_personal_data_exporter( $test_user->user_email, 1 );
     926
     927                $this->assertTrue( $actual['done'] );
     928                $this->assertCount( 1, $actual['data'] );
     929                $this->assertSame( 'bp-group-pending-received-invitation-' . self::$group_ids[0], $actual['data'][0]['item_id'] );
     930        }
    852931}