diff --git a/admin/templates/users/reindex_user_share.html b/admin/templates/users/reindex_user_share.html new file mode 100644 index 00000000000..9a0f6c93564 --- /dev/null +++ b/admin/templates/users/reindex_user_share.html @@ -0,0 +1,21 @@ +SHARE Reindex User Content + diff --git a/admin/templates/users/user.html b/admin/templates/users/user.html index 921900d01c8..9bd963cb49b 100644 --- a/admin/templates/users/user.html +++ b/admin/templates/users/user.html @@ -37,6 +37,7 @@ {% include "users/disable_user.html" with user=user %} {% include "users/mark_spam.html" with user=user %} {% include "users/reindex_user_elastic.html" with user=user %} + {% include "users/reindex_user_share.html" with user=user %} diff --git a/admin/users/urls.py b/admin/users/urls.py index 309ba6bcd35..3c87ab1e332 100644 --- a/admin/users/urls.py +++ b/admin/users/urls.py @@ -26,6 +26,8 @@ re_path(r'^(?P[a-z0-9]+)/get_reset_password/$', views.GetPasswordResetLink.as_view(), name='get-reset-password'), re_path(r'^(?P[a-z0-9]+)/reindex_elastic_user/$', views.UserReindexElastic.as_view(), name='reindex-elastic-user'), + re_path(r'^(?P[a-z0-9]+)/reindex_share_user/$', views.UserShareReindex.as_view(), + name='reindex-share-user'), re_path(r'^(?P[a-z0-9]+)/merge_accounts/$', views.UserMergeAccounts.as_view(), name='merge-accounts'), re_path(r'^(?P[a-z0-9]+)/draft_registrations/$', views.UserDraftRegistrationsList.as_view(), name='draft-registrations'), ] diff --git a/admin/users/views.py b/admin/users/views.py index bc4e550f88f..b15eace9cf4 100644 --- a/admin/users/views.py +++ b/admin/users/views.py @@ -37,6 +37,7 @@ CONFIRM_HAM, UNFLAG_SPAM, REINDEX_ELASTIC, + REINDEX_SHARE, ) from admin.users.forms import ( @@ -551,6 +552,44 @@ def post(self, request, *args, **kwargs): return redirect(self.get_success_url()) +class UserShareReindex(UserMixin, View): + permission_required = 'osf.change_osfuser' + + def post(self, request, *args, **kwargs): + from api.share.utils import update_share + user = self.get_object() + + nodes_count = user.contributed.count() + preprints_count = user.preprints.filter(deleted=None).count() + + for node in user.contributed: + try: + update_share(node) + except Exception as e: + messages.error(request, f'Failed to SHARE reindex node {node._id}: {e}') + + for preprint in user.preprints.filter(deleted=None): + try: + update_share(preprint) + except Exception as e: + messages.error(request, f'Failed to SHARE reindex preprint {preprint._id}: {e}') + + messages.success( + request, + f'Triggered SHARE reindexing for {nodes_count} nodes and {preprints_count} preprints' + ) + + update_admin_log( + user_id=self.request.user.id, + object_id=user._id, + object_repr='User', + message=f'SHARE reindexed all content for user {user._id}', + action_flag=REINDEX_SHARE + ) + + return redirect(self.get_success_url()) + + class UserDraftRegistrationsList(UserMixin, ListView): template_name = 'users/draft-registrations.html' permission_required = 'osf.view_draftregistration' diff --git a/osf/models/user.py b/osf/models/user.py index 6fcfbb6e159..6b29da822ed 100644 --- a/osf/models/user.py +++ b/osf/models/user.py @@ -869,6 +869,20 @@ def merge_user(self, user): user.save() signals.user_account_merged.send(user) + from api.share.utils import update_share + + for node in user.contributed: + try: + update_share(node) + except Exception as e: + logger.exception(f'Failed to SHARE reindex node {node._id} during user merge: {e}') + + for preprint in user.preprints.all(): + try: + update_share(preprint) + except Exception as e: + logger.exception(f'Failed to SHARE reindex preprint {preprint._id} during user merge: {e}') + def _merge_users_preprints(self, user): """ Preprints use guardian. The PreprintContributor table stores order and bibliographic information.