From 0cbc5eb4c974d3910c52473c6d26bab6f31baef6 Mon Sep 17 00:00:00 2001 From: Alfredos-Panagiotis Damkalis Date: Tue, 28 Aug 2018 22:23:43 +0300 Subject: [PATCH] Add ratings for transmitters in satellite view --- network/base/models.py | 42 ++++++++++++++- network/base/views.py | 16 ++++++ network/static/css/common/_info.scss | 10 ++++ network/static/css/pages/_satellites.scss | 4 -- network/static/js/satellite.js | 51 +++++++++++++++++- network/templates/includes/satellite.html | 66 ++++++++++++----------- 6 files changed, 153 insertions(+), 36 deletions(-) diff --git a/network/base/models.py b/network/base/models.py index ea00b95..baa50af 100644 --- a/network/base/models.py +++ b/network/base/models.py @@ -302,7 +302,7 @@ class Satellite(models.Model): @property def data_count(self): - return Observation.objects.filter(satellite=self).count() + return Observation.objects.filter(satellite=self).exclude(vetted_status='failed').count() @property def good_count(self): @@ -375,6 +375,46 @@ class Transmitter(models.Model): satellite = models.ForeignKey(Satellite, related_name='transmitters', on_delete=models.CASCADE, null=True, blank=True) + @property + def data_count(self): + return Observation.objects.filter(transmitter=self).exclude(vetted_status='failed').count() + + @property + def good_count(self): + data = Observation.objects.filter(transmitter=self) + return data.filter(vetted_status='good').count() + + @property + def bad_count(self): + data = Observation.objects.filter(transmitter=self) + return data.filter(vetted_status='bad').count() + + @property + def unknown_count(self): + data = Observation.objects.filter(transmitter=self) + return data.filter(vetted_status='unknown').count() + + @property + def success_rate(self): + try: + return int(100 * (float(self.good_count) / float(self.data_count))) + except (ZeroDivisionError, TypeError): + return 0 + + @property + def bad_rate(self): + try: + return int(100 * (float(self.bad_count) / float(self.data_count))) + except (ZeroDivisionError, TypeError): + return 0 + + @property + def unknown_rate(self): + try: + return int(100 * (float(self.unknown_count) / float(self.data_count))) + except (ZeroDivisionError, TypeError): + return 0 + def __unicode__(self): return self.description diff --git a/network/base/views.py b/network/base/views.py index 40e121f..dcf848e 100644 --- a/network/base/views.py +++ b/network/base/views.py @@ -839,6 +839,19 @@ def station_delete(request, id): return redirect(reverse('users:view_user', kwargs={'username': me})) +class TransmittersSerializer(serializers.ModelSerializer): + + mode = serializers.SerializerMethodField() + + class Meta: + model = Transmitter + fields = ('description', 'alive', 'downlink_low', 'mode', 'success_rate', 'bad_rate', + 'unknown_rate', 'good_count', 'bad_count', 'unknown_count', 'data_count') + + def get_mode(self, obj): + return obj.mode.name + + def satellite_view(request, id): try: sat = Satellite.objects.get(norad_cat_id=id) @@ -848,6 +861,8 @@ def satellite_view(request, id): } return JsonResponse(data, safe=False) + transmitters = Transmitter.objects.filter(satellite=sat) + data = { 'id': id, 'name': sat.name, @@ -858,6 +873,7 @@ def satellite_view(request, id): 'bad_count': sat.bad_count, 'unknown_count': sat.unknown_count, 'data_count': sat.data_count, + 'transmitters': TransmittersSerializer(transmitters, many=True).data, } return JsonResponse(data, safe=False) diff --git a/network/static/css/common/_info.scss b/network/static/css/common/_info.scss index 506655e..b26a476 100644 --- a/network/static/css/common/_info.scss +++ b/network/static/css/common/_info.scss @@ -4,6 +4,16 @@ display: flow-root; } +.front-data-big { + float: right; + width: 300px; + display: flow-root; + + .progress { + width: 250px; + } +} + .front-line { margin-top: 12px; margin-bottom: 12px; diff --git a/network/static/css/pages/_satellites.scss b/network/static/css/pages/_satellites.scss index f1dcf90..eee32dc 100644 --- a/network/static/css/pages/_satellites.scss +++ b/network/static/css/pages/_satellites.scss @@ -1,7 +1,3 @@ -.satellite-info { - margin-bottom: 20px; -} - #SatelliteModal li { margin-bottom: 5px; } diff --git a/network/static/js/satellite.js b/network/static/js/satellite.js index b66b8b9..4ad90f4 100644 --- a/network/static/js/satellite.js +++ b/network/static/js/satellite.js @@ -16,10 +16,59 @@ $(document).ready(function() { modal.find('#db-link').attr('href', 'https://db.satnogs.org/satellite/' + satlink.data('id')); modal.find('#new-obs-link').attr('href', '/observations/new/?norad=' + satlink.data('id')); modal.find('#old-obs-link').attr('href', '/observations/?norad=' + satlink.data('id')); - modal.find('.satellite-success').text(data.success_rate + '% success on ' + data.data_count + ' observations'); + modal.find('#good-sat-obs').attr('href', '/observations/?future=0&good=1&bad=0&unvetted=0&failed=0&norad=' + satlink.data('id')); + modal.find('#unknown-sat-obs').attr('href', '/observations/?future=0&good=0&bad=0&unvetted=1&failed=0&norad=' + satlink.data('id')); + modal.find('#bad-sat-obs').attr('href', '/observations/?future=0&good=0&bad=1&unvetted=0&failed=0&norad=' + satlink.data('id')); + modal.find('.satellite-success-rate').text(data.success_rate + '%'); + modal.find('.satellite-total-obs').text(data.data_count); modal.find('.satellite-good').text(data.good_count); modal.find('.satellite-unknown').text(data.unknown_count); modal.find('.satellite-bad').text(data.bad_count); + $.each(data.transmitters, function(i, transmitter){ + var transmitter_status = '-danger'; + if(transmitter.alive){ + transmitter_status = '-success'; + } + var good_percentage = 0; + var unknown_percentage = 0; + var bad_percentage = 0; + if(transmitter.data_count > 0){ + good_percentage = Math.round((transmitter.good_count / transmitter.data_count) * 100); + unknown_percentage = Math.round((transmitter.unknown_count / transmitter.data_count) * 100); + bad_percentage = Math.round((transmitter.bad_count / transmitter.data_count) * 100); + } + modal.find('#transmitters').append(` +
+
+
+ ` + transmitter.description + ` +
+
+
+ Observations + + ` + transmitter.data_count + ` +
+
+
+
+
+
+
+
+
+
` + ); + }); if (data.image) { modal.find('.satellite-img-full').attr('src', data.image); } else { diff --git a/network/templates/includes/satellite.html b/network/templates/includes/satellite.html index 6a92b48..fb08fbc 100644 --- a/network/templates/includes/satellite.html +++ b/network/templates/includes/satellite.html @@ -13,43 +13,49 @@
-
+
-
+
NORAD ID - +
-
-
    -
  • - -
  • -
  • - - - -
  • -
+
+ Success Rate +
- +
+