From c521dd895249fc1f366387fb7fb66cf9be90aa4b Mon Sep 17 00:00:00 2001 From: mkovalua Date: Fri, 31 Jan 2025 18:22:09 +0200 Subject: [PATCH] =?UTF-8?q?ENG-6733=20fix=20the=20issue=20of=20sorting=20f?= =?UTF-8?q?or=20gitlab=20is=20related=20to=20Serializer=20source=3D?= =?UTF-8?q?=E2=80=98modified=E2=80=99=20in=20comparison=20to=20dropbox=20i?= =?UTF-8?q?t=20failed=20so=20have=20added=20the=20possibility.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/base/views.py | 6 ++++++ api/files/serializers.py | 10 ++++++++++ api/nodes/views.py | 5 ++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/api/base/views.py b/api/base/views.py index 703b093173e..5b17a20d01e 100644 --- a/api/base/views.py +++ b/api/base/views.py @@ -651,6 +651,12 @@ def bulk_get_file_nodes_from_wb_resp(self, files_list): try: file_obj = base_class.objects.get(**query) + # it is needed to update modified attribute explicitly in case + # there will be another commit for the file so it will have another update date + # somehow it is not updated for gitlab implicitly using . + if attrs.get('provider') == 'gitlab' and attrs.get('modified_utc'): + file_obj.modified = attrs.get('modified_utc') + except base_class.DoesNotExist: # create method on BaseFileNode appends provider, bulk_create bypasses this step so it is added here file_obj = base_class(target=node, _path=_path, provider=base_class._provider) diff --git a/api/files/serializers.py b/api/files/serializers.py index e68845c4cd1..4c698ca9766 100644 --- a/api/files/serializers.py +++ b/api/files/serializers.py @@ -415,6 +415,16 @@ def get_target_type(self, obj): raise NotImplementedError() +class GitlabFileSerializer(FileSerializer): + date_modified = VersionedDateTimeField( + source='modified', + read_only=True, + help_text='Timestamp when the file was last modified', + required=False, + allow_null=True, + ) + + class OsfStorageFileSerializer(FileSerializer): """ Overrides `filterable_fields` to make `last_touched` non-filterable """ diff --git a/api/nodes/views.py b/api/nodes/views.py index 8bbe4df3595..5e3d8047aa2 100644 --- a/api/nodes/views.py +++ b/api/nodes/views.py @@ -71,7 +71,7 @@ ) from api.draft_registrations.serializers import DraftRegistrationSerializer, DraftRegistrationDetailSerializer from api.draft_registrations.permissions import DraftRegistrationPermission -from api.files.serializers import FileSerializer, OsfStorageFileSerializer +from api.files.serializers import FileSerializer, OsfStorageFileSerializer, GitlabFileSerializer from api.files import annotations as file_annotations from api.identifiers.serializers import NodeIdentifierSerializer from api.identifiers.views import IdentifierList @@ -1130,6 +1130,9 @@ class NodeFilesList(JSONAPIBaseView, generics.ListAPIView, WaterButlerMixin, Lis def serializer_class(self): if self.kwargs[self.provider_lookup_url_kwarg] == 'osfstorage': return OsfStorageFileSerializer + if self.kwargs[self.provider_lookup_url_kwarg] == 'gitlab': + # use source='modified' explicitly for gitlab sorting + return GitlabFileSerializer return FileSerializer def get_resource(self):