Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Django Upgrade #3123

Merged
merged 15 commits into from
Jul 24, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion deployment/ansible/group_vars/all
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,4 @@ numba_version: "0.38.1"
numpy_version: "1.14.5"
phantomjs_version: "2.1.*"

redis_version: "2:3.0.6-1ubuntu0.3"
redis_version: "2:3.0.6-1ubuntu0.*"
2 changes: 1 addition & 1 deletion scripts/debugserver.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ set -x

vagrant ssh app -c "sudo service mmw-app stop || /bin/true"
vagrant ssh app -c "cd /opt/app/ && envdir /etc/mmw.d/env gunicorn --config /etc/mmw.d/gunicorn.py mmw.wsgi"
vagrant ssh app -c "sudo start mmw-app"
vagrant ssh app -c "sudo service mmw-app start"
14 changes: 7 additions & 7 deletions src/mmw/apps/bigcz/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
from __future__ import unicode_literals
from __future__ import division

from django.conf.urls import patterns, url
from django.conf.urls import url

from apps.bigcz import views

urlpatterns = patterns(
'',
url(r'^search$', views.search, name='bigcz_search'),
url(r'^details$', views.details, name='bigcz_details'),
url(r'^values$', views.values, name='bigcz_values'),
)
app_name = 'bigcz'
urlpatterns = [
url(r'^search$', views.search, name='search'),
url(r'^details$', views.details, name='details'),
url(r'^values$', views.values, name='values'),
]
2 changes: 1 addition & 1 deletion src/mmw/apps/bigcz/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def filter_results(results, aoi, is_pageable):


def _do_search(request):
params = json.loads(request.body)
params = request.data
catalog = params.get('catalog')
page = int(params.get('page', 1))
request_uri = request.build_absolute_uri()
Expand Down
2 changes: 1 addition & 1 deletion src/mmw/apps/core/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def decorator(request, *args, **kwargs):

view_result = view(request, *args, **kwargs)

user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None

response_time = now() - requested_at
response_ms = int(response_time.total_seconds() * 1000)
Expand Down
3 changes: 2 additions & 1 deletion src/mmw/apps/core/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from django.db import models, migrations
from django.conf import settings
import django.db.models.deletion


class Migration(migrations.Migration):
Expand All @@ -24,7 +25,7 @@ class Migration(migrations.Migration):
('error', models.TextField()),
('traceback', models.TextField()),
('status', models.CharField(max_length=255)),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, null=True)),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=django.db.models.deletion.SET_NULL, null=True)),
],
),
]
22 changes: 22 additions & 0 deletions src/mmw/apps/core/migrations/0005_job_on_delete.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.22 on 2019-07-16 16:54
from __future__ import unicode_literals

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('core', '0004_job_uuid_unique_constraint'),
]

operations = [
migrations.AlterField(
model_name='job',
name='user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
),
]
4 changes: 3 additions & 1 deletion src/mmw/apps/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@


class Job(models.Model):
user = models.ForeignKey(AUTH_USER_MODEL, null=True)
user = models.ForeignKey(AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True)
uuid = models.UUIDField(
null=True,
unique=True
Expand Down
3 changes: 2 additions & 1 deletion src/mmw/apps/export/migrations/0001_hydroshareresource.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from __future__ import unicode_literals

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
Expand All @@ -21,7 +22,7 @@ class Migration(migrations.Migration):
('exported_at', models.DateTimeField(help_text='Most recent export date')),
('created_at', models.DateTimeField(auto_now_add=True)),
('modified_at', models.DateTimeField(auto_now=True)),
('project', models.OneToOneField(related_name='hydroshare', to='modeling.Project')),
('project', models.OneToOneField(related_name='hydroshare', to='modeling.Project', on_delete=django.db.models.deletion.CASCADE)),
],
),
]
4 changes: 3 additions & 1 deletion src/mmw/apps/export/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@


