import json import os from datetime import datetime, timedelta, timezone import boto3 import pandas as pd from classify import classify from tabulate import tabulate from users import load_users S3_BUCKET = os.environ["S3_BUCKET"] def upload(s3, table, filename): table.to_csv(f"/tmp/{filename}", index=False) try: s3.upload_file(f"/tmp/{filename}", S3_BUCKET, f"data/classes/{filename}") print(f"uploaded {filename}.") except Exception as e: print(e) def class_1_1(u): return u.is_business_email() or u.count_event("PoC Form Submission") > 0 or u.has_bind_card() def class_1_2(u): mails = [ "gmail.com", "msn.com", "outlook.com", "hotmail.com", "yahoo.com", "foxmail.com", "yopmail.com", "icloud.com", "protonmail.com", ] return not class_1_1(u) and u.email().split("@")[1] in mails def class_1_3(u): return not class_1_1(u) and not class_1_2(u) def lambda_handler(event, context): # begin = datetime(2022, 7, 1, tzinfo=timezone.utc) # end = datetime(event['year'], event['month'], event['day'], tzinfo=timezone.utc) end = datetime.now(timezone.utc) begin = end - timedelta(days=90) if "kwargs" in event: end = datetime.fromtimestamp(event["kwargs"]["time"], tz=timezone.utc) users = load_users(begin) users = [u for u in users if not u.is_pingcap()] users = [u for u in users if u.signup_time() > begin] class_1 = [u for u in users if classify(u) == "first class"] class_2 = [u for u in users if classify(u) == "second class"] class_3 = [u for u in users if classify(u) == "third class"] class_4 = [u for u in users if classify(u) == "others"] table_1_1 = pd.DataFrame( [ [ u.email(), str(u.id()), u.owner_id(), u.signup_time().date(), u.alive().total_seconds() / 24 / 60 / 60, u.event_types(), u.first_cluster_create_time().date() if u.first_cluster_create_time() is not None else "", u.clusters_alive().total_seconds() / 24 / 60 / 60, "Y" if u.count_event("PoC Form Submission") > 0 else "N", "Y" if u.has_bind_card() else "N", u.region(), u.country(), ] for u in class_1 if class_1_1(u) ], columns=[ "Email", "Tenant ID", "Owner", "Signup Time", "DBaaS Trial (day)", "Event Types", "Cluster Create", "Clusters Trial (day)", "PoC Form Submission", "Has Bind Card", "Region", "Country", ], ) table_1_2 = pd.DataFrame( [ [ u.email(), str(u.id()), u.owner_id(), u.signup_time().date(), u.alive().total_seconds() / 24 / 60 / 60, u.event_types(), u.first_cluster_create_time().date() if u.first_cluster_create_time() is not None else "", u.clusters_alive().total_seconds() / 24 / 60 / 60, "Y" if u.count_event("PoC Form Submission") > 0 else "N", "Y" if u.has_bind_card() else "N", u.region(), u.country(), ] for u in class_1 if class_1_2(u) ], columns=[ "Email", "Tenant ID", "Owner", "Signup Time", "DBaaS Trial (day)", "Event Types", "Cluster Create", "Clusters Trial (day)", "PoC Form Submission", "Has Bind Card", "Region", "Country", ], ) table_1_3 = pd.DataFrame( [ [ u.email(), str(u.id()), u.owner_id(), u.signup_time().date(), u.alive().total_seconds() / 24 / 60 / 60, u.event_types(), u.first_cluster_create_time().date() if u.first_cluster_create_time() is not None else "", u.clusters_alive().total_seconds() / 24 / 60 / 60, "Y" if u.count_event("PoC Form Submission") > 0 else "N", "Y" if u.has_bind_card() else "N", u.region(), u.country(), ] for u in class_1 if class_1_3(u) ], columns=[ "Email", "Tenant ID", "Owner", "Signup Time", "DBaaS Trial (day)", "Event Types", "Cluster Create", "Clusters Trial (day)", "PoC Form Submission", "Has Bind Card", "Region", "Country", ], ) table_2 = pd.DataFrame( [ [ u.email(), str(u.id()), u.id(), u.signup_time().date(), u.alive().total_seconds() / 24 / 60 / 60, u.event_types(), u.first_cluster_create_time().date() if u.first_cluster_create_time() is not None else "", u.clusters_alive().total_seconds() / 24 / 60 / 60, u.region(), u.country(), ] for u in class_2 ], columns=[ "Email", "Tenant ID", "Owner", "Signup Time", "DBaaS Trial (day)", "Event Types", "Cluster Create", "Clusters Trial (day)", "Region", "Country", ], ) table_3 = pd.DataFrame( [ [ u.email(), str(u.id()), u.owner_id(), u.signup_time().date(), u.alive().total_seconds() / 24 / 60 / 60, u.event_types(), u.first_cluster_create_time().date() if u.first_cluster_create_time() is not None else "", u.clusters_alive().total_seconds() / 24 / 60 / 60, u.region(), u.country(), ] for u in class_3 ], columns=[ "Email", "Tenant ID", "Owner", "Signup Time", "DBaaS Trial (day)", "Event Types", "Cluster Create", "Clusters Trial (day)", "Region", "Country", ], ) table_4 = pd.DataFrame( [ [ u.email(), str(u.id()), u.owner_id(), u.signup_time().date(), u.alive().total_seconds() / 24 / 60 / 60, u.event_types(), u.first_cluster_create_time().date() if u.first_cluster_create_time() is not None else "", u.clusters_alive().total_seconds() / 24 / 60 / 60, u.region(), u.country(), ] for u in class_4 ], columns=[ "Email", "Tenant ID", "Owner", "Signup Time", "DBaaS Trial (day)", "Event Types", "Cluster Create", "Clusters Trial (day)", "Region", "Country", ], ) _date = end.date() - timedelta(days=1) s3 = boto3.client("s3") upload(s3, table_1_1, f"class-1-1-{_date}.csv") upload(s3, table_1_2, f"class-1-2-{_date}.csv") upload(s3, table_1_3, f"class-1-3-{_date}.csv") upload(s3, table_2, f"class-2-{_date}.csv") upload(s3, table_3, f"class-3-{_date}.csv") upload(s3, table_4, f"class-4-{_date}.csv") return { "statusCode": 200, "body": json.dumps("classfied users are uploaded!"), }