Skip to content
This repository

A follow link for Manage Posts, Calendar, and Story Budget #185

Merged
merged 5 commits into from over 1 year ago

3 participants

Daniel Bachhuber Connor Jennings Robert Galindo
Daniel Bachhuber
Collaborator

This adds a "Follow" link to post row actions to Manage Posts, Calendar, and Story budget views. It also removes the unfollowing_users taxonomy, as that hasn't ever been used, and refactors follow_post_users and unfollow_post_users(), as the latter hasn't ever worked.

Lastly, it refactors the row actions for the Story Budget so it's easy to hook on this follow link

danielbachhuber and others added some commits
Daniel Bachhuber danielbachhuber A follow link for Manage Posts, Calendar, and Story Budget
This adds a "Follow" link to post row actions to Manage Posts, Calendar, and Story budget views. It also removes the unfollowing_users taxonomy, as that hasn't ever been used, and refactors follow_post_users and unfollow_post_users(), as the latter hasn't ever worked.

Lastly, it refactors the row actions for the Story Budget so it's easy to hook on this follow link

See #130
fd52687
Robert Galindo rgalindo05 Linked features from dashboard d0dbfb9
Daniel Bachhuber danielbachhuber Proper use of sprintf, and consolidate some code 2258677
Daniel Bachhuber danielbachhuber Props for #185 e760682
Daniel Bachhuber danielbachhuber A different way of binding events, which means the event is dynamical…
…ly bound instead of static.
ef2aa2d
Daniel Bachhuber danielbachhuber merged commit c5c7701 into from
Daniel Bachhuber danielbachhuber deleted the branch
Connor Jennings
Collaborator

I don't know if this is happening with anybody else, but this is causing me a bit of trouble in the Budget and 'Manage Posts' view. I think it may be because '#ef-calendar-view' only exists in the calendar section. Could the selectors be doubled up to form ('.ef_follow_link, #ef-calendar-view') so that there's a fallback option?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Showing 5 unique commits by 2 authors.

Mar 18, 2013
Daniel Bachhuber danielbachhuber A follow link for Manage Posts, Calendar, and Story Budget
This adds a "Follow" link to post row actions to Manage Posts, Calendar, and Story budget views. It also removes the unfollowing_users taxonomy, as that hasn't ever been used, and refactors follow_post_users and unfollow_post_users(), as the latter hasn't ever worked.

Lastly, it refactors the row actions for the Story Budget so it's easy to hook on this follow link

