diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py
index f82a4d94b..ad0dbff64 100644
--- a/bookwyrm/models/site.py
+++ b/bookwyrm/models/site.py
@@ -251,7 +251,7 @@ def preview_image(instance, *args, **kwargs):
@app.task(queue=MISC)
def check_for_updates_task():
- """ See if git remote knows about a new version """
+ """See if git remote knows about a new version"""
site = SiteSettings.objects.get()
release = get_data(RELEASE_API, timeout=3)
available_version = release.get("tag_name", None)
diff --git a/bookwyrm/templates/settings/layout.html b/bookwyrm/templates/settings/layout.html
index dcaaaeb38..70c7ef0f4 100644
--- a/bookwyrm/templates/settings/layout.html
+++ b/bookwyrm/templates/settings/layout.html
@@ -85,6 +85,10 @@
{% url 'settings-celery' as url %}
{% trans "Celery status" %}
+
+ {% url 'settings-schedules' as url %}
+ {% trans "Scheduled tasks" %}
+
{% url 'settings-email-config' as url %}
{% trans "Email Configuration" %}
diff --git a/bookwyrm/templates/settings/schedules.html b/bookwyrm/templates/settings/schedules.html
new file mode 100644
index 000000000..fe096092d
--- /dev/null
+++ b/bookwyrm/templates/settings/schedules.html
@@ -0,0 +1,116 @@
+{% extends 'settings/layout.html' %}
+{% load i18n %}
+{% load humanize %}
+{% load utilities %}
+
+{% block title %}
+{% trans "Scheduled tasks" %}
+{% endblock %}
+
+{% block header %}
+{% trans "Scheduled tasks" %}
+{% endblock %}
+
+{% block panel %}
+
+
+
{% trans "Tasks" %}
+
+
+
+
+ {% trans "Name" %}
+ |
+
+ {% trans "Celery task" %}
+ |
+
+ {% trans "Date changed" %}
+ |
+
+ {% trans "Last run at" %}
+ |
+
+ {% trans "Schedule" %}
+ |
+
+ {% trans "Schedule ID" %}
+ |
+
+ {% trans "Enabled" %}
+ |
+
+ {% for task in tasks %}
+
+
+ {{ task.name }}
+ |
+
+ {{ task.task }}
+ |
+
+ {{ task.date_changed }}
+ |
+
+ {{ task.last_run_at }}
+ |
+
+ {% firstof task.interval task.crontab "None" %}
+ |
+
+ {{ task.interval.id }}
+ |
+
+ {{ task.enabled|yesno }}
+ |
+
+ {% empty %}
+
+
+ {% trans "No scheduled tasks" %}
+ |
+
+ {% endfor %}
+
+
+
+
+
+
{% trans "Schedules" %}
+
+
+
+
+ {% trans "ID" %}
+ |
+
+ {% trans "Schedule" %}
+ |
+
+ {% trans "Tasks" %}
+ |
+
+ {% for schedule in schedules %}
+
+
+ {{ schedule.id }}
+ |
+
+ {{ schedule }}
+ |
+
+ {{ schedule.periodictask_set.count }}
+ |
+
+ {% empty %}
+
+
+ {% trans "No schedules found" %}
+ |
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py
index 76e60245b..64742347a 100644
--- a/bookwyrm/urls.py
+++ b/bookwyrm/urls.py
@@ -359,6 +359,11 @@ urlpatterns = [
re_path(
r"^settings/celery/ping/?$", views.celery_ping, name="settings-celery-ping"
),
+ re_path(
+ r"^settings/schedules/?$",
+ views.ScheduledTasks.as_view(),
+ name="settings-schedules",
+ ),
re_path(
r"^settings/email-config/?$",
views.EmailConfig.as_view(),
diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py
index 3be813208..d77f2675f 100644
--- a/bookwyrm/views/__init__.py
+++ b/bookwyrm/views/__init__.py
@@ -5,6 +5,7 @@ from .admin.announcements import EditAnnouncement, delete_announcement
from .admin.automod import AutoMod, automod_delete, run_automod
from .admin.automod import schedule_automod_task, unschedule_automod_task
from .admin.celery_status import CeleryStatus, celery_ping
+from .admin.schedule import ScheduledTasks
from .admin.dashboard import Dashboard
from .admin.federation import Federation, FederatedServer
from .admin.federation import AddFederatedServer, ImportServerBlocklist
diff --git a/bookwyrm/views/admin/dashboard.py b/bookwyrm/views/admin/dashboard.py
index ea0675f59..4b2575fa6 100644
--- a/bookwyrm/views/admin/dashboard.py
+++ b/bookwyrm/views/admin/dashboard.py
@@ -61,19 +61,21 @@ class Dashboard(View):
== site._meta.get_field("privacy_policy").get_default()
)
- if site.available_version and version.parse(site.available_version) > version.parse(
- settings.VERSION
- ):
+ if site.available_version and version.parse(
+ site.available_version
+ ) > version.parse(settings.VERSION):
data["current_version"] = settings.VERSION
data["available_version"] = site.available_version
if not PeriodicTask.objects.filter(name="check-for-updates").exists():
- data["schedule_form"] = forms.IntervalScheduleForm({"every": 1, "period": "days"})
+ data["schedule_form"] = forms.IntervalScheduleForm(
+ {"every": 1, "period": "days"}
+ )
return TemplateResponse(request, "settings/dashboard/dashboard.html", data)
def post(self, request):
- """ Create a schedule task to check for updates """
+ """Create a schedule task to check for updates"""
schedule_form = forms.IntervalScheduleForm(request.POST)
with transaction.atomic():
@@ -81,7 +83,7 @@ class Dashboard(View):
PeriodicTask.objects.get_or_create(
interval=schedule,
name="check-for-updates",
- task="bookwyrm.models.site.check_for_updates_task"
+ task="bookwyrm.models.site.check_for_updates_task",
)
return redirect("settings-dashboard")
diff --git a/bookwyrm/views/admin/schedule.py b/bookwyrm/views/admin/schedule.py
new file mode 100644
index 000000000..ce5944ee5
--- /dev/null
+++ b/bookwyrm/views/admin/schedule.py
@@ -0,0 +1,23 @@
+""" Scheduled celery tasks """
+from django.contrib.auth.decorators import login_required, permission_required
+from django.template.response import TemplateResponse
+from django.utils.decorators import method_decorator
+from django.views import View
+from django_celery_beat.models import PeriodicTask, IntervalSchedule
+
+
+@method_decorator(login_required, name="dispatch")
+@method_decorator(
+ permission_required("bookwyrm.edit_instance_settings", raise_exception=True),
+ name="dispatch",
+)
+# pylint: disable=no-self-use
+class ScheduledTasks(View):
+ """Manage automated flagging"""
+
+ def get(self, request):
+ """view schedules"""
+ data = {}
+ data["tasks"] = PeriodicTask.objects.all()
+ data["schedules"] = IntervalSchedule.objects.all()
+ return TemplateResponse(request, "settings/schedules.html", data)