From 87a068faff4ece83b6d3820eaafdfb00cba61cd6 Mon Sep 17 00:00:00 2001 From: EDario333 Date: Tue, 28 Dec 2021 17:31:28 -0600 Subject: [PATCH] Added support to Django 3+ (tested with Django 4.0) & Python3+ (tested with Python 3.10.0) --- jet/dashboard/dashboard.py | 5 ++++- jet/dashboard/models.py | 5 ++++- jet/dashboard/modules.py | 5 ++++- jet/dashboard/urls.py | 5 ++++- jet/dashboard/views.py | 6 ++++-- jet/models.py | 5 ++++- jet/ordered_set.py | 17 +++++++++++++++-- jet/templatetags/jet_tags.py | 16 ++++++++++++++-- jet/urls.py | 5 ++++- jet/utils.py | 28 +++++++++++++++++++++++----- 10 files changed, 80 insertions(+), 17 deletions(-) diff --git a/jet/dashboard/dashboard.py b/jet/dashboard/dashboard.py index f7104bc4..e4a9c311 100644 --- a/jet/dashboard/dashboard.py +++ b/jet/dashboard/dashboard.py @@ -7,7 +7,10 @@ from django.template.loader import render_to_string from jet.dashboard import modules from jet.dashboard.models import UserDashboardModule -from django.utils.translation import ugettext_lazy as _ +try: + from django.utils.translation import ugettext_lazy as _ +except ImportError: # Django 4 (tested with Django 4.0) + from django.utils.translation import gettext_lazy as _ from jet.ordered_set import OrderedSet from jet.utils import get_admin_site_name, context_to_dict diff --git a/jet/dashboard/models.py b/jet/dashboard/models.py index 54549bdf..18fcf682 100644 --- a/jet/dashboard/models.py +++ b/jet/dashboard/models.py @@ -1,7 +1,10 @@ from importlib import import_module import json from django.db import models -from django.utils.translation import ugettext_lazy as _ +try: + from django.utils.translation import ugettext_lazy as _ +except ImportError: # Django 4 (tested with Django 4.0) + from django.utils.translation import gettext_lazy as _ from jet.utils import LazyDateTimeEncoder try: diff --git a/jet/dashboard/modules.py b/jet/dashboard/modules.py index c1954c8b..9beb817b 100644 --- a/jet/dashboard/modules.py +++ b/jet/dashboard/modules.py @@ -3,7 +3,10 @@ from django.contrib.admin.models import LogEntry from django.db.models import Q from django.template.loader import render_to_string -from django.utils.translation import ugettext_lazy as _ +try: + from django.utils.translation import ugettext_lazy as _ +except ImportError: # Django 4 (tested with Django 4.0) + from django.utils.translation import gettext_lazy as _ from jet.utils import get_app_list, LazyDateTimeEncoder, context_to_dict import datetime diff --git a/jet/dashboard/urls.py b/jet/dashboard/urls.py index 572fc3e7..d0255ef7 100644 --- a/jet/dashboard/urls.py +++ b/jet/dashboard/urls.py @@ -1,5 +1,8 @@ import django -from django.conf.urls import url +try: + from django.conf.urls import url +except ImportError: # Django 3+ (tested with Django 4.0) + from django.urls import re_path as url try: from django.views.i18n import JavaScriptCatalog diff --git a/jet/dashboard/views.py b/jet/dashboard/views.py index 79fa8915..3b75e29b 100644 --- a/jet/dashboard/views.py +++ b/jet/dashboard/views.py @@ -13,8 +13,10 @@ from jet.dashboard.models import UserDashboardModule from jet.utils import JsonResponse, get_app_list, SuccessMessageMixin, user_is_authenticated from django.views.generic import UpdateView -from django.utils.translation import ugettext_lazy as _ - +try: + from django.utils.translation import ugettext_lazy as _ +except ImportError: # Django 4 (tested with Django 4.0) + from django.utils.translation import gettext_lazy as _ class UpdateDashboardModuleView(SuccessMessageMixin, UpdateView): model = UserDashboardModule diff --git a/jet/models.py b/jet/models.py index e0973739..e308eed4 100644 --- a/jet/models.py +++ b/jet/models.py @@ -1,6 +1,9 @@ from django.db import models from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ +try: + from django.utils.translation import ugettext_lazy as _ +except ImportError: # Django 4 (tested with Django 4.0) + from django.utils.translation import gettext_lazy as _ try: from django.utils.encoding import python_2_unicode_compatible diff --git a/jet/ordered_set.py b/jet/ordered_set.py index 28685a87..e001b440 100644 --- a/jet/ordered_set.py +++ b/jet/ordered_set.py @@ -1,7 +1,20 @@ -import collections +try: + from collections import MutableSet +except ImportError: # Python 3.3+ + ''' + MutableSet is now in collections.abc. Starting with Python 3.3, + importing ABCs from collections was deprecated, and importing + should be done from collections.abc. Being able to import from + collections was marked for removal in 3.8, but has been delayed + to 3.9. + Taken from: + https://github.com/OCA/oca-addons-repo-template/issues/80#issuecomment-948531410 + ''' + from collections.abc import MutableSet -class OrderedSet(collections.MutableSet): +#class OrderedSet(collections.MutableSet): +class OrderedSet(MutableSet): def __init__(self, iterable=None): self.end = end = [] end += [None, end, end] # sentinel node for doubly linked list diff --git a/jet/templatetags/jet_tags.py b/jet/templatetags/jet_tags.py index 523d6692..1449b178 100644 --- a/jet/templatetags/jet_tags.py +++ b/jet/templatetags/jet_tags.py @@ -11,7 +11,18 @@ from django.contrib.admin.widgets import RelatedFieldWidgetWrapper from django.utils.formats import get_format from django.utils.safestring import mark_safe -from django.utils.encoding import smart_text +try: + from django.utils.encoding import smart_text as smart_txt +except ImportError: # Django 3+ + ''' + "The smart_text() and force_text() aliases (since Django 2.0) of + smart_str() and force_str() are deprecated...". + + Taken from: + https://docs.djangoproject.com/en/4.0/releases/3.0/#deprecated-features-3-0 + ''' + from django.utils.encoding import smart_str as smart_txt + from jet import settings, VERSION from jet.models import Bookmark from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ @@ -217,7 +228,8 @@ def jet_popup_response_data(context): return json.dumps({ 'action': context.get('action'), 'value': context.get('value') or context.get('pk_value'), - 'obj': smart_text(context.get('obj')), + #'obj': smart_text(context.get('obj')), + 'obj': smart_txt(context.get('obj')), # Django 2&3+ 'new_value': context.get('new_value') }) diff --git a/jet/urls.py b/jet/urls.py index 012037e3..ce1179cc 100644 --- a/jet/urls.py +++ b/jet/urls.py @@ -1,5 +1,8 @@ import django -from django.conf.urls import url +try: + from django.conf.urls import url +except ImportError: # Django 3+ (tested with Django 4.0) + from django.urls import re_path as url try: from django.views.i18n import JavaScriptCatalog diff --git a/jet/utils.py b/jet/utils.py index fa157f1a..c4178955 100644 --- a/jet/utils.py +++ b/jet/utils.py @@ -20,14 +20,30 @@ from django.urls import reverse, resolve, NoReverseMatch from django.contrib.admin import AdminSite -from django.utils.encoding import smart_text +try: + from django.utils.encoding import smart_text as smart_txt +except ImportError: # Django 2&3+ + ''' + "The smart_text() and force_text() aliases (since Django 2.0) of + smart_str() and force_str() are deprecated...". + + Taken from: + https://docs.djangoproject.com/en/4.0/releases/3.0/#deprecated-features-3-0 + ''' + from django.utils.encoding import smart_str as smart_txt from django.utils.text import capfirst from django.contrib import messages -from django.utils.encoding import force_text +try: + from django.utils.encoding import force_text as force_txt +except ImportError: # Django 2&3+ Same as above + from django.utils.encoding import force_str as force_txt from django.utils.functional import Promise from django.contrib.admin.options import IncorrectLookupParameters from django.contrib import admin -from django.utils.translation import ugettext_lazy as _ +try: + from django.utils.translation import ugettext_lazy as _ +except ImportError: # Django 4 (tested with Django 4.0) + from django.utils.translation import gettext_lazy as _ from django.utils.text import slugify try: @@ -150,14 +166,16 @@ def default(self, obj): if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date): return obj.isoformat() elif isinstance(obj, Promise): - return force_text(obj) + #return force_text(obj) + return force_txt(obj) # Django 2&3+ return self.encode(obj) def get_model_instance_label(instance): if getattr(instance, "related_label", None): return instance.related_label() - return smart_text(instance) + #return smart_text(instance) # Django 3+ + return smart_txt(instance) class SuccessMessageMixin(object):