mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-11-26 03:21:05 +00:00
Adds view to see scheduled tasks
This commit is contained in:
parent
5509941aa4
commit
f36af42f41
7 changed files with 158 additions and 7 deletions
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
116
bookwyrm/templates/settings/schedules.html
Normal file
116
bookwyrm/templates/settings/schedules.html
Normal 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 %}
|
|
@ -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(),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
23
bookwyrm/views/admin/schedule.py
Normal file
23
bookwyrm/views/admin/schedule.py
Normal 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)
|
Loading…
Reference in a new issue