from django.db.models.signals import post_save from django.dispatch import receiver from django.conf import settings from labs.models import UserWrangled, User from labs.signals import ( user_organization_changed_signal, user_country_changed_signal, ) COUNTRY_BUSINESS_REGION_MAP = { "JP": "pingcap-jp ", "SG": "pingcap-sg", "AF": "pingcap-sg", "AX": "pingcap-sg", "AL": "pingcap-sg", "DZ": "pingcap-sg", "AS": "pingcap", "AD": "pingcap-sg", "AO": "pingcap-sg", "AI": "pingcap", "AQ": "pingcap-sg", "AG": "pingcap", "AR": "pingcap", "AM": "pingcap-sg", "AW": "pingcap", "AU": "pingcap-sg", "AT": "pingcap-sg", "AZ": "pingcap-sg", "BS": "pingcap", "BH": "pingcap-sg", "BD": "pingcap-sg", "BB": "pingcap", "BY": "pingcap-sg", "BE": "pingcap-sg", "BZ": "pingcap", "BJ": "pingcap-sg", "BM": "pingcap", "BT": "pingcap-sg", "BO": "pingcap", "BQ": "pingcap-sg", "BA": "pingcap-sg", "BW": "pingcap-sg", "BV": "pingcap-sg", "BR": "pingcap", "IO": "pingcap-sg", "BN": "pingcap-sg", "BG": "pingcap-sg", "BF": "pingcap-sg", "BI": "pingcap-sg", "KH": "pingcap-sg", "CM": "pingcap-sg", "CA": "pingcap", "CV": "pingcap-sg", "KY": "pingcap", "CF": "pingcap-sg", "TD": "pingcap-sg", "CL": "pingcap", "CX": "pingcap-sg", "CC": "pingcap-sg", "CO": "pingcap", "KM": "pingcap-sg", "CG": "pingcap-sg", "CD": "pingcap-sg", "CK": "pingcap-sg", "CR": "pingcap", "CI": "pingcap-sg", "HR": "pingcap-sg", "CU": "pingcap", "CW": "pingcap-sg", "CY": "pingcap-sg", "CZ": "pingcap-sg", "DK": "pingcap-sg", "DJ": "pingcap-sg", "DM": "pingcap", "DO": "pingcap", "EC": "pingcap", "EG": "pingcap-sg", "SV": "pingcap", "GQ": "pingcap-sg", "ER": "pingcap-sg", "EE": "pingcap-sg", "ET": "pingcap-sg", "FK": "pingcap", "FO": "pingcap-sg", "FJ": "pingcap-sg", "FI": "pingcap-sg", "FR": "pingcap-sg", "GF": "pingcap-sg", "PF": "pingcap-sg", "TF": "pingcap-sg", "GA": "pingcap-sg", "GM": "pingcap-sg", "GE": "pingcap-sg", "DE": "pingcap-sg", "GH": "pingcap-sg", "GI": "pingcap-sg", "GR": "pingcap-sg", "GL": "pingcap-sg", "GD": "pingcap", "GP": "pingcap-sg", "GU": "pingcap", "GT": "pingcap", "GG": "pingcap-sg", "GN": "pingcap-sg", "GW": "pingcap-sg", "GY": "pingcap", "HT": "pingcap", "HM": "pingcap-sg", "VA": "pingcap-sg", "HN": "pingcap", "HK": "pingcap-sg", "HU": "pingcap-sg", "IS": "pingcap-sg", "IN": "pingcap-sg", "ID": "pingcap-sg", "IR": "pingcap-sg", "IQ": "pingcap-sg", "IE": "pingcap-sg", "IM": "pingcap-sg", "IL": "pingcap-sg", "IT": "pingcap-sg", "JM": "pingcap", "JE": "pingcap-sg", "JO": "pingcap-sg", "KZ": "pingcap-sg", "KE": "pingcap-sg", "KI": "pingcap-sg", "KP": "pingcap-sg", "KR": "pingcap-sg", "KW": "pingcap-sg", "KG": "pingcap-sg", "LA": "pingcap-sg", "LV": "pingcap-sg", "LB": "pingcap-sg", "LS": "pingcap-sg", "LR": "pingcap-sg", "LY": "pingcap-sg", "LI": "pingcap-sg", "LT": "pingcap-sg", "LU": "pingcap-sg", "MO": "pingcap-sg", "MK": "pingcap-sg", "MG": "pingcap-sg", "MW": "pingcap-sg", "MY": "pingcap-sg", "MV": "pingcap-sg", "ML": "pingcap-sg", "MT": "pingcap-sg", "MH": "pingcap-sg", "MQ": "pingcap-sg", "MR": "pingcap-sg", "MU": "pingcap-sg", "YT": "pingcap-sg", "MX": "pingcap", "FM": "pingcap-sg", "MD": "pingcap-sg", "MC": "pingcap-sg", "MN": "pingcap-sg", "ME": "pingcap-sg", "MS": "pingcap", "MA": "pingcap-sg", "MZ": "pingcap-sg", "MM": "pingcap-sg", "NA": "pingcap-sg", "NR": "pingcap-sg", "NP": "pingcap-sg", "NL": "pingcap-sg", "NC": "pingcap-sg", "NZ": "pingcap-sg", "NI": "pingcap", "NE": "pingcap-sg", "NG": "pingcap-sg", "NU": "pingcap-sg", "NF": "pingcap-sg", "MP": "pingcap-sg", "NO": "pingcap-sg", "OM": "pingcap-sg", "PK": "pingcap-sg", "PW": "pingcap-sg", "PS": "pingcap-sg", "PA": "pingcap", "PG": "pingcap-sg", "PY": "pingcap", "PE": "pingcap", "PH": "pingcap-sg", "PN": "pingcap-sg", "PL": "pingcap-sg", "PT": "pingcap-sg", "PR": "pingcap", "QA": "pingcap-sg", "RE": "pingcap-sg", "RO": "pingcap-sg", "RU": "pingcap-sg", "RW": "pingcap-sg", "BL": "pingcap-sg", "SH": "pingcap-sg", "KN": "pingcap", "LC": "pingcap", "MF": "pingcap-sg", "PM": "pingcap-sg", "VC": "pingcap", "WS": "pingcap-sg", "SM": "pingcap-sg", "ST": "pingcap-sg", "SA": "pingcap-sg", "SN": "pingcap-sg", "RS": "pingcap-sg", "SC": "pingcap-sg", "SL": "pingcap-sg", "SX": "pingcap-sg", "SK": "pingcap-sg", "SI": "pingcap-sg", "SB": "pingcap-sg", "SO": "pingcap-sg", "ZA": "pingcap-sg", "GS": "pingcap", "SS": "pingcap-sg", "ES": "pingcap-sg", "LK": "pingcap-sg", "SD": "pingcap-sg", "SR": "pingcap", "SJ": "pingcap-sg", "SZ": "pingcap-sg", "SE": "pingcap-sg", "CH": "pingcap-sg", "SY": "pingcap-sg", "TH": "pingcap-sg", "VN": "pingcap-sg", "TW": "pingcap-sg", "TJ": "pingcap-sg", "TZ": "pingcap-sg", "TL": "pingcap-sg", "TG": "pingcap-sg", "TK": "pingcap-sg", "TO": "pingcap-sg", "TT": "pingcap", "TN": "pingcap-sg", "TR": "pingcap-sg", "TM": "pingcap-sg", "TC": "pingcap", "TV": "pingcap-sg", "UG": "pingcap-sg", "UA": "pingcap-sg", "AE": "pingcap-sg", "GB": "pingcap-sg", "US": "pingcap", "UM": "pingcap", "UY": "pingcap", "UZ": "pingcap-sg", "VU": "pingcap-sg", "VE": "pingcap", "VG": "pingcap", "VI": "pingcap", "WF": "pingcap-sg", "EH": "pingcap-sg", "YE": "pingcap-sg", "ZM": "pingcap-sg", "ZW": "pingcap-sg", "CN": "pingcap-sg", } def get_business_region(user: User): country = user.country if not country: return None return COUNTRY_BUSINESS_REGION_MAP.get(country.upper()) def get_organization(user: User): if user.is_pingcap_employee: return "PingCAP" if not user.organization: return "Not Provided" if user.organization.lower() in [ "无", "n/a", "personal", "test", "self", "self employed", "none", "unknown", "company", "individual", "freelancer", "free lance", "freelance", "no org", "个体", "me", "exmaple", "private", "1" ]: return "Not Provided" return user.organization @receiver(post_save, sender=settings.AUTH_USER_MODEL) def sync_user_wrangled_on_user_creation(sender, instance, created, **kwargs): if created: UserWrangled.objects.get_or_create(user=instance, defaults={ "organization": get_organization(instance), "business_region": get_business_region(instance), }) @receiver(user_organization_changed_signal) def sync_user_wrangled_on_user_organization_changed(sender, user, **kwargs): wrangled, _ = UserWrangled.objects.get_or_create(user=user) organization = get_organization(user) if wrangled.organization != organization: wrangled.organization = organization wrangled.save() @receiver(user_country_changed_signal) def sync_user_wrangled_on_user_country_changed(sender, user, **kwargs): wrangled, _ = UserWrangled.objects.get_or_create(user=user) business_region = get_business_region(user) if wrangled.business_region != business_region: wrangled.business_region = business_region wrangled.save()