Hello community,
here is the log from the commit of package python-django-reversion for
openSUSE:Factory checked in at 2019-12-07 15:07:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-reversion (Old)
and /work/SRC/openSUSE:Factory/.python-django-reversion.new.4691 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-reversion"
Sat Dec 7 15:07:07 2019 rev:11 rq:754684 version:3.0.5
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-django-reversion/python-django-reversion.changes
2019-05-22 15:42:08.482427028 +0200
+++
/work/SRC/openSUSE:Factory/.python-django-reversion.new.4691/python-django-reversion.changes
2019-12-07 15:07:27.483863225 +0100
@@ -1,0 +2,16 @@
+Fri Dec 6 13:42:03 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Fix the requires on the Django as it really works with > 1.11 and
+ does not support python 2 anymore
+
+-------------------------------------------------------------------
+Thu Dec 5 23:22:25 UTC 2019 - Martin Herkt <[email protected]>
+
+- Update to 3.0.5:
+ * Improved performance of `get_deleted` for large datasets.
+ * Django 3.0 compatibility.
+ * Drops Django <= 1.11 compatibility.
+ * Fixed errors in manageement commands when
+ `django.contrib.admin` is not in `INSTALLED_APPS`.
+
+-------------------------------------------------------------------
Old:
----
django-reversion-3.0.4.tar.gz
New:
----
django-reversion-3.0.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-django-reversion.spec ++++++
--- /var/tmp/diff_new_pack.l0sUko/_old 2019-12-07 15:07:32.119862568 +0100
+++ /var/tmp/diff_new_pack.l0sUko/_new 2019-12-07 15:07:32.123862568 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-django-reversion
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,18 +17,21 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
+%define skip_python2 1
Name: python-django-reversion
-Version: 3.0.4
+Version: 3.0.5
Release: 0
Summary: A Django extension that provides version control for model
instances
License: BSD-3-Clause
-Group: Development/Languages/Python
URL: http://github.com/etianen/django-reversion
Source:
https://files.pythonhosted.org/packages/source/d/django-reversion/django-reversion-%{version}.tar.gz
+BuildRequires: %{python_module Django > 1.11}
+BuildRequires: %{python_module mysqlclient}
+BuildRequires: %{python_module psycopg2}
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
-Requires: python-Django
+Requires: python-Django > 1.11
Obsoletes: python-django-reversion-doc
Obsoletes: python-django-reversion-lang
BuildArch: noarch
@@ -52,6 +55,10 @@
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
+%check
+# Tests need running PGSQL and MYSQL
+#%%python_expand PYTHONPATH=%{buildroot}%{$python_sitelib} $python
tests/manage.py test tests
+
%files %{python_files}
%doc README.rst CHANGELOG.rst
%license LICENSE
++++++ django-reversion-3.0.4.tar.gz -> django-reversion-3.0.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/CHANGELOG.rst
new/django-reversion-3.0.5/CHANGELOG.rst
--- old/django-reversion-3.0.4/CHANGELOG.rst 2019-05-22 10:39:00.000000000
+0200
+++ new/django-reversion-3.0.5/CHANGELOG.rst 2019-12-02 19:23:48.000000000
+0100
@@ -3,6 +3,14 @@
django-reversion changelog
==========================
+3.0.5 - 02/12/2019
+
+- Improved performance of `get_deleted` for large datasets (@jeremy-engel).
+- Django 3.0 compatibility (@claudep).
+- Drops Django <= 1.11 compatibility (@claudep).
+- Fixed errors in manageement commands when `django.contrib.admin` is not in
`INSTALLED_APPS` (@irtimir).
+
+
3.0.4 - 22/05/2019
------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/PKG-INFO
new/django-reversion-3.0.5/PKG-INFO
--- old/django-reversion-3.0.4/PKG-INFO 2019-05-22 10:39:50.000000000 +0200
+++ new/django-reversion-3.0.5/PKG-INFO 2019-12-02 19:24:32.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: django-reversion
-Version: 3.0.4
+Version: 3.0.5
Summary: An extension to the Django web framework that provides version
control for model instances.
Home-page: http://github.com/etianen/django-reversion
Author: Dave Hall
@@ -14,8 +14,7 @@
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
Classifier: Framework :: Django
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/README.rst
new/django-reversion-3.0.5/README.rst
--- old/django-reversion-3.0.4/README.rst 2019-05-22 10:39:00.000000000
+0200
+++ new/django-reversion-3.0.5/README.rst 2019-12-02 19:23:48.000000000
+0100
@@ -11,7 +11,7 @@
Requirements
============
-- Python 2.7 or later
+- Python 3.5 or later
- Django 1.11 or later
Features
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/django_reversion.egg-info/PKG-INFO
new/django-reversion-3.0.5/django_reversion.egg-info/PKG-INFO
--- old/django-reversion-3.0.4/django_reversion.egg-info/PKG-INFO
2019-05-22 10:39:50.000000000 +0200
+++ new/django-reversion-3.0.5/django_reversion.egg-info/PKG-INFO
2019-12-02 19:24:32.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: django-reversion
-Version: 3.0.4
+Version: 3.0.5
Summary: An extension to the Django web framework that provides version
control for model instances.
Home-page: http://github.com/etianen/django-reversion
Author: Dave Hall
@@ -14,8 +14,7 @@
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
Classifier: Framework :: Django
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/django_reversion.egg-info/SOURCES.txt
new/django-reversion-3.0.5/django_reversion.egg-info/SOURCES.txt
--- old/django-reversion-3.0.4/django_reversion.egg-info/SOURCES.txt
2019-05-22 10:39:50.000000000 +0200
+++ new/django-reversion-3.0.5/django_reversion.egg-info/SOURCES.txt
2019-12-02 19:24:32.000000000 +0100
@@ -16,7 +16,6 @@
docs/commands.rst
docs/common-problems.rst
docs/conf.py
-docs/django-versions.rst
docs/errors.rst
docs/index.rst
docs/middleware.rst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/docs/admin.rst
new/django-reversion-3.0.5/docs/admin.rst
--- old/django-reversion-3.0.4/docs/admin.rst 2019-05-22 10:39:00.000000000
+0200
+++ new/django-reversion-3.0.5/docs/admin.rst 2019-12-02 19:23:48.000000000
+0100
@@ -100,7 +100,7 @@
def reversion_register(self, model, **options):
options["exclude"] = ("some_field",)
- super(YourModelAdmin, self).reversion_register(model, **options)
+ super().reversion_register(model, **options)
``model``
The model that will be registered with django-reversion.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/docs/api.rst
new/django-reversion-3.0.5/docs/api.rst
--- old/django-reversion-3.0.4/docs/api.rst 2019-05-22 10:39:00.000000000
+0200
+++ new/django-reversion-3.0.5/docs/api.rst 2019-12-02 19:23:48.000000000
+0100
@@ -81,10 +81,10 @@
assert len(versions) == 2
# Check the serialized data for the first version.
- assert versions[1].field_dict["name"] = "obj v1"
+ assert versions[1].field_dict["name"] == "obj v1"
# Check the serialized data for the second version.
- assert versions[0].field_dict["name"] = "obj v2"
+ assert versions[0].field_dict["name"] == "obj v2"
Revision metadata
@@ -95,13 +95,13 @@
.. code:: python
# Check the revision metadata for the first revision.
- assert versions[1].revision.comment = "Created revision 1"
- assert versions[1].revision.user = request.user
+ assert versions[1].revision.comment == "Created revision 1"
+ assert versions[1].revision.user == request.user
assert isinstance(versions[1].revision.date_created, datetime.datetime)
# Check the revision metadata for the second revision.
- assert versions[0].revision.comment = "Created revision 2"
- assert versions[0].revision.user = request.user
+ assert versions[0].revision.comment == "Created revision 2"
+ assert versions[0].revision.user == request.user
assert isinstance(versions[0].revision.date_created, datetime.datetime)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/docs/django-versions.rst
new/django-reversion-3.0.5/docs/django-versions.rst
--- old/django-reversion-3.0.4/docs/django-versions.rst 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/docs/django-versions.rst 1970-01-01
01:00:00.000000000 +0100
@@ -1,18 +0,0 @@
-.. _django-versions:
-
-Compatible Django versions
-==========================
-
-django-reversion aims to stay compatible with the latest LTS release of
Django, along with more recent releases. See :ref:`changelog`.
-
-Older versions of Django require an older version of django-reversion to be
installed.
-
-============== =================
-Django version Reversion release
-============== =================
-1.11+ 3.x
-1.8 2.x
-============== =================
-
-.. Warning::
- Older versions of django-reversion receive very limited support. It's
advised to upgrade your Django to remain compatible with the latest release of
django-reversion.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/docs/index.rst
new/django-reversion-3.0.5/docs/index.rst
--- old/django-reversion-3.0.4/docs/index.rst 2019-05-22 10:39:00.000000000
+0200
+++ new/django-reversion-3.0.5/docs/index.rst 2019-12-02 19:23:48.000000000
+0100
@@ -24,9 +24,6 @@
2. Add ``'reversion'`` to ``INSTALLED_APPS``.
3. Run ``manage.py migrate``.
-.. Important::
- See :ref:`django-versions` if you're not using the latest release of
Django.
-
Admin integration
-----------------
@@ -53,7 +50,6 @@
.. toctree::
:maxdepth: 1
- django-versions
common-problems
changelog
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/docs/middleware.rst
new/django-reversion-3.0.5/docs/middleware.rst
--- old/django-reversion-3.0.4/docs/middleware.rst 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/docs/middleware.rst 2019-12-02
19:23:48.000000000 +0100
@@ -13,7 +13,7 @@
The request user will also be added to the revision metadata.
-To enable ``RevisionMiddleware``, add
``'reversion.middleware.RevisionMiddleware'`` to your ``MIDDLEWARE_CLASSES``
setting. For Django >= 1.10, add it to your ``MIDDLEWARE`` setting.
+To enable ``RevisionMiddleware``, add
``'reversion.middleware.RevisionMiddleware'`` to your ``MIDDLEWARE`` setting.
.. Warning::
This will wrap every request that meets the specified criterion in a
database transaction. For best performance, consider marking individual views
instead.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/reversion/__init__.py
new/django-reversion-3.0.5/reversion/__init__.py
--- old/django-reversion-3.0.4/reversion/__init__.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/__init__.py 2019-12-02
19:23:48.000000000 +0100
@@ -36,4 +36,4 @@
get_registered_models,
)
-__version__ = VERSION = (3, 0, 4)
+__version__ = VERSION = (3, 0, 5)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/reversion/admin.py
new/django-reversion-3.0.5/reversion/admin.py
--- old/django-reversion-3.0.4/reversion/admin.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/admin.py 2019-12-02
19:23:48.000000000 +0100
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-import json
from contextlib import contextmanager
from django.db import models, transaction, connection
from django.conf.urls import url
@@ -64,25 +62,18 @@
# Messages.
- def log_addition(self, request, object, change_message=None):
- change_message = change_message or _("Initial version.")
+ def log_addition(self, request, object, message):
+ change_message = message or _("Initial version.")
+ entry = super().log_addition(request, object, change_message)
if is_active():
- # If https://code.djangoproject.com/ticket/27218 is implemented, we
- # could first call super() and get the change_message from the
returned
- # LogEntry.
- if isinstance(change_message, list):
- set_comment(json.dumps(change_message))
- else:
- set_comment(change_message)
- super(VersionAdmin, self).log_addition(request, object, change_message)
+ set_comment(entry.get_change_message())
+ return entry
def log_change(self, request, object, message):
+ entry = super().log_change(request, object, message)
if is_active():
- if isinstance(message, list):
- set_comment(json.dumps(message))
- else:
- set_comment(message)
- super(VersionAdmin, self).log_change(request, object, message)
+ set_comment(entry.get_change_message())
+ return entry
# Auto-registration.
@@ -128,7 +119,7 @@
return inline_model, follow_field
def __init__(self, *args, **kwargs):
- super(VersionAdmin, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
# Automatically register models if required.
if not is_registered(self.model):
inline_fields = ()
@@ -141,7 +132,7 @@
self._reversion_autoregister(self.model, inline_fields)
def get_urls(self):
- urls = super(VersionAdmin, self).get_urls()
+ urls = super().get_urls()
admin_site = self.admin_site
opts = self.model._meta
info = opts.app_label, opts.model_name,
@@ -156,11 +147,11 @@
def add_view(self, request, form_url='', extra_context=None):
with self.create_revision(request):
- return super(VersionAdmin, self).add_view(request, form_url,
extra_context)
+ return super().add_view(request, form_url, extra_context)
def change_view(self, request, object_id, form_url='', extra_context=None):
with self.create_revision(request):
- return super(VersionAdmin, self).change_view(request, object_id,
form_url, extra_context)
+ return super().change_view(request, object_id, form_url,
extra_context)
def _reversion_revisionform_view(self, request, version, template_name,
extra_context=None):
# Check that database transactions are supported.
@@ -233,7 +224,7 @@
"has_change_permission": self.has_change_permission(request),
}
context.update(extra_context or {})
- return super(VersionAdmin, self).changelist_view(request, context)
+ return super().changelist_view(request, context)
def recoverlist_view(self, request, extra_context=None):
"""Displays a deleted model to allow recovery."""
@@ -289,4 +280,4 @@
# Compile the context.
context = {"action_list": action_list}
context.update(extra_context or {})
- return super(VersionAdmin, self).history_view(request, object_id,
context)
+ return super().history_view(request, object_id, context)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/reversion/management/commands/__init__.py
new/django-reversion-3.0.5/reversion/management/commands/__init__.py
--- old/django-reversion-3.0.4/reversion/management/commands/__init__.py
2019-05-22 10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/management/commands/__init__.py
2019-12-02 19:23:48.000000000 +0100
@@ -1,5 +1,5 @@
-from __future__ import unicode_literals
from django.apps import apps
+from django.conf import settings
from django.contrib import admin
from django.core.management.base import BaseCommand, CommandError
from reversion.revisions import is_registered
@@ -8,7 +8,7 @@
class BaseRevisionCommand(BaseCommand):
def add_arguments(self, parser):
- super(BaseRevisionCommand, self).add_arguments(parser)
+ super().add_arguments(parser)
parser.add_argument(
"app_label",
metavar="app_label",
@@ -28,7 +28,8 @@
def get_models(self, options):
# Load admin classes.
- admin.autodiscover()
+ if "django.contrib.admin" in settings.INSTALLED_APPS:
+ admin.autodiscover()
# Get options.
app_labels = options["app_label"]
# Parse model classes.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/reversion/management/commands/createinitialrevisions.py
new/django-reversion-3.0.5/reversion/management/commands/createinitialrevisions.py
---
old/django-reversion-3.0.4/reversion/management/commands/createinitialrevisions.py
2019-05-22 10:39:00.000000000 +0200
+++
new/django-reversion-3.0.5/reversion/management/commands/createinitialrevisions.py
2019-12-02 19:23:48.000000000 +0100
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-
import json
from django.apps import apps
@@ -15,7 +13,7 @@
help = "Creates initial revisions for a given app [and model]."
def add_arguments(self, parser):
- super(Command, self).add_arguments(parser)
+ super().add_arguments(parser)
parser.add_argument(
"--comment",
action="store",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/reversion/management/commands/deleterevisions.py
new/django-reversion-3.0.5/reversion/management/commands/deleterevisions.py
--- old/django-reversion-3.0.4/reversion/management/commands/deleterevisions.py
2019-05-22 10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/management/commands/deleterevisions.py
2019-12-02 19:23:48.000000000 +0100
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
from datetime import timedelta
from django.db import transaction, models, router
from django.utils import timezone
@@ -11,7 +10,7 @@
help = "Deletes revisions for a given app [and model]."
def add_arguments(self, parser):
- super(Command, self).add_arguments(parser)
+ super().add_arguments(parser)
parser.add_argument(
"--days",
default=0,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/reversion/middleware.py
new/django-reversion-3.0.5/reversion/middleware.py
--- old/django-reversion-3.0.4/reversion/middleware.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/middleware.py 2019-12-02
19:23:48.000000000 +0100
@@ -1,9 +1,7 @@
-import sys
-from reversion.revisions import create_revision as create_revision_base
-from reversion.views import _request_creates_revision, _set_user_from_request,
create_revision
+from reversion.views import _request_creates_revision, create_revision
-class RevisionMiddleware(object):
+class RevisionMiddleware:
"""Wraps the entire request in a revision."""
@@ -13,43 +11,16 @@
atomic = True
- def __init__(self, get_response=None):
- super(RevisionMiddleware, self).__init__()
- # Support Django 1.10 middleware.
- if get_response is not None:
- self.get_response = create_revision(
- manage_manually=self.manage_manually,
- using=self.using,
- atomic=self.atomic,
- request_creates_revision=self.request_creates_revision
- )(get_response)
+ def __init__(self, get_response):
+ self.get_response = create_revision(
+ manage_manually=self.manage_manually,
+ using=self.using,
+ atomic=self.atomic,
+ request_creates_revision=self.request_creates_revision
+ )(get_response)
def request_creates_revision(self, request):
return _request_creates_revision(request)
- def process_request(self, request):
- if self.request_creates_revision(request):
- context = create_revision_base(
- manage_manually=self.manage_manually,
- using=self.using,
- atomic=self.atomic
- )
- context.__enter__()
- if not hasattr(request, "_revision_middleware"):
- setattr(request, "_revision_middleware", {})
- request._revision_middleware[self] = context
-
- def _close_revision(self, request, is_exception):
- if self in getattr(request, "_revision_middleware", {}):
- _set_user_from_request(request)
- request._revision_middleware.pop(self).__exit__(*sys.exc_info() if
is_exception else (None, None, None))
-
- def process_response(self, request, response):
- self._close_revision(request, False)
- return response
-
- def process_exception(self, request, exception):
- self._close_revision(request, True)
-
def __call__(self, request):
return self.get_response(request)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/reversion/migrations/0001_squashed_0004_auto_20160611_1202.py
new/django-reversion-3.0.5/reversion/migrations/0001_squashed_0004_auto_20160611_1202.py
---
old/django-reversion-3.0.4/reversion/migrations/0001_squashed_0004_auto_20160611_1202.py
2019-05-22 10:39:00.000000000 +0200
+++
new/django-reversion-3.0.5/reversion/migrations/0001_squashed_0004_auto_20160611_1202.py
2019-12-02 19:23:48.000000000 +0100
@@ -1,7 +1,4 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-06 13:22
-from __future__ import unicode_literals
-
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/reversion/models.py
new/django-reversion-3.0.5/reversion/models.py
--- old/django-reversion-3.0.4/reversion/models.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/models.py 2019-12-02
19:23:48.000000000 +0100
@@ -1,5 +1,3 @@
-from __future__ import unicode_literals
-
from collections import defaultdict
from itertools import chain, groupby
@@ -12,8 +10,8 @@
from django.core.serializers.base import DeserializationError
from django.db import IntegrityError, connections, models, router, transaction
from django.db.models.deletion import Collector
-from django.db.models.expressions import RawSQL
-from django.utils.encoding import force_text, python_2_unicode_compatible
+from django.db.models.functions import Cast
+from django.utils.encoding import force_text
from django.utils.functional import cached_property
from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
@@ -39,7 +37,6 @@
_safe_revert(unreverted_versions)
-@python_2_unicode_compatible
class Revision(models.Model):
"""A group of related serialized versions."""
@@ -114,12 +111,6 @@
ordering = ("-pk",)
-class SubquerySQL(RawSQL):
-
- def as_sql(self, compiler, connection):
- return self.sql, self.params
-
-
class VersionQuerySet(models.QuerySet):
def get_for_model(self, model, model_db=None):
@@ -139,33 +130,22 @@
return self.get_for_object_reference(obj.__class__, obj.pk,
model_db=model_db)
def get_deleted(self, model, model_db=None):
- # Try to do a faster JOIN.
model_db = model_db or router.db_for_write(model)
connection = connections[self.db]
if self.db == model_db and connection.vendor in ("sqlite",
"postgresql", "oracle"):
- content_type = _get_content_type(model, self.db)
- subquery = SubquerySQL(
- """
- SELECT MAX(V.{id})
- FROM {version} V
- LEFT JOIN {model} ON V.{object_id} = CAST({model}.{model_id}
as {str})
- WHERE
- V.{db} = %s AND
- V.{content_type_id} = %s AND
- {model}.{model_id} IS NULL
- GROUP BY V.{object_id}
- """.format(
- id=connection.ops.quote_name("id"),
- version=connection.ops.quote_name(Version._meta.db_table),
- model=connection.ops.quote_name(model._meta.db_table),
-
model_id=connection.ops.quote_name(model._meta.pk.db_column or
model._meta.pk.attname),
- object_id=connection.ops.quote_name("object_id"),
-
str=Version._meta.get_field("object_id").db_type(connection),
- db=connection.ops.quote_name("db"),
-
content_type_id=connection.ops.quote_name("content_type_id"),
- ),
- (model_db, content_type.id),
- output_field=Version._meta.pk,
+ model_qs = (
+ model._default_manager
+ .using(model_db)
+ .annotate(_pk_to_object_id=Cast("pk",
Version._meta.get_field("object_id")))
+ .filter(_pk_to_object_id=models.OuterRef("object_id"))
+ )
+ subquery = (
+ self.get_for_model(model, model_db=model_db)
+ .annotate(pk_not_exists=~models.Exists(model_qs))
+ .filter(pk_not_exists=True)
+ .values("object_id")
+ .annotate(latest_pk=models.Max("pk"))
+ .values("latest_pk")
)
else:
# We have to use a slow subquery.
@@ -177,9 +157,7 @@
latest_pk=models.Max("pk")
).order_by().values_list("latest_pk", flat=True)
# Perform the subquery.
- return self.filter(
- pk__in=subquery,
- )
+ return self.filter(pk__in=subquery)
def get_unique(self):
last_key = None
@@ -190,7 +168,6 @@
last_key = key
-@python_2_unicode_compatible
class Version(models.Model):
"""A saved version of a database model."""
@@ -328,11 +305,11 @@
template = "%(function)s(%(expressions)s as %(db_type)s)"
def __init__(self, expression):
- super(_Str, self).__init__(expression, output_field=models.TextField())
+ super().__init__(expression, output_field=models.TextField())
def as_sql(self, compiler, connection):
self.extra["db_type"] = self.output_field.db_type(connection)
- return super(_Str, self).as_sql(compiler, connection)
+ return super().as_sql(compiler, connection)
def _safe_subquery(method, left_query, left_field_name, right_subquery,
right_field_name):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/reversion/revisions.py
new/django-reversion-3.0.5/reversion/revisions.py
--- old/django-reversion-3.0.4/reversion/revisions.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/revisions.py 2019-12-02
19:23:48.000000000 +0100
@@ -1,4 +1,3 @@
-from __future__ import unicode_literals
from collections import namedtuple, defaultdict
from contextlib import contextmanager
from functools import wraps
@@ -10,7 +9,7 @@
from django.db.models.query import QuerySet
from django.db.models.signals import post_save, m2m_changed
from django.utils.encoding import force_text
-from django.utils import timezone, six
+from django.utils import timezone
from reversion.errors import RevisionManagementError, RegistrationError
from reversion.signals import pre_revision_commit, post_revision_commit
@@ -355,7 +354,7 @@
opts = model._meta.concrete_model._meta
for field in opts.local_many_to_many:
m2m_model = field.remote_field.through
- if isinstance(m2m_model, six.string_types):
+ if isinstance(m2m_model, str):
if "." not in m2m_model:
m2m_model = "{app_label}.{m2m_model}".format(
app_label=opts.app_label,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/reversion/views.py
new/django-reversion-3.0.5/reversion/views.py
--- old/django-reversion-3.0.4/reversion/views.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/reversion/views.py 2019-12-02
19:23:48.000000000 +0100
@@ -61,7 +61,7 @@
revision_atomic = True
def __init__(self, *args, **kwargs):
- super(RevisionMixin, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.dispatch = create_revision(
manage_manually=self.revision_manage_manually,
using=self.revision_using,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/setup.py
new/django-reversion-3.0.5/setup.py
--- old/django-reversion-3.0.4/setup.py 2019-05-22 10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/setup.py 2019-12-02 19:23:48.000000000 +0100
@@ -37,10 +37,9 @@
"License :: OSI Approved :: BSD License",
"Operating System :: OS Independent",
"Programming Language :: Python",
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
"Framework :: Django",
]
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/tests/manage.py
new/django-reversion-3.0.5/tests/manage.py
--- old/django-reversion-3.0.4/tests/manage.py 2019-05-22 10:39:00.000000000
+0200
+++ new/django-reversion-3.0.5/tests/manage.py 2019-12-02 19:23:48.000000000
+0100
@@ -6,17 +6,10 @@
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_project.settings")
try:
from django.core.management import execute_from_command_line
- except ImportError:
- # The above import may fail for some other reason. Ensure that the
- # issue is really that Django is missing to avoid masking other
- # exceptions on Python 2.
- try:
- import django # noqa
- except ImportError:
- raise ImportError(
- "Couldn't import Django. Are you sure it's installed and "
- "available on your PYTHONPATH environment variable? Did you "
- "forget to activate a virtual environment?"
- )
- raise
+ except ImportError as exc:
+ raise ImportError(
+ "Couldn't import Django. Are you sure it's installed and "
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?"
+ ) from exc
execute_from_command_line(sys.argv)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/tests/test_app/migrations/0001_initial.py
new/django-reversion-3.0.5/tests/test_app/migrations/0001_initial.py
--- old/django-reversion-3.0.4/tests/test_app/migrations/0001_initial.py
2019-05-22 10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_app/migrations/0001_initial.py
2019-12-02 19:23:48.000000000 +0100
@@ -1,7 +1,4 @@
-# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-06-14 10:27
-from __future__ import unicode_literals
-
from django.db import migrations, models
import django.db.models.deletion
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/tests/test_app/tests/base.py
new/django-reversion-3.0.5/tests/test_app/tests/base.py
--- old/django-reversion-3.0.4/tests/test_app/tests/base.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_app/tests/base.py 2019-12-02
19:23:48.000000000 +0100
@@ -1,4 +1,7 @@
from datetime import timedelta
+from importlib import import_module, reload
+from io import StringIO
+
from django.conf import settings
from django.contrib.auth.models import User
from django.core.management import call_command
@@ -6,15 +9,10 @@
from django.test import TestCase, TransactionTestCase
from django.test.utils import override_settings
from django.utils import timezone
-from django.utils.six import StringIO, assertRegex
+
import reversion
from reversion.models import Revision, Version
from test_app.models import TestModel, TestModelParent
-from importlib import import_module
-try:
- from importlib import reload
-except ImportError: # Python 2.7
- pass
# Test helpers.
@@ -28,12 +26,12 @@
clear_url_caches()
def setUp(self):
- super(TestBaseMixin, self).setUp()
+ super().setUp()
for model in list(reversion.get_registered_models()):
reversion.unregister(model)
def tearDown(self):
- super(TestBaseMixin, self).tearDown()
+ super().tearDown()
for model in list(reversion.get_registered_models()):
reversion.unregister(model)
@@ -48,7 +46,7 @@
revision = Version.objects.using(using).get_for_object(objects[0],
model_db=model_db).get().revision
self.assertEqual(revision.user, user)
if hasattr(comment, 'pattern'):
- assertRegex(self, revision.get_comment(), comment)
+ self.assertRegex(revision.get_comment(), comment)
elif comment is not None: # Allow a wildcard comment.
self.assertEqual(revision.get_comment(), comment)
self.assertAlmostEqual(revision.date_created, date_created or
timezone.now(), delta=timedelta(seconds=1))
@@ -81,14 +79,14 @@
class TestModelMixin(object):
def setUp(self):
- super(TestModelMixin, self).setUp()
+ super().setUp()
reversion.register(TestModel)
class TestModelParentMixin(TestModelMixin):
def setUp(self):
- super(TestModelParentMixin, self).setUp()
+ super().setUp()
reversion.register(TestModelParent, follow=("testmodel_ptr",))
@@ -96,7 +94,7 @@
class UserMixin(TestBase):
def setUp(self):
- super(UserMixin, self).setUp()
+ super().setUp()
self.user = User(username="test", is_staff=True, is_superuser=True)
self.user.set_password("password")
self.user.save()
@@ -105,5 +103,5 @@
class LoginMixin(UserMixin):
def setUp(self):
- super(LoginMixin, self).setUp()
+ super().setUp()
self.client.login(username="test", password="password")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/tests/test_app/tests/test_admin.py
new/django-reversion-3.0.5/tests/test_app/tests/test_admin.py
--- old/django-reversion-3.0.4/tests/test_app/tests/test_admin.py
2019-05-22 10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_app/tests/test_admin.py
2019-12-02 19:23:48.000000000 +0100
@@ -12,12 +12,12 @@
class AdminMixin(TestBase):
def setUp(self):
- super(AdminMixin, self).setUp()
+ super().setUp()
admin.site.register(TestModelParent, VersionAdmin)
self.reloadUrls()
def tearDown(self):
- super(AdminMixin, self).tearDown()
+ super().tearDown()
admin.site.unregister(TestModelParent)
self.reloadUrls()
@@ -40,9 +40,7 @@
})
obj = TestModelParent.objects.get()
self.assertSingleRevision(
- (obj, obj.testmodel_ptr), user=self.user,
- # Django 1.8 gives "Initial version.", Django > 1.8 "Added."
- comment=re.compile(r"(Initial version\.|Added\.)")
+ (obj, obj.testmodel_ptr), user=self.user, comment="Added."
)
@@ -56,7 +54,8 @@
})
self.assertSingleRevision(
(obj, obj.testmodel_ptr), user=self.user,
- comment="Changed name and parent_name."
+ # Django 3.0 changed formatting a bit.
+ comment=re.compile(r"Changed [nN]ame and [pP]arent[ _]name\.")
)
@@ -71,7 +70,7 @@
class AdminRevisionViewTest(LoginMixin, AdminMixin, TestBase):
def setUp(self):
- super(AdminRevisionViewTest, self).setUp()
+ super().setUp()
with reversion.create_revision():
self.obj = TestModelParent.objects.create()
with reversion.create_revision():
@@ -132,7 +131,7 @@
class AdminRecoverViewTest(LoginMixin, AdminMixin, TestBase):
def setUp(self):
- super(AdminRecoverViewTest, self).setUp()
+ super().setUp()
with reversion.create_revision():
obj = TestModelParent.objects.create()
obj.delete()
@@ -189,12 +188,12 @@
class AdminQuotingTest(LoginMixin, AdminMixin, TestBase):
def setUp(self):
- super(AdminQuotingTest, self).setUp()
+ super().setUp()
admin.site.register(TestModelEscapePK, VersionAdmin)
self.reloadUrls()
def tearDown(self):
- super(AdminQuotingTest, self).tearDown()
+ super().tearDown()
admin.site.unregister(TestModelEscapePK)
self.reloadUrls()
@@ -240,12 +239,12 @@
class AdminRegisterInlineTest(TestBase):
def setUp(self):
- super(AdminRegisterInlineTest, self).setUp()
+ super().setUp()
admin.site.register(TestModelParent, TestModelParentAdmin)
self.reloadUrls()
def tearDown(self):
- super(AdminRegisterInlineTest, self).tearDown()
+ super().tearDown()
admin.site.unregister(TestModelParent)
self.reloadUrls()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/tests/test_app/tests/test_api.py
new/django-reversion-3.0.5/tests/test_app/tests/test_api.py
--- old/django-reversion-3.0.4/tests/test_app/tests/test_api.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_app/tests/test_api.py 2019-12-02
19:23:48.000000000 +0100
@@ -1,4 +1,6 @@
from datetime import timedelta
+from unittest.mock import MagicMock
+
from django.contrib.auth.models import User
from django.db import models
from django.db.transaction import get_connection
@@ -7,11 +9,6 @@
from test_app.models import TestModel, TestModelRelated, TestModelThrough,
TestModelParent, TestMeta
from test_app.tests.base import TestBase, TestBaseTransaction, TestModelMixin,
UserMixin
-try:
- from unittest.mock import MagicMock
-except ImportError:
- from mock import MagicMock
-
class SaveTest(TestModelMixin, TestBase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/tests/test_app/tests/test_middleware.py
new/django-reversion-3.0.5/tests/test_app/tests/test_middleware.py
--- old/django-reversion-3.0.4/tests/test_app/tests/test_middleware.py
2019-05-22 10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_app/tests/test_middleware.py
2019-12-02 19:23:48.000000000 +0100
@@ -6,7 +6,6 @@
use_middleware = override_settings(
MIDDLEWARE=settings.MIDDLEWARE +
["reversion.middleware.RevisionMiddleware"],
- MIDDLEWARE_CLASSES=settings.MIDDLEWARE_CLASSES +
["reversion.middleware.RevisionMiddleware"],
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/tests/test_app/tests/test_models.py
new/django-reversion-3.0.5/tests/test_app/tests/test_models.py
--- old/django-reversion-3.0.4/tests/test_app/tests/test_models.py
2019-05-22 10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_app/tests/test_models.py
2019-12-02 19:23:48.000000000 +0100
@@ -1,4 +1,3 @@
-from django.utils.encoding import force_text
import reversion
from reversion.models import Version
from test_app.models import (
@@ -177,8 +176,8 @@
obj_1.delete()
pk_2 = obj_2.pk
obj_2.delete()
- self.assertEqual(Version.objects.get_deleted(TestModel)[0].object_id,
force_text(pk_2))
- self.assertEqual(Version.objects.get_deleted(TestModel)[1].object_id,
force_text(pk_1))
+ self.assertEqual(Version.objects.get_deleted(TestModel)[0].object_id,
str(pk_2))
+ self.assertEqual(Version.objects.get_deleted(TestModel)[1].object_id,
str(pk_1))
def testGetDeletedPostgres(self):
with reversion.create_revision(using="postgres"):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django-reversion-3.0.4/tests/test_app/views.py
new/django-reversion-3.0.5/tests/test_app/views.py
--- old/django-reversion-3.0.4/tests/test_app/views.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_app/views.py 2019-12-02
19:23:48.000000000 +0100
@@ -22,7 +22,7 @@
def revision_request_creates_revision(self, request):
silent = request.META.get("HTTP_X_NOREVISION", "false") == "true"
- return super(RevisionMixinView,
self).revision_request_creates_revision(request) and not silent
+ return super().revision_request_creates_revision(request) and not
silent
def dispatch(self, request):
return save_obj_view(request)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django-reversion-3.0.4/tests/test_project/settings.py
new/django-reversion-3.0.5/tests/test_project/settings.py
--- old/django-reversion-3.0.4/tests/test_project/settings.py 2019-05-22
10:39:00.000000000 +0200
+++ new/django-reversion-3.0.5/tests/test_project/settings.py 2019-12-02
19:23:48.000000000 +0100
@@ -42,7 +42,7 @@
"test_app",
]
-MIDDLEWARE = MIDDLEWARE_CLASSES = [
+MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",