mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	import: import RealmAuditLog when 'zerver_realmauditlog` is missing.
* If `zerver_realmauditlog` is present in the exported data, `RealmAuditLog` would be imported normally. * If it is not present, `create_subscription_events` function in would create the `subscription_created` events for RealmAuditLog. The reason this function is in `import_realm` module and not in the individual export tool scripts (like Slack) is because this function would be common for all export tools. This fixes #9846 for users who have not already done an import of their organization from Slack. Fixes #9846.
This commit is contained in:
		@@ -9,7 +9,8 @@ from boto.s3.connection import S3Connection
 | 
			
		||||
from boto.s3.key import Key
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
from django.db import connection
 | 
			
		||||
from django.utils.timezone import utc as timezone_utc
 | 
			
		||||
from django.db.models import Max
 | 
			
		||||
from django.utils.timezone import utc as timezone_utc, now as timezone_now
 | 
			
		||||
from typing import Any, Dict, List, Optional, Set, Tuple, \
 | 
			
		||||
    Iterable
 | 
			
		||||
 | 
			
		||||
@@ -95,6 +96,42 @@ def fix_upload_links(data: TableData, message_table: TableName) -> None:
 | 
			
		||||
                    if message['rendered_content']:
 | 
			
		||||
                        message['rendered_content'] = message['rendered_content'].replace(key, value)
 | 
			
		||||
 | 
			
		||||
def create_subscription_events(data: TableData, table: TableName) -> None:
 | 
			
		||||
    """
 | 
			
		||||
    When the export data doesn't contain the table `zerver_realmauditlog`,
 | 
			
		||||
    this function creates RealmAuditLog objects for `subscription_created`
 | 
			
		||||
    type event for all the existing Stream subscriptions.
 | 
			
		||||
 | 
			
		||||
    This is needed for all the export tools which do not include the
 | 
			
		||||
    table `zerver_realmauditlog` (Slack, Gitter, etc.) because the appropriate
 | 
			
		||||
    data about when a user was subscribed is not exported by the third-party
 | 
			
		||||
    service.
 | 
			
		||||
    """
 | 
			
		||||
    all_subscription_logs = []
 | 
			
		||||
 | 
			
		||||
    # from bulk_add_subscriptions in lib/actions
 | 
			
		||||
    event_last_message_id = Message.objects.aggregate(Max('id'))['id__max']
 | 
			
		||||
    if event_last_message_id is None:
 | 
			
		||||
        event_last_message_id = -1
 | 
			
		||||
    event_time = timezone_now()
 | 
			
		||||
 | 
			
		||||
    for item in data[table]:
 | 
			
		||||
        recipient = Recipient.objects.get(id=item['recipient_id'])
 | 
			
		||||
        if recipient.type != Recipient.STREAM:
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        stream = Stream.objects.get(id=recipient.type_id)
 | 
			
		||||
        user = UserProfile.objects.get(id=item['user_profile_id'])
 | 
			
		||||
 | 
			
		||||
        all_subscription_logs.append(RealmAuditLog(realm=user.realm,
 | 
			
		||||
                                                   acting_user=user,
 | 
			
		||||
                                                   modified_user=user,
 | 
			
		||||
                                                   modified_stream=stream,
 | 
			
		||||
                                                   event_last_message_id=event_last_message_id,
 | 
			
		||||
                                                   event_time=event_time,
 | 
			
		||||
                                                   event_type=RealmAuditLog.SUBSCRIPTION_CREATED))
 | 
			
		||||
    RealmAuditLog.objects.bulk_create(all_subscription_logs)
 | 
			
		||||
 | 
			
		||||
