diff --git a/backend/server/adventures/views/stats_view.py b/backend/server/adventures/views/stats_view.py index b3fcb38..dcc4a94 100644 --- a/backend/server/adventures/views/stats_view.py +++ b/backend/server/adventures/views/stats_view.py @@ -2,8 +2,9 @@ from rest_framework import viewsets from rest_framework.response import Response from rest_framework.decorators import action from django.shortcuts import get_object_or_404 +from django.db import models from worldtravel.models import City, Region, Country, VisitedCity, VisitedRegion -from adventures.models import Location, Collection +from adventures.models import Location, Collection, Activity from django.contrib.auth import get_user_model User = get_user_model() @@ -37,6 +38,19 @@ class StatsViewSet(viewsets.ViewSet): visited_country_count = VisitedRegion.objects.filter( user=user.id).values('region__country').distinct().count() total_countries = Country.objects.count() + + # get activity counts + user_activities = Activity.objects.filter( + user=user.id) + + activity_count = user_activities.count() + activity_distance = user_activities.aggregate( + total_distance=models.Sum('distance'))['total_distance'] or 0 + activity_moving_time = user_activities.aggregate( + total_duration=models.Sum('moving_time'))['total_duration'] or 0 + activity_elevation = user_activities.aggregate( + total_elevation=models.Sum('elevation_gain'))['total_elevation'] or 0 + return Response({ 'location_count': location_count, 'trips_count': trips_count, @@ -45,5 +59,9 @@ class StatsViewSet(viewsets.ViewSet): 'visited_region_count': visited_region_count, 'total_regions': total_regions, 'visited_country_count': visited_country_count, - 'total_countries': total_countries - }) \ No newline at end of file + 'total_countries': total_countries, + 'activity_distance': activity_distance, # measured in meters + 'activity_moving_time': activity_moving_time, # measured in seconds + 'activity_elevation': activity_elevation, # measured in meters + 'activity_count': activity_count, + }) \ No newline at end of file diff --git a/frontend/src/routes/profile/[uuid]/+page.svelte b/frontend/src/routes/profile/[uuid]/+page.svelte index 0227d5a..6ba8203 100644 --- a/frontend/src/routes/profile/[uuid]/+page.svelte +++ b/frontend/src/routes/profile/[uuid]/+page.svelte @@ -18,6 +18,12 @@ import TrendingUp from '~icons/mdi/trending-up'; import Share from '~icons/mdi/share-variant'; import Award from '~icons/mdi/award'; + import Run from '~icons/mdi/run'; + import Timer from '~icons/mdi/timer-outline'; + import TrendingUpOutline from '~icons/mdi/trending-up'; + import Mountain from '~icons/mdi/mountain'; + + let measurementSystem = data.user?.measurement_system || 'metric'; let stats: { visited_country_count: number; @@ -28,6 +34,10 @@ total_countries: number; visited_city_count: number; total_cities: number; + activity_count: number; + activity_distance: number; + activity_moving_time: number; + activity_elevation: number; } | null; const user: User = data.user; @@ -35,6 +45,30 @@ const collections: Collection[] = data.collections; stats = data.stats || null; + // function to take in meters for distance and return it in either kilometers or miles + function getDistance(meters: number): string { + return measurementSystem === 'imperial' + ? `${(meters * 0.000621371).toFixed(2)} mi` + : `${(meters / 1000).toFixed(2)} km`; + } + + function getElevation(meters: number): string { + return measurementSystem === 'imperial' + ? `${(meters * 3.28084).toFixed(1)} ft` + : `${meters.toFixed(1)} m`; + } + + // Function to format time from seconds to readable format + function formatTime(seconds: number): string { + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + + if (hours > 0) { + return `${hours}h ${minutes}m`; + } + return `${minutes}m`; + } + // Calculate achievements $: worldExplorationPercentage = stats ? Math.round((stats.visited_country_count / stats.total_countries) * 100) @@ -258,7 +292,7 @@ -
Your fitness and activity achievements
+