diff --git a/cron.py b/cron.py index 42aea78d..9b8f47d2 100644 --- a/cron.py +++ b/cron.py @@ -44,6 +44,7 @@ from app.models import ( Monitoring, Contact, CoinbaseSubscription, + Metric, ) from server import create_app @@ -305,6 +306,111 @@ def stats_before(moment: Arrow) -> Stats: return Stats(**data) +def compute_metrics(): + now = arrow.now() + + Metric.create(name=Metric.NB_USER, value=User.query.count(), commit=True) + Metric.create( + name=Metric.NB_ACTIVATED_USER, + value=User.query.filter_by(activated=True).count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_REFERRED_USER, + value=User.query.filter(User.referral_id.isnot(None)).count(), + commit=True, + ) + + nb_referred_user_paid = 0 + for user in User.query.filter(User.referral_id.isnot(None)): + if user.is_paid(): + nb_referred_user_paid += 1 + + Metric.create( + name=Metric.NB_REFERRED_USER_PAID, + value=nb_referred_user_paid, + commit=True, + ) + + Metric.create(name=Metric.NB_ALIAS, value=Alias.query.count(), commit=True) + + Metric.create( + name=Metric.NB_BOUNCED, + value=EmailLog.query.filter_by(bounced=True).count(), + commit=True, + ) + Metric.create( + name=Metric.NB_SPAM, + value=EmailLog.query.filter_by(is_spam=True).count(), + commit=True, + ) + Metric.create( + name=Metric.NB_REPLY, + value=EmailLog.query.filter_by(is_reply=True).count(), + commit=True, + ) + Metric.create( + name=Metric.NB_BLOCK, + value=EmailLog.query.filter_by(blocked=True).count(), + commit=True, + ) + Metric.create( + name=Metric.NB_FORWARD, + value=EmailLog.query.filter_by( + bounced=False, is_spam=False, is_reply=False, blocked=False + ).count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_PREMIUM, + value=Subscription.query.filter(Subscription.cancelled.is_(False)).count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_CANCELLED_PREMIUM, + value=Subscription.query.filter(Subscription.cancelled.is_(True)).count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_APPLE_PREMIUM, + value=AppleSubscription.query.count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_MANUAL_PREMIUM, + value=ManualSubscription.query.filter( + ManualSubscription.end_at > now, + ManualSubscription.is_giveaway.is_(False), + ).count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_COINBASE_PREMIUM, + value=CoinbaseSubscription.query.filter( + CoinbaseSubscription.end_at > now + ).count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_VERIFIED_CUSTOM_DOMAIN, + value=CustomDomain.query.filter_by(verified=True).count(), + commit=True, + ) + + Metric.create( + name=Metric.NB_APP, + value=Client.query.count(), + commit=True, + ) + + def increase_percent(old, new) -> str: if old == 0: return "N/A" @@ -319,6 +425,8 @@ def stats(): # nothing to do return + compute_metrics() + stats_today = stats_before(arrow.now()) stats_yesterday = stats_before(arrow.now().shift(days=-1))