diff --git a/addons/osfstorage/tests/test_models.py b/addons/osfstorage/tests/test_models.py index 5e45c1d35f1..63552a4b574 100644 --- a/addons/osfstorage/tests/test_models.py +++ b/addons/osfstorage/tests/test_models.py @@ -266,6 +266,22 @@ def test_delete_root_node(self): assert BaseFileNode.objects.get(_id=folder._id).type == 'osf.trashedfolder' assert BaseFileNode.objects.get(_id=file._id).type == 'osf.trashedfile' + def test_restore_deleted_file_without_deleted_field(self): + assert models.TrashedFileNode.objects.exists() is False + + child = self.node_settings.get_root().append_file('Test') + child.delete() + + trashed_file = models.TrashedFileNode.objects.first() + restored_file = trashed_file.restore() + + assert restored_file.deleted is None + # None because we do not set deleted_by when delete the child + assert restored_file.deleted_by is None + assert restored_file.deleted_on is not None + + assert models.TrashedFileNode.objects.exists() is False + def test_delete_file(self): child = self.node_settings.get_root().append_file('Test') field_names = [f.name for f in child._meta.get_fields() if not f.is_relation and f.name not in ['id', 'content_type_pk']] diff --git a/admin/management/urls.py b/admin/management/urls.py index 2f77bfc5c8a..cce6e013fcb 100644 --- a/admin/management/urls.py +++ b/admin/management/urls.py @@ -24,4 +24,6 @@ name='remove_orcid_from_user_social'), re_path(r'^migrate_funder_names_to_ror', views.MigrateFunderNamesToRor.as_view(), name='migrate_funder_names_to_ror'), + re_path(r'^fix_restored_trashed_files', views.FixRestoredTrashedFiles.as_view(), + name='fix_restored_trashed_files'), ] diff --git a/admin/management/views.py b/admin/management/views.py index 3c552822b8f..363ca1c154d 100644 --- a/admin/management/views.py +++ b/admin/management/views.py @@ -228,3 +228,11 @@ def post(self, request): for _line in _out_io.getvalue().split('\n'): messages.info(request, _line) return redirect(reverse('management:commands')) + + +class FixRestoredTrashedFiles(ManagementCommandPermissionView): + + def post(self, request): + call_command('fix_restored_trashed_files') + messages.success(request, 'Restored trashed files have been successfully fixed.') + return redirect(reverse('management:commands')) diff --git a/admin/templates/management/commands.html b/admin/templates/management/commands.html index aa7ec517b8f..0b3bf9669e5 100644 --- a/admin/templates/management/commands.html +++ b/admin/templates/management/commands.html @@ -226,6 +226,19 @@
+ Use this management command to fix restored files that were previously trashed. +
+ +