-
-
Notifications
You must be signed in to change notification settings - Fork 184
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(projectOwnershipTransfer): ensure the path of OpenRosa media file…
…s is correct for transferred projects TASK-1352 (#5385) ### 📣 Summary Extended the bug fix from #5365 to address issues in existing projects. ### 📖 Description This update addresses the issue where OpenRosa media file paths were not updated correctly during project ownership transfers for existing projects. This misalignment led to 404 errors when users attempted to access transferred projects in Collect due to missing media files. ### Notes The fix leverages the new long-running migration flow to address the issue in the background.
- Loading branch information
1 parent
7281f27
commit 815cece
Showing
2 changed files
with
81 additions
and
0 deletions.
There are no files selected for viewing
56 changes: 56 additions & 0 deletions
56
...apps/long_running_migrations/jobs/0002_fix_project_ownership_transfer_with_media_files.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# Generated on 2024-12-18 | ||
from django.db.models import Q, OuterRef, Subquery | ||
|
||
from kobo.apps.openrosa.apps.logger.models import XForm | ||
from kobo.apps.openrosa.apps.main.models import MetaData | ||
from kpi.models.asset import Asset | ||
from kpi.models.asset_file import AssetFile | ||
from kobo.apps.project_ownership.models import Transfer | ||
|
||
|
||
def run(): | ||
""" | ||
Update OpenRosa MetaData objects that were not updated when project | ||
ownership was transferred to someone else. This fixes a bug introduced | ||
and later addressed in KPI (issue #5365). | ||
""" | ||
|
||
# Step 1: Retrieve all assets that were transferred since the bug was present and | ||
# use media files | ||
asset_uids = Asset.objects.filter( | ||
Q( | ||
pk__in=AssetFile.objects.values_list('asset_id', flat=True).exclude( | ||
file_type=AssetFile.PAIRED_DATA | ||
) | ||
) | ||
& Q( | ||
pk__in=Transfer.objects.values_list('asset_id', flat=True).filter( | ||
invite__date_created__date__gte='2024-09-15' | ||
) | ||
) | ||
).values_list('uid', flat=True) | ||
|
||
username_subquery = XForm.objects.filter(pk=OuterRef('xform_id')).values( | ||
'user__username' | ||
)[:1] | ||
|
||
# Step 2: Iterate through relevant MetaData objects and fix their data_file fields | ||
for metadata in ( | ||
MetaData.objects.filter( | ||
xform_id__in=XForm.objects.filter( | ||
kpi_asset_uid__in=list(asset_uids) | ||
), | ||
) | ||
.exclude( | ||
Q(data_file__startswith=Subquery(username_subquery)) | ||
| Q(data_file__isnull=True) | ||
| Q(data_file='') | ||
) | ||
.select_related('xform', 'xform__user') | ||
.iterator() | ||
): | ||
data_file = str(metadata.data_file) | ||
old_username, *other_parts = data_file.split('/') | ||
other_parts.insert(0, metadata.xform.user.username) | ||
metadata.data_file = '/'.join(other_parts) | ||
metadata.save(update_fields=['data_file']) |
25 changes: 25 additions & 0 deletions
25
...ning_migrations/migrations/0002_fix_failed_project_ownership_transfer_with_media_files.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
# Generated by Django 4.2.15 on 2024-12-18 20:00 | ||
|
||
from django.db import migrations | ||
|
||
|
||
def add_long_running_migration(apps, schema_editor): | ||
LongRunningMigration = apps.get_model('long_running_migrations', 'LongRunningMigration') # noqa | ||
LongRunningMigration.objects.create( | ||
name='0002_fix_project_ownership_transfer_with_media_files' | ||
) | ||
|
||
|
||
def noop(*args, **kwargs): | ||
pass | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
('long_running_migrations', '0001_initial'), | ||
] | ||
|
||
operations = [ | ||
migrations.RunPython(add_long_running_migration, noop), | ||
] |