API: display user statistics in profile - #9
This commit is contained in:
parent
bf7baacfbc
commit
e7b05feb45
@ -397,6 +397,10 @@ def test_user_profile_minimal(app, user_1):
|
|||||||
assert data['data']['email'] == 'test@test.com'
|
assert data['data']['email'] == 'test@test.com'
|
||||||
assert data['data']['created_at']
|
assert data['data']['created_at']
|
||||||
assert not data['data']['admin']
|
assert not data['data']['admin']
|
||||||
|
assert data['data']['nb_activities'] == 0
|
||||||
|
assert data['data']['nb_sports'] == 0
|
||||||
|
assert data['data']['total_distance'] == 0
|
||||||
|
assert data['data']['total_duration'] == '0:00:00'
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
@ -430,6 +434,45 @@ def test_user_profile_full(app, user_1_full):
|
|||||||
assert data['data']['birth_date']
|
assert data['data']['birth_date']
|
||||||
assert data['data']['bio'] == 'just a random guy'
|
assert data['data']['bio'] == 'just a random guy'
|
||||||
assert data['data']['location'] == 'somewhere'
|
assert data['data']['location'] == 'somewhere'
|
||||||
|
assert data['data']['nb_activities'] == 0
|
||||||
|
assert data['data']['nb_sports'] == 0
|
||||||
|
assert data['data']['total_distance'] == 0
|
||||||
|
assert data['data']['total_duration'] == '0:00:00'
|
||||||
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
|
def test_user_profile_with_activities(
|
||||||
|
app, user_1, sport_1_cycling, sport_2_running,
|
||||||
|
activity_cycling_user_1, activity_running_user_1
|
||||||
|
):
|
||||||
|
client = app.test_client()
|
||||||
|
resp_login = client.post(
|
||||||
|
'/api/auth/login',
|
||||||
|
data=json.dumps(dict(
|
||||||
|
email='test@test.com',
|
||||||
|
password='12345678'
|
||||||
|
)),
|
||||||
|
content_type='application/json'
|
||||||
|
)
|
||||||
|
response = client.get(
|
||||||
|
'/api/auth/profile',
|
||||||
|
headers=dict(
|
||||||
|
Authorization='Bearer ' + json.loads(
|
||||||
|
resp_login.data.decode()
|
||||||
|
)['auth_token']
|
||||||
|
)
|
||||||
|
)
|
||||||
|
data = json.loads(response.data.decode())
|
||||||
|
assert data['status'] == 'success'
|
||||||
|
assert data['data'] is not None
|
||||||
|
assert data['data']['username'] == 'test'
|
||||||
|
assert data['data']['email'] == 'test@test.com'
|
||||||
|
assert data['data']['created_at']
|
||||||
|
assert not data['data']['admin']
|
||||||
|
assert data['data']['nb_activities'] == 2
|
||||||
|
assert data['data']['nb_sports'] == 2
|
||||||
|
assert data['data']['total_distance'] == 22
|
||||||
|
assert data['data']['total_duration'] == '1:57:04'
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,3 +12,7 @@ def test_user_model(app, user_1):
|
|||||||
assert serialized_user['location'] is None
|
assert serialized_user['location'] is None
|
||||||
assert serialized_user['birth_date'] is None
|
assert serialized_user['birth_date'] is None
|
||||||
assert serialized_user['picture'] is False
|
assert serialized_user['picture'] is False
|
||||||
|
assert serialized_user['nb_activities'] == 0
|
||||||
|
assert serialized_user['nb_sports'] == 0
|
||||||
|
assert serialized_user['total_distance'] == 0
|
||||||
|
assert serialized_user['total_duration'] == '0:00:00'
|
||||||
|
@ -3,6 +3,9 @@ import datetime
|
|||||||
import jwt
|
import jwt
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
from mpwo_api import bcrypt, db
|
from mpwo_api import bcrypt, db
|
||||||
|
from sqlalchemy import func
|
||||||
|
|
||||||
|
from ..activities.models import Activity
|
||||||
|
|
||||||
|
|
||||||
class User(db.Model):
|
class User(db.Model):
|
||||||
@ -81,6 +84,18 @@ class User(db.Model):
|
|||||||
return 'Invalid token. Please log in again.'
|
return 'Invalid token. Please log in again.'
|
||||||
|
|
||||||
def serialize(self):
|
def serialize(self):
|
||||||
|
nb_activity = Activity.query.filter(
|
||||||
|
Activity.user_id == self.id
|
||||||
|
).count()
|
||||||
|
sports = db.session.query(
|
||||||
|
func.count(Activity.sport_id)
|
||||||
|
).group_by(
|
||||||
|
Activity.sport_id
|
||||||
|
).all()
|
||||||
|
total = db.session.query(
|
||||||
|
func.sum(Activity.distance),
|
||||||
|
func.sum(Activity.duration)
|
||||||
|
).first()
|
||||||
return {
|
return {
|
||||||
'id': self.id,
|
'id': self.id,
|
||||||
'username': self.username,
|
'username': self.username,
|
||||||
@ -92,5 +107,9 @@ class User(db.Model):
|
|||||||
'bio': self.bio,
|
'bio': self.bio,
|
||||||
'location': self.location,
|
'location': self.location,
|
||||||
'birth_date': self.birth_date,
|
'birth_date': self.birth_date,
|
||||||
'picture': self.picture is not None
|
'picture': self.picture is not None,
|
||||||
|
'nb_activities': nb_activity,
|
||||||
|
'nb_sports': len(sports),
|
||||||
|
'total_distance': float(total[0]) if total[0] else 0,
|
||||||
|
'total_duration': str(total[1]) if total[1] else "0:00:00",
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user