diff options
Diffstat (limited to 'lib')
| -rwxr-xr-x | lib/Travelynx.pm | 82 | ||||
| -rw-r--r-- | lib/Travelynx/Command/work.pm | 26 | ||||
| -rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 17 | ||||
| -rw-r--r-- | lib/Travelynx/Helper/DBRIS.pm | 4 | ||||
| -rw-r--r-- | lib/Travelynx/Helper/EFA.pm | 4 | ||||
| -rw-r--r-- | lib/Travelynx/Helper/IRIS.pm | 4 | ||||
| -rwxr-xr-x | lib/Travelynx/Model/Journeys.pm | 154 |
7 files changed, 177 insertions, 114 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 7b5cf99..89a0158 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -466,6 +466,64 @@ sub startup { ); $self->helper( + 'LT' => sub { + my ( $self, $minutes ) = @_; + + my @ret; + + if ( $minutes >= 14 * 24 * 60 ) { + push( @ret, + int( $minutes / ( 7 * 24 * 60 ) ) . q{ } + . $self->L('LT.weeks') ); + } + elsif ( $minutes >= 7 * 24 * 60 ) { + push( @ret, '1 ' . $self->L('LT.week') ); + } + $minutes %= 7 * 24 * 60; + + if ( $minutes >= 2 * 24 * 60 ) { + push( @ret, + int( $minutes / ( 24 * 60 ) ) . q{ } + . $self->L('LT.days') ); + } + elsif ( $minutes >= 24 * 60 ) { + push( @ret, '1 ' . $self->L('LT.day') ); + } + $minutes %= 24 * 60; + + if ( $minutes >= 2 * 60 ) { + push( @ret, + int( $minutes / 60 ) . q{ } . $self->L('LT.hours') ); + } + elsif ( $minutes >= 60 ) { + push( @ret, '1 ' . $self->L('LT.hour') ); + } + $minutes %= 60; + + if ( $minutes >= 2 ) { + push( @ret, "$minutes " . $self->L('LT.minutes') ); + } + elsif ($minutes) { + push( @ret, '1 ' . $self->L('LT.minute') ); + } + + if ( @ret == 0 ) { + return $self->L('LT.zero-minutes'); + } + + if ( @ret == 1 ) { + return $ret[0]; + } + + my $last = pop(@ret); + return + join( ', ', @ret ) + . $self->L( @ret > 1 ? 'LT.final-and' : 'LT.and' ) + . " $last"; + } + ); + + $self->helper( 'now' => sub { return DateTime->now( time_zone => 'Europe/Berlin' ); } @@ -1403,16 +1461,25 @@ sub startup { arrival_eva => $new_checkout_station_id ); - # If in_transit already contains arrival data for another estimated - # destination, we must invalidate it. if ( defined $journey->{checkout_station_id} and $journey->{checkout_station_id} != $new_checkout_station_id ) { + # If in_transit already contains arrival data for another estimated + # destination, we must invalidate it. $self->in_transit->unset_arrival_data( uid => $uid, db => $db ); + + # The same applies to suggestions + $self->in_transit->update_data( + uid => $uid, + db => $db, + data => { + connection_suggestions_iris => [], + }, + ); } # Note that a train may pass the same station several times. @@ -1741,6 +1808,17 @@ sub startup { cancelled_destination => $found->[0], ); } + else { + # remove connection suggestions that may have been saved for a different target station + $self->in_transit->update_data( + uid => $uid, + db => $db, + data => { + connection_suggestions_dbris => [], + connection_suggestions_efa => [], + }, + ); + } if ($tx) { $tx->commit; diff --git a/lib/Travelynx/Command/work.pm b/lib/Travelynx/Command/work.pm index 7a7ce22..f3bf71c 100644 --- a/lib/Travelynx/Command/work.pm +++ b/lib/Travelynx/Command/work.pm @@ -215,8 +215,11 @@ sub run { exclude => $dep, ); $self->app->dbris->get_connections_p( - station => $arr, - timestamp => $entry->{real_arr}, + station => $arr, + timestamp => DateTime->from_epoch( + epoch => $entry->{real_arr_ts}, + time_zone => 'Europe/Berlin' + ), destinations => \@destinations )->then( sub { @@ -348,9 +351,12 @@ sub run { exclude => $dep, ); $self->app->efa->get_connections_p( - service => $entry->{backend_name}, - name => $arr, - timestamp => $entry->{real_arr}, + service => $entry->{backend_name}, + name => $arr, + timestamp => DateTime->from_epoch( + epoch => $entry->{real_arr_ts}, + time_zone => 'Europe/Berlin' + ), destinations => \@destinations )->then( sub { @@ -782,7 +788,8 @@ sub run { $self->app->add_stationinfo( $uid, 0, $train->train_id, $dep, $arr ); } - if ( defined $entry->{real_arr_ts} + if ( $suggestions_enabled + and defined $entry->{real_arr_ts} and $now->epoch - $entry->{real_arr_ts} < 900 ) { my @destinations @@ -793,8 +800,11 @@ sub run { exclude => $dep, ); $self->app->iris->get_connections_p( - station => $arr, - timestamp => $entry->{real_arr}, + station => $arr, + timestamp => DateTime->from_epoch( + epoch => $entry->{real_arr_ts}, + time_zone => 'Europe/Berlin' + ), destinations => \@destinations )->then( sub { diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index 28d7bfd..0132a23 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -1582,6 +1582,7 @@ sub yearly_history { uid => $self->current_user->{id}, after => $interval_start, before => $interval_end, + sort => 'asc', with_datetime => 1 ); @@ -1664,6 +1665,7 @@ sub monthly_history { uid => $self->current_user->{id}, after => $interval_start, before => $interval_end, + sort => 'asc', with_datetime => 1 ); @@ -2203,8 +2205,19 @@ sub polyline_add_stops { } $route_i += 1; } - $route_i = 0; + $route_i = -1; for my $stop ( @{$route} ) { + $route_i += 1; + if ( $opt{partial} ) { + if ( $route_i == 0 ) { + $polyline->[0][2] = $stop->[1]; + next; + } + if ( $route_i == $#{$route} ) { + $polyline->[-1][2] = $stop->[1]; + next; + } + } my $key = $route_i . ';' . $stop->[1]; if ( $min_dist{$key} ) { if ( defined $polyline->[ $min_dist{$key}{index} ][2] ) { @@ -2230,7 +2243,6 @@ sub polyline_add_stops { $polyline->[ $min_dist{$key}{index} ][2] = $stop->[1]; } - $route_i += 1; } return; } @@ -2348,6 +2360,7 @@ sub set_polyline { my $err = $self->polyline_add_stops( polyline => \@polyline, route => \@route, + partial => ( $self->param('upload-partial') ? 1 : 0 ), ); if ($err) { diff --git a/lib/Travelynx/Helper/DBRIS.pm b/lib/Travelynx/Helper/DBRIS.pm index edf8812..8fb1058 100644 --- a/lib/Travelynx/Helper/DBRIS.pm +++ b/lib/Travelynx/Helper/DBRIS.pm @@ -132,6 +132,10 @@ sub get_connections_p { my $promise = Mojo::Promise->new; my $destinations = $opt{destinations}; + $self->{log}->debug( +"get_connections_p(station => $opt{station}, timestamp => $opt{timestamp})" + ); + $self->get_departures_p( station => '@L=' . $opt{station}, timestamp => $opt{timestamp}, diff --git a/lib/Travelynx/Helper/EFA.pm b/lib/Travelynx/Helper/EFA.pm index 70894df..af4903d 100644 --- a/lib/Travelynx/Helper/EFA.pm +++ b/lib/Travelynx/Helper/EFA.pm @@ -98,6 +98,10 @@ sub get_connections_p { my $promise = Mojo::Promise->new; my $destinations = $opt{destinations}; + $self->{log}->debug( +"get_connections_p(service => $opt{service}, station => $opt{name}, timestamp => $opt{timestamp})" + ); + $self->get_departures_p( service => $opt{service}, name => $opt{name}, diff --git a/lib/Travelynx/Helper/IRIS.pm b/lib/Travelynx/Helper/IRIS.pm index 9a5aa87..5ed0654 100644 --- a/lib/Travelynx/Helper/IRIS.pm +++ b/lib/Travelynx/Helper/IRIS.pm @@ -206,6 +206,10 @@ sub get_connections_p { my $promise = Mojo::Promise->new; my $destinations = $opt{destinations}; + $self->{log}->debug( +"get_connections_p(station => $opt{station}, timestamp => $opt{timestamp})" + ); + $self->get_departures_p( station => $opt{station}, timestamp => $opt{timestamp}, diff --git a/lib/Travelynx/Model/Journeys.pm b/lib/Travelynx/Model/Journeys.pm index 744e7ae..ea3461c 100755 --- a/lib/Travelynx/Model/Journeys.pm +++ b/lib/Travelynx/Model/Journeys.pm @@ -50,56 +50,6 @@ sub epoch_to_dt { ); } -# TODO turn into a travelynx helper called from templates so that -# loc_handle is available for localization -sub min_to_human { - my ( $self, $minutes ) = @_; - - my @ret; - - if ( $minutes >= 14 * 24 * 60 ) { - push( @ret, int( $minutes / ( 7 * 24 * 60 ) ) . ' Wochen' ); - } - elsif ( $minutes >= 7 * 24 * 60 ) { - push( @ret, '1 Woche' ); - } - $minutes %= 7 * 24 * 60; - - if ( $minutes >= 2 * 24 * 60 ) { - push( @ret, int( $minutes / ( 24 * 60 ) ) . ' Tage' ); - } - elsif ( $minutes >= 24 * 60 ) { - push( @ret, '1 Tag' ); - } - $minutes %= 24 * 60; - - if ( $minutes >= 2 * 60 ) { - push( @ret, int( $minutes / 60 ) . ' Stunden' ); - } - elsif ( $minutes >= 60 ) { - push( @ret, '1 Stunde' ); - } - $minutes %= 60; - - if ( $minutes >= 2 ) { - push( @ret, "$minutes Minuten" ); - } - elsif ($minutes) { - push( @ret, '1 Minute' ); - } - - if ( @ret == 0 ) { - return '0 Minuten'; - } - - if ( @ret == 1 ) { - return $ret[0]; - } - - my $last = pop(@ret); - return join( ', ', @ret ) . " und $last"; -} - sub new { my ( $class, %opt ) = @_; @@ -698,9 +648,14 @@ sub get { user_id => $uid, cancelled => 0 ); + + my $order_key = '-desc'; + if ( $opt{sort} and $opt{sort} eq 'asc' ) { + $order_key = '-asc'; + } my %order = ( order_by => { - -desc => 'real_dep_ts', + $order_key => 'real_dep_ts', } ); @@ -1046,20 +1001,20 @@ sub get_latest_checkout_stations { my @ret; while ( my $row = $res->hash ) { - push( - @ret, - { - name => $row->{arr_name}, - eva => $row->{arr_eva}, - external_id_or_eva => $row->{arr_external_id} - // $row->{arr_eva}, - dbris => $row->{is_dbris} ? $row->{backend_name} : 0, - efa => $row->{is_efa} ? $row->{backend_name} : 0, - hafas => $row->{is_hafas} ? $row->{backend_name} : 0, - motis => $row->{is_motis} ? $row->{backend_name} : 0, - backend_id => $row->{backend_id}, - } - ); + my $entry = { + name => $row->{arr_name}, + eva => $row->{arr_eva}, + external_id_or_eva => $row->{arr_external_id} // $row->{arr_eva}, + dbris => $row->{is_dbris} ? $row->{backend_name} : 0, + efa => $row->{is_efa} ? $row->{backend_name} : 0, + hafas => $row->{is_hafas} ? $row->{backend_name} : 0, + motis => $row->{is_motis} ? $row->{backend_name} : 0, + backend_id => $row->{backend_id}, + }; + if ( $row->{is_dbris} ) { + $entry->{external_id_or_eva} = '@L=' . $row->{arr_eva}; + } + push( @ret, $entry ); } return @ret; @@ -1560,6 +1515,17 @@ sub compute_review { } } } + if ( $journey->{user_data}{him_msg} + and @{ $journey->{user_data}{him_msg} } ) + { + $message_count += 1; + for my $message ( @{ $journey->{user_data}{him_msg} } ) { + if ( not $seen{ $message->{lead} } ) { + $num_by_message{ $message->{lead} } += 1; + $seen{ $message->{lead} } = 1; + } + } + } if ( $journey->{type} ) { $num_by_linetype{ $journey->{type} } += 1; @@ -1658,7 +1624,7 @@ sub compute_review { $review{traveling_percentage_year} = sprintf( "%.1f%%", $min_total * 100 / 525948.77 ); $review{traveling_percentage_year} =~ tr{.}{,}; - $review{traveling_time_year} = $self->min_to_human($min_total); + $review{traveling_time_year} = $min_total; if (@linetypes) { $review{typical_type_1} = $linetypes[0][0]; @@ -1673,24 +1639,18 @@ sub compute_review { elsif ( @stops == 2 ) { $review{typical_stops_2} = [ $stops[0][0], $stops[1][0] ]; } - $review{typical_time} - = $self->min_to_human( $stats->{min_travel_real} / $stats->{num_trains} ); + $review{typical_time} = $stats->{min_travel_real} / $stats->{num_trains}; $review{typical_km} = sprintf( '%.0f', $stats->{km_route} / $stats->{num_trains} ); $review{typical_kmh} = sprintf( '%.0f', $stats->{km_route} / ( $stats->{min_travel_real} / 60 ) ); $review{typical_delay_dep} = sprintf( '%.0f', $stats->{delay_dep} / $stats->{num_trains} ); - $review{typical_delay_dep_h} - = $self->min_to_human( $review{typical_delay_dep} ); $review{typical_delay_arr} = sprintf( '%.0f', $stats->{delay_arr} / $stats->{num_trains} ); - $review{typical_delay_arr_h} - = $self->min_to_human( $review{typical_delay_arr} ); if ($longest_t) { - $review{longest_t_time} - = $self->min_to_human( $longest_t->{rt_duration} / 60 ); + $review{longest_t_min} = $longest_t->{rt_duration} / 60; $review{longest_t_type} = $longest_t->{type}; $review{longest_t_lineno} = $longest_t->{line} // $longest_t->{no}; $review{longest_t_from} = $longest_t->{from_name}; @@ -1708,8 +1668,7 @@ sub compute_review { } if ($shortest_t) { - $review{shortest_t_time} - = $self->min_to_human( $shortest_t->{rt_duration} / 60 ); + $review{shortest_t_min} = $shortest_t->{rt_duration} / 60; $review{shortest_t_type} = $shortest_t->{type}; $review{shortest_t_lineno} = $shortest_t->{line} // $shortest_t->{no}; $review{shortest_t_from} = $shortest_t->{from_name}; @@ -1729,12 +1688,10 @@ sub compute_review { } if ($most_delayed) { - $review{most_delayed_type} = $most_delayed->{type}; - $review{most_delayed_delay_dep} - = $self->min_to_human( $most_delayed->{delay_dep} ); - $review{most_delayed_delay_arr} - = $self->min_to_human( $most_delayed->{delay_arr} ); - $review{most_delayed_lineno} = $most_delayed->{line} + $review{most_delayed_type} = $most_delayed->{type}; + $review{most_delayed_delay_dep} = $most_delayed->{delay_dep}; + $review{most_delayed_delay_arr} = $most_delayed->{delay_arr}; + $review{most_delayed_lineno} = $most_delayed->{line} // $most_delayed->{no}; $review{most_delayed_from} = $most_delayed->{from_name}; $review{most_delayed_to} = $most_delayed->{to_name}; @@ -1742,17 +1699,13 @@ sub compute_review { } if ($most_delay) { - $review{most_delay_type} = $most_delay->{type}; - $review{most_delay_delay_dep} = $most_delay->{delay_dep}; - $review{most_delay_delay_arr} = $most_delay->{delay_arr}; - $review{most_delay_sched_time} - = $self->min_to_human( $most_delay->{sched_duration} / 60 ); - $review{most_delay_real_time} - = $self->min_to_human( $most_delay->{rt_duration} / 60 ); + $review{most_delay_type} = $most_delay->{type}; + $review{most_delay_delay_dep} = $most_delay->{delay_dep}; + $review{most_delay_delay_arr} = $most_delay->{delay_arr}; + $review{most_delay_sched_time} = $most_delay->{sched_duration} / 60; + $review{most_delay_real_time} = $most_delay->{rt_duration} / 60; $review{most_delay_delta} - = $self->min_to_human( - ( $most_delay->{rt_duration} - $most_delay->{sched_duration} ) - / 60 ); + = ( $most_delay->{rt_duration} - $most_delay->{sched_duration} ) / 60; $review{most_delay_lineno} = $most_delay->{line} // $most_delay->{no}; $review{most_delay_from} = $most_delay->{from_name}; $review{most_delay_to} = $most_delay->{to_name}; @@ -1760,17 +1713,14 @@ sub compute_review { } if ($most_undelay) { - $review{most_undelay_type} = $most_undelay->{type}; - $review{most_undelay_delay_dep} = $most_undelay->{delay_dep}; - $review{most_undelay_delay_arr} = $most_undelay->{delay_arr}; - $review{most_undelay_sched_time} - = $self->min_to_human( $most_undelay->{sched_duration} / 60 ); - $review{most_undelay_real_time} - = $self->min_to_human( $most_undelay->{rt_duration} / 60 ); + $review{most_undelay_type} = $most_undelay->{type}; + $review{most_undelay_delay_dep} = $most_undelay->{delay_dep}; + $review{most_undelay_delay_arr} = $most_undelay->{delay_arr}; + $review{most_undelay_sched_time} = $most_undelay->{sched_duration} / 60; + $review{most_undelay_real_time} = $most_undelay->{rt_duration} / 60; $review{most_undelay_delta} - = $self->min_to_human( - ( $most_undelay->{sched_duration} - $most_undelay->{rt_duration} ) - / 60 ); + = ( $most_undelay->{sched_duration} - $most_undelay->{rt_duration} ) + / 60; $review{most_undelay_lineno} = $most_undelay->{line} // $most_undelay->{no}; $review{most_undelay_from} = $most_undelay->{from_name}; |
