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)

Reply via email to