Add a language selector for logged in users.

This commit is contained in:
Dietrich 2021-03-30 21:45:46 +02:00
parent 0b9afb1fa3
commit dd759923f0
Signed by: dietrich
GPG Key ID: 9F3C20C0F85DF67C
5 changed files with 52 additions and 1 deletions

View File

@ -323,7 +323,11 @@ async fn webservice(server_config: ServerConfig) -> std::io::Result<()> {
web::post().to(views::process_edit_profile), web::post().to(views::process_edit_profile),
), ),
) )
.route("/set_admin/{user_id}", web::get().to(views::toggle_admin)), .route("/set_admin/{user_id}", web::get().to(views::toggle_admin))
.route(
"/set_language/{language}",
web::get().to(views::set_language),
),
) )
.service( .service(
web::scope("/delete").service( web::scope("/delete").service(

View File

@ -63,6 +63,7 @@ impl User {
.await?; .await?;
Ok(()) Ok(())
} }
pub(crate) async fn toggle_admin( pub(crate) async fn toggle_admin(
self, self,
server_config: &ServerConfig, server_config: &ServerConfig,
@ -74,6 +75,21 @@ impl User {
Ok(()) Ok(())
} }
pub(crate) async fn set_language(
self,
server_config: &ServerConfig,
new_language: &str,
) -> Result<(), ServerError> {
sqlx::query!(
"UPDATE users SET language = ? where id = ?",
new_language,
self.id
)
.execute(&server_config.db_pool)
.await?;
Ok(())
}
pub(crate) async fn count_admins(server_config: &ServerConfig) -> Result<Count, ServerError> { pub(crate) async fn count_admins(server_config: &ServerConfig) -> Result<Count, ServerError> {
let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2")
.fetch_one(&server_config.db_pool) .fetch_one(&server_config.db_pool)

View File

@ -305,6 +305,26 @@ pub(crate) async fn toggle_admin(
} }
} }
pub(crate) async fn set_language(
id: &Identity,
lang_code: &str,
server_config: &ServerConfig,
) -> Result<(), ServerError> {
match lang_code {
"de" | "en" => match authenticate(id, server_config).await? {
Role::Admin { user } | Role::Regular { user } => {
user.set_language(server_config, lang_code).await
}
Role::Disabled | Role::NotAuthenticated => {
Err(ServerError::User("Not Allowed".to_owned()))
}
},
_ => Err(ServerError::User(
"This language is not supported!".to_owned(),
)),
}
}
/// Get one link if permissions are accordingly. /// Get one link if permissions are accordingly.
pub(crate) async fn get_link( pub(crate) async fn get_link(
id: &Identity, id: &Identity,

View File

@ -282,6 +282,15 @@ pub(crate) async fn toggle_admin(
))) )))
} }
pub(crate) async fn set_language(
data: web::Path<String>,
config: web::Data<crate::ServerConfig>,
id: Identity,
) -> Result<HttpResponse, ServerError> {
queries::set_language(&id, &data.0, &config).await?;
Ok(redirect_builder("/admin/index/"))
}
pub(crate) async fn login( pub(crate) async fn login(
tera: web::Data<Tera>, tera: web::Data<Tera>,
id: Identity, id: Identity,

View File

@ -22,6 +22,8 @@
<div class="willkommen">{{ fluent(key="welcome-user", lang=user.language, username=user.username) }} <div class="willkommen">{{ fluent(key="welcome-user", lang=user.language, username=user.username) }}
</div> </div>
</li> </li>
<li style="float:right"><a href="/admin/edit/set_language/en">en</a></li>
<li style="float:right"><a href="/admin/edit/set_language/de">de</a></li>
</ol> </ol>
</nav> </nav>
{% block admin %} {% block admin %}