feat: release 0.7.0 celebration flow

This commit is contained in:
2026-04-16 13:41:22 +02:00
parent ba4a112bbc
commit 67d362f1d9
6 changed files with 340 additions and 6 deletions

View File

@@ -3,6 +3,7 @@ from __future__ import annotations
import calendar
from collections import defaultdict
from datetime import date, timedelta
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask_login import current_user, login_required
@@ -99,6 +100,19 @@ def _archive_day_label(day: date, today: date) -> str:
return day.strftime("%d.%m.%Y")
def _redirect_with_celebration(target_url: str, points: int | None = None):
if not points or points <= 0:
return redirect(target_url)
parts = urlsplit(target_url)
query = dict(parse_qsl(parts.query, keep_blank_values=True))
query["celebrate_points"] = str(points)
redirect_url = urlunsplit(
(parts.scheme, parts.netloc, parts.path, urlencode(query), parts.fragment)
)
return redirect(redirect_url)
@bp.route("/my-tasks")
@login_required
def my_tasks():
@@ -253,6 +267,7 @@ def create():
def quick_create():
config = get_quick_task_config()
created_titles: list[str] = []
total_points = 0
selected_ids = request.form.getlist("quick_win_ids")
if selected_ids:
@@ -261,6 +276,7 @@ def quick_create():
task = create_quick_task(quick_win.title, quick_win.effort, current_user, description="Quick-Win")
complete_task(task, current_user.id)
created_titles.append(task.title)
total_points += task.points_awarded
if request.form.get("include_custom") == "1":
form = QuickTaskForm(prefix="quick")
@@ -281,6 +297,7 @@ def quick_create():
task = create_quick_task(custom_title, form.effort.data, current_user, description="Quick-Win")
complete_task(task, current_user.id)
created_titles.append(task.title)
total_points += task.points_awarded
if not created_titles:
flash("Bitte wähle mindestens einen Quick-Win aus.", "error")
@@ -290,7 +307,10 @@ def quick_create():
flash(f"Quick-Win „{created_titles[0]}“ wurde als erledigt gespeichert.", "success")
else:
flash(f"{len(created_titles)} Quick-Wins wurden als erledigt gespeichert.", "success")
return redirect(request.referrer or url_for("tasks.my_tasks"))
return _redirect_with_celebration(
request.referrer or url_for("tasks.my_tasks"),
total_points,
)
@bp.route("/tasks/<int:task_id>/edit", methods=["GET", "POST"])
@@ -353,9 +373,13 @@ def complete(task_id: int):
if selected_user_id in allowed_ids:
completed_by_id = selected_user_id
awarded_points = task.points_awarded
complete_task(task, completed_by_id)
flash("Punkte verbucht. Gute Arbeit.", "success")
return redirect(request.referrer or url_for("tasks.my_tasks"))
return _redirect_with_celebration(
request.referrer or url_for("tasks.my_tasks"),
awarded_points,
)
@bp.route("/calendar")