feat: add floating quick task flow

This commit is contained in:
2026-04-13 10:23:06 +02:00
parent c36abe82a8
commit 1a889e0ee1
13 changed files with 330 additions and 5 deletions

View File

@@ -0,0 +1,57 @@
from __future__ import annotations
from ..extensions import db
from ..models import AppSetting
QUICK_TASK_DEFAULTS = {
"quick_task_points_fast": 4,
"quick_task_points_normal": 8,
"quick_task_points_medium": 12,
"quick_task_points_heavy": 18,
}
QUICK_TASK_EFFORTS = [
("fast", "Schnell", "quick_task_points_fast"),
("normal", "Normal", "quick_task_points_normal"),
("medium", "Dauert etwas", "quick_task_points_medium"),
("heavy", "Aufwendig", "quick_task_points_heavy"),
]
def ensure_app_settings() -> None:
for key, value in QUICK_TASK_DEFAULTS.items():
setting = AppSetting.query.filter_by(key=key).first()
if not setting:
db.session.add(AppSetting(key=key, value=str(value)))
db.session.commit()
def get_setting_int(key: str, default: int) -> int:
setting = AppSetting.query.filter_by(key=key).first()
if not setting:
return default
try:
return int(setting.value)
except (TypeError, ValueError):
return default
def set_setting_int(key: str, value: int) -> None:
setting = AppSetting.query.filter_by(key=key).first()
if not setting:
setting = AppSetting(key=key, value=str(value))
db.session.add(setting)
else:
setting.value = str(value)
def get_quick_task_config() -> dict[str, dict]:
config: dict[str, dict] = {}
for effort_key, label, setting_key in QUICK_TASK_EFFORTS:
config[effort_key] = {
"label": label,
"setting_key": setting_key,
"points": get_setting_int(setting_key, QUICK_TASK_DEFAULTS[setting_key]),
}
return config

View File

@@ -6,6 +6,7 @@ from sqlalchemy import inspect, text
from ..extensions import db
from ..models import User
from .app_settings import ensure_app_settings
def ensure_schema_and_admins() -> None:
@@ -16,6 +17,8 @@ def ensure_schema_and_admins() -> None:
db.session.execute(text("ALTER TABLE user ADD COLUMN is_admin BOOLEAN NOT NULL DEFAULT 0"))
db.session.commit()
ensure_app_settings()
admin_exists = User.query.filter_by(is_admin=True).first()
if admin_exists:
return

View File

@@ -5,7 +5,8 @@ from datetime import date, datetime, timedelta
from sqlalchemy import select
from ..extensions import db
from ..models import TaskInstance, TaskTemplate
from ..models import TaskInstance, TaskTemplate, User
from .app_settings import get_quick_task_config
from .badges import evaluate_task_badges
from .dates import add_months, today_local
@@ -126,3 +127,33 @@ def complete_task(task: TaskInstance, completed_by_user_id: int) -> TaskInstance
if task.completed_by_user:
evaluate_task_badges(task.completed_by_user)
return task
def create_quick_task(title: str, effort: str, creator: User) -> TaskInstance:
config = get_quick_task_config()
effort_config = config[effort]
template = TaskTemplate(
title=title.strip(),
description="Schnellaufgabe",
default_points=effort_config["points"],
default_assigned_user_id=creator.id,
recurrence_interval_value=None,
recurrence_interval_unit="none",
active=False,
)
db.session.add(template)
db.session.flush()
task = TaskInstance(
task_template_id=template.id,
title=template.title,
description="Schnellaufgabe",
assigned_user_id=creator.id,
due_date=today_local(),
points_awarded=template.default_points,
status="open",
)
refresh_task_status(task, today_local())
db.session.add(task)
db.session.commit()
return task