diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index fbec88cae..387261f09 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -35,9 +35,9 @@ class ImportJob(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) created_date = models.DateTimeField(default=timezone.now) + updated_date = models.DateTimeField(default=timezone.now) include_reviews = models.BooleanField(default=True) mappings = models.JSONField() - updated_date = models.DateTimeField(default=timezone.now) complete = models.BooleanField(default=False) source = models.CharField(max_length=100) privacy = models.CharField( diff --git a/bookwyrm/templates/import/import_status.html b/bookwyrm/templates/import/import_status.html index 61b7b5cf5..6c7d54b93 100644 --- a/bookwyrm/templates/import/import_status.html +++ b/bookwyrm/templates/import/import_status.html @@ -41,7 +41,7 @@ - {% if not complete %} + {% if not job.complete %}
@@ -167,8 +167,17 @@ {% endif %} {% else %} - - {% trans "Pending" %} +
+ + {% trans "Pending" %} + {# retry option if an item appears to be hanging #} + {% if job.created_date != job.updated_date and inactive_time > 0.24 %} +
+ {% csrf_token %} + +
+ {% endif %} +
{% endif %} {% endblock %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index d6a79c202..6f6580167 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -242,6 +242,11 @@ urlpatterns = [ views.ImportStatus.as_view(), name="import-status", ), + re_path( + r"^import/(?P\d+)/retry/(?P\d+)/?$", + views.ImportStatus.as_view(), + name="import-item-retry", + ), re_path( r"^import/(?P\d+)/failed/?$", views.ImportTroubleshoot.as_view(), diff --git a/bookwyrm/views/imports/import_status.py b/bookwyrm/views/imports/import_status.py index 7e7d51792..541740821 100644 --- a/bookwyrm/views/imports/import_status.py +++ b/bookwyrm/views/imports/import_status.py @@ -4,12 +4,14 @@ import math from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator -from django.shortcuts import get_object_or_404 +from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse +from django.utils import timezone from django.utils.decorators import method_decorator from django.views import View from bookwyrm import models +from bookwyrm.importers.importer import import_item_task from bookwyrm.settings import PAGE_LENGTH # pylint: disable= no-self-use @@ -40,10 +42,19 @@ class ImportStatus(View): "page_range": paginated.get_elided_page_range( page.number, on_each_side=2, on_ends=1 ), - "complete": not job.pending_items.exists(), "percent": math.floor( # pylint: disable=c-extension-no-member (item_count - job.pending_items.count()) / item_count * 100 ), + # hours since last import item update + "inactive_time": (job.updated_date - timezone.now()).seconds / 60 / 60, } return TemplateResponse(request, "import/import_status.html", data) + + def post(self, request, job_id, item_id): + """retry an item""" + item = get_object_or_404( + models.ImportItem, id=item_id, job__id=job_id, job__user=request.user + ) + import_item_task.delay(item.id) + return redirect("import-status", job_id)