1
0
Fork 0

add uplink_mode field for transciever and transponder transmitter type

Signed-off-by: Flawinne Julien flawinne.julien at protonmail dot com

add uplink_mode field for transciever and transponder
Signed-off-by: Flawinne Julien flawinne.julien@protonmail.com

adapt unit test for transmitter model

Update migration for taking account of the invert value

update uplink_mode migration condition

Not request TLE with NORAD ID above 99000

Signed-off-by: Alfredos-Panagiotis Damkalis <fredy@fredy.gr>

rename mode transmitter field to downlink_mode

adapt unit test for transmitter model

update uplink_mode migration condition

add uplink_mode field for transciever and transponder transmitter type
Signed-off-by: Flawinne Julien flawinne.julien at protonmail dot com

keep mode id

add forgotten field mode id

add missing ,

fix yapf error
merge-requests/435/head
deckbsd 2019-11-09 02:09:41 -08:00 committed by deck
parent 34f2641bef
commit 062152aeec
11 changed files with 159 additions and 40 deletions

View File

@ -6,12 +6,15 @@ import django_filters
from django_filters import rest_framework as filters
from django_filters.rest_framework import FilterSet
from db.base.models import DemodData, Satellite, Transmitter
from db.base.models import DemodData, Mode, Satellite, Transmitter
class TransmitterViewFilter(FilterSet):
"""SatNOGS DB Transmitter API View Filter"""
alive = filters.BooleanFilter(field_name='status', label='Alive', method='filter_status')
mode = django_filters.ModelChoiceFilter(
field_name='downlink_mode', lookup_expr='exact', queryset=Mode.objects.all()
)
# see https://django-filter.readthedocs.io/en/master/ref/filters.html for
# W0613
@ -25,7 +28,10 @@ class TransmitterViewFilter(FilterSet):
class Meta:
model = Transmitter
fields = ['uuid', 'mode', 'type', 'satellite__norad_cat_id', 'alive', 'status', 'service']
fields = [
'uuid', 'mode', 'uplink_mode', 'type', 'satellite__norad_cat_id', 'alive', 'status',
'service'
]
class SatelliteViewFilter(FilterSet):

View File

@ -28,8 +28,9 @@ class SatelliteSerializer(serializers.ModelSerializer):
class TransmitterSerializer(serializers.ModelSerializer):
"""SatNOGS DB Transmitter API Serializer"""
norad_cat_id = serializers.SerializerMethodField()
mode_id = serializers.SerializerMethodField()
mode = serializers.SerializerMethodField()
mode_id = serializers.SerializerMethodField()
uplink_mode = serializers.SerializerMethodField()
alive = serializers.SerializerMethodField()
updated = serializers.DateTimeField(source='created')
@ -37,8 +38,8 @@ class TransmitterSerializer(serializers.ModelSerializer):
model = Transmitter
fields = (
'uuid', 'description', 'alive', 'type', 'uplink_low', 'uplink_high', 'uplink_drift',
'downlink_low', 'downlink_high', 'downlink_drift', 'mode_id', 'mode', 'invert', 'baud',
'norad_cat_id', 'status', 'updated', 'citation', 'service'
'downlink_low', 'downlink_high', 'downlink_drift', 'mode', 'mode_id', 'uplink_mode',
'invert', 'baud', 'norad_cat_id', 'status', 'updated', 'citation', 'service'
)
# Keeping alive field for compatibility issues
@ -47,16 +48,20 @@ class TransmitterSerializer(serializers.ModelSerializer):
return obj.status == TRANSMITTER_STATUS[0]
def get_mode_id(self, obj):
"""Returns mode ID"""
"""Returns downlink mode id"""
return obj.downlink_mode.id
def get_mode(self, obj):
"""Returns downlink mode name"""
try:
return obj.mode.id
return obj.downlink_mode.name
except Exception: # pylint: disable=W0703
return None
def get_mode(self, obj):
"""Returns mode name"""
def get_uplink_mode(self, obj):
"""Returns uplink mode name"""
try:
return obj.mode.name
return obj.uplink_mode.name
except Exception: # pylint: disable=W0703
return None

View File

