feat: creation of assignments works

This commit is contained in:
Max Hohlfeld 2024-05-12 22:46:47 +02:00
parent 564d1b5946
commit 53b50a153c
5 changed files with 25 additions and 16 deletions

View File

@ -12,17 +12,20 @@ pub struct NewAssignmentsForm {
}
#[actix_web::post("/assignments/new")]
pub async fn post(pool: web::Data<PgPool>, form: web::Form<NewAssignmentsForm>) -> impl Responder {
pub async fn post(pool: web::Data<PgPool>, form: web::Form<Vec<(String, String)>>) -> impl Responder {
let event_id = form.iter().find(|x| x.0 == "event").unwrap().1.parse().unwrap();
let wachhabender = form.iter().find(|x| x.0 == "wachhabender");
let posten: Vec<i32> = form.iter().filter(|x| x.0 == "posten").map(|x| x.1.parse().unwrap()).collect();
let event = Event::read_by_id_including_location(&pool, form.event).await.unwrap(); // TODO: Check if location is needed
let event = Event::read_by_id_including_location(&pool, event_id).await.unwrap(); // TODO: Check if location is needed
if event.voluntary_wachhabender && form.wachhabender.is_some() && form.posten.contains(&form.wachhabender.unwrap()) {
if event.voluntary_wachhabender && wachhabender.is_some() && posten.contains(&wachhabender.unwrap().1.parse().unwrap()) {
return HttpResponse::BadRequest().body("Wachhabender kann nicht zugleich Posten sein!");
}
let mut joined_ids = form.posten.clone();
if let Some(id) = form.wachhabender {
joined_ids.push(id);
let mut joined_ids = posten.clone();
if let Some((_,id)) = wachhabender {
joined_ids.push(id.parse().unwrap());
}
for availabillity_id in joined_ids {
@ -30,8 +33,10 @@ pub async fn post(pool: web::Data<PgPool>, form: web::Form<NewAssignmentsForm>)
let mut can_be_used = true;
for assignment in assignments {
if event.start_time >= assignment.start_time && event.start_time <= assignment.end_time {
} else {
can_be_used = false;
break;
}
@ -42,12 +47,12 @@ pub async fn post(pool: web::Data<PgPool>, form: web::Form<NewAssignmentsForm>)
}
}
if let Some(id) = form.wachhabender {
Assignment::create(pool.get_ref(), id, event.id, Function::Wachhabender, event.start_time, event.end_time).await.unwrap();
if let Some((_,id)) = wachhabender {
Assignment::create(pool.get_ref(), event.id, id.parse().unwrap(), Function::Wachhabender, event.start_time, event.end_time).await.unwrap();
}
for id in &form.posten {
Assignment::create(pool.get_ref(), *id, event.id, Function::Posten, event.start_time, event.end_time).await.unwrap();
for id in posten {
Assignment::create(pool.get_ref(), event.id, id, Function::Posten, event.start_time, event.end_time).await.unwrap();
}
HttpResponse::Ok().finish()

View File

@ -37,4 +37,5 @@ pub fn init(cfg: &mut ServiceConfig) {
cfg.service(events::post_new::post);
cfg.service(assignment::get_new::get);
cfg.service(assignment::post_new::post);
}

View File

@ -14,8 +14,8 @@ pub struct Assignment {
impl Assignment {
pub async fn create(
pool: &PgPool,
availabillity_id: i32,
event_id: i32,
availabillity_id: i32,
function: Function,
start_time: NaiveTime,
end_time: NaiveTime,
@ -25,8 +25,8 @@ impl Assignment {
INSERT INTO assignment (eventId, availabillityId, function, startTime, endTime)
VALUES ($1, $2, $3, $4, $5);
"##,
availabillity_id,
event_id,
availabillity_id,
function as Function,
start_time,
end_time

View File

@ -41,9 +41,11 @@
<div class="level">
<h5 class="title is-5 level-left">{{ event.name }}</h5>
<span class ="level-right">
{% if user.role == Role::AreaManager || user.role == Role::Admin %}
<a href="/assignments/new?event={{ event.id }}" class="button is-primary level-item">Planen</a>
<a href="" class="button is-primary-light level-item">bearbeiten</a>
<a href="" class="button is-warning level-item">als abgesagt markieren</a>
{% endif %}
</span>
</div>
<p>Ort: {{ event.location.as_ref().unwrap().name }}</p>
@ -88,11 +90,11 @@
</thead>
<tbody>
{% for availabillity in availabillities %}
{% let user = availabillity.user.as_ref().unwrap() %}
{% let u = availabillity.user.as_ref().unwrap() %}
<tr id="availabillity-{{ availabillity.id }}">
<td>{{ user.name }}</td>
<td>{{ u.name }}</td>
<td>
{% match user.function %}
{% match u.function %}
{% when Function::Posten %}
<span class="tag is-info is-light">Posten</span>
{% when Function::Wachhabender %}

View File

@ -48,7 +48,8 @@
<div class="navbar-end">
<div class="navbar-item">
<div class="buttons">
angemeldet als {{ user.name }}
<div class="buttons ml-3">
<a class="button is-primary">
Profil
</a>