Skip to content

Commit

Permalink
Merge pull request #368 from rl-institut/release/v0.14.0
Browse files Browse the repository at this point in the history
Release/v0.14.0
  • Loading branch information
bmlancien authored Jul 6, 2020
2 parents 37020de + 9bd7897 commit fa2b484
Show file tree
Hide file tree
Showing 103 changed files with 3,145 additions and 1,813 deletions.
21 changes: 20 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,32 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project tries to adhere to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.14.0] - 2020-07-06
### Added
- new questions for all categories
- feedback form on landing page
- posthog for anonymous session tracking
- landing page and default route for non-bus-users
- implemented flashes at finished page
- finished quiz includes link back to dashboard
- titles and alternative texts to minder barriers

### Changed
- link (to welcome page) and text for sharing the app
- redesigned landing page
- comparison chart is loaded dynamically (ajax)
- Implemented tabs on summary page
- Replaced progress bar on question page with flashes
- environment/my_route page to show comparison charts

## [0.13.0] - 2020-06-29
### Changed
- Removed answer score page; correct/wrong answer is showed on answer page
- welcome tour design (added animation)
- moved feedback and bug report to legal page
- dashboard circles to flashes

##[0.12.0] - 2020-06-26
## [0.12.0] - 2020-06-26
### Added
- BMWI and NOW logo to landing page (desktop & mobile)

Expand Down
3 changes: 3 additions & 0 deletions config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"""

import environ
import posthog

ROOT_DIR = (
environ.Path(__file__) - 3
Expand Down Expand Up @@ -236,3 +237,5 @@

# Your stuff...
# ------------------------------------------------------------------------------
posthog.api_key = env.str("POSTHOG_KEY", default=None)
posthog.host = env.str("POSTHOG_URL", default=None)
4 changes: 4 additions & 0 deletions config/settings/local.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import posthog

from .base import * # noqa
from .base import env

Expand Down Expand Up @@ -60,3 +62,5 @@

# Your stuff...
# ------------------------------------------------------------------------------
# Disable Posthog in local mode
posthog.disabled = True
3 changes: 3 additions & 0 deletions config/settings/test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
With these settings, tests run faster.
"""
import posthog

from .base import * # noqa
from .base import env
Expand Down Expand Up @@ -51,3 +52,5 @@

