Fix priority sorting to use correct order

Previously priority sorting was alphabetical (high < low < medium < urgent)
instead of by importance. Now uses Django Case/When to map priority strings
to numeric values: urgent=4, high=3, medium=2, low=1.

Fixes both queryset sorting and list sorting for overdue filter.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Keith Smith
2026-01-09 08:23:07 -07:00
co-authored by Claude Sonnet 4.5
parent 5985fd010e
commit c994458e24
+25 -8
View File
@@ -271,20 +271,37 @@ class DashboardView(View):
# Apply sorting before converting to list
if not isinstance(tasks, list):
# Define priority order for sorting
from django.db.models import Case, When, IntegerField, F
priority_order_case = Case(
When(priority='urgent', then=4),
When(priority='high', then=3),
When(priority='medium', then=2),
When(priority='low', then=1),
default=0,
output_field=IntegerField(),
)
if current_sort == 'due_date':
# Sort by due date (nulls last), then priority
from django.db.models import F
tasks = tasks.order_by(F('due_date').asc(nulls_last=True), '-priority')
tasks = tasks.annotate(priority_order=priority_order_case).order_by(
F('due_date').asc(nulls_last=True), '-priority_order'
)
elif current_sort == 'due_date_desc':
# Sort by due date descending (nulls last), then priority
from django.db.models import F
tasks = tasks.order_by(F('due_date').desc(nulls_last=True), '-priority')
tasks = tasks.annotate(priority_order=priority_order_case).order_by(
F('due_date').desc(nulls_last=True), '-priority_order'
)
elif current_sort == 'priority':
# Sort by priority, then due date
tasks = tasks.order_by('-priority', 'due_date')
# Sort by priority (high to low), then due date
tasks = tasks.annotate(priority_order=priority_order_case).order_by(
'-priority_order', 'due_date'
)
elif current_sort == 'priority_low':
# Sort by priority (low to high), then due date
tasks = tasks.order_by('priority', 'due_date')
tasks = tasks.annotate(priority_order=priority_order_case).order_by(
'priority_order', 'due_date'
)
# else: default ordering from model (sort_order, -priority, due_date, created_at)
# Convert to list if not already (for overdue filter)
@@ -293,7 +310,7 @@ class DashboardView(View):
# Apply sorting to lists (for overdue filter case)
else:
priority_order = {'high': 3, 'medium': 2, 'low': 1}
priority_order = {'urgent': 4, 'high': 3, 'medium': 2, 'low': 1}
if current_sort == 'due_date':
tasks = sorted(tasks, key=lambda t: (t.due_date or timezone.now().date() + timezone.timedelta(days=9999), -priority_order.get(t.priority, 0)))
elif current_sort == 'due_date_desc':