@ -90,9 +90,9 @@ class SatelliteAdmin(admin.ModelAdmin):
class TransmitterEntryAdmin(admin.ModelAdmin):
"""Defines TransmitterEntry view in django admin UI"""
list_display = (
'uuid', 'description', 'satellite', 'service', 'type', 'mode', 'baud', 'downlink_low',
'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high', 'uplink_drift', 'reviewed',
'approved', 'status', 'created', 'citation', 'user'
'uuid', 'description', 'satellite', 'service', 'type', 'downlink_mode', 'uplink_mode',
'baud', 'downlink_low', 'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high',
'uplink_drift', 'reviewed', 'approved', 'status', 'created', 'citation', 'user'
)
search_fields = ('satellite__id', 'uuid', 'satellite__name', 'satellite__norad_cat_id')
list_filter = (
@ -101,7 +101,8 @@ class TransmitterEntryAdmin(admin.ModelAdmin):
'type',
'status',
'service',
'mode',
'downlink_mode',
'uplink_mode',
'baud',
)
readonly_fields = ('uuid', 'satellite')
@ -111,21 +112,22 @@ class TransmitterEntryAdmin(admin.ModelAdmin):
class TransmitterSuggestionAdmin(admin.ModelAdmin):
"""Defines TransmitterSuggestion view in django admin UI"""
list_display = (
'uuid', 'description', 'satellite', 'service', 'type', 'mode', 'baud', 'downlink_low',
'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high', 'uplink_drift', 'status',
'created', 'citation', 'user'
'uuid', 'description', 'satellite', 'service', 'type', 'downlink_mode', 'uplink_mode',
'baud', 'downlink_low', 'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high',
'uplink_drift', 'status', 'created', 'citation', 'user'
)
search_fields = ('satellite__id', 'uuid', 'satellite__name', 'satellite__norad_cat_id')
list_filter = (
'type',
'mode',
'downlink_mode',
'uplink_mode',
'baud',
'service',
)
readonly_fields = (
'uuid', 'description', 'status', 'type', 'uplink_low', 'uplink_high', 'uplink_drift',
'downlink_low', 'downlink_high', 'downlink_drift', 'mode', 'invert', 'baud', 'satellite',
'reviewed', 'approved', 'created', 'citation', 'user'
'downlink_low', 'downlink_high', 'downlink_drift', 'downlink_mode', 'uplink_mode',
'invert', 'baud', 'satellite', 'reviewed', 'approved', 'created', 'citation', 'user'
)
actions = ['approve_suggestion', 'reject_suggestion']
@ -193,16 +195,17 @@ class TransmitterSuggestionAdmin(admin.ModelAdmin):
class TransmitterAdmin(admin.ModelAdmin):
"""Defines Transmitter view in django admin UI"""
list_display = (
'uuid', 'description', 'satellite', 'service', 'type', 'mode', 'baud', 'downlink_low',
'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high', 'uplink_drift', 'status',
'created', 'citation', 'user'
'uuid', 'description', 'satellite', 'service', 'type', 'downlink_mode', 'uplink_mode',
'baud', 'downlink_low', 'downlink_high', 'downlink_drift', 'uplink_low', 'uplink_high',
'uplink_drift', 'status', 'created', 'citation', 'user'
)
search_fields = ('satellite__id', 'uuid', 'satellite__name', 'satellite__norad_cat_id')
list_filter = (
'type',
'status',
'service',
'mode',
'downlink_mode',
'uplink_mode',
'baud',
)
readonly_fields = ('uuid', 'satellite')

View File

@ -30,6 +30,6 @@ class TransmitterEntryForm(forms.ModelForm):
model = TransmitterEntry
fields = [
'description', 'status', 'type', 'uplink_low', 'uplink_high', 'downlink_low',
'downlink_high', 'uplink_drift', 'downlink_drift', 'mode', 'invert', 'baud',
'satellite', 'citation', 'service'
'downlink_high', 'uplink_drift', 'downlink_drift', 'downlink_mode', 'uplink_mode',
'invert', 'baud', 'satellite', 'citation', 'service'
]

View File

@ -0,0 +1,18 @@
# Generated by Django 2.2.6 on 2019-11-08 18:40
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('base', '0011_transmitterentry_service'),
]
operations = [
migrations.RenameField(
model_name='transmitterentry',
old_name='mode',
new_name='downlink_mode',
),
]

View File

