diff --git a/bin/run-django.sh b/bin/run-django.sh index ca6177ca7..25fca6310 100755 --- a/bin/run-django.sh +++ b/bin/run-django.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash # run django dev server as designsafe community account -python manage.py runserver 0.0.0.0:8000 +python -m debugpy --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000 diff --git a/designsafe/apps/accounts/forms.py b/designsafe/apps/accounts/forms.py index 85feca7a7..22a72ae1f 100644 --- a/designsafe/apps/accounts/forms.py +++ b/designsafe/apps/accounts/forms.py @@ -3,7 +3,7 @@ from django import forms from django.contrib.auth import get_user_model from django.urls import reverse -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.utils.safestring import mark_safe from django.utils.html import escape from snowpenguin.django.recaptcha2.fields import ReCaptchaField diff --git a/designsafe/apps/accounts/models.py b/designsafe/apps/accounts/models.py index aedc88990..bf4b812dd 100644 --- a/designsafe/apps/accounts/models.py +++ b/designsafe/apps/accounts/models.py @@ -1,7 +1,7 @@ from django.conf import settings from django.db import models from django.db import connections, DatabaseError -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.core.mail import send_mail import logging import six diff --git a/designsafe/apps/accounts/urls.py b/designsafe/apps/accounts/urls.py index 70e0caf3a..be8930ae0 100644 --- a/designsafe/apps/accounts/urls.py +++ b/designsafe/apps/accounts/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.accounts import views urlpatterns = [ diff --git a/designsafe/apps/accounts/views.py b/designsafe/apps/accounts/views.py index 2385c8ff0..b730b75aa 100644 --- a/designsafe/apps/accounts/views.py +++ b/designsafe/apps/accounts/views.py @@ -6,7 +6,7 @@ from django.urls import reverse from django.db.models import Q from django.http import HttpResponse, HttpResponseRedirect -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.accounts import forms, integrations from designsafe.apps.accounts.models import (NEESUser, DesignSafeProfile, NotificationPreferences) diff --git a/designsafe/apps/api/datafiles/urls.py b/designsafe/apps/api/datafiles/urls.py index 4f7aec12d..68d85d93c 100644 --- a/designsafe/apps/api/datafiles/urls.py +++ b/designsafe/apps/api/datafiles/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.api.datafiles.views import DataFilesView, TransferFilesView, MicrosurveyView urlpatterns = [ diff --git a/designsafe/apps/api/licenses/urls.py b/designsafe/apps/api/licenses/urls.py index 2bf5718cf..83be3bd97 100644 --- a/designsafe/apps/api/licenses/urls.py +++ b/designsafe/apps/api/licenses/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.api.licenses.views import LicenseView urlpatterns = [ diff --git a/designsafe/apps/api/notifications/signals.py b/designsafe/apps/api/notifications/signals.py index eb4215236..cf2aaae36 100644 --- a/designsafe/apps/api/notifications/signals.py +++ b/designsafe/apps/api/notifications/signals.py @@ -1,4 +1,4 @@ from django.dispatch import Signal -ds_event = Signal(providing_args=['session_id', 'event_type', 'event_data']) -generic_event = Signal(providing_args=['event_type', 'event_data', 'event_users']) +ds_event = Signal() +generic_event = Signal() diff --git a/designsafe/apps/api/notifications/urls.py b/designsafe/apps/api/notifications/urls.py index d9afa5ba0..6bdd3f0de 100644 --- a/designsafe/apps/api/notifications/urls.py +++ b/designsafe/apps/api/notifications/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import include, url +from django.urls import re_path as url from designsafe.apps.api.notifications.views.api import ManageNotificationsView, NotificationsBadgeView from designsafe.apps.api.notifications.views.webhooks import JobsWebhookView, FilesWebhookView diff --git a/designsafe/apps/api/projects/urls.py b/designsafe/apps/api/projects/urls.py index a65bf7c3c..7c3de86b5 100644 --- a/designsafe/apps/api/projects/urls.py +++ b/designsafe/apps/api/projects/urls.py @@ -10,7 +10,7 @@ More specific action should live in the body. """ -from django.conf.urls import url, include +from django.urls import re_path as url from designsafe.apps.api.projects.views import (ProjectListingView, ProjectCollectionView, ProjectDataView, diff --git a/designsafe/apps/api/projects/views.py b/designsafe/apps/api/projects/views.py index 8ace83d5e..305a0ef1a 100644 --- a/designsafe/apps/api/projects/views.py +++ b/designsafe/apps/api/projects/views.py @@ -96,7 +96,7 @@ def post(self, request, **kwargs): """ Publish a project or version a publication """ - if request.is_ajax(): + if request.headers.get('x-requested-with') == 'XMLHttpRequest': data = json.loads(request.body) else: data = request.POST @@ -173,7 +173,7 @@ def put(self, request, **kwargs): """ Amend a Publication """ - if request.is_ajax(): + if request.headers.get('x-requested-with') == 'XMLHttpRequest': data = json.loads(request.body) else: data = request.PUT @@ -289,7 +289,7 @@ def post(self, request): # portal service account needs to create the objects on behalf of the user sa_client = get_service_account_client() - if request.is_ajax(): + if request.headers.get('x-requested-with') == 'XMLHttpRequest': post_data = json.loads(request.body) else: post_data = request.POST.copy() @@ -449,7 +449,7 @@ def post(self, request, project_id): should be prevented anyways). Once that data is deleted, then we should update the type of project. """ - if request.is_ajax(): + if request.headers.get('x-requested-with') == 'XMLHttpRequest': post_data = json.loads(request.body) else: post_data = request.POST.copy() @@ -606,7 +606,7 @@ def post(self, request, project_id, name): """ sa_client = get_service_account_client() - if request.is_ajax(): + if request.headers.get('x-requested-with') == 'XMLHttpRequest': post_data = json.loads(request.body) else: post_data = request.POST.copy() @@ -658,7 +658,7 @@ def put(self, request, uuid): """ client = request.user.agave_oauth.client - if request.is_ajax(): + if request.headers.get('x-requested-with') == 'XMLHttpRequest': post_data = json.loads(request.body) else: post_data = request.POST.copy() diff --git a/designsafe/apps/api/publications/urls.py b/designsafe/apps/api/publications/urls.py index ece4a063f..1096e7862 100644 --- a/designsafe/apps/api/publications/urls.py +++ b/designsafe/apps/api/publications/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.api.publications.views import PublicationListingView, PublicationDetailView, PublicationDataCiteView from django.http import JsonResponse diff --git a/designsafe/apps/api/search/urls.py b/designsafe/apps/api/search/urls.py index 268f677d7..3b646d53a 100644 --- a/designsafe/apps/api/search/urls.py +++ b/designsafe/apps/api/search/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.api.search.views import SearchView """ diff --git a/designsafe/apps/api/urls.py b/designsafe/apps/api/urls.py index 409a8ecd8..99251a240 100644 --- a/designsafe/apps/api/urls.py +++ b/designsafe/apps/api/urls.py @@ -1,5 +1,5 @@ # pylint: disable=missing-docstring -from django.conf.urls import url, include +from django.urls import re_path as url, include from designsafe.apps.api.views import LoggerApi from django.http import JsonResponse diff --git a/designsafe/apps/api/users/urls.py b/designsafe/apps/api/users/urls.py index 0feeac8b4..484ae423d 100644 --- a/designsafe/apps/api/users/urls.py +++ b/designsafe/apps/api/users/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.api.users.views import SearchView, AuthenticatedView, UsageView, PublicView urlpatterns = [ diff --git a/designsafe/apps/applications/urls.py b/designsafe/apps/applications/urls.py index 0d41a3d12..9591c6849 100644 --- a/designsafe/apps/applications/urls.py +++ b/designsafe/apps/applications/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.applications import views diff --git a/designsafe/apps/auth/urls.py b/designsafe/apps/auth/urls.py index c36604c5c..003639c78 100644 --- a/designsafe/apps/auth/urls.py +++ b/designsafe/apps/auth/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import include, url +from django.urls import re_path as url from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.auth import views urlpatterns = [ diff --git a/designsafe/apps/box_integration/urls.py b/designsafe/apps/box_integration/urls.py index 9780fc86b..2146c4d76 100644 --- a/designsafe/apps/box_integration/urls.py +++ b/designsafe/apps/box_integration/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.box_integration import views urlpatterns = [ diff --git a/designsafe/apps/cms_plugins/cms_plugins.py b/designsafe/apps/cms_plugins/cms_plugins.py index e4865e024..05d1b32f2 100644 --- a/designsafe/apps/cms_plugins/cms_plugins.py +++ b/designsafe/apps/cms_plugins/cms_plugins.py @@ -7,7 +7,7 @@ from cms.plugin_pool import plugin_pool from designsafe.apps.cms_plugins.models import ResponsiveEmbedPlugin from django.conf import settings -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ class CMSResponsiveEmbedPlugin(CMSPluginBase): diff --git a/designsafe/apps/cms_plugins/menu.py b/designsafe/apps/cms_plugins/menu.py index 19b8f03ca..7ad05206c 100644 --- a/designsafe/apps/cms_plugins/menu.py +++ b/designsafe/apps/cms_plugins/menu.py @@ -3,7 +3,7 @@ from menus.menu_pool import menu_pool from django.conf import settings from importlib import import_module -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ import logging logger = logging.getLogger(__name__) diff --git a/designsafe/apps/dashboard/urls.py b/designsafe/apps/dashboard/urls.py index e60aaf92c..f68ad7ad8 100644 --- a/designsafe/apps/dashboard/urls.py +++ b/designsafe/apps/dashboard/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.dashboard import views urlpatterns = [ diff --git a/designsafe/apps/data/urls.py b/designsafe/apps/data/urls.py index c3448fa34..aee6640a8 100644 --- a/designsafe/apps/data/urls.py +++ b/designsafe/apps/data/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.data.views.base import ( DataDepotView, FileMediaView, @@ -6,7 +6,7 @@ DataDepotLegacyPublishedView ) from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ urlpatterns = [ url( diff --git a/designsafe/apps/djangoRT/urls.py b/designsafe/apps/djangoRT/urls.py index e983bd4c2..f1bae4e52 100755 --- a/designsafe/apps/djangoRT/urls.py +++ b/designsafe/apps/djangoRT/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.djangoRT import views diff --git a/designsafe/apps/dropbox_integration/urls.py b/designsafe/apps/dropbox_integration/urls.py index 1a38beca9..4dcbd6a6c 100644 --- a/designsafe/apps/dropbox_integration/urls.py +++ b/designsafe/apps/dropbox_integration/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.dropbox_integration import views urlpatterns = [ diff --git a/designsafe/apps/geo/urls.py b/designsafe/apps/geo/urls.py index 0a36890c5..de7ce860e 100644 --- a/designsafe/apps/geo/urls.py +++ b/designsafe/apps/geo/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.urls import reverse from designsafe.apps.geo import views diff --git a/designsafe/apps/googledrive_integration/models.py b/designsafe/apps/googledrive_integration/models.py index 4dc48e436..f4bb8bf24 100644 --- a/designsafe/apps/googledrive_integration/models.py +++ b/designsafe/apps/googledrive_integration/models.py @@ -56,7 +56,7 @@ def get_prep_value(self, value): if value is None: return None else: - return encoding.smart_text( + return encoding.smart_str( base64.b64encode(jsonpickle.encode(value).encode())) def value_to_string(self, obj): diff --git a/designsafe/apps/googledrive_integration/urls.py b/designsafe/apps/googledrive_integration/urls.py index 482ee2e2e..abd4ca59e 100644 --- a/designsafe/apps/googledrive_integration/urls.py +++ b/designsafe/apps/googledrive_integration/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.googledrive_integration import views urlpatterns = [ diff --git a/designsafe/apps/nco/api_urls.py b/designsafe/apps/nco/api_urls.py index 1fe7eb9fc..5b532a1f7 100644 --- a/designsafe/apps/nco/api_urls.py +++ b/designsafe/apps/nco/api_urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.nco.views import ProjectsListView, FiltersListView, TtcGrantsView, TtcFacilitiesView """ diff --git a/designsafe/apps/nco/urls.py b/designsafe/apps/nco/urls.py index bcb9ac145..cb56baf14 100644 --- a/designsafe/apps/nco/urls.py +++ b/designsafe/apps/nco/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path as url from designsafe.apps.nco.views import NcoIndexView, NcoTtcGrantsView urlpatterns = [ diff --git a/designsafe/apps/notifications/urls.py b/designsafe/apps/notifications/urls.py index f03525b22..f8db7f655 100644 --- a/designsafe/apps/notifications/urls.py +++ b/designsafe/apps/notifications/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.notifications import views diff --git a/designsafe/apps/rapid/urls.py b/designsafe/apps/rapid/urls.py index 777407c61..aa027d8f1 100644 --- a/designsafe/apps/rapid/urls.py +++ b/designsafe/apps/rapid/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.urls import reverse from designsafe.apps.rapid import views diff --git a/designsafe/apps/search/search_indexes.py b/designsafe/apps/search/search_indexes.py index dbc5e9964..110a00c6c 100644 --- a/designsafe/apps/search/search_indexes.py +++ b/designsafe/apps/search/search_indexes.py @@ -9,7 +9,7 @@ from django.test import RequestFactory from django.utils.html import strip_tags -from django.utils.encoding import force_text +from django.utils.encoding import force_str from cms.models import Title, CMSPlugin, Page # from cms.toolbar.toolbar import CMSToolbar @@ -24,7 +24,7 @@ def _strip_tags(value): whitespace in between replaced tags to make sure words are not erroneously concatenated. """ - return re.sub(r'<[^>]*?>', ' ', force_text(value)) + return re.sub(r'<[^>]*?>', ' ', force_str(value)) class TextPluginIndex(indexes.SearchIndex, indexes.Indexable): @@ -70,7 +70,7 @@ def prepare(self, obj): # this is an empty plugin continue if hasattr(instance, 'search_fields'): - text += ' '.join(force_text(strip_tags(getattr(instance, field, ''))) for field in instance.search_fields) + text += ' '.join(force_str(strip_tags(getattr(instance, field, ''))) for field in instance.search_fields) if getattr(instance, 'search_fulltext', False) or getattr(plugin_type, 'search_fulltext', False): text += _strip_tags(instance.render_plugin(context=RequestContext(request))) + ' ' text += page.get_meta_description() or '' diff --git a/designsafe/apps/search/urls.py b/designsafe/apps/search/urls.py index 61c22d407..ba5be2f08 100644 --- a/designsafe/apps/search/urls.py +++ b/designsafe/apps/search/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.search import views urlpatterns = [ diff --git a/designsafe/apps/signals/signals.py b/designsafe/apps/signals/signals.py index eb4215236..cf2aaae36 100644 --- a/designsafe/apps/signals/signals.py +++ b/designsafe/apps/signals/signals.py @@ -1,4 +1,4 @@ from django.dispatch import Signal -ds_event = Signal(providing_args=['session_id', 'event_type', 'event_data']) -generic_event = Signal(providing_args=['event_type', 'event_data', 'event_users']) +ds_event = Signal() +generic_event = Signal() diff --git a/designsafe/apps/workspace/urls.py b/designsafe/apps/workspace/urls.py index 091c286fa..f17951f19 100644 --- a/designsafe/apps/workspace/urls.py +++ b/designsafe/apps/workspace/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import url +from django.urls import re_path as url from django.urls import reverse -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from designsafe.apps.workspace import views # TODO look at linking directly into an app in the workspace diff --git a/designsafe/celery.py b/designsafe/celery.py index f80bfd850..f17916f12 100644 --- a/designsafe/celery.py +++ b/designsafe/celery.py @@ -35,7 +35,7 @@ 'schedule': crontab(hour=0, minute=0) }, 'clear_old_notifications': { - 'task': 'designsafe.auth.tasks.clear_old_notifications', + 'task': 'designsafe.apps.auth.tasks.clear_old_notifications', 'schedule': crontab(hour=0, minute=1) } } diff --git a/designsafe/conftest.py b/designsafe/conftest.py index 22fbd2ec3..1fd8729e1 100644 --- a/designsafe/conftest.py +++ b/designsafe/conftest.py @@ -8,7 +8,7 @@ def mock_agave_client(mocker): @pytest.fixture -def regular_user(django_user_model, django_db_reset_sequences, mock_agave_client): +def regular_user(django_user_model, mock_agave_client): django_user_model.objects.create_user(username="username", password="password", first_name="Firstname", diff --git a/designsafe/settings/common_settings.py b/designsafe/settings/common_settings.py index 62f131423..3840e3197 100644 --- a/designsafe/settings/common_settings.py +++ b/designsafe/settings/common_settings.py @@ -142,8 +142,8 @@ 'django.middleware.security.SecurityMiddleware', 'cms.middleware.user.CurrentUserMiddleware', 'cms.middleware.page.CurrentPageMiddleware', - 'cms.middleware.toolbar.ToolbarMiddleware', 'cms.middleware.language.LanguageCookieMiddleware', + 'cms.middleware.toolbar.ToolbarMiddleware', 'impersonate.middleware.ImpersonateMiddleware', 'designsafe.middleware.DesignSafeTermsMiddleware', 'designsafe.middleware.DesignsafeProfileUpdateMiddleware', @@ -273,7 +273,14 @@ ('vendor/d3plus', os.path.join(BASE_DIR, 'node_modules', 'd3plus')), ] -STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' +STORAGES = { + "default": { + "BACKEND": "django.core.files.storage.FileSystemStorage", + }, + "staticfiles": { + "BACKEND": "django.contrib.staticfiles.storage.ManifestStaticFilesStorage", + }, +} STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', diff --git a/designsafe/urls.py b/designsafe/urls.py index 9b48ecf0b..a2f35b7d4 100644 --- a/designsafe/urls.py +++ b/designsafe/urls.py @@ -23,7 +23,7 @@ """ from django.conf import settings -from django.conf.urls import include, url +from django.urls import include, re_path as url from django.conf.urls.static import static from django.contrib import admin from django.views.generic import RedirectView, TemplateView diff --git a/designsafe/webhooks.py b/designsafe/webhooks.py index 90441dc63..70c5578f1 100644 --- a/designsafe/webhooks.py +++ b/designsafe/webhooks.py @@ -2,7 +2,7 @@ DesignSafe-CI Webhook URLs """ from django.conf import settings -from django.conf.urls import include, url +from django.urls import include, re_path as url from designsafe.apps.notifications import views from designsafe.apps.box_integration import webhooks diff --git a/manage.py b/manage.py index fa5f1cf0c..9166b0ca1 100755 --- a/manage.py +++ b/manage.py @@ -7,17 +7,9 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "designsafe.settings") from django.core.management import execute_from_command_line - from django.conf import settings # This will make sure the app is always imported when # Django starts so that shared_task will use this app. from designsafe.celery import app as celery_app # pylint:disable=unused-import - if settings.DEBUG: - if os.environ.get("RUN_MAIN"): - import debugpy - - debugpy.listen(("0.0.0.0", 5678)) - # debugpy.wait_for_client() - execute_from_command_line(sys.argv) diff --git a/poetry.lock b/poetry.lock index 10e24d080..aed426646 100644 --- a/poetry.lock +++ b/poetry.lock @@ -944,20 +944,20 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "django" -version = "3.2.22" -description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +version = "4.2.6" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "Django-3.2.22-py3-none-any.whl", hash = "sha256:c5e7b668025a6e06cad9ba6d4de1fd1a21212acebb51ea34abb400c6e4d33430"}, - {file = "Django-3.2.22.tar.gz", hash = "sha256:83b6d66b06e484807d778263fdc7f9186d4dc1862fcfa6507830446ac6b060ba"}, + {file = "Django-4.2.6-py3-none-any.whl", hash = "sha256:a64d2487cdb00ad7461434320ccc38e60af9c404773a2f95ab0093b4453a3215"}, + {file = "Django-4.2.6.tar.gz", hash = "sha256:08f41f468b63335aea0d904c5729e0250300f6a1907bf293a65499496cdbc68f"}, ] [package.dependencies] -asgiref = ">=3.3.2,<4" -pytz = "*" -sqlparse = ">=0.2.2" +asgiref = ">=3.6.0,<4" +sqlparse = ">=0.3.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] argon2 = ["argon2-cffi (>=19.1.0)"] @@ -1176,14 +1176,18 @@ description = "Django reCaptcha v2 field/widget" category = "main" optional = false python-versions = "*" -files = [ - {file = "django-recaptcha2-1.4.1.tar.gz", hash = "sha256:c0b43851b05c6bf6ebb5ecc890c13ccedacd9bb33d64b4291c74dd6fcbc89366"}, - {file = "django_recaptcha2-1.4.1-py3-none-any.whl", hash = "sha256:9ea90db0cec502741be1066c09ec1b8e02a73162a319a042e78e67c4605087af"}, -] +files = [] +develop = false [package.dependencies] requests = "*" +[package.source] +type = "git" +url = "https://github.com/DesignSafe-CI/django-recaptcha2" +reference = "v1.4.1--compat-django4" +resolved_reference = "1b7942af0032f1e6ba368e0028c48e3c7cfa0588" + [[package]] name = "django-sekizai" version = "2.0.0" @@ -1232,17 +1236,18 @@ Django = ">2.2" [[package]] name = "django-treebeard" -version = "4.3.1" +version = "4.7" description = "Efficient tree implementations for Django" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "django-treebeard-4.3.1.tar.gz", hash = "sha256:83aebc34a9f06de7daaec330d858d1c47887e81be3da77e3541fe7368196dd8a"}, + {file = "django-treebeard-4.7.tar.gz", hash = "sha256:c751a3f924158c288fea89afc25a7151979faf01bf11fdc7be3b858099dfa56d"}, + {file = "django_treebeard-4.7-py3-none-any.whl", hash = "sha256:787117995ff985d98e6c2b241ef6b9d37fe8ff7051cd7535c283616a0b5b2645"}, ] [package.dependencies] -Django = ">=1.8" +Django = ">=3.2" [[package]] name = "djangocms-admin-style" @@ -1293,8 +1298,8 @@ jsonfield = "*" [package.source] type = "git" url = "https://github.com/DesignSafe-CI/djangocms-cascade" -reference = "65087452d39cfeec50c4df33090bc430a5ab7d45" -resolved_reference = "65087452d39cfeec50c4df33090bc430a5ab7d45" +reference = "9e9f9e3088a0fcfdc1b27ad7e08b68390aa6a570" +resolved_reference = "9e9f9e3088a0fcfdc1b27ad7e08b68390aa6a570" [[package]] name = "djangocms-file" @@ -1337,8 +1342,8 @@ unidecode = "*" [package.source] type = "git" url = "https://github.com/TACC/djangocms-forms" -reference = "d070149d88025e5ff60801a406d74642a31a0cae" -resolved_reference = "d070149d88025e5ff60801a406d74642a31a0cae" +reference = "63ead9288c2ea65139124698bffc0ad01d182afa" +resolved_reference = "63ead9288c2ea65139124698bffc0ad01d182afa" [[package]] name = "djangocms-googlemap" @@ -2636,26 +2641,29 @@ files = [ ] [[package]] -name = "psycopg2" -version = "2.9.9" -description = "psycopg2 - Python-PostgreSQL Database Adapter" +name = "psycopg" +version = "3.1.12" +description = "PostgreSQL database adapter for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, - {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, - {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, - {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, - {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, - {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, - {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, - {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, - {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, - {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, - {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, + {file = "psycopg-3.1.12-py3-none-any.whl", hash = "sha256:8ec5230d6a7eb654b4fb3cf2d3eda8871d68f24807b934790504467f1deee9f8"}, + {file = "psycopg-3.1.12.tar.gz", hash = "sha256:cec7ad2bc6a8510e56c45746c631cf9394148bdc8a9a11fd8cf8554ce129ae78"}, ] +[package.dependencies] +typing-extensions = ">=4.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +binary = ["psycopg-binary (==3.1.12)"] +c = ["psycopg-c (==3.1.12)"] +dev = ["black (>=23.1.0)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.4.1)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] +docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] +pool = ["psycopg-pool"] +test = ["anyio (>=3.6.2,<4.0)", "mypy (>=1.4.1)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] + [[package]] name = "ptyprocess" version = "0.7.0" @@ -3080,22 +3088,22 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-django" -version = "3.10.0" +version = "4.5.2" description = "A Django plugin for pytest." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5" files = [ - {file = "pytest-django-3.10.0.tar.gz", hash = "sha256:4de6dbd077ed8606616958f77655fed0d5e3ee45159475671c7fa67596c6dba6"}, - {file = "pytest_django-3.10.0-py2.py3-none-any.whl", hash = "sha256:c33e3d3da14d8409b125d825d4e74da17bb252191bf6fc3da6856e27a8b73ea4"}, + {file = "pytest-django-4.5.2.tar.gz", hash = "sha256:d9076f759bb7c36939dbdd5ae6633c18edfc2902d1a69fdbefd2426b970ce6c2"}, + {file = "pytest_django-4.5.2-py3-none-any.whl", hash = "sha256:c60834861933773109334fe5a53e83d1ef4828f2203a1d6a0fa9972f4f75ab3e"}, ] [package.dependencies] -pytest = ">=3.6" +pytest = ">=5.4.0" [package.extras] docs = ["sphinx", "sphinx-rtd-theme"] -testing = ["Django", "django-configurations (>=2.0)", "six"] +testing = ["Django", "django-configurations (>=2.0)"] [[package]] name = "pytest-mock" @@ -3967,4 +3975,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "21833d2b378085b1879e50f382d40e14be604dc390bbc7832ef0a754b8b3cfb0" +content-hash = "4820c54b220159248703520fd978c8977db0d38b657845704ee28bd74b55d611" diff --git a/pyproject.toml b/pyproject.toml index 000de1714..79f3598dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ python = "^3.11" agavepy = "1.0.0a12" pytas = {git = "https://bitbucket.org/taccaci/pytas.git", tag = "v1.7.0"} attrdict = { git = "https://github.com/DesignSafe-CI/AttrDict", rev = "83b779ee82d5b0e33be695d398162b8f2430ff33" } -Django = "^3.2" +Django = "^4.2" daphne = "^4.0.0" debugpy = "^1.8.0" channels = "^4.0.0" @@ -21,7 +21,7 @@ django-filer = "^2.2" django-formtools = "2.2" django-haystack = "3.2.1" django-impersonate = "1.9.1" -django-treebeard = "4.3.1" +django-treebeard = "^4.4" django-sekizai = "2.0.0" django-termsandconditions = "^2.0.12" google-api-python-client = "^2.33.0" @@ -40,26 +40,27 @@ ipdb = "^0.13.13" elasticsearch = "^7.5.1" elasticsearch-dsl = "^7.1.0" dropbox = "10.6.0" -django-recaptcha2 = "1.4.1" +django-recaptcha2 = { git = "https://github.com/DesignSafe-CI/django-recaptcha2", tag = "v1.4.1--compat-django4" } djangocms-snippet = "3.0.0" django-bootstrap3 = "^23.4" djangocms-text-ckeditor = "^5.1" -djangocms-cascade = { git = "https://github.com/DesignSafe-CI/djangocms-cascade", rev = "65087452d39cfeec50c4df33090bc430a5ab7d45" } +djangocms-cascade = { git = "https://github.com/DesignSafe-CI/djangocms-cascade", rev = "9e9f9e3088a0fcfdc1b27ad7e08b68390aa6a570" } djangocms-style = "3.0.0" djangocms-video = "3.0.0" djangocms-picture = "^3.0.0" djangocms-file = "3.0.0" -djangocms-forms-maintained = { git = "https://github.com/TACC/djangocms-forms", rev = "d070149d88025e5ff60801a406d74642a31a0cae" } +djangocms-forms-maintained = { git = "https://github.com/TACC/djangocms-forms", rev = "63ead9288c2ea65139124698bffc0ad01d182afa" } djangocms-googlemap = "2.0.0" oauth2client = "^4.1.2" -psycopg2 = "2.9.9" +psycopg = "^3.1.12" jsonpickle = "^3.0.2" stone = "^3.2.1" pymemcache = "^4.0.0" django-ipware = "^1.1.6" pytest = "^7.4.2" -pytest-django = "^3.7.0" +pytest-django = "^4.5.2" pytest-asyncio = "^0.14.0" +pytz = "^2023.3" black = "^23.10.0" pylint = "^2.12.2" pylint-django = "2.5.5"