diff --git a/ccdb/species/factories.py b/ccdb/species/factories.py new file mode 100644 index 0000000..fca9e26 --- /dev/null +++ b/ccdb/species/factories.py @@ -0,0 +1,15 @@ +from factory import DjangoModelFactory, Sequence +from factory.fuzzy import FuzzyText, FuzzyChoice + +from .models import Species + + +class SpeciesFactory(DjangoModelFactory): + class Meta: + model = Species + + common_name = Sequence(lambda n: 'species{}'.format(n)) + genus = FuzzyText(length=50) + species = FuzzyText(length=50) + parasite = FuzzyChoice(choices=[True, False]) + sort_order = Sequence(lambda n: n) diff --git a/ccdb/species/migrations/0004_DATA_initial.py b/ccdb/species/migrations/0004_DATA_initial.py new file mode 100644 index 0000000..f4d3a11 --- /dev/null +++ b/ccdb/species/migrations/0004_DATA_initial.py @@ -0,0 +1,40 @@ +from django.db import migrations +from django.forms import modelform_factory + +from ccdb.utils.data import get_data_sources + + +class Migration(migrations.Migration): + def migrate(apps, schema_editor): + sources = get_data_sources() + if not sources: + return + + c = sources['db0'] + + Species = apps.get_model('species', 'Species') + + Species.objects.all().delete() + + SpeciesForm = modelform_factory(Species, fields='__all__') + + for r in c.execute('SELECT * FROM tbl_lu_species;'): + form = SpeciesForm(dict(common_name=r[1], genus=r[2], + species=r[3], parasite=r[4], + sort_order=int(r[5]) if r[5] else None)) + if form.is_valid(): + Species.objects.create(id=r[0], **form.cleaned_data) + else: + print('species', r[0:], form.errors.as_data()) + + def rollback(apps, schema_editor): + Species = apps.get_model('species', 'Species') + Species.objects.all().delete() + + dependencies = [ + ('species', '0003_collectionspecies'), + ] + + operations = [ + migrations.RunPython(migrate, rollback), + ] diff --git a/ccdb/species/tests/__init__.py b/ccdb/species/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ccdb/species/tests/test_models.py b/ccdb/species/tests/test_models.py new file mode 100644 index 0000000..84ca539 --- /dev/null +++ b/ccdb/species/tests/test_models.py @@ -0,0 +1,19 @@ +from django.test import TestCase +from django.db import IntegrityError, transaction + +from ..models import Species +from ..factories import SpeciesFactory + + +class SpeciesTestCase(TestCase): + def test_creation(self): + s = SpeciesFactory() + self.assertTrue(isinstance(s, Species)) + self.assertEqual(s.__str__(), s.common_name) + + def test_uniqueness(self): + s1 = SpeciesFactory() + with transaction.atomic(), self.assertRaises(IntegrityError): + SpeciesFactory(common_name=s1.common_name, species=s1.species) + s3 = SpeciesFactory() + self.assertTrue(isinstance(s3, Species))