class HydroShareResource(models.Model):
project = models.OneToOneField(Project, related_name='hydroshare')
project = models.OneToOneField(Project,
on_delete=models.CASCADE,
related_name='hydroshare')
resource = models.CharField(
max_length=63,
help_text='ID of Resource in HydroShare')
Expand Down
2 changes: 2 additions & 0 deletions src/mmw/apps/export/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,7 @@ class HydroShareResourceSerializer(serializers.ModelSerializer):

class Meta:
model = HydroShareResource
fields = ('id', 'project', 'resource', 'title', 'autosync',
'exported_at', 'created_at', 'modified_at', 'url')

url = serializers.ReadOnlyField()
8 changes: 4 additions & 4 deletions src/mmw/apps/export/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
from __future__ import unicode_literals
from __future__ import division

from django.conf.urls import patterns, url
from django.conf.urls import url

from apps.modeling.views import get_job
from apps.modeling.urls import uuid_regex

from apps.export.views import hydroshare, shapefile

urlpatterns = patterns(
'',
app_name = 'export'
urlpatterns = [
url(r'^hydroshare/?$', hydroshare, name='hydroshare'),
url(r'^shapefile/?$', shapefile, name='shapefile'),
url(r'jobs/' + uuid_regex, get_job, name='get_job'),
)
]
16 changes: 9 additions & 7 deletions src/mmw/apps/geocode/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@
from __future__ import unicode_literals
from __future__ import division

import requests
# NOTE Change to from urllib.parse import urlencode for Python 3
from urllib import urlencode

from django.test import TestCase
from django.test import TestCase, Client
from django.urls import reverse


class GeocodeTestCase(TestCase):
SEARCH_URL = reverse('geocode:geocode')

def assert_candidate_exists_for(self, address):
try:
response = requests.get(
'http://localhost:80/mmw/geocode/?search=%s' % address).json()
except requests.RequestException:
response = {}
c = Client()
url = '{}?{}'.format(self.SEARCH_URL, urlencode({'search': address}))
response = c.get(url).json()

self.assertTrue(len(response) > 0, 'Expected '
'at least 1 candidate in the response')
Expand Down
8 changes: 4 additions & 4 deletions src/mmw/apps/geocode/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
from __future__ import unicode_literals
from __future__ import division

from django.conf.urls import patterns, url
from django.conf.urls import url

from apps.geocode import views

urlpatterns = patterns(
'',
app_name = 'geocode'
urlpatterns = [
url(r'^$', views.geocode, name='geocode'),
)
]
4 changes: 2 additions & 2 deletions src/mmw/apps/geocode/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
@decorators.api_view(['GET'])
@decorators.permission_classes((AllowAny, ))
def geocode(request, format=None):
query = request.REQUEST.get('search', None)
key = request.REQUEST.get('key', None)
query = request.GET.get('search', None)
key = request.GET.get('key', None)
if (not query):
response = Response(data={'error': 'Search parameter is required.'},
status=400)
Expand Down
8 changes: 4 additions & 4 deletions src/mmw/apps/geoprocessing_api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
from __future__ import unicode_literals
from __future__ import division

from django.conf.urls import include, patterns, url
from django.conf.urls import include, url

from apps.modeling.views import get_job
from apps.modeling.urls import uuid_regex
from apps.geoprocessing_api import views


urlpatterns = patterns(
'',
app_name = 'geoprocessing_api'
urlpatterns = [
url(r'^docs/', include('rest_framework_swagger.urls')),
url(r'^token/', views.get_auth_token,
name="authtoken"),
Expand All @@ -34,4 +34,4 @@
name='start_analyze_terrain'),
url(r'jobs/' + uuid_regex, get_job, name='get_job'),
url(r'watershed/$', views.start_rwd, name='start_rwd'),
)
]
26 changes: 14 additions & 12 deletions src/mmw/apps/geoprocessing_api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from rest_framework.authtoken.models import Token

from django.utils.timezone import now
from django.core.urlresolvers import reverse
from django.urls import reverse
from django.conf import settings

from apps.core.models import Job
Expand Down Expand Up @@ -231,7 +231,7 @@ def start_rwd(request, format=None):
produces:
- application/json
"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
created = now()

