summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2020-02-19 20:58:38 +0100
committerDaniel Friesel <derf@finalrewind.org>2020-02-19 20:58:38 +0100
commit57f686b688d1ae09a3ab6fe6b54ba3c7c18c16a6 (patch)
tree1b582a989e9e8904a68bc1ca412652dc870e542e
parent2652ea6bab56e40169334800f4b9c5a11c3ef601 (diff)
allow showing past journeys on shared status page
-rwxr-xr-xlib/Travelynx/Controller/Traveling.pm121
-rw-r--r--templates/_public_status_card.html.ep9
-rw-r--r--templates/account.html.ep9
-rw-r--r--templates/journey.html.ep78
-rw-r--r--templates/privacy.html.ep12
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">