1212from django .contrib .auth .mixins import LoginRequiredMixin
1313from django .core .management import call_command
1414from django_filters import (CharFilter , ChoiceFilter , DateTimeFromToRangeFilter , FilterSet , ModelMultipleChoiceFilter ,
15- OrderingFilter )
15+ OrderingFilter , MultipleChoiceFilter )
1616from django_filters .views import FilterView
1717from django .shortcuts import redirect
1818from django .urls import reverse , reverse_lazy
3131from tom_observations .cadence import CadenceForm , get_cadence_strategy
3232from tom_observations .facility import get_service_class , get_service_classes
3333from tom_observations .facility import BaseManualObservationFacility
34- from tom_observations .forms import AddExistingObservationForm
34+ from tom_observations .forms import AddExistingObservationForm , facility_choices
3535from tom_observations .models import ObservationRecord , ObservationGroup , ObservationTemplate , DynamicCadence
3636from tom_targets .models import Target
3737
@@ -46,10 +46,28 @@ class ObservationFilter(FilterSet):
4646 fields = ['scheduled_start' , 'scheduled_end' , 'status' , 'created' , 'modified' ]
4747 )
4848 scheduled_start = DateTimeFromToRangeFilter ()
49- scheduled_end = DateTimeFromToRangeFilter
49+ scheduled_end = DateTimeFromToRangeFilter ()
50+ target_id = ModelMultipleChoiceFilter (
51+ queryset = Target .objects .filter (observationrecord__isnull = False ).distinct ().order_by ('name' )
52+ )
5053 observationgroup = ModelMultipleChoiceFilter (
5154 label = 'Observation Groups' , queryset = ObservationGroup .objects .all ()
5255 )
56+ facility = MultipleChoiceFilter (choices = facility_choices ())
57+
58+ def __init__ (self , * args , ** kwargs ):
59+ """
60+ The "status" filter is populated dynamically via list comprehension here in the __init__ (at runtime).
61+ This is important because the `ObservationRecord` db table doesn't necessarily exist at
62+ Class-interpretation-time
63+ """
64+ super ().__init__ (* args , ** kwargs )
65+ self .status = MultipleChoiceFilter (
66+ choices = [
67+ (s , s ) for s in
68+ ObservationRecord .objects .values_list ('status' , flat = True ).order_by ('status' ).distinct ()
69+ ]
70+ )
5371
5472 class Meta :
5573 model = ObservationRecord
0 commit comments