# Your stuff...
# ------------------------------------------------------------------------------
# Disable Posthog in test mode
posthog.disabled = True
2 changes: 1 addition & 1 deletion e_metrobus/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "0.1.0"
__version__ = "0.14.0"
__version_info__ = tuple(
[
int(num) if num.isdigit() else num
Expand Down
71 changes: 60 additions & 11 deletions e_metrobus/navigation/chart.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from collections import namedtuple

import math
from decimal import Decimal
import plotly
import plotly.graph_objects as go

Expand All @@ -10,7 +12,8 @@
OFFSET = 1
SIZE = MARGIN - 2 * OFFSET
TEXTSIZE = 5
TROPHY_OFFSET = 10
TROPHY_OFFSET = 2
ICON_SIZE = 40

DEFAULT_COLOR = "Gainsboro"
FONT_COLOR = "#B0B0B0"
Expand Down Expand Up @@ -41,19 +44,32 @@ def get_sizes(max_value):
return Sizes(*map(lambda x: x / 50 * max_value, [MARGIN, OFFSET, SIZE, TEXTSIZE]))


def get_mobility_figure(values):
def get_mobility_figure(values, title):
rounding = get_rounding(max(values))
if rounding == 0:
rounded_values = [int(v) for v in values]
else:
rounded_values = [round(v, rounding) for v in values]
colors = [DEFAULT_COLOR] * 5
colors[1] = E_BUS_COLOR
mobiles = [_("Zu Fuß/<br>Fahrrad"), _("E-Bus"), _("E-Pkw"), _("Dieselbus"), _("Pkw")]

max_value = max(values)
mobiles = [
_("Zu Fuß/<br>Fahrrad"),
_("E-Bus"),
_("E-Pkw"),
_("Dieselbus"),
_("Pkw"),
]
scaled_values = [
(v + min(rounded_values)) / max(rounded_values) * 100 for v in rounded_values
]
max_value = max(scaled_values)
sizes = get_sizes(max_value)

bar = go.Bar(
x=mobiles,
y=values,
y=scaled_values,
marker_color=colors,
text=values,
text=rounded_values,
textposition="outside",
width=0.6,
)
Expand All @@ -75,7 +91,7 @@ def get_mobility_figure(values):
fig.add_annotation(
x=0.5,
y=max_value,
text=_("CO<sub>2</sub> Emissionen [in g]<br>nach Verkehrsmittel"),
text=title,
font={"size": 15, "color": FONT_COLOR},
align="left",
showarrow=False,
Expand All @@ -96,12 +112,15 @@ def get_mobility_figure(values):
)
)
# Trophy Icons:
trophy_number = 1
for i in range(3):
if i > 0 and scaled_values[i] > scaled_values[i - 1]:
trophy_number += 1
fig.add_layout_image(
go.layout.Image(
source=f"/static/images/icons/i_trophy_{i+1}_{'black' if i == 1 else 'gray'}.svg",
source=f"/static/images/icons/i_trophy_{trophy_number}_{'black' if i == 1 else 'gray'}.svg",
x=i,
y=values[i]
y=scaled_values[i]
+ sizes.textsize
+ sizes.size
+ sizes.offset
Expand All @@ -111,6 +130,36 @@ def get_mobility_figure(values):
)
)
fig.update_layout_images(
{"xref": "x", "yref": "y", "xanchor": "center", "yanchor": "top",}
{"xref": "x", "yref": "y", "xanchor": "center", "yanchor": "top"}
)
return DjangoFigure(fig, displayModeBar=False, staticPlot=True)


def get_co2_figure(values):
title = _("CO<sub>2</sub> Emissionen [in g]<br>nach Verkehrsmittel")
return get_mobility_figure(values, title)


def get_nitrogen_figure(values):
title = _("Stickoxid Emissionen [in g]<br>nach Verkehrsmittel")
return get_mobility_figure(values, title)


def get_fine_dust_figure(values):
title = _("Feinstaub Emissionen [in g]<br>nach Verkehrsmittel")
return get_mobility_figure(values, title)


def get_rounding(max_value):
if max_value >= 10:
return 0
str_value = str(max_value).split(".")
if len(str_value) == 1:
return 0
dec = str_value[1]
i = 0
while len(dec) > i and dec[i] == "0":
i += 1
if len(dec) == i + 1:
return i + 1
return i + 2
19 changes: 10 additions & 9 deletions e_metrobus/navigation/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
ELLIPSE_Y_OFFSET = 7

Consumption = namedtuple(
"Consumption", ["distance", "fuel", "co2", "nitrogen", "fine_dust"]
"Consumption", ["distance", "co2", "nitrogen", "fine_dust"]
)

FLEET_CONSUMPTION = Consumption(
distance=3000, fuel=200000, co2=300000, nitrogen=20000, fine_dust=10000
distance=3000, co2=300000, nitrogen=20000, fine_dust=10000
)


Expand All @@ -38,7 +38,6 @@ def __str__(self):

@dataclass
class DataPerKilometer:
fuel: float
co2: float
nitrogen: float
fine_dust: float
Expand All @@ -65,20 +64,22 @@ class Vehicle:
Vehicle(
name="car",
label=_("PKW"),
data=DataPerKilometer(fuel=0, co2=147, nitrogen=0.43, fine_dust=0.004),
data=DataPerKilometer(co2=147, nitrogen=0.43, fine_dust=0.004),
),
Vehicle(
name="bus",
label=_("Dieselbus"),
data=DataPerKilometer(fuel=0, co2=80, nitrogen=0.32, fine_dust=0.003),
data=DataPerKilometer(co2=80, nitrogen=0.32, fine_dust=0.003),
),
Vehicle(name="e-pkw", label=_("Elektro-PKW"), data=DataPerKilometer(0, 53, 0, 0),),
Vehicle(name="e-bus", label=_("Elektrobus"), data=DataPerKilometer(0, 42, 0, 0),),
Vehicle(name="bicycle", label=_("Fahrrad"), data=DataPerKilometer(0, 0, 0, 0),),
Vehicle(name="pedestrian", label=_("zu Fuß"), data=DataPerKilometer(0, 0, 0, 0),),
Vehicle(name="e-pkw", label=_("Elektro-PKW"), data=DataPerKilometer(53, 0, 0),),
Vehicle(name="e-bus", label=_("Elektrobus"), data=DataPerKilometer(42, 0, 0),),
Vehicle(name="bicycle", label=_("Fahrrad"), data=DataPerKilometer(0, 0, 0),),
Vehicle(name="pedestrian", label=_("zu Fuß"), data=DataPerKilometer(0, 0, 0),),
]

DATA_SOURCES = [
'Umweltbundesamt, "Vergleich der durchschnittlicher Emissionen einzelner Verkehrsmittel im Personenverkehr in Deutschland - Bezugsjahr 2018", 01/2020',
'Umweltbundesamt, "Entwicklung der spezifischen Kohlendioxid-Emissionen des deutschen Strommix in den Jahren 1990 - 2019", 13/2020',
]

