feat: add floating quick task flow
This commit is contained in:
57
app/services/app_settings.py
Normal file
57
app/services/app_settings.py
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user