From 5d7f39b06a79e8613d0a319334c12abd2b3cc975 Mon Sep 17 00:00:00 2001 From: Alfredos-Panagiotis Damkalis Date: Tue, 11 Sep 2018 18:32:05 +0300 Subject: [PATCH] Add results and datetime filters for observations --- network/base/models.py | 11 +++ network/base/views.py | 46 +++++++++- network/static/css/pages/_observation.scss | 3 +- network/static/js/observations.js | 58 +++++++------ network/templates/base/observations.html | 99 +++++++++++++++++++--- 5 files changed, 175 insertions(+), 42 deletions(-) diff --git a/network/base/models.py b/network/base/models.py index 2842b7e..b791d55 100644 --- a/network/base/models.py +++ b/network/base/models.py @@ -515,6 +515,17 @@ class Observation(models.Model): def is_failed(self): return self.vetted_status == 'failed' + @property + def has_waterfall(self): + """Run some checks on the waterfall for existence of data.""" + if self.waterfall is None: + return False + if not os.path.isfile(os.path.join(settings.MEDIA_ROOT, self.waterfall.name)): + return False + if self.waterfall.size == 0: + return False + return True + @property def has_audio(self): """Run some checks on the payload for existence of data.""" diff --git a/network/base/views.py b/network/base/views.py index de0b206..b336c66 100644 --- a/network/base/views.py +++ b/network/base/views.py @@ -116,6 +116,8 @@ class ObservationListView(ListView): norad_cat_id = self.request.GET.get('norad', '') observer = self.request.GET.get('observer', '') station = self.request.GET.get('station', '') + start_time = self.request.GET.get('start-time', '') + end_time = self.request.GET.get('end-time', '') self.filtered = False bad = self.request.GET.get('bad', '1') @@ -143,8 +145,24 @@ class ObservationListView(ListView): failed = False else: failed = True + waterfall = self.request.GET.get('waterfall', '0') + if waterfall == '1': + waterfall = False + else: + waterfall = True + audio = self.request.GET.get('audio', '0') + if audio == '1': + audio = False + else: + audio = True + data = self.request.GET.get('data', '0') + if data == '1': + data = False + else: + data = True - if False in (bad, good, unvetted, future, failed): + if False in (bad, good, unvetted, future, failed, + waterfall, audio, data): self.filtered = True observations = Observation.objects.all() @@ -160,6 +178,14 @@ class ObservationListView(ListView): observations = observations.filter( ground_station_id=station) self.filtered = True + if not start_time == '': + observations = observations.filter( + start__gt=start_time) + self.filtered = True + if not end_time == '': + observations = observations.filter( + end__lt=end_time) + self.filtered = True if not bad: observations = observations.exclude(vetted_status='bad') @@ -174,6 +200,15 @@ class ObservationListView(ListView): if not future: observations = observations.exclude(id__in=(o.id for o in observations if o.is_future)) + if not waterfall: + observations = observations.filter(id__in=(o.id for + o in observations if o.has_waterfall)) + if not audio: + observations = observations.filter(id__in=(o.id for + o in observations if o.has_audio)) + if not data: + observations = observations.filter(id__in=(o.id for + o in observations if o.has_demoddata)) return observations def get_context_data(self, **kwargs): @@ -189,11 +224,16 @@ class ObservationListView(ListView): norad_cat_id = self.request.GET.get('norad', None) observer = self.request.GET.get('observer', None) station = self.request.GET.get('station', None) + start_time = self.request.GET.get('start-time', None) + end_time = self.request.GET.get('end-time', None) context['future'] = self.request.GET.get('future', '1') context['bad'] = self.request.GET.get('bad', '1') context['good'] = self.request.GET.get('good', '1') context['unvetted'] = self.request.GET.get('unvetted', '1') context['failed'] = self.request.GET.get('failed', '1') + context['waterfall'] = self.request.GET.get('waterfall', '0') + context['audio'] = self.request.GET.get('audio', '0') + context['data'] = self.request.GET.get('data', '0') context['filtered'] = self.filtered if norad_cat_id is not None and norad_cat_id != '': context['norad'] = int(norad_cat_id) @@ -201,6 +241,10 @@ class ObservationListView(ListView): context['observer_id'] = int(observer) if station is not None and station != '': context['station_id'] = int(station) + if start_time is not None and start_time != '': + context['start_time'] = start_time + if end_time is not None and end_time != '': + context['end_time'] = end_time if 'scheduled' in self.request.session: context['scheduled'] = self.request.session['scheduled'] try: diff --git a/network/static/css/pages/_observation.scss b/network/static/css/pages/_observation.scss index 2480a93..9d14f5e 100644 --- a/network/static/css/pages/_observation.scss +++ b/network/static/css/pages/_observation.scss @@ -35,7 +35,8 @@ } } -#data-selector { +#status-selector, +#results-selector { display: block; } diff --git a/network/static/js/observations.js b/network/static/js/observations.js index e26a0c9..3ba649b 100644 --- a/network/static/js/observations.js +++ b/network/static/js/observations.js @@ -1,37 +1,43 @@ $(document).ready(function() { 'use strict'; - $('.selectpicker').selectpicker(); - - $('#observation-filter').submit(function () { - var the_form = $(this); - - the_form.find('input[type="checkbox"]').each( function () { - var the_checkbox = $(this); - - if( the_checkbox.is(':checked') === true ) { - the_checkbox.attr('value','1'); - } else { - the_checkbox.prop('checked',true); - // Check the checkbox but change it's value to 0 - the_checkbox.attr('value','0'); - } + $(function () { + $('#datetimepicker-start').datetimepicker({ + useCurrent: false //https://github.com/Eonasdan/bootstrap-datetimepicker/issues/1075 + }); + $('#datetimepicker-end').datetimepicker({ + useCurrent: false //https://github.com/Eonasdan/bootstrap-datetimepicker/issues/1075 + }); + $('#datetimepicker-start').on('dp.change', function (e) { + $('#datetimepicker-end').data('DateTimePicker').minDate(e.date); + }); + $('#datetimepicker-end').on('dp.change', function (e) { + $('#datetimepicker-start').data('DateTimePicker').maxDate(e.date); }); }); + $('.selectpicker').selectpicker(); - // Filters submits - $('.filter-section input[type=checkbox]').change(function() { - $('#observation-filter').submit(); + + $('.filter-section #status-selector label').click(function() { + var checkbox = $(this); + var input = checkbox.find('input[type="checkbox"]'); + + if (input.prop('checked')) { + checkbox.removeClass('btn-inactive'); + } else { + checkbox.addClass('btn-inactive'); + } }); - $('#satellite-selection').bind('keyup change', function() { - $('#observation-filter').submit(); - }); - $('#observer-selection').bind('keyup change', function() { - $('#observation-filter').submit(); - }); - $('#station-selection').bind('keyup change', function() { - $('#observation-filter').submit(); + $('.filter-section #results-selector label').click(function() { + var checkbox = $(this); + var input = checkbox.find('input[type="checkbox"]'); + + if (input.prop('checked')) { + checkbox.addClass('btn-inactive'); + } else { + checkbox.removeClass('btn-inactive'); + } }); // Check if filters should be displayed diff --git a/network/templates/base/observations.html b/network/templates/base/observations.html index 1a15e9e..d927199 100644 --- a/network/templates/base/observations.html +++ b/network/templates/base/observations.html @@ -6,6 +6,7 @@ {% block title %} - Observations{% endblock %} {% block css %} + {% endblock css %} @@ -53,53 +54,54 @@
-
+
- -
- +
+ - - - -
@@ -140,6 +142,73 @@ {% endfor %}
+
+ +
+ + + +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+ +
@@ -195,7 +264,7 @@ - {% if observation.waterfall %} + {% if observation.has_waterfall %} @@ -239,6 +308,8 @@ {% endblock content %} {% block javascript %} + +