diff --git a/atlas/filters.py b/atlas/filters.py index 1da6b22f..a86ed2b8 100755 --- a/atlas/filters.py +++ b/atlas/filters.py @@ -164,13 +164,16 @@ class SeriesFilter(django_filters.FilterSet): class ConditionFilter(django_filters.FilterSet): + # Replace legacy `primary` filter with `is_canonical` and provide a + # `synonym` filter which will filter by the canonical group of the + # selected condition. + is_canonical = django_filters.BooleanFilter(method="filter_is_canonical", label="Canonical") + synonym = django_filters.ModelChoiceFilter(queryset=Condition.objects.all(), method="filter_synonym", label="Synonym group") + class Meta: model = Condition fields = { "name": ["icontains"], - "primary": ["exact"], - "synonym": ["exact"], - #"parent": ["exact"], "subspecialty": ["exact"], "rcr_curriculum": ["exact"], } @@ -189,6 +192,21 @@ class ConditionFilter(django_filters.FilterSet): ) pass + def filter_is_canonical(self, queryset, name, value): + if value in (True, "True", "true", 1, "1"): + return queryset.filter(canonical__isnull=True) + if value in (False, "False", "false", 0, "0"): + return queryset.filter(canonical__isnull=False) + return queryset + + def filter_synonym(self, queryset, name, value): + # value is a Condition instance selected in the filter. Return all + # Conditions that belong to the same canonical group as `value`. + if not value: + return queryset + master = value.canonical if value.canonical else value + return queryset.filter(Q(canonical=master) | Q(pk=master.pk)) + class FindingFilter(django_filters.FilterSet): class Meta: