feat: add task deletion for all users

This commit is contained in:
2026-04-15 12:37:57 +02:00
parent 2f2e543a79
commit f8f3641811
4 changed files with 49 additions and 3 deletions

View File

@@ -15,6 +15,7 @@ from ..services.tasks import (
complete_task, complete_task,
create_quick_task, create_quick_task,
create_task_template_and_instance, create_task_template_and_instance,
delete_task_instance,
refresh_task_statuses, refresh_task_statuses,
update_template_and_instance, update_template_and_instance,
) )
@@ -157,6 +158,7 @@ def edit(task_id: int):
task = TaskInstance.query.get_or_404(task_id) task = TaskInstance.query.get_or_404(task_id)
form = TaskForm(obj=task.task_template) form = TaskForm(obj=task.task_template)
form.assigned_user_id.choices = _user_choices() form.assigned_user_id.choices = _user_choices()
next_url = request.args.get("next") or request.form.get("next") or request.referrer or url_for("tasks.all_tasks")
if request.method == "GET": if request.method == "GET":
form.title.data = task.title form.title.data = task.title
@@ -171,9 +173,21 @@ def edit(task_id: int):
if form.validate_on_submit(): if form.validate_on_submit():
update_template_and_instance(task, form) update_template_and_instance(task, form)
flash("Aufgabe und Vorlage wurden aktualisiert.", "success") flash("Aufgabe und Vorlage wurden aktualisiert.", "success")
return redirect(url_for("tasks.all_tasks")) return redirect(next_url)
return render_template("tasks/task_form.html", form=form, mode="edit", task=task) return render_template("tasks/task_form.html", form=form, mode="edit", task=task, next_url=next_url)
@bp.route("/tasks/<int:task_id>/delete", methods=["POST"])
@login_required
def delete(task_id: int):
task = TaskInstance.query.get_or_404(task_id)
title = task.title
next_url = request.form.get("next") or url_for("tasks.all_tasks")
delete_task_instance(task)
flash(f"Aufgabe „{title}“ wurde gelöscht.", "success")
return redirect(next_url)
@bp.route("/tasks/<int:task_id>/complete", methods=["POST"]) @bp.route("/tasks/<int:task_id>/complete", methods=["POST"])

View File

@@ -157,3 +157,17 @@ def create_quick_task(title: str, effort: str, creator: User, description: str =
db.session.add(task) db.session.add(task)
db.session.commit() db.session.commit()
return task return task
def delete_task_instance(task: TaskInstance) -> None:
template = task.task_template
db.session.delete(task)
db.session.flush()
remaining_instance = db.session.scalar(
select(TaskInstance.id).where(TaskInstance.task_template_id == template.id).limit(1)
)
if remaining_instance is None:
db.session.delete(template)
db.session.commit()

View File

@@ -578,6 +578,11 @@ p {
color: var(--text); color: var(--text);
} }
.button--danger {
border-color: rgba(225, 29, 72, 0.3);
color: var(--danger);
}
.button--wide { .button--wide {
width: 100%; width: 100%;
} }

View File

@@ -7,6 +7,9 @@
<h2>{% if mode == 'edit' %}Änderungen für {{ task.title }}{% else %}Neue Aufgabe anlegen{% endif %}</h2> <h2>{% if mode == 'edit' %}Änderungen für {{ task.title }}{% else %}Neue Aufgabe anlegen{% endif %}</h2>
<form method="post" class="form-grid form-grid--two"> <form method="post" class="form-grid form-grid--two">
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
{% if mode == 'edit' %}
<input type="hidden" name="next" value="{{ next_url }}">
{% endif %}
<div class="field field--full"> <div class="field field--full">
{{ form.title.label }} {{ form.title.label }}
@@ -57,8 +60,18 @@
<div class="form-actions field--full"> <div class="form-actions field--full">
{{ form.submit(class_='button') }} {{ form.submit(class_='button') }}
<a class="button button--ghost" href="{{ url_for('tasks.all_tasks') }}">Abbrechen</a> <a class="button button--ghost" href="{{ url_for('tasks.all_tasks') }}">Abbrechen</a>
{% if mode == 'edit' %}
<button
type="submit"
class="button button--ghost button--danger"
formmethod="post"
formaction="{{ url_for('tasks.delete', task_id=task.id) }}"
onclick="return confirm('Diese Aufgabe wirklich löschen?');"
>
Aufgabe löschen
</button>
{% endif %}
</div> </div>
</form> </form>
</section> </section>
{% endblock %} {% endblock %}