Skip to content

Commit

Permalink
Django 4/5 (#1026)
Browse files Browse the repository at this point in the history
* passes tests with django 3.2, 4.2, and 5.0

remove recaptcha from templating (not used by django_recaptcha)

flexibly pin django

make use of CONDA_BUILD_PIN_LEVEL env variable in CI

* Fix test

---------

Co-authored-by: Gronka <mr.gronka@gmail.com>
  • Loading branch information
sdc50 and gronka committed Apr 5, 2024
1 parent 86d955a commit cf6ebe6
Show file tree
Hide file tree
Showing 23 changed files with 163 additions and 354 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/tethys-release.yml
Expand Up @@ -137,7 +137,7 @@ jobs:
cd ..
. ~/miniconda/etc/profile.d/conda.sh;
conda activate tethys;
tethys gen metayaml -p minor --overwrite;
tethys gen metayaml -p ${CONDA_BUILD_PIN_LEVEL} --overwrite;
# Show Tethys Meta
- name: Show Tethys Meta
run: |
Expand Down Expand Up @@ -179,7 +179,7 @@ jobs:
cd ..
. ~/miniconda/etc/profile.d/conda.sh;
conda activate tethys;
tethys gen metayaml -p minor --micro --overwrite;
tethys gen metayaml -p ${CONDA_BUILD_PIN_LEVEL} --micro --overwrite;
# Show Tethys Meta
- name: Show Tethys Meta - micro
run: |
Expand Down
12 changes: 6 additions & 6 deletions environment.yml
Expand Up @@ -13,16 +13,16 @@ channels:
- conda-forge

dependencies:
- python
- python>=3.8

# system dependencies
- pyopenssl
- openssl

# core dependencies
- django=3.2.*
- channels=3.*
- daphne=3.*
- django>=3.2,<6
- channels
- daphne
- setuptools_scm
- pip
- requests # required by lots of things
Expand Down Expand Up @@ -50,9 +50,9 @@ dependencies:
- django-gravatar2
- django-simple-captcha
- django-mfa2
- django-recaptcha2
- django-recaptcha
- social-auth-app-django
- hs_restclient # Used with HydroShare Socail backend
- hs_restclient # Used with HydroShare Social backend
- python-jose # required by django-mfa2 - used for onelogin backend
- django-oauth-toolkit

Expand Down
8 changes: 4 additions & 4 deletions micro_environment.yml
Expand Up @@ -12,16 +12,16 @@ channels:
- conda-forge

dependencies:
- python
- python>=3.8

# system dependencies
- pyopenssl
- openssl

# core dependencies
- django=3.2.*
- channels=3.*
- daphne=3.*
- django>=3.2,<6
- channels
- daphne
- setuptools_scm
- pip
- requests # required by lots of things
Expand Down
1 change: 1 addition & 0 deletions tests/unit_tests/test_tethys_apps/test_admin.py
Expand Up @@ -370,6 +370,7 @@ def test_admin_site_register_custom_user(self, mock_ua_change_view):

ret = CustomUser(mock.MagicMock(), mock.MagicMock())

ret.inlines = tuple(ret.inlines) # inlines is sometimes a tuple in django 4
# Add custom inline when change_view is called
ret.change_view(mock.MagicMock())
mock_ua_change_view.assert_called()
Expand Down
36 changes: 15 additions & 21 deletions tests/unit_tests/test_tethys_apps/test_urls.py
Expand Up @@ -15,35 +15,32 @@ def test_urls(self):
url = reverse("app_library")
resolver = resolve(url)
self.assertEqual("/apps/", url)
self.assertEqual("library", resolver.func.__name__)
self.assertEqual("tethys_apps.views", resolver.func.__module__)
self.assertEqual("tethys_apps.views.library", resolver._func_path)

url = reverse("send_beta_feedback")
resolver = resolve(url)
self.assertEqual("/apps/send-beta-feedback/", url)
self.assertEqual("send_beta_feedback_email", resolver.func.__name__)
self.assertEqual("tethys_apps.views", resolver.func.__module__)
self.assertEqual(
"tethys_apps.views.send_beta_feedback_email", resolver._func_path
)

url = reverse("test_app:home")
resolver = resolve(url)
self.assertEqual("/apps/test-app/", url)
self.assertEqual("home", resolver.func.__name__)
self.assertEqual("tethysapp.test_app.controllers", resolver.func.__module__)
self.assertEqual("tethysapp.test_app.controllers.home", resolver._func_path)

url = reverse("test_extension:home", kwargs={"var1": "foo", "var2": "bar"})
resolver = resolve(url)
self.assertEqual("/extensions/test-extension/foo/bar/", url)
self.assertEqual("home", resolver.func.__name__)
self.assertEqual(
"tethysext.test_extension.controllers", resolver.func.__module__
"tethysext.test_extension.controllers.home", resolver._func_path
)

url = reverse("test_extension:home", args=["foo", "bar"])
resolver = resolve(url)
self.assertEqual("/extensions/test-extension/foo/bar/", url)
self.assertEqual("home", resolver.func.__name__)
self.assertEqual(
"tethysext.test_extension.controllers", resolver.func.__module__
"tethysext.test_extension.controllers.home", resolver._func_path
)


Expand Down Expand Up @@ -80,35 +77,32 @@ def test_urls(self):
url = reverse("app_library")
resolver = resolve(url)
self.assertEqual("/test/prefix/apps/", url)
self.assertEqual("library", resolver.func.__name__)
self.assertEqual("tethys_apps.views", resolver.func.__module__)
self.assertEqual("tethys_apps.views.library", resolver._func_path)

url = reverse("send_beta_feedback")
resolver = resolve(url)
self.assertEqual("/test/prefix/apps/send-beta-feedback/", url)
self.assertEqual("send_beta_feedback_email", resolver.func.__name__)
self.assertEqual("tethys_apps.views", resolver.func.__module__)
self.assertEqual(
"tethys_apps.views.send_beta_feedback_email", resolver._func_path
)

url = reverse("test_app:home")
resolver = resolve(url)
self.assertEqual("/test/prefix/apps/test-app/", url)
self.assertEqual("home", resolver.func.__name__)
self.assertEqual("tethysapp.test_app.controllers", resolver.func.__module__)
self.assertEqual("tethysapp.test_app.controllers.home", resolver._func_path)

url = reverse("test_extension:home", kwargs={"var1": "foo", "var2": "bar"})
resolver = resolve(url)
self.assertEqual("/test/prefix/extensions/test-extension/foo/bar/", url)
self.assertEqual("home", resolver.func.__name__)
self.assertEqual(
"tethysext.test_extension.controllers", resolver.func.__module__
"tethysext.test_extension.controllers.home", resolver._func_path
)

url = reverse("test_extension:home", args=["foo", "bar"])
resolver = resolve(url)
self.assertEqual("/test/prefix/extensions/test-extension/foo/bar/", url)
self.assertEqual("home", resolver.func.__name__)
self.assertEqual(
"tethysext.test_extension.controllers", resolver.func.__module__
"tethysext.test_extension.controllers.home", resolver._func_path
)


Expand Down Expand Up @@ -150,7 +144,7 @@ def test_urls(self):
url = reverse("app_library")
resolver = resolve(url)
self.assertEqual("/apps/", url)
self.assertEqual("RedirectView", resolver.func.__name__)
self.assertEqual("django.views.generic.base.RedirectView", resolver._func_path)
self.assertEqual("home", resolver.func.view_initkwargs["pattern_name"])

url = reverse("send_beta_feedback")
Expand Down
Expand Up @@ -51,6 +51,11 @@ def test_init(self):
# Check return vanilla Django base
self.assertEqual("vanilla", ret.attributes["universe"])

def test_init_args_kwargs(self):
args = (99, {"foo": "bar"})
kwargs = dict(condorpy_template_name="vanilla_base")
self.assertRaises(ValueError, CondorPyJob, *args, **kwargs)

def test_get_condorpy_template(self):
ret = CondorPyJob.get_condorpy_template("vanilla_base")

Expand Down
26 changes: 10 additions & 16 deletions tests/unit_tests/test_tethys_gizmos/test_urls.py
Expand Up @@ -14,39 +14,36 @@ def test_ajax_urls_delete_job(self):
url = reverse("gizmos:delete_job", kwargs={"job_id": "123"})
resolver = resolve(url)
self.assertEqual("/developer/gizmos/ajax/123/action/delete", url)
self.assertEqual("delete", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.delete", resolver._func_path
)
self.assertEqual("gizmos", resolver.namespaces[0])

def test_ajax_urls_update_job_row(self):
url = reverse("gizmos:update_job_row", kwargs={"job_id": "123"})
resolver = resolve(url)
self.assertEqual("/developer/gizmos/ajax/123/update-row", url)
self.assertEqual("update_row", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.update_row", resolver._func_path
)
self.assertEqual("gizmos", resolver.namespaces[0])

def test_ajax_urls_update_workflow_nodes_row(self):
url = reverse("gizmos:update_workflow_nodes_row", kwargs={"job_id": "123"})
resolver = resolve(url)
self.assertEqual("/developer/gizmos/ajax/123/update-workflow-nodes-row", url)
self.assertEqual("update_workflow_nodes_row", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.update_workflow_nodes_row",
resolver._func_path,
)
self.assertEqual("gizmos", resolver.namespaces[0])

def test_ajax_urls_bokeh_row(self):
url = reverse("gizmos:bokeh_row", kwargs={"job_id": "123", "type": "test"})
resolver = resolve(url)
self.assertEqual("/developer/gizmos/ajax/123/test/insert-bokeh-row", url)
self.assertEqual("bokeh_row", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.bokeh_row", resolver._func_path
)
self.assertEqual("gizmos", resolver.namespaces[0])

Expand Down Expand Up @@ -82,19 +79,17 @@ def test_ajax_urls_delete_job(self):
url = reverse("gizmos:delete_job", kwargs={"job_id": "123"})
resolver = resolve(url)
self.assertEqual("/test/prefix/developer/gizmos/ajax/123/action/delete", url)
self.assertEqual("delete", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.delete", resolver._func_path
)
self.assertEqual("gizmos", resolver.namespaces[0])

def test_ajax_urls_update_job_row(self):
url = reverse("gizmos:update_job_row", kwargs={"job_id": "123"})
resolver = resolve(url)
self.assertEqual("/test/prefix/developer/gizmos/ajax/123/update-row", url)
self.assertEqual("update_row", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.update_row", resolver._func_path
)
self.assertEqual("gizmos", resolver.namespaces[0])

Expand All @@ -104,9 +99,9 @@ def test_ajax_urls_update_workflow_nodes_row(self):
self.assertEqual(
"/test/prefix/developer/gizmos/ajax/123/update-workflow-nodes-row", url
)
self.assertEqual("update_workflow_nodes_row", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.update_workflow_nodes_row",
resolver._func_path,
)
self.assertEqual("gizmos", resolver.namespaces[0])

Expand All @@ -116,8 +111,7 @@ def test_ajax_urls_bokeh_row(self):
self.assertEqual(
"/test/prefix/developer/gizmos/ajax/123/test/insert-bokeh-row", url
)
self.assertEqual("bokeh_row", resolver.func.__name__)
self.assertEqual(
"tethys_gizmos.views.gizmos.jobs_table", resolver.func.__module__
"tethys_gizmos.views.gizmos.jobs_table.bokeh_row", resolver._func_path
)
self.assertEqual("gizmos", resolver.namespaces[0])
7 changes: 2 additions & 5 deletions tests/unit_tests/test_tethys_portal/test_forms.py
@@ -1,4 +1,3 @@
import os
from importlib import reload
from django.test import TestCase
from captcha.models import CaptchaStore
Expand Down Expand Up @@ -80,8 +79,8 @@ def test_LoginForm_simple_captcha(self):
login_form = tp_forms.LoginForm(login_data)
self.assertTrue(login_form.is_valid())

def test_LoginForm_recaptcha(self):
os.environ["RECAPTCHA_DISABLE"] = "True"
@mock.patch("django_recaptcha.fields.ReCaptchaField.validate")
def test_LoginForm_recaptcha(self, _):
login_data = {"username": "admin", "password": "test1231"}

with self.settings(
Expand All @@ -93,8 +92,6 @@ def test_LoginForm_recaptcha(self):
login_form = tp_forms.LoginForm(login_data)
self.assertTrue(login_form.is_valid())

del os.environ["RECAPTCHA_DISABLE"]

def test_LoginForm_invalid_username(self):
login_data = {
"username": "$!admin",
Expand Down

0 comments on commit cf6ebe6

Please sign in to comment.