diff options
author | Daniel Friesel <derf@finalrewind.org> | 2020-04-19 18:26:20 +0200 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2020-04-19 18:26:20 +0200 |
commit | f5fd6d42e11bc8f6a5bd84a3653a40fa03ed5497 (patch) | |
tree | a90e7c9cbee985ac44403fdcadb764c4966246ab | |
parent | 020fe826606e8d02d326c7de8a8df758588f424b (diff) |
Add CSV Export
-rw-r--r-- | cpanfile | 1 | ||||
-rwxr-xr-x | lib/Travelynx.pm | 2 | ||||
-rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 49 | ||||
-rw-r--r-- | templates/history.html.ep | 15 |
4 files changed, 63 insertions, 4 deletions
@@ -11,6 +11,7 @@ requires 'MIME::Entity'; requires 'Mojolicious'; requires 'Mojolicious::Plugin::Authentication'; requires 'Mojo::Pg'; +requires 'Text::CSV'; requires 'Travel::Status::DE::DBWagenreihung'; requires 'Travel::Status::DE::IRIS'; requires 'UUID::Tiny'; diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 7495b76..285cfef 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -72,6 +72,7 @@ sub startup { $self->defaults( layout => 'default' ); + $self->types->type( csv => 'text/csv; charset=utf-8' ); $self->types->type( json => 'application/json; charset=utf-8' ); $self->plugin('Config'); @@ -4043,6 +4044,7 @@ sub startup { $authed_r->get('/account/mail')->to('account#change_mail'); $authed_r->get('/export.json')->to('account#json_export'); $authed_r->get('/history.json')->to('traveling#json_history'); + $authed_r->get('/history.csv')->to('traveling#csv_history'); $authed_r->get('/history')->to('traveling#history'); $authed_r->get('/history/commute')->to('traveling#commute'); $authed_r->get('/history/map')->to('traveling#map_history'); diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index ae5be69..702a89e 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -7,6 +7,7 @@ use JSON; use List::Util qw(uniq min max); use List::UtilsBy qw(max_by uniq_by); use List::MoreUtils qw(first_index); +use Text::CSV; use Travel::Status::DE::IRIS::Stations; sub homepage { @@ -644,6 +645,54 @@ sub json_history { $self->render( json => [ $self->get_user_travels ] ); } +sub csv_history { + my ($self) = @_; + + my $csv = Text::CSV->new( { eol => "\r\n" } ); + my $buf = q{}; + + $csv->combine( + qw(Zugtyp Linie Nummer Start Ziel), + 'Start (DS100)', + 'Ziel (DS100)', + 'Abfahrt (soll)', + 'Abfahrt (ist)', + 'Ankunft (soll)', + 'Ankunft (ist)', + 'Kommentar', + 'ID' + ); + $buf .= $csv->string; + + for my $journey ( $self->get_user_travels( with_datetime => 1 ) ) { + if ( + $csv->combine( + $journey->{type}, + $journey->{line}, + $journey->{no}, + $journey->{from_name}, + $journey->{to_name}, + $journey->{from_ds100}, + $journey->{to_ds100}, + $journey->{sched_departure}->strftime('%Y-%m-%d %H:%M'), + $journey->{rt_departure}->strftime('%Y-%m-%d %H:%M'), + $journey->{sched_arrival}->strftime('%Y-%m-%d %H:%M'), + $journey->{rt_arrival}->strftime('%Y-%m-%d %H:%M'), + $journey->{user_data}{comment} // q{}, + $journey->{id} + ) + ) + { + $buf .= $csv->string; + } + } + + $self->render( + text => $buf, + format => 'csv' + ); +} + sub yearly_history { my ($self) = @_; my $year = $self->stash('year'); diff --git a/templates/history.html.ep b/templates/history.html.ep index cb3d332..3751741 100644 --- a/templates/history.html.ep +++ b/templates/history.html.ep @@ -41,22 +41,29 @@ <h2>Ausfälle und Verspätungen</h2> <div class="row"> <div class="col s12 m12 l5 center-align"> - <a href="/cancelled" class="waves-effect waves-light btn"><i class="material-icons left">cancel</i> Zugausfälle</a> + <a href="/cancelled" class="waves-effect waves-light btn"><i class="material-icons left" aria-hidden="true">cancel</i> Zugausfälle</a> </div> <div class="col s12 m12 l2"> </div> <div class="col s12 m12 l5 center-align"> - <a href="/fgr" class="waves-effect waves-light btn"><i class="material-icons left">feedback</i> Fahrgastrechte</a> + <a href="/fgr" class="waves-effect waves-light btn"><i class="material-icons left" aria-hidden="true">feedback</i> Fahrgastrechte</a> </div> </div> <h2>Rohdaten</h2> <div class="row"> <div class="col s12 m12 l5 center-align"> - <a href="/history.json" class="waves-effect waves-light btn"><i class="material-icons left">cloud</i> JSON-Export</a> + <a href="/history.json" class="waves-effect waves-light btn"><i class="material-icons left" aria-hidden="true">cloud</i> JSON-Export</a> </div> <div class="col s12 m12 l2"> </div> <div class="col s12 m12 l5 center-align"> - <a href="/journey/add" class="waves-effect waves-light btn"><i class="material-icons left">add</i> Neue Fahrt</a> + <a href="/history.csv" class="waves-effect waves-light btn"><i class="material-icons left" aria-hidden="true">list</i> CSV-Export</a> + </div> +</div> +<div class="row"> + <div class="col s12 m12 l5 center-align"> </div> + <div class="col s12 m12 l2"> </div> + <div class="col s12 m12 l5 center-align"> + <a href="/journey/add" class="waves-effect waves-light btn"><i class="material-icons left" aria-hidden="true">add</i> Neue Fahrt</a> </div> </div> |