import os from datetime import datetime, timedelta, timezone import pandas as pd from DataAPIRequester import DataAPIRequester NEW_USER = "New-User" CHURN_FROM_NEW_USER = 'Churn-From-New-User' FIRST_ACTIVE_USER = "First-Active-User" FIRST_ENGAGED_USER = "First-Engaged-User" status_priority_dic = { NEW_USER: 0, CHURN_FROM_NEW_USER: 50, FIRST_ACTIVE_USER: 100, FIRST_ENGAGED_USER: 200, } def generate_requester(api_name: str, params: dict = None): requester = DataAPIRequester(api_name, endpoint='https://us-east-1.data.tidbcloud.com/api/v1beta/app/dataapp-yULHcebg/endpoint/v1/', public_key='80N6UKO0', private_key=os.getenv('HUBSPOT_PRIVATE_KEY'), params=params) return requester def send_chart_data(table: str, data: pd.DataFrame): requester = generate_requester(table) return requester.send_data(data) def get_user_list() -> list: requester = generate_requester('get_user_list') ul = requester.get_data() return ul def get_latest_state(email: str) -> str: requester = generate_requester('get_latest_status', {'email': email}) state = requester.get_data() if len(state): return state[0]['status'] else: return None def is_active_user(email: str) -> bool: requester = generate_requester('get_active_users', {'email': email}) active_flag = requester.get_data() if len(active_flag): return True else: return False def is_churn_from_new_user(email:str) -> bool: requester = generate_requester('get_churn_from_new_users', {'email': email}) flag = requester.get_data() if len(flag): return True else: return False def state_change(email: str, state: str): if state == None: return NEW_USER if state == NEW_USER: if is_active_user(email): return FIRST_ACTIVE_USER if is_churn_from_new_user(email): return CHURN_FROM_NEW_USER return state def state_machine(user_list: list): user_state = {} for user in user_list: email = user['email'] latest_state = get_latest_state(email) new_state = state_change(email, latest_state) if latest_state != new_state: user_state[email] = new_state return user_state if __name__ == "__main__": user_list = get_user_list() user_list = [item for item in user_list if '@' in item.get('email', '')] user_state = state_machine(user_list) user_state_df = pd.DataFrame(user_state.items(), columns=['email', 'status']) user_state_df = user_state_df[user_state_df.email.str.contains('@')] user_state_df['update_date'] = str((datetime.now(timezone.utc) - timedelta(days=1)).date()) user_state_df['status_priority'] = user_state_df['status'].map(status_priority_dic) send_chart_data('update_status', user_state_df)