From 71b8c038919f21e81076d7b5d64514e4d1c39cca Mon Sep 17 00:00:00 2001 From: Josh Yu Date: Mon, 11 Mar 2024 07:14:40 +0000 Subject: [PATCH 1/3] feat: add django 4.2 support, python 3.10 support, remove django 3.1 support --- .github/workflows/lint.yml | 6 ++--- .github/workflows/test.yml | 15 ++++++----- CHANGELOG.rst | 2 ++ aldryn_redirects/admin.py | 38 +++++++++++++++------------ aldryn_redirects/forms.py | 1 + aldryn_redirects/models.py | 10 ++++--- aldryn_redirects/validators.py | 1 + setup.cfg | 43 +++++++++++++++++++++++++++++++ setup.py | 1 + tests/requirements/dj22_cms40.txt | 5 ---- tests/requirements/dj42_cms40.txt | 5 ++++ tests/settings.py | 1 + tests/test_admin.py | 6 +++-- tests/test_forms.py | 5 ++-- tox.ini | 30 +++++++++++++-------- 15 files changed, 119 insertions(+), 50 deletions(-) create mode 100644 setup.cfg delete mode 100644 tests/requirements/dj22_cms40.txt create mode 100644 tests/requirements/dj42_cms40.txt diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 63fc275..7154bc3 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - name: Install flake8 run: pip install --upgrade flake8 - name: Run flake8 @@ -29,10 +29,10 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: 3.8 + python-version: 3.9 - run: python -m pip install isort - name: isort uses: liskin/gh-problem-matcher-wrap@v1 with: linters: isort - run: isort -c -rc -df ./ \ No newline at end of file + run: isort --check-only --diff ./ \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 47a719a..8041dd6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,18 +8,22 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ 3.7, 3.8, 3.9 ] # latest release minus two + python-version: [ 3.8, 3.9, '3.10' ] requirements-file: [ - dj22_cms40.txt, dj32_cms40.txt, + dj42_cms40.txt, ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: 'tests/requirements/*.txt' + - name: Install dependencies run: | python -m pip install --upgrade pip @@ -27,6 +31,3 @@ jobs: python setup.py install - name: Run coverage run: coverage run setup.py test - - - name: Upload Coverage to Codecov - uses: codecov/codecov-action@v1 \ No newline at end of file diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 050a3c3..6288aa3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,8 @@ Changelog Unreleased ========== +* Introduced Django 4.2 support. +* Dropped Support for Django<3.1 1.0.2 (2023-02-24) ================== diff --git a/aldryn_redirects/admin.py b/aldryn_redirects/admin.py index e5e5858..71d11ee 100644 --- a/aldryn_redirects/admin.py +++ b/aldryn_redirects/admin.py @@ -1,24 +1,33 @@ -from aldryn_translation_tools.admin import AllTranslationsMixin from django.conf import settings from django.contrib import admin, messages from django.http import HttpResponse from django.shortcuts import redirect, render from django.urls import reverse from django.utils import timezone -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ + +from aldryn_translation_tools.admin import AllTranslationsMixin from parler.admin import TranslatableAdmin from tablib import Dataset -from .forms import (RedirectsImportForm, StaticRedirectForm, - StaticRedirectsImportForm) -from .models import (Redirect, StaticRedirect, - StaticRedirectInboundRouteQueryParam) +from .forms import ( + RedirectsImportForm, + StaticRedirectForm, + StaticRedirectsImportForm, +) +from .models import ( + Redirect, + StaticRedirect, + StaticRedirectInboundRouteQueryParam, +) class DeletionMixin(): actions = ['delete_selected'] + @admin.action( + description=_('Delete selected objects') + ) def delete_selected(self, request, queryset): max_items_deletion = getattr(settings, 'DATA_UPLOAD_MAX_NUMBER_FIELDS', 1000) # COMPAT: Django<1.10 @@ -35,9 +44,9 @@ def delete_selected(self, request, queryset): object_label = self.opts.verbose_name_plural if deleted_qty > 1 else self.opts.verbose_name msg = _('Successfully deleted {qty} {object_label}.').format(qty=deleted_qty, object_label=object_label) self.message_user(request, msg) - delete_selected.short_description = _('Delete selected objects') +@admin.register(Redirect) class RedirectAdmin(DeletionMixin, AllTranslationsMixin, TranslatableAdmin): list_display = ('old_path',) list_filter = ('site',) @@ -47,12 +56,12 @@ class RedirectAdmin(DeletionMixin, AllTranslationsMixin, TranslatableAdmin): export_headers = ['Domain', 'Old', 'New', 'Language'] def get_urls(self): - from django.conf.urls import url + from django.urls import re_path def pattern(regex, fn, name): args = [regex, self.admin_site.admin_view(fn)] url_name = "%s_%s_%s" % (self.opts.app_label, self.opts.model_name, name) - return url(*args, name=url_name) + return re_path(*args, name=url_name) url_patterns = [ pattern(r'export/$', self.export_view, 'export'), @@ -130,6 +139,7 @@ class StaticRedirectInboundRouteQueryParamInline(admin.TabularInline): extra = 1 +@admin.register(StaticRedirect) class StaticRedirectAdmin(DeletionMixin, admin.ModelAdmin): inlines = [StaticRedirectInboundRouteQueryParamInline] filter_horizontal = ('sites',) @@ -143,12 +153,12 @@ class StaticRedirectAdmin(DeletionMixin, admin.ModelAdmin): export_headers = ['domain', 'inbound_route', 'outbound_route'] def get_urls(self): - from django.conf.urls import url + from django.urls import re_path def pattern(regex, fn, name): args = [regex, self.admin_site.admin_view(fn)] url_name = "%s_%s_%s" % (self.opts.app_label, self.opts.model_name, name) - return url(*args, name=url_name) + return re_path(*args, name=url_name) url_patterns = [ pattern(r'export/$', self.export_view, 'export'), @@ -215,7 +225,3 @@ def import_view(self, request): 'errors': form.errors, } return render(request, 'admin/aldryn_redirects/staticredirect/import_form.html', context) - - -admin.site.register(Redirect, RedirectAdmin) -admin.site.register(StaticRedirect, StaticRedirectAdmin) diff --git a/aldryn_redirects/forms.py b/aldryn_redirects/forms.py index 717ccb7..81bf85b 100644 --- a/aldryn_redirects/forms.py +++ b/aldryn_redirects/forms.py @@ -1,6 +1,7 @@ from django import forms from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ + from tablib import Dataset from .importers import RedirectImporter, StaticRedirectImporter diff --git a/aldryn_redirects/models.py b/aldryn_redirects/models.py index d7e9e11..0db6854 100644 --- a/aldryn_redirects/models.py +++ b/aldryn_redirects/models.py @@ -1,13 +1,15 @@ from django.contrib.sites.models import Site from django.db import models from django.urls import reverse -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ + from parler.models import TranslatableModel, TranslatedFields from six.moves.urllib.parse import urljoin, urlparse -from .managers import (StaticRedirectInboundRouteQueryParamManager, - StaticRedirectManager) +from .managers import ( + StaticRedirectInboundRouteQueryParamManager, + StaticRedirectManager, +) from .utils import add_query_params_to_url from .validators import validate_inbound_route, validate_outbound_route diff --git a/aldryn_redirects/validators.py b/aldryn_redirects/validators.py index b0c9f90..121b2da 100644 --- a/aldryn_redirects/validators.py +++ b/aldryn_redirects/validators.py @@ -4,6 +4,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ + from six.moves.urllib.parse import urlparse diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..905a8c3 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,43 @@ +[flake8] +max-line-length = 120 +exclude = + .git, + __pycache__, + **/migrations/, + build/, + .tox/, + +[isort] +line_length = 79 +multi_line_output = 3 +lines_after_imports = 2 +combine_as_imports = true +include_trailing_comma = true +balanced_wrapping = true +skip = manage.py, migrations, .tox +extra_standard_library = mock +known_django = django +known_cms = cms, menus +known_first_party = djangocms_version_locking +sections = FUTURE, STDLIB, DJANGO, CMS, THIRDPARTY, FIRSTPARTY, LOCALFOLDER + +[coverage:run] +branch = True +source = djangocms_version_locking +omit = + *apps.py, + *constants.py, + *migrations/*, + *test_utils/*, + *tests/*, + +[coverage:report] +exclude_lines = + pragma: no cover + def __repr__ + if self.debug: + if settings.DEBUG + raise AssertionError + raise NotImplementedError + if 0: + if __name__ == .__main__.: \ No newline at end of file diff --git a/setup.py b/setup.py index 316cf35..f3a1a72 100644 --- a/setup.py +++ b/setup.py @@ -2,6 +2,7 @@ from aldryn_redirects import __version__ + REQUIREMENTS = [ 'tablib', 'django-parler', diff --git a/tests/requirements/dj22_cms40.txt b/tests/requirements/dj22_cms40.txt deleted file mode 100644 index 3552ea2..0000000 --- a/tests/requirements/dj22_cms40.txt +++ /dev/null @@ -1,5 +0,0 @@ --r ./requirements_base.txt - -Django>=2.2,<3.0 -django-classy-tags<2.0.0 -django-sekizai<2.0.0 \ No newline at end of file diff --git a/tests/requirements/dj42_cms40.txt b/tests/requirements/dj42_cms40.txt new file mode 100644 index 0000000..e49f2b4 --- /dev/null +++ b/tests/requirements/dj42_cms40.txt @@ -0,0 +1,5 @@ +-r ./requirements_base.txt + +Django>=4.2,<5.0 +django-classy-tags +django-sekizai \ No newline at end of file diff --git a/tests/settings.py b/tests/settings.py index 2e29262..c90ff19 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -1,6 +1,7 @@ #!/usr/bin/env python from __future__ import division, print_function + HELPER_SETTINGS = { 'MIDDLEWARE': [ 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/tests/test_admin.py b/tests/test_admin.py index 6ed6c36..b342cad 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -1,9 +1,11 @@ import re -from bs4 import BeautifulSoup +from django.shortcuts import reverse + from cms.models import Site from cms.test_utils.testcases import CMSTestCase -from django.shortcuts import reverse + +from bs4 import BeautifulSoup from aldryn_redirects.models import Redirect, StaticRedirect diff --git a/tests/test_forms.py b/tests/test_forms.py index 54b9b7d..78f05ab 100644 --- a/tests/test_forms.py +++ b/tests/test_forms.py @@ -1,8 +1,9 @@ -from cms.test_utils.testcases import CMSTestCase -from cms.utils import get_current_site from django.contrib.sites.models import Site from django.core.exceptions import ValidationError +from cms.test_utils.testcases import CMSTestCase +from cms.utils import get_current_site + from aldryn_redirects.forms import StaticRedirectForm from aldryn_redirects.models import StaticRedirect diff --git a/tox.ini b/tox.ini index 4bcd2c5..ad5d033 100644 --- a/tox.ini +++ b/tox.ini @@ -1,26 +1,34 @@ [tox] envlist = flake8 - py{36,35,27}-dj{18,19,110,111}-cms{34,33} + py{38,39,310}-dj{32,42}-sqlite-cms40 skip_missing_interpreters=True [testenv] deps = - -r{toxinidir}/tests/requirements.txt - dj18: Django>=1.8,<1.9 - dj19: Django>=1.9,<1.10 - dj110: Django>=1.10,<1.11 - dj111: Django>=1.11,<1.12 - cms33: django-cms>=3.3,<3.4 - cms34: django-cms>=3.4,<3.5 + flake8: -r{toxinidir}/tests/requirements/requirements_base.txt + isort: -r{toxinidir}/tests/requirements/requirements_base.txt + + dj32: -r{toxinidir}/tests/requirements/dj32_cms40.txt + dj42: -r{toxinidir}/tests/requirements/dj42_cms40.txt + +basepython = + py38: python3.8 + py39: python3.9 + py310: python3.10 + commands = {envpython} --version {env:COMMAND:coverage} erase {env:COMMAND:coverage} run setup.py test {env:COMMAND:coverage} report -[flake8] -max-line-length = 120 -exclude = */docs/*,*/migrations/* +[testenv:flake8] +commands = flake8 +basepython = python3.9 + +[testenv:isort] +commands = isort --recursive --check-only --diff {toxinidir} +basepython = python3.9 From 787785f3012990f45c28096e8f5c361610a5d292 Mon Sep 17 00:00:00 2001 From: Josh Peng Yu Date: Thu, 14 Mar 2024 07:12:31 +0000 Subject: [PATCH 2/3] fix: fix admin & check issue --- CHANGELOG.rst | 1 + MANIFEST.in | 1 + aldryn_redirects/admin.py | 67 ++++++++++++++- .../south_migrations/0001_initial.py | 81 ------------------- aldryn_redirects/south_migrations/__init__.py | 0 .../css/admin/all-translations-mixin.css | 23 ++++++ setup.py | 1 - tests/requirements/requirements_base.txt | 1 - tests/test_middleware.py | 11 ++- 9 files changed, 99 insertions(+), 87 deletions(-) delete mode 100644 aldryn_redirects/south_migrations/0001_initial.py delete mode 100644 aldryn_redirects/south_migrations/__init__.py create mode 100644 aldryn_redirects/static/css/admin/all-translations-mixin.css diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 6288aa3..b8fba58 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -6,6 +6,7 @@ Unreleased ========== * Introduced Django 4.2 support. * Dropped Support for Django<3.1 +* Dropped the dependency of `aldryn-translation-tools` 1.0.2 (2023-02-24) ================== diff --git a/MANIFEST.in b/MANIFEST.in index a5e100c..02e5cce 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,6 +3,7 @@ include README.rst include CHANGELOG.rst recursive-include aldryn_redirects/locale * recursive-include aldryn_redirects/migrations * +recursive-include aldryn_redirects/static * recursive-include aldryn_redirects/templates * recursive-exclude * *.pyc diff --git a/aldryn_redirects/admin.py b/aldryn_redirects/admin.py index 71d11ee..6ec4b41 100644 --- a/aldryn_redirects/admin.py +++ b/aldryn_redirects/admin.py @@ -1,12 +1,16 @@ from django.conf import settings from django.contrib import admin, messages +from django.forms import widgets from django.http import HttpResponse from django.shortcuts import redirect, render from django.urls import reverse from django.utils import timezone +from django.utils.encoding import force_str from django.utils.translation import gettext, gettext_lazy as _ -from aldryn_translation_tools.admin import AllTranslationsMixin +from cms.utils.i18n import get_current_language +from cms.utils.urlutils import admin_reverse + from parler.admin import TranslatableAdmin from tablib import Dataset @@ -46,6 +50,67 @@ def delete_selected(self, request, queryset): self.message_user(request, msg) +class AllTranslationsMixin(object): + + @property + def media(self): + return super().media + widgets.Media( + css={'all': ('css/admin/all-translations-mixin.css', ), } + ) + + @admin.display( + description='Translations' + ) + def all_translations(self, obj): + """ + Adds a property to the list_display that lists all translations with + links directly to their change forms. Includes CSS to style the links + to looks like tags with color indicating current language, active and + inactive translations. + + A similar capability is in HVAD, and now there is this for + Parler-based projects. + """ + available = list(obj.get_available_languages()) + current = get_current_language() + langs = [] + for code, lang_name in settings.LANGUAGES: + classes = ["lang-code", ] + title = force_str(lang_name) + if code == current: + classes += ["current", ] + if code in available: + classes += ["active", ] + title += " (translated)" + else: + title += " (untranslated)" + change_form_url = admin_reverse( + '{app_label}_{model_name}_change'.format( + app_label=obj._meta.app_label.lower(), + model_name=obj.__class__.__name__.lower(), + ), args=(obj.id, ) + ) + link = '{code}'.format( + classes=' '.join(classes), + url=change_form_url, + code=code, + title=title, + ) + langs.append(link) + return ''.join(langs) + + def get_list_display(self, request): + """ + Unless the the developer has already placed "all_translations" in the + list_display list (presumably specifically where she wants it), append + the list of translations to the end. + """ + list_display = super().get_list_display(request) + if 'all_translations' not in list_display: + list_display = list(list_display) + ['all_translations', ] + return list_display + + @admin.register(Redirect) class RedirectAdmin(DeletionMixin, AllTranslationsMixin, TranslatableAdmin): list_display = ('old_path',) diff --git a/aldryn_redirects/south_migrations/0001_initial.py b/aldryn_redirects/south_migrations/0001_initial.py deleted file mode 100644 index 33e4bc9..0000000 --- a/aldryn_redirects/south_migrations/0001_initial.py +++ /dev/null @@ -1,81 +0,0 @@ -from south.db import db -from south.v2 import SchemaMigration - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'RedirectTranslation' - db.create_table(u'aldryn_redirects_redirect_translation', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('new_path', self.gf('django.db.models.fields.CharField')(max_length=200, blank=True)), - ('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)), - ( - 'master', - self.gf('django.db.models.fields.related.ForeignKey') - (related_name='translations', null=True, to=orm['aldryn_redirects.Redirect'])), - )) - db.send_create_signal(u'aldryn_redirects', ['RedirectTranslation']) - - # Adding unique constraint on 'RedirectTranslation', fields ['language_code', 'master'] - db.create_unique(u'aldryn_redirects_redirect_translation', ['language_code', 'master_id']) - - # Adding model 'Redirect' - db.create_table(u'aldryn_redirects_redirect', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ( - 'site', - self.gf('django.db.models.fields.related.ForeignKey') - (related_name='redirects_hvad_set', to=orm['sites.Site']) - ), - ('old_path', self.gf('django.db.models.fields.CharField')(max_length=200, db_index=True)), - )) - db.send_create_signal(u'aldryn_redirects', ['Redirect']) - - # Adding unique constraint on 'Redirect', fields ['site', 'old_path'] - db.create_unique(u'aldryn_redirects_redirect', ['site_id', 'old_path']) - - def backwards(self, orm): - # Removing unique constraint on 'Redirect', fields ['site', 'old_path'] - db.delete_unique(u'aldryn_redirects_redirect', ['site_id', 'old_path']) - - # Removing unique constraint on 'RedirectTranslation', fields ['language_code', 'master'] - db.delete_unique(u'aldryn_redirects_redirect_translation', ['language_code', 'master_id']) - - # Deleting model 'RedirectTranslation' - db.delete_table(u'aldryn_redirects_redirect_translation') - - # Deleting model 'Redirect' - db.delete_table(u'aldryn_redirects_redirect') - - models = { - u'aldryn_redirects.redirect': { - 'Meta': - {'ordering': "('old_path',)", 'unique_together': "(('site', 'old_path'),)", 'object_name': 'Redirect'}, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'old_path': ('django.db.models.fields.CharField', [], {'max_length': '200', 'db_index': 'True'}), - 'site': ('django.db.models.fields.related.ForeignKey', [], - {'related_name': "'redirects_hvad_set'", 'to': u"orm['sites.Site']"}) - }, - u'aldryn_redirects.redirecttranslation': { - 'Meta': - {'unique_together': "[('language_code', 'master')]", - 'object_name': 'RedirectTranslation', - 'db_table': "u'aldryn_redirects_redirect_translation'" - }, - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), - 'master': ( - 'django.db.models.fields.related.ForeignKey', [], - {'related_name': "'translations'", 'null': 'True', 'to': u"orm['aldryn_redirects.Redirect']"}), - 'new_path': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}) - }, - u'sites.site': { - 'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"}, - 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - } - } - - complete_apps = ['aldryn_redirects'] diff --git a/aldryn_redirects/south_migrations/__init__.py b/aldryn_redirects/south_migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/aldryn_redirects/static/css/admin/all-translations-mixin.css b/aldryn_redirects/static/css/admin/all-translations-mixin.css new file mode 100644 index 0000000..37eb7b0 --- /dev/null +++ b/aldryn_redirects/static/css/admin/all-translations-mixin.css @@ -0,0 +1,23 @@ +a.lang-code { + background-color: #BFBFBF; /* hsl(0, 0%, 75%); */ + border-radius: 3px; + color: #fff !important; + display: inline-block; + font-size: 0.75em; + letter-spacing: 0.05em; + line-height: 1em; + margin-right: 0.25em; + padding: 3px; + text-decoration: none; + text-transform: uppercase; +} +a.lang-code.active { + background-color: #3B99FC; /* hsl(211, 97%, 61%) */ +} +a.lang-code.current { + background-color: #999999; /* hsl(0, 0%, 60%); */ + font-weight: bold; +} +a.lang-code.current.active { + background-color: #3178BE; /* hsl(211, 59%, 48%) */ +} diff --git a/setup.py b/setup.py index f3a1a72..8658a7e 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,6 @@ REQUIREMENTS = [ 'tablib', 'django-parler', - 'aldryn-translation-tools', ] CLASSIFIERS = [ diff --git a/tests/requirements/requirements_base.txt b/tests/requirements/requirements_base.txt index f50129a..4f2eb3b 100644 --- a/tests/requirements/requirements_base.txt +++ b/tests/requirements/requirements_base.txt @@ -1,4 +1,3 @@ -aldryn-translation-tools asgiref beautifulsoup4 coverage>=4.4.2 diff --git a/tests/test_middleware.py b/tests/test_middleware.py index 5a0699a..ac17da5 100644 --- a/tests/test_middleware.py +++ b/tests/test_middleware.py @@ -1,6 +1,7 @@ from __future__ import division, print_function from django.contrib.sites.models import Site +from django.http.response import HttpResponse from django.test import TestCase from django.test.client import RequestFactory @@ -8,6 +9,10 @@ from aldryn_redirects.models import StaticRedirect +def get_response(): + return HttpResponse() + + class RedirectFallbackMiddlewareTestCase(TestCase): def setUp(self, *args, **kwargs): super(RedirectFallbackMiddlewareTestCase, self).setUp(*args, **kwargs) @@ -20,7 +25,7 @@ def test_redirect_found(self): redirect.sites.add(self.site) redirect.query_params.create(key='query1', value='param1') - response = RedirectFallbackMiddleware().process_request(self.request) + response = RedirectFallbackMiddleware(get_response).process_request(self.request) self.assertEquals(response.status_code, 301) self.assertEquals(response.url, 'http://example.com/dest?keep=this') @@ -31,10 +36,10 @@ def test_redirect_found_from_root(self): redirect.query_params.create(key='query1', value='param1') request_from_root = RequestFactory().get('http://example.com/?query1=param1') - response = RedirectFallbackMiddleware().process_request(request_from_root) + response = RedirectFallbackMiddleware(get_response).process_request(request_from_root) self.assertEquals(response.status_code, 301) self.assertEquals(response.url, 'http://example.com/dest?keep=this') def test_redirect_not_found(self): - self.assertIsNone(RedirectFallbackMiddleware().process_request(self.request)) + self.assertIsNone(RedirectFallbackMiddleware(get_response).process_request(self.request)) From bdb29439fe751b5aa56787b4c6148440073c28d9 Mon Sep 17 00:00:00 2001 From: Josh Peng Yu Date: Thu, 14 Mar 2024 13:17:47 +0000 Subject: [PATCH 3/3] update changelog.rst --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b8fba58..bc84b4d 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,7 @@ Unreleased * Introduced Django 4.2 support. * Dropped Support for Django<3.1 * Dropped the dependency of `aldryn-translation-tools` +* Dropped support for python<3.8 1.0.2 (2023-02-24) ==================