mirror of
https://github.com/simple-login/app.git
synced 2024-09-29 21:21:29 +02:00
Show global stats
This commit is contained in:
parent
c350bca488
commit
76b4611bc2
@ -20,6 +20,61 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block default_content %}
|
{% 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="row mb-3">
|
||||||
|
|
||||||
<div class="col-lg-6 pt-1" style="max-width: 25em">
|
<div class="col-lg-6 pt-1" style="max-width: 25em">
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from flask import render_template, request, redirect, url_for, flash
|
from flask import render_template, request, redirect, url_for, flash
|
||||||
from flask_login import login_required, current_user
|
from flask_login import login_required, current_user
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
@ -12,9 +14,45 @@ from app.models import (
|
|||||||
ClientUser,
|
ClientUser,
|
||||||
DeletedAlias,
|
DeletedAlias,
|
||||||
AliasGeneratorEnum,
|
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"])
|
@dashboard_bp.route("/", methods=["GET", "POST"])
|
||||||
@login_required
|
@login_required
|
||||||
def index():
|
def index():
|
||||||
@ -120,6 +158,8 @@ def index():
|
|||||||
current_user.intro_shown = True
|
current_user.intro_shown = True
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
stats = get_stats(current_user)
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"dashboard/index.html",
|
"dashboard/index.html",
|
||||||
client_users=client_users,
|
client_users=client_users,
|
||||||
@ -134,4 +174,5 @@ def index():
|
|||||||
page=page,
|
page=page,
|
||||||
sort=sort,
|
sort=sort,
|
||||||
filter=alias_filter,
|
filter=alias_filter,
|
||||||
|
stats=stats,
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user