Allow filtering tasks by source

This commit is contained in:
tcely 2025-02-28 15:15:35 -05:00 committed by GitHub
parent fdbea30f74
commit b31e26b964
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -745,40 +745,61 @@ class TasksView(ListView):
context_object_name = 'tasks' context_object_name = 'tasks'
paginate_by = settings.TASKS_PER_PAGE paginate_by = settings.TASKS_PER_PAGE
messages = { messages = {
'filter': _('Viewing tasks filtered for source: <strong>{name}</strong>'),
'reset': _('All tasks have been reset'), 'reset': _('All tasks have been reset'),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.filter_source = None
self.message = None self.message = None
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
message_key = request.GET.get('message', '') message_key = request.GET.get('message', '')
self.message = self.messages.get(message_key, '') self.message = self.messages.get(message_key, '')
filter_by = request.GET.get('filter', '')
if filter_by:
try:
self.filter_source = Source.objects.get(pk=filter_by)
except Source.DoesNotExist:
self.filter_source = None
if not message_key or 'filter' == message_key:
message = self.messages.get('filter', '')
self.message = message.format(
name=self.filter_source.name
)
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def get_queryset(self): def get_queryset(self):
qs = Task.objects.all()
if self.filter_source:
qs = qs.filter(queue=str(self.filter_source.pk))
order = getattr(settings, order = getattr(settings,
'BACKGROUND_TASK_PRIORITY_ORDERING', 'BACKGROUND_TASK_PRIORITY_ORDERING',
'DESC' 'DESC'
) )
prefix = '-' if 'ASC' != order else '' prefix = '-' if 'ASC' != order else ''
_priority = f'{prefix}priority' _priority = f'{prefix}priority'
return Task.objects.all().order_by( return qs.order_by(
_priority, _priority,
'run_at' 'run_at'
) )
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
data = super().get_context_data(*args, **kwargs) data = super().get_context_data(*args, **kwargs)
now = timezone.now()
qs = Task.objects.all()
# Add to context data from ListView
data['message'] = self.message data['message'] = self.message
queryset = self.get_queryset() data['source'] = self.filter_source
data['running'] = [] data['running'] = []
data['errors'] = [] data['errors'] = []
data['scheduled'] = [] data['scheduled'] = []
data['total_scheduled'] = queryset.filter(locked_at__isnull=True).count() data['total_scheduled'] = qs.filter(locked_at__isnull=True).count()
now = timezone.now()
for task in queryset.filter(locked_at__isnull=False): for task in qs.filter(locked_at__isnull=False):
# There was broken logic in `Task.objects.locked()`, work around it. # There was broken logic in `Task.objects.locked()`, work around it.
# With that broken logic, the tasks never resume properly. # With that broken logic, the tasks never resume properly.
# This check unlocks the tasks without a running process. # This check unlocks the tasks without a running process.
@ -806,6 +827,7 @@ class TasksView(ListView):
data['errors'].append(task) data['errors'].append(task)
else: else:
data['scheduled'].append(task) data['scheduled'].append(task)
for task in data['tasks']: for task in data['tasks']:
obj, url = map_task_to_instance(task) obj, url = map_task_to_instance(task)
if not obj: if not obj:
@ -821,6 +843,7 @@ class TasksView(ListView):
setattr(task, 'url', url) setattr(task, 'url', url)
setattr(task, 'run_now', task.run_at < now) setattr(task, 'run_now', task.run_at < now)
data['scheduled'].append(task) data['scheduled'].append(task)
return data return data
@ -850,10 +873,10 @@ class CompletedTasksView(ListView):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def get_queryset(self): def get_queryset(self):
q = CompletedTask.objects.all() qs = CompletedTask.objects.all()
if self.filter_source: if self.filter_source:
q = q.filter(queue=str(self.filter_source.pk)) qs = qs.filter(queue=str(self.filter_source.pk))
return q.order_by('-run_at') return qs.order_by('-run_at')
def get_context_data(self, *args, **kwargs): def get_context_data(self, *args, **kwargs):
data = super().get_context_data(*args, **kwargs) data = super().get_context_data(*args, **kwargs)
@ -862,11 +885,10 @@ class CompletedTasksView(ListView):
error_message = get_error_message(task) error_message = get_error_message(task)
setattr(task, 'error_message', error_message) setattr(task, 'error_message', error_message)
data['message'] = '' data['message'] = ''
data['source'] = None data['source'] = self.filter_source
if self.filter_source: if self.filter_source:
message = str(self.messages.get('filter', '')) message = str(self.messages.get('filter', ''))
data['message'] = message.format(name=self.filter_source.name) data['message'] = message.format(name=self.filter_source.name)
data['source'] = self.filter_source
return data return data