Skip to content

Commit

Permalink
Merge pull request #411 from rl-institut/release/v0.15.0
Browse files Browse the repository at this point in the history
Release/v0.15.0
  • Loading branch information
henhuy authored Jul 13, 2020
2 parents fa2b484 + e1bb1b1 commit b84e9ad
Show file tree
Hide file tree
Showing 79 changed files with 1,652 additions and 621 deletions.
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ 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.15.0] - 2020-07-13
### Added
- slogan to finished and share link
- imprint and privacy infos on desktop and legal page

### Changed
- changing route from environment returns to environment page

### Fixed
- server errors due to missing/wrong image sources
- soft keyboard activating landscape view

## [0.14.0] - 2020-07-06
### Added
- new questions for all categories
Expand Down
2 changes: 2 additions & 0 deletions compose/local/django/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ RUN apk update \
# psycopg2 dependencies
&& apk add --virtual build-deps gcc python3-dev musl-dev \
&& apk add postgresql-dev \
# lxml dependencies
&& apk add libxml2-dev libxslt-dev \
# Pillow dependencies
&& apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
# CFFI dependencies
Expand Down
2 changes: 2 additions & 0 deletions compose/production/django/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ RUN apk update \
# psycopg2 dependencies
&& apk add --virtual build-deps gcc python3-dev musl-dev \
&& apk add postgresql-dev \
# lxml dependencies
&& apk add libxml2-dev libxslt-dev \
# Pillow dependencies
&& apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
# CFFI dependencies
Expand Down
7 changes: 7 additions & 0 deletions config/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,3 +239,10 @@
# ------------------------------------------------------------------------------
posthog.api_key = env.str("POSTHOG_KEY", default=None)
posthog.host = env.str("POSTHOG_URL", default=None)

EXCHANGE_ACCOUNT = env.str("EXCHANGE_ACCOUNT", default=None)
EXCHANGE_EMAIL = env.str("EXCHANGE_EMAIL", default=None)
EXCHANGE_PW = env.str("EXCHANGE_PW", default=None)

FEEDBACK_FOLDER = env.list("FEEDBACK_FOLDER", default=None)
BUG_RECIPIENTS = env.list("FEEDBACK_RECIPIENTS", default=[])
12 changes: 0 additions & 12 deletions config/settings/production.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,18 +91,6 @@
# Django Admin URL regex.
ADMIN_URL = env("DJANGO_ADMIN_URL")

# Anymail (Mailgun)
# ------------------------------------------------------------------------------
# https://anymail.readthedocs.io/en/stable/installation/#installing-anymail
INSTALLED_APPS += ["anymail"] # noqa F405
EMAIL_BACKEND = "anymail.backends.mailgun.EmailBackend"
# https://anymail.readthedocs.io/en/stable/installation/#anymail-settings-reference
ANYMAIL = {
"MAILGUN_API_KEY": env("MAILGUN_API_KEY"),
"MAILGUN_SENDER_DOMAIN": env("MAILGUN_DOMAIN"),
"MAILGUN_API_URL": env("MAILGUN_API_URL", default="https://api.mailgun.net/v3"),
}

# WhiteNoise
# ------------------------------------------------------------------------------
# http://whitenoise.evans.io/en/latest/django.html#enable-whitenoise
Expand Down
16 changes: 1 addition & 15 deletions config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,10 @@
from django.urls import include, path
from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static
from django.contrib import admin
from django.views.generic import TemplateView
from django.views import defaults as default_views

