add public profile page and public journey details

This commit is contained in:
Daniel Friesel 2020-09-03 22:27:50 +02:00
parent ea0fe3ea3e
commit 482fa975b5
7 changed files with 139 additions and 14 deletions

View file

@ -2685,6 +2685,8 @@ sub startup {
$r->get('/status/:name/:ts')->to('traveling#user_status'); $r->get('/status/:name/:ts')->to('traveling#user_status');
$r->get('/ajax/status/:name')->to('traveling#public_status_card'); $r->get('/ajax/status/:name')->to('traveling#public_status_card');
$r->get('/ajax/status/:name/:ts')->to('traveling#public_status_card'); $r->get('/ajax/status/:name/:ts')->to('traveling#public_status_card');
$r->get('/p/:name')->to('traveling#public_profile');
$r->get('/p/:name/j/:id')->to('traveling#public_journey_details');
$r->post('/api/v1/import')->to('api#import_v1'); $r->post('/api/v1/import')->to('api#import_v1');
$r->post('/api/v1/travel')->to('api#travel_v1'); $r->post('/api/v1/travel')->to('api#travel_v1');
$r->post('/action')->to('traveling#log_action'); $r->post('/action')->to('traveling#log_action');

View file

@ -146,6 +146,94 @@ sub user_status {
} }
} }
sub public_profile {
my ($self) = @_;
my $name = $self->stash('name');
my $user = $self->users->get_privacy_by_name( name => $name );
if (
$user
and ( $user->{public_level} & 0x22
or
( $user->{public_level} & 0x11 and $self->is_user_authenticated ) )
)
{
my $status = $self->get_user_status( $user->{id} );
$self->render(
'profile',
name => $name,
uid => $user->{id},
public_level => $user->{public_level},
journey => $status,
version => $self->app->config->{version} // 'UNKNOWN',
);
}
else {
$self->render('not_found');
}
}
sub public_journey_details {
my ($self) = @_;
my $name = $self->stash('name');
my $journey_id = $self->stash('id');
my $user = $self->users->get_privacy_by_name( name => $name );
$self->param( journey_id => $journey_id );
if ( not( $journey_id and $journey_id =~ m{ ^ \d+ $ }x ) ) {
$self->render(
'journey',
status => 404,
error => 'notfound',
journey => {}
);
return;
}
if (
$user
and ( $user->{public_level} & 0x20
or
( $user->{public_level} & 0x10 and $self->is_user_authenticated ) )
)
{
my $journey = $self->journeys->get_single(
uid => $user->{id},
journey_id => $journey_id,
verbose => 1,
with_datetime => 1,
with_polyline => 1,
);
if ($journey) {
my $map_data = $self->journeys_to_map_data(
journeys => [$journey],
include_manual => 1,
);
if ( $journey->{user_data}{comment} ) {
delete $journey->{user_data}{comment};
}
$self->render(
'journey',
error => undef,
journey => $journey,
with_map => 1,
username => $name,
readonly => 1,
%{$map_data},
);
}
else {
$self->render( 'not_found', );
}
}
else {
$self->render('not_found');
}
}
sub public_status_card { sub public_status_card {
my ($self) = @_; my ($self) = @_;

View file

@ -12,6 +12,9 @@
<tbody> <tbody>
% for my $travel (@{$journeys}) { % for my $travel (@{$journeys}) {
% my $detail_link = '/journey/' . $travel->{id}; % my $detail_link = '/journey/' . $travel->{id};
% if (my $prefix = stash('link_prefix')) {
% $detail_link = $prefix . $travel->{id};
% }
<tr> <tr>
<td><%= $travel->{sched_departure}->strftime($date_format) %></td> <td><%= $travel->{sched_departure}->strftime($date_format) %></td>
<td><a href="<%= $detail_link %>"><%= $travel->{type} %> <%= $travel->{line} // $travel->{no} %></a></td> <td><a href="<%= $detail_link %>"><%= $travel->{type} %> <%= $travel->{line} // $travel->{no} %></a></td>

View file

@ -67,7 +67,7 @@
<span style="color: #999999;">Keine</span> <span style="color: #999999;">Keine</span>
% } % }
% if ($acc->{is_public} & 0x01) { % if ($acc->{is_public} & 0x01) {
Aktueller Status (nur für angemeldete Accounts) Aktueller Status (nur mit Anmeldung)
% } % }
% elsif ($acc->{is_public} & 0x02) { % elsif ($acc->{is_public} & 0x02) {
Aktueller Status Aktueller Status
@ -79,10 +79,10 @@
<br/> <br/>
% } % }
% if ($acc->{is_public} & 0x10) { % if ($acc->{is_public} & 0x10) {
Letzte zehn Fahrten (nur für angemeldete Accounts) Vergangene Fahrten (nur mit Anmeldung)
% } % }
% elsif ($acc->{is_public} & 0x20) { % elsif ($acc->{is_public} & 0x20) {
Letzte zehn Fahrten Vergangene Fahrten
% } % }
</td> </td>
</tr> </tr>

View file

@ -14,6 +14,9 @@
<div class="row"> <div class="row">
<div class="col s12"> <div class="col s12">
<p> <p>
% if (my $name = stash('username')) {
<b><a href="/p/<%= $name %>"><%= $name %></a></b>s
% }
% if ($journey->{cancelled}) { % if ($journey->{cancelled}) {
Ausgefallene Fahrt Ausgefallene Fahrt
% } % }

View file

@ -22,7 +22,7 @@
<div class="input-field col s12"> <div class="input-field col s12">
<label> <label>
%= radio_button status_level => 'intern' %= radio_button status_level => 'intern'
<span>Nur für angemeldete Accounts</span> <span>Nur mit Anmeldung</span>
</label> </label>
</div> </div>
</div> </div>
@ -37,7 +37,8 @@
<div class="row"> <div class="row">
<div class="col s12"> <div class="col s12">
Hier kannst du auswählen, ob dein aktueller Status unter <a Hier kannst du auswählen, ob dein aktueller Status unter <a
href="/status/<%= $name %>">/status/<%= $name %></a> abrufbar ist. href="/status/<%= $name %>">/status/<%= $name %></a> sowie <a
href="/p/<%= $name %>">/p/<%= $name %></a> abrufbar ist.
Wenn du eingecheckt bist, werden dort Zug, Start- und Zielstation, Wenn du eingecheckt bist, werden dort Zug, Start- und Zielstation,
Abfahrts- und Ankunftszeit gezeigt; andernfalls lediglich der Abfahrts- und Ankunftszeit gezeigt; andernfalls lediglich der
Zielbahnhof der letzten Reise. Wann die letzte Reise beendet wurde, Zielbahnhof der letzten Reise. Wann die letzte Reise beendet wurde,
@ -74,7 +75,7 @@
<div class="input-field col s12"> <div class="input-field col s12">
<label> <label>
%= radio_button history_level => 'intern' %= radio_button history_level => 'intern'
<span>Nur für angemeldete Accounts</span> <span>Nur mit Anmeldung</span>
</label> </label>
</div> </div>
</div> </div>
@ -88,14 +89,13 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col s12"> <div class="col s12">
Diese Einstellung bestimmt die Sichtbarkeit deiner letzten Diese Einstellung bestimmt die Sichtbarkeit deiner vergangenen
zehn Zugfahrten mit allen dazu bekannten Details (Abfahrt, Ankunft, Zugfahrten mit allen dazu bekannten Details (Abfahrt, Ankunft,
Wagenreihung u.a.). Derzeit sind diese nur mit einem von dir Wagenreihung u.a.). Die letzten zehn Fahrten werden unter <a
geteilten (oder korrekt erratenen) Link zu href="/p/<%= $name %>">/p/<%= $name %></a> aufgelistet und verlinkt,
<a href="/status/<%= $name %>">/status/<%= $name %>/ID</a> abrufbar. ältere Fahrten sind jedoch weiterhin über /p/<%= $name %>/j/ID
In Zukunft kann eine auf deiner Statusseite eingebundene Liste zugänglich. Da die ID (mit Lücken) aufsteigend vergeben wird, sind
deiner letzten Zugfahrten folgen, deren Sichtbarkeit ebenfalls von effektiv alle deiner vergangenen Fahrten öffentlich.
dieser Einstellung bestimmt wird.
</div> </div>
</div> </div>
<div class="row"> <div class="row">

29
templates/profile.html.ep Normal file
View file

@ -0,0 +1,29 @@
% if (stash('error')) {
<div class="row">
<div class="col s12">
<div class="card caution-color">
<div class="card-content white-text">
<span class="card-title">Fehler</span>
<p><%= stash('error') %></p>
</div>
</div>
</div>
</div>
% }
% if ($public_level & 0x02 or ($public_level & 0x01 and is_user_authenticated())) {
<div class="row">
<div class="col s12 publicstatuscol" data-user="<%= $name %>">
%= include '_public_status_card', name => $name, public_level => $public_level, journey => $journey
</div>
</div>
% }
% if ($public_level & 0x20 or ($public_level & 0x10 and is_user_authenticated())) {
<div class="row">
<div class="col s12">
<h2>Letzte Fahrten von <%= $name %></h1>
</div>
</div>
%= include '_history_trains', date_format => '%d.%m.%Y', link_prefix => "/p/${name}/j/", journeys => [journeys->get(uid => $uid, limit => 10, with_datetime => 1)];
% }
%= include '_footer', version => stash('version')