See #130
fd52687
Robert Galindo rgalindo05 Linked features from dashboard d0dbfb9
Daniel Bachhuber danielbachhuber Proper use of sprintf, and consolidate some code 2258677
Daniel Bachhuber danielbachhuber Props for #185 e760682
Mar 19, 2013
Daniel Bachhuber danielbachhuber A different way of binding events, which means the event is dynamical…
…ly bound instead of static.
ef2aa2d
This page is out of date. Refresh to see the latest.
4 modules/calendar/calendar.php
@@ -27,10 +27,10 @@ function __construct() {
27 27 global $edit_flow;
28 28
29 29 $this->module_url = $this->get_module_url( __FILE__ );
30   - // Register the module with Edit Flow
  30 + // Register the module with Edit Flow
31 31 $args = array(
32 32 'title' => __( 'Calendar', 'edit-flow' ),
33   - 'short_description' => __( 'View upcoming content in a customizable calendar.', 'edit-flow' ),
  33 + 'short_description' => sprintf( __( 'View upcoming content in a <a href="%s">customizable calendar</a>.', 'edit-flow' ), admin_url( 'index.php?page=calendar' ) ),
34 34 'extended_description' => __( 'Edit Flow’s calendar lets you see your posts over a customizable date range. Filter by status or click on the post title to see its details. Drag and drop posts between days to change their publication date date.', 'edit-flow' ),
35 35 'module_url' => $this->module_url,
36 36 'img_url' => $this->module_url . 'lib/calendar_s128.png',
285 modules/notifications/notifications.php
@@ -13,8 +13,6 @@ class EF_Notifications extends EF_Module {
13 13
14 14 // Taxonomy name used to store users following posts
15 15 var $following_users_taxonomy = 'following_users';
16   - // Taxonomy name used to store users that have opted out of notifications
17   - var $unfollowing_users_taxonomy = 'unfollowing_users';
18 16 // Taxonomy name used to store user groups following posts
19 17 var $following_usergroups_taxonomy = EF_User_Groups::taxonomy_key;
20 18
@@ -88,8 +86,21 @@ function init() {
88 86 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) );
89 87 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_styles' ) );
90 88
  89 + // Add a "Follow" link to posts
  90 + if ( apply_filters( 'ef_notifications_show_follow_link', true ) ) {
  91 + // A little extra JS for the follow button
  92 + add_action( 'admin_head', array( $this, 'action_admin_head_follow_js' ) );
  93 + // Manage Posts
  94 + add_filter( 'post_row_actions', array( $this, 'filter_post_row_actions' ), 10, 2 );
  95 + add_filter( 'page_row_actions', array( $this, 'filter_post_row_actions' ), 10, 2 );
  96 + // Calendar and Story Budget
  97 + add_filter( 'ef_calendar_item_actions', array( $this, 'filter_post_row_actions' ), 10, 2 );
  98 + add_filter( 'ef_story_budget_item_actions', array( $this, 'filter_post_row_actions' ), 10, 2 );
  99 + }
  100 +
91 101 //Ajax for saving notifiction updates
92 102 add_action( 'wp_ajax_save_notifications', array( $this, 'ajax_save_post_subscriptions' ) );
  103 + add_action( 'wp_ajax_ef_notifications_user_post_subscription', array( $this, 'handle_user_post_subscription' ) );
93 104
94 105 }
95 106
@@ -165,9 +176,7 @@ function register_taxonomies() {
165 176 'public' => false,
166 177 'show_ui' => false
167 178 );
168   - foreach( array( $this->following_users_taxonomy, $this->unfollowing_users_taxonomy ) as $taxonomy ) {
169   - register_taxonomy( $taxonomy, $supported_post_types, $args );
170   - }
  179 + register_taxonomy( $this->following_users_taxonomy, $supported_post_types, $args );
171 180 }
172 181
173 182 /**
@@ -200,6 +209,99 @@ function enqueue_admin_styles() {
200 209 wp_enqueue_style( 'edit-flow-notifications-css', $this->module->module_url . 'lib/notifications.css', false, EDIT_FLOW_VERSION );
201 210 }
202 211 }
  212 +
  213 + /**
  214 + * JS required for the Follow link to work
  215 + *
  216 + * @since 0.8
  217 + */
  218 + public function action_admin_head_follow_js() {
  219 + ?>
  220 +<script type='text/Javascript'>
  221 +jQuery(document).ready(function($) {
  222 + /**
  223 + * Action to Follow / Unfollow posts on the manage posts screen
  224 + */
  225 + $('#ef-calendar-view').on( 'click', '.ef_follow_link a', function(e){
  226 +
  227 + e.preventDefault();
  228 +
  229 + var link = $(this);
  230 +
  231 + $.ajax({
  232 + type : 'GET',
  233 + url : link.attr( 'href' ),
  234 + success : function( data ) {
  235 + if ( 'success' == data.status ) {
  236 + link.attr( 'href', data.message.link );
  237 + link.attr( 'title', data.message.title );
  238 + link.text( data.message.text );
  239 + }
  240 + // @todo expose the error somehow
  241 + }
  242 + });
  243 + return false;
  244 + });
  245 +});
  246 +</script><?php
  247 + }
  248 +
  249 + /**
  250 + * Add a "Follow" link to supported post types Manage Posts view
  251 + *
  252 + * @since 0.8
  253 + *
  254 + * @param array $actions Any existing item actions
  255 + * @param int|object $post Post id or object
  256 + * @return array $actions The follow link has been appended
  257 + */
  258 + public function filter_post_row_actions( $actions, $post ) {
  259 +
  260 + $post = get_post( $post );
  261 +
  262 + if ( ! in_array( $post->post_type, $this->get_post_types_for_module( $this->module ) ) )
  263 + return $actions;
  264 +
  265 + if ( ! current_user_can( $this->edit_post_subscriptions_cap ) || ! current_user_can( 'edit_post', $post->ID ) )
  266 + return $actions;
  267 +
  268 + $parts = $this->get_follow_action_parts( $post );
  269 + $actions['ef_follow_link'] = '<a title="' . esc_attr( $parts['title'] ) . '" href="' . esc_url( $parts['link'] ) . '">' . $parts['text'] . '</a>';
  270 +
  271 + return $actions;
  272 + }
  273 +
  274 + /**
  275 + * Get an action parts for a user to follow or unfollow a post
  276 + *
  277 + * @since 0.8
  278 + */
  279 + private function get_follow_action_parts( $post ) {
  280 +
  281 + $args = array(
  282 + 'action' => 'ef_notifications_user_post_subscription',
  283 + 'post_id' => $post->ID,
  284 + );
  285 + $following_users = $this->get_following_users( $post->ID );
  286 + if ( in_array( wp_get_current_user()->user_login, $following_users ) ) {
  287 + $args['method'] = 'unfollow';
  288 + $title_text = __( 'Click to unfollow updates to this post', 'edit-flow' );
  289 + $follow_text = __( 'Following', 'edit-flow' );
  290 + } else {
  291 + $args['method'] = 'follow';
  292 + $title_text = __( 'Follow updates to this post', 'edit-flow' );
  293 + $follow_text = __( 'Follow', 'edit-flow' );
  294 + }
  295 +
  296 + // wp_nonce_url() has encoding issues: http://core.trac.wordpress.org/ticket/20771
  297 + $args['_wpnonce'] = wp_create_nonce( 'ef_notifications_user_post_subscription' );
  298 +
  299 + return array(
  300 + 'title' => $title_text,
  301 + 'text' => $follow_text,
  302 + 'link' => add_query_arg( $args, admin_url( 'admin-ajax.php' ) ),
  303 + );
  304 + }
