- Remove user ForeignKey from all 7 models (single-user app) - Update all views, handlers, forms, admin, API, seed, and tests - Add MonthlyGoal model with goals and promises sections - Goals/promises: add, toggle (strikethrough), delete via LiveView
70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
from django.template.loader import render_to_string
|
|
from liveview import liveview_handler, send
|
|
|
|
from app.monthly.models import MonthlyGoal
|
|
|
|
|
|
def _render_goals(year, month, kind):
|
|
items = MonthlyGoal.objects.filter(year=year, month=month, kind=kind)
|
|
target = f"#{kind}s-list"
|
|
return target, render_to_string(
|
|
"pages/monthly/partials/goals_list.html",
|
|
{"items": items, "year": year, "month": month, "kind": kind},
|
|
)
|
|
|
|
|
|
@liveview_handler("add_goal")
|
|
def add_goal(consumer, content):
|
|
form = content.get("form", {})
|
|
year = int(form.get("year", 0))
|
|
month = int(form.get("month", 0))
|
|
kind = form.get("kind", "")
|
|
text = form.get("goal_text", "").strip()
|
|
|
|
if not text or not year or not month or kind not in ("goal", "promise"):
|
|
return
|
|
|
|
MonthlyGoal.objects.create(year=year, month=month, text=text, kind=kind)
|
|
|
|
target, html = _render_goals(year, month, kind)
|
|
send(consumer, {"target": target, "html": html})
|
|
|
|
|
|
@liveview_handler("toggle_goal")
|
|
def toggle_goal(consumer, content):
|
|
data = content.get("data", {})
|
|
goal_id = data.get("data_id", "")
|
|
year = int(data.get("data_year", 0))
|
|
month = int(data.get("data_month", 0))
|
|
kind = data.get("data_kind", "")
|
|
|
|
if not goal_id:
|
|
return
|
|
|
|
try:
|
|
goal = MonthlyGoal.objects.get(id=goal_id)
|
|
goal.done = not goal.done
|
|
goal.save()
|
|
except MonthlyGoal.DoesNotExist:
|
|
return
|
|
|
|
target, html = _render_goals(year, month, kind)
|
|
send(consumer, {"target": target, "html": html})
|
|
|
|
|
|
@liveview_handler("delete_goal")
|
|
def delete_goal(consumer, content):
|
|
data = content.get("data", {})
|
|
goal_id = data.get("data_id", "")
|
|
year = int(data.get("data_year", 0))
|
|
month = int(data.get("data_month", 0))
|
|
kind = data.get("data_kind", "")
|
|
|
|
if not goal_id:
|
|
return
|
|
|
|
MonthlyGoal.objects.filter(id=goal_id).delete()
|
|
|
|
target, html = _render_goals(year, month, kind)
|
|
send(consumer, {"target": target, "html": html})
|