From 146e710d7c57ab7b24e8ae54cc09015516144229 Mon Sep 17 00:00:00 2001 From: Mike Naglee Date: Thu, 2 Jun 2022 23:27:19 -0400 Subject: [PATCH 1/2] force_text deprecated in django 4.0+ --- smartfields/dependencies.py | 34 +++++++++++++++++++++------------- smartfields/utils.py | 10 +++++++++- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/smartfields/dependencies.py b/smartfields/dependencies.py index b594531..58e8925 100644 --- a/smartfields/dependencies.py +++ b/smartfields/dependencies.py @@ -2,7 +2,15 @@ from django.core.files.base import File from django.core.files.storage import default_storage from django.db.models.fields import files, NOT_PROVIDED -from django.utils.encoding import force_text, force_str +try: + # for django >=4.0 + import django + from django.utils.encoding import force_str + django.utils.encoding.force_text = force_str +except: + raise + # for django <4.0 + from django.utils.encoding import force_text, force_str import six try: # django>=3.1 @@ -139,12 +147,12 @@ def has_pre_processor(self): def has_default(self): return self._default is not NOT_PROVIDED - + def get_default(self, instance, value): if self.has_default(): if callable(self._default): return self._default( - value, instance=instance, field=self.field, + value, instance=instance, field=self.field, dependee=self._dependee, **self._processor_params ) return self._default @@ -201,7 +209,7 @@ def process(self, instance, value, progress_setter=None): if self.set_default(instance, value) and self.has_processor(): value = self.get_value(instance) field = self._dependee - if self.has_processor(): + if self.has_processor(): if self.async_: self._processor.progress_setter = progress_setter progress_setter(self._processor, 0) @@ -226,7 +234,7 @@ def pre_process(self, instance, value): if self.has_pre_processor(): if isinstance(self._pre_processor, BaseProcessor): new_value = self._pre_processor( - value, instance=instance, field=self.field, + value, instance=instance, field=self.field, dependee=self._dependee, **self._processor_params ) else: @@ -254,11 +262,11 @@ def __init__(self, upload_to="", storage=None, keep_orphans=KEEP_ORPHANS, **kwar super(FileDependency, self).__init__(**kwargs) def __eq__(self, other): - return (super(FileDependency, self).__eq__(other) and + return (super(FileDependency, self).__eq__(other) and self.storage is other.storage and self.upload_to == other.upload_to and self.keep_orphans == other.keep_orphans) - + def cleanup_stash(self): if self.has_stashed_value and self._stashed_value: if isinstance(self._stashed_value, FieldFile): @@ -267,7 +275,7 @@ def cleanup_stash(self): self._stashed_value.delete(instance_update=False) elif isinstance(self._stashed_value, files.FieldFile) and \ self._stashed_value._committed and not self.keep_orphans: - stashed_value = FieldFile(self._stashed_value.instance, + stashed_value = FieldFile(self._stashed_value.instance, self._stashed_value.field, self._stashed_value.name) self._stashed_value.close() @@ -282,7 +290,7 @@ def restore_stash(self, instance): elif isinstance(field_file, files.FieldFile): field_file.delete(save=False) super(FileDependency, self).restore_stash(instance) - + def cleanup(self, instance): # do not cleanup self dependency, it will be cleaned up by the manager if self._dependee is not self.field: @@ -293,7 +301,7 @@ def cleanup(self, instance): def contribute_to_model(self, model): super(FileDependency, self).contribute_to_model(model) if self._dependee is None: - # mimic normal django behavior, while using dependency instance instead of + # mimic normal django behavior, while using dependency instance instead of # creating a new field for the descriptor. setattr(model, self.name, self.descriptor_class(self)) else: @@ -349,9 +357,9 @@ def set_value(self, instance, value, is_default=False): and value.field is not dependee: # if it is a file from another FileField, we'll need to copy that file value = value.file - # try to figure out a name for the file + # try to figure out a name for the file if isinstance(self.field, FileField) and self.field.value_from_object(instance): - # if original value comes from a FileField will use it's file's + # if original value comes from a FileField will use it's file's # name as a base for a new name, of course if one is present field_file = self.field.value_from_object(instance) name = field_file.name @@ -365,7 +373,7 @@ def set_value(self, instance, value, is_default=False): # otherwise create a bogus name from dependency's name name = self.name if dependee is None: - # if dependee is not a field, create a FieldFile using + # if dependee is not a field, create a FieldFile using # this dependency instead of a field field_file = field_file_class(instance, self, name) else: diff --git a/smartfields/utils.py b/smartfields/utils.py index e421694..79b2728 100644 --- a/smartfields/utils.py +++ b/smartfields/utils.py @@ -3,7 +3,15 @@ from django.conf import settings from django.core import validators from django.core.files import base, temp -from django.utils.encoding import force_text +try: + # for django >=4.0 + import django + from django.utils.encoding import force_str + django.utils.encoding.force_text = force_str +except: + raise + # for django <4.0 + from django.utils.encoding import force_text from six.moves import queue as six_queue try: from django.utils.deconstruct import deconstructible From 06204a36c7eea67e526006d048cae6a65950afc4 Mon Sep 17 00:00:00 2001 From: Mike Naglee Date: Thu, 2 Jun 2022 23:30:30 -0400 Subject: [PATCH 2/2] replace url with re_path for django 4.0+ --- smartfields/urls.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/smartfields/urls.py b/smartfields/urls.py index 00d2668..96dad54 100644 --- a/smartfields/urls.py +++ b/smartfields/urls.py @@ -1,4 +1,9 @@ -from django.conf.urls import url +try: + # for django >=4.0 + from django.urls import re_path as url +except: + # for django <4.0 + from django.conf.urls import url from smartfields.views import FileUploadView