diff --git a/server/app.py b/server/app.py index 53ec4e7e4481c1035103d405d2f7ecdc870382c5..c0a1b40febae0f0cccc1e1e2df176b4dc134116e 100644 --- a/server/app.py +++ b/server/app.py @@ -9,7 +9,7 @@ from datetime import timedelta from dateutil.tz import tzlocal from .staticVariables import TEMPLATE_DIR, STATIC_DIR, DATA_DIR, DEFAULT_STOP, DEFAULT_HOST, DEFAULT_PORT, APP_VERSION, AVAILABLE_LANGUAGES, TRANSLATION_DIR, GOOGLE_MAPS_KEY, GOOGLE_MAPS_TEST_KEY, GOOGLE_MAPS_REGION -from .dataHandler import loadJson, hasTemplate, hasData, CustomJsonEncoder +from .dataHandler import loadJson, hasTemplate, hasData, isDirectory, CustomJsonEncoder from .gtfs import GtfsHandler from .locator import FoliLocator @@ -161,12 +161,18 @@ def sendRootFile(): @app.route('/<stopId>/') @app.route('/<stopId>/<path:path>') def view(path = 'index.html'): + # abort if attempting to access internal paths + if path.startswith('internal/'): + abort(403) + + path = path.rstrip('/') + if isDirectory(path): + path += '/index.html' + if '.html' not in path: path = path + '.html' - # abort if attempting to access internal or invalid paths - if path.startswith('internal/'): - abort(403) + # abort if attempting to access invalid paths if not hasTemplate(path): abort(404) @@ -209,15 +215,23 @@ def apiStopInfo(version): def apiBusInfo(version, busId = None, getShape = "false"): # busId is falsely optional here so that we can easily use url_for() for this endpoint in js if int(version) == 1 and busId != None: + lastModified, data = locator.getLastResponse() + if not data or data.get('status', None) != 'OK': + return {} - lastModified, dynamicData = locator.getLastResponse() + data = data['result'] + vehicles = data.get('vehicles', None) + if not vehicles: + return {} - data = dynamicData["result"]["vehicles"][busId] + data = vehicles[busId] - # add shape to the data + # add shapes to the data # route_short_name = lineref from data if (getShape == "true"): - data["shape"] = gtfs.getShape(data["lineref"]) + # FIXME: in theory this can contain shape information for multiple trips, since route_short_name doesn't have to be and isn't unique to one trip in GTFS + data["shapes"] = gtfs.getTripShapes(data["lineref"]) + if data: return jsonify(data) diff --git a/server/dataHandler.py b/server/dataHandler.py index f7245eb5de506bb7778aa7151db7ba34bf507f5f..d06edf8767cb7fda8dd0f130a8866264f31d529e 100644 --- a/server/dataHandler.py +++ b/server/dataHandler.py @@ -50,8 +50,14 @@ def loadJson(filename): return content # helpers for file lookups +def isDirectory(filename): + path = os.path.join(TEMPLATE_DIR, filename) + return not os.path.islink(path) and os.path.isdir(os.path.normpath(path)) + def hasTemplate(filename): - return os.path.isfile(os.path.normpath(os.path.join(TEMPLATE_DIR, filename))) + path = os.path.join(TEMPLATE_DIR, filename) + return not os.path.islink(path) and os.path.isfile(os.path.normpath(path)) def hasData(filename): - return os.path.isfile(os.path.normpath(os.path.join(DATA_DIR, filename))) + path = os.path.join(DATA_DIR, filename) + return not os.path.islink(path) and os.path.isfile(os.path.normpath(path)) diff --git a/server/gtfs.py b/server/gtfs.py index 8c6f2848aa8929590e912ea98618440a862103c6..3fd5813da4759548407236df198d63c75cf6e6f1 100644 --- a/server/gtfs.py +++ b/server/gtfs.py @@ -80,9 +80,6 @@ class GtfsHandler(object): loader = transitfeed.Loader(feedPath) self.schedule = loader.Load() - #print("trips") - #print(self.schedule.trips) - # filter unused stops for stopId, stop in self.schedule.stops.items(): if not stop.GetTrips(self.schedule): @@ -186,15 +183,18 @@ class GtfsHandler(object): stops.append(result) result = self._routeToDict(self.schedule.GetRoute(trip.route_id)) + result['shape_id'] = trip.shape_id result['stops'] = stops return result - def _tripToRoute(self, trip, shortOnly): + def _tripToRoute(self, trip, nameOnly): route = self.schedule.GetRoute(trip.route_id) - if shortOnly: + if nameOnly: return route.route_short_name if route.route_short_name else route.route_id - return self._routeToDict(trip) + result = self._routeToDict(route) + result['shape_id'] = trip.shape_id + return result def isValid(self): return self.schedule != None @@ -207,6 +207,7 @@ class GtfsHandler(object): return self._stopToDict(stop) + # predicate function used to filter out trips not currently in service def _inactivePredicate(self, trip, now): return not now or self.schedule.GetServicePeriod(trip.service_id).IsActiveOn(now.strftime("%Y%m%d"), date_object = now) @@ -345,27 +346,25 @@ class GtfsHandler(object): return stop.stop_timezone - def getShape(self, lineref): - print("looking for shape from lineref " + lineref) - - # find route id from routes.txt - # then find shape id from trips.txt - # with shape id find shape from shapes.txt - routeId = None - for key, route in self.schedule.routes.iteritems(): - if (route.route_short_name == lineref): - routeId = key - - print("found routeId ") - print(routeId) - shapeId = None - for key, trip in self.schedule.trips.iteritems(): - if (trip.route_id == routeId): - shapeId = trip.shape_id - break + # predicate function used to filter out trips not currently in service, will only retain trips of particular route or named trip + def _namedInactivePredicate(self, trip, lineref = None, now = None): + # FIXME: not tied to any specifc stop, so server time (ie. UTC most likely under docker) + if not now: + now = datetime.now(tzlocal()) + + if not lineref: + return self._inactivePredicate(trip, now) + + short_name = trip.trip_short_name + if not short_name: + route = self.schedule.GetRoute(trip.route_id) + short_name = route.route_short_name if route.route_short_name else route.route_id + + return short_name == lineref and self._inactivePredicate(trip, now) - shape = self.schedule._shapes[shapeId].points - return shape + def getTripShapes(self, lineref): + shapes = (self.schedule.GetShape(trip.shape_id) for trip in self.schedule.GetTripList() if self._namedInactivePredicate(trip, lineref)) + return {s.shape_id:s for s in shapes}.values() def setLocator(self, locatorService): self.locator = locatorService diff --git a/static/css/stylesheet.css b/static/css/stylesheet.css index 4711794acd245aff64b22ecd986e311864e3f08f..6d37b79971a3b14e7d3996286de2696a1f0d3035 100644 --- a/static/css/stylesheet.css +++ b/static/css/stylesheet.css @@ -1,3 +1,5 @@ +@charset "utf-8"; + body { padding: 0; margin: 0; font-size: 16px; } /* header and footer heights */ @@ -30,10 +32,10 @@ body { height: 100%; overflow-y: scroll; } @media only screen and (max-width: 768px) { .flex-grow { width: 100%; } - /* Column count for the F�li info page */ - .card-columns { - column-count: 1; - } + /* Column count for the Föli info page */ + .card-columns { + column-count: 1; + } } /* sticky footer and header: fixed position (for display units, doesn't scroll) */ @@ -249,40 +251,42 @@ body { right: 0; } -/* F�li info page cards */ +/* Föli info page cards */ .foli-card { - border: 1px solid #FF9900; + border: 1px solid #FF9900; +} + +.foli-card .card-header { + background-color: #FF9900; } - .foli-card .card-header { - background-color: #FF9900; - } th .text-muted { - font-size: 14px; - font-style: normal; - margin: 0; + font-size: 14px; + font-style: normal; + margin: 0; } /* Info page cards */ .info-card { - height: 600px; - background-color: #FF9900; - border: 1px solid #FF9900; - margin-bottom: 30px; + height: 600px; + background-color: #FF9900; + border: 1px solid #FF9900; + margin-bottom: 30px; } -/* F�li application page*/ +/* Föli application page*/ .app-card { - border: 1px solid #FF9900; - margin-top: 30px; + border: 1px solid #FF9900; + margin-top: 30px; +} + +.app-card .card-header { + background-color: #FF9900; } - .app-card .card-header { - background-color: #FF9900; - } .app-image { - margin-bottom: 25px; - width: 100%; + margin-bottom: 25px; + width: 100%; } /* larger screen layout */ @@ -310,8 +314,8 @@ th .text-muted { height: 55px; } - /* Column count for the F�li info page */ - .card-columns { - column-count: 2; - } + /* Column count for the Föli info page */ + .card-columns { + column-count: 2; + } } diff --git a/templates/demo.html b/templates/demo.html index eea2b68cbf923f5bf6da5ba310091db64a5f8a4b..62227e23c7bf9683b758539e75e72ce117714e5b 100644 --- a/templates/demo.html +++ b/templates/demo.html @@ -15,9 +15,9 @@ <h4>Fruits</h4> {% with fruits = load_json('fruits.json') %} <ul> - {% for fruit in fruits %} - <li>{{ fruit }}</li> - {% endfor %} - </ul> + {% for fruit in fruits %} + <li>{{ fruit }}</li> + {% endfor %} + </ul> {% endwith %} {% endblock content %} diff --git a/templates/foli.html b/templates/foli.html deleted file mode 100644 index ee26e4910b4813ac51a9aa9fd9760f1cc40e82d7..0000000000000000000000000000000000000000 --- a/templates/foli.html +++ /dev/null @@ -1,403 +0,0 @@ -{% extends 'internal/base.html' %} - -{% set title = 'Föli Info' %} -{% set sticky_banners = true %} -{% set localized = false %} -{% set content_lang = 'fi' %} - -{% block content %} - -<div class="container"> - <h1>Föli - Turun seudun joukkoliikenne</h1> - - <h2>Hinnat</h2> - <p>Bussissa voit ostaa kertalipun tai ladata matkakortin käteisellä. Samalla lipulla tai matkakortilla on vaihtoaikaa 2 tuntia.</p> - <div class="card-columns"> - <!-- Single ticket prices --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Kertaliput</h3> - </div> - <table class="table table-striped"> - <thead> - <tr> - <th>Ryhmä</th> - <th>Hinta</th> - </tr> - </thead> - <tbody> - <tr> - <td>Aikuiset</td> - <td>3,00 €</td> - </tr> - <tr> - <td>Lapset (alle 15 v)</td> - <td>1,50 €</td> - </tr> - <tr> - <td>Yölisä (klo 24-04)</td> - <td>1,00 €</td> - </tr> - <tr> - <td>Matkailulippu 24 t</td> - <td>7,50 €</td> - </tr> - <tr> - <td>Kännykkälippu 24 t</td> - <td>7,50 €</td> - </tr> - </tbody> - </table> - </div> - <!-- Foli card prices --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Arvokortit</h3> - </div> - <div class="card-body"> - <h4 class="card-title">Haltijakohtainen</h4> - </div> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="3">Aikuiset (≥ 20 v)</th> - </tr> - </thead> - <tbody> - <tr> - <td>norm.</td> - <td>päivä*</td> - <td>yö**</td> - </tr> - <tr> - <td>2,20 €</td> - <td>2,20 €</td> - <td>3,20 €</td> - </tr> - </tbody> - </table> - <div class="card-body"> - <h4 class="card-title">Henkilökohtaiset</h4> - </div> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="3">Lapset (alle 15 v)</th> - </tr> - </thead> - <tbody> - <tr> - <td>norm.</td> - <td>päivä*</td> - <td>yö**</td> - </tr> - <tr> - <td>1,10 €</td> - <td>1,10 €</td> - <td>2,10 €</td> - </tr> - </tbody> - </table> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="3">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> - </tr> - </thead> - <tbody> - <tr> - <td>norm.</td> - <td>päivä*</td> - <td>yö**</td> - </tr> - <tr> - <td>1,70 €</td> - <td>1,45 €</td> - <td>2,70 €</td> - </tr> - </tbody> - </table> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="3">Seniorit (≥ 65 v) ja vammaiset<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> - </tr> - </thead> - <tbody> - <tr> - <td>norm.</td> - <td>päivä*</td> - <td>yö**</td> - </tr> - <tr> - <td>1,70 €</td> - <td>1,45 €</td> - <td>2,70 €</td> - </tr> - </tbody> - </table> - <div class="card-footer"> - <p>*ma-pe klo 9:00-12:59, **klo 23:00-04:00</p> - </div> - </div> - <!-- Foli season pass prices --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Kausikortit</h3> - </div> - <div class="card-body"> - <h4 class="card-title">Haltijakohtaiset</h4> - </div> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="4">Aikuiset (≥ 20 v)</th> - </tr> - </thead> - <tbody> - <tr> - <td></td> - <td>norm.</td> - <td>netti</td> - <td>Lisäpäiviä 20 €:lla</td> - </tr> - <tr> - <td>30 pv</td> - <td>52 €</td> - <td>49 €</td> - <td>10</td> - </tr> - <tr> - <td>90 pv</td> - <td>140 €</td> - <td>130 €</td> - <td>10</td> - </tr> - <tr> - <td>180 pv</td> - <td>260 €</td> - <td></td> - <td></td> - </tr> - </tbody> - </table> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="3">Haltijakohtainen erikoiskortti</th> - </tr> - </thead> - <tbody> - <tr> - <td>Kestokortti</td> - <td>260 € / 6 kk</td> - <td>520 € / v</td> - </tr> - </tbody> - </table> - <div class="card-body"> - <h4 class="card-title">Henkilökohtaiset</h4> - </div> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="4">Lapset (alle 15 v)</th> - </tr> - </thead> - <tbody> - <tr> - <td></td> - <td>norm.</td> - <td>netti</td> - <td>Lisäpäiviä 10 €:lla</td> - </tr> - <tr> - <td>30 pv</td> - <td>26 €</td> - <td>23 €</td> - <td>10</td> - </tr> - </tbody> - </table> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="4">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> - </tr> - </thead> - <tbody> - <tr> - <td></td> - <td>norm.</td> - <td>netti</td> - <td>Lisäpäiviä 10 €:lla</td> - </tr> - <tr> - <td>30 pv</td> - <td>36 €</td> - <td>33 €</td> - <td>8</td> - </tr> - </tbody> - </table> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="4">Seniorit (≥ 65 v) ja vammaiset<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> - </tr> - </thead> - <tbody> - <tr> - <td></td> - <td>norm.</td> - <td>netti</td> - <td>Lisäpäiviä 10 €:lla</td> - </tr> - <tr> - <td>30 pv</td> - <td>36 €</td> - <td>33 €</td> - <td>8</td> - </tr> - </tbody> - </table> - </div> - <!-- Foli double card prices --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Tuplakortit</h3> - </div> - <div class="card-body"> - <h4 class="card-title">Haltijakohtainen</h4> - </div> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="2">Aikuiset (≥ 20 v)</th> - </tr> - </thead> - <tbody> - <tr> - <td>30 pv</td> - <td>52 €</td> - </tr> - </tbody> - </table> - <div class="card-body"> - <h4 class="card-title">Henkilökohtaiset</h4> - </div> - <table class="table table-striped"> - <thead> - <tr> - <th colspan="2">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> - </tr> - </thead> - <tbody> - <tr> - <td>30 pv</td> - <td>36 €</td> - </tr> - </tbody> - </table> - </div> - <!-- Tourist cards --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Matkailijakortit</h3> - </div> - <div class="card-body"> - <p>Myydään myös Turku Touringin matkailuneuvonnassa osoitteessa Aurakatu 4. Ei myydä busseissa.</p> - </div> - <table class="table table-striped"> - <tbody> - <tr> - <td>1 vrk</td> - <td>7 €</td> - <td>5 vrk</td> - <td>19 €</td> - </tr> - <tr> - <td>2 vrk</td> - <td>10 €</td> - <td>6 vrk</td> - <td>22 €</td> - </tr> - <tr> - <td>3 vrk</td> - <td>13 €</td> - <td>7 vrk</td> - <td>25 €</td> - </tr> - <tr> - <td>4 vrk</td> - <td>16 €</td> - <td>14 vrk</td> - <td>31 €</td> - </tr> - </tbody> - </table> - </div> - <!-- Mobile tickets --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Mobiililippu</h3> - </div> - <div class="card-body"> - <p> - Mobiilisovelluksessa myydään aikuisten ja lasten kertalippuja sekä erimittaisia matkailijatuotteita. - Maksutapoina ovat IQ-maksu, pankki- tai luottokortti sekä matkapuhelinmaksu. Hintaan lisätään - maksutapalisä. Ohjeet sovelluksen lataamiseen löydät etusivun linkistä "Mobiilisovellus". - </p> - </div> - </div> - <!-- Sale and service locations --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Myynti- ja palvelupisteet</h3> - </div> - <div class="card-body"> - <div class="row"> - <div class="col-4">Turku:</div> - <div class="col-8">Joukkoliikenteen palvelutoimisto<br />Yhteispalvelu Monitori</div> - </div> - <div class="row"> - <div class="col-4">Kaarina:</div> - <div class="col-8">Yhteispalvelupiste, Kaarinan keskusta<br />Yhteispalvelupiste, Piikkiön kirjasto</div> - </div> - <div class="row"> - <div class="col-4">Raisio:</div> - <div class="col-8">Kirjastotalon Yhteispalvelu</div> - </div> - <div class="row"> - <div class="col-4">Naantali:</div> - <div class="col-8">Yhteispalvelupiste</div> - </div> - <div class="row"> - <div class="col-4">Lieto:</div> - <div class="col-8">Yhteispalvelupiste</div> - </div> - <div class="row"> - <div class="col-4">Rusko:</div> - <div class="col-8">Ruskon pääkirjasto</div> - </div> - </div> - </div> - <!-- Foli card top-up locations --> - <div class="card foli-card"> - <div class="card-header"> - <h3 class="card-title">Latauspisteet</h3> - </div> - <div class="card-body"> - <div class="col">Turun kaupunginkirjasto</div> - <div class="col">Sokos Wiklund</div> - <div class="col">Stockmann</div> - <div class="col">Citymarket: Kupittaa, Länsikeskus, Ravattula</div> - <div class="col">Prisma: Itäharju, Länsikeskus, Mylly, Piispanristi, Tampereentie</div> - </div> - </div> - </div> - <p>Kortin lunastusmaksu 5,00 € (sis. alv 24 %)</p> - <p>Matkalippujen hinnat sis. alv 10 %</p> -</div> - -{% endblock content %} diff --git a/templates/foli/app.html b/templates/foli/app.html new file mode 100644 index 0000000000000000000000000000000000000000..1625aa12d15c72bcb83283146fc232aa85ea5cc2 --- /dev/null +++ b/templates/foli/app.html @@ -0,0 +1,168 @@ +{% extends 'internal/base.html' %} + +{% set title = 'Foli-sovellus' %} +{% set sticky_banners = true %} +{% set localized = false %} +{% set content_lang = 'fi' %} + +{% block content %} + +<div class="container"> + <h1>Föli - Turun seudun joukkoliikenne</h1> + <h2>Mobiilisovellus</h2> + + <div class="card app-card"> + <div class="card-header"> + <h3 class="card-title">Bussilippu kännykällä</h3> + </div> + <div class="row" style="margin-top: 25px;"> + <div class="col-sm-5"> + <img class="app-image" src="{{ util.static_url('img/mobiililippu_1.png') }}"> + </div> + <div class="col-sm-7"> + <img class="app-image" src="{{ util.static_url('img/mobiililippu_2.png') }}"> + <img class="app-image" src="{{ util.static_url('img/mobiililippu_3.png') }}"> + <img class="app-image" src="{{ util.static_url('img/mobiililippu_4.png') }}"> + </div> + </div> + <div class="card-footer"> + <p>Mobiililippusovelluksen voi ladata uusimpiin Windows, Apple ja Android -älypuhelimiin.</p> + </div> + </div> + + <div class="card app-card"> + <div class="card-header"> + <h3 class="card-title">Mobiililiput</h3> + </div> + <div class="card-body"> + <p> + Sovelluksella voi ostaa koko Fölin alueella voimassa olevia kertalippuja ja matkailijalippuja. + Sovelluksessa myydään myös yhdistelmälippuja, jolloin lippu sisältää sisäänpääsyn tapahtumaan + sekä bussilipun. Kertalipuissa on vaihtoaikaa 2 tuntia. Mobiililipun voimassaolo alkaa tilauksesta. + Mobiililippu luetaan bussissa samalla lukijalaitteella, joka lukee myös matkakortit. Matkapuhelin + asetetaan näyttöpuoli ylöspäin lukijalaitteen alapuolelle. + </p> + <p> + Matkustajan on pidettävä huoli siitä, että puhelimessa on virtaa koko matkan ajan. Sovelluksen + käyttö vaatii toimivan nettiyhteyden. + </p> + <h4>Maksutavat</h4> + <p> + Kerta- ja matkailijaliput voi maksaa jälkilaskuun perustuvalla Svea-maksulla, pankki- ja + luottokortilla (Visa ja Mastercard), puhelinoperaattorin puhelinlaskulla ja MobilePaylla. + Pankki- ja luottokortilla tai puhelinoperaattorin puhelinlaskulla maksettaessa normaalilla + hinnalla myytävän lipun hinnan lisäksi asiakkaalta veloitetaan maksutapalisä. Kertalipuissa + maksutapalisä on 0,20 euroa. Matkailijatuotteissa se on korttimaksuilla 0,20 euroa ja + puhelinoperaattorimaksuissa 0,50 euroa. Kertalipusta ja lyhytkestoisesta matkailijatuotteesta + ei kuitenkaan peritä lainkaan maksutapalisää, jos lipun maksaa jälkiveloitteisella Svea-maksulla. + Svea-maksulla maksettaessa asiakkaalta peritään siis ainoastaan normaali lipun hinta, esimerkiksi + aikuisten kertamaksu 3 euroa ja lasten kertamaksu 1,50 euroa + </p> + <p> + Kertalipun voi maksaa mobiilimaksulla. Mobiilimaksua käyttävän matkustajan ei tarvitse + rekisteröityä palveluun. + </p> + <h4>Lipputuotekohtaiset nousurajoitteet</h4> + <ul> + <li>2 h kertalipulla saa matkustaa enintään 6 matkaa (enintään 4 matkaa/tunti)</li> + <li>1 vrk lipulla saa matkustaa enintään 10 matkaa (enintään 5 matkaa/tunti)</li> + <li>2 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> + <li>3 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> + <li>5 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> + <li>7 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> + <li>14 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> + </ul> + </div> + </div> + + <div class="card app-card"> + <div class="card-header"> + <h3 class="card-title">Matkakortin lataaminen mobiilisovelluksella</h3> + </div> + <div class="card-body"> + <p>Föli-mobiilisovelluksella voi ladata myös arvo- ja kausikorttia.</p> + <p> + Arvokortille ladattava summa on voi olla 10, 20 tai 30 euroa. Kausikorteista voi palvelun + alkuvaiheessa ladata rajattujen asiakasryhmien 30, 90 ja 180 päivän kortteja. Asiakasryhmiä + lisätään vaiheittain palveluun. Kausikortille voi ladata myös lisäpäiviä, jotka ovat aikuisilla + 10 päivää sekä nuorilla ja opiskelijoilla 8 päivää. + </p> + <p> + Jotta puhelimen kautta tehty lataus yhdistyisi oikeaan matkakorttiin, on asiakkaan itse + tallennettava sovellukseen oman matkakorttinsa numero. Yksilöllinen numero on painettu + matkakortin kääntöpuolelle kortin yläosaan. Numerosarjassa on 18 numeroa, ja koko sarjan + kirjoittamisessa kannattaa olla huolellinen. Jos numeron kirjoittaa väärin ja ohjelma kuitenkin + tunnistaa numeron oikeanlaiseksi, sovellus lataa jonkun toisen omistamaa korttia. + </p> + <p> + Matkakorttien lataukset voi maksaa laskulla tai pankkikortilla. Myös pankkikortin + luotto-ominaisuutta voi käyttää. + </p> + </div> + </div> + + <div class="card app-card"> + <div class="card-header"> + <h3 class="card-title">Mobiilikausilippu kokeilukäytössä</h3> + </div> + <div class="card-body"> + <p> + Fölin mobiilisovelluksessa on nyt kokeilussa 30 päivän mobiilikausilippu. Vain mobiilisti + toimivan kausilipun voi ostaa sovelluksen kohdasta Mobiilikausilippu ja tarjolla on sekä + aikuisten että lasten 30 päivän kausilippu. Lipulla voi matkustaa kausikortin tavoin Fölin + liikenteessä, kuitenkin enintään 15 matkaa päivässä ja 5 matkaa tunnissa. Kausilippua käytettäessä + on sovelluksen oltava jatkuvasti verkkoyhteydessä toimiakseen sekä asiakkaan on varmistettava, + että puhelimessa on riittävästi virtaa koko matkan ajan. Ilman verkkoyhteyttä lipulla ei pääse + matkustamaan. Kausilipun viivakoodi leimataan jokaisen nousun yhteydessä lukijalaitteen alalaidassa + olevalle lukijalle. Ilman validoitua leimausta lipulla ei voi matkustaa. Lipun voimassaolo alkaa + heti ostosta, eikä ensimmäisestä käytöstä kuten matkakortilla matkustettaessa. + </p> + <p> + Mikäli kokeilun aikana ilmenee ongelmia, esimerkiksi sovellus ei toimi, pyydetään asiakkaita + olemaan yhteydessä äkillisissä ongelmatilanteissa suoraan mobiilisovelluksen toimittajaan + osoitteeseen tuki(a)iq-payments.com ja muissa palauteasioissa Fölin palautepalveluun. Palautetta + voi antaa myös sähköpostitse lähetettävän kyselyn kautta. Mobiilikausilipun ostaneille lähetetään + sähköpostitse palautekyselylinkki, jossa kysytään käyttäjien kokemuksia liittyen lipun toimintaan, + lukunopeuteen sekä verkkoyhteyksien toimintaan. Mahdollisimman monen käyttäjän toivotaan vastaavan + kyselyyn, jotta kausilippua voidaan kehittää edelleen. + </p> + <h4>Miten toimin, jos lataan vahingossa väärän tuotteen mobiilisovelluksessa?</h4> + <p> + Mobiilisovelluksessa on mahdollista ladata omaa matkakorttia ja ostaa mobiilikausilippu + eli puhelimessa toimiva kausilippu. Jos asiakas lataa vahingossa mobiilikausilipun matkakortin + lataamisen sijasta, latauksen palautus matkakortille onnistuu helpoiten ja nopeiten ilmoittamalla + tästä suoraan sovelluksen palaute-napin kautta ylläpitäjälle/maksunvälittäjälle. Palautekenttään + voi kirjoittaa esimerkiksi: "Latasin vahingossa väärän tuotteen, voitteko siirtää kauden + matkakortilleni.". Vaihtoehtoisesti viestin voi lähettää sähköpostitse tuki(a)iq.payments.com. + </p> + </div> + </div> + <div class="card app-card"> + <div class="card-header"> + <h3 class="card-title">Sarjaliput - 10 kertalippua 9 lipun hinnalla</h3> + </div> + <div class="card-body"> + <p> + Mobiilisovelluksesta voi ostaa myös 10 kerran sarjalipun. Sarjalippu sisältää kymmenen Fölin + kertalippua, jotka ovat voimassa koko Fölin alueella ja sisältävät normaalin kahden tunnin + vaihto-oikeuden. Yhdeksän kertalipun hinnalla saa kymmenen kertalippua eli yhden kertalipun + saa paketin mukana ilmaiseksi. + </p> + <h4>Hinnat:</h4> + <ul> + <li>Aikuisen 10 kertalipun lippupaketti 27 euroa</li> + <li>Lapsen 10 kertalipun lippupaketti 13,50 euroa</li> + </ul> + <p> + Lippupaketti on voimassa kolme kuukautta. Mobiilikertalippu ei ole voimassa yötaksan aikana, + ellei lippua ole aktivoitu ennen klo 23. Mobiilikertalippuja voi käyttää kerralla useamman. + </p> + </div> + </div> + <h4 style="margin-top: 30px;"> + Sovelluksen on tehnyt iQ Payments Oy. Turun seudun joukkoliikenne Fölin mobiilimaksamisen mahdollistava + sovellus palkittiin parhaana mobiilimaksamisen sovelluksena Slush-tapahtumassa syksyllä 2015. + </h4> +</div> + +{% endblock content %} diff --git a/templates/foli/index.html b/templates/foli/index.html new file mode 100644 index 0000000000000000000000000000000000000000..03aadfc055a1d70bb54835631aea7cfcc6d5f9cc --- /dev/null +++ b/templates/foli/index.html @@ -0,0 +1,403 @@ +{% extends 'internal/base.html' %} + +{% set title = 'Föli Info' %} +{% set sticky_banners = true %} +{% set localized = false %} +{% set content_lang = 'fi' %} + +{% block content %} + +<div class="container"> + <h1>Föli - Turun seudun joukkoliikenne</h1> + + <h2>Hinnat</h2> + <p>Bussissa voit ostaa kertalipun tai ladata matkakortin käteisellä. Samalla lipulla tai matkakortilla on vaihtoaikaa 2 tuntia.</p> + <div class="card-columns"> + <!-- Single ticket prices --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Kertaliput</h3> + </div> + <table class="table table-striped"> + <thead> + <tr> + <th>Ryhmä</th> + <th>Hinta</th> + </tr> + </thead> + <tbody> + <tr> + <td>Aikuiset</td> + <td>3,00 €</td> + </tr> + <tr> + <td>Lapset (alle 15 v)</td> + <td>1,50 €</td> + </tr> + <tr> + <td>Yölisä (klo 24-04)</td> + <td>1,00 €</td> + </tr> + <tr> + <td>Matkailulippu 24 t</td> + <td>7,50 €</td> + </tr> + <tr> + <td>Kännykkälippu 24 t</td> + <td>7,50 €</td> + </tr> + </tbody> + </table> + </div> + <!-- Foli card prices --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Arvokortit</h3> + </div> + <div class="card-body"> + <h4 class="card-title">Haltijakohtainen</h4> + </div> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="3">Aikuiset (≥ 20 v)</th> + </tr> + </thead> + <tbody> + <tr> + <td>norm.</td> + <td>päivä*</td> + <td>yö**</td> + </tr> + <tr> + <td>2,20 €</td> + <td>2,20 €</td> + <td>3,20 €</td> + </tr> + </tbody> + </table> + <div class="card-body"> + <h4 class="card-title">Henkilökohtaiset</h4> + </div> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="3">Lapset (alle 15 v)</th> + </tr> + </thead> + <tbody> + <tr> + <td>norm.</td> + <td>päivä*</td> + <td>yö**</td> + </tr> + <tr> + <td>1,10 €</td> + <td>1,10 €</td> + <td>2,10 €</td> + </tr> + </tbody> + </table> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="3">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> + </tr> + </thead> + <tbody> + <tr> + <td>norm.</td> + <td>päivä*</td> + <td>yö**</td> + </tr> + <tr> + <td>1,70 €</td> + <td>1,45 €</td> + <td>2,70 €</td> + </tr> + </tbody> + </table> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="3">Seniorit (≥ 65 v) ja vammaiset<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> + </tr> + </thead> + <tbody> + <tr> + <td>norm.</td> + <td>päivä*</td> + <td>yö**</td> + </tr> + <tr> + <td>1,70 €</td> + <td>1,45 €</td> + <td>2,70 €</td> + </tr> + </tbody> + </table> + <div class="card-footer"> + <p>*ma-pe klo 9:00-12:59, **klo 23:00-04:00</p> + </div> + </div> + <!-- Foli season pass prices --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Kausikortit</h3> + </div> + <div class="card-body"> + <h4 class="card-title">Haltijakohtaiset</h4> + </div> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="4">Aikuiset (≥ 20 v)</th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + <td>norm.</td> + <td>netti</td> + <td>Lisäpäiviä 20 €:lla</td> + </tr> + <tr> + <td>30 pv</td> + <td>52 €</td> + <td>49 €</td> + <td>10</td> + </tr> + <tr> + <td>90 pv</td> + <td>140 €</td> + <td>130 €</td> + <td>10</td> + </tr> + <tr> + <td>180 pv</td> + <td>260 €</td> + <td></td> + <td></td> + </tr> + </tbody> + </table> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="3">Haltijakohtainen erikoiskortti</th> + </tr> + </thead> + <tbody> + <tr> + <td>Kestokortti</td> + <td>260 € / 6 kk</td> + <td>520 € / v</td> + </tr> + </tbody> + </table> + <div class="card-body"> + <h4 class="card-title">Henkilökohtaiset</h4> + </div> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="4">Lapset (alle 15 v)</th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + <td>norm.</td> + <td>netti</td> + <td>Lisäpäiviä 10 €:lla</td> + </tr> + <tr> + <td>30 pv</td> + <td>26 €</td> + <td>23 €</td> + <td>10</td> + </tr> + </tbody> + </table> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="4">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + <td>norm.</td> + <td>netti</td> + <td>Lisäpäiviä 10 €:lla</td> + </tr> + <tr> + <td>30 pv</td> + <td>36 €</td> + <td>33 €</td> + <td>8</td> + </tr> + </tbody> + </table> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="4">Seniorit (≥ 65 v) ja vammaiset<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> + </tr> + </thead> + <tbody> + <tr> + <td></td> + <td>norm.</td> + <td>netti</td> + <td>Lisäpäiviä 10 €:lla</td> + </tr> + <tr> + <td>30 pv</td> + <td>36 €</td> + <td>33 €</td> + <td>8</td> + </tr> + </tbody> + </table> + </div> + <!-- Foli double card prices --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Tuplakortit</h3> + </div> + <div class="card-body"> + <h4 class="card-title">Haltijakohtainen</h4> + </div> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="2">Aikuiset (≥ 20 v)</th> + </tr> + </thead> + <tbody> + <tr> + <td>30 pv</td> + <td>52 €</td> + </tr> + </tbody> + </table> + <div class="card-body"> + <h4 class="card-title">Henkilökohtaiset</h4> + </div> + <table class="table table-striped"> + <thead> + <tr> + <th colspan="2">Nuoret (15-19 v) ja opiskelijat<br /><p class="text-muted">- Henkikirjoilla tai asunto-osoite Turussa, Kaarinassa, Raisiossa, Naantalissa, Liedossa tai Ruskolla.</p></th> + </tr> + </thead> + <tbody> + <tr> + <td>30 pv</td> + <td>36 €</td> + </tr> + </tbody> + </table> + </div> + <!-- Tourist cards --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Matkailijakortit</h3> + </div> + <div class="card-body"> + <p>Myydään myös Turku Touringin matkailuneuvonnassa osoitteessa Aurakatu 4. Ei myydä busseissa.</p> + </div> + <table class="table table-striped"> + <tbody> + <tr> + <td>1 vrk</td> + <td>7 €</td> + <td>5 vrk</td> + <td>19 €</td> + </tr> + <tr> + <td>2 vrk</td> + <td>10 €</td> + <td>6 vrk</td> + <td>22 €</td> + </tr> + <tr> + <td>3 vrk</td> + <td>13 €</td> + <td>7 vrk</td> + <td>25 €</td> + </tr> + <tr> + <td>4 vrk</td> + <td>16 €</td> + <td>14 vrk</td> + <td>31 €</td> + </tr> + </tbody> + </table> + </div> + <!-- Mobile tickets --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Mobiililippu</h3> + </div> + <div class="card-body"> + <p> + Mobiilisovelluksessa myydään aikuisten ja lasten kertalippuja sekä erimittaisia matkailijatuotteita. + Maksutapoina ovat IQ-maksu, pankki- tai luottokortti sekä matkapuhelinmaksu. Hintaan lisätään + maksutapalisä. Ohjeet sovelluksen lataamiseen löydät etusivun linkistä "Mobiilisovellus". + </p> + </div> + </div> + <!-- Sale and service locations --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Myynti- ja palvelupisteet</h3> + </div> + <div class="card-body"> + <div class="row"> + <div class="col-4">Turku:</div> + <div class="col-8">Joukkoliikenteen palvelutoimisto<br />Yhteispalvelu Monitori</div> + </div> + <div class="row"> + <div class="col-4">Kaarina:</div> + <div class="col-8">Yhteispalvelupiste, Kaarinan keskusta<br />Yhteispalvelupiste, Piikkiön kirjasto</div> + </div> + <div class="row"> + <div class="col-4">Raisio:</div> + <div class="col-8">Kirjastotalon Yhteispalvelu</div> + </div> + <div class="row"> + <div class="col-4">Naantali:</div> + <div class="col-8">Yhteispalvelupiste</div> + </div> + <div class="row"> + <div class="col-4">Lieto:</div> + <div class="col-8">Yhteispalvelupiste</div> + </div> + <div class="row"> + <div class="col-4">Rusko:</div> + <div class="col-8">Ruskon pääkirjasto</div> + </div> + </div> + </div> + <!-- Foli card top-up locations --> + <div class="card foli-card"> + <div class="card-header"> + <h3 class="card-title">Latauspisteet</h3> + </div> + <div class="card-body"> + <div class="col">Turun kaupunginkirjasto</div> + <div class="col">Sokos Wiklund</div> + <div class="col">Stockmann</div> + <div class="col">Citymarket: Kupittaa, Länsikeskus, Ravattula</div> + <div class="col">Prisma: Itäharju, Länsikeskus, Mylly, Piispanristi, Tampereentie</div> + </div> + </div> + </div> + <p>Kortin lunastusmaksu 5,00 € (sis. alv 24 %)</p> + <p>Matkalippujen hinnat sis. alv 10 %</p> +</div> + +{% endblock content %} diff --git a/templates/foliApp.html b/templates/foliApp.html deleted file mode 100644 index 5f014d20f593304a257d69b597a31727e35366a0..0000000000000000000000000000000000000000 --- a/templates/foliApp.html +++ /dev/null @@ -1,168 +0,0 @@ -{% extends 'internal/base.html' %} - -{% set title = 'Foli-sovellus' %} -{% set sticky_banners = true %} -{% set localized = false %} -{% set content_lang = 'fi' %} - -{% block content %} - -<div class="container"> - <h1>Föli - Turun seudun joukkoliikenne</h1> - <h2>Mobiilisovellus</h2> - - <div class="card app-card"> - <div class="card-header"> - <h3 class="card-title">Bussilippu kännykällä</h3> - </div> - <div class="row" style="margin-top: 25px;"> - <div class="col-sm-5"> - <img class="app-image" src="{{ util.static_url('img/mobiililippu_1.png') }}"> - </div> - <div class="col-sm-7"> - <img class="app-image" src="{{ util.static_url('img/mobiililippu_2.png') }}"> - <img class="app-image" src="{{ util.static_url('img/mobiililippu_3.png') }}"> - <img class="app-image" src="{{ util.static_url('img/mobiililippu_4.png') }}"> - </div> - </div> - <div class="card-footer"> - <p>Mobiililippusovelluksen voi ladata uusimpiin Windows, Apple ja Android -älypuhelimiin.</p> - </div> - </div> - - <div class="card app-card"> - <div class="card-header"> - <h3 class="card-title">Mobiililiput</h3> - </div> - <div class="card-body"> - <p> - Sovelluksella voi ostaa koko Fölin alueella voimassa olevia kertalippuja ja matkailijalippuja. - Sovelluksessa myydään myös yhdistelmälippuja, jolloin lippu sisältää sisäänpääsyn tapahtumaan - sekä bussilipun. Kertalipuissa on vaihtoaikaa 2 tuntia. Mobiililipun voimassaolo alkaa tilauksesta. - Mobiililippu luetaan bussissa samalla lukijalaitteella, joka lukee myös matkakortit. Matkapuhelin - asetetaan näyttöpuoli ylöspäin lukijalaitteen alapuolelle. - </p> - <p> - Matkustajan on pidettävä huoli siitä, että puhelimessa on virtaa koko matkan ajan. Sovelluksen - käyttö vaatii toimivan nettiyhteyden. - </p> - <h4>Maksutavat</h4> - <p> - Kerta- ja matkailijaliput voi maksaa jälkilaskuun perustuvalla Svea-maksulla, pankki- ja - luottokortilla (Visa ja Mastercard), puhelinoperaattorin puhelinlaskulla ja MobilePaylla. - Pankki- ja luottokortilla tai puhelinoperaattorin puhelinlaskulla maksettaessa normaalilla - hinnalla myytävän lipun hinnan lisäksi asiakkaalta veloitetaan maksutapalisä. Kertalipuissa - maksutapalisä on 0,20 euroa. Matkailijatuotteissa se on korttimaksuilla 0,20 euroa ja - puhelinoperaattorimaksuissa 0,50 euroa. Kertalipusta ja lyhytkestoisesta matkailijatuotteesta - ei kuitenkaan peritä lainkaan maksutapalisää, jos lipun maksaa jälkiveloitteisella Svea-maksulla. - Svea-maksulla maksettaessa asiakkaalta peritään siis ainoastaan normaali lipun hinta, esimerkiksi - aikuisten kertamaksu 3 euroa ja lasten kertamaksu 1,50 euroa - </p> - <p> - Kertalipun voi maksaa mobiilimaksulla. Mobiilimaksua käyttävän matkustajan ei tarvitse - rekisteröityä palveluun. - </p> - <h4>Lipputuotekohtaiset nousurajoitteet</h4> - <ul> - <li>2 h kertalipulla saa matkustaa enintään 6 matkaa (enintään 4 matkaa/tunti)</li> - <li>1 vrk lipulla saa matkustaa enintään 10 matkaa (enintään 5 matkaa/tunti)</li> - <li>2 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> - <li>3 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> - <li>5 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> - <li>7 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> - <li>14 vrk lipulla saa matkustaa enintään 10 matkaa/päivä (enintään 5 matkaa/tunti)</li> - </ul> - </div> - </div> - - <div class="card app-card"> - <div class="card-header"> - <h3 class="card-title">Matkakortin lataaminen mobiilisovelluksella</h3> - </div> - <div class="card-body"> - <p>Föli-mobiilisovelluksella voi ladata myös arvo- ja kausikorttia.</p> - <p> - Arvokortille ladattava summa on voi olla 10, 20 tai 30 euroa. Kausikorteista voi palvelun - alkuvaiheessa ladata rajattujen asiakasryhmien 30, 90 ja 180 päivän kortteja. Asiakasryhmiä - lisätään vaiheittain palveluun. Kausikortille voi ladata myös lisäpäiviä, jotka ovat aikuisilla - 10 päivää sekä nuorilla ja opiskelijoilla 8 päivää. - </p> - <p> - Jotta puhelimen kautta tehty lataus yhdistyisi oikeaan matkakorttiin, on asiakkaan itse - tallennettava sovellukseen oman matkakorttinsa numero. Yksilöllinen numero on painettu - matkakortin kääntöpuolelle kortin yläosaan. Numerosarjassa on 18 numeroa, ja koko sarjan - kirjoittamisessa kannattaa olla huolellinen. Jos numeron kirjoittaa väärin ja ohjelma kuitenkin - tunnistaa numeron oikeanlaiseksi, sovellus lataa jonkun toisen omistamaa korttia. - </p> - <p> - Matkakorttien lataukset voi maksaa laskulla tai pankkikortilla. Myös pankkikortin - luotto-ominaisuutta voi käyttää. - </p> - </div> - </div> - - <div class="card app-card"> - <div class="card-header"> - <h3 class="card-title">Mobiilikausilippu kokeilukäytössä</h3> - </div> - <div class="card-body"> - <p> - Fölin mobiilisovelluksessa on nyt kokeilussa 30 päivän mobiilikausilippu. Vain mobiilisti - toimivan kausilipun voi ostaa sovelluksen kohdasta Mobiilikausilippu ja tarjolla on sekä - aikuisten että lasten 30 päivän kausilippu. Lipulla voi matkustaa kausikortin tavoin Fölin - liikenteessä, kuitenkin enintään 15 matkaa päivässä ja 5 matkaa tunnissa. Kausilippua käytettäessä - on sovelluksen oltava jatkuvasti verkkoyhteydessä toimiakseen sekä asiakkaan on varmistettava, - että puhelimessa on riittävästi virtaa koko matkan ajan. Ilman verkkoyhteyttä lipulla ei pääse - matkustamaan. Kausilipun viivakoodi leimataan jokaisen nousun yhteydessä lukijalaitteen alalaidassa - olevalle lukijalle. Ilman validoitua leimausta lipulla ei voi matkustaa. Lipun voimassaolo alkaa - heti ostosta, eikä ensimmäisestä käytöstä kuten matkakortilla matkustettaessa. - </p> - <p> - Mikäli kokeilun aikana ilmenee ongelmia, esimerkiksi sovellus ei toimi, pyydetään asiakkaita - olemaan yhteydessä äkillisissä ongelmatilanteissa suoraan mobiilisovelluksen toimittajaan - osoitteeseen tuki(a)iq-payments.com ja muissa palauteasioissa Fölin palautepalveluun. Palautetta - voi antaa myös sähköpostitse lähetettävän kyselyn kautta. Mobiilikausilipun ostaneille lähetetään - sähköpostitse palautekyselylinkki, jossa kysytään käyttäjien kokemuksia liittyen lipun toimintaan, - lukunopeuteen sekä verkkoyhteyksien toimintaan. Mahdollisimman monen käyttäjän toivotaan vastaavan - kyselyyn, jotta kausilippua voidaan kehittää edelleen. - </p> - <h4>Miten toimin, jos lataan vahingossa väärän tuotteen mobiilisovelluksessa?</h4> - <p> - Mobiilisovelluksessa on mahdollista ladata omaa matkakorttia ja ostaa mobiilikausilippu - eli puhelimessa toimiva kausilippu. Jos asiakas lataa vahingossa mobiilikausilipun matkakortin - lataamisen sijasta, latauksen palautus matkakortille onnistuu helpoiten ja nopeiten ilmoittamalla - tästä suoraan sovelluksen palaute-napin kautta ylläpitäjälle/maksunvälittäjälle. Palautekenttään - voi kirjoittaa esimerkiksi: "Latasin vahingossa väärän tuotteen, voitteko siirtää kauden - matkakortilleni.". Vaihtoehtoisesti viestin voi lähettää sähköpostitse tuki(a)iq.payments.com. - </p> - </div> - </div> - <div class="card app-card"> - <div class="card-header"> - <h3 class="card-title">Sarjaliput - 10 kertalippua 9 lipun hinnalla</h3> - </div> - <div class="card-body"> - <p> - Mobiilisovelluksesta voi ostaa myös 10 kerran sarjalipun. Sarjalippu sisältää kymmenen Fölin - kertalippua, jotka ovat voimassa koko Fölin alueella ja sisältävät normaalin kahden tunnin - vaihto-oikeuden. Yhdeksän kertalipun hinnalla saa kymmenen kertalippua eli yhden kertalipun - saa paketin mukana ilmaiseksi. - </p> - <h4>Hinnat:</h4> - <ul> - <li>Aikuisen 10 kertalipun lippupaketti 27 euroa</li> - <li>Lapsen 10 kertalipun lippupaketti 13,50 euroa</li> - </ul> - <p> - Lippupaketti on voimassa kolme kuukautta. Mobiilikertalippu ei ole voimassa yötaksan aikana, - ellei lippua ole aktivoitu ennen klo 23. Mobiilikertalippuja voi käyttää kerralla useamman. - </p> - </div> - </div> - <h4 style="margin-top: 30px;"> - Sovelluksen on tehnyt iQ Payments Oy. Turun seudun joukkoliikenne Fölin mobiilimaksamisen mahdollistava - sovellus palkittiin parhaana mobiilimaksamisen sovelluksena Slush-tapahtumassa syksyllä 2015. - </h4> -</div> - -{% endblock content %} diff --git a/templates/index.html b/templates/index.html index e80a8e295da6b1b301fdd1ec45350567cbe79177..9c13ef61395ff07f7d8170cdc9a258eda935d4ef 100644 --- a/templates/index.html +++ b/templates/index.html @@ -57,17 +57,17 @@ </div> </div> </div> - <div class="row mb-4"> - <div class="col-md-5 offset-md-1 mb-4 mb-md-0"> - <div class="card menu-card bg-foli text-center box-shadow"> - <img class="card-img-top" src="{{ util.static_url('img/application_placeholder.png') }}" alt="{{ _("Card Image") }}"> - <div class="card-body"> - <a role="button" href="{{ util.view_url('foliApp') }}" class="btn btn-lg btn-primary">{{ _("Föli application") }}</a> - </div> - </div> - </div> - <div class="col-md-5"> - <!--Empty spot for next menu card--> - </div> - </div> + <div class="row mb-4"> + <div class="col-md-5 offset-md-1 mb-4 mb-md-0"> + <div class="card menu-card bg-foli text-center box-shadow"> + <img class="card-img-top" src="{{ util.static_url('img/application_placeholder.png') }}" alt="{{ _("Card Image") }}"> + <div class="card-body"> + <a role="button" href="{{ util.view_url('foli/app') }}" class="btn btn-lg btn-primary">{{ _("Föli application") }}</a> + </div> + </div> + </div> + <div class="col-md-5"> + <!--Empty spot for next menu card--> + </div> + </div> {% endblock content %} diff --git a/templates/info.html b/templates/info.html index 07feb024a4782c73615e1215cf3d0915f5e1a09d..bbf3062373e5aef3f8336bc279fcc95ce139b6fa 100644 --- a/templates/info.html +++ b/templates/info.html @@ -1,4 +1,4 @@ -{% extends 'internal/base.html' %} +{% extends 'internal/base.html' %} {% set title = 'Info' %} {% set sticky_banners = true %} @@ -8,38 +8,38 @@ {% block content %} <div class="container"> - <div class="row"> - <div class="col-md-6"> - <div class="card info-card"> - <a class="twitter-timeline" data-height="600" data-dnt="true" data-theme="light" href="https://twitter.com/Turkukaupunki?ref_src=twsrc%5Etfw">Tweets by Turkukaupunki</a> - <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> - </div> - </div> - <div class="col-md-6"> - <div class="card info-card"> - <div class="card-header"> - <h3 class="card-title">Visit Turku -uutiset</h3> - </div> - <script type="text/javascript" src="http://output92.rssinclude.com/output?type=js&id=1172169&hash=c1c032487ad85904644bb22308686454"></script> - </div> - </div> - </div> + <div class="row"> + <div class="col-md-6"> + <div class="card info-card"> + <a class="twitter-timeline" data-height="600" data-dnt="true" data-theme="light" href="https://twitter.com/Turkukaupunki?ref_src=twsrc%5Etfw">Tweets by Turkukaupunki</a> + <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> + </div> + </div> + <div class="col-md-6"> + <div class="card info-card"> + <div class="card-header"> + <h3 class="card-title">Visit Turku -uutiset</h3> + </div> + <script type="text/javascript" src="http://output92.rssinclude.com/output?type=js&id=1172169&hash=c1c032487ad85904644bb22308686454"></script> + </div> + </div> + </div> - <div class="row"> - <div class="col-md-6"> - <div class="card info-card" style="overflow: auto;"> - <div class="card-header"> - <h3 class="card-title">AccuWeather-sää</h3> - </div> - <a href="https://www.accuweather.com/en/fi/turku/134768/weather-forecast/134768" class="aw-widget-legal"> - </a><div id="awtd1519238716374" class="aw-widget-36hour" data-locationkey="134768" data-unit="c" data-language="fi" data-useip="false" data-uid="awtd1519238716374" data-editlocation="false"></div> - <script type="text/javascript" src="https://oap.accuweather.com/launch.js"></script> - </div> - </div> - <div class="col-md-6"> - <!-- Empty spot for another card. --> - </div> - </div> + <div class="row"> + <div class="col-md-6"> + <div class="card info-card" style="overflow: auto;"> + <div class="card-header"> + <h3 class="card-title">AccuWeather - sää</h3> + </div> + <a href="https://www.accuweather.com/en/fi/turku/134768/weather-forecast/134768" class="aw-widget-legal"> + </a><div id="awtd1519238716374" class="aw-widget-36hour" data-locationkey="134768" data-unit="c" data-language="fi" data-useip="false" data-uid="awtd1519238716374" data-editlocation="false"></div> + <script type="text/javascript" src="https://oap.accuweather.com/launch.js"></script> + </div> + </div> + <div class="col-md-6"> + <!-- Empty spot for another card. --> + </div> + </div> </div> {% endblock content %} diff --git a/templates/internal/base.html b/templates/internal/base.html index 40f84c1728eb71777fb22aaa11258efdfc4db8a0..f8e4134acf45b2972100cc7cd9dd06e78155e939 100644 --- a/templates/internal/base.html +++ b/templates/internal/base.html @@ -142,7 +142,7 @@ // TODO: this needs some serious refinement once we know how we implement changing of the views so that the whole page doesn't need to reload // FIXME: does not chain to previous click handler if it is already set! $.fn.clickableBox = function() { - this.click(function() { + this.click(function() { window.location = $(this).find("a").attr("href"); return false; }).css('cursor', 'pointer'); diff --git a/templates/map.html b/templates/map.html index 1fec184b7346fb65f1e3091bcfa280f6461ecaf8..04d40b50c4e2727f0361dba78a8b02003a6cf9d5 100644 --- a/templates/map.html +++ b/templates/map.html @@ -111,8 +111,8 @@ strokeWeight: 1.5, strokeColor: '#ffffff', fillColor: '#00abed', - fillOpacity: 1, - scale: 1.5, + fillOpacity: 1, + scale: 1.5, }, title: stopName, label: { text: stopId, color: '#ffffff', fontSize: '0.75rem' }, @@ -129,7 +129,7 @@ scale: 15, strokeWeight: 2, fillColor: '#f7aa00', - fillOpacity: 0.8 + fillOpacity: 0.8 }, title: id, label: busName, @@ -274,22 +274,23 @@ // get information about the focused bus var requestFocus = focusedMarker; $.getJSON( - "{{ url_for('apiBusInfo', version = 1, _external = True) }}" + focusedMarker + '/true', + "{{ url_for('apiBusInfo', version = 1, _external = True) }}" + focusedMarker + '/true', function (data) { // poor man's locking (the A in Ajax is for Asynchronous :)) if (requestFocus !== focusedMarker) return; focusedBus = data; - console.log("found this bus info: ", focusedBus); // draw the shape var shapeCoordinates = []; - focusedBus.shape.map( value => { - //console.log("value 2", value[2], " value 3", value[3]); - shapeCoordinates.push(positionToGoogleLatLng(value[0], value[1])); + $.each(focusedBus.shapes, function (key, value) { + value.map( value => { + shapeCoordinates.push(positionToGoogleLatLng(value[0], value[1])); + }); }); + focusedShape = new google.maps.Polyline({ map: gmap, path: shapeCoordinates, @@ -342,7 +343,6 @@ // creates or updates the info window for focused bus var updateInfoWindow = function() { - //console.log("dynamicdata: ", dynamicData); // TODO is there a better way of doing this, this way is pretty ugly var infoWindowContent = ` <h1>` + focusedBus.lineref + `</h1>