diff --git a/app/developer/templates/developer/index.html b/app/developer/templates/developer/index.html index 378def52..871bf2d7 100644 --- a/app/developer/templates/developer/index.html +++ b/app/developer/templates/developer/index.html @@ -53,54 +53,40 @@ - -
{% for client in clients %} -
-
-
-
- {% if client.icon_id %} - - {% endif %} - - - {{ client.name }} - - {% if client.approved %} - - {% else %} - +
+
+
+
+ {{ client.name }} + {% if client.approved %} + + {% else %} + 🚫 + class="text-decoration-none">🚫 - {% endif %} - -
+ {% endif %} + - +
+ Created {{ client.created_at | dt }}
+ {{ client.nb_user() }} users. + {{ client.nb_paid_user() }} paid users. +
+
+ + + Details ➡ +
- -
- {{ client.nb_user() }} Users
- Created {{ client.created_at |dt }}
- {% if client.last_user_login() %} - Last User Login: {{ client.last_user_login().get_user_name() }} - {% endif %} -
-
{% endfor %}
- {% endblock %} diff --git a/app/models.py b/app/models.py index 2d8fe1df..f8d58e37 100644 --- a/app/models.py +++ b/app/models.py @@ -14,7 +14,7 @@ from sqlalchemy import orm from sqlalchemy import text, desc, CheckConstraint, Index, Column from sqlalchemy.dialects.postgresql import TSVECTOR from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import deferred +from sqlalchemy.orm import deferred, joinedload from sqlalchemy_utils import ArrowType from app import s3 @@ -991,6 +991,20 @@ class Client(Base, ModelMixin): def nb_user(self): return ClientUser.filter_by(client_id=self.id).count() + def nb_paid_user(self) -> int: + res = 0 + for client_user in ( + Session.query(ClientUser) + .options(joinedload(ClientUser.user)) + .filter_by(client_id=self.id) + .all() + ): + user = client_user.user + if user.is_paid(): + res += 1 + + return res + def get_scopes(self) -> [Scope]: # todo: client can choose which scopes they want to have access return [Scope.NAME, Scope.EMAIL, Scope.AVATAR_URL]