diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9e910923..14b4c400 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,14 +10,18 @@ jobs: fail-fast: false max-parallel: 5 matrix: - python-version: ['3.7', '3.8', '3.9', '3.10'] - django-version: ['2.2', '3.1', '3.2', 'main'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] + django-version: ['4.2', '5.0', '5.1', 'main'] exclude: # No such tox envs: - - {python-version: '3.7', django-version: 'main'} - - {python-version: '3.10', django-version: '2.2'} - - {python-version: '3.10', django-version: '3.1'} - - {python-version: '3.10', django-version: '3.2'} + - {python-version: '3.8', django-version: 'main'} + - {python-version: '3.9', django-version: 'main'} + - {python-version: '3.8', django-version: '5.0'} + - {python-version: '3.9', django-version: '5.0'} + - {python-version: '3.8', django-version: '5.1'} + - {python-version: '3.9', django-version: '5.1'} + - {python-version: '3.13', django-version: '4.2'} + - {python-version: '3.13', django-version: '5.0'} steps: - uses: actions/checkout@v2 diff --git a/CHANGES.rst b/CHANGES.rst index 389d676d..93b99c79 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,15 @@ Changes ======= +1.0(unreleased) +--------------- +- Drop support for Django <4.2 +- Drop support for Python <3.8 +- Add support for Django 4.2, 5.0, 5.1 +- Add support for Python 3.11, 3.12 +- Fix Compatibility issues with Django 5.1 + + 1.0b1 (unreleased) ------------------ - Add support for Django 3.1 diff --git a/README.rst b/README.rst index 784f8a33..b4f45331 100644 --- a/README.rst +++ b/README.rst @@ -54,7 +54,7 @@ soon as near-full coverage is reached. Compatibility ============= -Currently, django-newsletter officially supports Django 2.2.x LTS, 3.1.x and 3.2.x and Python 3.7 through 3.10. +Currently, django-newsletter officially supports Django 4.2.x LTS, 5.0.x and 5.1.x and Python 3.8 through 3.12. Requirements ============ diff --git a/newsletter/__init__.py b/newsletter/__init__.py index 6b350941..8ad5651d 100644 --- a/newsletter/__init__.py +++ b/newsletter/__init__.py @@ -1,7 +1,7 @@ -from pkg_resources import get_distribution, DistributionNotFound +from importlib.metadata import version, PackageNotFoundError try: - __version__ = get_distribution("django-newsletter").version -except DistributionNotFound: + __version__ = version("django-newsletter") +except PackageNotFoundError: # package is not installed __version__ = None diff --git a/newsletter/migrations/0009_alter_article_id_alter_attachment_id_and_more.py b/newsletter/migrations/0009_alter_article_id_alter_attachment_id_and_more.py new file mode 100644 index 00000000..63653e88 --- /dev/null +++ b/newsletter/migrations/0009_alter_article_id_alter_attachment_id_and_more.py @@ -0,0 +1,54 @@ +# Generated by Django 5.0.6 on 2024-05-08 15:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("newsletter", "0008_longer_subscription_name"), + ] + + operations = [ + migrations.AlterField( + model_name="article", + name="id", + field=models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + migrations.AlterField( + model_name="attachment", + name="id", + field=models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + migrations.AlterField( + model_name="message", + name="id", + field=models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + migrations.AlterField( + model_name="newsletter", + name="id", + field=models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + migrations.AlterField( + model_name="submission", + name="id", + field=models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + migrations.AlterField( + model_name="subscription", + name="id", + field=models.BigAutoField( + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" + ), + ), + ] diff --git a/newsletter/models.py b/newsletter/models.py index 0e945555..a13f2ef3 100644 --- a/newsletter/models.py +++ b/newsletter/models.py @@ -1,4 +1,5 @@ import logging +import sys import os import time from datetime import datetime @@ -17,7 +18,7 @@ from django.utils.timezone import now from django.urls import reverse -from distutils.version import LooseVersion +# from distutils.version import LooseVersion from .fields import DynamicImageField from .utils import ( @@ -740,8 +741,11 @@ def get_absolute_url(self): def get_address(name, email): # Converting name to ascii for compatibility with django < 1.9. # Remove this when django 1.8 is no longer supported. - if LooseVersion(django.get_version()) < LooseVersion('1.9'): - name = name.encode('ascii', 'ignore').decode('ascii').strip() + # if LooseVersion(django.get_version()) < LooseVersion('1.9'): + # name = name.encode('ascii', 'ignore').decode('ascii').strip() + # Assuming django.get_version() returns a string like '1.8.18' + django_version = tuple(map(int, django.get_version().split('.'))) + name = name.encode('ascii', 'ignore').decode('ascii').strip() if django_version < (1, 9) else name if name: return f'{name} <{email}>' else: diff --git a/setup.py b/setup.py index 7bfb5ed4..0ad7d410 100755 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ ), long_description=README, install_requires=[ - "Django>=2.2.16", + "Django>=4.2", "python-card-me<1.0", "ldif3<3.2", "chardet", @@ -55,23 +55,24 @@ url='http://github.com/jazzband/django-newsletter/', packages=find_packages(exclude=("tests", "test_project")), include_package_data=True, - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 6 - Mature', 'Environment :: Web Environment', 'Framework :: Django', - 'Framework :: Django :: 2.2', - 'Framework :: Django :: 3.1', - 'Framework :: Django :: 3.2', + 'Framework :: Django :: 4.2', + 'Framework :: Django :: 5.0', + 'Framework :: Django :: 5.2', 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU Affero General Public License v3', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3 :: Only', 'Topic :: Utilities' ], diff --git a/tests/test_admin.py b/tests/test_admin.py index 6ae80fbf..fac5354e 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -315,7 +315,7 @@ def test_message_with_attachment_admin(self): change_url = reverse('admin:newsletter_message_change', args=(self.message_with_attachment.pk,)) response = self.client.get(change_url) - self.assertContains(response, '