diff --git a/admin/base/urls.py b/admin/base/urls.py index d19d2dc638b..9ff5e03a03e 100644 --- a/admin/base/urls.py +++ b/admin/base/urls.py @@ -37,6 +37,7 @@ re_path(r'^cedar_metadata_templates/', include('admin.cedar.urls', namespace='cedar_metadata_templates')), re_path(r'^draft_registrations/', include('admin.draft_registrations.urls', namespace='draft_registrations')), re_path(r'^files/', include('admin.files.urls', namespace='files')), + re_path(r'^share_reindex/', include('admin.share_reindex.urls', namespace='share_reindex')), ]), ), ] diff --git a/admin/share_reindex/__init__.py b/admin/share_reindex/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/admin/share_reindex/urls.py b/admin/share_reindex/urls.py new file mode 100644 index 00000000000..9eeb5d6d290 --- /dev/null +++ b/admin/share_reindex/urls.py @@ -0,0 +1,9 @@ +from django.urls import re_path +from . import views + +app_name = 'admin' + +urlpatterns = [ + re_path(r'^$', views.FailedShareIndexedGuidList.as_view(), name='list'), + re_path(r'^(?P[^/]+)/$', views.FailedShareIndexedGuidReindex.as_view(), name='reindex-share-resource'), +] diff --git a/admin/share_reindex/views.py b/admin/share_reindex/views.py new file mode 100644 index 00000000000..0d68194f7e5 --- /dev/null +++ b/admin/share_reindex/views.py @@ -0,0 +1,52 @@ +from django.contrib.auth.mixins import PermissionRequiredMixin +from django.urls import reverse +from django.shortcuts import redirect +from django.views.generic import ListView, View +from osf.models import Guid +from urllib.parse import urlencode +from api.share.utils import get_not_indexed_guids_for_resource_with_no_indexed_guid, task__reindex_failed_or_not_indexed_resource_into_share + +class FailedShareIndexedGuidList(PermissionRequiredMixin, ListView): + paginate_by = 25 + template_name = 'share_reindex/list.html' + permission_required = 'osf.update_share_reindex' + raise_exception = True + model = Guid + + def get_queryset(self): + resource_type = self.request.GET.get('type', 'projects') + return get_not_indexed_guids_for_resource_with_no_indexed_guid(resource_type) + + def get_context_data(self, **kwargs): + query_set = kwargs.pop('object_list', self.object_list) + page_size = self.get_paginate_by(query_set) + paginator, page, query_set, is_paginated = self.paginate_queryset(query_set, page_size) + kwargs.setdefault('items_to_index', query_set) + kwargs.setdefault('page', page) + resource_type = self.request.GET.get('type', 'projects') + kwargs.setdefault('selected_resource_type', resource_type) + resource_type_detail_mapping = { + 'users': 'users:user', 'preprints': 'preprints:preprint', 'registries': 'nodes:node', 'projects': 'nodes:node', 'files': 'files:file' + } + + kwargs.setdefault('resource_detail', resource_type_detail_mapping.get(resource_type)) + resource_type_guid_reindex = { + 'users': 'users:reindex-share-user', 'preprints': 'preprints:reindex-share-preprint', 'registries': 'nodes:reindex-share-node', 'projects': 'nodes:reindex-share-node' + } + kwargs.setdefault('resource_guid_reindex', resource_type_guid_reindex.get(resource_type)) + status_msg = f'Reindex of {resource_type} started, please check later.' if self.request.GET.get('status') == 'indexing' else '' + kwargs.setdefault('share_reindex_message', status_msg) + return super().get_context_data(**kwargs) + + +class FailedShareIndexedGuidReindex(PermissionRequiredMixin, View): + permission_required = 'osf.update_share_reindex' + raise_exception = True + + def post(self, request, *args, **kwargs): + resource_type = self.kwargs.get('resource_type') + # reindex 100_000 guids in background task for specific resource_type and resource is public + task__reindex_failed_or_not_indexed_resource_into_share.delay(resource_type) + base_url = reverse('share_reindex:list') + query_string = urlencode({'type': resource_type, 'status': 'indexing'}) + return redirect(f"{base_url}?{query_string}") diff --git a/admin/templates/base.html b/admin/templates/base.html index e6f10794c29..f96cc5cdc3a 100644 --- a/admin/templates/base.html +++ b/admin/templates/base.html @@ -316,6 +316,9 @@ {% if perms.osf.change_cedarmetadatatemplate %}
  • Cedar Metadata Templates
  • {% endif %} + {% if perms.osf.update_share_reindex %} +
  • Share Reindex
  • + {% endif %} {% if perms.osf.change_maintenancestate %}
  • Maintenance Alerts
  • {% endif %} diff --git a/admin/templates/share_reindex/list.html b/admin/templates/share_reindex/list.html new file mode 100644 index 00000000000..1e82cb8d5a1 --- /dev/null +++ b/admin/templates/share_reindex/list.html @@ -0,0 +1,133 @@ +{% extends "base.html" %} +{% load render_bundle from webpack_loader %} +{% load comment_extras %} + +{% load static %} +{% block top_includes %} + +{% endblock %} +{% block title %} + Share Reindex +{% endblock title %} +{% block content %} +

    Share Reindex

    + + {% include "util/pagination.html" with items=page extra_query_params="&type="|add:selected_resource_type %} + + +
    +
    +
    + + +
    +
    +
    + + SHARE Reindex All {{selected_resource_type}} + + + +
    +
    + +
    +

    {{share_reindex_message}}

    +
    + + + + + + + {% if selected_resource_type == 'projects' or selected_resource_type == 'preprints' or selected_resource_type == 'registries' %} + + {% elif selected_resource_type == 'users' %} + + {% else %} + + {% endif %} + + + {% if selected_resource_type != 'files' %} + + {% endif %} + + + + {% for item in items_to_index %} + + + {% if selected_resource_type == 'projects' or selected_resource_type == 'preprints' or selected_resource_type == 'registries' %} + + {% elif selected_resource_type == 'users' %} + + {% else %} + + {% endif %} + + + + {% if selected_resource_type != 'files' %} + + + {% endif %} + + + + {% endfor %} + +
    GuidTitleFullnameNameDatetime Last IndexedReindex
    + + {{item.first_guid}} + + {{item.title}}{{item.fullname}}{{item.name}}{{item.date_last_indexed}} + SHARE Reindex +
    + +{% endblock content %} diff --git a/admin/templates/util/pagination.html b/admin/templates/util/pagination.html index 8a3a2d82ce6..59e726f52c9 100644 --- a/admin/templates/util/pagination.html +++ b/admin/templates/util/pagination.html @@ -3,11 +3,11 @@