diff --git a/ccdb/api/urls.py b/ccdb/api/urls.py index bdfd6ad..bd300a4 100644 --- a/ccdb/api/urls.py +++ b/ccdb/api/urls.py @@ -38,11 +38,12 @@ router.register(r'species', species_viewsets.SpeciesViewSet) router.register(r'collection-species', species_viewsets.CollectionSpeciesViewSet) +app_name = 'api' urlpatterns = [ url(r'^auth/login/', api_v.Login.as_view()), url(r'^auth/password/reset/confirm/', api_v.PasswordResetConfirm.as_view()), url(r'^auth/password/reset/', api_v.PasswordReset.as_view()), url(r'^auth/', include('djoser.urls.authtoken')), - url(r'^v1/', include(router.urls, namespace='v1')), + url(r'^v1/', include((router.urls, 'api_v1'), namespace='v1')), ] diff --git a/ccdb/collections_ccdb/filters.py b/ccdb/collections_ccdb/filters.py index d934b25..e0e7361 100644 --- a/ccdb/collections_ccdb/filters.py +++ b/ccdb/collections_ccdb/filters.py @@ -9,43 +9,43 @@ from ccdb.species.models import Species class CollectionFilter(filters.FilterSet): project = ModelMultipleChoiceFilter( - name='project__id', + field_name='project__id', to_field_name='id', queryset=Project.objects.all(), ) region = ModelMultipleChoiceFilter( - name='study_location__site__region__id', + field_name='study_location__site__region__id', to_field_name='id', queryset=Region.objects.all(), ) site = ModelMultipleChoiceFilter( - name='study_location__site__id', + field_name='study_location__site__id', to_field_name='id', queryset=Site.objects.all(), ) study_location = ModelMultipleChoiceFilter( - name='study_location__id', + field_name='study_location__id', to_field_name='id', queryset=StudyLocation.objects.all(), ) collection_method = ModelMultipleChoiceFilter( - name='collection_method__id', + field_name='collection_method__id', to_field_name='id', queryset=CollectionMethod.objects.all(), ) adfg_permit = ModelMultipleChoiceFilter( - name='adfg_permit__id', + field_name='adfg_permit__id', to_field_name='id', queryset=ADFGPermit.objects.all(), ) species = ModelMultipleChoiceFilter( - name='collection_species__species__id', + field_name='collection_species__species__id', to_field_name='id', queryset=Species.objects.all(), ) diff --git a/ccdb/collections_ccdb/models.py b/ccdb/collections_ccdb/models.py index bfd39e7..b5a9355 100644 --- a/ccdb/collections_ccdb/models.py +++ b/ccdb/collections_ccdb/models.py @@ -56,13 +56,17 @@ class ADFGPermit(models.Model): class Collection(models.Model): - project = models.ForeignKey('projects.Project', related_name='collections') + project = models.ForeignKey('projects.Project', related_name='collections', + on_delete=models.CASCADE) study_location = models.ForeignKey('locations.StudyLocation', - related_name='collections') + related_name='collections', + on_delete=models.CASCADE) collection_type = models.ForeignKey(CollectionType, - related_name='collections') + related_name='collections', + on_delete=models.CASCADE) collection_method = models.ForeignKey(CollectionMethod, - related_name='collections') + related_name='collections', + on_delete=models.CASCADE) number_of_traps = models.IntegerField(blank=True, null=True) collection_start_date = models.DateField(blank=True, null=True) collection_start_time = models.TimeField(blank=True, null=True) @@ -71,16 +75,21 @@ class Collection(models.Model): notes = models.TextField(blank=True, null=False) storage_location = models.ForeignKey('locations.StorageLocation', blank=True, null=True, - related_name='collections') + related_name='collections', + on_delete=models.CASCADE) specimen_state = models.CharField(max_length=50, blank=True) process_type = models.ForeignKey('processing.ProcessType', blank=True, - null=True, related_name='collections') + null=True, related_name='collections', + on_delete=models.CASCADE) reagent = models.ForeignKey('processing.Reagent', blank=True, null=True, - related_name='collections') + related_name='collections', + on_delete=models.CASCADE) adfg_permit = models.ForeignKey(ADFGPermit, blank=True, null=True, - related_name='collections') + related_name='collections', + on_delete=models.CASCADE) collection_flaw = models.ForeignKey(Flaw, blank=True, null=True, - related_name='collections') + related_name='collections', + on_delete=models.CASCADE) display_name = models.CharField(max_length=255, editable=False) def save(self, *args, **kwargs): @@ -101,13 +110,15 @@ class Collection(models.Model): class DatasheetAttachment(models.Model): - collection = models.ForeignKey(Collection, related_name='datasheets') + collection = models.ForeignKey(Collection, related_name='datasheets', + on_delete=models.CASCADE) datasheet = models.FileField("Datasheet", upload_to='collections/datasheets/%Y/%m/%d') class CollectionTrap(models.Model): - collection = models.ForeignKey(Collection, related_name='traps') + collection = models.ForeignKey(Collection, related_name='traps', + on_delete=models.CASCADE) number_of_traps = models.IntegerField() date_opened = models.DateField() time_opened = models.TimeField() @@ -126,7 +137,8 @@ class CollectionTrap(models.Model): class CollectionMeasurement(models.Model): - collection = models.ForeignKey(Collection, related_name='env_measurements') + collection = models.ForeignKey(Collection, related_name='env_measurements', + on_delete=models.CASCADE) date_measured = models.DateField() time_measured = models.TimeField() water_temp_c = models.FloatField(null=True) diff --git a/ccdb/experiments/models.py b/ccdb/experiments/models.py index ad2373a..2385f23 100644 --- a/ccdb/experiments/models.py +++ b/ccdb/experiments/models.py @@ -18,7 +18,8 @@ class Experiment(models.Model): code = models.CharField(max_length=10, blank=True) description = models.CharField(max_length=255, blank=True) flaw = models.ForeignKey(Flaw, blank=True, null=True, - related_name='experiments') + related_name='experiments', + on_delete=models.CASCADE) sort_order = models.IntegerField(blank=True, null=True) collections = models.ManyToManyField('collections_ccdb.Collection') @@ -31,7 +32,8 @@ class Experiment(models.Model): class ProtocolAttachment(models.Model): - experiment = models.ForeignKey(Experiment, related_name='protocols') + experiment = models.ForeignKey(Experiment, related_name='protocols', + on_delete=models.CASCADE) protocol = models.FileField(upload_to='experiments/protocols/%Y/%m/%d') def __str__(self): @@ -40,7 +42,8 @@ class ProtocolAttachment(models.Model): class TreatmentType(models.Model): experiment = models.ForeignKey(Experiment, blank=True, null=True, - related_name='treatment_types') + related_name='treatment_types', + on_delete=models.CASCADE) name = models.CharField(max_length=200) code = models.CharField(max_length=25, blank=True) treatment_type = models.CharField(max_length=50, blank=True) @@ -65,15 +68,20 @@ class TreatmentType(models.Model): class Treatment(models.Model): treatment_type = models.ForeignKey(TreatmentType, - related_name='treatments') + related_name='treatments', + on_delete=models.CASCADE) container = models.ForeignKey('misc.Container', blank=True, null=True, - related_name='treatments') + related_name='treatments', + on_delete=models.CASCADE) study_location = models.ForeignKey('locations.StudyLocation', - related_name='treatments') - species = models.ForeignKey('species.Species', related_name='treatments') + related_name='treatments', + on_delete=models.CASCADE) + species = models.ForeignKey('species.Species', related_name='treatments', + on_delete=models.CASCADE) sex = models.CharField(max_length=25) flaw = models.ForeignKey(Flaw, blank=True, null=True, - related_name='treatments') + related_name='treatments', + on_delete=models.CASCADE) display_name = models.CharField(max_length=255, editable=False) def save(self, *args, **kwargs): @@ -93,14 +101,16 @@ class Treatment(models.Model): class TreatmentReplicate(models.Model): treatment = models.ForeignKey(Treatment, - related_name='treatment_replicates') + related_name='treatment_replicates', + on_delete=models.CASCADE) name = models.CharField(max_length=50) setup_date = models.DateField(blank=True, null=True) setup_time = models.TimeField(blank=True, null=True) setup_sample_size = models.IntegerField(blank=True, null=True) mass_g = models.FloatField(blank=True, null=True) flaw = models.ForeignKey(Flaw, blank=True, null=True, - related_name='treatment_replicates') + related_name='treatment_replicates', + on_delete=models.CASCADE) display_name = models.CharField(max_length=255, editable=False) def save(self, *args, **kwargs): @@ -118,13 +128,15 @@ class TreatmentReplicate(models.Model): class AliveDeadCount(models.Model): treatment_replicate = models.ForeignKey(TreatmentReplicate, - related_name='alive_dead_counts') + related_name='alive_dead_counts', + on_delete=models.CASCADE) status_date = models.DateField() status_time = models.TimeField(blank=True, null=True) count_alive = models.IntegerField(blank=True, null=True) count_dead = models.IntegerField(blank=True, null=True) flaw = models.ForeignKey(Flaw, blank=True, null=True, - related_name='alive_dead_counts') + related_name='alive_dead_counts', + on_delete=models.CASCADE) def __str__(self): return "{}".format(self.status_date) diff --git a/ccdb/locations/models.py b/ccdb/locations/models.py index 021ed17..c586d3d 100644 --- a/ccdb/locations/models.py +++ b/ccdb/locations/models.py @@ -16,7 +16,7 @@ class Region(models.Model): class Site(models.Model): region = models.ForeignKey(Region, blank=True, null=True, - related_name='sites') + related_name='sites', on_delete=models.CASCADE) name = models.CharField(max_length=100) code = models.CharField(max_length=10, blank=True) description = models.CharField(max_length=255, blank=True) @@ -46,14 +46,16 @@ class MunicipalLocation(models.Model): class StudyLocation(models.Model): - site = models.ForeignKey(Site, related_name='study_locations') + site = models.ForeignKey(Site, related_name='study_locations', + on_delete=models.CASCADE) name = models.CharField(max_length=100) code = models.CharField(max_length=10) study_location_type = models.CharField(max_length=50, blank=True) treatment_type = models.CharField(max_length=100, blank=True) municipal_location = models.ForeignKey(MunicipalLocation, blank=True, null=True, - related_name='study_locations') + related_name='study_locations', + on_delete=models.CASCADE) collecting_location = models.BooleanField(default=False) description = models.CharField(max_length=255, blank=True) sort_order = models.IntegerField(blank=True, null=True) diff --git a/ccdb/misc/models.py b/ccdb/misc/models.py index 27bed5a..863643c 100644 --- a/ccdb/misc/models.py +++ b/ccdb/misc/models.py @@ -25,7 +25,8 @@ class MeasurementType(models.Model): 'MeasurementUnit', blank=True, null=True, - related_name='measurement_types' + related_name='measurement_types', + on_delete=models.CASCADE, ) sort_order = models.IntegerField(blank=True, null=True) @@ -71,12 +72,15 @@ class Container(models.Model): code = models.CharField(max_length=10, blank=True) application = models.CharField(max_length=50, blank=True) color = models.ForeignKey(Color, blank=True, null=True, - related_name='containers') + related_name='containers', + on_delete=models.CASCADE) material = models.ForeignKey(Material, blank=True, null=True, - related_name='containers') + related_name='containers', + on_delete=models.CASCADE) volume = models.FloatField(blank=True, null=True) measurement_unit = models.ForeignKey(MeasurementUnit, blank=True, - null=True, related_name='containers') + null=True, related_name='containers', + on_delete=models.CASCADE) sort_order = models.IntegerField(blank=True, null=True) def __str__(self): diff --git a/ccdb/processing/models.py b/ccdb/processing/models.py index 33b62ec..6ff9359 100644 --- a/ccdb/processing/models.py +++ b/ccdb/processing/models.py @@ -42,19 +42,24 @@ class Flaw(models.Model): class Processing(models.Model): - process_type = models.ForeignKey(ProcessType, related_name='processings') - container = models.ForeignKey('misc.Container', related_name='processings') + process_type = models.ForeignKey(ProcessType, related_name='processings', + on_delete=models.CASCADE) + container = models.ForeignKey('misc.Container', related_name='processings', + on_delete=models.CASCADE) container_label = models.CharField(max_length=50) process_date = models.DateField(blank=True, null=True) process_time = models.TimeField(blank=True, null=True) reagent = models.ForeignKey(Reagent, blank=True, null=True, - related_name='processings') + related_name='processings', + on_delete=models.CASCADE) reagent_volume = models.FloatField(blank=True, null=True) measurement_unit = models.ForeignKey('misc.MeasurementUnit', blank=True, - null=True, related_name='processings') + null=True, related_name='processings', + on_delete=models.CASCADE) minutes_in_reagent = models.IntegerField(blank=True, null=True) flaw = models.ForeignKey(Flaw, blank=True, null=True, - related_name='processings') + related_name='processings', + on_delete=models.CASCADE) def __str__(self): return "{} {} {}".format(self.process_date, self.process_type, diff --git a/ccdb/projects/models.py b/ccdb/projects/models.py index 1bfcdf3..f7f5490 100644 --- a/ccdb/projects/models.py +++ b/ccdb/projects/models.py @@ -32,7 +32,8 @@ class Grant(models.Model): class GrantReport(models.Model): - grant = models.ForeignKey(Grant, related_name='reports') + grant = models.ForeignKey(Grant, related_name='reports', + on_delete=models.CASCADE) title = models.CharField(max_length=200) report_type = models.CharField(max_length=50, blank=True) description = models.CharField(max_length=255, blank=True) diff --git a/ccdb/species/models.py b/ccdb/species/models.py index 9954791..fd52285 100644 --- a/ccdb/species/models.py +++ b/ccdb/species/models.py @@ -19,8 +19,10 @@ class Species(models.Model): class TrapSpecies(models.Model): collection_trap = models.ForeignKey('collections_ccdb.CollectionTrap', - related_name='trap_species') - species = models.ForeignKey(Species, related_name='trap_species') + related_name='trap_species', + on_delete=models.CASCADE) + species = models.ForeignKey(Species, related_name='trap_species', + on_delete=models.CASCADE) sex = models.CharField(max_length=25, blank=True) count = models.IntegerField(blank=True, null=True) count_estimated = models.BooleanField(default=False) @@ -34,8 +36,10 @@ class TrapSpecies(models.Model): class CollectionSpecies(models.Model): collection = models.ForeignKey('collections_ccdb.Collection', - related_name='collection_species') - species = models.ForeignKey(Species, related_name='collection_species') + related_name='collection_species', + on_delete=models.CASCADE) + species = models.ForeignKey(Species, related_name='collection_species', + on_delete=models.CASCADE) sex = models.CharField(max_length=25, blank=True) count = models.IntegerField(blank=True, null=True) count_estimated = models.BooleanField(default=False) diff --git a/ccdb/utils/models.py b/ccdb/utils/models.py index 9f2bb42..cedf3d6 100644 --- a/ccdb/utils/models.py +++ b/ccdb/utils/models.py @@ -14,7 +14,7 @@ class AdminSection(models.Model): class AdminEntry(models.Model): package = models.CharField(max_length=255) model = models.CharField(max_length=255) - section = models.ForeignKey(AdminSection) + section = models.ForeignKey(AdminSection, on_delete=models.CASCADE) sort = models.IntegerField() def admin_url(self, request=None): diff --git a/ccdb/utils/tests/test_viewsets.py b/ccdb/utils/tests/test_viewsets.py index 9126b33..a64c589 100644 --- a/ccdb/utils/tests/test_viewsets.py +++ b/ccdb/utils/tests/test_viewsets.py @@ -1,4 +1,4 @@ -from django.core.urlresolvers import reverse +from django.urls import reverse from rest_framework import status from rest_framework.test import APITestCase diff --git a/config/settings/local.py b/config/settings/local.py index 4cefe8b..04e5ed2 100644 --- a/config/settings/local.py +++ b/config/settings/local.py @@ -27,14 +27,6 @@ INTERNAL_IPS = ('127.0.0.1', ) TEST_RUNNER = 'django.test.runner.DiscoverRunner' -# http://stackoverflow.com/a/28560805/313548 -class DisableMigrations(object): - def __contains__(self, item): - return True - - def __getitem__(self, item): - return "notmigrations" - TESTS_IN_PROGRESS = False if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]: logging.disable(logging.CRITICAL) @@ -44,7 +36,8 @@ if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]: DEBUG = False TEMPLATE_DEBUG = False TESTS_IN_PROGRESS = True - MIGRATION_MODULES = DisableMigrations() + MIGRATION_MODULES = {app[app.rfind('.') + 1:]: None + for app in INSTALLED_APPS} MANIFEST_URL = env('MANIFEST_URL', default=None) CORS_ORIGIN_ALLOW_ALL = False diff --git a/config/urls.py b/config/urls.py index caebbaa..6882020 100644 --- a/config/urls.py +++ b/config/urls.py @@ -4,13 +4,13 @@ from django.conf.urls.static import static from django.contrib import admin from django.views.generic import RedirectView from django.views import defaults as default_views -from django.core.urlresolvers import reverse_lazy +from django.urls import reverse_lazy urlpatterns = [ - url(settings.ADMIN_URL, include(admin.site.urls)), + url(settings.ADMIN_URL, admin.site.urls), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), - url(r'^api/', include('ccdb.api.urls', namespace='api')), + url(r'^api/', include('ccdb.api.urls')), url(r'^$', RedirectView.as_view(url=reverse_lazy('admin:index'), permanent=True)), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/requirements/base.txt b/requirements/base.txt index 05a6197..cac1fe3 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ -django==1.10.8 +django==1.11.9 # Configuration django-environ==0.4.1 @@ -17,8 +17,8 @@ python-dateutil==2.5.3 requests==2.11.0 # REST -djangorestframework==3.6.4 +djangorestframework==3.7.7 django-cors-headers==1.3.1 django-filter==1.1 djoser==0.7.0 -djangorestframework-jsonapi==2.1.1 +djangorestframework-jsonapi==2.2.0 diff --git a/requirements/local.txt b/requirements/local.txt index ef3e928..10e0692 100644 --- a/requirements/local.txt +++ b/requirements/local.txt @@ -1,7 +1,7 @@ -r base.txt Werkzeug==0.11.10 -django-extensions==1.7.1 +django-extensions==1.9.9 flake8==3.0.4 pygraphviz==1.3.1 ipython==5.1.0