MAINT: Upgrade to Django 1.11 (#45)

This commit is contained in:
Matthew Ryan Dillon 2018-01-25 06:51:32 -07:00 committed by GitHub
parent 17899ad7c7
commit a482019a81
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 101 additions and 67 deletions

View file

@ -38,11 +38,12 @@ router.register(r'species', species_viewsets.SpeciesViewSet)
router.register(r'collection-species', router.register(r'collection-species',
species_viewsets.CollectionSpeciesViewSet) species_viewsets.CollectionSpeciesViewSet)
app_name = 'api'
urlpatterns = [ urlpatterns = [
url(r'^auth/login/', api_v.Login.as_view()), url(r'^auth/login/', api_v.Login.as_view()),
url(r'^auth/password/reset/confirm/', url(r'^auth/password/reset/confirm/',
api_v.PasswordResetConfirm.as_view()), api_v.PasswordResetConfirm.as_view()),
url(r'^auth/password/reset/', api_v.PasswordReset.as_view()), url(r'^auth/password/reset/', api_v.PasswordReset.as_view()),
url(r'^auth/', include('djoser.urls.authtoken')), 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')),
] ]

View file

@ -9,43 +9,43 @@ from ccdb.species.models import Species
class CollectionFilter(filters.FilterSet): class CollectionFilter(filters.FilterSet):
project = ModelMultipleChoiceFilter( project = ModelMultipleChoiceFilter(
name='project__id', field_name='project__id',
to_field_name='id', to_field_name='id',
queryset=Project.objects.all(), queryset=Project.objects.all(),
) )
region = ModelMultipleChoiceFilter( region = ModelMultipleChoiceFilter(
name='study_location__site__region__id', field_name='study_location__site__region__id',
to_field_name='id', to_field_name='id',
queryset=Region.objects.all(), queryset=Region.objects.all(),
) )
site = ModelMultipleChoiceFilter( site = ModelMultipleChoiceFilter(
name='study_location__site__id', field_name='study_location__site__id',
to_field_name='id', to_field_name='id',
queryset=Site.objects.all(), queryset=Site.objects.all(),
) )
study_location = ModelMultipleChoiceFilter( study_location = ModelMultipleChoiceFilter(
name='study_location__id', field_name='study_location__id',
to_field_name='id', to_field_name='id',
queryset=StudyLocation.objects.all(), queryset=StudyLocation.objects.all(),
) )
collection_method = ModelMultipleChoiceFilter( collection_method = ModelMultipleChoiceFilter(
name='collection_method__id', field_name='collection_method__id',
to_field_name='id', to_field_name='id',
queryset=CollectionMethod.objects.all(), queryset=CollectionMethod.objects.all(),
) )
adfg_permit = ModelMultipleChoiceFilter( adfg_permit = ModelMultipleChoiceFilter(
name='adfg_permit__id', field_name='adfg_permit__id',
to_field_name='id', to_field_name='id',
queryset=ADFGPermit.objects.all(), queryset=ADFGPermit.objects.all(),
) )
species = ModelMultipleChoiceFilter( species = ModelMultipleChoiceFilter(
name='collection_species__species__id', field_name='collection_species__species__id',
to_field_name='id', to_field_name='id',
queryset=Species.objects.all(), queryset=Species.objects.all(),
) )

View file

@ -56,13 +56,17 @@ class ADFGPermit(models.Model):
class Collection(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', study_location = models.ForeignKey('locations.StudyLocation',
related_name='collections') related_name='collections',
on_delete=models.CASCADE)
collection_type = models.ForeignKey(CollectionType, collection_type = models.ForeignKey(CollectionType,
related_name='collections') related_name='collections',
on_delete=models.CASCADE)
collection_method = models.ForeignKey(CollectionMethod, collection_method = models.ForeignKey(CollectionMethod,
related_name='collections') related_name='collections',
on_delete=models.CASCADE)
number_of_traps = models.IntegerField(blank=True, null=True) number_of_traps = models.IntegerField(blank=True, null=True)
collection_start_date = models.DateField(blank=True, null=True) collection_start_date = models.DateField(blank=True, null=True)
collection_start_time = models.TimeField(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) notes = models.TextField(blank=True, null=False)
storage_location = models.ForeignKey('locations.StorageLocation', storage_location = models.ForeignKey('locations.StorageLocation',
blank=True, null=True, blank=True, null=True,
related_name='collections') related_name='collections',
on_delete=models.CASCADE)
specimen_state = models.CharField(max_length=50, blank=True) specimen_state = models.CharField(max_length=50, blank=True)
process_type = models.ForeignKey('processing.ProcessType', 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, 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, 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, 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) display_name = models.CharField(max_length=255, editable=False)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -101,13 +110,15 @@ class Collection(models.Model):
class DatasheetAttachment(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", datasheet = models.FileField("Datasheet",
upload_to='collections/datasheets/%Y/%m/%d') upload_to='collections/datasheets/%Y/%m/%d')
class CollectionTrap(models.Model): 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() number_of_traps = models.IntegerField()
date_opened = models.DateField() date_opened = models.DateField()
time_opened = models.TimeField() time_opened = models.TimeField()
@ -126,7 +137,8 @@ class CollectionTrap(models.Model):
class CollectionMeasurement(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() date_measured = models.DateField()
time_measured = models.TimeField() time_measured = models.TimeField()
water_temp_c = models.FloatField(null=True) water_temp_c = models.FloatField(null=True)

View file

@ -18,7 +18,8 @@ class Experiment(models.Model):
code = models.CharField(max_length=10, blank=True) code = models.CharField(max_length=10, blank=True)
description = models.CharField(max_length=255, blank=True) description = models.CharField(max_length=255, blank=True)
flaw = models.ForeignKey(Flaw, blank=True, null=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) sort_order = models.IntegerField(blank=True, null=True)
collections = models.ManyToManyField('collections_ccdb.Collection') collections = models.ManyToManyField('collections_ccdb.Collection')
@ -31,7 +32,8 @@ class Experiment(models.Model):
class ProtocolAttachment(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') protocol = models.FileField(upload_to='experiments/protocols/%Y/%m/%d')
def __str__(self): def __str__(self):
@ -40,7 +42,8 @@ class ProtocolAttachment(models.Model):
class TreatmentType(models.Model): class TreatmentType(models.Model):
experiment = models.ForeignKey(Experiment, blank=True, null=True, 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) name = models.CharField(max_length=200)
code = models.CharField(max_length=25, blank=True) code = models.CharField(max_length=25, blank=True)
treatment_type = models.CharField(max_length=50, blank=True) treatment_type = models.CharField(max_length=50, blank=True)
@ -65,15 +68,20 @@ class TreatmentType(models.Model):
class Treatment(models.Model): class Treatment(models.Model):
treatment_type = models.ForeignKey(TreatmentType, treatment_type = models.ForeignKey(TreatmentType,
related_name='treatments') related_name='treatments',
on_delete=models.CASCADE)
container = models.ForeignKey('misc.Container', blank=True, null=True, 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', study_location = models.ForeignKey('locations.StudyLocation',
related_name='treatments') related_name='treatments',
species = models.ForeignKey('species.Species', 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) sex = models.CharField(max_length=25)
flaw = models.ForeignKey(Flaw, blank=True, null=True, 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) display_name = models.CharField(max_length=255, editable=False)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -93,14 +101,16 @@ class Treatment(models.Model):
class TreatmentReplicate(models.Model): class TreatmentReplicate(models.Model):
treatment = models.ForeignKey(Treatment, treatment = models.ForeignKey(Treatment,
related_name='treatment_replicates') related_name='treatment_replicates',
on_delete=models.CASCADE)
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
setup_date = models.DateField(blank=True, null=True) setup_date = models.DateField(blank=True, null=True)
setup_time = models.TimeField(blank=True, null=True) setup_time = models.TimeField(blank=True, null=True)
setup_sample_size = models.IntegerField(blank=True, null=True) setup_sample_size = models.IntegerField(blank=True, null=True)
mass_g = models.FloatField(blank=True, null=True) mass_g = models.FloatField(blank=True, null=True)
flaw = models.ForeignKey(Flaw, 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) display_name = models.CharField(max_length=255, editable=False)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -118,13 +128,15 @@ class TreatmentReplicate(models.Model):
class AliveDeadCount(models.Model): class AliveDeadCount(models.Model):
treatment_replicate = models.ForeignKey(TreatmentReplicate, treatment_replicate = models.ForeignKey(TreatmentReplicate,
related_name='alive_dead_counts') related_name='alive_dead_counts',
on_delete=models.CASCADE)
status_date = models.DateField() status_date = models.DateField()
status_time = models.TimeField(blank=True, null=True) status_time = models.TimeField(blank=True, null=True)
count_alive = models.IntegerField(blank=True, null=True) count_alive = models.IntegerField(blank=True, null=True)
count_dead = models.IntegerField(blank=True, null=True) count_dead = models.IntegerField(blank=True, null=True)
flaw = models.ForeignKey(Flaw, 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): def __str__(self):
return "{}".format(self.status_date) return "{}".format(self.status_date)

View file

@ -16,7 +16,7 @@ class Region(models.Model):
class Site(models.Model): class Site(models.Model):
region = models.ForeignKey(Region, blank=True, null=True, region = models.ForeignKey(Region, blank=True, null=True,
related_name='sites') related_name='sites', on_delete=models.CASCADE)
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
code = models.CharField(max_length=10, blank=True) code = models.CharField(max_length=10, blank=True)
description = models.CharField(max_length=255, blank=True) description = models.CharField(max_length=255, blank=True)
@ -46,14 +46,16 @@ class MunicipalLocation(models.Model):
class StudyLocation(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) name = models.CharField(max_length=100)
code = models.CharField(max_length=10) code = models.CharField(max_length=10)
study_location_type = models.CharField(max_length=50, blank=True) study_location_type = models.CharField(max_length=50, blank=True)
treatment_type = models.CharField(max_length=100, blank=True) treatment_type = models.CharField(max_length=100, blank=True)
municipal_location = models.ForeignKey(MunicipalLocation, municipal_location = models.ForeignKey(MunicipalLocation,
blank=True, null=True, blank=True, null=True,
related_name='study_locations') related_name='study_locations',
on_delete=models.CASCADE)
collecting_location = models.BooleanField(default=False) collecting_location = models.BooleanField(default=False)
description = models.CharField(max_length=255, blank=True) description = models.CharField(max_length=255, blank=True)
sort_order = models.IntegerField(blank=True, null=True) sort_order = models.IntegerField(blank=True, null=True)

View file

@ -25,7 +25,8 @@ class MeasurementType(models.Model):
'MeasurementUnit', 'MeasurementUnit',
blank=True, blank=True,
null=True, null=True,
related_name='measurement_types' related_name='measurement_types',
on_delete=models.CASCADE,
) )
sort_order = models.IntegerField(blank=True, null=True) sort_order = models.IntegerField(blank=True, null=True)
@ -71,12 +72,15 @@ class Container(models.Model):
code = models.CharField(max_length=10, blank=True) code = models.CharField(max_length=10, blank=True)
application = models.CharField(max_length=50, blank=True) application = models.CharField(max_length=50, blank=True)
color = models.ForeignKey(Color, blank=True, null=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, 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) volume = models.FloatField(blank=True, null=True)
measurement_unit = models.ForeignKey(MeasurementUnit, blank=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) sort_order = models.IntegerField(blank=True, null=True)
def __str__(self): def __str__(self):

