Skip to content

Commit

Permalink
Revert "Upgrade to django 3.2.6 (#250)" (#263)
Browse files Browse the repository at this point in the history
This reverts commit 01efbdc.
  • Loading branch information
johnbradley authored Nov 5, 2021
1 parent 651e5ec commit 47bef4b
Show file tree
Hide file tree
Showing 21 changed files with 284 additions and 120 deletions.
1 change: 0 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,4 @@ jobs:
- run:
command: |
source venv/bin/activate
DJANGO_SETTINGS_MODULE=d4s2.settings_test python manage.py collectstatic --noinput
DJANGO_SETTINGS_MODULE=d4s2.settings_test python manage.py test
9 changes: 4 additions & 5 deletions d4s2/settings_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@
'background_task',
]

MIDDLEWARE = [
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'simple_history.middleware.HistoryRequestMiddleware',
Expand Down Expand Up @@ -128,7 +128,6 @@
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

# Email
# For development we'll just use the console backend.
Expand Down Expand Up @@ -158,8 +157,8 @@
}

CORS_ORIGIN_WHITELIST = (
'https://localhost:4200',
'https://127.0.0.1:4200',
'localhost:4200',
'127.0.0.1:4200',
)

LOGGING = {
Expand Down
6 changes: 3 additions & 3 deletions d4s2/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
url(r'^api-auth/', include('rest_framework.urls',
namespace='rest_framework')),
url(r'^api-auth-token/', authtoken_views.obtain_auth_token),
url(r'^accounts/login/$', auth_views.LoginView, {'template_name': 'gcb_web_auth/login.html' }, name='login'),
url(r'^accounts/logout/$', auth_views.LogoutView, {'template_name': 'gcb_web_auth/logged_out.html' }, name='logout'),
url(r'^accounts/login-local/$', auth_views.LoginView, {'template_name': 'gcb_web_auth/login-local.html'}, name='login-local'),
url(r'^accounts/login/$', auth_views.login, {'template_name': 'gcb_web_auth/login.html' }, name='login'),
url(r'^accounts/logout/$', auth_views.logout, {'template_name': 'gcb_web_auth/logged_out.html' }, name='logout'),
url(r'^accounts/login-local/$', auth_views.login, {'template_name': 'gcb_web_auth/login-local.html'}, name='login-local'),
# Redirect / to /accounts/login
url(r'^$', RedirectView.as_view(pattern_name='auth-home', permanent=False)),
]
5 changes: 3 additions & 2 deletions d4s2/wsgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
"""

import os
from whitenoise import WhiteNoise

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "d4s2.settings")

application = get_wsgi_application()
application = WhiteNoise(application, root='staticfiles')
application = DjangoWhiteNoise(application)
29 changes: 0 additions & 29 deletions d4s2_api/migrations/0041_auto_20210827_1536.py

This file was deleted.

18 changes: 0 additions & 18 deletions d4s2_api/migrations/0042_alter_s3objectmanifest_content.py

This file was deleted.

3 changes: 2 additions & 1 deletion d4s2_api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

import uuid
from django.db import models
from django.db.models import Q, JSONField
from django.db.models import Q
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError
from django.contrib.auth.models import User, Group
from django.contrib.postgres.fields import JSONField
from simple_history.models import HistoricalRecords
from gcb_web_auth.utils import get_default_oauth_service, current_user_details, OAuthConfigurationException
from gcb_web_auth.models import DDSUserCredential, GroupManagerConnection
Expand Down
247 changes: 247 additions & 0 deletions d4s2_api/test_migrations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,247 @@
"""
Tests migrations that move DukeDS uuids around.
TestMigrations from https://www.caktusgroup.com/blog/2016/02/02/writing-unit-tests-django-migrations/
"""
from django.apps import apps
from django.test import TransactionTestCase
from django.db.migrations.executor import MigrationExecutor
from django.db import connection
from django.contrib.auth.models import Group, User
from django.core.management import call_command


class TestMigrations(TransactionTestCase):
"""
Modifies setUp to migrate to the migration name in `migrate_from` then run `setUpBeforeMigration(apps)`
finally finishes migrating to `migrate_to`. Use app apps.get_model to create model objects.
"""
@property
def app(self):
return apps.get_containing_app_config(type(self).__module__).name

migrate_from = None
migrate_to = None
django_application = 'd4s2_api'

def setUp(self):
assert self.migrate_from and self.migrate_to, \
"TestCase '{}' must define migrate_from and migrate_to properties".format(type(self).__name__)
self.migrate_from = [(self.app, self.migrate_from)]
self.migrate_to = [(self.app, self.migrate_to)]
executor = MigrationExecutor(connection)
old_apps = executor.loader.project_state(self.migrate_from).apps

# Reverse to the original migration
executor.migrate(self.migrate_from)

self.setUpBeforeMigration(old_apps)

# Run the migration to test
executor = MigrationExecutor(connection)
executor.loader.build_graph() # reload.
executor.migrate(self.migrate_to)

self.apps = executor.loader.project_state(self.migrate_to).apps

def setUpBeforeMigration(self, apps):
pass

def tearDown(self):
# Leave the db in the final state so that the test runner doesn't
# error when truncating the database.
# https://micknelson.wordpress.com/2013/03/01/testing-django-migrations/
call_command('migrate', self.django_application, verbosity=0)


class DukeDSIDMigrationTestCase(TestMigrations):
"""
Runs migrations to the point where Delivery/Share had references to DukeDSProject/DukeDSUser
Sets up some sample data. Finishes migrations to where we store the UUIDs instead and runs tests to make sure
the data has successfully migrated.
"""
migrate_from = '0007_delivery_share_to_users'
migrate_to = '0013_1_dds_id_fields_not_null'

def setUpBeforeMigration(self, apps):
Delivery = apps.get_model('d4s2_api', 'Delivery')
DukeDSProject = apps.get_model('d4s2_api', 'DukeDSProject')
DukeDSUser = apps.get_model('d4s2_api', 'DukeDSUser')
project = DukeDSProject.objects.create()

delivery = Delivery.objects.create(
project=DukeDSProject.objects.create(project_id='ab-123'),
from_user=DukeDSUser.objects.create(dds_id='cd-456'),
to_user=DukeDSUser.objects.create(dds_id='ef-789')
)
delivery.share_to_users = [
DukeDSUser.objects.create(dds_id='gh-111'),
DukeDSUser.objects.create(dds_id='ij-222'),
DukeDSUser.objects.create(dds_id='kl-333'),
]
delivery.save()

Share = apps.get_model('d4s2_api', 'Share')
Share.objects.create(
project=DukeDSProject.objects.create(project_id='mn-123'),
from_user=DukeDSUser.objects.create(dds_id='op-456'),
to_user=DukeDSUser.objects.create(dds_id='qr-789')
)

def test_delivery_ids_migrated(self):
Delivery = self.apps.get_model('d4s2_api', 'Delivery')

deliveries = Delivery.objects.all()
self.assertEqual(len(deliveries), 1)
delivery = deliveries[0]
self.assertEqual(delivery.project_id, 'ab-123')
self.assertEqual(delivery.from_user_id, 'cd-456')
self.assertEqual(delivery.to_user_id, 'ef-789')

share_users = delivery.shared_to_users.all()
self.assertEqual(set(['gh-111', 'ij-222', 'kl-333']), set([user.dds_id for user in share_users]))

def test_delivery_ids_migrated(self):
Share = self.apps.get_model('d4s2_api', 'Share')

shares = Share.objects.all()
self.assertEqual(len(shares), 1)
share = shares[0]
self.assertEqual(share.project_id, 'mn-123')
self.assertEqual(share.from_user_id, 'op-456')
self.assertEqual(share.to_user_id, 'qr-789')

def tearDown(self):
# Delete deliveries since the migration that when email_template_set is required
# TestMigrations.tearDown() will not fail in
Delivery = self.apps.get_model('d4s2_api', 'Delivery')
Delivery.objects.all().delete()
Share = self.apps.get_model('d4s2_api', 'Share')
Share.objects.all().delete()
super(DukeDSIDMigrationTestCase, self).tearDown()


class EmailTemplateGroupMigrationTestCase(TestMigrations):
"""
Runs migrations to the point where EmailTemplate has both group and template_set fields.
Sets up some sample EmailTemplates that have group filled in.
Finishes migrations to where only template_set remains.
"""
migrate_from = '0015_auto_20180323_1757'
migrate_to = '0017_auto_20180323_1833'

def setUpBeforeMigration(self, apps):
EmailTemplate = apps.get_model('d4s2_api', 'EmailTemplate')
EmailTemplateType = apps.get_model('d4s2_api', 'EmailTemplateType')

user1 = User.objects.create_user('user1')
group1 = Group.objects.create(name='group1')
group1.user_set.add(user1)

user2 = User.objects.create_user('user2')
group2 = Group.objects.create(name='group2')
group2.user_set.add(user2)

delivery_type = EmailTemplateType.objects.create(name='delivery')
share_project_viewer_type = EmailTemplateType.objects.create(name='share_project_viewer')

# NOTE: Had to assign group and owner by id any other method failed with error message like:
# Cannot assign "<Group: group1>": "EmailTemplate.group" must be a "Group" instance.
EmailTemplate.objects.create(
group_id=group1.id,
owner_id=user1.id,
template_type=delivery_type,
body='some text',
subject='title1',
)
EmailTemplate.objects.create(
group_id=group1.id,
owner_id=user1.id,
template_type=share_project_viewer_type,
body='some text',
subject='title2',
)
EmailTemplate.objects.create(
group_id=group2.id,
owner_id=user2.id,
template_type=delivery_type,
body='some text',
subject='title3',
)

def test_delivery_ids_migrated(self):
"""
The group field should migrated to the template_set.
Testing migration 0016_email_group_to_set.
"""
EmailTemplate = self.apps.get_model('d4s2_api', 'EmailTemplate')
email_templates = EmailTemplate.objects.all()
self.assertEqual(len(email_templates), 3)
template_info = [(email_template.subject, email_template.template_set.name)
for email_template in email_templates]
self.assertEqual({
('title1', 'group1'),
('title2', 'group1'),
('title3', 'group2'),
}, set(template_info))

def test_user_email_template_sets_migrated(self):
UserEmailTemplateSet = self.apps.get_model('d4s2_api', 'UserEmailTemplateSet')
user_email_template_sets = UserEmailTemplateSet.objects.all()
user_email_template_sets_info = [
(user_email_template_set.user.username, user_email_template_set.email_template_set.name)
for user_email_template_set in user_email_template_sets
]
self.assertEqual(set(user_email_template_sets_info),
{('user1', u'group1'), ('user2', u'group2')})


class EmailTemplateServiceNameTest(TestMigrations):
"""
Tests that the string 'Duke Data Service' in email templates is updated to {{ service_name }}
"""

migrate_from = '0024_auto_20180423_2026'
migrate_to = '0025_auto_20180430_1549'

def setUpBeforeMigration(self, apps):
EmailTemplate = apps.get_model('d4s2_api', 'EmailTemplate')
EmailTemplateType = apps.get_model('d4s2_api', 'EmailTemplateType')
EmailTemplateSet = apps.get_model('d4s2_api', 'EmailTemplateSet')

user1 = User.objects.create_user('user1')
type1 = EmailTemplateType.objects.create(name='template_type1')
set1 = EmailTemplateSet.objects.create(name='template_set1')

EmailTemplate.objects.create(
template_set=set1,
owner_id=user1.id,
template_type=type1,
body='Your data in Duke Data Service is ready at {{ accept_url }}.\\r\\nPlease visit Duke Data Service.',
subject='Data from Duke Data Service sent by {{ sender_name }}',
)

def test_name_replaced(self):
EmailTemplate = self.apps.get_model('d4s2_api', 'EmailTemplate')
template = EmailTemplate.objects.first()
self.assertEqual(template.body, 'Your data in {{ service_name }} is ready at {{ accept_url }}.\\r\\nPlease visit {{ service_name }}.')
self.assertEqual(template.subject, 'Data from {{ service_name }} sent by {{ sender_name }}')


class EmailTemplateSetReplyCCAddressesTest(TestMigrations):

migrate_from = '0035_auto_20181226_1613'
migrate_to = '0037_auto_20190306_2008'

def setUpBeforeMigration(self, apps):
EmailTemplateSet = apps.get_model('d4s2_api', 'EmailTemplateSet')
EmailTemplateSet.objects.create(name='template_set1')

def test_defaults_cc_address_blank(self):
EmailTemplateSet = self.apps.get_model('d4s2_api', 'EmailTemplateSet')
template_set = EmailTemplateSet.objects.first()
self.assertEqual(template_set.cc_address, '')

def test_defaults_reply_address_blank(self):
EmailTemplateSet = self.apps.get_model('d4s2_api', 'EmailTemplateSet')
template_set = EmailTemplateSet.objects.first()
self.assertEqual(template_set.reply_address, '')
2 changes: 1 addition & 1 deletion d4s2_api_v1/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from d4s2_api.models import DDSDelivery, Share, State, UserEmailTemplateSet, EmailTemplateSet
from d4s2_api_v1.serializers import DeliverySerializer, ShareSerializer
from switchboard.dds_util import DDSUtil, DDSMessageFactory
from django.urls import reverse
from django.core.urlresolvers import reverse
from django_filters.rest_framework import DjangoFilterBackend
from django.db.models import Q
EMAIL_TEMPLATES_NOT_SETUP_MSG = """Email templates need to be setup for your account.
Expand Down
2 changes: 1 addition & 1 deletion d4s2_api_v1/tests_api.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from django.urls import reverse
from django.core.urlresolvers import reverse
import rest_framework
from rest_framework.test import APITestCase
from mock import patch, Mock, call
Expand Down
Loading

0 comments on commit 47bef4b

Please sign in to comment.