location = request.data.get('location')
Expand All @@ -255,7 +255,8 @@ def start_rwd(request, format=None):
'job': task_list.id,
'status': 'started',
},
headers={'Location': reverse('get_job', args=[task_list.id])}
headers={'Location': reverse('geoprocessing_api:get_job',
args=[task_list.id])}
)


Expand Down Expand Up @@ -443,7 +444,7 @@ def start_analyze_land(request, format=None):
produces:
- application/json
"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
area_of_interest, wkaoi = _parse_input(request)

geop_input = {'polygon': [area_of_interest]}
Expand Down Expand Up @@ -570,7 +571,7 @@ def start_analyze_soil(request, format=None):
produces:
- application/json
"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
area_of_interest, wkaoi = _parse_input(request)

geop_input = {'polygon': [area_of_interest]}
Expand Down Expand Up @@ -732,7 +733,7 @@ def start_analyze_streams(request, format=None):
- application/json

"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
area_of_interest, wkaoi = _parse_input(request)

return start_celery_job([
Expand Down Expand Up @@ -847,7 +848,7 @@ def start_analyze_animals(request, format=None):
produces:
- application/json
"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
area_of_interest, wkaoi = _parse_input(request)

return start_celery_job([
Expand Down Expand Up @@ -937,7 +938,7 @@ def start_analyze_pointsource(request, format=None):
produces:
- application/json
"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
area_of_interest, wkaoi = _parse_input(request)

return start_celery_job([
Expand Down Expand Up @@ -1056,7 +1057,7 @@ def start_analyze_catchment_water_quality(request, format=None):
produces:
- application/json
"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
area_of_interest, wkaoi = _parse_input(request)

return start_celery_job([
Expand Down Expand Up @@ -1150,7 +1151,7 @@ def start_analyze_climate(request, format=None):
- application/json

"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None

geotasks = []
ppt_raster = settings.GEOP['json']['ppt']['input']['targetRaster']
Expand Down Expand Up @@ -1266,7 +1267,7 @@ def start_analyze_terrain(request, format=None):
produces:
- application/json
"""
user = request.user if request.user.is_authenticated() else None
user = request.user if request.user.is_authenticated else None
area_of_interest, wkaoi = _parse_input(request)

geop_input = {'polygon': [area_of_interest]}
Expand Down Expand Up @@ -1320,7 +1321,8 @@ def start_celery_job(task_list, job_input, user=None, link_error=True):
'job': task_chain.id,
'status': 'started',
},
headers={'Location': reverse('get_job', args=[task_chain.id])}
headers={'Location': reverse('geoprocessing_api:get_job',
args=[task_chain.id])}
)


Expand Down
17 changes: 3 additions & 14 deletions src/mmw/apps/home/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,13 @@
from __future__ import unicode_literals
from __future__ import division

import re

from django.contrib.auth.models import User

from django.test import TestCase

from rest_framework.test import APIClient


def getRoute(url):
"""
Gets relative route from full URL
:param url: Full URL, usually like `http://testserver/projects/`
:return: Relative path, like `/projects/`
"""
return re.search(r'http://.*?(/.*)', url).group(1).strip()


class RouteAccessTestCase(TestCase):
def setUp(self):
self.c = APIClient()
Expand Down Expand Up @@ -58,20 +47,20 @@ def test_anon_user_getting_listing_redirects_to_home(self):
response = self.c.get('/projects/')

self.assertEqual(response.status_code, 302)
self.assertEqual(getRoute(response.url), '/')
self.assertEqual(response.url, '/')

def test_getting_model_route_without_project_id_redirects_to_listing(self):
response = self.c.get('/project/')

self.assertEqual(response.status_code, 302)
self.assertEqual(getRoute(response.url), '/projects/')
self.assertEqual(response.url, '/projects/')

self.c.logout()

response = self.c.get('/project/')

self.assertEqual(response.status_code, 302)
self.assertEqual(getRoute(response.url), '/projects/')
self.assertEqual(response.url, '/projects/')

def test_project_owner_can_get_model_route_with_project_id(self):
project_id = self.create_private_project()
Expand Down
Loading