diff --git a/src/staff/mixins.py b/src/staff/mixins.py index 8d99b36a..d984f7a2 100644 --- a/src/staff/mixins.py +++ b/src/staff/mixins.py @@ -132,3 +132,27 @@ def get_status_value(record: Any) -> int: sorted_records = sorted(records, key=get_status_value, reverse=is_descending) return (sorted_records, True) + + +class PriorityMixinTable(tables.Table): + priority = tables.TemplateColumn( + orderable=True, + verbose_name="Priority", + template_name="staff/components/priority_column.html", + ) + + def order_priority( + self, queryset: QuerySet[Order], is_descending: bool + ) -> tuple[QuerySet[Order], bool]: + prefix = "-" if is_descending else "" + queryset = queryset.annotate( + priority_order=models.Case( + models.When(is_urgent=True, then=2), + models.When(is_prioritized=True, then=1), + default=0, + output_field=models.IntegerField(), + ) + ) + sorted_by_priority = queryset.order_by(f"{prefix}priority_order") + + return (sorted_by_priority, True) diff --git a/src/staff/tables.py b/src/staff/tables.py index 4936695e..fab9e18c 100644 --- a/src/staff/tables.py +++ b/src/staff/tables.py @@ -18,6 +18,7 @@ from .mixins import ( OrderStatusMixinTable, + PriorityMixinTable, SampleStatusMixinTable, StaffIDMixinTable, render_status_helper, @@ -37,7 +38,7 @@ class Meta: fields = ["number", "name", "active", "verified_at"] -class OrderTable(OrderStatusMixinTable): +class OrderTable(OrderStatusMixinTable, PriorityMixinTable): id = tables.Column( linkify=True, orderable=False, @@ -48,12 +49,6 @@ class OrderTable(OrderStatusMixinTable): def render_id(self, record: Order) -> str: return str(record) - priority = tables.TemplateColumn( - orderable=True, - verbose_name="Priority", - template_name="staff/components/priority_column.html", - ) - area = tables.Column( accessor="genrequest__area__name", verbose_name="Area", @@ -88,7 +83,7 @@ class Meta: "responsible_staff", ] empty_text = "No Orders" - order_by = ["-is_urgent"] + order_by = ["-priority", "status"] class AnalysisOrderTable(OrderTable): @@ -553,14 +548,12 @@ class Meta(SampleBaseTable.Meta): "order__id", "order__status", "order__genrequest__project", - "order__responsible_staff", ] sequence = SampleBaseTable.Meta.sequence + [ "sample_status", "analysis_markers", "order__id", "order__status", - "order__responsible_staff", "notes", ] exclude = ["plate_positions", "checked", "is_prioritised"]