Skip to content

Commit c08d55a

Browse files
Ostap-Zherebetskyicslzchen
authored andcommitted
Update merge_notification_subscription_provider_ct
1 parent 6eebea4 commit c08d55a

2 files changed

Lines changed: 33 additions & 10 deletions

File tree

scripts/remove_after_use/merge_notification_subscription_provider_ct.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
from django.contrib.contenttypes.models import ContentType
88
from framework.celery_tasks import app as celery_app
99
from osf.models import NotificationSubscription
10+
from django.db.models import Exists, OuterRef
11+
from celery.utils.log import get_task_logger
12+
13+
logger = get_task_logger(__name__)
14+
1015

1116

1217
@celery_app.task(name='scripts.remove_after_use.merge_notification_subscription_provider_ct')
@@ -19,13 +24,37 @@ def merge_notification_subscription_provider_ct():
1924
ContentType.objects.get_by_natural_key('osf', 'registrationprovider'),
2025
ContentType.objects.get_by_natural_key('osf', 'collectionprovider'),
2126
]
22-
subscriptions = NotificationSubscription.objects.filter(
23-
content_type__in=provider_ct_list
24-
)
25-
subscriptions.update(
27+
28+
provider_ct_ids = [ct.id for ct in provider_ct_list]
29+
30+
abstract_qs = NotificationSubscription.objects.filter(
2631
content_type=abstract_provider_ct
2732
)
2833

34+
duplicates = NotificationSubscription.objects.filter(
35+
content_type_id__in=provider_ct_ids
36+
).annotate(
37+
abstract_exists=Exists(
38+
abstract_qs.filter(
39+
notification_type_id=OuterRef('notification_type_id'),
40+
user_id=OuterRef('user_id'),
41+
object_id=OuterRef('object_id'),
42+
_is_digest=OuterRef('_is_digest'),
43+
)
44+
)
45+
).filter(abstract_exists=True)
46+
47+
# delete rows that would conflict
48+
logger.info(f'Deleted {duplicates.count()} duplicate NotificationSubscription rows with provider content types.')
49+
duplicates.delete()
50+
51+
# update remaining rows
52+
update_qs = NotificationSubscription.objects.filter(
53+
content_type_id__in=provider_ct_ids
54+
)
55+
logger.info(f'Updated {update_qs.count()} NotificationSubscription rows to use abstract provider content type.')
56+
update_qs.update(content_type=abstract_provider_ct)
57+
2958

3059
if __name__ == '__main__':
3160
merge_notification_subscription_provider_ct.delay()

website/settings/defaults.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -439,9 +439,6 @@ class CeleryConfig:
439439
'scripts.populate_new_and_noteworthy_projects',
440440
'website.search.elastic_search',
441441
'scripts.generate_sitemap',
442-
'scripts.remove_after_use.populate_notification_subscriptions_node_file_updated',
443-
'scripts.remove_after_use.populate_notification_subscriptions_user_global_file_updated',
444-
'scripts.remove_after_use.populate_notification_subscriptions_user_global_reviews',
445442
'osf.management.commands.clear_expired_sessions',
446443
'osf.management.commands.delete_withdrawn_or_failed_registration_files',
447444
'osf.management.commands.migrate_pagecounter_data',
@@ -571,9 +568,6 @@ class CeleryConfig:
571568
'scripts.approve_embargo_terminations',
572569
'scripts.triggered_mails',
573570
'scripts.generate_sitemap',
574-
'scripts.remove_after_use.populate_notification_subscriptions_node_file_updated',
575-
'scripts.remove_after_use.populate_notification_subscriptions_user_global_file_updated',
576-
'scripts.remove_after_use.populate_notification_subscriptions_user_global_reviews',
577571
'scripts.premigrate_created_modified',
578572
'scripts.add_missing_identifiers_to_preprints',
579573
'osf.management.commands.clear_expired_sessions',

0 commit comments

Comments
 (0)