Selaa lähdekoodia

Show global stats

Son NK 5 vuotta sitten
vanhempi
commit
76b4611bc2
2 muutettua tiedostoa jossa 96 lisäystä ja 0 poistoa
  1. 55 0
      app/dashboard/templates/dashboard/index.html
  2. 41 0
      app/dashboard/views/index.py

+ 55 - 0
app/dashboard/templates/dashboard/index.html

@@ -20,6 +20,61 @@
 {% endblock %}
 
 {% block default_content %}
+  <!-- Global Stats -->
+  <div class="row">
+    <div class="col-6 col-sm-4 col-lg-2">
+      <div class="card">
+        <div class="card-body p-3 text-center">
+          <div class="h1 m-0 mt-3">{{ stats.nb_alias }}</div>
+          <div class="text-muted mb-4">Aliases</div>
+        </div>
+      </div>
+    </div>
+    <div class="col-6 col-sm-4 col-lg-2">
+      <div class="card">
+        <div class="card-body p-3 text-center">
+          <div class="h1 m-0 mt-3">{{ stats.nb_active_alias }}</div>
+          <div class="text-muted mb-4">Active Aliases</div>
+        </div>
+      </div>
+    </div>
+    <div class="col-6 col-sm-4 col-lg-2">
+      <div class="card">
+        <div class="card-body p-3 text-center">
+          <div class="h1 m-0 mt-3">{{ stats.nb_forward }}</div>
+          <div class="text-muted mb-4">Forwards</div>
+        </div>
+      </div>
+    </div>
+    <div class="col-6 col-sm-4 col-lg-2">
+      <div class="card">
+        <div class="card-body p-3 text-center">
+          <div class="h1 m-0 mt-3">{{ stats.nb_reply }}</div>
+          <div class="text-muted mb-4">Replies</div>
+        </div>
+      </div>
+    </div>
+    <div class="col-6 col-sm-4 col-lg-2">
+      <div class="card">
+        <div class="card-body p-3 text-center">
+          <div class="h1 m-0 mt-3">{{ stats.nb_directory }}</div>
+          <div class="text-muted mb-4">Directories</div>
+        </div>
+      </div>
+    </div>
+    <div class="col-6 col-sm-4 col-lg-2">
+      <div class="card">
+        <div class="card-body p-3 text-center">
+          <div class="h1 m-0 mt-3">{{ stats.nb_domain }}</div>
+          <div class="text-muted mb-4">Domains</div>
+        </div>
+      </div>
+    </div>
+
+  </div>
+  <!-- END Global Stats -->
+
+
   <div class="row mb-3">
 
     <div class="col-lg-6 pt-1" style="max-width: 25em">

+ 41 - 0
app/dashboard/views/index.py

@@ -1,3 +1,5 @@
+from dataclasses import dataclass
+
 from flask import render_template, request, redirect, url_for, flash
 from flask_login import login_required, current_user
 from sqlalchemy.exc import IntegrityError
@@ -12,9 +14,45 @@ from app.models import (
     ClientUser,
     DeletedAlias,
     AliasGeneratorEnum,
+    User,
+    EmailLog,
+    CustomDomain,
+    Directory,
 )
 
 
+@dataclass
+class Stats:
+    nb_alias: int
+    nb_active_alias: int
+    nb_forward: int
+    nb_reply: int
+    nb_domain: int
+    nb_directory: int
+
+
+def get_stats(user: User) -> Stats:
+    nb_alias = Alias.query.filter_by(user_id=user.id).count()
+    nb_active_alias = Alias.query.filter_by(user_id=user.id, enabled=True).count()
+    nb_forward = EmailLog.query.filter_by(
+        user_id=user.id, is_reply=False, blocked=False, bounced=False
+    ).count()
+    nb_reply = EmailLog.query.filter_by(
+        user_id=user.id, is_reply=True, blocked=False, bounced=False
+    ).count()
+    nb_domain = CustomDomain.query.filter_by(user_id=user.id).count()
+    nb_directory = Directory.query.filter_by(user_id=user.id).count()
+
+    data = locals()
+    # to keep only Stats field
+    data = {
+        k: v
+        for (k, v) in data.items()
+        if k in vars(Stats)["__dataclass_fields__"].keys()
+    }
+    return Stats(**data)
+
+
 @dashboard_bp.route("/", methods=["GET", "POST"])
 @login_required
 def index():
@@ -120,6 +158,8 @@ def index():
         current_user.intro_shown = True
         db.session.commit()
 
+    stats = get_stats(current_user)
+
     return render_template(
         "dashboard/index.html",
         client_users=client_users,
@@ -134,4 +174,5 @@ def index():
         page=page,
         sort=sort,
         filter=alias_filter,
+        stats=stats,
     )