Making WordPress.org


Ignore:
Timestamp:
05/09/2024 08:33:51 AM (19 months ago)
Author:
amieiro
Message:

Translate: Sync "Translation Events" from GitHub

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/wporg-gp-translation-events.php

    r13541 r13683  
    2323use Exception;
    2424use GP;
     25use GP_Locales;
    2526use WP_Post;
    2627use WP_Query;
    2728use Wporg\TranslationEvents\Attendee\Attendee;
    2829use Wporg\TranslationEvents\Attendee\Attendee_Repository;
     30use Wporg\TranslationEvents\Event\Event_Capabilities;
    2931use Wporg\TranslationEvents\Event\Event_Form_Handler;
    3032use Wporg\TranslationEvents\Event\Event_Repository_Cached;
    3133use Wporg\TranslationEvents\Event\Event_Repository_Interface;
     34use Wporg\TranslationEvents\Notifications\Notifications_Send;
     35use Wporg\TranslationEvents\Stats\Stats_Calculator;
    3236use Wporg\TranslationEvents\Stats\Stats_Listener;
    3337
    3438class Translation_Events {
    3539    public const CPT = 'translation_event';
     40
     41    private Event_Capabilities $event_capabilities;
    3642
    3743    public static function get_instance(): Translation_Events {
     
    6571        add_action( 'wp_enqueue_scripts', array( $this, 'register_translation_event_js' ) );
    6672        add_action( 'init', array( $this, 'register_event_post_type' ) );
     73        add_action( 'init', array( $this, 'send_notifications' ) );
    6774        add_action( 'add_meta_boxes', array( $this, 'event_meta_boxes' ) );
    6875        add_action( 'save_post', array( $this, 'save_event_meta_boxes' ) );
     
    7279        add_action( 'gp_init', array( $this, 'gp_init' ) );
    7380        add_action( 'gp_before_translation_table', array( $this, 'add_active_events_current_user' ) );
     81        add_filter( 'wp_post_revision_meta_keys', array( $this, 'wp_post_revision_meta_keys' ) );
     82        add_filter( 'pre_wp_unique_post_slug', array( $this, 'pre_wp_unique_post_slug' ), 10, 6 );
    7483
    7584        if ( is_admin() ) {
    7685            Upgrade::upgrade_if_needed();
    7786        }
     87
     88        $this->event_capabilities = new Event_Capabilities(
     89            self::get_event_repository(),
     90            self::get_attendee_repository(),
     91            new Stats_Calculator()
     92        );
     93        $this->event_capabilities->register_hooks();
    7894    }
    7995
    8096    public function gp_init() {
     97        $locale = '(' . implode( '|', wp_list_pluck( GP_Locales::locales(), 'slug' ) ) . ')';
     98        $slug   = '((?:2[0-9]{3}/)?[a-z0-9_-]+)';
     99        $status = '(waiting)';
     100        $id     = '(\d+)';
     101
    81102        GP::$router->add( '/events?', array( 'Wporg\TranslationEvents\Routes\Event\List_Route', 'handle' ) );
     103        GP::$router->add( '/events/trashed?', array( 'Wporg\TranslationEvents\Routes\Event\List_Trashed_Route', 'handle' ) );
    82104        GP::$router->add( '/events/new', array( 'Wporg\TranslationEvents\Routes\Event\Create_Route', 'handle' ) );
    83         GP::$router->add( '/events/edit/(\d+)', array( 'Wporg\TranslationEvents\Routes\Event\Edit_Route', 'handle' ) );
    84         GP::$router->add( '/events/attend/(\d+)', array( 'Wporg\TranslationEvents\Routes\User\Attend_Event_Route', 'handle' ), 'post' );
    85         GP::$router->add( '/events/host/(\d+)/(\d+)', array( 'Wporg\TranslationEvents\Routes\User\Host_Event_Route', 'handle' ), 'post' );
     105        GP::$router->add( "/events/edit/$id", array( 'Wporg\TranslationEvents\Routes\Event\Edit_Route', 'handle' ) );
     106        GP::$router->add( "/events/trash/$id", array( 'Wporg\TranslationEvents\Routes\Event\Trash_Route', 'handle' ) );
     107        GP::$router->add( "/events/delete/$id", array( 'Wporg\TranslationEvents\Routes\Event\Delete_Route', 'handle' ) );
     108        GP::$router->add( "/events/attend/$id", array( 'Wporg\TranslationEvents\Routes\User\Attend_Event_Route', 'handle' ), 'post' );
     109        GP::$router->add( "/events/host/$id/$id", array( 'Wporg\TranslationEvents\Routes\User\Host_Event_Route', 'handle' ), 'post' );
    86110        GP::$router->add( '/events/my-events', array( 'Wporg\TranslationEvents\Routes\User\My_Events_Route', 'handle' ) );
    87         GP::$router->add( '/events/([a-z0-9_-]+)', array( 'Wporg\TranslationEvents\Routes\Event\Details_Route', 'handle' ) );
     111        GP::$router->add( "/events/$slug/translations/$locale/$status", array( 'Wporg\TranslationEvents\Routes\Event\Translations_Route', 'handle' ) );
     112        GP::$router->add( "/events/$slug/translations/$locale", array( 'Wporg\TranslationEvents\Routes\Event\Translations_Route', 'handle' ) );
     113        GP::$router->add( "/events/$slug", array( 'Wporg\TranslationEvents\Routes\Event\Details_Route', 'handle' ) );
     114        GP::$router->add( "/events/$slug/attendees", array( 'Wporg\TranslationEvents\Routes\Attendee\List_Route', 'handle' ) );
    88115
    89116        $stats_listener = new Stats_Listener(
     
    113140
    114141        $args = array(
    115             'labels'      => $labels,
    116             'public'      => true,
    117             'has_archive' => true,
    118             'menu_icon'   => 'dashicons-calendar',
    119             'supports'    => array( 'title', 'editor', 'thumbnail', 'revisions' ),
    120             'rewrite'     => array( 'slug' => 'events' ),
    121             'show_ui'     => false,
     142            'labels'       => $labels,
     143            'public'       => true,
     144            'has_archive'  => true,
     145            'hierarchical' => true,
     146            'menu_icon'    => 'dashicons-calendar',
     147            'supports'     => array( 'title', 'editor', 'thumbnail', 'revisions' ),
     148            'rewrite'      => array( 'slug' => 'events' ),
     149            'show_ui'      => false,
    122150        );
    123151
     
    163191            }
    164192        }
    165 
    166193        $fields = array( 'event_start', 'event_end' );
    167194        foreach ( $fields as $field ) {
     
    219246
    220247            if ( null === $attendee ) {
    221                 $attendee = new Attendee( $event_id, $user_id );
    222                 $attendee->mark_as_host();
     248                $attendee = new Attendee( $event_id, $user_id, true );
    223249                $attendee_repository->insert_attendee( $attendee );
    224250            }
     
    237263            return $items;
    238264        }
    239         $new[ esc_url( gp_url( '/events/' ) ) ] = esc_html__( 'Events', 'gp-translation-events' );
     265        $new[ esc_url( Urls::events_home() ) ] = esc_html__( 'Events', 'gp-translation-events' );
    240266        return array_merge( $items, $new );
    241267    }
     
    254280    public function generate_event_slug( array $data, array $postarr ): array {
    255281        if ( self::CPT === $data['post_type'] ) {
     282            if ( isset( $data['post_name'] ) && preg_match( '/^2[0-9]+$/', $data['post_name'] ) ) {
     283                return $data;
     284            }
    256285            if ( 'draft' === $data['post_status'] ) {
    257286                $data['post_name'] = sanitize_title( $data['post_title'] );
     
    278307     */
    279308    public function add_active_events_current_user(): void {
    280         $attendee_repository      = new Attendee_Repository();
    281         $user_attending_event_ids = $attendee_repository->get_events_for_user( get_current_user_id() );
    282         if ( empty( $user_attending_event_ids ) ) {
    283             return;
    284         }
    285 
    286         $current_datetime_utc       = ( new DateTime( 'now', new DateTimeZone( 'UTC' ) ) )->format( 'Y-m-d H:i:s' );
    287         $user_attending_events_args = array(
    288             'post_type'   => self::CPT,
    289             'post__in'    => $user_attending_event_ids,
    290             'post_status' => 'publish',
    291             // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
    292             'meta_query'  => array(
    293                 array(
    294                     'key'     => '_event_start',
    295                     'value'   => $current_datetime_utc,
    296                     'compare' => '<=',
    297                     'type'    => 'DATETIME',
    298                 ),
    299                 array(
    300                     'key'     => '_event_end',
    301                     'value'   => $current_datetime_utc,
    302                     'compare' => '>=',
    303                     'type'    => 'DATETIME',
    304                 ),
    305             ),
    306             // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
    307             'meta_key'    => '_event_start',
    308             'orderby'     => 'meta_value',
    309             'order'       => 'ASC',
    310         );
    311 
    312         $user_attending_events_query = new WP_Query( $user_attending_events_args );
    313         $number_of_events            = $user_attending_events_query->post_count;
     309        $event_repository            = self::get_event_repository();
     310        $user_attending_events_query = $event_repository->get_current_events_for_user( get_current_user_id() );
     311        $events                      = $user_attending_events_query->events;
     312
     313        $number_of_events = count( $events );
    314314        if ( 0 === $number_of_events ) {
    315315            return;
     
    320320        $content .= sprintf( _n( 'Contributing to %d event:', 'Contributing to %d events:', $number_of_events, 'gp-translation-events' ), $number_of_events );
    321321        $content .= '&nbsp;&nbsp;';
     322
     323        foreach ( array_splice( $events, 0, 2 ) as $event ) {
     324            $content .= '<span class="active-events-before-translation-table"><a href="' . Urls::event_details( $event->id() ) . '" target="_blank">' . esc_html( $event->title() ) . '</a></span>';
     325        }
     326
    322327        if ( $number_of_events > 3 ) {
    323             $counter = 0;
    324             while ( $user_attending_events_query->have_posts() && $counter < 2 ) {
    325                 $user_attending_events_query->the_post();
    326                 $url      = esc_url( gp_url( '/events/' . get_post_field( 'post_name', get_post() ) ) );
    327                 $content .= '<span class="active-events-before-translation-table"><a href="' . $url . '" target="_blank">' . get_the_title() . '</a></span>';
    328                 ++$counter;
    329             }
    330 
    331328            $remaining_events = $number_of_events - 2;
    332             $url              = esc_url( gp_url( '/events/' ) );
    333329            /* translators: %d: Number of remaining events */
    334             $content .= '<span class="remaining-events"><a href="' . $url . '" target="_blank">' . sprintf( esc_html__( ' and %d more events.', 'gp-translation-events' ), $remaining_events ) . '</a></span>';
    335 
    336         } else {
    337             while ( $user_attending_events_query->have_posts() ) {
    338                 $user_attending_events_query->the_post();
    339                 $url      = esc_url( gp_url( '/events/' . get_post_field( 'post_name', get_post() ) ) );
    340                 $content .= '<span class="active-events-before-translation-table"><a href="' . $url . '" target="_blank">' . get_the_title() . '</a></span>';
    341             }
    342         }
     330            $content .= '<span class="remaining-events"><a href="' . esc_url( Urls::events_home() ) . '" target="_blank">' . sprintf( esc_html__( ' and %d more events.', 'gp-translation-events' ), $remaining_events ) . '</a></span>';
     331        }
     332
    343333        $content .= '</div>';
    344334
     
    360350        );
    361351    }
     352
     353    /**
     354     * Send notifications for the events.
     355     */
     356    public function send_notifications() {
     357        new Notifications_Send( self::get_event_repository(), self::get_attendee_repository() );
     358    }
     359
     360    /**
     361     * Add the event meta keys to the list of meta keys to keep in post revisions.
     362     *
     363     * @param array $keys The list of meta keys to keep in post revisions.
     364     *
     365     * @return array The modified list of meta keys to keep in post revisions.
     366     */
     367    public function wp_post_revision_meta_keys( array $keys ): array {
     368        $meta_keys_to_keep = array( '_event_start', '_event_end', '_event_timezone', '_hosts' );
     369        return array_merge( $keys, $meta_keys_to_keep );
     370    }
     371
     372    public function pre_wp_unique_post_slug( $override_slug, string $slug, int $post_id, string $post_status, string $post_type, int $post_parent ) {
     373        if ( self::CPT !== $post_type || $post_parent ) {
     374            return $override_slug;
     375        }
     376        // Normally the slug is not allowed to be a year, this overrides it since we have a CPT and translate.wordpress.org doesn't have blog posts.
     377        if ( preg_match( '/^2[0-9]{3}$/', $slug ) ) {
     378            return $slug;
     379        }
     380        return $override_slug;
     381    }
    362382}
    363383Translation_Events::get_instance();
Note: See TracChangeset for help on using the changeset viewer.