feat: add persistent badges and admin badge page
This commit is contained in:
127
app/cli.py
127
app/cli.py
@@ -10,40 +10,131 @@ from .services.notifications import send_due_notifications, send_monthly_winner_
|
||||
|
||||
DEFAULT_BADGES = [
|
||||
{
|
||||
"key": "early_bird",
|
||||
"name": "Frühstarter",
|
||||
"description": "Erledige 3 Aufgaben vor ihrem Fälligkeitsdatum.",
|
||||
"icon_name": "bell",
|
||||
"trigger_type": "early_finisher_count",
|
||||
"threshold": 3,
|
||||
"key": "first_wipe",
|
||||
"name": "Erster Wisch",
|
||||
"description": "Erledige deine erste Aufgabe.",
|
||||
"icon_name": "sparkles",
|
||||
"trigger_type": "first_task_completed",
|
||||
"threshold": 1,
|
||||
"bonus_points": 5,
|
||||
},
|
||||
{
|
||||
"key": "warmed_up",
|
||||
"name": "Warmgelaufen",
|
||||
"description": "Erledige 10 Aufgaben insgesamt.",
|
||||
"icon_name": "fire",
|
||||
"trigger_type": "total_tasks_completed",
|
||||
"threshold": 10,
|
||||
"bonus_points": 10,
|
||||
},
|
||||
{
|
||||
"key": "on_time_streak",
|
||||
"name": "Sauberer Lauf",
|
||||
"description": "Erledige Aufgaben an 3 Tagen in Folge.",
|
||||
"icon_name": "check",
|
||||
"trigger_type": "streak_days",
|
||||
"threshold": 3,
|
||||
"key": "punctuality_pro",
|
||||
"name": "Pünktlichkeitsprofi",
|
||||
"description": "Erledige 10 Aufgaben pünktlich.",
|
||||
"icon_name": "check-double",
|
||||
"trigger_type": "on_time_tasks_completed",
|
||||
"threshold": 10,
|
||||
"bonus_points": 15,
|
||||
},
|
||||
{
|
||||
"key": "task_sprinter",
|
||||
"name": "Putz-Sprinter",
|
||||
"description": "Schließe 8 Aufgaben in einem Monat ab.",
|
||||
"icon_name": "trophy",
|
||||
"trigger_type": "monthly_task_count",
|
||||
"threshold": 8,
|
||||
"key": "early_bird",
|
||||
"name": "Der frühe Vogel",
|
||||
"description": "Erledige eine Aufgabe mindestens 1 Tag vor der Deadline.",
|
||||
"icon_name": "calendar-day",
|
||||
"trigger_type": "early_tasks_completed",
|
||||
"threshold": 1,
|
||||
"bonus_points": 8,
|
||||
},
|
||||
{
|
||||
"key": "early_starter",
|
||||
"name": "Frühstarter",
|
||||
"description": "Erledige 5 Aufgaben mindestens 1 Tag vor der Deadline.",
|
||||
"icon_name": "rocket-launch",
|
||||
"trigger_type": "early_tasks_completed",
|
||||
"threshold": 5,
|
||||
"bonus_points": 15,
|
||||
},
|
||||
{
|
||||
"key": "weekly_flow",
|
||||
"name": "Wochenflow",
|
||||
"description": "Erledige 7 Tage in Folge mindestens eine Aufgabe.",
|
||||
"icon_name": "flag-checkered",
|
||||
"trigger_type": "streak_days",
|
||||
"threshold": 7,
|
||||
"bonus_points": 20,
|
||||
},
|
||||
{
|
||||
"key": "monthly_champion",
|
||||
"name": "Monatssieger",
|
||||
"description": "Gewinne einen Monat mit den meisten Punkten.",
|
||||
"icon_name": "trophy",
|
||||
"trigger_type": "monthly_win_count",
|
||||
"threshold": 1,
|
||||
"bonus_points": 25,
|
||||
},
|
||||
{
|
||||
"key": "title_defender",
|
||||
"name": "Titelverteidiger",
|
||||
"description": "Gewinne 2 Monate in Folge.",
|
||||
"icon_name": "crown",
|
||||
"trigger_type": "consecutive_month_wins",
|
||||
"threshold": 2,
|
||||
"bonus_points": 30,
|
||||
},
|
||||
{
|
||||
"key": "boss_battle",
|
||||
"name": "Bosskampf",
|
||||
"description": "Erledige eine Aufgabe mit besonders hohem Punktwert.",
|
||||
"icon_name": "bolt",
|
||||
"trigger_type": "high_point_task",
|
||||
"threshold": 25,
|
||||
"bonus_points": 12,
|
||||
},
|
||||
{
|
||||
"key": "foreign_savior",
|
||||
"name": "Fremdretter",
|
||||
"description": "Erledige 5 Aufgaben, die ursprünglich jemand anderem zugewiesen waren.",
|
||||
"icon_name": "users-crown",
|
||||
"trigger_type": "foreign_tasks_completed",
|
||||
"threshold": 5,
|
||||
"bonus_points": 18,
|
||||
},
|
||||
{
|
||||
"key": "white_glove",
|
||||
"name": "Weiße Weste",
|
||||
"description": "Bleibe einen ganzen Monat ohne überfällige Aufgabe.",
|
||||
"icon_name": "shield",
|
||||
"trigger_type": "clean_month",
|
||||
"threshold": 1,
|
||||
"bonus_points": 20,
|
||||
},
|
||||
{
|
||||
"key": "comeback_kid",
|
||||
"name": "Comeback Kid",
|
||||
"description": "Gewinne nach einem verlorenen Monat den nächsten Monat.",
|
||||
"icon_name": "award",
|
||||
"trigger_type": "comeback_win",
|
||||
"threshold": 1,
|
||||
"bonus_points": 18,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def seed_badges() -> None:
|
||||
wanted_keys = {payload["key"] for payload in DEFAULT_BADGES}
|
||||
BadgeDefinition.query.filter(~BadgeDefinition.key.in_(wanted_keys)).delete(synchronize_session=False)
|
||||
for payload in DEFAULT_BADGES:
|
||||
badge = BadgeDefinition.query.filter_by(key=payload["key"]).first()
|
||||
if not badge:
|
||||
db.session.add(BadgeDefinition(**payload))
|
||||
continue
|
||||
badge.name = payload["name"]
|
||||
badge.description = payload["description"]
|
||||
badge.icon_name = payload["icon_name"]
|
||||
badge.trigger_type = payload["trigger_type"]
|
||||
badge.threshold = payload["threshold"]
|
||||
badge.bonus_points = payload["bonus_points"]
|
||||
badge.active = True
|
||||
db.session.commit()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user