mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	For exporting full with consent: * Earlier, a message advertising users to react with thumbs up was sent and later used to determine the users who consented. * Now, we no longer need to send such a message. This commit updates the logic to use `allow_private_data_export` user-setting to determine users who consented. Fixes part of #31201.
		
			
				
	
	
		
			47 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import glob
 | 
						|
import logging
 | 
						|
import os
 | 
						|
from argparse import ArgumentParser
 | 
						|
from typing import Any
 | 
						|
 | 
						|
from typing_extensions import override
 | 
						|
 | 
						|
from zerver.lib.export import export_usermessages_batch
 | 
						|
from zerver.lib.management import ZulipBaseCommand
 | 
						|
 | 
						|
 | 
						|
class Command(ZulipBaseCommand):
 | 
						|
    help = """UserMessage fetching helper for export.py"""
 | 
						|
 | 
						|
    @override
 | 
						|
    def add_arguments(self, parser: ArgumentParser) -> None:
 | 
						|
        parser.add_argument("--path", help="Path to find messages.json archives")
 | 
						|
        parser.add_argument("--thread", help="Thread ID")
 | 
						|
        parser.add_argument(
 | 
						|
            "--export-full-with-consent",
 | 
						|
            action="store_true",
 | 
						|
            help="Whether to export private data of users who consented",
 | 
						|
        )
 | 
						|
 | 
						|
    @override
 | 
						|
    def handle(self, *args: Any, **options: Any) -> None:
 | 
						|
        logging.info("Starting UserMessage batch thread %s", options["thread"])
 | 
						|
        files = set(glob.glob(os.path.join(options["path"], "messages-*.json.partial")))
 | 
						|
        for partial_path in files:
 | 
						|
            locked_path = partial_path.replace(".json.partial", ".json.locked")
 | 
						|
            output_path = partial_path.replace(".json.partial", ".json")
 | 
						|
            try:
 | 
						|
                os.rename(partial_path, locked_path)
 | 
						|
            except FileNotFoundError:
 | 
						|
                # Already claimed by another process
 | 
						|
                continue
 | 
						|
            logging.info("Thread %s processing %s", options["thread"], output_path)
 | 
						|
            try:
 | 
						|
                export_usermessages_batch(
 | 
						|
                    locked_path, output_path, options["export_full_with_consent"]
 | 
						|
                )
 | 
						|
            except BaseException:
 | 
						|
                # Put the item back in the free pool when we fail
 | 
						|
                os.rename(locked_path, partial_path)
 | 
						|
                raise
 |