aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2023-03-27 23:13:11 +0200
committerDaniel Schadt <kingdread@gmx.de>2023-03-27 23:13:11 +0200
commit3025e048750779c30fa6ce9d51a98f88aa8e7f10 (patch)
tree49c5d305541f58594037931d5906d93cb235a030
parent0b3452e7954e74791be001f8d88716dc864e2a40 (diff)
downloadfietsboek-3025e048750779c30fa6ce9d51a98f88aa8e7f10.tar.gz
fietsboek-3025e048750779c30fa6ce9d51a98f88aa8e7f10.tar.bz2
fietsboek-3025e048750779c30fa6ce9d51a98f88aa8e7f10.zip
profile: add longest and shortest track
-rw-r--r--fietsboek/templates/profile.jinja280
-rw-r--r--fietsboek/views/profile.py31
2 files changed, 95 insertions, 16 deletions
diff --git a/fietsboek/templates/profile.jinja2 b/fietsboek/templates/profile.jinja2
index 516cee9..fe49990 100644
--- a/fietsboek/templates/profile.jinja2
+++ b/fietsboek/templates/profile.jinja2
@@ -1,5 +1,59 @@
{% extends "layout.jinja2" %}
+{% macro render_track_card(track) %}
+ <div class="card mb-3">
+ <h5 class="card-header">
+ <a href="{{ request.route_url('details', track_id=track.id) }}">{{ track.title | default(track.date, true) }}</a>
+ {% if track.text_tags() %}
+ {% for tag in track.tags %}<span class="badge bg-info text-dark">{{ tag.tag }}</span> {% endfor %}
+ {% endif %}
+ </h5>
+ <div class="card-body">
+ <table class="table table-hover table-sm browse-summary">
+ <tbody>
+ <tr>
+ <th scope="row">{{ _("page.details.date") }}</th>
+ <td>{{ track.date | format_datetime }}</td>
+ <th scope="row">{{ _("page.details.length") }}</th>
+ <td>{{ (track.length / 1000) | round(2) | format_decimal }} km</td>
+ </tr>
+ <tr>
+ <th scope="row">{{ _("page.details.start_time") }}</th>
+ <td>{{ track.start_time | format_datetime }}</td>
+ <th scope="row">{{ _("page.details.end_time") }}</th>
+ <td>{{ track.end_time | format_datetime }}</td>
+ </tr>
+ <tr>
+ <th scope="row">{{ _("page.details.uphill") }}</th>
+ <td>{{ track.uphill | round(2) | format_decimal }} m</td>
+ <th scope="row">{{ _("page.details.downhill") }}</th>
+ <td>{{ track.downhill | round(2) | format_decimal }} m</td>
+ </tr>
+ <tr>
+ <th scope="row">{{ _("page.details.moving_time") }}</th>
+ <td>{{ track.moving_time }}</td>
+ <th scope="row">{{ _("page.details.stopped_time") }}</th>
+ <td>{{ track.stopped_time }}</td>
+ </tr>
+ <tr>
+ <th scope="row">{{ _("page.details.max_speed") }}</th>
+ <td>{{ mps_to_kph(track.max_speed) | round(2) | format_decimal }} km/h</td>
+ <th scope="row">{{ _("page.details.avg_speed") }}</th>
+ <td>{{ mps_to_kph(track.avg_speed) | round(2) | format_decimal }} km/h</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <ul>
+ <li>{{ track.owner.name }}</li>
+ {% for user in track.tagged_people %}
+ <li>{{ user.name }}</li>
+ {% endfor %}
+ </ul>
+ </div>
+ </div>
+{% endmacro %}
+
{% block content %}
<div class="container">
<h1>{{ user.name }}</h1>
@@ -10,37 +64,47 @@
<table class="table table-hover table-sm">
<th scope="row">{{ _("page.profile.length") }}</th>
- <td id="profileLength">{{ (total_length / 1000) | round(2) | format_decimal }} km</td>
+ <td id="profileLength">{{ (total.length / 1000) | round(2) | format_decimal }} km</td>
</tr>
<tr>
<th scope="row">{{ _("page.profile.uphill") }}</th>
- <td id="profileUphill">{{ total_uphill | round(2) | format_decimal }} m</td>
+ <td id="profileUphill">{{ total.uphill | round(2) | format_decimal }} m</td>
</tr>
<tr>
<th scope="row">{{ _("page.profile.downhill") }}</th>
- <td id="profileDownhill">{{ total_downhill | round(2) | format_decimal }} m</td>
+ <td id="profileDownhill">{{ total.downhill | round(2) | format_decimal }} m</td>
</tr>
<tr>
<th scope="row">{{ _("page.profile.moving_time") }}</th>
- <td id="profileMovingTime">{{ total_moving_time }}</td>
+ <td id="profileMovingTime">{{ total.moving_time }}</td>
</tr>
<tr>
<th scope="row">{{ _("page.profile.stopped_time") }}</th>
- <td id="profileStoppedTime">{{ total_stopped_time }}</td>
+ <td id="profileStoppedTime">{{ total.stopped_time }}</td>
</tr>
<tr>
<th scope="row">{{ _("page.profile.max_speed") }}</th>
- <td id="profileMaxSpeed">{{ mps_to_kph(max_speed) | round(2) | format_decimal }} km/h</td>
+ <td id="profileMaxSpeed">{{ mps_to_kph(total.max_speed) | round(2) | format_decimal }} km/h</td>
</tr>
<tr>
<th scope="row">{{ _("page.profile.avg_speed") }}</th>
- <td id="profileAvgSpeed">{{ mps_to_kph(avg_speed) | round(2) | format_decimal }} km/h</td>
+ <td id="profileAvgSpeed">{{ mps_to_kph(total.avg_speed) | round(2) | format_decimal }} km/h</td>
</tr>
<tr>
<th scope="row">{{ _("page.profile.number_of_tracks") }}</th>
- <td id="profileNumberOfTracks">{{ number_of_tracks }}</td>
+ <td id="profileNumberOfTracks">{{ total.count }}</td>
</tr>
</table>
+
+ {% if total.longest_distance_track %}
+ <h2>{{ _("page.profile.longest_distance_track") }}</h2>
+ {{ render_track_card(total.longest_distance_track) }}
+ {% endif %}
+
+ {% if total.shortest_distance_track %}
+ <h2>{{ _("page.profile.shortest_distance_track") }}</h2>
+ {{ render_track_card(total.shortest_distance_track) }}
+ {% endif %}
</div>
{% endblock %}
diff --git a/fietsboek/views/profile.py b/fietsboek/views/profile.py
index 2a4203e..df49c3c 100644
--- a/fietsboek/views/profile.py
+++ b/fietsboek/views/profile.py
@@ -2,6 +2,7 @@
import datetime
import sqlite3
from dataclasses import dataclass
+from typing import Optional
from pyramid.httpexceptions import HTTPNotFound
from pyramid.request import Request
@@ -44,6 +45,12 @@ class CumulativeStats:
max_speed: float = 0.0
"""Overall maximum speed, in m/s."""
+ longest_distance_track: Optional[TrackWithMetadata] = None
+ """The track with the longest distance."""
+
+ shortest_distance_track: Optional[TrackWithMetadata] = None
+ """The track with the shortest distance."""
+
def add(self, track: TrackWithMetadata):
"""Adds a track to this stats collection.
@@ -57,6 +64,18 @@ class CumulativeStats:
self.stopped_time += track.stopped_time
self.max_speed = max(self.max_speed, track.max_speed)
+ if (
+ self.shortest_distance_track is None
+ or self.longest_distance_track.length < track.length
+ ):
+ self.longest_distance_track = track
+
+ if (
+ self.shortest_distance_track is None
+ or self.shortest_distance_track.length > track.length
+ ):
+ self.shortest_distance_track = track
+
@property
def avg_speed(self) -> float:
"""Average speed, in m/s."""
@@ -92,6 +111,9 @@ def profile(request: Request) -> dict:
meta = TrackWithMetadata(track, request.data_manager)
total.add(meta)
+ total.moving_time = round_to_seconds(total.moving_time)
+ total.stopped_time = round_to_seconds(total.stopped_time)
+
heatmap_url = None
tilehunt_url = None
try:
@@ -126,15 +148,8 @@ def profile(request: Request) -> dict:
return {
"user": request.context,
- "total_length": total.length,
- "total_uphill": total.uphill,
- "total_downhill": total.downhill,
- "total_moving_time": round_to_seconds(total.moving_time),
- "total_stopped_time": round_to_seconds(total.stopped_time),
- "max_speed": total.max_speed,
- "avg_speed": total.avg_speed,
+ "total": total,
"mps_to_kph": util.mps_to_kph,
- "number_of_tracks": total.count,
"heatmap_url": heatmap_url,
"tilehunt_url": tilehunt_url,
}