Adds view to see scheduled tasks

This commit is contained in:
Mouse Reeve 2024-01-02 13:05:44 -08:00
parent 5509941aa4
commit f36af42f41
7 changed files with 158 additions and 7 deletions

View file

@ -251,7 +251,7 @@ def preview_image(instance, *args, **kwargs):
@app.task(queue=MISC) @app.task(queue=MISC)
def check_for_updates_task(): 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() site = SiteSettings.objects.get()
release = get_data(RELEASE_API, timeout=3) release = get_data(RELEASE_API, timeout=3)
available_version = release.get("tag_name", None) available_version = release.get("tag_name", None)

View file

@ -85,6 +85,10 @@
{% url 'settings-celery' as url %} {% url 'settings-celery' as url %}
<a href="{{ url }}"{% if url in request.path %} class="is-active" aria-selected="true"{% endif %}>{% trans "Celery status" %}</a> <a href="{{ url }}"{% if url in request.path %} class="is-active" aria-selected="true"{% endif %}>{% trans "Celery status" %}</a>
</li> </li>
<li>
{% url 'settings-schedules' as url %}
<a href="{{ url }}"{% if url in request.path %} class="is-active" aria-selected="true"{% endif %}>{% trans "Scheduled tasks" %}</a>
</li>
<li> <li>
{% url 'settings-email-config' as url %} {% url 'settings-email-config' as url %}
<a href="{{ url }}"{% if url in request.path %} class="is-active" aria-selected="true"{% endif %}>{% trans "Email Configuration" %}</a> <a href="{{ url }}"{% if url in request.path %} class="is-active" aria-selected="true"{% endif %}>{% trans "Email Configuration" %}</a>

View file

@ -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 %}
<div class="block content">
<h3>{% trans "Tasks" %}</h3>
<div class="table-container">
<table class="table is-striped is-fullwidth">
<tr>
<th>
{% trans "Name" %}
</th>
<th>
{% trans "Celery task" %}
</th>
<th>
{% trans "Date changed" %}
</th>
<th>
{% trans "Last run at" %}
</th>
<th>
{% trans "Schedule" %}
</th>
<th>
{% trans "Schedule ID" %}
</th>
<th>
{% trans "Enabled" %}
</th>
</tr>
{% for task in tasks %}
<tr>
<td>
{{ task.name }}
</td>
<td class="overflow-wrap-anywhere">
{{ task.task }}
</td>
<td>
{{ task.date_changed }}
</td>
<td>
{{ task.last_run_at }}
</td>
<td>
{% firstof task.interval task.crontab "None" %}
</td>
<td>
{{ task.interval.id }}
</td>
<td>
{{ task.enabled|yesno }}
</td>
</tr>
{% empty %}
<tr>
<td colspan="2">
{% trans "No scheduled tasks" %}
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
<div class="block content">
<h3>{% trans "Schedules" %}</h3>
<div class="table-container">
<table class="table is-striped is-fullwidth">
<tr>
<th>
{% trans "ID" %}
</th>
<th>
{% trans "Schedule" %}
</th>
<th>
{% trans "Tasks" %}
</th>
</tr>
{% for schedule in schedules %}
<tr>
<td>
{{ schedule.id }}
</td>
<td class="overflow-wrap-anywhere">
{{ schedule }}
</td>
<td>
{{ schedule.periodictask_set.count }}
</td>
</tr>
{% empty %}
<tr>
<td colspan="2">
{% trans "No schedules found" %}
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
{% endblock %}

View file

@ -359,6 +359,11 @@ urlpatterns = [
re_path( re_path(
r"^settings/celery/ping/?$", views.celery_ping, name="settings-celery-ping" 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( re_path(
r"^settings/email-config/?$", r"^settings/email-config/?$",
views.EmailConfig.as_view(), views.EmailConfig.as_view(),

View file

@ -5,6 +5,7 @@ from .admin.announcements import EditAnnouncement, delete_announcement
from .admin.automod import AutoMod, automod_delete, run_automod from .admin.automod import AutoMod, automod_delete, run_automod
from .admin.automod import schedule_automod_task, unschedule_automod_task from .admin.automod import schedule_automod_task, unschedule_automod_task
from .admin.celery_status import CeleryStatus, celery_ping from .admin.celery_status import CeleryStatus, celery_ping
from .admin.schedule import ScheduledTasks
from .admin.dashboard import Dashboard from .admin.dashboard import Dashboard
from .admin.federation import Federation, FederatedServer from .admin.federation import Federation, FederatedServer
from .admin.federation import AddFederatedServer, ImportServerBlocklist from .admin.federation import AddFederatedServer, ImportServerBlocklist

View file

@ -61,19 +61,21 @@ class Dashboard(View):
== site._meta.get_field("privacy_policy").get_default() == site._meta.get_field("privacy_policy").get_default()
) )
if site.available_version and version.parse(site.available_version) > version.parse( if site.available_version and version.parse(
settings.VERSION site.available_version
): ) > version.parse(settings.VERSION):
data["current_version"] = settings.VERSION data["current_version"] = settings.VERSION
data["available_version"] = site.available_version data["available_version"] = site.available_version
if not PeriodicTask.objects.filter(name="check-for-updates").exists(): 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) return TemplateResponse(request, "settings/dashboard/dashboard.html", data)
def post(self, request): 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) schedule_form = forms.IntervalScheduleForm(request.POST)
with transaction.atomic(): with transaction.atomic():
@ -81,7 +83,7 @@ class Dashboard(View):
PeriodicTask.objects.get_or_create( PeriodicTask.objects.get_or_create(
interval=schedule, interval=schedule,
name="check-for-updates", name="check-for-updates",
task="bookwyrm.models.site.check_for_updates_task" task="bookwyrm.models.site.check_for_updates_task",
) )
return redirect("settings-dashboard") return redirect("settings-dashboard")

View file

@ -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)