diff --git a/src/staff/tables.py b/src/staff/tables.py index aac10d18..ebcdd3f2 100644 --- a/src/staff/tables.py +++ b/src/staff/tables.py @@ -89,7 +89,7 @@ class Meta: class AnalysisOrderTable(OrderTable): id = tables.Column( linkify=("staff:order-analysis-detail", {"pk": tables.A("id")}), - orderable=False, + orderable=True, empty_values=(), ) @@ -108,6 +108,13 @@ class AnalysisOrderTable(OrderTable): empty_values=(), ) + species = tables.Column( + verbose_name="Species", + accessor="samples", + orderable=False, + empty_values=(), + ) + class Meta(OrderTable.Meta): model = AnalysisOrder fields = OrderTable.Meta.fields + ("markers", "expected_delivery_date") # type: ignore[assignment] @@ -124,6 +131,11 @@ class Meta(OrderTable.Meta): "expected_delivery_date", ) + def render_species(self, value: Any) -> str: + return ", ".join( + sorted({sample.species.name for sample in value.all() if sample.species}) + ) + class ExtractionOrderTable(OrderTable): id = tables.Column( diff --git a/src/staff/templatetags/order_tags.py b/src/staff/templatetags/order_tags.py index 640d5655..d3c501a0 100644 --- a/src/staff/templatetags/order_tags.py +++ b/src/staff/templatetags/order_tags.py @@ -273,7 +273,7 @@ def extraction_order_detail_table(order: Order) -> dict: fields = { "Order ID": order.id, "Genetic Project": order.genrequest, - "Species": order.species.name, + "Species": ", ".join(str(s) for s in order.species.all()), "Status": render_status_helper(order.status), "Name": order.name, "Notes": "-" if order.notes == "" else order.notes, diff --git a/src/staff/views.py b/src/staff/views.py index e6035eea..057bf001 100644 --- a/src/staff/views.py +++ b/src/staff/views.py @@ -114,6 +114,7 @@ def get_queryset(self) -> QuerySet[AnalysisOrder]: "genrequest__project", "genrequest__area", ) + .prefetch_related("samples__species") .annotate(total_samples=Count("samples")) ) @@ -270,6 +271,10 @@ def get_return_url(self, return_to: str | None) -> str: class ExtractionOrderDetailView(StaffMixin, DetailView): model = ExtractionOrder + # Prefetch species to avoid N+1 queries when accessing species in the template + def get_queryset(self) -> QuerySet[ExtractionOrder]: + return super().get_queryset().prefetch_related("species") + def get_analysis_orders_for_samples( self, samples: QuerySet[Sample] ) -> QuerySet[AnalysisOrder]: