[moods] Add check in form
Some checks failed
build & deploy / test (push) Failing after 1m19s
build & deploy / deploy (push) Has been skipped

This commit is contained in:
2026-04-28 17:00:02 -04:00
parent 05cbcc1967
commit 181700b05e
4 changed files with 98 additions and 20 deletions

View File

@ -10,17 +10,22 @@
<form method="post">
{% csrf_token %}
<div class="d-grid gap-3">
{% for mood in moods %}
<button type="submit" name="mood" value="{{ mood.id }}"
class="btn btn-outline-secondary btn-lg">
{% if mood.title %}{{ mood.title }}{% else %}{{ mood.uuid }}{% endif %}
{% if mood.description %}<br><small class="text-muted">{{ mood.description }}</small>{% endif %}
</button>
{% for group_type, group_moods in mood_groups %}
<div class="text-center mt-3 mb-2">
<h5>{{ group_type|title }}</h5>
</div>
{% for mood in group_moods %}
<button type="submit" name="mood" value="{{ mood.id }}"
class="btn btn-outline-secondary btn-lg">
{% if mood.title %}{{ mood.title }}{% else %}{{ mood.uuid }}{% endif %}
{% if mood.description %}<br><small class="text-muted">{{ mood.description }}</small>{% endif %}
</button>
{% endfor %}
{% endfor %}
</div>
</form>
<div class="mt-3">
<a href="{% url 'moods:checkin' %}" class="btn btn-link">Back to quality selection</a>
<a href="{% url 'moods:checkin' %}?back=1" class="btn btn-link">Back to quality selection</a>
</div>
</div>
</div>

View File

@ -0,0 +1,32 @@
{% extends "base.html" %}
{% block page_title %}Check-in - Select your reason{% endblock %}
{% block content %}
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-8">
<h2 class="mb-4">Why are you feeling this way?</h2>
<form method="post">
{% csrf_token %}
<div class="d-grid gap-3">
<button type="submit" name="reason" value=""
class="btn btn-outline-secondary btn-lg">
No reason
</button>
{% for reason in reasons %}
<button type="submit" name="reason" value="{{ reason.id }}"
class="btn btn-outline-secondary btn-lg">
{% if reason.title %}{{ reason.title }}{% else %}{{ reason.uuid }}{% endif %}
{% if reason.description %}<br><small class="text-muted">{{ reason.description }}</small>{% endif %}
</button>
{% endfor %}
</div>
</form>
<div class="mt-3">
<a href="{% url 'moods:checkin' %}?back=2" class="btn btn-link">Back to mood selection</a>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -1,9 +1,10 @@
import logging
from django.contrib.auth.decorators import login_required
from django.db import models
from django.shortcuts import redirect, render
from django.urls import reverse
from django.utils import timezone
from moods.models import Mood, MoodLogData, MoodQuality
from moods.models import Mood, MoodLogData, MoodQuality, MoodReason
from scrobbles.models import Scrobble
logger = logging.getLogger(__name__)
@ -11,9 +12,20 @@ logger = logging.getLogger(__name__)
@login_required
def checkin(request):
"""Two-step mood check-in wizard"""
"""Three-step mood check-in wizard"""
step = request.session.get("checkin_step", 1)
if request.GET.get("back"):
back_step = request.GET.get("back")
if back_step == "2":
request.session["checkin_step"] = 2
request.session.pop("checkin_mood_id", None)
else:
request.session.pop("checkin_step", None)
request.session.pop("checkin_quality", None)
request.session.pop("checkin_mood_id", None)
return redirect("moods:checkin")
if request.method == "POST":
if step == 1:
quality = request.POST.get("mood_quality")
@ -33,12 +45,25 @@ def checkin(request):
mood_id = request.POST.get("mood")
quality = request.session.get("checkin_quality")
if mood_id and quality:
request.session["checkin_mood_id"] = int(mood_id)
request.session["checkin_step"] = 3
return redirect("moods:checkin")
return redirect("moods:checkin")
elif step == 3:
reason_id = request.POST.get("reason")
mood_id = request.session.get("checkin_mood_id")
quality = request.session.get("checkin_quality")
if mood_id and quality:
try:
mood = Mood.objects.get(id=mood_id)
log_data = MoodLogData(
mood_quality=quality,
mood_type=mood.mood_type,
mood_reason_ids=[int(reason_id)] if reason_id else [],
)
scrobble = Scrobble.objects.create(
@ -53,6 +78,7 @@ def checkin(request):
# Clear session data
request.session.pop("checkin_step", None)
request.session.pop("checkin_quality", None)
request.session.pop("checkin_mood_id", None)
return redirect("moods:checkin_success")
except Mood.DoesNotExist:
@ -68,9 +94,24 @@ def checkin(request):
return render(
request, "moods/checkin_quality.html", {"qualities": qualities}
)
elif step == 2:
quality = request.session.get("checkin_quality", 4)
positive_qualities = [MoodQuality.NEUTRAL.value, MoodQuality.SLIGHTLY_PLEASANT.value,
MoodQuality.PLEASANT.value, MoodQuality.VERY_PLEASANT.value]
if quality in positive_qualities:
mood_groups = [
("positive", Mood.objects.filter(mood_type="positive").exclude(description__isnull=True).exclude(description="")),
("negative", Mood.objects.filter(mood_type="negative").exclude(description__isnull=True).exclude(description="")),
]
else:
mood_groups = [
("negative", Mood.objects.filter(mood_type="negative").exclude(description__isnull=True).exclude(description="")),
("positive", Mood.objects.filter(mood_type="positive").exclude(description__isnull=True).exclude(description="")),
]
return render(request, "moods/checkin_mood.html", {"mood_groups": mood_groups})
else:
moods = Mood.objects.all()
return render(request, "moods/checkin_mood.html", {"moods": moods})
reasons = MoodReason.objects.all()
return render(request, "moods/checkin_reason.html", {"reasons": reasons})
@login_required

View File

@ -217,24 +217,24 @@
</form>
{% endif %}
{% if user.is_authenticated %}
<div class="navbar-nav">
<div class="navbar-nav flex-row">
<div class="nav-item text-nowrap">
<a class="nav-link px-3" href="{% url "moods:checkin" %}">Check-in</a>
</div>
<div class="nav-item text-nowrap">
<a class="nav-link px-3" href="{% url "profiles:profile_settings" %}">Settings</a>
</div>
</div>
{% endif %}
<div class="navbar-nav">
</div>
<div class="nav-item text-nowrap">
{% if user.is_authenticated %}
<a class="nav-link px-3" href="{% url "account_logout" %}">Sign out</a>
{% else %}
<a class="nav-link px-3" href="{% url "account_login" %}">Sign in</a>
{% endif %}
</div>
</div>
{% else %}
<div class="navbar-nav flex-row">
<div class="nav-item text-nowrap">
<a class="nav-link px-3" href="{% url "account_login" %}">Sign in</a>
</div>
</div>
{% endif %}
</header>
<div class="container-fluid">