Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-django-reversion for
openSUSE:Factory checked in at 2026-08-22 21:34:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-django-reversion (Old)
and /work/SRC/openSUSE:Factory/.python-django-reversion.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-reversion"
Sat Aug 22 21:34:55 2026 rev:19 rq:1372927 version:6.3.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-django-reversion/python-django-reversion.changes
2026-03-31 16:26:37.577740330 +0200
+++
/work/SRC/openSUSE:Factory/.python-django-reversion.new.1258/python-django-reversion.changes
2026-08-22 21:37:01.763117223 +0200
@@ -1,0 +2,8 @@
+Fri Aug 21 20:04:41 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 6.3.0:
+ * Added Turkish translation (@mcihad).
+ * Added object_id_field to reversion.register()
+ (@philippeducasse).
+
+-------------------------------------------------------------------
Old:
----
django_reversion-6.1.0.tar.gz
New:
----
django_reversion-6.3.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-django-reversion.spec ++++++
--- /var/tmp/diff_new_pack.eKrC1l/_old 2026-08-22 21:37:02.387140331 +0200
+++ /var/tmp/diff_new_pack.eKrC1l/_new 2026-08-22 21:37:02.388140368 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-django-reversion
-Version: 6.1.0
+Version: 6.3.0
Release: 0
Summary: A Django extension that provides version control for model
instances
License: BSD-3-Clause
++++++ django_reversion-6.1.0.tar.gz -> django_reversion-6.3.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/CHANGELOG.rst
new/django_reversion-6.3.0/CHANGELOG.rst
--- old/django_reversion-6.1.0/CHANGELOG.rst 2025-12-12 21:23:38.000000000
+0100
+++ new/django_reversion-6.3.0/CHANGELOG.rst 2026-06-12 21:55:32.000000000
+0200
@@ -3,6 +3,18 @@
django-reversion changelog
==========================
+6.3.0 - 2026-06-12
+------------------
+
+- Added Turkish translation (@mcihad).
+
+
+6.2.0 - 2026-05-12
+------------------
+
+- Added ``object_id_field`` to ``reversion.register()`` (@philippeducasse).
+
+
6.1.0 - 2025-12-12
------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/PKG-INFO
new/django_reversion-6.3.0/PKG-INFO
--- old/django_reversion-6.1.0/PKG-INFO 2025-12-12 21:23:49.294037300 +0100
+++ new/django_reversion-6.3.0/PKG-INFO 2026-06-12 21:55:41.712027800 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: django-reversion
-Version: 6.1.0
+Version: 6.3.0
Summary: An extension to the Django web framework that provides version
control for model instances.
Home-page: https://github.com/etianen/django-reversion
Author: Dave Hall
@@ -17,7 +17,11 @@
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Classifier: Framework :: Django
+Classifier: Framework :: Django :: 4.2
+Classifier: Framework :: Django :: 5.2
+Classifier: Framework :: Django :: 6.0
Requires-Python: >=3.9
License-File: LICENSE
Requires-Dist: django>=4.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_reversion-6.1.0/django_reversion.egg-info/PKG-INFO
new/django_reversion-6.3.0/django_reversion.egg-info/PKG-INFO
--- old/django_reversion-6.1.0/django_reversion.egg-info/PKG-INFO
2025-12-12 21:23:49.000000000 +0100
+++ new/django_reversion-6.3.0/django_reversion.egg-info/PKG-INFO
2026-06-12 21:55:41.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: django-reversion
-Version: 6.1.0
+Version: 6.3.0
Summary: An extension to the Django web framework that provides version
control for model instances.
Home-page: https://github.com/etianen/django-reversion
Author: Dave Hall
@@ -17,7 +17,11 @@
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Classifier: Framework :: Django
+Classifier: Framework :: Django :: 4.2
+Classifier: Framework :: Django :: 5.2
+Classifier: Framework :: Django :: 6.0
Requires-Python: >=3.9
License-File: LICENSE
Requires-Dist: django>=4.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_reversion-6.1.0/django_reversion.egg-info/SOURCES.txt
new/django_reversion-6.3.0/django_reversion.egg-info/SOURCES.txt
--- old/django_reversion-6.1.0/django_reversion.egg-info/SOURCES.txt
2025-12-12 21:23:49.000000000 +0100
+++ new/django_reversion-6.3.0/django_reversion.egg-info/SOURCES.txt
2026-06-12 21:55:41.000000000 +0200
@@ -76,6 +76,8 @@
reversion/locale/sl_SI/LC_MESSAGES/django.po
reversion/locale/sv/LC_MESSAGES/django.mo
reversion/locale/sv/LC_MESSAGES/django.po
+reversion/locale/tr/LC_MESSAGES/django.mo
+reversion/locale/tr/LC_MESSAGES/django.po
reversion/locale/uk/LC_MESSAGES/django.mo
reversion/locale/uk/LC_MESSAGES/django.po
reversion/locale/zh_Hans/LC_MESSAGES/django.mo
@@ -100,6 +102,7 @@
tests/test_app/views.py
tests/test_app/migrations/0001_initial.py
tests/test_app/migrations/0002_alter_testmodel_related_and_more.py
+tests/test_app/migrations/0003_testmodelcustomobjectid.py
tests/test_app/migrations/__init__.py
tests/test_app/tests/__init__.py
tests/test_app/tests/base.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/docs/api.rst
new/django_reversion-6.3.0/docs/api.rst
--- old/django_reversion-6.1.0/docs/api.rst 2025-12-12 21:23:38.000000000
+0100
+++ new/django_reversion-6.3.0/docs/api.rst 2026-06-12 21:55:32.000000000
+0200
@@ -187,6 +187,11 @@
See `Serialization of natural keys
<https://docs.djangoproject.com/en/3.1/topics/serialization/#serialization-of-natural-keys>`_
+ ``object_id_field=None``
+ The name of the model field to use as the version's ``object_id``.
Defaults to the model's primary key field. Use this when you want versions to
be keyed on a different unique field, such as a slug.
+
+ The field must exist on the model (validated at registration time).
``"pk"`` is not a valid value — use the concrete field name instead (e.g.
``"id"``).
+
.. Hint::
By default, django-reversion will not register any parent classes of a
model that uses multi-table inheritance. If you wish to also add parent models
to your revision, you must explicitly add their ``parent_ptr`` fields to the
``follow`` parameter when you register the model.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/reversion/__init__.py
new/django_reversion-6.3.0/reversion/__init__.py
--- old/django_reversion-6.1.0/reversion/__init__.py 2025-12-12
21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/reversion/__init__.py 2026-06-12
21:55:32.000000000 +0200
@@ -36,4 +36,4 @@
get_registered_models,
)
-__version__ = VERSION = (6, 1, 0)
+__version__ = VERSION = (6, 3, 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/reversion/admin.py
new/django_reversion-6.3.0/reversion/admin.py
--- old/django_reversion-6.1.0/reversion/admin.py 2025-12-12
21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/reversion/admin.py 2026-06-12
21:55:32.000000000 +0200
@@ -18,7 +18,7 @@
from reversion.errors import RevertError
from reversion.models import Version
-from reversion.revisions import is_active, register, is_registered,
set_comment, create_revision, set_user
+from reversion.revisions import is_active, register, is_registered,
set_comment, create_revision, set_user, _get_options
from reversion.utils import mute_signals
@@ -200,7 +200,18 @@
version.revision.revert(delete=True)
# Run the normal changeform view.
with self.create_revision(request):
- response = self.changeform_view(request,
quote(version.object_id), request.path, extra_context)
+ opts = _get_options(version._model)
+ if opts.object_id_field == version._model._meta.pk.attname:
+ obj_pk = version.object_id
+ else:
+ obj = get_object_or_404(
+ version._model._default_manager.using(version.db),
+ **{opts.object_id_field: version.object_id},
+ )
+ obj_pk = str(obj.pk)
+ response = self.changeform_view(
+ request, quote(obj_pk), request.path, extra_context
+ )
# Decide on whether the keep the changes.
if request.method == "POST" and response.status_code ==
302:
set_comment(_("Reverted to previous version, saved on
%(datetime)s") % {
@@ -305,6 +316,12 @@
if not self.has_change_permission(request):
raise PermissionDenied
+ version_opts = _get_options(self.model)
+ if version_opts.object_id_field == self.model._meta.pk.attname:
+ reversion_object_id = unquote(object_id)
+ else:
+ obj = get_object_or_404(self.model, pk=unquote(object_id))
+ reversion_object_id = str(getattr(obj,
version_opts.object_id_field))
opts = self.model._meta
action_list = [
{
@@ -317,7 +334,7 @@
for version
in self._reversion_order_version_queryset(request,
Version.objects.get_for_object_reference(
self.model,
- unquote(object_id), # Underscores in primary key get quoted
to "_5F"
+ reversion_object_id,
).select_related("revision", "revision__user"))
]
# Compile the context.
Binary files
old/django_reversion-6.1.0/reversion/locale/tr/LC_MESSAGES/django.mo and
new/django_reversion-6.3.0/reversion/locale/tr/LC_MESSAGES/django.mo differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_reversion-6.1.0/reversion/locale/tr/LC_MESSAGES/django.po
new/django_reversion-6.3.0/reversion/locale/tr/LC_MESSAGES/django.po
--- old/django_reversion-6.1.0/reversion/locale/tr/LC_MESSAGES/django.po
1970-01-01 01:00:00.000000000 +0100
+++ new/django_reversion-6.3.0/reversion/locale/tr/LC_MESSAGES/django.po
2026-06-12 21:55:32.000000000 +0200
@@ -0,0 +1,158 @@
+# Turkish translation for django-reversion.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the django-reversion
package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django-reversion\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2026-06-09 00:00+0300\n"
+"PO-Revision-Date: 2026-06-09 00:00+0300\n"
+"Last-Translator: \n"
+"Language-Team: Turkish\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: reversion/admin.py:88
+msgid "Initial version."
+msgstr "İlk sürüm."
+
+#: reversion/admin.py:217
+#, python-format
+msgid "Reverted to previous version, saved on %(datetime)s"
+msgstr "%(datetime)s tarihinde kaydedilen önceki sürüme geri alındı"
+
+#: reversion/admin.py:225
+#, python-format
+msgid "Could not load %(object_repr)s version - not found"
+msgstr "%(object_repr)s sürümü yüklenemedi - bulunamadı"
+
+#: reversion/admin.py:245
+#, python-format
+msgid "Recover %(name)s"
+msgstr "%(name)s öğesini kurtar"
+
+#: reversion/admin.py:261
+#, python-format
+msgid "Revert %(name)s"
+msgstr "%(name)s öğesini geri al"
+
+#: reversion/admin.py:299 reversion/templates/reversion/change_list.html:7
+#: reversion/templates/reversion/recover_form.html:10
+#: reversion/templates/reversion/recover_list.html:10
+#, python-format
+msgid "Recover deleted %(name)s"
+msgstr "Silinen %(name)s öğelerini kurtar"
+
+#: reversion/apps.py:7
+msgid "Reversion"
+msgstr "Sürümleme"
+
+#: reversion/models.py:39
+#, python-format
+msgid "Could not save %(object_repr)s version - missing dependency."
+msgstr "%(object_repr)s sürümü kaydedilemedi - eksik bağımlılık."
+
+#: reversion/models.py:52
+msgid "date created"
+msgstr "oluşturulma tarihi"
+
+#: reversion/models.py:61
+msgid "user"
+msgstr "kullanıcı"
+
+#: reversion/models.py:67
+msgid "comment"
+msgstr "yorum"
+
+#: reversion/models.py:119
+msgid "revision"
+msgstr "revizyon"
+
+#: reversion/models.py:120
+msgid "revisions"
+msgstr "revizyonlar"
+
+#: reversion/models.py:283
+#, python-format
+msgid "Could not load %(object_repr)s version - incompatible version data."
+msgstr "%(object_repr)s sürümü yüklenemedi - uyumsuz sürüm verisi."
+
+#: reversion/models.py:287
+#, python-format
+msgid "Could not load %(object_repr)s version - unknown serializer %(format)s."
+msgstr "%(object_repr)s sürümü yüklenemedi - bilinmeyen serileştirici
%(format)s."
+
+#: reversion/models.py:343
+msgid "version"
+msgstr "sürüm"
+
+#: reversion/models.py:344
+msgid "versions"
+msgstr "sürümler"
+
+#: reversion/templates/reversion/object_history.html:8
+msgid ""
+"Choose a date from the list below to revert to a previous version of this "
+"object."
+msgstr ""
+"Bu nesnenin önceki bir sürümüne geri dönmek için aşağıdaki listeden bir "
+"tarih seçin."
+
+#: reversion/templates/reversion/object_history.html:15
+#: reversion/templates/reversion/recover_list.html:23
+msgid "Date/time"
+msgstr "Tarih/saat"
+
+#: reversion/templates/reversion/object_history.html:16
+msgid "User"
+msgstr "Kullanıcı"
+
+#: reversion/templates/reversion/object_history.html:17
+msgid "Action"
+msgstr "İşlem"
+
+#: reversion/templates/reversion/object_history.html:38
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Bu nesnenin değişiklik geçmişi yok. Muhtemelen bu yönetim sitesi üzerinden "
+"eklenmedi."
+
+#: reversion/templates/reversion/recover_form.html:7
+#: reversion/templates/reversion/recover_list.html:7
+#: reversion/templates/reversion/revision_form.html:7
+msgid "Home"
+msgstr "Ana sayfa"
+
+#: reversion/templates/reversion/recover_form.html:20
+msgid "Press the save button below to recover this version of the object."
+msgstr "Nesnenin bu sürümünü kurtarmak için aşağıdaki kaydet düğmesine basın."
+
+#: reversion/templates/reversion/recover_list.html:17
+msgid ""
+"Choose a date from the list below to recover a deleted version of an object."
+msgstr ""
+"Bir nesnenin silinmiş bir sürümünü kurtarmak için aşağıdaki listeden bir "
+"tarih seçin."
+
+#: reversion/templates/reversion/recover_list.html:37
+msgid "There are no deleted objects to recover."
+msgstr "Kurtarılacak silinmiş nesne yok."
+
+#: reversion/templates/reversion/revision_form.html:11
+msgid "History"
+msgstr "Geçmiş"
+
+#: reversion/templates/reversion/revision_form.html:12
+#, python-format
+msgid "Revert %(verbose_name)s"
+msgstr "%(verbose_name)s öğesini geri al"
+
+#: reversion/templates/reversion/revision_form.html:21
+msgid "Press the save button below to revert to this version of the object."
+msgstr "Nesnenin bu sürümüne geri dönmek için aşağıdaki kaydet düğmesine
basın."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/reversion/models.py
new/django_reversion-6.3.0/reversion/models.py
--- old/django_reversion-6.1.0/reversion/models.py 2025-12-12
21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/reversion/models.py 2026-06-12
21:55:32.000000000 +0200
@@ -19,8 +19,8 @@
from django.utils.translation import gettext_lazy as _
from reversion.errors import RevertError
-from reversion.revisions import (_follow_relations_recursive,
- _get_content_type, _get_options)
+from reversion.revisions import (_follow_relations_recursive,
_get_content_type,
+ _get_options)
logger = logging.getLogger(__name__)
@@ -91,7 +91,10 @@
model = version._model
try:
# Load the model instance from the same DB as it
was saved under.
-
old_revision.add(model._default_manager.using(version.db).get(pk=version.object_id))
+ id_field = _get_options(model).object_id_field
+ old_revision.add(
+
model._default_manager.using(version.db).get(**{id_field: version.object_id})
+ )
except model.DoesNotExist:
pass
# Calculate the set of all objects that are in the
revision now.
@@ -135,14 +138,17 @@
)
def get_for_object(self, obj, model_db=None):
- return self.get_for_object_reference(obj.__class__, obj.pk,
model_db=model_db)
+ opts = _get_options(obj.__class__)
+ return self.get_for_object_reference(
+ obj.__class__, getattr(obj, opts.object_id_field),
model_db=model_db
+ )
def get_deleted(self, model, model_db=None):
model_db = model_db or router.db_for_write(model)
connection = connections[self.db]
+ object_id_field_name = _get_options(model).object_id_field
if self.db == model_db and connection.vendor in ("sqlite",
"postgresql", "oracle"):
- pk_field_name = model._meta.pk.name
- object_id_cast_target = model._meta.get_field(pk_field_name)
+ object_id_cast_target = model._meta.get_field(object_id_field_name)
if django.VERSION >= (2, 1):
# django 2.0 contains a critical bug that doesn't allow the
code below to work,
# fallback to casting primary keys then
@@ -158,14 +164,14 @@
model_qs = (
model._default_manager
.using(model_db)
- .filter(**{pk_field_name: casted_object_id})
+ .filter(**{object_id_field_name: casted_object_id})
)
else:
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"))
+ .annotate(_field_to_object_id=Cast(object_id_field_name,
Version._meta.get_field("object_id")))
+ .filter(_field_to_object_id=models.OuterRef("object_id"))
)
# conditional expressions are being supported since django 3.0
# DISTINCT ON works only for Postgres DB
@@ -190,7 +196,9 @@
# We have to use a slow subquery.
subquery = self.get_for_model(model, model_db=model_db).exclude(
object_id__in=list(
- model._default_manager.using(model_db).values_list("pk",
flat=True).order_by().iterator()
+ model._default_manager.using(model_db).values_list(
+ object_id_field_name, flat=True
+ ).order_by().iterator()
),
).values_list("object_id").annotate(
latest_pk=models.Max("pk")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/reversion/revisions.py
new/django_reversion-6.3.0/reversion/revisions.py
--- old/django_reversion-6.1.0/reversion/revisions.py 2025-12-12
21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/reversion/revisions.py 2026-06-12
21:55:32.000000000 +0200
@@ -21,6 +21,7 @@
"for_concrete_model",
"ignore_duplicates",
"use_natural_foreign_keys",
+ "object_id_field"
))
@@ -168,7 +169,7 @@
return
version_options = _get_options(obj.__class__)
content_type = _get_content_type(obj.__class__, using)
- object_id = force_str(obj.pk)
+ object_id = force_str(getattr(obj, version_options.object_id_field))
version_key = (content_type, object_id)
# If the obj is already in the revision, stop now.
db_versions = _current_frame().db_versions
@@ -191,7 +192,9 @@
)
# If the version is a duplicate, stop now.
if version_options.ignore_duplicates and explicit:
- previous_version = Version.objects.using(using).get_for_object(obj,
model_db=model_db).first()
+ previous_version =
Version.objects.using(using).get_for_object_reference(
+ obj.__class__, object_id, model_db=model_db
+ ).first()
if previous_version and previous_version._local_field_dict ==
version._local_field_dict:
return
# Store the version.
@@ -221,7 +224,9 @@
model: {
db: frozenset(map(
force_str,
-
model._base_manager.using(db).filter(pk__in=pks).values_list("pk", flat=True),
+ model._base_manager.using(db).filter(
+ **{f"{_get_options(model).object_id_field}__in": pks}
+ ).values_list(_get_options(model).object_id_field, flat=True),
))
for db, pks in db_pks.items()
}
@@ -376,7 +381,7 @@
def register(model=None, fields=None, exclude=(), follow=(), format="json",
- for_concrete_model=True, ignore_duplicates=False,
use_natural_foreign_keys=False):
+ for_concrete_model=True, ignore_duplicates=False,
use_natural_foreign_keys=False, object_id_field=None):
def register(model):
# Prevent multiple registration.
if is_registered(model):
@@ -385,6 +390,12 @@
))
# Parse fields.
opts = model._meta.concrete_model._meta
+ if object_id_field is None:
+ id_field = model._meta.pk.attname
+ else:
+ model._meta.get_field(object_id_field)
+ id_field = object_id_field
+
version_options = _VersionOptions(
fields=tuple(
field_name
@@ -401,6 +412,7 @@
for_concrete_model=for_concrete_model,
ignore_duplicates=ignore_duplicates,
use_natural_foreign_keys=use_natural_foreign_keys,
+ object_id_field=id_field,
)
# Register the model.
_registered_models[_get_registration_key(model)] = version_options
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/setup.py
new/django_reversion-6.3.0/setup.py
--- old/django_reversion-6.1.0/setup.py 2025-12-12 21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/setup.py 2026-06-12 21:55:32.000000000 +0200
@@ -52,6 +52,10 @@
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
+ "Programming Language :: Python :: 3.14",
"Framework :: Django",
+ "Framework :: Django :: 4.2",
+ "Framework :: Django :: 5.2",
+ "Framework :: Django :: 6.0",
],
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/tests/test_app/admin.py
new/django_reversion-6.3.0/tests/test_app/admin.py
--- old/django_reversion-6.1.0/tests/test_app/admin.py 2025-12-12
21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/tests/test_app/admin.py 2026-06-12
21:55:32.000000000 +0200
@@ -9,6 +9,4 @@
admin.site.register(TestModel, TestModelAdmin)
-
-
admin.site.register(TestModelRelated, admin.ModelAdmin)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_reversion-6.1.0/tests/test_app/migrations/0003_testmodelcustomobjectid.py
new/django_reversion-6.3.0/tests/test_app/migrations/0003_testmodelcustomobjectid.py
---
old/django_reversion-6.1.0/tests/test_app/migrations/0003_testmodelcustomobjectid.py
1970-01-01 01:00:00.000000000 +0100
+++
new/django_reversion-6.3.0/tests/test_app/migrations/0003_testmodelcustomobjectid.py
2026-06-12 21:55:32.000000000 +0200
@@ -0,0 +1,21 @@
+# Generated by Django 6.0.4 on 2026-05-02 12:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('test_app', '0002_alter_testmodel_related_and_more'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='TestModelCustomObjectId',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True,
serialize=False, verbose_name='ID')),
+ ('slug', models.CharField(max_length=191, unique=True)),
+ ('name', models.CharField(default='v1', max_length=191)),
+ ],
+ ),
+ ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/django_reversion-6.1.0/tests/test_app/models.py
new/django_reversion-6.3.0/tests/test_app/models.py
--- old/django_reversion-6.1.0/tests/test_app/models.py 2025-12-12
21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/tests/test_app/models.py 2026-06-12
21:55:32.000000000 +0200
@@ -150,3 +150,8 @@
max_length=191,
unique=True,
)
+
+
+class TestModelCustomObjectId(models.Model):
+ slug = models.CharField(max_length=191, unique=True)
+ name = models.CharField(max_length=191, default="v1")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_reversion-6.1.0/tests/test_app/tests/test_admin.py
new/django_reversion-6.3.0/tests/test_app/tests/test_admin.py
--- old/django_reversion-6.1.0/tests/test_app/tests/test_admin.py
2025-12-12 21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/tests/test_app/tests/test_admin.py
2026-06-12 21:55:32.000000000 +0200
@@ -9,7 +9,9 @@
import reversion
from reversion.admin import VersionAdmin
from reversion.models import Version
-from test_app.models import TestModel, TestModelParent, TestModelInline,
TestModelGenericInline, TestModelEscapePK
+from test_app.models import (
+ TestModel, TestModelParent, TestModelInline, TestModelGenericInline,
TestModelEscapePK, TestModelCustomObjectId
+)
from test_app.tests.base import TestBase, LoginMixin
@@ -569,3 +571,70 @@
def testAutoRegisterGenericInline(self):
self.assertTrue(reversion.is_registered(TestModelGenericInline))
+
+
+class TestModelCustomObjectIdAdmin(VersionAdmin):
+
+ def reversion_register(self, model, **kwargs):
+ kwargs["object_id_field"] = "slug"
+ super().reversion_register(model, **kwargs)
+
+
+class CustomObjectIdAdminMixin(TestBase):
+
+ def setUp(self):
+ super().setUp()
+ admin.site.register(TestModelCustomObjectId,
TestModelCustomObjectIdAdmin)
+ self.reloadUrls()
+
+ def tearDown(self):
+ super().tearDown()
+ admin.site.unregister(TestModelCustomObjectId)
+ self.reloadUrls()
+
+
+class CustomObjectIdAdminHistoryViewTest(LoginMixin, CustomObjectIdAdminMixin,
TestBase):
+
+ def testHistoryView(self):
+ with reversion.create_revision():
+ obj = TestModelCustomObjectId.objects.create(slug="test",
name="v1")
+ with reversion.create_revision():
+ obj.name = "v2"
+ obj.save()
+ response =
self.client.get(resolve_url("admin:test_app_testmodelcustomobjectid_history",
obj.pk))
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(len(response.context["action_list"]), 2)
+
+
+class CustomObjectIdAdminRevisionViewTest(LoginMixin,
CustomObjectIdAdminMixin, TestBase):
+
+ def setUp(self):
+ super().setUp()
+ with reversion.create_revision():
+ self.obj = TestModelCustomObjectId.objects.create(slug="test",
name="v1")
+ with reversion.create_revision():
+ self.obj.name = "v2"
+ self.obj.save()
+
+ def testRevisionViewGet(self):
+ version =
Version.objects.get_for_object_reference(TestModelCustomObjectId, "test")[1]
+ response = self.client.get(resolve_url(
+ "admin:test_app_testmodelcustomobjectid_revision",
+ self.obj.slug,
+ version.pk,
+ ))
+ self.assertEqual(response.status_code, 200)
+ self.assertContains(response, 'value="v1"')
+ # Verify the revert was rolled back (GET should not persist changes).
+ self.obj.refresh_from_db()
+ self.assertEqual(self.obj.name, "v2")
+
+ def testRevisionViewRevert(self):
+ version =
Version.objects.get_for_object_reference(TestModelCustomObjectId, "test")[1]
+ self.client.post(resolve_url(
+ "admin:test_app_testmodelcustomobjectid_revision",
+ self.obj.slug,
+ version.pk,
+ ), {"slug": "test", "name": "v1"})
+ self.obj.refresh_from_db()
+ self.assertEqual(self.obj.name, "v1")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/django_reversion-6.1.0/tests/test_app/tests/test_models.py
new/django_reversion-6.3.0/tests/test_app/tests/test_models.py
--- old/django_reversion-6.1.0/tests/test_app/tests/test_models.py
2025-12-12 21:23:38.000000000 +0100
+++ new/django_reversion-6.3.0/tests/test_app/tests/test_models.py
2026-06-12 21:55:32.000000000 +0200
@@ -5,6 +5,7 @@
TestModelNestedInline,
TestModelInlineByNaturalKey, TestModelWithNaturalKey,
TestModelWithUniqueConstraint,
+ TestModelCustomObjectId
)
from test_app.tests.base import TestBase, TestModelMixin, TestModelParentMixin
import json
@@ -458,3 +459,74 @@
TestModelWithUniqueConstraint.objects.create(name='A')
except Exception:
pass
+
+
+class CustomObjectIdTest(TestBase):
+
+ def setUp(self):
+ super().setUp()
+ reversion.register(TestModelCustomObjectId, object_id_field='slug')
+
+ def testObjectIdStoredAsSlug(self):
+ with reversion.create_revision():
+ TestModelCustomObjectId.objects.create(slug='custom-id', name='v1')
+ version =
Version.objects.get_for_object_reference(TestModelCustomObjectId,
'custom-id').get()
+ self.assertEqual(version.object_id, 'custom-id')
+
+ def testGetForObject(self):
+ with reversion.create_revision():
+ obj = TestModelCustomObjectId.objects.create(slug='custom-id',
name='v1')
+ self.assertEqual(Version.objects.get_for_object(obj).count(), 1)
+
+ def testFieldDict(self):
+ with reversion.create_revision():
+ obj = TestModelCustomObjectId.objects.create(slug='custom-id',
name='v1')
+ version =
Version.objects.get_for_object_reference(TestModelCustomObjectId,
'custom-id').get()
+ self.assertEqual(version.field_dict, {'id': obj.pk, 'slug':
'custom-id', 'name': 'v1'})
+
+ def testMultipleVersions(self):
+ with reversion.create_revision():
+ obj = TestModelCustomObjectId.objects.create(slug='custom-id',
name='v1')
+ with reversion.create_revision():
+ obj.name = 'v2'
+ obj.save()
+ versions =
Version.objects.get_for_object_reference(TestModelCustomObjectId, 'custom-id')
+ self.assertEqual(versions.count(), 2)
+ self.assertEqual(versions[0].field_dict['name'], 'v2')
+ self.assertEqual(versions[1].field_dict['name'], 'v1')
+
+ def testGetDeleted(self):
+ with reversion.create_revision():
+ obj = TestModelCustomObjectId.objects.create(slug='custom-id',
name='v1')
+ obj.delete()
+ deleted = Version.objects.get_deleted(TestModelCustomObjectId)
+ self.assertEqual(deleted.count(), 1)
+ self.assertEqual(deleted[0].object_id, 'custom-id')
+
+ def testGetDeletedNotIncludingExisting(self):
+ with reversion.create_revision():
+ TestModelCustomObjectId.objects.create(slug='custom-id', name='v1')
+
self.assertEqual(Version.objects.get_deleted(TestModelCustomObjectId).count(),
0)
+
+
+class CustomObjectIdIgnoreDuplicatesTest(TestBase):
+
+ def setUp(self):
+ reversion.register(TestModelCustomObjectId, object_id_field='slug',
ignore_duplicates=True)
+
+ def testIgnoreDuplicates(self):
+ with reversion.create_revision():
+ obj = TestModelCustomObjectId.objects.create(slug='custom-id',
name='v1')
+ with reversion.create_revision():
+ obj.save()
+ versions =
Version.objects.get_for_object_reference(TestModelCustomObjectId, 'custom-id')
+ self.assertEqual(versions.count(), 1)
+
+ def testIgnoreDuplicatesNewData(self):
+ with reversion.create_revision():
+ obj = TestModelCustomObjectId.objects.create(slug='custom-id',
name='v1')
+ with reversion.create_revision():
+ obj.name = 'v2'
+ obj.save()
+ versions =
Version.objects.get_for_object_reference(TestModelCustomObjectId, 'custom-id')
+ self.assertEqual(versions.count(), 2)