|
8 | 8 | F,
|
9 | 9 | FilteredRelation,
|
10 | 10 | Q,
|
| 11 | + OrderBy, |
11 | 12 | QuerySet,
|
12 | 13 | Value,
|
13 | 14 | )
|
@@ -406,22 +407,29 @@ def build_sort_filter(qs: QuerySet, sort: SortOptions) -> QuerySet:
|
406 | 407 | match sort:
|
407 | 408 | case SortOptions.FEATURED:
|
408 | 409 | qs = qs.annotate(is_root_workflow=Q(published_run_id=""))
|
409 |
| - return qs.order_by( |
| 410 | + fields = ( |
410 | 411 | "-is_approved_example",
|
411 | 412 | "-example_priority",
|
412 | 413 | "-is_root_workflow",
|
413 | 414 | F("is_created_by").desc(nulls_last=True),
|
414 | 415 | "-updated_at",
|
415 | 416 | )
|
416 | 417 | case SortOptions.UPDATED_AT:
|
417 |
| - return qs.order_by("-updated_at") |
| 418 | + fields = ("-updated_at",) |
418 | 419 | case SortOptions.CREATED_AT:
|
419 |
| - return qs.order_by("-created_at") |
| 420 | + fields = ("-created_at",) |
420 | 421 | case SortOptions.MOST_RUNS:
|
421 |
| - return qs.order_by( |
422 |
| - "-run_count", F("is_created_by").desc(nulls_last=True), "-updated_at" |
| 422 | + fields = ( |
| 423 | + "-run_count", |
| 424 | + F("is_created_by").desc(nulls_last=True), |
| 425 | + "-updated_at", |
423 | 426 | )
|
424 | 427 |
|
| 428 | + return qs.order_by(*fields).distinct( |
| 429 | + "id", |
| 430 | + *(get_field_from_ordering(f) for f in fields), |
| 431 | + ) |
| 432 | + |
425 | 433 |
|
426 | 434 | def build_workflow_access_filter(qs: QuerySet, user: AppUser | None) -> QuerySet:
|
427 | 435 | # a) everyone can see published examples
|
@@ -510,3 +518,13 @@ def build_search_filter(
|
510 | 518 | qs = qs.filter(Q(search=search) | Q(workflow__in=workflow_search))
|
511 | 519 |
|
512 | 520 | return qs
|
| 521 | + |
| 522 | + |
| 523 | +def get_field_from_ordering(value: str | OrderBy) -> str: |
| 524 | + match value: |
| 525 | + case OrderBy(): |
| 526 | + return value.expression.name |
| 527 | + case str(): |
| 528 | + return value.lstrip("-") |
| 529 | + case _: |
| 530 | + raise ValueError(f"Invalid value: {value}") |
0 commit comments