Adds import admin view

This commit is contained in:
Mouse Reeve 2022-11-01 18:59:04 -07:00
parent 61c2d2a36a
commit 6eab1fdd6d
6 changed files with 123 additions and 0 deletions

View file

@ -48,6 +48,15 @@ class ImportJob(models.Model):
"""items that haven't been processed yet"""
return self.items.filter(fail_reason__isnull=True, book__isnull=True)
@property
def item_count(self):
"""How many books do you want to import???"""
return self.items.count()
def pending_item_count(self):
"""And how many pending items??"""
return self.pending_items.count()
class ImportItem(models.Model):
"""a single line of a csv being imported"""

View file

@ -0,0 +1,71 @@
{% extends 'settings/layout.html' %}
{% load i18n %}
{% load utilities %}
{% block title %}{% trans "Imports" %}{% endblock %}
{% block header %}
{% trans "Imports" %}
{% endblock %}
{% block panel %}
<div class="block">
<div class="tabs">
<ul>
{% url 'settings-imports' as url %}
<li {% if request.path in url %}class="is-active" aria-current="page"{% endif %}>
<a href="{{ url }}">{% trans "Active" %}</a>
</li>
{% url 'settings-imports' status="complete" as url %}
<li {% if url in request.path %}class="is-active" aria-current="page"{% endif %}>
<a href="{{ url }}">{% trans "Completed" %}</a>
</li>
</ul>
</div>
</div>
<div class="table-container block content">
<div class="notification is-warning">
<p>{% trans "Marking an import as complete will <em>not</em> stop it." %}</p>
</div>
<table class="table is-striped is-fullwidth">
<tr>
{% url 'settings-imports' as url %}
<th>
{% trans "ID" %}
</th>
<th>
{% trans "User" %}
</th>
<th>
{% trans "Date Created" %}
</th>
<th>
{% trans "Items" %}
</th>
<th>
{% trans "Pending items" %}
</th>
<th>{% trans "Actions" %}</th>
</tr>
{% for import in imports %}
<tr>
<td>{{ import.id }}</td>
<td class="overflow-wrap-anywhere">
<a href="{% url 'settings-user' user.id %}">{{ import.user|username }}</a>
</td>
<td>{{ import.created_date }}</td>
<td>{{ import.item_count }}</td>
<td>{{ import.pending_item_count }}</td>
<td>
<button class="button is-danger">{% trans "Mark as complete" %}</button>
</td>
</tr>
{% endfor %}
</table>
</div>
{% include 'snippets/pagination.html' with page=users path=request.path %}
{% endblock %}

View file

@ -76,6 +76,12 @@
{% endif %}
{% if perms.edit_instance_settings %}
<h2 class="menu-label">{% trans "System" %}</h2>
<ul class="menu-list">
<li>
{% url 'settings-imports' as url %}
<a href="{{ url }}"{% if url in request.path %} class="is-active" aria-selected="true"{% endif %}>{% trans "Imports" %}</a>
</li>
</ul>
<ul class="menu-list">
<li>
{% url 'settings-celery' as url %}

View file

@ -291,6 +291,9 @@ urlpatterns = [
views.Report.as_view(),
name="report-link",
),
re_path(
r"^settings/imports/(?P<status>(complete|active))?/?$", views.ImportList.as_view(), name="settings-imports"
),
re_path(
r"^settings/celery/?$", views.CeleryStatus.as_view(), name="settings-celery"
),

View file

@ -10,6 +10,7 @@ from .admin.federation import Federation, FederatedServer
from .admin.federation import AddFederatedServer, ImportServerBlocklist
from .admin.federation import block_server, unblock_server, refresh_server
from .admin.email_blocklist import EmailBlocklist
from .admin.imports import ImportList
from .admin.ip_blocklist import IPBlocklist
from .admin.invite import ManageInvites, Invite, InviteRequest
from .admin.invite import ManageInviteRequests, ignore_invite_request

View file

@ -0,0 +1,33 @@
""" manage imports """
from django.contrib.auth.decorators import login_required, permission_required
from django.core.paginator import Paginator
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View
from bookwyrm import models
from bookwyrm.settings import PAGE_LENGTH
# pylint: disable=no-self-use
@method_decorator(login_required, name="dispatch")
@method_decorator(
permission_required("bookwyrm.moderate_user", raise_exception=True),
name="dispatch",
)
class ImportList(View):
"""admin view of imports on this server"""
def get(self, request, status="active"):
"""list of imports"""
complete = status == "complete"
imports = models.ImportJob.objects.filter(complete=complete)
paginated = Paginator(imports, PAGE_LENGTH)
page = paginated.get_page(request.GET.get("page"))
data = {
"imports": page,
"page_range": paginated.get_elided_page_range(
page.number, on_each_side=2, on_ends=1
),
}
return TemplateResponse(request, "settings/imports.html", data)