@@ -41,8 +41,16 @@ class PersonViewSet(viewsets.ReadOnlyModelViewSet): |
| 41 | 41 | conflict_id = self.request.query_params.get('conflict', None) |
| 42 | 42 | if conflict_id is not None: |
| 43 | 43 | queryset = queryset.filter(conflict_id=conflict_id) |
| 44 | | - # Always order by last name, then first name for consistency |
| 45 | | - return queryset.order_by('last_name', 'first_name') |
| 44 | + |
| 45 | + # Allow ordering by different fields via query param |
| 46 | + order_by = self.request.query_params.get('order_by', 'name') |
| 47 | + |
| 48 | + if order_by == 'class_year': |
| 49 | + # Order by class year (nulls last), then name |
| 50 | + return queryset.order_by('class_year', 'last_name', 'first_name') |
| 51 | + else: |
| 52 | + # Default ordering by name |
| 53 | + return queryset.order_by('last_name', 'first_name') |
| 46 | 54 | |
| 47 | 55 | @action(detail=False, methods=['get']) |
| 48 | 56 | def search(self, request): |
@@ -175,7 +183,12 @@ def memorial_index(request): |
| 175 | 183 | data = [] |
| 176 | 184 | |
| 177 | 185 | for conflict in conflicts: |
| 178 | | - casualties = Person.objects.filter(conflict=conflict).order_by('last_name', 'first_name') |
| 186 | + # Order by class year first (nulls last), then by name |
| 187 | + # Use raw SQL ordering to put nulls last |
| 188 | + casualties = Person.objects.filter(conflict=conflict).extra( |
| 189 | + select={'class_year_null': 'class_year IS NULL'}, |
| 190 | + order_by=['class_year_null', 'class_year', 'last_name', 'first_name'] |
| 191 | + ) |
| 179 | 192 | conflict_data = ConflictSerializer(conflict).data |
| 180 | 193 | conflict_data['casualties'] = PersonListSerializer(casualties, many=True).data |
| 181 | 194 | data.append(conflict_data) |