203 305
204 306 /**
205 307 * Add the subscriptions meta box to relevant post types
@@ -281,6 +383,36 @@ function ajax_save_post_subscriptions() {
281 383 }
282 384
283 385 /**
  386 + * Handle a request to update a user's post subscription
  387 + *
  388 + * @since 0.8
  389 + */
  390 + public function handle_user_post_subscription() {
  391 +
  392 + if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'ef_notifications_user_post_subscription' ) )
  393 + $this->print_ajax_response( 'error', $this->module->messages['nonce-failed'] );
  394 +
  395 + if ( ! current_user_can( $this->edit_post_subscriptions_cap ) )
  396 + $this->print_ajax_response( 'error', $this->module->messages['invalid-permissions'] );
  397 +
  398 + $post = get_post( (int)$_GET['post_id'] );
  399 +
  400 + if ( ! $post )
  401 + $this->print_ajax_response( 'error', $this->module->messages['missing-post'] );
  402 +
  403 + if ( 'follow' == $_GET['method'] )
  404 + $retval = $this->follow_post_user( $post, get_current_user_id() );
  405 + else
  406 + $retval = $this->unfollow_post_user( $post, get_current_user_id() );
  407 +
  408 + if ( is_wp_error( $retval ) )
  409 + $this->print_ajax_response( 'error', $retval->get_error_message() );
  410 +
  411 + $this->print_ajax_response( 'success', (object)$this->get_follow_action_parts( $post ) );
  412 + }
  413 +
  414 +
  415 + /**
284 416 * Called when post is saved. Handles saving of user/usergroup followers
285 417 *
286 418 * @param int $post ID of the post
@@ -658,93 +790,93 @@ private function _get_notification_recipients( $post, $string = false ) {
658 790 }
659 791
660 792 /**
661   - * Set set user to follow posts
  793 + * Set a user or users to follow a post
662 794 *
663   - * @param $post Post object
664   - * @param $users array (optional) List of users to be added. If not included, the current user is added.
665   - * @param $append bool Whether users should be added to following_users list or replace existing list
  795 + * @param int|object $post Post object or ID
  796 + * @param string|array $users User or users to subscribe to post updates
  797 + * @param bool $append Whether users should be added to following_users list or replace existing list
  798 + *
  799 + * @return true|WP_Error $response True on success, WP_Error on failure
666 800 */
667 801 function follow_post_user( $post, $users, $append = true ) {
668 802
669   - // Clean up data we're using
670   - $post_id = ( is_int($post) ) ? $post : $post->ID;
671   - if( !is_array($users) ) $users = array($users);
  803 + $post = get_post( $post );
  804 + if ( ! $post )
  805 + return new WP_Error( 'missing-post', $this->module->messages['missing-post'] );
  806 +
  807 + if ( ! is_array( $users ) )
  808 + $users = array( $users );
672 809
673 810 $user_terms = array();
674   -
675 811 foreach( $users as $user ) {
676   - if( is_int($user) )
677   - $user_data = get_userdata($user);
678   - else if( is_string($user) )
679   - $user_data = get_userdatabylogin($user);
680   - else
681   - $user_data = $user;
  812 +
  813 + if ( is_int( $user ) )
  814 + $user = get_user_by( 'id', $user );
  815 + elseif ( is_string( $user ) )
  816 + $user = get_user_by( 'login', $user );
  817 +
  818 + if ( ! is_object( $user ) )
  819 + continue;
  820 +
  821 + $name = $user->user_login;
  822 +
  823 + // Add user as a term if they don't exist
  824 + $term = $this->add_term_if_not_exists( $name, $this->following_users_taxonomy );
682 825
683   - if( $user_data ) {
684   - // Name and slug of term are the username;
685   - $name = $user_data->user_login;
686   -
687   - /** TODO: ONLY ADD IF USER IS NOT PART OF $this->exclude_users_taxonomy for the post **/
688   - // if( !user_excluding_post($post_id, $user) )
689   -
690   - // Add user as a term if they don't exist
691   - $term = $this->add_term_if_not_exists($name, $this->following_users_taxonomy);
692   -
693   - if(!is_wp_error($term)) {
694   - $user_terms[] = $name;
695   - }
  826 + if ( ! is_wp_error( $term ) ) {
  827 + $user_terms[] = $name;
696 828 }
697 829 }
698   - $set = wp_set_object_terms( $post_id, $user_terms, $this->following_users_taxonomy, $append );
699   -
700   - return;
  830 + $set = wp_set_object_terms( $post->ID, $user_terms, $this->following_users_taxonomy, $append );
  831 +
  832 + if ( is_wp_error( $set ) )
  833 + return $set;
  834 + else
  835 + return true;
701 836 }
702 837
703 838 /**
704   - * Removes user from following_users taxonomy for the given Post, so they no longer receive future notifications
705   - * Called when delete_user action is fired
  839 + * Removes user from following_users taxonomy for the given Post,
  840 + * so they no longer receive future notifications.
706 841 *
707   - * @param $post Post object
  842 + * @param object $post Post object or ID
  843 + * @param int|string|array $users One or more users to unfollow from the post
  844 + * @return true|WP_Error $response True on success, WP_Error on failure
708 845 */
709   - function unfollow_post_user( $post, $user = 0 ) {
710   - global $current_user;
711   -
712   - // TODO: Finish this
713   -
714   - $post_id = $post->ID;
715   - //if(!$user) $user = wp_get_current_user();
  846 + function unfollow_post_user( $post, $users ) {
716 847
717   - if(!$post_id || !$user || $user->ID == 0)
718   - return;
719   -
720   - // Name and slug of term are the username;
721   - $name = $user->user_login;
722   -
723   - // Remove the user from the following_users taxonomy
724   - if( term_exists($name, $this->following_users_taxonomy) ) {
725   - $set = wp_set_object_terms( $post->ID, $name, $this->following_users_taxonomy, true );
726   - $old_term_ids = wp_get_object_terms($post_id, $this->following_users_taxonomy, array('fields' => 'ids', 'orderby' => 'none'));
727   -
728   -/*
729   - $delete_terms = array_diff($old_tt_ids, $tt_ids);
730   - if ( $delete_terms ) {
731   - $in_delete_terms = "'" . implode("', '", $delete_terms) . "'";
732   - do_action( 'delete_term_relationships', $object_id, $delete_terms );
733   - $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_delete_terms)", $object_id) );
734   - do_action( 'deleted_term_relationships', $object_id, $delete_terms );
735   - wp_update_term_count($delete_terms, $taxonomy);
736   - }
737   -*/
738   - }
739   -
740   - // Add user to the unfollowing_users taxonomy
741   - $insert = $this->add_term_if_not_exists($name, $this->unfollowing_users_taxonomy);
742   -
743   - if(!is_wp_error($insert)) {
744   - $exclude = wp_set_object_terms( $post_id, $name, $this->unfollowing_users_taxonomy, true );
  848 + $post = get_post( $post );
  849 + if ( ! $post )
  850 + return new WP_Error( 'missing-post', $this->module->messages['missing-post'] );
  851 +
  852 + if ( ! is_array( $users ) )
  853 + $users = array( $users );
  854 +
  855 + $terms = get_the_terms( $post->ID, $this->following_users_taxonomy );
  856 + if ( is_wp_error( $terms ) )
  857 + return $terms;
  858 +
  859 + $user_terms = wp_list_pluck( $terms, 'slug' );
  860 + foreach( $users as $user ) {
  861 +
  862 + if ( is_int( $user ) )
  863 + $user = get_user_by( 'id', $user );
  864 + elseif ( is_string( $user ) )
  865 + $user = get_user_by( 'login', $user );
  866 +
  867 + if ( ! is_object( $user ) )
  868 + continue;
  869 +
  870 + $key = array_search( $user->user_login, $user_terms );
  871 + if ( false !== $key )
  872 + unset( $user_terms[$key] );
745 873 }
746   -
747   - return;
  874 + $set = wp_set_object_terms( $post->ID, $user_terms, $this->following_users_taxonomy, false );
  875 +
  876 + if ( is_wp_error( $set ) )
  877 + return $set;
  878 + else
  879 + return true;
748 880 }
749 881
750 882 /**
@@ -786,9 +918,6 @@ function delete_user_action( $id ) {
786 918 // Delete term from the following_users taxonomy
787 919 $user_following_term = get_term_by('name', $user->user_login, $this->following_users_taxonomy);
788 920 if( $user_following_term ) wp_delete_term($user_following_term->term_id, $this->following_users_taxonomy);
789   - // Delete term from the unfollowing_users taxonomy
790   - $user_unfollowing_term = get_term_by('name', $user->user_login, $this->unfollowing_users_taxonomy);
791   - if( $user_unfollowing_term ) wp_delete_term($user_unfollowing_term->term_id, $this->unfollowing_users_taxonomy);
792 921 }
793 922 return;
794 923 }
2  modules/settings/settings.php
@@ -250,7 +250,7 @@ function print_modules() {
250 250 echo '<img src="' . esc_url( $mod_data->img_url ) . '" height="24px" width="24px" class="float-right module-icon" />';
251 251 echo '<form method="get" action="' . get_admin_url( null, 'options.php' ) . '">';
252 252 echo '<h4>' . esc_html( $mod_data->title ) . '</h4>';
253   - echo '<p>' . esc_html( $mod_data->short_description ) . '</p>';
  253 + echo '<p>' . wp_kses($mod_data->short_description, 'a') . '</p>';
254 254 echo '<p class="edit-flow-module-actions">';
255 255 if ( $mod_data->configure_page_cb ) {
256 256 $configure_url = add_query_arg( 'page', $mod_data->settings_slug, get_admin_url( null, 'admin.php' ) );
23 modules/story-budget/story-budget.php
@@ -38,7 +38,7 @@ function __construct() {
38 38 // Register the module with Edit Flow
39 39 $args = array(
40 40 'title' => __( 'Story Budget', 'edit-flow' ),
41   - 'short_description' => __( 'View the status of all your content at a glance.', 'edit-flow' ),
  41 + 'short_description' => sprintf( __( 'View the status of all your content <a href="%s">at a glance</a>.', 'edit-flow' ), admin_url( 'index.php?page=story-budget' ) ),
42 42 'extended_description' => __( 'Use the story budget to see how content on your site is progressing. Filter by specific categories or date ranges to see details about each post in progress.', 'edit-flow' ),
43 43 'module_url' => $this->module_url,
44 44 'img_url' => $this->module_url . 'lib/story_budget_s128.png',
@@ -549,17 +549,28 @@ function term_column_title( $post, $parent_term ) {
549 549
550 550 // Edit or Trash or View
551 551 $output .= '<div class="row-actions">';
  552 + $item_actions = array();
552 553 if ( $can_edit_post )
553   - $output .= '<span class="edit"><a title="' . __( 'Edit this post', 'edit-flow' ) . '" href="' . get_edit_post_link( $post->ID ) . '">' . __( 'Edit' ) . '</a> | </span>';
  554 + $item_actions['edit'] = '<a title="' . __( 'Edit this post', 'edit-flow' ) . '" href="' . get_edit_post_link( $post->ID ) . '">' . __( 'Edit', 'edit-flow' ) . '</a>';
554 555 if ( EMPTY_TRASH_DAYS > 0 && current_user_can( $post_type_object->cap->delete_post, $post->ID ) )
555   - $output .= '<span class="trash"><a class="submitdelete" title="' . __( 'Move this item to the Trash', 'edit-flow' ) . '" href="' . get_delete_post_link( $post->ID ) . '">' . __( 'Trash' ) . '</a></span>';
  556 + $item_actions['trash'] = '<a class="submitdelete" title="' . __( 'Move this item to the Trash', 'edit-flow' ) . '" href="' . get_delete_post_link( $post->ID ) . '">' . __( 'Trash', 'edit-flow' ) . '</a>';
556 557
557 558 // Display a View or a Preview link depending on whether the post has been published or not
558 559 if ( in_array( $post->post_status, array( 'publish' ) ) )
559   - $output .= '<span class="view"> | <a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $post_title ) ) . '" rel="permalink">' . __( 'View' ) . '</a></span>';
  560 + $item_actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;', 'edit-flow' ), $post_title ) ) . '" rel="permalink">' . __( 'View', 'edit-flow' ) . '</a>';
560 561 else if ( $can_edit_post )
561   - $output .= '<span class="previewpost"> | <a href="' . esc_url( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) ) . '" title="' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $post_title ) ) . '" rel="permalink">' . __( 'Preview' ) . '</a></span>';
562   - $output .= '</div>';
  562 + $item_actions['previewpost'] = '<a href="' . esc_url( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) ) . '" title="' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;', 'edit-flow' ), $post_title ) ) . '" rel="permalink">' . __( 'Preview', 'edit-flow' ) . '</a>';
  563 +
  564 + $item_actions = apply_filters( 'ef_story_budget_item_actions', $item_actions, $post->ID );
  565 + if ( count( $item_actions ) ) {
  566 + $output .= '<div class="row-actions">';
  567 + $html = '';
  568 + foreach ( $item_actions as $class => $item_action ) {
  569 + $html .= '<span class="' . esc_attr( $class ) . '">' . $item_action . '</span> | ';
  570 + }
  571 + $output .= rtrim( $html, '| ' );
  572 + $output .= '</div>';
  573 + }
563 574
564 575 return $output;
565 576 }
1  readme.txt
@@ -99,6 +99,7 @@ New features, including story budget and editorial metadata, a completely rewrit
99 99 * Assign a date and time to editorial metadata's date field. Thanks [cojennin](https://github.com/cojennin)
100 100 * Modify which filters are used on the calendar and story budget, or add your own. Thanks [cojennin](https://github.com/cojennin)
101 101 * Scheduled publication time is now included in relevant email notifications. Props [mattoperry](https://github.com/mattoperry)
  102 +* Calendar and story budget module descriptions link to their respective pages in the admin for usability. Props [rgalindo05](https://github.com/rgalindo05)
102 103 * New Russian localization thanks to [te-st.ru](https://github.com/Teplitsa)
103 104
104 105 = 0.7.6 (Jan. 30, 2013) =

Tip: You can add notes to lines in a file. Hover to the left of a line to make a note

Something went wrong with that request. Please try again.