Files
vrobbler/vrobbler/apps/tasks/models.py

99 lines
2.9 KiB
Python

from dataclasses import dataclass
from datetime import datetime
from typing import Optional
from django.apps import apps
from django.db import models
from django.urls import reverse
from scrobbles.dataclasses import JSONDataclass
from scrobbles.mixins import LongPlayScrobblableMixin, ScrobblableConstants
BNULL = {"blank": True, "null": True}
TODOIST_TASK_URL = "https://app.todoist.com/app/task/{id}"
@dataclass
class TaskLogData(JSONDataclass):
description: Optional[str] = None
title: Optional[str] = None
project: Optional[str] = None
notes: Optional[dict] = None
updated_at: Optional[str] = None
todoist_id: Optional[str] = None
todoist_event: Optional[str] = None
todoist_type: Optional[str] = None
todoist_type: Optional[str] = None
todoist_label_list: Optional[list] = None
todoist_project_id: Optional[str] = None
body: Optional[str] = None
state: Optional[str] = None
labels: Optional[str] = None
properties: Optional[list] = None
drawers: Optional[list] = None
source: Optional[str] = None
source_id: Optional[str] = None
timestamps: Optional[list] = None
def notes_as_str(self) -> str:
"""Return formatted notes with line breaks and no keys"""
note_block = ""
if isinstance(self.notes, list):
note_block = "</br>".join(self.notes)
if isinstance(self.notes, dict):
for id, content in self.notes.items():
note_block += content + "</br>"
return note_block
class Task(LongPlayScrobblableMixin):
"""Basically a holder for Todoist Tasks
and any other otherwise generic tasks.
"""
description = models.TextField(**BNULL)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("tasks:task_detail", kwargs={"slug": self.uuid})
@property
def strings(self) -> ScrobblableConstants:
return ScrobblableConstants(verb="Doing", tags="memo")
@property
def logdata_cls(self):
return TaskLogData
def source_url_for_user(self, user_id) -> str:
url = ""
scrobble = self.scrobbles(user_id).first()
if scrobble:
if scrobble.log.get("source") == "todoist":
url = TODOIST_TASK_URL.format(id=scrobble.logdata.todist_id)
return url
def subtitle_for_user(self, user_id):
scrobble = self.scrobbles(user_id).first()
return scrobble.logdata.description or ""
@classmethod
def find_or_create(cls, title: str) -> "Task":
task, created = cls.objects.get_or_create(title=title)
if created:
task.run_time_seconds = 1800
task.save(update_fields=["run_time_seconds"])
return task
def scrobbles(self, user_id):
Scrobble = apps.get_model("scrobbles", "Scrobble")
return Scrobble.objects.filter(user_id=user_id, task=self).order_by(
"-timestamp"
)