import logging import requests from celery import shared_task from django.conf import settings from labs.models import ( User, CertificateIssuance, CertificateRecipient, ) from labs.site_settings import SiteSettings logger = logging.getLogger(__name__) @shared_task(bind=True) def sync_user_info_to_hubspot_task(self, user_id: int): if settings.DEBUG: return hubspot_form_url = SiteSettings.hubspot_userinfo_form_url if not hubspot_form_url: logger.info( f"SiteSettings.hubspot_userinfo_form_url is not set, skipping sync" ) return user = User.objects.get(id=user_id) try: resp = requests.post( hubspot_form_url, json={ "fields": [ {"name": "name", "value": user.name or "N/A"}, {"name": "email", "value": user.email}, {"name": "company", "value": user.organization or "N/A"}, {"name": "labs_region", "value": user.country or "N/A"}, ], "context": {"pageUri": "https://labs.tidb.io", "pageName": "TiDB Labs"}, }, timeout=10, ) if resp.status_code != 200: raise Exception( f"Failed to sync user info to hubspot, user_id: {user_id}, " f"status code: {resp.status_code}, response: {resp.text}" ) logger.info( f"Sync user info to hubspot, user_id: {user_id}, response: {resp.json()}" ) except Exception as e: logger.error( f"Failed to sync user info to hubspot, user_id: {user_id}, error: {e}" ) @shared_task(bind=True) def sync_certificate_info_to_hubspot_task(self, certificate_issuance_id: int): if settings.DEBUG: return hubspot_form_url = SiteSettings.hubspot_certificate_form_url if not hubspot_form_url: logger.info( f"SiteSettings.hubspot_certificate_form_url is not set, skipping sync" ) return try: issuance: CertificateIssuance = CertificateIssuance.objects.select_related( "recipient" ).get(id=certificate_issuance_id) except CertificateIssuance.DoesNotExist: logger.error( f"Certificate issuance with id {certificate_issuance_id} does not exist" ) return recipient: CertificateRecipient = issuance.recipient if recipient.user: user: User = recipient.user email = user.email first_name = user.first_name last_name = user.last_name job_title = user.job_role company = user.organization country = user.country else: email = recipient.email first_name = recipient.first_name last_name = recipient.last_name job_title = "N/A" company = recipient.company_name country = recipient.country all_issuances = CertificateIssuance.objects.filter( recipient=recipient, ) tidb_practitioner_issued_date = "" tidb_professional_dba_issued_date = "" tidb_sql_developer_issued_date = "" tidb_associate_dba_issued_date = "" for issuance in all_issuances.values("cert_type__short_name", "issued_at"): issued_at = issuance["issued_at"].strftime("%d/%m/%Y") if issuance["cert_type__short_name"] == "Practitioner": tidb_practitioner_issued_date = issued_at elif issuance["cert_type__short_name"] == "PCTP_v6": tidb_professional_dba_issued_date = issued_at elif issuance["cert_type__short_name"] == "PCSD_v6": tidb_sql_developer_issued_date = issued_at elif issuance["cert_type__short_name"] == "PCTA_v6": tidb_associate_dba_issued_date = issued_at try: resp = requests.post( hubspot_form_url, json={ "fields": [ {"name": "email", "value": email}, {"name": "firstname", "value": first_name or "N/A"}, {"name": "lastname", "value": last_name or "N/A"}, {"name": "jobtitle", "value": job_title or "N/A"}, {"name": "company", "value": company or "N/A"}, { "name": "issued_date__tidb_practitioner", "value": tidb_practitioner_issued_date, }, {"name": "issued_date__tidb_professional_dba", "value": tidb_professional_dba_issued_date}, {"name": "issued_date__tidb_sql_developer", "value": tidb_sql_developer_issued_date}, {"name": "issued_date__tidb_associate_dba", "value": tidb_associate_dba_issued_date}, {"name": "certification_region", "value": country or "N/A"}, ], "context": {"pageUri": "https://labs.tidb.io", "pageName": "TiDB Labs"}, }, timeout=10, ) if resp.status_code != 200: raise Exception( f"Failed to sync recipient({recipient.id})'s certificate info to hubspot, " f"status code: {resp.status_code}, response: {resp.text}" ) logger.info( f"Sync recipient({recipient.id})'s certificate info to hubspot, response: {resp.json()}" ) except Exception as e: logger.error( f"Failed to sync recipient({recipient.id})'s certificate info to hubspot, error: {e}" )