import socket import time import boto3 import subprocess import json import threading from django.core.management.base import BaseCommand from django.core.management import call_command from mnfapp.models import ScriptTranslations from MNF.settings import BasePath from conversion.translation.external_conversion import Conversion from centralisedFileSystem.models import Script, File from scriptAudit.models import ScriptAuditModel from scriptAudit.models import States from utils import filesystem from scriptAudit.utils import update_audit_status from scriptAudit.mnf_script_audit import NeutralAudit from django.core.files.base import ContentFile from django.contrib.auth import get_user_model basePath = BasePath() User = get_user_model() def background_execution(obj): obj.convert() def run_conversion(msg): body_dict = json.loads(msg.body) translated_script = ScriptTranslations.objects.get(translation_id=body_dict["translation_id"]) object_key = "INPUT/" + (translated_script.script_link_id.script.name.split("/"))[-1] local_file_path = "/home/ubuntu/Conversion_Kitchen_Code/kitchen_counter/media/" + translated_script.script_link_id.script.name s3_client = boto3.client('s3', aws_access_key_id="AKIAQVLBBGCB45RMLKVW", aws_secret_access_key="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", region_name="ap-south-1" ) s3_client.download_file("conversion-kitchen", object_key, local_file_path) conversion_params = { "user": translated_script.user_id, "file_path": str(basePath) + "/media/" + translated_script.script_link_id.script.name, "original_script_id": translated_script.script_link_id.script_id, "translated_script_id": translated_script.translation_id, "sample_id": body_dict.get('sample_id', None), "existing_script": body_dict.get('sample_id', None), "iteration_no": body_dict.get('iteration_no', None), "juggernaut_pages_deduction": body_dict.get("juggernaut_pages_deduction", None), "language_set": body_dict.get("language_set", None), "amount_without_subscrption": body_dict.get("amount_without_subscrption", None) } print("reached here") obj = Conversion(**conversion_params) # obj.convert() background_thread = threading.Thread(target=background_execution, args=(obj,)) background_thread.start() background_thread.join() msg.delete() def run_audit(msg): body_dict = json.loads(msg.body) user = body_dict.get("user") s3_url = body_dict.get("s3-file-path") screenplay_name = body_dict.get("screenplay_name") author = body_dict.get("author") language = body_dict.get("language") script_ext = body_dict.get("script_ext") script_file_name = body_dict.get("script_file_name") object_key = "INPUT/" + str(script_file_name) local_file_path = "/home/ubuntu/Conversion_Kitchen_Code/kitchen_counter/media/audit_counter_files/" + script_file_name s3_client = boto3.client('s3', aws_access_key_id="AKIAQVLBBGCB45RMLKVW", aws_secret_access_key="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", region_name="ap-south-1" ) s3_client.download_file("conversion-kitchen", object_key, local_file_path) with open(local_file_path, 'rb') as file: file_content = file.read() file = ContentFile( file_content, script_file_name, ) user = User.objects.get(username=user) # user_id = user.id result = filesystem.new_screenplay_without_audit_in_background( user, author, screenplay_name, file, "script-original", language, ) script_id = result.get("script", {}).get("id") file_to_original = File.objects.get( script=script_id, type="script-original" ) try: update_audit_status(script_id, States.STARTED) except: update_audit_status(script_id, States.FAILURE) try: naudit = NeutralAudit(script_id) naudit.audit() ScriptAuditModel.objects.update_or_create( script = Script.objects.get( id = script_id ), defaults={"status" : "SUCCESS"} ) except: ScriptAuditModel.objects.update_or_create( script = Script.objects.get( id = script_id ), defaults={"status" : "FAILURE"} ) msg.delete() class Command(BaseCommand): help = 'Custom Command to start django server and then start dequeuing from SQS' def handle(self, *args, **options): # Call the original runserver command" # call_command('runserver', '0.0.0.0:4549') command = 'python manage.py runserver 0.0.0.0:4549 > /home/ubuntu/Conversion_Kitchen_Code/logfile.log 2>&1' # # Execute the command using subprocess.Popen subprocess.Popen(command, shell=True) # Wait for the server to start while True: try: # Try to connect to the server with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('0.0.0.0', 4549)) break except ConnectionRefusedError: # If connection is refused, wait and try again time.sleep(1) # Once the server is up, run your function self.run_after_server_startup() def run_after_server_startup(self): # Your function to run after the server starts print("Development server is fully up and running! Run your function here.") session = boto3.Session( aws_access_key_id='AKIAQVLBBGCB45RMLKVW', # replace with your key aws_secret_access_key='ZWc6KOc5LuBLuCEBDDfQTor+Q7rp3fFH74gVt+AA', # replace with your key ) sqs = session.resource('sqs', region_name='ap-south-1') print("Started Executin this from conversion") queue = sqs.get_queue_by_name(QueueName="mnfqueue") # try: while True: messages = queue.receive_messages( MessageAttributeNames=["All"], MaxNumberOfMessages=5, WaitTimeSeconds=10, ) if len(messages) > 0: for msg in messages: try: print("Received message: %s: %s", msg.message_id, msg.body) print(type(msg.body)) body_dict = json.loads(msg.body) if body_dict['service_type'] == "conversion": run_conversion(msg) elif body_dict['service_type'] == "audit": run_audit(msg) except Exception as error: print("error execution from queue: %s", error) else: break print("Completed All Execution")