create member type
This commit is contained in:
parent
19887e133d
commit
b2e07653e6
@ -2,14 +2,14 @@ use std::ops::DerefMut;
|
|||||||
|
|
||||||
use chrono::{Datelike, Duration, Local, NaiveDateTime};
|
use chrono::{Datelike, Duration, Local, NaiveDateTime};
|
||||||
use rocket::FromForm;
|
use rocket::FromForm;
|
||||||
use serde::Serialize;
|
use serde::{Deserialize, Serialize};
|
||||||
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
use sqlx::{FromRow, Sqlite, SqlitePool, Transaction};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
boat::Boat, log::Log, notification::Notification, role::Role, rower::Rower, user::User,
|
boat::Boat, log::Log, notification::Notification, role::Role, rower::Rower, user::User,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(FromRow, Serialize, Clone, Debug)]
|
#[derive(FromRow, Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct Logbook {
|
pub struct Logbook {
|
||||||
pub id: i64,
|
pub id: i64,
|
||||||
pub boat_id: i64,
|
pub boat_id: i64,
|
||||||
@ -105,7 +105,7 @@ impl TryFrom<LogToAdd> for LogToFinalize {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct LogbookWithBoatAndRowers {
|
pub struct LogbookWithBoatAndRowers {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub logbook: Logbook,
|
pub logbook: Logbook,
|
||||||
|
44
src/model/user/member.rs
Normal file
44
src/model/user/member.rs
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
use super::ScheckbuchUser;
|
||||||
|
use crate::model::{
|
||||||
|
logbook::{Logbook, LogbookWithBoatAndRowers},
|
||||||
|
user::User,
|
||||||
|
};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub(crate) enum Member {
|
||||||
|
SchnupperInterest(User),
|
||||||
|
Schnupperant(User),
|
||||||
|
Scheckbuch(Vec<LogbookWithBoatAndRowers>),
|
||||||
|
Regular(User),
|
||||||
|
Foerdernd(User),
|
||||||
|
Unterstuetzend(User),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Member {
|
||||||
|
pub(crate) async fn from(db: &SqlitePool, user: User) -> Self {
|
||||||
|
if ScheckbuchUser::new(db, &user).await.is_some() {
|
||||||
|
Self::Scheckbuch(Logbook::completed_with_user(db, &user).await)
|
||||||
|
} else if user.has_role(db, "schnupper-interessierte").await {
|
||||||
|
Self::SchnupperInterest(user)
|
||||||
|
} else if user.has_role(db, "schnupperant").await {
|
||||||
|
Self::Schnupperant(user)
|
||||||
|
} else if user.has_role(db, "Donau Linz").await {
|
||||||
|
Self::Regular(user)
|
||||||
|
} else if user.has_role(db, "Förderndes Mitglied").await {
|
||||||
|
Self::Foerdernd(user)
|
||||||
|
} else if user.has_role(db, "Unterstützend").await {
|
||||||
|
Self::Unterstuetzend(user)
|
||||||
|
} else {
|
||||||
|
panic!("User {user} has no membership_type!!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_club_member(&self) -> bool {
|
||||||
|
match self {
|
||||||
|
Member::Regular(_) | Member::Foerdernd(_) | Member::Unterstuetzend(_) => true,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -34,6 +34,7 @@ use scheckbuch::ScheckbuchUser;
|
|||||||
|
|
||||||
mod basic;
|
mod basic;
|
||||||
mod fee;
|
mod fee;
|
||||||
|
pub(crate) mod member;
|
||||||
mod scheckbuch;
|
mod scheckbuch;
|
||||||
|
|
||||||
#[derive(FromRow, Serialize, Deserialize, Clone, Debug, Eq, Hash, PartialEq)]
|
#[derive(FromRow, Serialize, Deserialize, Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
@ -1015,7 +1016,6 @@ special_user!(AllowedToEditPaymentStatusUser, +"kassier", +"admin");
|
|||||||
special_user!(ManageUserUser, +"admin", +"schriftfuehrer");
|
special_user!(ManageUserUser, +"admin", +"schriftfuehrer");
|
||||||
special_user!(AllowedToSendFeeReminderUser, +"admin", +"schriftfuehrer", +"kassier");
|
special_user!(AllowedToSendFeeReminderUser, +"admin", +"schriftfuehrer", +"kassier");
|
||||||
special_user!(AllowedToUpdateTripToAlwaysBeShownUser, +"admin");
|
special_user!(AllowedToUpdateTripToAlwaysBeShownUser, +"admin");
|
||||||
special_user!(ClubMember, +"Donau Linz");
|
|
||||||
|
|
||||||
#[derive(FromRow, Serialize, Deserialize, Clone, Debug)]
|
#[derive(FromRow, Serialize, Deserialize, Clone, Debug)]
|
||||||
pub struct UserWithRolesAndMembershipPdf {
|
pub struct UserWithRolesAndMembershipPdf {
|
||||||
|
@ -7,7 +7,7 @@ use crate::{
|
|||||||
logbook::Logbook,
|
logbook::Logbook,
|
||||||
role::Role,
|
role::Role,
|
||||||
user::{
|
user::{
|
||||||
AdminUser, AllowedToEditPaymentStatusUser, ClubMember, ManageUserUser, User,
|
member::Member, AdminUser, AllowedToEditPaymentStatusUser, ManageUserUser, User,
|
||||||
UserWithDetails, UserWithMembershipPdf, UserWithRolesAndMembershipPdf, VorstandUser,
|
UserWithDetails, UserWithMembershipPdf, UserWithRolesAndMembershipPdf, VorstandUser,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -125,7 +125,8 @@ async fn view(
|
|||||||
format!("User mit ID {} gibts ned", user),
|
format!("User mit ID {} gibts ned", user),
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
let clubmember = ClubMember::new(db, &user).await;
|
|
||||||
|
let member = Member::from(db, user.clone()).await;
|
||||||
|
|
||||||
let user = UserWithRolesAndMembershipPdf::from_user(db, user).await;
|
let user = UserWithRolesAndMembershipPdf::from_user(db, user).await;
|
||||||
|
|
||||||
@ -141,7 +142,8 @@ async fn view(
|
|||||||
}
|
}
|
||||||
context.insert("allowed_to_edit", &allowed_to_edit);
|
context.insert("allowed_to_edit", &allowed_to_edit);
|
||||||
context.insert("user", &user);
|
context.insert("user", &user);
|
||||||
context.insert("clubmember", &clubmember);
|
context.insert("is_clubmember", &member.is_club_member());
|
||||||
|
context.insert("member", &member);
|
||||||
context.insert("roles", &roles);
|
context.insert("roles", &roles);
|
||||||
context.insert("families", &families);
|
context.insert("families", &families);
|
||||||
context.insert(
|
context.insert(
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{% import "includes/macros" as macros %}
|
{% import "includes/macros" as macros %}
|
||||||
|
{% import "includes/forms/log" as log %}
|
||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="max-w-screen-lg w-full">
|
<div class="max-w-screen-lg w-full">
|
||||||
@ -90,98 +91,127 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% if 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"
|
||||||
role="alert">
|
role="alert">
|
||||||
<h2 class="h2">Vereinsmitglied</h2>
|
<h2 class="h2">Vereinsmitglied</h2>
|
||||||
<div class="mx-2 divide-y divide-gray-200 dark:divide-primary-600">
|
<div class="mx-2 divide-y divide-gray-200 dark:divide-primary-600">
|
||||||
<div class="py-3">
|
<div class="py-3">
|
||||||
<ul class="list-disc ms-4">
|
<ul class="list-disc ms-4">
|
||||||
<li>
|
<li>
|
||||||
Mitglied seit: {{ user.member_since_date }}
|
Mitglied seit: {{ user.member_since_date }}
|
||||||
|
{% if allowed_to_edit %}
|
||||||
|
<details>
|
||||||
|
<summary>✏️</summary>
|
||||||
|
<form action="/admin/user/{{ user.id }}/change-member-since" method="post">
|
||||||
|
{{ macros::input(label='Mitglied seit', name='member_since', type="date", value=user.member_since_date) }}
|
||||||
|
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
||||||
|
</form>
|
||||||
|
</details>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Geburtsdatum: {{ user.birthdate }}
|
||||||
|
{% if allowed_to_edit %}
|
||||||
|
<details>
|
||||||
|
<summary>✏️</summary>
|
||||||
|
<form action="/admin/user/{{ user.id }}/change-birthdate" method="post">
|
||||||
|
{{ macros::input(label='Geburtstag', name='birthdate', type="date", value=user.birthdate) }}
|
||||||
|
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
||||||
|
</form>
|
||||||
|
</details>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Adresse: {{ user.address }}
|
||||||
|
{% if allowed_to_edit %}
|
||||||
|
<details>
|
||||||
|
<summary>✏️</summary>
|
||||||
|
<form action="/admin/user/{{ user.id }}/change-address" method="post">
|
||||||
|
{{ macros::input(label='Neue Adresse', name='address', type="text", value=user.address) }}
|
||||||
|
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
||||||
|
</form>
|
||||||
|
</details>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Familie:
|
||||||
|
{% for family in families %}
|
||||||
|
{% if user.family_id == family.id %}{{ family.names }}{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if allowed_to_edit %}
|
||||||
|
<details>
|
||||||
|
<summary>✏️</summary>
|
||||||
|
<form action="/admin/user/{{ user.id }}/change-family" method="post">
|
||||||
|
{{ macros::select(label="Familie", data=families, name='family_id', selected_id=user.family_id, display=['names'], default="Keine Familie", new_last_entry='Neue Familie anlegen') }}
|
||||||
|
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
||||||
|
</form>
|
||||||
|
</details>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="py-3">
|
||||||
|
{% if user.membership_pdf %}
|
||||||
|
<a href="/admin/user/{{ user.id }}/membership"
|
||||||
|
class="text-black dark:text-white">Beitrittserklärung</a>
|
||||||
|
{% else %}
|
||||||
|
⚠️ Aktuell gibt's keine Beitrittserklärung 😢
|
||||||
{% if allowed_to_edit %}
|
{% if allowed_to_edit %}
|
||||||
<details>
|
Das kannst du hier ändern ⤵️
|
||||||
<summary>✏️</summary>
|
<form action="/admin/user/{{ user.id }}/add-membership-pdf" method="post">
|
||||||
<form action="/admin/user/{{ user.id }}/change-member-since" method="post">
|
<fieldset>
|
||||||
{{ macros::input(label='Mitglied seit', name='member_since', type="date", value=user.member_since_date) }}
|
{{ macros::input(label='Neue Beitrittserklärung hochladen', name='membership_pdf', type="file", accept='application/pdf') }}
|
||||||
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
<input value="Hochladen" type="submit" class="btn btn-primary ml-1" />
|
||||||
</form>
|
</fieldset>
|
||||||
</details>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Geburtsdatum: {{ user.birthdate }}
|
|
||||||
{% if allowed_to_edit %}
|
|
||||||
<details>
|
|
||||||
<summary>✏️</summary>
|
|
||||||
<form action="/admin/user/{{ user.id }}/change-birthdate" method="post">
|
|
||||||
{{ macros::input(label='Geburtstag', name='birthdate', type="date", value=user.birthdate) }}
|
|
||||||
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
|
||||||
</form>
|
|
||||||
</details>
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Adresse: {{ user.address }}
|
|
||||||
{% if allowed_to_edit %}
|
|
||||||
<details>
|
|
||||||
<summary>✏️</summary>
|
|
||||||
<form action="/admin/user/{{ user.id }}/change-address" method="post">
|
|
||||||
{{ macros::input(label='Neue Adresse', name='address', type="text", value=user.address) }}
|
|
||||||
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
|
||||||
</form>
|
|
||||||
</details>
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Familie:
|
|
||||||
{% for family in families %}
|
|
||||||
{% if user.family_id == family.id %}{{ family.names }}{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% if allowed_to_edit %}
|
|
||||||
<details>
|
|
||||||
<summary>✏️</summary>
|
|
||||||
<form action="/admin/user/{{ user.id }}/change-family" method="post">
|
|
||||||
{{ macros::select(label="Familie", data=families, name='family_id', selected_id=user.family_id, display=['names'], default="Keine Familie", new_last_entry='Neue Familie anlegen') }}
|
|
||||||
<input value="Ändern" type="submit" class="btn btn-primary ml-1" />
|
|
||||||
</form>
|
|
||||||
</details>
|
|
||||||
{% endif %}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="py-3">
|
|
||||||
{% if user.membership_pdf %}
|
|
||||||
<a href="/admin/user/{{ user.id }}/membership"
|
|
||||||
class="text-black dark:text-white">Beitrittserklärung</a>
|
|
||||||
{% else %}
|
|
||||||
⚠️ Aktuell gibt's keine Beitrittserklärung 😢
|
|
||||||
{% if allowed_to_edit %}
|
|
||||||
Das kannst du hier ändern ⤵️
|
|
||||||
<form action="/admin/user/{{ user.id }}/add-membership-pdf" method="post">
|
|
||||||
<fieldset>
|
|
||||||
{{ macros::input(label='Neue Beitrittserklärung hochladen', name='membership_pdf', type="file", accept='application/pdf') }}
|
|
||||||
<input value="Hochladen" type="submit" class="btn btn-primary ml-1" />
|
|
||||||
</fieldset>
|
|
||||||
</form>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if allowed_to_edit %}
|
||||||
|
<div class="py-3">
|
||||||
|
<div class="mt-3 text-right">
|
||||||
|
<a href="/admin/user/{{ user.id }}/delete"
|
||||||
|
class="btn btn-alert"
|
||||||
|
onclick="return confirm('Ist {{ user.name }} wirklich aus dem Verein ausgetreten?');">
|
||||||
|
{% include "includes/delete-icon" %}
|
||||||
|
Mitglied ist ausgetreten
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="bg-white dark:bg-primary-900 text-black dark:text-white rounded-md block shadow mt-5"
|
||||||
|
role="alert">
|
||||||
|
<h2 class="h2">Mitgliedstyp</h2>
|
||||||
|
<div class="mx-2 divide-y divide-gray-200 dark:divide-primary-600">
|
||||||
|
<div class="py-3">
|
||||||
|
{{ user.name }}
|
||||||
|
{% if "SchnupperInterest" in member %}
|
||||||
|
ist interessiert am Schnupperkurs.
|
||||||
|
{% elif "Schnupperant" in member %}
|
||||||
|
ist beim nächsten Schnupperkurs angemeldet.
|
||||||
|
{% elif "Scheckbuch" in member %}
|
||||||
|
{% set logbook = member["Scheckbuch"] %}
|
||||||
|
hat ein Scheckbuch und {{ logbook | length }} Ausfahrten absolviert.
|
||||||
|
<details>
|
||||||
|
<summary>Ausfahrten</summary>
|
||||||
|
{% for log in logbook %}
|
||||||
|
{{ log::show_old(log=log, state="completed", only_ones=false, index=loop.index, allowed_to_edit=false) }}
|
||||||
|
{% endfor %}
|
||||||
|
</details>
|
||||||
|
{% elif "Regular" in member %}
|
||||||
|
ist ein reguläres Vereinsmitglied.
|
||||||
|
{% elif "Foerdernd" in member %}
|
||||||
|
ist ein förderndes Vereinsmitglied.
|
||||||
|
{% elif "Unterstuetzend" in member %}
|
||||||
|
ist ein unterstützendes Vereinsmitglied.
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% if allowed_to_edit %}
|
|
||||||
<div class="py-3">
|
|
||||||
<div class="mt-3 text-right">
|
|
||||||
<a href="/admin/user/{{ user.id }}/delete"
|
|
||||||
class="btn btn-alert"
|
|
||||||
onclick="return confirm('Ist {{ user.name }} wirklich aus dem Verein ausgetreten?');">
|
|
||||||
{% include "includes/delete-icon" %}
|
|
||||||
Mitglied ist ausgetreten
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
|
||||||
<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"
|
||||||
role="alert">
|
role="alert">
|
||||||
<h2 class="h2">Aktivität von und mit {{ user.name }}</h2>
|
<h2 class="h2">Aktivität von und mit {{ user.name }}</h2>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user