def current_table_ids(data: TableData, table: TableName) -> List[int]:
 | 
			
		||||
    """
 | 
			
		||||
    Returns the ids present in the current table
 | 
			
		||||
@@ -512,6 +549,21 @@ def do_import_realm(import_dir: Path, subdomain: str) -> Realm:
 | 
			
		||||
    update_model_ids(Subscription, data, 'zerver_subscription', 'subscription')
 | 
			
		||||
    bulk_import_model(data, Subscription, 'zerver_subscription')
 | 
			
		||||
 | 
			
		||||
    if 'zerver_realmauditlog' in data:
 | 
			
		||||
        fix_datetime_fields(data, 'zerver_realmauditlog')
 | 
			
		||||
        re_map_foreign_keys(data, 'zerver_realmauditlog', 'realm', related_table="realm")
 | 
			
		||||
        re_map_foreign_keys(data, 'zerver_realmauditlog', 'modified_user',
 | 
			
		||||
                            related_table='user_profile')
 | 
			
		||||
        re_map_foreign_keys(data, 'zerver_realmauditlog', 'acting_user',
 | 
			
		||||
                            related_table='user_profile')
 | 
			
		||||
        re_map_foreign_keys(data, 'zerver_realmauditlog', 'modified_stream',
 | 
			
		||||
                            related_table="stream")
 | 
			
		||||
        update_model_ids(RealmAuditLog, data, 'zerver_realmauditlog',
 | 
			
		||||
                         related_table="realmauditlog")
 | 
			
		||||
        bulk_import_model(data, RealmAuditLog, 'zerver_realmauditlog')
 | 
			
		||||
    else:
 | 
			
		||||
        create_subscription_events(data, 'zerver_subscription')
 | 
			
		||||
 | 
			
		||||
    fix_datetime_fields(data, 'zerver_userpresence')
 | 
			
		||||
    re_map_foreign_keys(data, 'zerver_userpresence', 'user_profile', related_table="user_profile")
 | 
			
		||||
    re_map_foreign_keys(data, 'zerver_userpresence', 'client', related_table='client')
 | 
			
		||||
@@ -543,18 +595,6 @@ def do_import_realm(import_dir: Path, subdomain: str) -> Realm:
 | 
			
		||||
                     related_table="customprofilefieldvalue")
 | 
			
		||||
    bulk_import_model(data, CustomProfileFieldValue, 'zerver_customprofilefieldvalue')
 | 
			
		||||
 | 
			
		||||
    fix_datetime_fields(data, 'zerver_realmauditlog')
 | 
			
		||||
    re_map_foreign_keys(data, 'zerver_realmauditlog', 'realm', related_table="realm")
 | 
			
		||||
    re_map_foreign_keys(data, 'zerver_realmauditlog', 'modified_user',
 | 
			
		||||
                        related_table='user_profile')
 | 
			
		||||
    re_map_foreign_keys(data, 'zerver_realmauditlog', 'acting_user',
 | 
			
		||||
                        related_table='user_profile')
 | 
			
		||||
    re_map_foreign_keys(data, 'zerver_realmauditlog', 'modified_stream',
 | 
			
		||||
                        related_table="stream")
 | 
			
		||||
    update_model_ids(RealmAuditLog, data, 'zerver_realmauditlog',
 | 
			
		||||
                     related_table="realmauditlog")
 | 
			
		||||
    bulk_import_model(data, RealmAuditLog, 'zerver_realmauditlog')
 | 
			
		||||
 | 
			
		||||
    # Import uploaded files and avatars
 | 
			
		||||
    import_uploads(os.path.join(import_dir, "avatars"), processing_avatars=True)
 | 
			
		||||
    import_uploads(os.path.join(import_dir, "uploads"))
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ from zerver.lib.test_classes import (
 | 
			
		||||
from zerver.models import (
 | 
			
		||||
    Realm,
 | 
			
		||||
    get_realm,
 | 
			
		||||
    RealmAuditLog,
 | 
			
		||||
)
 | 
			
		||||
from zerver.lib import mdiff
 | 
			
		||||
 | 
			
		||||
@@ -539,7 +540,14 @@ class SlackImporter(ZulipTestCase):
 | 
			
		||||
 | 
			
		||||
        # test import of the converted slack data into an existing database
 | 
			
		||||
        do_import_realm(output_dir, test_realm_subdomain)
 | 
			
		||||
        self.assertTrue(get_realm(test_realm_subdomain).name, test_realm_subdomain)
 | 
			
		||||
        realm = get_realm(test_realm_subdomain)
 | 
			
		||||
        self.assertTrue(realm.name, test_realm_subdomain)
 | 
			
		||||
 | 
			
		||||
        # test RealmAuditLog
 | 
			
		||||
        realmauditlog = RealmAuditLog.objects.filter(realm=realm)
 | 
			
		||||
        realmauditlog_event_type = {log.event_type for log in realmauditlog}
 | 
			
		||||
        self.assertEqual(realmauditlog_event_type, {'subscription_created'})
 | 
			
		||||
 | 
			
		||||
        Realm.objects.filter(name=test_realm_subdomain).delete()
 | 
			
		||||
 | 
			
		||||
        remove_folder(output_dir)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user