diff --git a/SatNOGS/base/migrations/0003_auto__add_field_transponder_satellite.py b/SatNOGS/base/migrations/0003_auto__add_field_transponder_satellite.py new file mode 100644 index 0000000..f4604be --- /dev/null +++ b/SatNOGS/base/migrations/0003_auto__add_field_transponder_satellite.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing M2M table for field transponders on 'Satellite' + db.delete_table(db.shorten_name(u'base_satellite_transponders')) + + # Adding field 'Transponder.satellite' + db.add_column(u'base_transponder', 'satellite', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='transponder', null=True, to=orm['base.Satellite']), + keep_default=False) + + + def backwards(self, orm): + # Adding M2M table for field transponders on 'Satellite' + m2m_table_name = db.shorten_name(u'base_satellite_transponders') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('satellite', models.ForeignKey(orm[u'base.satellite'], null=False)), + ('transponder', models.ForeignKey(orm[u'base.transponder'], null=False)) + )) + db.create_unique(m2m_table_name, ['satellite_id', 'transponder_id']) + + # Deleting field 'Transponder.satellite' + db.delete_column(u'base_transponder', 'satellite_id') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'base.antenna': { + 'Meta': {'object_name': 'Antenna'}, + 'antenna_type': ('django.db.models.fields.CharField', [], {'max_length': '15'}), + 'band': ('django.db.models.fields.CharField', [], {'max_length': '5'}), + 'frequency': ('django.db.models.fields.FloatField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'base.data': { + 'Meta': {'object_name': 'Data'}, + 'end': ('django.db.models.fields.DateTimeField', [], {}), + 'ground_station': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['base.Station']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'observation': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['base.Observation']"}), + 'start': ('django.db.models.fields.DateTimeField', [], {}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + u'base.observation': { + 'Meta': {'object_name': 'Observation'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.User']"}), + 'end': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'satellite': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['base.Satellite']"}), + 'start': ('django.db.models.fields.DateTimeField', [], {}) + }, + u'base.satellite': { + 'Meta': {'object_name': 'Satellite'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '45'}), + 'norad_cat_id': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'base.station': { + 'Meta': {'object_name': 'Station'}, + 'alt': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'antenna': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['base.Antenna']", 'symmetrical': 'False'}), + 'featured': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'lat': ('django.db.models.fields.FloatField', [], {}), + 'lng': ('django.db.models.fields.FloatField', [], {}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '45'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['users.User']"}) + }, + u'base.transponder': { + 'Meta': {'object_name': 'Transponder'}, + 'alive': ('django.db.models.fields.BooleanField', [], {}), + 'baud': ('django.db.models.fields.FloatField', [], {}), + 'description': ('django.db.models.fields.TextField', [], {}), + 'downlink_high': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'downlink_low': ('django.db.models.fields.PositiveIntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'invert': ('django.db.models.fields.BooleanField', [], {}), + 'mode': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'satellite': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transponder'", 'null': 'True', 'to': u"orm['base.Satellite']"}), + 'uplink_high': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'uplink_low': ('django.db.models.fields.PositiveIntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'users.user': { + 'Meta': {'object_name': 'User'}, + 'bio': ('django.db.models.fields.TextField', [], {'default': "''"}), + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + } + } + + complete_apps = ['base'] \ No newline at end of file diff --git a/SatNOGS/base/models.py b/SatNOGS/base/models.py index 036392b..43e6dc0 100644 --- a/SatNOGS/base/models.py +++ b/SatNOGS/base/models.py @@ -15,20 +15,6 @@ ANTENNA_TYPES = ( MODE_CHOICES = ['FM', 'AFSK', 'APRS', 'SSTV', 'CW', 'FMN'] -class Transponder(models.Model): - """Model for antennas transponders.""" - description = models.TextField() - alive = models.BooleanField() - uplink_low = models.PositiveIntegerField() - uplink_high = models.PositiveIntegerField() - downlink_low = models.PositiveIntegerField() - downlink_high = models.PositiveIntegerField() - mode = models.CharField(choices=zip(MODE_CHOICES, MODE_CHOICES), - max_length=10) - invert = models.BooleanField() - baud = models.FloatField(validators=[MinValueValidator(0)]) - - class Antenna(models.Model): """Model for antennas tracked with SatNOGS.""" frequency = models.FloatField(validators=[MinValueValidator(0)]) @@ -55,7 +41,22 @@ class Satellite(models.Model): """Model for SatNOGS satellites.""" norad_cat_id = models.PositiveIntegerField() name = models.CharField(max_length=45) - transponders = models.ManyToManyField(Transponder) + + +class Transponder(models.Model): + """Model for antennas transponders.""" + description = models.TextField() + alive = models.BooleanField() + uplink_low = models.PositiveIntegerField() + uplink_high = models.PositiveIntegerField() + downlink_low = models.PositiveIntegerField() + downlink_high = models.PositiveIntegerField() + mode = models.CharField(choices=zip(MODE_CHOICES, MODE_CHOICES), + max_length=10) + invert = models.BooleanField() + baud = models.FloatField(validators=[MinValueValidator(0)]) + satellite = models.ForeignKey(Satellite, related_name='transponder', + null=True) class Observation(models.Model): diff --git a/SatNOGS/base/tests/__init__.py b/SatNOGS/base/tests/__init__.py index f22732b..cf2d851 100644 --- a/SatNOGS/base/tests/__init__.py +++ b/SatNOGS/base/tests/__init__.py @@ -9,22 +9,6 @@ from base.models import (ANTENNA_BANDS, ANTENNA_TYPES, MODE_CHOICES, from users.tests import UserFactory -class TransponderFactory(factory.django.DjangoModelFactory): - """Transponder model factory.""" - description = fuzzy.FuzzyText() - alive = fuzzy.FuzzyChoice(choices=[True, False]) - uplink_low = fuzzy.FuzzyInteger(200, 500) - uplink_high = fuzzy.FuzzyInteger(200, 500) - downlink_low = fuzzy.FuzzyInteger(200, 500) - downlink_high = fuzzy.FuzzyInteger(200, 500) - mode = fuzzy.FuzzyChoice(choices=MODE_CHOICES) - invert = fuzzy.FuzzyChoice(choices=[True, False]) - baud = fuzzy.FuzzyFloat(4000, 22000, step=1000) - - class Meta: - model = Transponder - - class AntennaFactory(factory.django.DjangoModelFactory): """Antenna model factory.""" frequency = fuzzy.FuzzyFloat(200, 500) @@ -37,7 +21,7 @@ class AntennaFactory(factory.django.DjangoModelFactory): class StationFactory(factory.django.DjangoModelFactory): """Station model factory.""" - owner = factory.SubFactory(UserFactory)p + owner = factory.SubFactory(UserFactory) name = fuzzy.FuzzyText() image = factory.django.ImageField() alt = fuzzy.FuzzyInteger(0, 800) @@ -63,19 +47,27 @@ class SatelliteFactory(factory.django.DjangoModelFactory): norad_cat_id = fuzzy.FuzzyInteger(1000, 8000) name = fuzzy.FuzzyText() - @factory.post_generation - def transponders(self, create, extracted, **kwargs): - if not create: - return - - if extracted: - for transponder in extracted: - self.transponders.add(transponder) - class Meta: model = Satellite +class TransponderFactory(factory.django.DjangoModelFactory): + """Transponder model factory.""" + description = fuzzy.FuzzyText() + alive = fuzzy.FuzzyChoice(choices=[True, False]) + uplink_low = fuzzy.FuzzyInteger(200, 500) + uplink_high = fuzzy.FuzzyInteger(200, 500) + downlink_low = fuzzy.FuzzyInteger(200, 500) + downlink_high = fuzzy.FuzzyInteger(200, 500) + mode = fuzzy.FuzzyChoice(choices=MODE_CHOICES) + invert = fuzzy.FuzzyChoice(choices=[True, False]) + baud = fuzzy.FuzzyInteger(4000, 22000, step=1000) + satellite = factory.SubFactory(SatelliteFactory) + + class Meta: + model = Transponder + + class ObservationFactory(factory.django.DjangoModelFactory): """Observation model factory.""" satellite = factory.SubFactory(SatelliteFactory)