Skip to:
Content

BuddyPress.org

Ticket #7820: 7820.diff

File 7820.diff, 9.4 KB (added by boonebgorges, 7 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..bf15e9983 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_exporter' );
     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 exporter.
     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_exporter( $exporters ) {
     378        $exporters['buddypress-groups'] = array(
     379                'exporter_friendly_name' => __( 'BuddyPress Group Memberships', 'buddypress' ),
     380                'callback'               => 'bp_groups_personal_data_exporter',
     381        );
     382
     383        return $exporters;
     384}
  • 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..c878fa654 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 personal data associated with an email address from the Groups tables.
     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_personal_data_exporter( $email_address, $page ) {
     2625        $email_address = trim( $email_address );
     2626
     2627        $data_to_export = array();
     2628
     2629        $user = get_user_by( 'email', $email_address );
     2630
     2631        if ( ! $user ) {
     2632                return array(
     2633                        'data' => array(),
     2634                        'done' => true,
     2635                );
     2636        }
     2637
     2638        $user_groups = bp_get_user_groups( $user->id, array(
     2639                'is_confirmed' => null,
     2640                'is_admin'     => null,
     2641                'is_mod'       => null,
     2642        ) );
     2643
     2644        $memberships = $invitations = $requests = $sent_invitations = array();
     2645
     2646        foreach ( $user_groups as $user_group ) {
     2647                $group = groups_get_group( $user_group->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 ( $user_group->inviter_id ) {
     2661                        $item_data[] = array(
     2662                                'name'  => __( 'Invited By', 'buddypress' ),
     2663                                'value' => bp_core_get_userlink( $user_group->inviter_id ),
     2664                        );
     2665                }
     2666
     2667                // Confirmed membership.
     2668                if ( $user_group->is_confirmed ) {
     2669                        if ( $group->creator_id === $user->ID ) {
     2670                                $group_role = __( 'Creator', 'buddypress' );
     2671                        } elseif ( $user_group->is_admin ) {
     2672                                $group_role = __( 'Admin', 'buddypress' );
     2673                        } elseif ( $user_group->is_mod ) {
     2674                                $group_role = __( 'Moderator', 'buddypress' );
     2675                        } else {
     2676                                $group_role = __( 'Member', 'buddypress' );
     2677                        }
     2678
     2679                        $item_data[] = array(
     2680                                'name'  => __( 'Group Role', 'buddypress' ),
     2681                                'value' => $group_role,
     2682                        );
     2683
     2684                        $item_data[] = array(
     2685                                'name'  => __( 'Date Joined', 'buddypress' ),
     2686                                'value' => $user_group->date_modified,
     2687                        );
     2688
     2689                        $memberships[ $user_group->group_id ] = $item_data;
     2690
     2691                // Pending invitation.
     2692                } elseif ( $user_group->inviter_id ) {
     2693                        $item_data[] = array(
     2694                                'name'  => __( 'Date Sent', 'buddypress' ),
     2695                                'value' => $user_group->date_modified,
     2696                        );
     2697
     2698                        $invitations[ $user_group->group_id ] = $item_data;
     2699
     2700                // Pending request.
     2701                } else {
     2702                        $item_data[] = array(
     2703                                'name'  => __( 'Date Sent', 'buddypress' ),
     2704                                'value' => $user_group->date_modified,
     2705                        );
     2706
     2707                        $requests[ $user_group->group_id ] = $item_data;
     2708                }
     2709        }
     2710
     2711        foreach ( $memberships as $group_id => $membership ) {
     2712                $data_to_export[] = array(
     2713                        'group_id'    => 'bp_groups_memberships',
     2714                        'group_label' => __( 'Group Memberships', 'buddypress' ),
     2715                        'item_id'     => "bp-group-membership-{$group_id}",
     2716                        'data'        => $membership,
     2717                );
     2718        }
     2719
     2720        foreach ( $invitations as $group_id => $invitation ) {
     2721                $data_to_export[] = array(
     2722                        'group_id'    => 'bp_groups_invitations',
     2723                        'group_label' => __( 'Pending Group Invitations (Received)', 'buddypress' ),
     2724                        'item_id'     => "bp-group-pending-invitation-{$group_id}",
     2725                        'data'        => $invitation,
     2726                );
     2727        }
     2728
     2729        foreach ( $requests as $group_id => $request ) {
     2730                $data_to_export[] = array(
     2731                        'group_id'    => 'bp_groups_requests',
     2732                        'group_label' => __( 'Pending Group Membership Requests', 'buddypress' ),
     2733                        'item_id'     => "bp-group-request-{$group_id}",
     2734                        'data'        => $request,
     2735                );
     2736        }
     2737
     2738        return array(
     2739                'data' => $data_to_export,
     2740                'done' => true,
     2741        );
     2742}
  • src/bp-groups/classes/class-bp-group-member-query.php

    diff --git src/bp-groups/classes/class-bp-group-member-query.php src/bp-groups/classes/class-bp-group-member-query.php
    index d872810e3..d405420a7 100644
    class BP_Group_Member_Query extends BP_User_Query { 
    136136                /* WHERE clauses *****************************************************/
    137137
    138138                // Group id.
    139                 $group_ids = wp_parse_id_list( $this->query_vars['group_id'] );
    140                 $group_ids = implode( ',', $group_ids );
    141                 $sql['where'][] = "group_id IN ({$group_ids})";
     139                if ( ! is_null( $this->query_vars['group_id'] ) ) {
     140                        $group_ids = wp_parse_id_list( $this->query_vars['group_id'] );
     141                        $group_ids = implode( ',', $group_ids );
     142                        $sql['where'][] = "group_id IN ({$group_ids})";
     143                }
    142144
    143145                // If is_confirmed.
    144                 $is_confirmed = ! empty( $this->query_vars['is_confirmed'] ) ? 1 : 0;
    145                 $sql['where'][] = $wpdb->prepare( "is_confirmed = %d", $is_confirmed );
     146                if ( ! is_null( $this->query_vars['is_confirmed'] ) ) {
     147                        $is_confirmed = ! empty( $this->query_vars['is_confirmed'] ) ? 1 : 0;
     148                        $sql['where'][] = $wpdb->prepare( "is_confirmed = %d", $is_confirmed );
     149                }
    146150
    147151                // If invite_sent.
    148152                if ( ! is_null( $this->query_vars['invite_sent'] ) ) {
  • src/bp-groups/classes/class-bp-groups-member.php

    diff --git src/bp-groups/classes/class-bp-groups-member.php src/bp-groups/classes/class-bp-groups-member.php
    index ba493fc3c..d7b7b28c3 100644
    class BP_Groups_Member { 
    825825                return $count;
    826826        }
    827827
     828        /**
     829         * Gets all invitations sent by a user.
     830         *
     831         * @since 4.0.0
     832         *
     833         * @param int $inviter_id ID of the inviting user.
     834         * @return array
     835         */
     836        public static function get_sent_invites( $inviter_id ) {
     837                global $wpdb;
     838
     839                $bp = buddypress();
     840
     841                $sent_invites = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->groups->table_name_members} WHERE inviter_id = %d", $inviter_id ) );
     842
     843                foreach ( $sent_invites as &$sent_invite ) {
     844                        $sent_invite->id           = (int) $sent_invite->id;
     845                        $sent_invite->group_id     = (int) $sent_invite->group_id;
     846                        $sent_invite->user_id      = (int) $sent_invite->user_id;
     847                        $sent_invite->inviter_id   = (int) $sent_invite->inviter_id;
     848                        $sent_invite->is_admin     = (int) $sent_invite->is_admin;
     849                        $sent_invite->is_mod       = (int) $sent_invite->is_mod;
     850                        $sent_invite->is_banned    = (int) $sent_invite->is_banned;
     851                        $sent_invite->is_confirmed = (int) $sent_invite->is_confirmed;
     852                        $sent_invite->invite_sent  = (int) $sent_invite->invite_sent;
     853                }
     854
     855                return array(
     856                        'invites' => $sent_invites,
     857                        'total'   => count( $sent_invites ),
     858                );
     859        }
     860
    828861        /**
    829862         * Check whether a user has an outstanding invitation to a given group.
    830863         *
  • tests/phpunit/testcases/groups/functions.php

    diff --git tests/phpunit/testcases/groups/functions.php tests/phpunit/testcases/groups/functions.php
    index fddbc0bdc..2736dd323 100644
    Bar!'; 
    849849                $this->assertNull( groups_get_id_by_previous_slug( 'woohoo' ) );
    850850        }
    851851
     852        /**
     853         * @ticket BP7820
     854         * @ticket BP7698
     855         */
     856        public function test_bp_groups_personal_data_exporter() {
     857                $u1 = self::factory()->user->create();
     858                $u2 = self::factory()->user->create();
     859
     860                $groups = self::factory()->group->create_many( 4 );
     861                foreach ( $groups as $group_id ) {
     862                        groups_update_groupmeta( $group_id, 'last_activity', bp_core_current_time() );
     863                        groups_update_groupmeta( $group_id, 'total_member_count', 1 );
     864                }
     865
     866                // Membership.
     867                groups_join_group( $groups[0], $u1 );
     868
     869                // Invitation.
     870                groups_invite_user( array(
     871                        'user_id'    => $u1,
     872                        'group_id'   => $groups[1],
     873                        'inviter_id' => $u2,
     874                ) );
     875
     876                // Request.
     877                groups_send_membership_request( $u1, $groups[2] );
     878
     879                // Sent invitation.
     880                groups_invite_user( array(
     881                        'user_id'    => $u2,
     882                        'group_id'   => $groups[3],
     883                        'inviter_id' => $u1,
     884                ) );
     885                groups_send_invites( $u1, $groups[3] );
     886
     887                $test_user = new WP_User( $u1 );
     888
     889                $actual = bp_groups_personal_data_exporter( $test_user->user_email, 1 );
     890                print_r( $actual ); die;
     891
     892                $this->assertTrue( $actual['done'] );
     893
     894                // Number of exported activity items.
     895                $this->assertSame( 3, count( $actual['data'] ) );
     896        }
    852897}