diff --git a/addons/osfstorage/models.py b/addons/osfstorage/models.py index 46da2662d65..0da2e02ac0e 100644 --- a/addons/osfstorage/models.py +++ b/addons/osfstorage/models.py @@ -314,9 +314,6 @@ def serialize(self, include_full=None, version=None): version = self.get_version(version) earliest_version = self.versions.order_by('created').first() ret.update({ - # Must be the resolved version's own identifier, not versions.count() -- after a - # non-latest version is deleted, count() no longer matches any existing identifier, - # which breaks osfstorage_download's file_node.get_version(identifier=..., required=True). 'version': int(version.identifier) if version else 0, 'md5': version.metadata.get('md5') if version else None, 'sha256': version.metadata.get('sha256') if version else None, diff --git a/osf/migrations/0051_alter_fileversion_options.py b/osf/migrations/0051_alter_fileversion_options.py new file mode 100644 index 00000000000..1fd084d4e51 --- /dev/null +++ b/osf/migrations/0051_alter_fileversion_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.26 on 2026-08-04 13:39 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('osf', '0050_downloadevent_user_agent'), + ] + + operations = [ + migrations.AlterModelOptions( + name='fileversion', + options={'ordering': ('-created', '-id')}, + ), + ] diff --git a/osf/models/files.py b/osf/models/files.py index 0609f801034..4d353f62506 100644 --- a/osf/models/files.py +++ b/osf/models/files.py @@ -883,7 +883,10 @@ def serialize_waterbutler_settings(self, node_id, root_id): }) class Meta: - ordering = ('-created',) + # '-id' is a deterministic tiebreak for versions created within the same instant (e.g. a + # version attached directly via add_version() right after another, in the same test/request) -- + # without it, .first()/.last() on ties is undefined and can flip between identical queries. + ordering = ('-created', '-id') class BaseFileVersionsThrough(models.Model):