From 0d18c56f01014a4f6ffbf3e8a0467d492417e1bc Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 30 Apr 2024 07:33:51 +0000 Subject: [PATCH] audit integration --- kitchen_counter/MNF/settings_bkp30042024.py | 713 ++++++++++++++++++ .../management/commands/custom_runserver.py | 156 +++- .../lpp/certificate/certificate.pdf | Bin 12677 -> 12711 bytes .../media/audit_counter_filestestAWSnew1.docx | Bin 0 -> 27519 bytes 4 files changed, 839 insertions(+), 30 deletions(-) create mode 100755 kitchen_counter/MNF/settings_bkp30042024.py create mode 100644 kitchen_counter/media/audit_counter_filestestAWSnew1.docx diff --git a/kitchen_counter/MNF/settings_bkp30042024.py b/kitchen_counter/MNF/settings_bkp30042024.py new file mode 100755 index 0000000..bd16afc --- /dev/null +++ b/kitchen_counter/MNF/settings_bkp30042024.py @@ -0,0 +1,713 @@ +""" +Django settings for MNF project. + +Generated by 'django-admin startproject' using Django 4.2.9. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" +from datetime import timedelta +from pathlib import Path +import os +from dotenv import load_dotenv +#import pandas as pd +import datetime + + +load_dotenv() + +api_key_free = os.environ.get("api_key_free") +api_key = os.environ.get("api_key") +org_id = os.environ.get("org_id") + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent +def BasePath(): + #/home/mnfbeta/mnf/app + return str(BASE_DIR) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = os.environ.get("SECRET_KEY") +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = bool(os.environ.get("DEBUG", default=0)) +ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",") + +# Application definition +INSTALLED_APPS = os.environ.get('INSTALLED_APPS').split(',') + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', + 'whitenoise.middleware.WhiteNoiseMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.contrib.sites.middleware.CurrentSiteMiddleware', + 'allauth.account.middleware.AccountMiddleware', +] + +SITE_ID = 1 + +ROOT_URLCONF = 'MNF.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, "build")], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'MNF.wsgi.application' + + +AUTHENTICATION_BACKENDS = ( + 'allauth.account.auth_backends.AuthenticationBackend', + 'django.contrib.auth.backends.ModelBackend', +) + +SOCIALACCOUNT_PROVIDERS = { + "google": { + "SCOPE": [ + "profile", + "email", + ], + "AUTH_PARAMS": { + "access_type": "offline", + }, + }, +} + +ACCOUNT_EMAIL_REQUIRED = True +ACCOUNT_USERNAME_REQUIRED = False +ACCOUNT_AUTHENTICATION_METHOD = 'email' +ACCOUNT_EMAIL_VERIFICATION = 'optional' +LOGIN_REDIRECT_URL = '/' + +# REQUIRED FOR GMAIL LOGIN +# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') +# SECURE_SSL_REDIRECT = True + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases +DATABASES = { + 'default': { + 'ENGINE': os.environ.get('ENGINE'), + 'NAME': os.environ.get('DB_NAME'), + 'USER':os.environ.get('DB_USER'), + 'PASSWORD': os.environ.get('PASSWORD'), + 'HOST': os.environ.get('HOST'), + 'PORT': os.environ.get('PORT'), + # 'OPTIONS': { + # 'sslmode': 'disable', + # } + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'Asia/Kolkata' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + + +STATIC_URL = '/static/' +# STATICFILES_DIRS = [BASE_DIR / "static",] +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +STATIC_ROOT = os.path.join(BASE_DIR, 'static') +STATIC_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' + +print("STATIC_ROOT:",STATIC_ROOT) + +SECURE_PROXY_SSL_HEADER =("HTTP_X_FORWARDED_PROTO",'https') +CSRF_TRUSTED_ORIGINS = [os.environ.get('CSRF_TRUSTED_ORIGINS')] + + +# rest framework +REST_FRAMEWORK = { + "DEFAULT_AUTHENTICATION_CLASSES": [ + 'rest_framework_simplejwt.authentication.JWTAuthentication', + ], + "DEFAULT_FILTER_BACKENDS": [ + "django_filters.rest_framework.DjangoFilterBackend" + ], + 'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer'] +} + +file_path = f"{BASE_DIR}/MNF/Pricing.xlsx" + +# rest_framework jwt +SIMPLE_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(days=100), + 'REFRESH_TOKEN_LIFETIME': timedelta(days=300), + 'ROTATE_REFRESH_TOKENS': False, + 'BLACKLIST_AFTER_ROTATION': False, + 'UPDATE_LAST_LOGIN': False, + + 'ALGORITHM': 'HS256', + 'SIGNING_KEY': SECRET_KEY, + 'VERIFYING_KEY': None, + 'AUDIENCE': None, + 'ISSUER': None, + 'JWK_URL': None, + 'LEEWAY': 0, + + 'AUTH_HEADER_TYPES': ('Bearer',), + 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', + 'USER_ID_FIELD': 'id', + 'USER_ID_CLAIM': 'user_id', + 'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule', + + 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), + 'TOKEN_TYPE_CLAIM': 'token_type', + 'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser', +} + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + + +T_STRIPE_SECRET_KEY = os.environ.get('T_STRIPE_SECRET_KEY') +STRIPE_SECRET_KEY = os.environ.get('STRIPE_SECRET_KEY') +STRIPE_PUBLISHABLE_KEY = os.environ.get('STRIPE_PUBLISHABLE_KEY') +T_STRIPE_PUBLISHABLE_KEY = os.environ.get('T_STRIPE_PUBLISHABLE_KEY') + +T_RAZORPAY_KEY_ID = os.environ.get('T_RAZORPAY_KEY_ID') +T_RAZORPAY_KEY_SECRET = os.environ.get('T_RAZORPAY_KEY_SECRET') +RAZORPAY_KEY_ID = os.environ.get('RAZORPAY_KEY_ID') +RAZORPAY_KEY_SECRET = os.environ.get('RAZORPAY_KEY_SECRET') + +TWILIO_ACCOUNT_SID = os.environ.get('TWILIO_ACCOUNT_SID') +TWILIO_AUTH_TOKEN = os.environ.get('TWILIO_AUTH_TOKEN') +TWILIO_PHONE_NUMBER = os.environ.get('TWILIO_PHONE_NUMBER') +MONTHLY_MEMBER = int(os.environ.get('MONTHLY_MEMBER')) +EMPLOY_DISCOUNT = int(os.environ.get('EMPLOY_DISCOUNT')) +IM_DISCOUNT = int(os.environ.get('IM_DISCOUNT')) +YEARLY_MEMBER = int(os.environ.get('YEARLY_MEMBER')) +YEARLY_MEMBER_ADDITIONAL = int(os.environ.get('YEARLY_MEMBER_ADDITIONAL')) +LIFE_MEMBER_ADDITIONAL = int(os.environ.get('LIFE_MEMBER_ADDITIONAL')) +LIFE_MEMBER_YEAR = int(os.environ.get('LIFE_MEMBER_YEAR')) +LIFE_MEMBER = int(os.environ.get('LIFE_MEMBER')) +EARLY_BIRD = int(os.environ.get('EARLY_BIRD')) +GST = int(os.environ.get('GST')) + +CORS_ORIGIN_ALLOW_ALL = True +CORS_ALLOW_METHODS = [ + "DELETE", + "GET", + "OPTIONS", + "PATCH", + "POST", + "PUT", +] + +COUNTRY_LIST = { + "AD": "Andorra", + "AE": "United Arab Emirates", + "AF": "Afghanistan", + "AG": "Antigua & Barbuda", + "AI": "Anguilla", + "AL": "Albania", + "AM": "Armenia", + "AN": "Netherlands Antilles", + "AO": "Angola", + "AQ": "Antarctica", + "AR": "Argentina", + "AS": "American Samoa", + "AT": "Austria", + "AU": "Australia", + "AW": "Aruba", + "AZ": "Azerbaijan", + "BA": "Bosnia and Herzegovina", + "BB": "Barbados", + "BD": "Bangladesh", + "BE": "Belgium", + "BF": "Burkina Faso", + "BG": "Bulgaria", + "BH": "Bahrain", + "BI": "Burundi", + "BJ": "Benin", + "BM": "Bermuda", + "BN": "Brunei Darussalam", + "BO": "Bolivia", + "BR": "Brazil", + "BS": "Bahama", + "BT": "Bhutan", + "BU": "Burma (no longer exists)", + "BV": "Bouvet Island", + "BW": "Botswana", + "BY": "Belarus", + "BZ": "Belize", + "CA": "Canada", + "CC": "Cocos (Keeling) Islands", + "CF": "Central African Republic", + "CG": "Congo", + "CH": "Switzerland", + "CI": "Côte D'ivoire (Ivory Coast)", + "CK": "Cook Iislands", + "CL": "Chile", + "CM": "Cameroon", + "CN": "China", + "CO": "Colombia", + "CR": "Costa Rica", + "CS": "Czechoslovakia (no longer exists)", + "CU": "Cuba", + "CV": "Cape Verde", + "CX": "Christmas Island", + "CY": "Cyprus", + "CZ": "Czech Republic", + "DD": "German Democratic Republic (no longer exists)", + "DE": "Germany", + "DJ": "Djibouti", + "DK": "Denmark", + "DM": "Dominica", + "DO": "Dominican Republic", + "DZ": "Algeria", + "EC": "Ecuador", + "EE": "Estonia", + "EG": "Egypt", + "EH": "Western Sahara", + "ER": "Eritrea", + "ES": "Spain", + "ET": "Ethiopia", + "FI": "Finland", + "FJ": "Fiji", + "FK": "Falkland Islands (Malvinas)", + "FM": "Micronesia", + "FO": "Faroe Islands", + "FR": "France", + "FX": "France, Metropolitan", + "GA": "Gabon", + "GB": "United Kingdom (Great Britain)", + "GD": "Grenada", + "GE": "Georgia", + "GF": "French Guiana", + "GH": "Ghana", + "GI": "Gibraltar", + "GL": "Greenland", + "GM": "Gambia", + "GN": "Guinea", + "GP": "Guadeloupe", + "GQ": "Equatorial Guinea", + "GR": "Greece", + "GS": "South Georgia and the South Sandwich Islands", + "GT": "Guatemala", + "GU": "Guam", + "GW": "Guinea-Bissau", + "GY": "Guyana", + "HK": "Hong Kong", + "HM": "Heard & McDonald Islands", + "HN": "Honduras", + "HR": "Croatia", + "HT": "Haiti", + "HU": "Hungary", + "ID": "Indonesia", + "IE": "Ireland", + "IL": "Israel", + "IN": "India", + "IO": "British Indian Ocean Territory", + "IQ": "Iraq", + "IR": "Islamic Republic of Iran", + "IS": "Iceland", + "IT": "Italy", + "JM": "Jamaica", + "JO": "Jordan", + "JP": "Japan", + "KE": "Kenya", + "KG": "Kyrgyzstan", + "KH": "Cambodia", + "KI": "Kiribati", + "KM": "Comoros", + "KN": "St. Kitts and Nevis", + "KP": "Korea, Democratic People's Republic of", + "KR": "Korea, Republic of", + "KW": "Kuwait", + "KY": "Cayman Islands", + "KZ": "Kazakhstan", + "LA": "Lao People's Democratic Republic", + "LB": "Lebanon", + "LC": "Saint Lucia", + "LI": "Liechtenstein", + "LK": "Sri Lanka", + "LR": "Liberia", + "LS": "Lesotho", + "LT": "Lithuania", + "LU": "Luxembourg", + "LV": "Latvia", + "LY": "Libyan Arab Jamahiriya", + "MA": "Morocco", + "MC": "Monaco", + "MD": "Moldova, Republic of", + "MG": "Madagascar", + "MH": "Marshall Islands", + "ML": "Mali", + "MN": "Mongolia", + "MM": "Myanmar", + "MO": "Macau", + "MP": "Northern Mariana Islands", + "MQ": "Martinique", + "MR": "Mauritania", + "MS": "Monserrat", + "MT": "Malta", + "MU": "Mauritius", + "MV": "Maldives", + "MW": "Malawi", + "MX": "Mexico", + "MY": "Malaysia", + "MZ": "Mozambique", + "NA": "Namibia", + "NC": "New Caledonia", + "NE": "Niger", + "NF": "Norfolk Island", + "NG": "Nigeria", + "NI": "Nicaragua", + "NL": "Netherlands", + "NO": "Norway", + "NP": "Nepal", + "NR": "Nauru", + "NT": "Neutral Zone (no longer exists)", + "NU": "Niue", + "NZ": "New Zealand", + "OM": "Oman", + "PA": "Panama", + "PE": "Peru", + "PF": "French Polynesia", + "PG": "Papua New Guinea", + "PH": "Philippines", + "PK": "Pakistan", + "PL": "Poland", + "PM": "St. Pierre & Miquelon", + "PN": "Pitcairn", + "PR": "Puerto Rico", + "PT": "Portugal", + "PW": "Palau", + "PY": "Paraguay", + "QA": "Qatar", + "RE": "Réunion", + "RO": "Romania", + "RU": "Russian Federation", + "RW": "Rwanda", + "SA": "Saudi Arabia", + "SB": "Solomon Islands", + "SC": "Seychelles", + "SD": "Sudan", + "SE": "Sweden", + "SG": "Singapore", + "SH": "St. Helena", + "SI": "Slovenia", + "SJ": "Svalbard & Jan Mayen Islands", + "SK": "Slovakia", + "SL": "Sierra Leone", + "SM": "San Marino", + "SN": "Senegal", + "SO": "Somalia", + "SR": "Suriname", + "ST": "Sao Tome & Principe", + "SU": "Union of Soviet Socialist Republics (no longer exists)", + "SV": "El Salvador", + "SY": "Syrian Arab Republic", + "SZ": "Swaziland", + "TC": "Turks & Caicos Islands", + "TD": "Chad", + "TF": "French Southern Territories", + "TG": "Togo", + "TH": "Thailand", + "TJ": "Tajikistan", + "TK": "Tokelau", + "TM": "Turkmenistan", + "TN": "Tunisia", + "TO": "Tonga", + "TP": "East Timor", + "TR": "Turkey", + "TT": "Trinidad & Tobago", + "TV": "Tuvalu", + "TW": "Taiwan, Province of China", + "TZ": "Tanzania, United Republic of", + "UA": "Ukraine", + "UG": "Uganda", + "UM": "United States Minor Outlying Islands", + "US": "United States of America", + "UY": "Uruguay", + "UZ": "Uzbekistan", + "VA": "Vatican City State (Holy See)", + "VC": "St. Vincent & the Grenadines", + "VE": "Venezuela", + "VG": "British Virgin Islands", + "VI": "United States Virgin Islands", + "VN": "Viet Nam", + "VU": "Vanuatu", + "WF": "Wallis & Futuna Islands", + "WS": "Samoa", + "YD": "Democratic Yemen (no longer exists)", + "YE": "Yemen", + "YT": "Mayotte", + "YU": "Yugoslavia", + "ZA": "South Africa", + "ZM": "Zambia", + "ZR": "Zaire", + "ZW": "Zimbabwe", + "ZZ": "Unknown or unspecified country", +} + +languages = { + "hi": "Hindi", + "en": "English", + "ur": "Urdu", + "ar": "Arabic", + "bn": "Bengali", + "kn": "Kannada", + "ta": "Tamil", + "bg": "Bulgarian", + "bn": "Bengali", + "ml": "Malayalam", + "ru": "Russian", + "sr": "Serbian", + "uk": "Ukranian", + "hr": "Croatian", + "ga": "Irish", + "sq": "Albanian", + "mr": "Marathi", + "fa": "Persian", + "te": "Telugu", + "tr": "Turkish", + "hu": "Hungarian", + "it": "Italian", + "ro": "Romanian", + "pa": "Punjabi", + "gu": "Gujarati", + "or": "Oriya", + "zh-CN": "Chinese-Simplified", + "zh-TW": "Chinese-Traditional", + "ne": "Nepali", + "fr": "French", + "es": "Spanish", + "id": "Indonesian", + "el": "Greek", + "ja": "Japanese", + "jv": "Javanese", + "ko": "Korean", + "be": "Belarusian", + "uz": "Uzbek", + "sd": "Sindhi", + "af": "Afrikaans", + "de": "German", + "is": "Icelandic", + "ig": "Igbo", + "la": "Latin", + "pt": "Portugese", + "my": "Myanmar", + "th": "Thai", + "su": "Sundanese", + "lo": "Lao", + "am": "amharic", + "si": "Sinhala", + "az": "Azerbaijani", + "kk": "Kazakh", + "mk": "Macedonian", + "bs": "Bosnian", + "ps": "Pashto", + "mg": "Malagasy", + "ms": "Malay", + "yo": "Yoruba", + "cs": "Czech", + "da": "Danish", + "nl": "Dutch", + "tl": "Tagalog", + "no": "Norwegian", + "sl": "Slovenian", + "sv": " Swedish", + "vi": "Vietnamese", + "cy": "Welsh", + "he": "Hebrew", + "hy": "Armenian", + "km": "Khmer", + "ka": "Georgian", + "mn": "Mongolian", + "ku": "Kurdish", + "ky": "Kyrgyz", + "tk": "Turkmen", + "fi": "Finnish", + "ht": "Haitian Creole", + "haw": "Hawaiian", + "lt": "Lithuanian", + "lb": "Luxembourgish", + "mt": "Maltese", + "pl": "Polish", + "eo": "Esperanto", + "tt": "Tatar", + "ug": "Uyghur", + "ha": "Hausa", + "so": "Somali", + "sw": "Swahili", + "yi": "Yiddish", + "eu": "Basque", + "ca": "Catalan", + "ceb": "Cebuano", + "co": "Corsican", + "et": "Estonian", + "fy": "Frisian", + "gl": "Galician", + "hmn": "Hmong", + "rw": "Kinyarwanda", + "lv": "Latvian", + "mi": "Maori", + "sm": "Samoan", + "gd": "Scots Gaelic", + "st": "Sesotho", + "sn": "Shona", + "sk": "Slovak", + "xh": "Xhosa", + "zu": "Zulu", +} + +ISO_INV = {v: k for k, v in COUNTRY_LIST.items()} +ISO_LAN = {v: k for k, v in languages.items()} + +# CRONJOBS = [ + + # lpp task deadline cron job + # ('*/5 * * * *','conversion.cron.delete_empty_files_existing', '>>'+os.path.join(BASE_DIR,'log/debug7.log')), + # translation service down alert + # ('2 */6 * * *', 'conversion.cron.check_transalation_services'), + # ('2 */6 * * *', 'conversion.cron.delete_trasalation_services'), + # # idea mall emails + # ("00 16 * * *", "ideamall.cronmails.mailtoauctionwinner"), + # ("00 16 * * *", "ideamall.cronmails.mailweekleft"), + # ("00 16 * * *", "ideamall.cronmails.mailoneleft"), + # # AutoUpdate conversion Rates + # ("00 8 * * *", "payment.views.custom_conversion_rate"), + # # credits for MM every month + # ("00 00 30 * *", "relationshipmanager.views.credit_monthly_outsession"), + # + # #Institutional Membership + # ('0 0 * * *', 'institutional.views.deactivate_expired_accounts'), + # ('0 0 1 * *', 'institutional.views.deactivate_accounts_with_pending_payments'), + # ('0 0 * * *', 'institutional.views.send_deactivation_reminder_emails'), + # + # + # #auto refund + # ('0 1 * * *','subtitling3.cronjob.subtitlerefund'), + # + # # For reminder mail in messiah + # ('*/5 * * * *','relationshipmanager.cron.remindermail'), + + +# ] + +EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER') +EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD') + +smtp_host = os.environ.get('SMTP_HOST') +smtp_port = int(os.environ.get('SMTP_PORT')) +smtp_username = os.environ.get('SMTP_USERNAME') +smtp_password = os.environ.get('SMTP_PASSWORD') + +COUNTRY_KEY = "00000000000000000000000000000000" + +def discount_xlsx_reader(filePath:str): + import pandas as pd + discountData = dict() + df = pd.read_excel(filePath, engine='openpyxl',skiprows=101) + for index, row in df.iterrows(): + if not pd.isnull(row['discounts']): + if row["limit"] =='yes': + discountData[row['discounts']] ={"limit":True, "data":(row['value'],row['start'],row['end'])} + else: + discountData[row['discounts']] = {"limit":False, "data":row['value']} + + return discountData + +DISCOUNT = discount_xlsx_reader(f"{BASE_DIR}/MNF/Pricing.xlsx") + + +def discount_limit_handler(discount:dict) -> int: + current_date = datetime.datetime.now() + if discount["limit"]: + if discount["data"][1].date() <= current_date.date() <= discount["data"][2].date(): + return int(discount["data"][0]) + else: + return int(0) + else: + return int(discount["data"]) + + +def pricing_data(row_name, column_index): + import pandas as pd + """ + Extract data from a specific cell in an Excel file. + + Parameters: + - row_name (str): The name of the row from which to extract data. + - column_index (int): The index of the column from which to extract data. + + Returns: + - str: The data in the format [row][column]. + """ + try: + # Read the Excel file into a DataFrame + df = pd.read_excel(file_path) + + # Find the row index that matches the given row_name + row_index = df[df.iloc[:, 0] == row_name].index[0] + + # Extract the data from the specified cell + data = df.iat[row_index, column_index] + + # Return the data in the format [row][column] + return f"{data}" + + except Exception as e: + return f"An error occurred: {e}" + + +#nltk dir changes +import nltk +nltk.data.path.append("/home/ubuntu/Conversion_Kitchen_Code/nltk_data") diff --git a/kitchen_counter/conversion/management/commands/custom_runserver.py b/kitchen_counter/conversion/management/commands/custom_runserver.py index f9c1b45..c0b6dc7 100755 --- a/kitchen_counter/conversion/management/commands/custom_runserver.py +++ b/kitchen_counter/conversion/management/commands/custom_runserver.py @@ -9,13 +9,134 @@ 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' @@ -59,43 +180,18 @@ class Command(BaseCommand): MaxNumberOfMessages=5, WaitTimeSeconds=20, ) - # msg = 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) - 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) + if body_dict['service_type'] == "conversion": + run_conversion(msg) + + elif body_dict['service_type'] == "audit": - 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() - # return JsonResponse({"sattus":"process started"}) + run_audit(msg) except Exception as error: print("error execution from queue: %s", error) diff --git a/kitchen_counter/lpp/certificate/certificate.pdf b/kitchen_counter/lpp/certificate/certificate.pdf index f974fa7030f449632be8e0679db2c150d813d084..3ab3a1fcf8e0e4ada0f6e8b823dca83d2d8c697f 100755 GIT binary patch delta 6308 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 z