diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2020-09-03 22:27:50 +0200 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2020-09-03 22:27:50 +0200 | 
| commit | 482fa975b5f50064deb57b651019908c17b71f47 (patch) | |
| tree | 118e0247f29c058f61e53db5716df1c1d848d898 | |
| parent | ea0fe3ea3e72eb690dd5a92eb4831523be740d08 (diff) | |
add public profile page and public journey details
| -rwxr-xr-x | lib/Travelynx.pm | 2 | ||||
| -rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 88 | ||||
| -rw-r--r-- | templates/_history_trains.html.ep | 3 | ||||
| -rw-r--r-- | templates/account.html.ep | 6 | ||||
| -rw-r--r-- | templates/journey.html.ep | 3 | ||||
| -rw-r--r-- | templates/privacy.html.ep | 22 | ||||
| -rw-r--r-- | templates/profile.html.ep | 29 | 
7 files changed, 139 insertions, 14 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 232cb46..613fbc3 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -2685,6 +2685,8 @@ sub startup {  	$r->get('/status/:name/:ts')->to('traveling#user_status');  	$r->get('/ajax/status/:name')->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/travel')->to('api#travel_v1');  	$r->post('/action')->to('traveling#log_action'); diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index 59bad45..33b3118 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -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 {  	my ($self) = @_; diff --git a/templates/_history_trains.html.ep b/templates/_history_trains.html.ep index d422165..74dfe9e 100644 --- a/templates/_history_trains.html.ep +++ b/templates/_history_trains.html.ep @@ -12,6 +12,9 @@  			<tbody>  				% for my $travel (@{$journeys}) {  					% my $detail_link = '/journey/' . $travel->{id}; +					% if (my $prefix = stash('link_prefix')) { +						% $detail_link = $prefix . $travel->{id}; +					% }  					<tr>  						<td><%= $travel->{sched_departure}->strftime($date_format) %></td>  						<td><a href="<%= $detail_link %>"><%= $travel->{type} %> <%= $travel->{line} // $travel->{no} %></a></td> diff --git a/templates/account.html.ep b/templates/account.html.ep index 8df5008..7bc725f 100644 --- a/templates/account.html.ep +++ b/templates/account.html.ep @@ -67,7 +67,7 @@  						<span style="color: #999999;">Keine</span>  					% }  					% if ($acc->{is_public} & 0x01) { -						Aktueller Status (nur für angemeldete Accounts) +						Aktueller Status (nur mit Anmeldung)  					% }  					% elsif ($acc->{is_public} & 0x02) {  						Aktueller Status @@ -79,10 +79,10 @@  						<br/>  					% }  					% if ($acc->{is_public} & 0x10) { -						Letzte zehn Fahrten (nur für angemeldete Accounts) +						Vergangene Fahrten (nur mit Anmeldung)  					% }  					% elsif ($acc->{is_public} & 0x20) { -						Letzte zehn Fahrten +						Vergangene Fahrten  					% }  				</td>  			</tr> diff --git a/templates/journey.html.ep b/templates/journey.html.ep index 0979f49..a5e04a0 100644 --- a/templates/journey.html.ep +++ b/templates/journey.html.ep @@ -14,6 +14,9 @@  	<div class="row">  		<div class="col s12">  			<p> +				% if (my $name = stash('username')) { +					<b><a href="/p/<%= $name %>"><%= $name %></a></b>s +				% }  				% if ($journey->{cancelled}) {  					Ausgefallene Fahrt  				% } diff --git a/templates/privacy.html.ep b/templates/privacy.html.ep index 7b78770..98dc068 100644 --- a/templates/privacy.html.ep +++ b/templates/privacy.html.ep @@ -22,7 +22,7 @@  		<div class="input-field col s12">  			<label>  				%= radio_button status_level => 'intern' -				<span>Nur für angemeldete Accounts</span> +				<span>Nur mit Anmeldung</span>  			</label>  		</div>  	</div> @@ -37,7 +37,8 @@  	<div class="row">  		<div class="col s12">  			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,  			Abfahrts- und Ankunftszeit gezeigt; andernfalls lediglich der  			Zielbahnhof der letzten Reise.  Wann die letzte Reise beendet wurde, @@ -74,7 +75,7 @@  		<div class="input-field col s12">  			<label>  				%= radio_button history_level => 'intern' -				<span>Nur für angemeldete Accounts</span> +				<span>Nur mit Anmeldung</span>  			</label>  		</div>  	</div> @@ -88,14 +89,13 @@  	</div>  	<div class="row">  		<div class="col s12"> -			Diese Einstellung bestimmt die Sichtbarkeit deiner letzten -			zehn Zugfahrten mit allen dazu bekannten Details (Abfahrt, Ankunft, -			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. +			Diese Einstellung bestimmt die Sichtbarkeit deiner vergangenen +			Zugfahrten mit allen dazu bekannten Details (Abfahrt, Ankunft, +			Wagenreihung u.a.).  Die letzten zehn Fahrten werden unter <a +			href="/p/<%= $name %>">/p/<%= $name %></a> aufgelistet und verlinkt, +			ältere Fahrten sind jedoch weiterhin über /p/<%= $name %>/j/ID +			zugänglich. Da die ID (mit Lücken) aufsteigend vergeben wird, sind +			effektiv alle deiner vergangenen Fahrten öffentlich.  		</div>  	</div>  	<div class="row"> diff --git a/templates/profile.html.ep b/templates/profile.html.ep new file mode 100644 index 0000000..1755303 --- /dev/null +++ b/templates/profile.html.ep @@ -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')  | 
