Show CO₂ for flights on trip list.

This commit is contained in:
Edward Betts 2025-05-26 10:07:37 -05:00
parent a66565a785
commit 63c7c54bfc
4 changed files with 21 additions and 3 deletions

View file

@ -204,6 +204,10 @@ class Trip:
else None else None
) )
def total_co2_kg(self) -> float | None:
"""Total CO₂ for trip."""
return sum(float(t.get("co2_kg", 0)) for t in self.travel)
@property @property
def flights(self) -> list[StrDict]: def flights(self) -> list[StrDict]:
"""Flights.""" """Flights."""

View file

@ -143,7 +143,7 @@
{{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }} {{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }}
{% endif %} {% endif %}
</div> </div>
<div class="grid-item text-end">{{ item.co2_kg }} kg</div> <div class="grid-item text-end">{{ "{:,.1f}".format(item.co2_kg) }} kg</div>
{% endfor %} {% endfor %}
{% endmacro %} {% endmacro %}
@ -307,6 +307,7 @@
{% macro trip_item(trip) %} {% macro trip_item(trip) %}
{% set distances_by_transport_type = trip.distances_by_transport_type() %} {% set distances_by_transport_type = trip.distances_by_transport_type() %}
{% set total_distance = trip.total_distance() %} {% set total_distance = trip.total_distance() %}
{% set total_co2_kg = trip.total_co2_kg() %}
{% set end = trip.end %} {% set end = trip.end %}
<div class="border border-2 rounded mb-2 p-2"> <div class="border border-2 rounded mb-2 p-2">
<h3> <h3>
@ -336,6 +337,7 @@
</div> </div>
{% endif %} {% endif %}
{% if distances_by_transport_type %} {% if distances_by_transport_type %}
{% for transport_type, distance in distances_by_transport_type %} {% for transport_type, distance in distances_by_transport_type %}
<div> <div>
@ -345,6 +347,10 @@
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% if total_co2_kg %}
<div>Total CO₂: {{ "{:,.1f}".format(total_co2_kg) }} kg</div>
{% endif %}
{{ conference_list(trip) }} {{ conference_list(trip) }}
{% for day, elements in trip.elements_grouped_by_day() %} {% for day, elements in trip.elements_grouped_by_day() %}
@ -382,6 +388,7 @@
<span class="text-nowrap"><strong>duration:</strong> {{ e.detail.duration }}</span> <span class="text-nowrap"><strong>duration:</strong> {{ e.detail.duration }}</span>
{% endif %} {% endif %}
{# <pre>{{ e.detail | pprint }}</pre> #} {# <pre>{{ e.detail | pprint }}</pre> #}
<span class="text-nowrap"><strong>CO₂:</strong> {{ "{:,.1f}".format(e.detail.co2_kg) }} kg</span>
{% endif %} {% endif %}
{% if e.detail.distance %} {% if e.detail.distance %}
<span class="text-nowrap"><strong>distance:</strong> {{ format_distance(e.detail.distance) }}</span> <span class="text-nowrap"><strong>distance:</strong> {{ format_distance(e.detail.distance) }}</span>

View file

@ -62,6 +62,7 @@
distance: {{format_distance(distance) }} distance: {{format_distance(distance) }}
</div> </div>
{% endfor %} {% endfor %}
<div>Total CO₂: {{ "{:,.1f}".format(total_co2_kg / 1000.0) }} tonnes</div>
{% for trip in items %} {% for trip in items %}
{{ trip_item(trip) }} {{ trip_item(trip) }}

View file

@ -404,13 +404,17 @@ def calc_total_distance(trips: list[Trip]) -> float:
"""Total distance for trips.""" """Total distance for trips."""
total = 0.0 total = 0.0
for item in trips: for item in trips:
dist = item.total_distance() if dist := item.total_distance():
if dist:
total += dist total += dist
return total return total
def calc_total_co2_kg(trips: list[Trip]) -> float:
"""Total CO₂ for trips."""
return sum(item.total_co2_kg() for item in trips)
def sum_distances_by_transport_type(trips: list[Trip]) -> list[tuple[str, float]]: def sum_distances_by_transport_type(trips: list[Trip]) -> list[tuple[str, float]]:
"""Sum distances by transport type.""" """Sum distances by transport type."""
distances_by_transport_type: defaultdict[str, float] = defaultdict(float) distances_by_transport_type: defaultdict[str, float] = defaultdict(float)
@ -443,6 +447,7 @@ def trip_past_list() -> str:
format_list_with_ampersand=format_list_with_ampersand, format_list_with_ampersand=format_list_with_ampersand,
fx_rate=agenda.fx.get_rates(app.config), fx_rate=agenda.fx.get_rates(app.config),
total_distance=calc_total_distance(past), total_distance=calc_total_distance(past),
total_co2_kg=calc_total_co2_kg(past),
distances_by_transport_type=sum_distances_by_transport_type(past), distances_by_transport_type=sum_distances_by_transport_type(past),
) )
@ -475,6 +480,7 @@ def trip_future_list() -> str:
format_list_with_ampersand=format_list_with_ampersand, format_list_with_ampersand=format_list_with_ampersand,
fx_rate=agenda.fx.get_rates(app.config), fx_rate=agenda.fx.get_rates(app.config),
total_distance=calc_total_distance(current + future), total_distance=calc_total_distance(current + future),
total_co2_kg=calc_total_co2_kg(current + future),
distances_by_transport_type=sum_distances_by_transport_type(current + future), distances_by_transport_type=sum_distances_by_transport_type(current + future),
) )