single-user-edit-page #971
@ -79,7 +79,9 @@ impl Mail {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
// Send the email
|
// Send the email
|
||||||
mailer.send(&email).unwrap();
|
if let Err(e) = mailer.send(&email) {
|
||||||
|
Log::create_with_tx(db, format!("Mail nicht versandt: {e:?}")).await;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ pub(crate) mod member;
|
|||||||
pub(crate) mod regular;
|
pub(crate) mod regular;
|
||||||
pub(crate) mod scheckbuch;
|
pub(crate) mod scheckbuch;
|
||||||
pub(crate) mod schnupperant;
|
pub(crate) mod schnupperant;
|
||||||
|
pub(crate) mod schnupperinterest;
|
||||||
pub(crate) mod unterstuetzend;
|
pub(crate) mod unterstuetzend;
|
||||||
|
|
||||||
#[derive(FromRow, Serialize, Deserialize, Clone, Debug, Eq, Hash, PartialEq)]
|
#[derive(FromRow, Serialize, Deserialize, Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
|
@ -98,6 +98,12 @@ impl SchnupperantUser {
|
|||||||
self.user.remove_role(db, changed_by, &schnupperant).await?;
|
self.user.remove_role(db, changed_by, &schnupperant).await?;
|
||||||
self.user.add_role(db, changed_by, &scheckbook).await?;
|
self.user.add_role(db, changed_by, &scheckbook).await?;
|
||||||
|
|
||||||
|
if let Some(no_einschreibgebuehr) = Role::find_by_name(db, "no-einschreibgebuehr").await {
|
||||||
|
self.add_role(db, &changed_by, &no_einschreibgebuehr)
|
||||||
|
.await
|
||||||
|
.expect("role doesn't have a group");
|
||||||
|
}
|
||||||
|
|
||||||
let scheckbook = ScheckbuchUser::new(db, &self.user).await.unwrap();
|
let scheckbook = ScheckbuchUser::new(db, &self.user).await.unwrap();
|
||||||
scheckbook.send_welcome_mail_to_user(db, smtp_pw).await?;
|
scheckbook.send_welcome_mail_to_user(db, smtp_pw).await?;
|
||||||
|
|
||||||
@ -115,6 +121,38 @@ impl SchnupperantUser {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn move_to_schnupperinterest(
|
||||||
|
self,
|
||||||
|
db: &SqlitePool,
|
||||||
|
changed_by: &ManageUserUser,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
let schnupperinterest = Role::find_by_name(db, "schnupper-interessierte")
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let schnupperant = Role::find_by_name(db, "schnupperant").await.unwrap();
|
||||||
|
self.user.remove_role(db, changed_by, &schnupperant).await?;
|
||||||
|
self.user
|
||||||
|
.add_role(db, changed_by, &schnupperinterest)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
if let Some(role) = Role::find_by_name(db, "schnupper-betreuer").await {
|
||||||
|
Notification::create_for_role(
|
||||||
|
db,
|
||||||
|
&role,
|
||||||
|
&format!(
|
||||||
|
"Lieber Schnupperbetreuer, {} hat sich vom Schnupperkurs abgemeldet.",
|
||||||
|
self.name
|
||||||
|
),
|
||||||
|
"Schnupperkurs Abmeldung",
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) async fn convert_to_unterstuetzend_user(
|
pub(crate) async fn convert_to_unterstuetzend_user(
|
||||||
self,
|
self,
|
||||||
db: &SqlitePool,
|
db: &SqlitePool,
|
||||||
@ -143,6 +181,11 @@ impl SchnupperantUser {
|
|||||||
let scheckbook = Role::find_by_name(db, "schnupperant").await.unwrap();
|
let scheckbook = Role::find_by_name(db, "schnupperant").await.unwrap();
|
||||||
self.user.remove_role(db, changed_by, &scheckbook).await?;
|
self.user.remove_role(db, changed_by, &scheckbook).await?;
|
||||||
self.user.add_role(db, changed_by, &unterstuetzend).await?;
|
self.user.add_role(db, changed_by, &unterstuetzend).await?;
|
||||||
|
if let Some(no_einschreibgebuehr) = Role::find_by_name(db, "no-einschreibgebuehr").await {
|
||||||
|
self.add_role(db, &changed_by, &no_einschreibgebuehr)
|
||||||
|
.await
|
||||||
|
.expect("role doesn't have a group");
|
||||||
|
}
|
||||||
|
|
||||||
let unterstuetzend = UnterstuetzendUser::new(db, &self.user).await.unwrap();
|
let unterstuetzend = UnterstuetzendUser::new(db, &self.user).await.unwrap();
|
||||||
unterstuetzend
|
unterstuetzend
|
||||||
@ -195,6 +238,11 @@ impl SchnupperantUser {
|
|||||||
let scheckbook = Role::find_by_name(db, "schnupperant").await.unwrap();
|
let scheckbook = Role::find_by_name(db, "schnupperant").await.unwrap();
|
||||||
self.user.remove_role(db, changed_by, &scheckbook).await?;
|
self.user.remove_role(db, changed_by, &scheckbook).await?;
|
||||||
self.user.add_role(db, changed_by, &unterstuetzend).await?;
|
self.user.add_role(db, changed_by, &unterstuetzend).await?;
|
||||||
|
if let Some(no_einschreibgebuehr) = Role::find_by_name(db, "no-einschreibgebuehr").await {
|
||||||
|
self.add_role(db, &changed_by, &no_einschreibgebuehr)
|
||||||
|
.await
|
||||||
|
.expect("role doesn't have a group");
|
||||||
|
}
|
||||||
|
|
||||||
let foerdernd = FoerderndUser::new(db, &self.user).await.unwrap();
|
let foerdernd = FoerderndUser::new(db, &self.user).await.unwrap();
|
||||||
foerdernd.send_welcome_mail_to_user(db, smtp_pw).await?;
|
foerdernd.send_welcome_mail_to_user(db, smtp_pw).await?;
|
||||||
@ -218,14 +266,9 @@ impl SchnupperantUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: make private
|
// TODO: make private
|
||||||
pub(crate) async fn notify(
|
pub(crate) async fn notify(&self, db: &SqlitePool, smtp_pw: &str) -> Result<(), String> {
|
||||||
&self,
|
|
||||||
db: &SqlitePool,
|
|
||||||
mail: &str,
|
|
||||||
smtp_pw: &str,
|
|
||||||
) -> Result<(), String> {
|
|
||||||
self.notify_coxes_about_new_scheckbuch(db).await;
|
self.notify_coxes_about_new_scheckbuch(db).await;
|
||||||
self.send_welcome_mail_to_user(db, mail, smtp_pw).await?;
|
self.send_welcome_mail_to_user(db, smtp_pw).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -233,13 +276,17 @@ impl SchnupperantUser {
|
|||||||
async fn send_welcome_mail_to_user(
|
async fn send_welcome_mail_to_user(
|
||||||
&self,
|
&self,
|
||||||
db: &SqlitePool,
|
db: &SqlitePool,
|
||||||
mail: &str,
|
|
||||||
smtp_pw: &str,
|
smtp_pw: &str,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
|
let Some(mail) = &self.mail else {
|
||||||
|
return Err(format!(
|
||||||
|
"Couldn't send mail, because user {self} has no mail"
|
||||||
|
));
|
||||||
|
};
|
||||||
Mail::send_single(
|
Mail::send_single(
|
||||||
db,
|
db,
|
||||||
mail,
|
&mail,
|
||||||
"ASKÖ Ruderverein Donau Linz | Dein Scheckbuch wartet auf Dich",
|
"ASKÖ Ruderverein Donau Linz | Anmeldung Schnupperkurs",
|
||||||
format!(
|
format!(
|
||||||
"Hallo {0},
|
"Hallo {0},
|
||||||
|
|
||||||
|
103
src/model/user/schnupperinterest.rs
Normal file
103
src/model/user/schnupperinterest.rs
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
use super::scheckbuch::ScheckbuchUser;
|
||||||
|
use super::schnupperant::SchnupperantUser;
|
||||||
|
use super::{ManageUserUser, User};
|
||||||
|
use crate::model::role::Role;
|
||||||
|
use crate::{model::notification::Notification, special_user};
|
||||||
|
use rocket::async_trait;
|
||||||
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
|
special_user!(SchnupperInterestUser, +"schnupper-interessierte");
|
||||||
|
|
||||||
|
impl SchnupperInterestUser {
|
||||||
|
pub(crate) async fn move_to_scheckbook(
|
||||||
|
self,
|
||||||
|
db: &SqlitePool,
|
||||||
|
changed_by: &ManageUserUser,
|
||||||
|
smtp_pw: &str,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
let schnupperinterest = Role::find_by_name(db, "schnupper-interessierte")
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let scheckbook = Role::find_by_name(db, "scheckbuch").await.unwrap();
|
||||||
|
self.user
|
||||||
|
.remove_role(db, changed_by, &schnupperinterest)
|
||||||
|
.await?;
|
||||||
|
self.user.add_role(db, changed_by, &scheckbook).await?;
|
||||||
|
|
||||||
|
let scheckbook = ScheckbuchUser::new(db, &self.user).await.unwrap();
|
||||||
|
scheckbook.send_welcome_mail_to_user(db, smtp_pw).await?;
|
||||||
|
|
||||||
|
Notification::create_for_steering_people(
|
||||||
|
db,
|
||||||
|
&format!(
|
||||||
|
"Liebe Steuerberechtigte, {} wollte unseren Schnupperkurs absolviert und nun ein Scheckbuch. Wie immer, freuen wir uns wenn du uns beim A+F Rudern unterstützt oder selber Ausfahrten ausschreibst. Bitte beachte, dass Scheckbuch-Personen nur Ausfahrten sehen, bei denen 'Scheckbuch-Anmeldungen erlauben' ausgewählt wurde.",
|
||||||
|
self.name
|
||||||
|
),
|
||||||
|
"Neues Scheckbuch",
|
||||||
|
None,
|
||||||
|
None
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn move_to_schnupperant(
|
||||||
|
self,
|
||||||
|
db: &SqlitePool,
|
||||||
|
changed_by: &ManageUserUser,
|
||||||
|
smtp_pw: &str,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
let schnupperinterest = Role::find_by_name(db, "schnupper-interessierte")
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let schnupperant = Role::find_by_name(db, "schnupperant").await.unwrap();
|
||||||
|
self.user
|
||||||
|
.remove_role(db, changed_by, &schnupperinterest)
|
||||||
|
.await?;
|
||||||
|
self.user.add_role(db, changed_by, &schnupperant).await?;
|
||||||
|
|
||||||
|
let schnupperant = SchnupperantUser::new(db, &self.user).await.unwrap();
|
||||||
|
schnupperant.notify(db, smtp_pw).await?;
|
||||||
|
|
||||||
|
if let Some(role) = Role::find_by_name(db, "schnupper-betreuer").await {
|
||||||
|
Notification::create_for_role(
|
||||||
|
db,
|
||||||
|
&role,
|
||||||
|
&format!(
|
||||||
|
"Lieber Schnupperbetreuer, {} hat sich zum Schnupperkurs angemeldet.",
|
||||||
|
self.name
|
||||||
|
),
|
||||||
|
"Neuer Schnupper-Interessierte:r",
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn notify(&self, db: &SqlitePool) -> Result<(), String> {
|
||||||
|
self.notify_schnupperbetreuer_about_new_interest(db).await;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn notify_schnupperbetreuer_about_new_interest(&self, db: &SqlitePool) {
|
||||||
|
if let Some(role) = Role::find_by_name(db, "schnupper-betreuer").await {
|
||||||
|
Notification::create_for_role(
|
||||||
|
db,
|
||||||
|
&role,
|
||||||
|
&format!(
|
||||||
|
"Lieber Schnupperbetreuer, {} hat Interesse zum Schnupperkurs bekundet.",
|
||||||
|
self.name
|
||||||
|
),
|
||||||
|
"Neuer Schnupper-Interessierte:r",
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -8,9 +8,9 @@ use crate::{
|
|||||||
role::Role,
|
role::Role,
|
||||||
user::{
|
user::{
|
||||||
clubmember::ClubMemberUser, member::Member, scheckbuch::ScheckbuchUser,
|
clubmember::ClubMemberUser, member::Member, scheckbuch::ScheckbuchUser,
|
||||||
schnupperant::SchnupperantUser, AdminUser, AllowedToEditPaymentStatusUser,
|
schnupperant::SchnupperantUser, schnupperinterest::SchnupperInterestUser, AdminUser,
|
||||||
ManageUserUser, User, UserWithDetails, UserWithMembershipPdf,
|
AllowedToEditPaymentStatusUser, ManageUserUser, User, UserWithDetails,
|
||||||
UserWithRolesAndMembershipPdf, VorstandUser,
|
UserWithMembershipPdf, UserWithRolesAndMembershipPdf, VorstandUser,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
tera::Config,
|
tera::Config,
|
||||||
@ -765,56 +765,6 @@ struct UserAddScheckbuchForm<'r> {
|
|||||||
// Flash::success(Redirect::to("/admin/user/scheckbuch"), format!("Scheckbuch erfolgreich erstellt. Eine E-Mail in der alles erklärt wird, wurde an {mail} verschickt."))
|
// Flash::success(Redirect::to("/admin/user/scheckbuch"), format!("Scheckbuch erfolgreich erstellt. Eine E-Mail in der alles erklärt wird, wurde an {mail} verschickt."))
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//#[get("/user/move/schnupperant/<id>/to/scheckbuch")]
|
|
||||||
//async fn schnupper_to_scheckbuch(
|
|
||||||
// db: &State<SqlitePool>,
|
|
||||||
// id: i32,
|
|
||||||
// admin: SchnupperBetreuerUser,
|
|
||||||
// config: &State<Config>,
|
|
||||||
//) -> Flash<Redirect> {
|
|
||||||
// let Some(user) = User::find_by_id(db, id).await else {
|
|
||||||
// return Flash::error(
|
|
||||||
// Redirect::to("/admin/schnupper"),
|
|
||||||
// "user id not found".to_string(),
|
|
||||||
// );
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
// if !user.has_role(db, "schnupperant").await {
|
|
||||||
// return Flash::error(
|
|
||||||
// Redirect::to("/admin/schnupper"),
|
|
||||||
// "kein schnupperant...".to_string(),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// let schnupperant = Role::find_by_name(db, "schnupperant").await.unwrap();
|
|
||||||
// let paid = Role::find_by_name(db, "paid").await.unwrap();
|
|
||||||
// user.remove_role(db, &schnupperant).await;
|
|
||||||
// user.remove_role(db, &paid).await;
|
|
||||||
//
|
|
||||||
// let scheckbuch = Role::find_by_name(db, "scheckbuch").await.unwrap();
|
|
||||||
// user.add_role(db, &scheckbuch)
|
|
||||||
// .await
|
|
||||||
// .expect("just removed 'schnupperant' thus can't have a role with that group");
|
|
||||||
//
|
|
||||||
// if let Some(no_einschreibgebuehr) = Role::find_by_name(db, "no-einschreibgebuehr").await {
|
|
||||||
// user.add_role(db, &no_einschreibgebuehr)
|
|
||||||
// .await
|
|
||||||
// .expect("role doesn't have a group");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// user.send_welcome_email(db, &config.smtp_pw).await.unwrap();
|
|
||||||
//
|
|
||||||
// Log::create(
|
|
||||||
// db,
|
|
||||||
// format!(
|
|
||||||
// "{} created new scheckbuch (from schnupperant): {}",
|
|
||||||
// admin.name, user.name
|
|
||||||
// ),
|
|
||||||
// )
|
|
||||||
// .await;
|
|
||||||
// Flash::success(Redirect::to("/admin/schnupper"), format!("Scheckbuch erfolgreich erstellt. Eine E-Mail in der alles erklärt wird, wurde an {} verschickt.", user.mail.unwrap()))
|
|
||||||
//}
|
|
||||||
|
|
||||||
#[derive(FromForm, Debug)]
|
#[derive(FromForm, Debug)]
|
||||||
pub struct SchnupperantToRegularForm<'a> {
|
pub struct SchnupperantToRegularForm<'a> {
|
||||||
membertype: String,
|
membertype: String,
|
||||||
@ -1130,6 +1080,94 @@ async fn schnupperant_to_scheckbook(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[get("/user/<id>/schnupperinterest-to-schnupperant")]
|
||||||
|
async fn schnupperinterest_to_schnupperant(
|
||||||
|
db: &State<SqlitePool>,
|
||||||
|
admin: ManageUserUser,
|
||||||
|
config: &State<Config>,
|
||||||
|
id: i32,
|
||||||
|
) -> Flash<Redirect> {
|
||||||
|
let Some(user) = User::find_by_id(db, id).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to("/admin/user"),
|
||||||
|
format!("User with ID {} does not exist!", id),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(user) = SchnupperInterestUser::new(&db, &user).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to(format!("/admin/user/{id}")),
|
||||||
|
format!("User {user} ist kein Schnupperinteressierter"),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
match user.move_to_schnupperant(db, &admin, &config.smtp_pw).await {
|
||||||
|
Ok(_) => Flash::success(
|
||||||
|
Redirect::to(format!("/admin/user/{}", id)),
|
||||||
|
"Mitgliedstyp umgewandelt und Infos versendet",
|
||||||
|
),
|
||||||
|
Err(e) => Flash::error(Redirect::to(format!("/admin/user/{}", id)), e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/user/<id>/schnupperant-to-schnupperinterest")]
|
||||||
|
async fn schnupperant_to_schnupperinterest(
|
||||||
|
db: &State<SqlitePool>,
|
||||||
|
admin: ManageUserUser,
|
||||||
|
id: i32,
|
||||||
|
) -> Flash<Redirect> {
|
||||||
|
let Some(user) = User::find_by_id(db, id).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to("/admin/user"),
|
||||||
|
format!("User with ID {} does not exist!", id),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(user) = SchnupperantUser::new(&db, &user).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to(format!("/admin/user/{id}")),
|
||||||
|
format!("User {user} ist kein Schnupperant"),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
match user.move_to_schnupperinterest(db, &admin).await {
|
||||||
|
Ok(_) => Flash::success(
|
||||||
|
Redirect::to(format!("/admin/user/{}", id)),
|
||||||
|
"Mitgliedstyp umgewandelt.",
|
||||||
|
),
|
||||||
|
Err(e) => Flash::error(Redirect::to(format!("/admin/user/{}", id)), e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[get("/user/<id>/schnupperinterest-to-scheckbuch")]
|
||||||
|
async fn schnupperinterest_to_scheckbuch(
|
||||||
|
db: &State<SqlitePool>,
|
||||||
|
admin: ManageUserUser,
|
||||||
|
config: &State<Config>,
|
||||||
|
id: i32,
|
||||||
|
) -> Flash<Redirect> {
|
||||||
|
let Some(user) = User::find_by_id(db, id).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to("/admin/user"),
|
||||||
|
format!("User with ID {} does not exist!", id),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(user) = SchnupperInterestUser::new(&db, &user).await else {
|
||||||
|
return Flash::error(
|
||||||
|
Redirect::to(format!("/admin/user/{id}")),
|
||||||
|
format!("User {user} ist kein Schnupperinteressierter"),
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
match user.move_to_scheckbook(db, &admin, &config.smtp_pw).await {
|
||||||
|
Ok(_) => Flash::success(
|
||||||
|
Redirect::to(format!("/admin/user/{}", id)),
|
||||||
|
"Mitgliedstyp umgewandelt und Infos versendet",
|
||||||
|
),
|
||||||
|
Err(e) => Flash::error(Redirect::to(format!("/admin/user/{}", id)), e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn routes() -> Vec<Route> {
|
pub fn routes() -> Vec<Route> {
|
||||||
routes![
|
routes![
|
||||||
index,
|
index,
|
||||||
@ -1139,7 +1177,6 @@ pub fn routes() -> Vec<Route> {
|
|||||||
update,
|
update,
|
||||||
create,
|
create,
|
||||||
//create_scheckbuch,
|
//create_scheckbuch,
|
||||||
//schnupper_to_scheckbuch,
|
|
||||||
delete,
|
delete,
|
||||||
fees,
|
fees,
|
||||||
fees_paid,
|
fees_paid,
|
||||||
@ -1161,6 +1198,9 @@ pub fn routes() -> Vec<Route> {
|
|||||||
scheckbook_to_regular,
|
scheckbook_to_regular,
|
||||||
schnupperant_to_regular,
|
schnupperant_to_regular,
|
||||||
schnupperant_to_scheckbook,
|
schnupperant_to_scheckbook,
|
||||||
|
schnupperinterest_to_schnupperant,
|
||||||
|
schnupperant_to_schnupperinterest,
|
||||||
|
schnupperinterest_to_scheckbuch,
|
||||||
change_membertype,
|
change_membertype,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,7 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
{% if "admin" in loggedin_user.roles or "Vorstand" in loggedin_user.roles %}
|
{% if "admin" in loggedin_user.roles or "Vorstand" in loggedin_user.roles %}
|
||||||
<a href="/admin/user"
|
<a href="/admin/user" class="link link-primary link-no-underline">← Userverwaltung</a>
|
||||||
class="link link-primary link-no-underline">← Userverwaltung</a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<h1 class="h1">{{ user.name }}</h1>
|
<h1 class="h1">{{ user.name }}</h1>
|
||||||
<div class="grid sm:grid-cols-2 gap-3">
|
<div class="grid sm:grid-cols-2 gap-3">
|
||||||
@ -82,7 +81,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="py-3">
|
<div class="py-3">
|
||||||
{% if user.membership_pdf %}
|
{% if user.membership_pdf %}
|
||||||
<a href="/admin/user/{{ user.id }}/membership" class="link link-primary link-no-underline">Beitrittserklärung herunterladen ↓</a>
|
<a href="/admin/user/{{ user.id }}/membership"
|
||||||
|
class="link link-primary link-no-underline">Beitrittserklärung herunterladen ↓</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
⚠️ Aktuell gibt's keine Beitrittserklärung 😢
|
⚠️ Aktuell gibt's keine Beitrittserklärung 😢
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
@ -103,8 +103,8 @@
|
|||||||
<div class="py-3">
|
<div class="py-3">
|
||||||
<div class="mt-3 text-right">
|
<div class="mt-3 text-right">
|
||||||
<button type="button"
|
<button type="button"
|
||||||
onclick="document.getElementById('change-member-type').showModal()"
|
onclick="document.getElementById('change-member-type').showModal()"
|
||||||
class="btn btn-dark">Mitgliedsstatus ändern</button>
|
class="btn btn-dark">Mitgliedsstatus ändern</button>
|
||||||
<a href="/admin/user/{{ user.id }}/delete"
|
<a href="/admin/user/{{ user.id }}/delete"
|
||||||
class="btn btn-alert"
|
class="btn btn-alert"
|
||||||
onclick="return confirm('Ist {{ user.name }} wirklich aus dem Verein ausgetreten?');">
|
onclick="return confirm('Ist {{ user.name }} wirklich aus dem Verein ausgetreten?');">
|
||||||
@ -113,119 +113,158 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<dialog id="change-member-type"
|
<dialog id="change-member-type"
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-600 dark:text-white rounded-md"
|
class="max-w-screen-sm w-full dark:bg-primary-600 dark:text-white rounded-md"
|
||||||
onclick="document.getElementById('change-member-type').close()">
|
onclick="document.getElementById('change-member-type').close()">
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
<div onclick="event.stopPropagation();" class="p-3">
|
||||||
<button type="button"
|
<button type="button"
|
||||||
onclick="document.getElementById('change-member-type').close()"
|
onclick="document.getElementById('change-member-type').close()"
|
||||||
title="Schließen"
|
title="Schließen"
|
||||||
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
||||||
<svg class="inline h-5 w-5"
|
<svg class="inline h-5 w-5"
|
||||||
width="16"
|
width="16"
|
||||||
height="16"
|
height="16"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
viewBox="0 0 16 16">
|
viewBox="0 0 16 16">
|
||||||
<path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"></path>
|
<path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"></path>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
<div class="mt-8">
|
<div class="mt-8">
|
||||||
<form action="/admin/user/{{ user.id }}/change-membertype"
|
<form action="/admin/user/{{ user.id }}/change-membertype"
|
||||||
method="post"
|
method="post"
|
||||||
enctype="multipart/form-data"
|
enctype="multipart/form-data"
|
||||||
class="grid gap-3">
|
class="grid gap-3">
|
||||||
<div>
|
<div>
|
||||||
<label for="membertype" class="text-sm text-gray-600 dark:text-gray-100">Mitgliedsstatus</label>
|
<label for="membertype" class="text-sm text-gray-600 dark:text-gray-100">Mitgliedsstatus</label>
|
||||||
<select name="membertype" id="membertype" class="input rounded-md ">
|
<select name="membertype" id="membertype" class="input rounded-md ">
|
||||||
<option selected="" value="regular">Reguläres Vereinsmitglied</option>
|
<option selected="" value="regular">Reguläres Vereinsmitglied</option>
|
||||||
<option value="unterstuetzend">Unterstützendes Vereinsmitglied</option>
|
<option value="unterstuetzend">Unterstützendes Vereinsmitglied</option>
|
||||||
<option value="foerdernd">Förderndes Vereinsmitglied</option>
|
<option value="foerdernd">Förderndes Vereinsmitglied</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<input value="Ändern"
|
<input value="Ändern" type="submit" class="btn btn-primary" />
|
||||||
type="submit"
|
</form>
|
||||||
class="btn btn-primary" />
|
</div>
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</dialog>
|
||||||
</dialog>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% elif "Scheckbuch" in member %}
|
{% elif "Scheckbuch" in member %}
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<div class="grid gap-3 pb-3">
|
<div class="grid gap-3 pb-3">
|
||||||
<div class="max-h-60 overflow-y-scroll">
|
<div class="max-h-60 overflow-y-scroll">
|
||||||
{% for log in logbook %}
|
{% for log in logbook %}
|
||||||
{{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index, allowed_to_edit=false) }}
|
{{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index, allowed_to_edit=false) }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% elif "SchnupperInterest" in member %}
|
||||||
|
{% if allowed_to_edit %}
|
||||||
|
<div class="grid pt-3">
|
||||||
|
<a href="/admin/user/{{ user.id }}/schnupperinterest-to-scheckbuch"
|
||||||
|
class="btn btn-dark"
|
||||||
|
onclick="return confirm('Willst du \'{{ user.name }}\' wirklich auf ein Scheckbuch umwandeln?');">In Scheckbuch umwandeln</a>
|
||||||
|
</div>
|
||||||
|
<div class="grid pt-3">
|
||||||
|
<a href="/admin/user/{{ user.id }}/schnupperinterest-to-schnupperant"
|
||||||
|
class="btn btn-dark"
|
||||||
|
onclick="return confirm('Hat sich \'{{ user.name }}\' wirklich zum Kurs angemeldet?');">Zum Schnupperkurs angemeldet</a>
|
||||||
|
</div>
|
||||||
|
<div class="grid pt-3">
|
||||||
|
<a href="/admin/user/{{ user.id }}/delete"
|
||||||
|
class="btn btn-alert"
|
||||||
|
onclick="return confirm('Ist {{ user.name }} wirklich nicht mehr am Schnupperkurs interessiert?');">
|
||||||
|
{% include "includes/delete-icon" %}
|
||||||
|
Daten löschen
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% elif "Schnupperant" in member %}
|
{% elif "Schnupperant" in member %}
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<div class="grid pt-3">
|
<div class="grid pt-3">
|
||||||
<a href="/admin/user/{{ user.id }}/schnupperant-to-scheckbuch" class="btn btn-dark"
|
<a href="/admin/user/{{ user.id }}/schnupperant-to-schnupperinterest"
|
||||||
onclick="return confirm('Willst du \'{{ user.name }}\' wirklich auf ein Scheckbuch umwandeln?');">In Scheckbuch umwandeln</a>
|
class="btn btn-dark"
|
||||||
</div>
|
onclick="return confirm('Hat sich \'{{ user.name }}\' wirklich vom Schnupperkurs abgemeldet?');">Vom Kurs abgemeldet</a>
|
||||||
{% endif %}
|
</div>
|
||||||
{% endif %}
|
<div class="grid pt-3">
|
||||||
|
<a href="/admin/user/{{ user.id }}/schnupperant-to-scheckbuch"
|
||||||
{% if "Scheckbuch" in member or "Schnupperant" in member %}
|
class="btn btn-dark"
|
||||||
{% if allowed_to_edit %}
|
onclick="return confirm('Willst du \'{{ user.name }}\' wirklich auf ein Scheckbuch umwandeln?');">In Scheckbuch umwandeln</a>
|
||||||
<div class="grid gap-3 pb-3 mt-3">
|
</div>
|
||||||
<button type="button"
|
<div class="grid pt-3">
|
||||||
onclick="document.getElementById('call-for-action').showModal()"
|
<a href="/admin/user/{{ user.id }}/delete"
|
||||||
class="btn btn-primary">Zu Vereinsmitglied umwandeln</button>
|
class="btn btn-alert"
|
||||||
</div>
|
onclick="return confirm('Ist {{ user.name }} wirklich nicht mehr am Schnupperkurs interessiert?');">
|
||||||
<dialog id="call-for-action"
|
{% include "includes/delete-icon" %}
|
||||||
class="max-w-screen-sm w-full dark:bg-primary-600 dark:text-white rounded-md"
|
Daten löschen
|
||||||
onclick="document.getElementById('call-for-action').close()">
|
</a>
|
||||||
<div onclick="event.stopPropagation();" class="p-3">
|
|
||||||
<button type="button"
|
|
||||||
onclick="document.getElementById('call-for-action').close()"
|
|
||||||
title="Schließen"
|
|
||||||
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
|
||||||
<svg class="inline h-5 w-5"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
fill="currentColor"
|
|
||||||
viewBox="0 0 16 16">
|
|
||||||
<path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"></path>
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
<div class="mt-8">
|
|
||||||
{% if "Scheckbuch" in member %}
|
|
||||||
{% set action = 'scheckbook-to-regular' %}
|
|
||||||
{% elif "Schnupperant" in member %}
|
|
||||||
{% set action = 'schnupperant-to-regular' %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<form action="/admin/user/{{ user.id }}/{{ action }}"
|
|
||||||
method="post"
|
|
||||||
enctype="multipart/form-data"
|
|
||||||
class="grid gap-3">
|
|
||||||
<div>
|
|
||||||
<label for="membertype" class="text-sm text-gray-600 dark:text-gray-100">Mitgliedstyp</label>
|
|
||||||
<select name="membertype" id="membertype" class="input rounded-md ">
|
|
||||||
<option selected="" value="regular">Reguläres Vereinsmitglied</option>
|
|
||||||
<option value="unterstuetzend">Unterstützendes Vereinsmitglied</option>
|
|
||||||
<option value="foerdernd">Förderndes Vereinsmitglied</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
{{ macros::input(label='Mitglied seit', name='member_since', type="date", value=now() | date(), required=true) }}
|
|
||||||
{{ macros::input(label='Geburtsdatum', name='birthdate', type="date", value=user.birthdate, required=true) }}
|
|
||||||
{{ macros::input(label='Telefonnummer', name='phone', type="text", value=user.phone, required=true) }}
|
|
||||||
{{ macros::input(label='Adresse', name='address', type="text", value=user.address, required=true) }}
|
|
||||||
{{ macros::input(label='Beitrittserklärung', name='membership_pdf', type="file", accept='application/pdf', required=true) }}
|
|
||||||
<input value="Als neues, reguläres Mitglied anlegen"
|
|
||||||
type="submit"
|
|
||||||
class="btn btn-primary" />
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</dialog>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
{% if "Scheckbuch" in member or "Schnupperant" in member %}
|
||||||
|
{% if allowed_to_edit %}
|
||||||
|
<div class="grid gap-3 pb-3 mt-3">
|
||||||
|
<button type="button"
|
||||||
|
onclick="document.getElementById('call-for-action').showModal()"
|
||||||
|
class="btn btn-primary">Zu Vereinsmitglied umwandeln</button>
|
||||||
|
</div>
|
||||||
|
<dialog id="call-for-action"
|
||||||
|
class="max-w-screen-sm w-full dark:bg-primary-600 dark:text-white rounded-md"
|
||||||
|
onclick="document.getElementById('call-for-action').close()">
|
||||||
|
<div onclick="event.stopPropagation();" class="p-3">
|
||||||
|
<button type="button"
|
||||||
|
onclick="document.getElementById('call-for-action').close()"
|
||||||
|
title="Schließen"
|
||||||
|
class="sidebar-close border-0 bg-primary-100 focus:bg-primary-50 text-black flex items-center justify-center transform rotate-45 absolute right-0 mr-3">
|
||||||
|
<svg class="inline h-5 w-5"
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
fill="currentColor"
|
||||||
|
viewBox="0 0 16 16">
|
||||||
|
<path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div class="mt-8">
|
||||||
|
{% if "Scheckbuch" in member %}
|
||||||
|
{% set action = "scheckbook-to-regular" %}
|
||||||
|
{% elif "Schnupperant" in member %}
|
||||||
|
{% set action = "schnupperant-to-regular" %}
|
||||||
|
{% endif %}
|
||||||
|
<form action="/admin/user/{{ user.id }}/{{ action }}"
|
||||||
|
method="post"
|
||||||
|
enctype="multipart/form-data"
|
||||||
|
class="grid gap-3">
|
||||||
|
<div>
|
||||||
|
<label for="membertype" class="text-sm text-gray-600 dark:text-gray-100">Mitgliedstyp</label>
|
||||||
|
<select name="membertype" id="membertype" class="input rounded-md ">
|
||||||
|
<option selected="" value="regular">Reguläres Vereinsmitglied</option>
|
||||||
|
<option value="unterstuetzend">Unterstützendes Vereinsmitglied</option>
|
||||||
|
<option value="foerdernd">Förderndes Vereinsmitglied</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{{ macros::input(label='Mitglied seit', name='member_since', type="date", value=now() | date(), required=true) }}
|
||||||
|
{{ macros::input(label='Geburtsdatum', name='birthdate', type="date", value=user.birthdate, required=true) }}
|
||||||
|
{{ macros::input(label='Telefonnummer', name='phone', type="text", value=user.phone, required=true) }}
|
||||||
|
{{ macros::input(label='Adresse', name='address', type="text", value=user.address, required=true) }}
|
||||||
|
{{ macros::input(label='Beitrittserklärung', name='membership_pdf', type="file", accept='application/pdf', required=true) }}
|
||||||
|
<input value="Als neues, reguläres Mitglied anlegen"
|
||||||
|
type="submit"
|
||||||
|
class="btn btn-primary" />
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</dialog>
|
||||||
|
<div class="grid pt-3">
|
||||||
|
<a href="/admin/user/{{ user.id }}/delete"
|
||||||
|
class="btn btn-alert"
|
||||||
|
onclick="return confirm('Willst du die Daten von {{ user.name }} wirklich? Seine restlichen Scheckbuch-Ausfahrten entfallen damit...');">
|
||||||
|
{% include "includes/delete-icon" %}
|
||||||
|
Daten löschen
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% if is_clubmember %}
|
{% if is_clubmember %}
|
||||||
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5">
|
||||||
|
@ -199,8 +199,8 @@ function setChoiceByLabel(choicesInstance, label) {
|
|||||||
readonly />
|
readonly />
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<button type="button" class="btn btn-dark rounded-l-none-important edit-js">
|
<button type="button" class="btn btn-dark rounded-l-none-important edit-js">
|
||||||
{% include "includes/pencil" %}
|
{% include "includes/pencil" %}
|
||||||
<span class="sr-only">Bearbeiten</span>
|
<span class="sr-only">Bearbeiten</span>
|
||||||
</button>
|
</button>
|
||||||
<input value="x"
|
<input value="x"
|
||||||
type="reset"
|
type="reset"
|
||||||
@ -248,8 +248,8 @@ function setChoiceByLabel(choicesInstance, label) {
|
|||||||
</select>
|
</select>
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<button type="button" class="btn btn-dark rounded-l-none-important edit-js">
|
<button type="button" class="btn btn-dark rounded-l-none-important edit-js">
|
||||||
{% include "includes/pencil" %}
|
{% include "includes/pencil" %}
|
||||||
<span class="sr-only">Bearbeiten</span>
|
<span class="sr-only">Bearbeiten</span>
|
||||||
</button>
|
</button>
|
||||||
<input value="x"
|
<input value="x"
|
||||||
type="reset"
|
type="reset"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user