diff options
author | Daniel Friesel <derf@finalrewind.org> | 2020-02-19 20:58:38 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2020-02-19 20:58:38 +0100 |
commit | 57f686b688d1ae09a3ab6fe6b54ba3c7c18c16a6 (patch) | |
tree | 1b582a989e9e8904a68bc1ca412652dc870e542e | |
parent | 2652ea6bab56e40169334800f4b9c5a11c3ef601 (diff) |
allow showing past journeys on shared status page
-rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 121 | ||||
-rw-r--r-- | templates/_public_status_card.html.ep | 9 | ||||
-rw-r--r-- | templates/account.html.ep | 9 | ||||
-rw-r--r-- | templates/journey.html.ep | 78 | ||||
-rw-r--r-- | templates/privacy.html.ep | 12 |
5 files changed, 142 insertions, 87 deletions
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index 59466f3..1d8a644 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -33,53 +33,98 @@ sub user_status { my ($self) = @_; my $name = $self->stash('name'); - my $ts = $self->stash('ts'); + my $ts = $self->stash('ts') // 0; my $user = $self->get_privacy_by_name($name); + if ( not $user or not $user->{public_level} & 0x03 ) { + $self->render('not_found'); + return; + } + + if ( $user->{public_level} & 0x01 and not $self->is_user_authenticated ) { + $self->render( 'login', redirect_to => $self->req->url ); + return; + } + + my $status = $self->get_user_status( $user->{id} ); + my $journey; + if ( - $user - and ( $user->{public_level} & 0x02 + $ts + and ( not $status->{checked_in} + or $status->{sched_departure}->epoch != $ts ) + and ( $user->{public_level} & 0x20 or - ( $user->{public_level} & 0x01 and $self->is_user_authenticated ) ) + ( $user->{public_level} & 0x10 and $self->is_user_authenticated ) ) ) { - my $status = $self->get_user_status( $user->{id} ); - - my %tw_data = ( - card => 'summary', - site => '@derfnull', - image => $self->url_for('/static/icons/icon-512x512.png') - ->to_abs->scheme('https'), - ); - - if ( - $ts - and ( not $status->{checked_in} - or $status->{sched_departure}->epoch != $ts ) + for my $candidate ( + $self->get_user_travels( + uid => $user->{id}, + limit => 10, + verbose => 1, + with_datetime => 1 + ) ) { - $tw_data{title} = "Bahnfahrt beendet"; - $tw_data{description} = "${name} hat das Ziel erreicht"; - } - elsif ( $status->{checked_in} ) { - $tw_data{title} = "${name} ist unterwegs"; - $tw_data{description} = sprintf( - '%s %s von %s nach %s', - $status->{train_type}, - $status->{train_line} // $status->{train_no}, - $status->{dep_name}, - $status->{arr_name} // 'irgendwo' - ); - if ( $status->{real_arrival}->epoch ) { - $tw_data{description} .= $status->{real_arrival} - ->strftime(' – Ankunft gegen %H:%M Uhr'); + if ( $candidate->{sched_departure}->epoch eq $ts ) { + $journey = $candidate; } } - else { - $tw_data{title} = "${name} ist gerade nicht eingecheckt"; - $tw_data{description} = "Letztes Fahrtziel: $status->{arr_name}"; + } + + my %tw_data = ( + card => 'summary', + site => '@derfnull', + image => $self->url_for('/static/icons/icon-512x512.png') + ->to_abs->scheme('https'), + ); + + if ($journey) { + $tw_data{title} = sprintf( 'Fahrt von %s nach %s', + $journey->{from_name}, $journey->{to_name} ); + $tw_data{description} + = $journey->{rt_arrival}->strftime('Ankunft am %d.%m.%Y um %H:%M'); + } + elsif ( + $ts + and ( not $status->{checked_in} + or $status->{sched_departure}->epoch != $ts ) + ) + { + $tw_data{title} = "Bahnfahrt beendet"; + $tw_data{description} = "${name} hat das Ziel erreicht"; + } + elsif ( $status->{checked_in} ) { + $tw_data{title} = "${name} ist unterwegs"; + $tw_data{description} = sprintf( + '%s %s von %s nach %s', + $status->{train_type}, $status->{train_line} // $status->{train_no}, + $status->{dep_name}, $status->{arr_name} // 'irgendwo' + ); + if ( $status->{real_arrival}->epoch ) { + $tw_data{description} .= $status->{real_arrival} + ->strftime(' – Ankunft gegen %H:%M Uhr'); } + } + else { + $tw_data{title} = "${name} ist gerade nicht eingecheckt"; + $tw_data{description} = "Letztes Fahrtziel: $status->{arr_name}"; + } + if ($journey) { + if ( not $user->{public_level} & 0x04 ) { + delete $journey->{user_data}{comment}; + } + $self->render( + 'journey', + error => undef, + readonly => 1, + journey => $journey, + twitter => \%tw_data, + ); + } + else { $self->render( 'user_status', name => $name, @@ -88,12 +133,6 @@ sub user_status { twitter => \%tw_data, ); } - elsif ( $user->{public_level} & 0x01 ) { - $self->render( 'login', redirect_to => $self->req->url ); - } - else { - $self->render('not_found'); - } } sub public_status_card { diff --git a/templates/_public_status_card.html.ep b/templates/_public_status_card.html.ep index ced0c6f..907427f 100644 --- a/templates/_public_status_card.html.ep +++ b/templates/_public_status_card.html.ep @@ -164,13 +164,14 @@ <p> % if ($journey->{arr_name}) { Zuletzt gesehen - % if ($public_level & 0x30 and $journey->{real_arrival}->epoch) { + % if ($journey->{real_arrival}->epoch and ($public_level & 0x20 or ($public_level & 0x10 and is_user_authenticated()))) { %= $journey->{real_arrival}->strftime('am %d.%m.%Y') - % } - in <b><%= $journey->{arr_name} %></b> - % if ($public_level & 0x30 and $journey->{real_arrival}->epoch) { + in <b><%= $journey->{arr_name} %></b> %= $journey->{real_arrival}->strftime('(Ankunft um %H:%M Uhr)') % } + % else { + in <b><%= $journey->{arr_name} %></b> + % } % } % else { Noch keine Zugfahrten geloggt. diff --git a/templates/account.html.ep b/templates/account.html.ep index 1118ca0..efe2ee7 100644 --- a/templates/account.html.ep +++ b/templates/account.html.ep @@ -75,6 +75,15 @@ % if ($acc->{is_public} & 0x04) { mit Kommentar % } + % if ($acc->{is_public} & 0x0f and $acc->{is_public} & 0xf0) { + <br/> + % } + % if ($acc->{is_public} & 0x10) { + Letzte zehn Fahrten (nur für angemeldete Accounts) + % } + % elsif ($acc->{is_public} & 0x20) { + Letzte zehn Fahrten + % } </td> </tr> <tr> diff --git a/templates/journey.html.ep b/templates/journey.html.ep index ae8f750..bd22edc 100644 --- a/templates/journey.html.ep +++ b/templates/journey.html.ep @@ -223,44 +223,46 @@ </table> </div> </div> - <div class="row hide-on-small-only"> - <div class="col s12 m6 l6 center-align"> - <a class="waves-effect waves-light red btn action-delete" - data-id="<%= $journey->{id} %>" - data-checkin="<%= $journey->{checkin}->epoch %>" - data-checkout="<%= $journey->{checkout}->epoch %>"> - <i class="material-icons left">delete_forever</i> - Löschen - </a> - </div> - <div class="col s12 m6 l6 center-align"> - %= form_for '/journey/edit' => (method => 'POST') => begin - %= hidden_field 'journey_id' => param('journey_id') - <button class="btn waves-effect waves-light" type="submit" name="action" value="edit"> - <i class="material-icons left" aria-hidden="true">edit</i> - Bearbeiten - </button> - %= end - </div> - </div> - <div class="row hide-on-med-and-up"> - <div class="col s12 m6 l6 center-align"> - %= form_for '/journey/edit' => (method => 'POST') => begin - %= hidden_field 'journey_id' => param('journey_id') - <button class="btn waves-effect waves-light" type="submit" name="action" value="edit"> - <i class="material-icons left" aria-hidden="true">edit</i> - Bearbeiten - </button> - %= end + % if (not stash('readonly')) { + <div class="row hide-on-small-only"> + <div class="col s12 m6 l6 center-align"> + <a class="waves-effect waves-light red btn action-delete" + data-id="<%= $journey->{id} %>" + data-checkin="<%= $journey->{checkin}->epoch %>" + data-checkout="<%= $journey->{checkout}->epoch %>"> + <i class="material-icons left">delete_forever</i> + Löschen + </a> + </div> + <div class="col s12 m6 l6 center-align"> + %= form_for '/journey/edit' => (method => 'POST') => begin + %= hidden_field 'journey_id' => param('journey_id') + <button class="btn waves-effect waves-light" type="submit" name="action" value="edit"> + <i class="material-icons left" aria-hidden="true">edit</i> + Bearbeiten + </button> + %= end + </div> </div> - <div class="col s12 m6 l6 center-align" style="margin-top: 1em;"> - <a class="waves-effect waves-light red btn action-delete" - data-id="<%= $journey->{id} %>" - data-checkin="<%= $journey->{checkin}->epoch %>" - data-checkout="<%= $journey->{checkout}->epoch %>"> - <i class="material-icons left" aria-hidden="true">delete_forever</i> - Löschen - </a> + <div class="row hide-on-med-and-up"> + <div class="col s12 m6 l6 center-align"> + %= form_for '/journey/edit' => (method => 'POST') => begin + %= hidden_field 'journey_id' => param('journey_id') + <button class="btn waves-effect waves-light" type="submit" name="action" value="edit"> + <i class="material-icons left" aria-hidden="true">edit</i> + Bearbeiten + </button> + %= end + </div> + <div class="col s12 m6 l6 center-align" style="margin-top: 1em;"> + <a class="waves-effect waves-light red btn action-delete" + data-id="<%= $journey->{id} %>" + data-checkin="<%= $journey->{checkin}->epoch %>" + data-checkout="<%= $journey->{checkout}->epoch %>"> + <i class="material-icons left" aria-hidden="true">delete_forever</i> + Löschen + </a> + </div> </div> - </div> + % } % } diff --git a/templates/privacy.html.ep b/templates/privacy.html.ep index 9439f8b..7b78770 100644 --- a/templates/privacy.html.ep +++ b/templates/privacy.html.ep @@ -41,7 +41,8 @@ Wenn du eingecheckt bist, werden dort Zug, Start- und Zielstation, Abfahrts- und Ankunftszeit gezeigt; andernfalls lediglich der Zielbahnhof der letzten Reise. Wann die letzte Reise beendet wurde, - wird bewusst nicht angegeben. + wird nur angegeben, wenn deine vergangenen Zugfahrten sichtbar sind + (siehe unten). </div> </div> <div class="row"> @@ -89,9 +90,12 @@ <div class="col s12"> Diese Einstellung bestimmt die Sichtbarkeit deiner letzten zehn Zugfahrten mit allen dazu bekannten Details (Abfahrt, Ankunft, - Wagenreihung u.a.). Dies umfasst Angaben auf - <a href="/status/<%= $name %>">/status/<%= $name %></a> sowie - eine Liste deiner letzten Fahrten. Die Implementierung folgt noch... + Wagenreihung u.a.). Derzeit sind diese nur mit einem von dir + geteilten (oder korrekt erratenen) Link zu + <a href="/status/<%= $name %>">/status/<%= $name %>/ID</a> abrufbar. + In Zukunft kann eine auf deiner Statusseite eingebundene Liste + deiner letzten Zugfahrten folgen, deren Sichtbarkeit ebenfalls von + dieser Einstellung bestimmt wird. </div> </div> <div class="row"> |