POSTHOG_EVENTS = ("shared", "sources", "english")
2 changes: 1 addition & 1 deletion e_metrobus/navigation/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Meta:
model = Feedback
fields = ("comment",)
labels = {
"comment": "Schreib uns Deine Meinung/Kritik:",
"comment": "Schreib uns deine Meinung/Kritik:",
}
widgets = {
"comment": FeedbackCommentWidget
Expand Down
96 changes: 78 additions & 18 deletions e_metrobus/navigation/questions.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -12,46 +12,88 @@
short_answer = ""
[[[loading_time]]]
label = "Ladezeiten"
question = "Wie lange muss dieser Bus an der Endhaltestelle laden?"
answers = "27-33 Minuten", "1 Stunde", "Wenige Minuten", "30 Sekunden"
question = "Wie lange müssen die E-Gelenkbusse der 200 an den Endhaltestellen laden?"
answers = "Halbe Stunde", "Eine Stunde", "Wenige Minuten", "Wenige Sekunden"
correct = 2
short_answer = "Der Bus muss nur wenige Minuten laden!"
[[[line_200]]]
label = "Linie 200"
question = "Wann sollen E-Busse auf Linie 200 zum Einsatz kommen?"
answers = "2020", "2021", "2022", "2025"
correct = 0
short_answer = "Linie 200 soll ab dem Jahr 2020 unterwegs sein!"
short_answer = "Die Ladezeiten betragen in der Regel wenige Minuten."
[[[loading]]]
label = "Ladevorgang"
question = "Wie wird die Buslinie 200 geladen?"
answers = "Stecker", "Pantograf", "Berührungslos mittels Induktion", "Batterie wird gewechselt"
question = "Wie werden die E-Gelenkbusse auf der Linie 200 geladen?"
answers = "Stecker von der Seite", "Pantograph von oben", "Berührungslos mittels Induktion von unten", "Batterie wird gewechselt"
correct = 1
short_answer = "Der Bus wird mittels eines Pantografen geladen"
short_answer = "Der Bus wird an den Endhaltestellen Hertzallee und Michelangelostraße sowie im Betriebshof mit einem Pantographen aufgeladen."
[[[batteries]]]
label = "Batterien"
question = "Wo befinden sich die Batterien der E-Gelenkbusse der Linie 200?"
answers = "Im Boden", "Am Heck", "Auf dem Dach", "An den Seiten"
correct = 2
short_answer = "Die Batterien der Elektro-Gelenkbusse, die auf der Linie 200 eingesetzt werden, sich auf dem Dach angebracht."
[[[costs]]]
label = "Kosten"
question = "Wie viel mehr kostet ein E-Bus als ein konventioneller Diesel-Bus?"
answers = "Doppelt", "Dreifach", "Zehnfach", "Genauso"
correct = 0
short_answer = "E-Busse kosten aktuell noch etwa doppelt so viel wie konventionelle Diesel-Busse der gleichen Größenklasse."

[environment]
label = "Umwelt"
icon = "images/icons/i_earth_black_line.svg"
small_icon = "images/icons/i_earth_black_fill.svg"
[[questions]]
[[[co2_reduction]]]
label = "CO<sub>2</sub> Reduktion"
question = "Wie viel CO<sub>2</sub> wird durch den Einsatz der Elektrobusse auf der Linie 200 jährlich eingespart?"
answers = "444 t", "111 t", "759 kg", "50 t"
[[[energy]]]
label = "Energie"
question = "Wieviel Energie ist für die jährliche Stromversorgung der E-Busse auf der Linie 200 notwendig?"
answers = "2.044 MWh pro Jahr", "500.000 kWh pro Jahr", "1 MWh pro Jahr", "530 MWh pro Jahr"
correct = 0
short_answer = "Der jährliche Stromverbrauch der gesamten Buslinie 200 mit allen im Betrieb befindlichen E-Bussen liegt bei etwa 2.044.000 kWh."
[[[weather]]]
label = "Wettereinfluss"
question = "Welche Wetterbedingungen haben einen Einfluss auf die Nutzung des Pantographen (Ladung von oben) zur Ladung der E-Gelenkbusse?"
answers = "Hitze", "Schnee/Eis", "Regen", "Wind", "Keine der genannten"
correct = 4
short_answer = "Der Betrieb des Pantographen ist weitgehend wetterunabhängig möglich."
[[[reach]]]
label = "Reichweite"
question = "Die Reichweite aktueller Busse reicht noch nicht für die Elektrifizierung aller Linien in Berlin. Was sind geeignete technologische Ansätze für die Vollelektrifizierung?"
answers = "Busse leichter machen", "Verschiedene Ladestrategien im Mix (Depot- und Gelegenheitsladung)", "Mehr Busse", "Wasserstoff", "Oberleitung (Hybrid-Oberleitungsbusse)", "Förderung des motorisierten Individualverkehrs"
correct = 1, 2, 3, 4
short_answer = "444 t CO<sub>2</sub> können durch die Elektrifizierung der Linie 200 pro Jahr eingespart werden."
[[[windturbines]]]
label = "Windräder"
question = "Wie viele Windenergieanlagen sind bilanziell für den Betrieb der E-Gelenkbusse auf der Linie 200 im Jahr notwendig?"
answers = "0,2", "1", "5", "20"
correct = 0
short_answer = "Es werden etwa 0,2 Windräder mit einer Leistung von je 3 MW benötigt, um die E-Busse der Linie rein aus Windstrom zu besorgen."

[politics]
label = "Politk"
icon = "images/icons/i_government_black_line.svg"
small_icon = "images/icons/i_government_black_fill.svg"
[[questions]]
[[[ebus_time]]]
label = "Zeitplan"
label = "Erster E-Bus"
question = "Seit wann fahren Elektrobusse in Berlin?"
answers = "2014", "2015", "2016", "2019"
correct = 1
short_answer = "Elektrobusse fahren seit dem Jahr 2015 in Berlin."
short_answer = "Die erste Linie mit E-Bussen war im Jahr 2015 die Linie 204."
[[[full_electrification]]]
label = "Vollelektrifizierung"
question = "Wie viele E-Busse werden für eine Vollelektrifizierung des Berliner Busnetzes erwartet?"
answers = "Ca. 1000", "Ca. 1450 (aktuelle Busflotte)", "Ca. 1800", "Ca. 2300"
correct = 2
short_answer = "Die geschätzte Anzahl liegt zwischen ca. 1700 und 1900 Bussen bei einer vollständigen Elektrifizierung."
[[[schedule]]]
label = "Zeitplan"
question = "Bis wann sollen ausschließlich E-Busse auf Berlins Straßen fahren?"
answers = "2025", "2030", "2050", "2080"
correct = 1
short_answer = "Berlins Mobilitätsgesetz, nach wie vor einzigartig in Deutschland, gibt in Berlin den Zeitrahmen für den vollständigen Umstieg von Diesel auf alternative Antriebe vor: Das entscheidende Jahr ist 2030."
[[[neutral]]]
label = "Klimaneutral"
question = "Bis wann soll Berlin klimaneutral sein?"
answers = "2025", "2030", "2050", "2080"
correct = 2
short_answer = "Bis 2050 will die Stadt klimaneutral werden und die Kohlendioxidemissionen um mindestens 85 % (bezogen auf 1990) reduzieren."

[personal]
label = "Ich"
Expand All @@ -64,3 +106,21 @@
answers = "Weniger CO<sub>2</sub>-Belastung", "Weniger Lärmbelastung", "Kürzere Fahrzeiten", "Günstigere Fahrkarten"
correct = 0, 1
short_answer = "Vorteile sind unter anderem eine geringere CO<sub>2</sub>- und Lärmbelastung."
[[[footprint]]]
label = "Wahl des Verkehrsmittels"
question = "Warum solltest auch du bei der Wahl deiner Verkehrsmittel auf den Umweltaspekt achten?"
answers = "Energieeffizienz von Bussen", "Individualverkehr ggü. ÖPNV", "Volle Straßen", "Egal"
correct = 0, 1
short_answer = "Vorteile sind unter anderem eine geringere CO<sub>2</sub>- und Lärmbelastung."
[[[e_bus]]]
label = "E-Bus"
question = "Woran erkennt man einen E-Bus?"
answers = "Der E-Bus produziert keine Abgase während des Fahrbetriebs.", "Der E-Bus hat einen sichtbaren Aufbau auf dem Dach.", "Der E-Bus ist leiser als ein konventioneller Bus.", "Der E-Bus ermöglicht kürzer Fahrzeiten."
correct = 0, 1, 2
short_answer = "Leider schaffen E-Busse noch keine Zeitreisen, die Fahrzeit wird also nicht kürzer. Aber alle anderen Antworten sind richtig."
[[[lines]]]
label = "E-Bus Linien"
question = "Auf welchen Linien (neben der Linie 200) ist jetzt schon eine Fahrt mit einem E-Bus möglich?"
answers = "Innenstadtlinien", "Nachtlinien", "Metrobus-Linien", "Umland-Linien"
correct = 0, 1
short_answer = "Bis Ende 2020 wird die BVG insgesamt 120 Elektrobusse (von der Standard-Größe Eindecker) in ihrer Flotte haben. Diese sind zum Beispiel auf den Linien 142, 147, 155, 250, 294, N50 und 300 unterwegs. "
Loading

0 comments on commit fa2b484

Please sign in to comment.