@ -0,0 +1,39 @@
# Generated by Django 2.2.6 on 2019-11-08 18:42
from django.db import migrations, models
from django.db.models import F
import django.db.models.deletion
def copy_field(apps, schema_editor):
models = apps.get_model('base', 'TransmitterEntry')
modes = apps.get_model('base', 'Mode')
for transmitter in models.objects.all().iterator():
if transmitter.type != "Transmitter":
transmitter.uplink_mode = transmitter.downlink_mode
if transmitter.invert == True:
if transmitter.downlink_mode.name == "USB":
transmitter.uplink_mode = modes.objects.get(name="LSB")
elif transmitter.downlink_mode.name == "LSB":
transmitter.uplink_mode = modes.objects.get(name="USB")
transmitter.save()
class Migration(migrations.Migration):
dependencies = [
('base', '0012_auto_20191108_1840'),
]
operations = [
migrations.AddField(
model_name='transmitterentry',
name='uplink_mode',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transmitter_uplink_entries', to='base.Mode'),
),
migrations.AlterField(
model_name='transmitterentry',
name='downlink_mode',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transmitter_downlink_entries', to='base.Mode'),
),
migrations.RunPython(copy_field, reverse_code=migrations.RunPython.noop),
]

View File

@ -167,8 +167,19 @@ class TransmitterEntry(models.Model):
downlink_low = models.BigIntegerField(blank=True, null=True)
downlink_high = models.BigIntegerField(blank=True, null=True)
downlink_drift = models.IntegerField(blank=True, null=True)
mode = models.ForeignKey(
Mode, blank=True, null=True, on_delete=models.SET_NULL, related_name='transmitter_entries'
downlink_mode = models.ForeignKey(
Mode,
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name='transmitter_downlink_entries'
)
uplink_mode = models.ForeignKey(
Mode,
blank=True,
null=True,
on_delete=models.SET_NULL,
related_name='transmitter_uplink_entries'
)
invert = models.BooleanField(default=False)
baud = models.FloatField(validators=[MinValueValidator(0)], blank=True, null=True)

View File

@ -79,7 +79,8 @@ class TransmitterFactory(factory.django.DjangoModelFactory):
uplink_high = fuzzy.FuzzyInteger(200000000, 500000000, step=10000)
downlink_low = fuzzy.FuzzyInteger(200000000, 500000000, step=10000)
downlink_high = fuzzy.FuzzyInteger(200000000, 500000000, step=10000)
mode = factory.SubFactory(ModeFactory)
downlink_mode = factory.SubFactory(ModeFactory)
uplink_mode = factory.SubFactory(ModeFactory)
invert = fuzzy.FuzzyChoice(choices=[True, False])
baud = fuzzy.FuzzyInteger(4000, 22000, step=1000)
satellite = factory.SubFactory(SatelliteFactory)
@ -102,7 +103,8 @@ class TransmitterSuggestionFactory(factory.django.DjangoModelFactory):
uplink_high = fuzzy.FuzzyInteger(200000000, 500000000, step=10000)
downlink_low = fuzzy.FuzzyInteger(200000000, 500000000, step=10000)
downlink_high = fuzzy.FuzzyInteger(200000000, 500000000, step=10000)
mode = factory.SubFactory(ModeFactory)
downlink_mode = factory.SubFactory(ModeFactory)
uplink_mode = factory.SubFactory(ModeFactory)
invert = fuzzy.FuzzyChoice(choices=[True, False])
baud = fuzzy.FuzzyInteger(4000, 22000, step=1000)
satellite = factory.SubFactory(SatelliteFactory)

View File

@ -85,7 +85,9 @@ def calculate_mode_stats(transmitters):
mode_data = []
for mode in modes:
filtered_transmitters = transmitters.filter(mode=mode).count()
filtered_transmitters = transmitters.filter(
downlink_mode=mode
).count() + transmitters.filter(uplink_mode=mode).count()
mode_label.append(mode.name)
mode_data.append(filtered_transmitters)

View File

@ -27,22 +27,26 @@ function transmitter_suggestion_type(selection) {
case 'Transmitter':
$('.input-group').show();
$('input').prop( 'disabled', false );
$('select').prop( 'disabled', false );
$('input[name=\'uplink_low\']').prop( 'disabled', true );
$('input[name=\'uplink_high\']').prop( 'disabled', true );
$('input[name=\'uplink_drift\']').prop( 'disabled', true );
$('input[name=\'downlink_high\']').prop( 'disabled', true );
$('input[name=\'invert\']').prop( 'disabled', true );
$('select[name=\'uplink_mode\']').prop( 'disabled', true );
$('.input-group').has('input[name=\'uplink_low\']').hide();
$('.input-group').has('input[name=\'uplink_high\']').hide();
$('.input-group').has('input[name=\'uplink_drift\']').hide();
$('.input-group').has('input[name=\'downlink_high\']').hide();
$('.input-group').has('input[name=\'invert\']').hide();
$('.input-group').has('select[name=\'uplink_mode\']').hide();
$('.input-group-addon:contains(\'Downlink Low\')').html('Downlink');
break;
case 'Transceiver':
$('.input-group').show();
$('input').prop( 'disabled', false );
$('select').prop( 'disabled', false );
$('input[name=\'uplink_high\']').prop( 'disabled', true );
$('input[name=\'downlink_high\']').prop( 'disabled', true );
$('input[name=\'invert\']').prop( 'disabled', true );
@ -56,6 +60,7 @@ function transmitter_suggestion_type(selection) {
case 'Transponder':
$('.input-group').show();
$('input').prop( 'disabled', false );
$('select').prop( 'disabled', false );
$('input[name=\'downlink_low\']').prev().html('Downlink Low');
$('input[name=\'uplink_low\']').prev().html('Uplink Low');
break;

View File

@ -114,8 +114,11 @@
{% if transmitter.service %}
{% include "includes/field.html" with name="Service" value=transmitter.service %}
{% endif %}
{% if transmitter.mode %}
{% include "includes/field.html" with name="Mode" value=transmitter.mode %}
{% if transmitter.downlink_mode %}
{% include "includes/field.html" with name="Downlink Mode" value=transmitter.downlink_mode %}
{% endif %}
{% if transmitter.uplink_mode %}
{% include "includes/field.html" with name="Uplink Mode" value=transmitter.uplink_mode %}
{% endif %}
{% if transmitter.baud %}
{% include "includes/field.html" with name="Baud" value=transmitter.baud %}
@ -243,11 +246,22 @@
</select>
</div>
<div class="input-group transmitter-element-suggest">
<div class="input-group-addon">Mode</div>
<select class="form-control" name="mode">
<div class="input-group-addon">Downlink mode</div>
<select class="form-control" name="downlink_mode">
<option value="" selected></option>
{% for mode in modes %}
<option value="{{ mode.id }}" {% ifequal transmitter.mode mode %}selected{% endifequal %}>
<option value="{{ mode.id }}" {% ifequal transmitter.downlink_mode mode %}selected{% endifequal %}>
{{ mode }}
</option>
{% endfor %}
</select>
</div>
<div class="input-group transmitter-element-suggest">
<div class="input-group-addon">Uplink mode</div>
<select class="form-control" name="uplink_mode">
<option value="" selected></option>
{% for mode in modes %}
<option value="{{ mode.id }}" {% ifequal transmitter.uplink_mode mode %}selected{% endifequal %}>
{{ mode }}
</option>
{% endfor %}
@ -358,8 +372,11 @@
{% if transmitter_suggestion.service %}
{% include "includes/field.html" with name="Service" value=transmitter_suggestion.service original=transmitter_suggestion.transmitter.service %}
{% endif %}
{% if transmitter_suggestion.mode %}
{% include "includes/field.html" with name="Mode" value=transmitter_suggestion.mode original=transmitter_suggestion.transmitter.mode %}
{% if transmitter_suggestion.downlink_mode %}
{% include "includes/field.html" with name="Downlink Mode" value=transmitter_suggestion.downlink_mode original=transmitter_suggestion.transmitter.downlink_mode %}
{% endif %}
{% if transmitter_suggestion.uplink_mode %}
{% include "includes/field.html" with name="Uplink Mode" value=transmitter_suggestion.uplink_mode original=transmitter_suggestion.transmitter.uplink_mode %}
{% endif %}
{% if transmitter_suggestion.invert %}
{% include "includes/field.html" with name="Invert" value=transmitter_suggestion.invert original=transmitter_suggestion.transmitter.invert %}
@ -584,8 +601,19 @@
</select>
</div>
<div class="input-group transmitter-element-suggest">
<div class="input-group-addon">Mode</div>
<select class="form-control" name="mode">
<div class="input-group-addon">Downlink Mode</div>
<select class="form-control" name="downlink_mode">
<option value="" selected></option>
{% for mode in modes %}
<option value="{{ mode.id }}">
{{ mode }}
</option>
{% endfor %}
</select>
</div>
<div class="input-group transmitter-element-suggest">
<div class="input-group-addon">Uplink mode</div>
<select class="form-control" name="uplink_mode">
<option value="" selected></option>
{% for mode in modes %}
<option value="{{ mode.id }}">