Files
vrobbler/vrobbler/apps/moods/models.py
Colin Powell ef4e510814
All checks were successful
build & deploy / test (push) Successful in 2m2s
build & deploy / deploy (push) Successful in 38s
[moods] Add a nice form for checking in
2026-04-28 15:44:48 -04:00

121 lines
3.3 KiB
Python

import logging
from dataclasses import dataclass
from enum import IntEnum
from typing import Optional
from uuid import uuid4
from django.contrib.auth import get_user_model
from django.db import models
from django.urls import reverse
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFit
from scrobbles.dataclasses import BaseLogData
from scrobbles.mixins import ScrobblableConstants, ScrobblableMixin
logger = logging.getLogger(__name__)
BNULL = {"blank": True, "null": True}
User = get_user_model()
class MoodType(models.TextChoices):
POSITIVE = "positive", "Positive"
NEGATIVE = "negative", "Negative"
class MoodQuality(IntEnum):
VERY_UNPLEASANT = 1
UNPLEASANT = 2
SLIGHTLY_UNPLEASANT = 3
NEUTRAL = 4
SLIGHTLY_PLEASANT = 5
PLEASANT = 6
VERY_PLEASANT = 7
@dataclass
class MoodLogData(BaseLogData):
mood_type: Optional[str] = None
mood_reason_ids: Optional[list[int]] = None
mood_quality: Optional[int] = None
@classmethod
def override_fields(cls) -> dict:
from django import forms
from moods.models import MoodReason
return {
"mood_type": forms.ChoiceField(
choices=MoodType.choices,
required=False,
widget=forms.Select(attrs={"class": "form-control"}),
),
"mood_reason_ids": forms.ModelMultipleChoiceField(
queryset=MoodReason.objects.all().order_by("title"),
required=False,
widget=forms.SelectMultiple(attrs={"size": 10}),
),
"mood_quality": forms.ChoiceField(
choices=[
(mq.value, mq.name.replace("_", " ").title())
for mq in MoodQuality
],
required=False,
widget=forms.Select(attrs={"class": "form-control"}),
),
}
class Mood(ScrobblableMixin):
description = models.TextField(**BNULL)
image = models.ImageField(upload_to="moods/", **BNULL)
image_small = ImageSpecField(
source="thumbnail",
processors=[ResizeToFit(100, 100)],
format="JPEG",
options={"quality": 60},
)
image_medium = ImageSpecField(
source="thumbnail",
processors=[ResizeToFit(300, 300)],
format="JPEG",
options={"quality": 75},
)
mood_type = models.CharField(
max_length=20, choices=MoodType.choices, **BNULL
)
def __str__(self):
if self.title:
return self.title
return str(self.uuid)
def get_absolute_url(self):
return reverse("moods:mood_detail", kwargs={"slug": self.uuid})
@property
def subtitle(self) -> str:
return ""
@property
def strings(self) -> ScrobblableConstants:
return ScrobblableConstants(verb="Feeling", tags="thinking")
@property
def logdata_cls(self):
return MoodLogData
@property
def primary_image_url(self) -> str:
if self.image:
return self.image.url
return ""
class MoodReason(models.Model):
uuid = models.UUIDField(default=uuid4, editable=False, **BNULL)
title = models.CharField(max_length=255, **BNULL)
description = models.TextField(**BNULL)
def __str__(self):
return self.title