display nb paid user on SIWSL app

This commit is contained in:
Son 2021-10-25 11:10:23 +02:00
parent 8bafdfc879
commit befec56a86
2 changed files with 38 additions and 38 deletions

View File

@ -53,54 +53,40 @@
</div>
</div>
<div class="row row-cards row-deck mt-4">
{% for client in clients %}
<div class="col-md-6">
<div class="card">
<div class="card-header">
<div class="card-title d-flex align-items-center">
{% if client.icon_id %}
<span class="avatar mr-2" style="background-image: url({{ client.icon.get_url() }})"></span>
{% endif %}
<span class="">
<a href="{{ url_for('developer.client_detail', client_id=client.id) }}">
{{ client.name }}
</a>
{% if client.approved %}
<span class="cursor" data-toggle="tooltip" data-original-title="Approved"></span>
{% else %}
<span class="cursor" data-toggle="tooltip" data-original-title="In Dev mode">
<div class="col-12 col-lg-6">
<div class="card" style="">
<div class="card-body">
<h5 class="card-title">
<a href="{{ url_for('developer.client_detail', client_id=client.id) }}">{{ client.name }}</a>
{% if client.approved %}
<span class="cursor" data-toggle="tooltip" data-original-title="Approved"></span>
{% else %}
<span class="cursor" data-toggle="tooltip"
data-original-title="In Dev mode. Please contact us to publish your app.">
<a href="{{ url_for('developer.client_detail', client_id=client.id) }}"
class="text-decoration-none">🚫
class="text-decoration-none">🚫
</a>
</span>
{% endif %}
</span>
</div>
{% endif %}
</h5>
<div class="card-options">
<a href="{{ url_for('developer.client_detail', client_id=client.id) }}"
class="btn btn-primary btn-sm">
Edit
</a>
</div>
<h6 class="card-subtitle mb-4 text-muted">
Created {{ client.created_at | dt }} <br>
<span class="font-weight-bold">{{ client.nb_user() }}</span> users.
<span class="font-weight-bold">{{ client.nb_paid_user() }}</span> paid users.
<br>
</h6>
<a href="{{ url_for('developer.client_detail', client_id=client.id) }}" class="mt-3">
Details ➡
</a>
</div>
<div class="card-body">
<span class="h1 m-0">{{ client.nb_user() }}</span> Users <br>
Created {{ client.created_at |dt }} <br>
{% if client.last_user_login() %}
Last User Login: {{ client.last_user_login().get_user_name() }}
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}

View File

@ -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]