urlpatterns = (
[
path(
"datenschutz",
TemplateView.as_view(template_name="pages/dgstvo.html"),
name="dgstvo",
),
path(
"kontakt",
TemplateView.as_view(template_name="pages/contact.html"),
name="contact",
),
path(settings.ADMIN_URL, admin.site.urls),
]
[]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+ i18n_patterns(
path("", include("e_metrobus.navigation.urls", namespace="navigation")),
Expand Down
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.14.0"
__version__ = "0.15.0"
__version_info__ = tuple(
[
int(num) if num.isdigit() else num
Expand Down
12 changes: 6 additions & 6 deletions e_metrobus/navigation/chart.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@

from collections import namedtuple

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

from django.utils.translation import gettext as _

from e_metrobus.navigation.utils import set_separators

# at max_value = 50
MARGIN = 10
OFFSET = 1
Expand Down Expand Up @@ -57,7 +57,7 @@ def get_mobility_figure(values, title):
_("E-Bus"),
_("E-Pkw"),
_("Dieselbus"),
_("Pkw"),
_("Pkw (Diesel)"),
]
scaled_values = [
(v + min(rounded_values)) / max(rounded_values) * 100 for v in rounded_values
Expand All @@ -69,7 +69,7 @@ def get_mobility_figure(values, title):
x=mobiles,
y=scaled_values,
marker_color=colors,
text=rounded_values,
text=[set_separators(v) for v in rounded_values],
textposition="outside",
width=0.6,
)
Expand All @@ -89,7 +89,7 @@ def get_mobility_figure(values, title):
fig.layout.yaxis.visible = False
fig.layout.yaxis.range = [-sizes.margin, max_value + sizes.margin]
fig.add_annotation(
x=0.5,
x=1.2,
y=max_value,
text=title,
font={"size": 15, "color": FONT_COLOR},
Expand Down
8 changes: 7 additions & 1 deletion e_metrobus/navigation/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class Vehicle:
VEHICLES = [
Vehicle(
name="car",
label=_("PKW"),
label=_("PKW (Diesel)"),
data=DataPerKilometer(co2=147, nitrogen=0.43, fine_dust=0.004),
),
Vehicle(
Expand All @@ -83,3 +83,9 @@ class Vehicle:
]

POSTHOG_EVENTS = ("shared", "sources", "english")

FINISHED_SLOGANS = (
_("Oha, da ist noch Luft nach oben! Macht aber nichts. In unserem Info-Bereich findest du Antworten auf all deine Fragen zu E-Bussen, die du nie zu stellen gewagt hast."),
_("Nicht schlecht, aber das geht noch besser! Alle Fakten zum Nachlesen und Aufschlauen findest du in unserem Info-Bereich."),
_("Wow! Wir können dir kaum noch etwas beibringen. Alle Fakten zum Nachlesen findest du nochmal in unserem Info-Bereich.")
)
2 changes: 1 addition & 1 deletion e_metrobus/navigation/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.utils.safestring import mark_safe

from e_metrobus.navigation.models import Bug, Feedback
from e_metrobus.navigation.widgets import FeedbackCommentWidget, FeedbackStarsWidget
from e_metrobus.navigation.widgets import FeedbackCommentWidget


class FeedbackForm(forms.ModelForm):
Expand Down
76 changes: 38 additions & 38 deletions e_metrobus/navigation/questions.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@


[e_metrobus]
label = "E-MetroBus"
label = "Technik"
icon = "images/icons/i_ebus_black_line.svg"
small_icon = "images/icons/i_ebus_black_fill.svg"
[[questions]]
Expand All @@ -12,79 +12,79 @@
short_answer = ""
[[[loading_time]]]
label = "Ladezeiten"
question = "Wie lange müssen die E-Gelenkbusse der 200 an den Endhaltestellen laden?"
answers = "Halbe Stunde", "Eine Stunde", "Wenige Minuten", "Wenige Sekunden"
question = "Wie lange müssen die Elektro-Gelenkbusse der 200 an den Endhaltestellen laden?"
answers = "Eine halbe Stunde", "Eine Stunde", "Wenige Minuten", "Wenige Sekunden"
correct = 2
short_answer = "Die Ladezeiten betragen in der Regel wenige Minuten."
short_answer = "Die Ladezeit beträgt in der Regel wenige Minuten."
[[[loading]]]
label = "Ladevorgang"
question = "Wie werden die E-Gelenkbusse auf der Linie 200 geladen?"
question = "Wie werden die Elektro-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 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?"
question = "Wo befinden sich die Batterien der Elektro-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?"
question = "Wie viel mehr kostet ein Elektrobus als ein konventioneller Dieselbus?"
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."
short_answer = "Elektrobusse kosten aktuell noch etwa doppelt so viel wie konventionelle Dieselbusse der gleichen Größenklasse."

[environment]
[umwelt]
label = "Umwelt"
icon = "images/icons/i_earth_black_line.svg"
small_icon = "images/icons/i_earth_black_fill.svg"
[[questions]]
[[[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"
question = "Wieviel Energie ist für die jährliche Stromversorgung der Elektrobusse auf der Linie 200 notwendig? So viel wie ausreichen würde zur Versorgung von:"
answers = "584 Haushalten", "56 Haushalten", "285 Haushalten", "1010 Haushalten"
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."
short_answer = "Der jährliche Stromverbrauch der gesamten Buslinie 200 mit allen im Betrieb befindlichen Elektrobussen liegt bei etwa 2.044.000 kWh, was dem Energiebedarf von ca. 584 Dreipersonenhaushalten entspricht."
[[[weather]]]
label = "Wettereinfluss"
question = "Welche Wetterbedingungen haben einen Einfluss auf die Nutzung des Pantographen (Ladung von oben) zur Ladung der E-Gelenkbusse?"
question = "Welche Wetterbedingungen haben einen Einfluss auf die Nutzung des Pantographen (Ladung von oben) zur Ladung der Elektro-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"
question = "Was sind geeignete technologische Ansätze für den lokal emissionsfreien Betrieb der Berliner Busflotte?"
answers = "Busse leichter machen", "Verschiedene Elektrobustypen im Mix (Elektrobusse mit Depot- und Gelegenheitsladung)", "Mehr Busse", "Wasserstoff-Brennstoffzelle", "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."
short_answer = "Der Umstieg des Busverkehrs von Diesel- auf lokal emissionsfreie und CO2-neutrale Busse als Maßnahme im Verkehr zur Erreichung der Luftreinhalte- und Klimaziele stellt die Verkehrsbetriebe vor große Herausforderungen. So stehen verschiedene lokal emissionsfreie Busse zur Verfügung, für die zuerst Infrastruktur aufgebaut werden muss."
[[[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"
question = "Wie viele Windenergieanlagen sind bilanziell für den Betrieb der Elektro-Gelenkbusse auf der Linie 200 im Jahr notwendig?"
answers = "0,2", "1", "10", "100"
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."
short_answer = "Es werden etwa 0,2 Windräder mit einer Leistung von je 3 MW benötigt, um die Elektrobusse der Linie 200 rein aus Windstrom zu versorgen."

[politics]
[politik]
label = "Politk"
icon = "images/icons/i_government_black_line.svg"
small_icon = "images/icons/i_government_black_fill.svg"
[[questions]]
[[[ebus_time]]]
label = "Erster E-Bus"
question = "Seit wann fahren Elektrobusse in Berlin?"
question = "Seit wann fahren Elektrobusse für die BVG in Berlin?"
answers = "2014", "2015", "2016", "2019"
correct = 1
short_answer = "Die erste Linie mit E-Bussen war im Jahr 2015 die Linie 204."
short_answer = "Die erste Linie mit Elektrobussen 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?"
question = "Wie viele Elektrobusse 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?"
question = "Bis wann sollen ausschließlich Elektrobusse 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."
Expand All @@ -95,32 +95,32 @@
correct = 2
short_answer = "Bis 2050 will die Stadt klimaneutral werden und die Kohlendioxidemissionen um mindestens 85 % (bezogen auf 1990) reduzieren."

[personal]
[ich]
label = "Ich"
icon = "images/icons/i_human_black_line.svg"
small_icon = "images/icons/i_human_black_fill.svg"
[[questions]]
[[[advantages]]]
label = "Vorteile"
question = "Was sind Vorteile einer elektrifizierten Buslinie?"
answers = "Weniger CO<sub>2</sub>-Belastung", "Weniger Lärmbelastung", "Kürzere Fahrzeiten", "Günstigere Fahrkarten"
answers = "Weniger CO<sub>2</sub>-Belastung", "Weniger Lärmbelastung", "Kürzere Fahrzeiten", "Günstigere Fahrkarten", "Keine Belastung durch Stickoxide und Feinstaub"
correct = 0, 1
short_answer = "Vorteile sind unter anderem eine geringere CO<sub>2</sub>- und Lärmbelastung."
short_answer = "Elektrobusse tragen zu einer lebenswerteren Stadt bei, weil sie lokal emissionsfrei sind und somit keine Stickoxide oder Feinstaub durch den Kraftstoffeinsatz ausstoßen. Auch verursachen Elektrobusse weniger CO<sub>2</sub>-Emissionen im Vergleich zu Dieselbussen. "
[[[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."
question = "Für wie viel CO<sub>2</sub> ist jede*r Berliner*in statistisch pro Jahr verantwortlich?"
answers = "0,5 Tonnen", "4,8 Tonnen", "8 Tonnen", "2 Tonnen"
correct = 1
short_answer = "Jede*r Berliner*in ist statistisch gesehen für 4,8 Tonnen CO<sub>2</sub> pro Jahr verantwortlich."
[[[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."
question = "Woran erkennt man einen Elektrobus?"
answers = "Der Elektrobus produziert keine Abgase während des Fahrbetriebs.", "Der Elektrobus hat einen sichtbaren Aufbau auf dem Dach.", "Der Elektrobus ist leiser als ein konventioneller Bus.", "Der Elektrobus ermöglicht kürzere 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. "
question = "Auf welchen Linien (neben der Linie 200) ist ebenfalls eine Fahrt mit einem Elektrobus möglich?"
answers = "Linie 100", "Linien M29 und M41", "Linien 142, 147 und 300", "Linie N2"
correct = 2
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."
36 changes: 13 additions & 23 deletions e_metrobus/navigation/urls.py
Original file line number Diff line number Diff line change
@@ -1,47 +1,37 @@
from django.conf import settings
from django.http import Http404
from django.urls import path
from django.views.defaults import page_not_found, permission_denied, server_error

from e_metrobus.navigation import views

app_name = "navigation"
urlpatterns = [
path("", view=views.LandingPageView.as_view(), name="landing_page"),
path(
"welcome/",
"willkommen/",
view=views.LandingPageView.as_view(non_bus_user=True),
name="welcome",
),
path("route/", view=views.RouteView.as_view(), name="route"),
path("display_route/", view=views.DisplayRouteView.as_view(), name="display_route"),
path("comparison/", view=views.ComparisonView.as_view(), name="comparison"),
path("environment/", view=views.EnvironmentView.as_view(), name="environment"),
path("dashboard/", view=views.DashboardView.as_view(), name="dashboard"),
path("strecke/", view=views.RouteView.as_view(), name="route"),
path("meine-strecke/", view=views.DisplayRouteView.as_view(), name="display_route"),
path("mein-fussabdruck/", view=views.ComparisonView.as_view(), name="comparison"),
path("umweltbilanz/", view=views.EnvironmentView.as_view(), name="environment"),
path("quiz/", view=views.DashboardView.as_view(), name="dashboard"),
path("quiz/<str:category>/", view=views.QuestionView.as_view(), name="question"),
path("answer/", view=views.AnswerView.as_view(), name="answer"),
path("antwort/", view=views.AnswerView.as_view(), name="answer"),
path("tour/", view=views.TourView.as_view(), name="tour"),
path(
"finished/<str:category>/",
"abgeschlossen/<str:category>/",
view=views.CategoryFinishedView.as_view(),
name="category_finished",
),
path("finished/", view=views.QuizFinishedView.as_view(), name="finished_quiz",),
path("score/<str:hash>/", view=views.ShareScoreView.as_view(), name="score",),
path("abgeschlossen/", view=views.QuizFinishedView.as_view(), name="finished_quiz",),
path("punkte/<str:hash>/", view=views.ShareScoreView.as_view(), name="score",),
path(
"questions_as_text/",
view=views.QuestionsAsTextView.as_view(),
"zusammenfassung/",
view=views.SummaryView.as_view(),
name="questions_as_text",
),
path("legal/", view=views.LegalView.as_view(), name="legal"),
path("informationen/", view=views.LegalView.as_view(), name="legal"),
path("accept_privacy_policy/", views.accept_privacy_policy),
path("send_posthog_event/", views.send_posthog_event),
path("get_comparison_chart/", views.get_comparison_chart),
]

if settings.DEBUG:
urlpatterns += [
path("500/", server_error),
path("404/", page_not_found, {"exception": Http404()}),
path("403/", permission_denied, {"exception": Http404()}),
]
Loading

0 comments on commit b84e9ad

Please sign in to comment.