View file

@ -42,19 +42,24 @@ class Flaw(models.Model):
class Processing(models.Model): class Processing(models.Model):
process_type = models.ForeignKey(ProcessType, related_name='processings') process_type = models.ForeignKey(ProcessType, related_name='processings',
container = models.ForeignKey('misc.Container', 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) container_label = models.CharField(max_length=50)
process_date = models.DateField(blank=True, null=True) process_date = models.DateField(blank=True, null=True)
process_time = models.TimeField(blank=True, null=True) process_time = models.TimeField(blank=True, null=True)
reagent = models.ForeignKey(Reagent, 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) reagent_volume = models.FloatField(blank=True, null=True)
measurement_unit = models.ForeignKey('misc.MeasurementUnit', blank=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) minutes_in_reagent = models.IntegerField(blank=True, null=True)
flaw = models.ForeignKey(Flaw, 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): def __str__(self):
return "{} {} {}".format(self.process_date, self.process_type, return "{} {} {}".format(self.process_date, self.process_type,

View file

@ -32,7 +32,8 @@ class Grant(models.Model):
class GrantReport(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) title = models.CharField(max_length=200)
report_type = models.CharField(max_length=50, blank=True) report_type = models.CharField(max_length=50, blank=True)
description = models.CharField(max_length=255, blank=True) description = models.CharField(max_length=255, blank=True)

View file

@ -19,8 +19,10 @@ class Species(models.Model):
class TrapSpecies(models.Model): class TrapSpecies(models.Model):
collection_trap = models.ForeignKey('collections_ccdb.CollectionTrap', collection_trap = models.ForeignKey('collections_ccdb.CollectionTrap',
related_name='trap_species') related_name='trap_species',
species = models.ForeignKey(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) sex = models.CharField(max_length=25, blank=True)
count = models.IntegerField(blank=True, null=True) count = models.IntegerField(blank=True, null=True)
count_estimated = models.BooleanField(default=False) count_estimated = models.BooleanField(default=False)
@ -34,8 +36,10 @@ class TrapSpecies(models.Model):
class CollectionSpecies(models.Model): class CollectionSpecies(models.Model):
collection = models.ForeignKey('collections_ccdb.Collection', collection = models.ForeignKey('collections_ccdb.Collection',
related_name='collection_species') related_name='collection_species',
species = models.ForeignKey(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) sex = models.CharField(max_length=25, blank=True)
count = models.IntegerField(blank=True, null=True) count = models.IntegerField(blank=True, null=True)
count_estimated = models.BooleanField(default=False) count_estimated = models.BooleanField(default=False)

View file

@ -14,7 +14,7 @@ class AdminSection(models.Model):
class AdminEntry(models.Model): class AdminEntry(models.Model):
package = models.CharField(max_length=255) package = models.CharField(max_length=255)
model = 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() sort = models.IntegerField()
def admin_url(self, request=None): def admin_url(self, request=None):

View file

@ -1,4 +1,4 @@
from django.core.urlresolvers import reverse from django.urls import reverse
from rest_framework import status from rest_framework import status
from rest_framework.test import APITestCase from rest_framework.test import APITestCase

View file

@ -27,14 +27,6 @@ INTERNAL_IPS = ('127.0.0.1', )
TEST_RUNNER = 'django.test.runner.DiscoverRunner' 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 TESTS_IN_PROGRESS = False
if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]: if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
logging.disable(logging.CRITICAL) logging.disable(logging.CRITICAL)
@ -44,7 +36,8 @@ if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
DEBUG = False DEBUG = False
TEMPLATE_DEBUG = False TEMPLATE_DEBUG = False
TESTS_IN_PROGRESS = True 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) MANIFEST_URL = env('MANIFEST_URL', default=None)
CORS_ORIGIN_ALLOW_ALL = False CORS_ORIGIN_ALLOW_ALL = False

View file

@ -4,13 +4,13 @@ from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
from django.views.generic import RedirectView from django.views.generic import RedirectView
from django.views import defaults as default_views from django.views import defaults as default_views
from django.core.urlresolvers import reverse_lazy from django.urls import reverse_lazy
urlpatterns = [ urlpatterns = [
url(settings.ADMIN_URL, include(admin.site.urls)), url(settings.ADMIN_URL, admin.site.urls),
url(r'^api-auth/', include('rest_framework.urls', url(r'^api-auth/', include('rest_framework.urls',
namespace='rest_framework')), 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'), url(r'^$', RedirectView.as_view(url=reverse_lazy('admin:index'),
permanent=True)), permanent=True)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View file

@ -1,4 +1,4 @@
django==1.10.8 django==1.11.9
# Configuration # Configuration
django-environ==0.4.1 django-environ==0.4.1
@ -17,8 +17,8 @@ python-dateutil==2.5.3
requests==2.11.0 requests==2.11.0
# REST # REST
djangorestframework==3.6.4 djangorestframework==3.7.7
django-cors-headers==1.3.1 django-cors-headers==1.3.1
django-filter==1.1 django-filter==1.1
djoser==0.7.0 djoser==0.7.0
djangorestframework-jsonapi==2.1.1 djangorestframework-jsonapi==2.2.0

View file

@ -1,7 +1,7 @@
-r base.txt -r base.txt
Werkzeug==0.11.10 Werkzeug==0.11.10
django-extensions==1.7.1 django-extensions==1.9.9
flake8==3.0.4 flake8==3.0.4
pygraphviz==1.3.1 pygraphviz==1.3.1
ipython==5.1.0 ipython==5.1.0