diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/metadata.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/metadata.py index dce59a925c4de4faa4890d15ff3eb8e47f3a380d..7e5dc83937520443417096898b2533df4dfbcb33 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/metadata.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/metadata.py @@ -1,3 +1,5 @@ +from collections import OrderedDict +from django.utils.encoding import force_str from rest_framework.metadata import SimpleMetadata import logging @@ -10,6 +12,52 @@ class LOFARDefaultMetadata(SimpleMetadata): """ def determine_metadata(self, request, view): metadata = super(LOFARDefaultMetadata, self).determine_metadata(request, view) - # TODO: Add filtering and ordering information. + + if hasattr(view, 'filter_backends'): + # TODO: Add filter_backends. + pass + + if hasattr(view, 'filter_class'): + # Add filters + filters = OrderedDict() + for filter_name, filter_type in view.filter_class.base_filters.items(): + filter_parts = filter_name.split('__') + filter_name = filter_parts[0] + attrs = OrderedDict() + + # Type + attrs['type'] = filter_type.__class__.__name__ + + # Lookup fields + if len(filter_parts) > 1: + # Has a lookup type (__gt, __lt, etc.) + lookup_type = filter_parts[1] + if filters.get(filter_name) is not None: + # Filter name already in, just append the value + attrs['lookup_types'] = filters[filter_name]['lookup_types'] + attrs['lookup_types'].append(lookup_type) + else: + attrs['lookup_types'] = [lookup_type] + else: + attrs['lookup_types'] = ['exact'] + + # Do choices + choices = filter_type.extra.get('choices', False) + if choices: + attrs['choices'] = [ + { + 'value': choice_value, + 'display_name': force_str(choice_name, strings_only=True) + } + for choice_value, choice_name in choices + ] + filters[filter_name] = attrs + + # Add filters info + metadata['filters'] = filters + + # Add ordering info + if hasattr(view, 'ordering'): + metadata['ordering'] = view.ordering return metadata