Fix grey dailies with weekly frequency and no weekdays selected in Habitica (#135419)

This commit is contained in:
Manu 2025-01-13 13:20:15 +01:00 committed by GitHub
parent 3aa466806e
commit 4dbf2b0320
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 436 additions and 3 deletions

View File

@ -3,13 +3,14 @@
from __future__ import annotations from __future__ import annotations
from abc import abstractmethod from abc import abstractmethod
from dataclasses import asdict
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from enum import StrEnum from enum import StrEnum
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from uuid import UUID from uuid import UUID
from dateutil.rrule import rrule from dateutil.rrule import rrule
from habiticalib import TaskType from habiticalib import Frequency, TaskType
from homeassistant.components.calendar import ( from homeassistant.components.calendar import (
CalendarEntity, CalendarEntity,
@ -193,6 +194,10 @@ class HabiticaDailiesCalendarEntity(HabiticaCalendarEntity):
# only dailies that that are not 'grey dailies' # only dailies that that are not 'grey dailies'
if not (task.Type is TaskType.DAILY and task.everyX): if not (task.Type is TaskType.DAILY and task.everyX):
continue continue
if task.frequency is Frequency.WEEKLY and not any(
asdict(task.repeat).values()
):
continue
recurrences = build_rrule(task) recurrences = build_rrule(task)
recurrence_dates = self.get_recurrence_dates( recurrence_dates = self.get_recurrence_dates(
@ -334,6 +339,11 @@ class HabiticaDailyRemindersCalendarEntity(HabiticaCalendarEntity):
if not (task.Type is TaskType.DAILY and task.everyX): if not (task.Type is TaskType.DAILY and task.everyX):
continue continue
if task.frequency is Frequency.WEEKLY and not any(
asdict(task.repeat).values()
):
continue
recurrences = build_rrule(task) recurrences = build_rrule(task)
recurrences_start = self.start_of_today recurrences_start = self.start_of_today

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from dataclasses import fields from dataclasses import asdict, fields
import datetime import datetime
from math import floor from math import floor
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
@ -34,6 +34,8 @@ def next_due_date(task: TaskData, today: datetime.datetime) -> datetime.date | N
if task.everyX == 0 or not task.nextDue: # grey dailies never become due if task.everyX == 0 or not task.nextDue: # grey dailies never become due
return None return None
if task.frequency is Frequency.WEEKLY and not any(asdict(task.repeat).values()):
return None
if TYPE_CHECKING: if TYPE_CHECKING:
assert task.startDate assert task.startDate

View File

@ -0,0 +1,51 @@
{
"success": true,
"data": [
{
"_id": "564b9ac9-c53d-4638-9e7f-1cd96fe19baa",
"frequency": "weekly",
"everyX": 1,
"repeat": {
"m": false,
"t": false,
"w": false,
"th": false,
"f": false,
"s": false,
"su": false
},
"streak": 1,
"nextDue": ["2024-09-20T22:00:00.000Z", "2024-09-27T22:00:00.000Z"],
"yesterDaily": true,
"history": [],
"completed": false,
"collapseChecklist": false,
"type": "daily",
"text": "Zahnseide benutzen",
"notes": "Klicke um Änderungen zu machen!",
"tags": [],
"value": -2.9663035443712333,
"priority": 1,
"attribute": "str",
"challenge": {},
"group": {
"completedBy": {},
"assignedUsers": []
},
"byHabitica": false,
"startDate": "2024-09-25T22:00:00.000Z",
"daysOfMonth": [],
"weeksOfMonth": [],
"checklist": [],
"reminders": [],
"createdAt": "2024-07-07T17:51:53.268Z",
"updatedAt": "2024-09-21T22:24:20.154Z",
"userId": "5f359083-ef78-4af0-985a-0b2c6d05797c",
"isDue": false,
"id": "564b9ac9-c53d-4638-9e7f-1cd96fe19baa"
}
],
"notifications": [],
"userV": 589,
"appVersion": "5.28.6"
}

View File

@ -598,6 +598,56 @@
"userId": "5f359083-ef78-4af0-985a-0b2c6d05797c", "userId": "5f359083-ef78-4af0-985a-0b2c6d05797c",
"isDue": false, "isDue": false,
"id": "6e53f1f5-a315-4edd-984d-8d762e4a08ef" "id": "6e53f1f5-a315-4edd-984d-8d762e4a08ef"
},
{
"repeat": {
"m": false,
"t": false,
"w": false,
"th": false,
"f": false,
"s": false,
"su": false
},
"challenge": {},
"group": {
"completedBy": {},
"assignedUsers": []
},
"_id": "7d92278b-9361-4854-83b6-0a66b57dce20",
"frequency": "weekly",
"everyX": 1,
"streak": 1,
"nextDue": [
"2024-12-14T23:00:00.000Z",
"2025-01-18T23:00:00.000Z",
"2025-02-15T23:00:00.000Z",
"2025-03-15T23:00:00.000Z",
"2025-04-19T23:00:00.000Z",
"2025-05-17T23:00:00.000Z"
],
"yesterDaily": true,
"history": [],
"completed": false,
"collapseChecklist": false,
"type": "daily",
"text": "Lerne eine neue Programmiersprache",
"notes": "Wähle eine Programmiersprache aus, die du noch nicht kennst, und lerne die Grundlagen.",
"tags": [],
"value": -0.9215181434950852,
"priority": 1,
"attribute": "str",
"byHabitica": false,
"startDate": "2024-09-20T23:00:00.000Z",
"daysOfMonth": [],
"weeksOfMonth": [],
"checklist": [],
"reminders": [],
"createdAt": "2024-10-10T15:57:14.304Z",
"updatedAt": "2024-11-27T23:47:29.986Z",
"userId": "5f359083-ef78-4af0-985a-0b2c6d05797c",
"isDue": false,
"id": "7d92278b-9361-4854-83b6-0a66b57dce20"
} }
], ],
"notifications": [ "notifications": [

View File

@ -1166,6 +1166,84 @@
]), ]),
'yesterDaily': True, 'yesterDaily': True,
}), }),
dict({
'Type': <TaskType.DAILY: 'daily'>,
'alias': None,
'attribute': <Attributes.STR: 'str'>,
'byHabitica': False,
'challenge': dict({
'broken': None,
'id': None,
'shortName': None,
'taskId': None,
'winner': None,
}),
'checklist': list([
]),
'collapseChecklist': False,
'completed': False,
'counterDown': None,
'counterUp': None,
'createdAt': datetime.datetime(2024, 10, 10, 15, 57, 14, 304000, tzinfo=datetime.timezone.utc),
'date': None,
'daysOfMonth': list([
]),
'down': None,
'everyX': 1,
'frequency': <Frequency.WEEKLY: 'weekly'>,
'group': dict({
'assignedDate': None,
'assignedUsers': list([
]),
'assignedUsersDetail': dict({
}),
'assigningUsername': None,
'completedBy': dict({
'date': None,
'userId': None,
}),
'id': None,
'managerNotes': None,
'taskId': None,
}),
'history': list([
]),
'id': UUID('7d92278b-9361-4854-83b6-0a66b57dce20'),
'isDue': False,
'nextDue': list([
datetime.datetime(2024, 12, 14, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 1, 18, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 2, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 3, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 4, 19, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 5, 17, 23, 0, tzinfo=datetime.timezone.utc),
]),
'notes': 'Wähle eine Programmiersprache aus, die du noch nicht kennst, und lerne die Grundlagen.',
'priority': <TaskPriority.EASY: 1>,
'reminders': list([
]),
'repeat': dict({
'f': False,
'm': False,
's': False,
'su': False,
't': False,
'th': False,
'w': False,
}),
'startDate': datetime.datetime(2024, 9, 20, 23, 0, tzinfo=datetime.timezone.utc),
'streak': 1,
'tags': list([
]),
'text': 'Lerne eine neue Programmiersprache',
'up': None,
'updatedAt': datetime.datetime(2024, 11, 27, 23, 47, 29, 986000, tzinfo=datetime.timezone.utc),
'userId': UUID('5f359083-ef78-4af0-985a-0b2c6d05797c'),
'value': -0.9215181434950852,
'weeksOfMonth': list([
]),
'yesterDaily': True,
}),
dict({ dict({
'Type': <TaskType.TODO: 'todo'>, 'Type': <TaskType.TODO: 'todo'>,
'alias': None, 'alias': None,
@ -3320,6 +3398,84 @@
]), ]),
'yesterDaily': True, 'yesterDaily': True,
}), }),
dict({
'Type': <TaskType.DAILY: 'daily'>,
'alias': None,
'attribute': <Attributes.STR: 'str'>,
'byHabitica': False,
'challenge': dict({
'broken': None,
'id': None,
'shortName': None,
'taskId': None,
'winner': None,
}),
'checklist': list([
]),
'collapseChecklist': False,
'completed': False,
'counterDown': None,
'counterUp': None,
'createdAt': datetime.datetime(2024, 10, 10, 15, 57, 14, 304000, tzinfo=datetime.timezone.utc),
'date': None,
'daysOfMonth': list([
]),
'down': None,
'everyX': 1,
'frequency': <Frequency.WEEKLY: 'weekly'>,
'group': dict({
'assignedDate': None,
'assignedUsers': list([
]),
'assignedUsersDetail': dict({
}),
'assigningUsername': None,
'completedBy': dict({
'date': None,
'userId': None,
}),
'id': None,
'managerNotes': None,
'taskId': None,
}),
'history': list([
]),
'id': UUID('7d92278b-9361-4854-83b6-0a66b57dce20'),
'isDue': False,
'nextDue': list([
datetime.datetime(2024, 12, 14, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 1, 18, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 2, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 3, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 4, 19, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 5, 17, 23, 0, tzinfo=datetime.timezone.utc),
]),
'notes': 'Wähle eine Programmiersprache aus, die du noch nicht kennst, und lerne die Grundlagen.',
'priority': <TaskPriority.EASY: 1>,
'reminders': list([
]),
'repeat': dict({
'f': False,
'm': False,
's': False,
'su': False,
't': False,
'th': False,
'w': False,
}),
'startDate': datetime.datetime(2024, 9, 20, 23, 0, tzinfo=datetime.timezone.utc),
'streak': 1,
'tags': list([
]),
'text': 'Lerne eine neue Programmiersprache',
'up': None,
'updatedAt': datetime.datetime(2024, 11, 27, 23, 47, 29, 986000, tzinfo=datetime.timezone.utc),
'userId': UUID('5f359083-ef78-4af0-985a-0b2c6d05797c'),
'value': -0.9215181434950852,
'weeksOfMonth': list([
]),
'yesterDaily': True,
}),
]), ]),
}) })
# --- # ---
@ -4373,6 +4529,84 @@
]), ]),
'yesterDaily': True, 'yesterDaily': True,
}), }),
dict({
'Type': <TaskType.DAILY: 'daily'>,
'alias': None,
'attribute': <Attributes.STR: 'str'>,
'byHabitica': False,
'challenge': dict({
'broken': None,
'id': None,
'shortName': None,
'taskId': None,
'winner': None,
}),
'checklist': list([
]),
'collapseChecklist': False,
'completed': False,
'counterDown': None,
'counterUp': None,
'createdAt': datetime.datetime(2024, 10, 10, 15, 57, 14, 304000, tzinfo=datetime.timezone.utc),
'date': None,
'daysOfMonth': list([
]),
'down': None,
'everyX': 1,
'frequency': <Frequency.WEEKLY: 'weekly'>,
'group': dict({
'assignedDate': None,
'assignedUsers': list([
]),
'assignedUsersDetail': dict({
}),
'assigningUsername': None,
'completedBy': dict({
'date': None,
'userId': None,
}),
'id': None,
'managerNotes': None,
'taskId': None,
}),
'history': list([
]),
'id': UUID('7d92278b-9361-4854-83b6-0a66b57dce20'),
'isDue': False,
'nextDue': list([
datetime.datetime(2024, 12, 14, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 1, 18, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 2, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 3, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 4, 19, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 5, 17, 23, 0, tzinfo=datetime.timezone.utc),
]),
'notes': 'Wähle eine Programmiersprache aus, die du noch nicht kennst, und lerne die Grundlagen.',
'priority': <TaskPriority.EASY: 1>,
'reminders': list([
]),
'repeat': dict({
'f': False,
'm': False,
's': False,
'su': False,
't': False,
'th': False,
'w': False,
}),
'startDate': datetime.datetime(2024, 9, 20, 23, 0, tzinfo=datetime.timezone.utc),
'streak': 1,
'tags': list([
]),
'text': 'Lerne eine neue Programmiersprache',
'up': None,
'updatedAt': datetime.datetime(2024, 11, 27, 23, 47, 29, 986000, tzinfo=datetime.timezone.utc),
'userId': UUID('5f359083-ef78-4af0-985a-0b2c6d05797c'),
'value': -0.9215181434950852,
'weeksOfMonth': list([
]),
'yesterDaily': True,
}),
]), ]),
}) })
# --- # ---
@ -4876,6 +5110,84 @@
]), ]),
'yesterDaily': True, 'yesterDaily': True,
}), }),
dict({
'Type': <TaskType.DAILY: 'daily'>,
'alias': None,
'attribute': <Attributes.STR: 'str'>,
'byHabitica': False,
'challenge': dict({
'broken': None,
'id': None,
'shortName': None,
'taskId': None,
'winner': None,
}),
'checklist': list([
]),
'collapseChecklist': False,
'completed': False,
'counterDown': None,
'counterUp': None,
'createdAt': datetime.datetime(2024, 10, 10, 15, 57, 14, 304000, tzinfo=datetime.timezone.utc),
'date': None,
'daysOfMonth': list([
]),
'down': None,
'everyX': 1,
'frequency': <Frequency.WEEKLY: 'weekly'>,
'group': dict({
'assignedDate': None,
'assignedUsers': list([
]),
'assignedUsersDetail': dict({
}),
'assigningUsername': None,
'completedBy': dict({
'date': None,
'userId': None,
}),
'id': None,
'managerNotes': None,
'taskId': None,
}),
'history': list([
]),
'id': UUID('7d92278b-9361-4854-83b6-0a66b57dce20'),
'isDue': False,
'nextDue': list([
datetime.datetime(2024, 12, 14, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 1, 18, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 2, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 3, 15, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 4, 19, 23, 0, tzinfo=datetime.timezone.utc),
datetime.datetime(2025, 5, 17, 23, 0, tzinfo=datetime.timezone.utc),
]),
'notes': 'Wähle eine Programmiersprache aus, die du noch nicht kennst, und lerne die Grundlagen.',
'priority': <TaskPriority.EASY: 1>,
'reminders': list([
]),
'repeat': dict({
'f': False,
'm': False,
's': False,
'su': False,
't': False,
'th': False,
'w': False,
}),
'startDate': datetime.datetime(2024, 9, 20, 23, 0, tzinfo=datetime.timezone.utc),
'streak': 1,
'tags': list([
]),
'text': 'Lerne eine neue Programmiersprache',
'up': None,
'updatedAt': datetime.datetime(2024, 11, 27, 23, 47, 29, 986000, tzinfo=datetime.timezone.utc),
'userId': UUID('5f359083-ef78-4af0-985a-0b2c6d05797c'),
'value': -0.9215181434950852,
'weeksOfMonth': list([
]),
'yesterDaily': True,
}),
]), ]),
}) })
# --- # ---

View File

@ -49,6 +49,12 @@
'summary': 'Arbeite an einem kreativen Projekt', 'summary': 'Arbeite an einem kreativen Projekt',
'uid': '6e53f1f5-a315-4edd-984d-8d762e4a08ef', 'uid': '6e53f1f5-a315-4edd-984d-8d762e4a08ef',
}), }),
dict({
'description': 'Wähle eine Programmiersprache aus, die du noch nicht kennst, und lerne die Grundlagen.',
'status': 'needs_action',
'summary': 'Lerne eine neue Programmiersprache',
'uid': '7d92278b-9361-4854-83b6-0a66b57dce20',
}),
]), ]),
}), }),
}) })
@ -144,7 +150,7 @@
'last_changed': <ANY>, 'last_changed': <ANY>,
'last_reported': <ANY>, 'last_reported': <ANY>,
'last_updated': <ANY>, 'last_updated': <ANY>,
'state': '3', 'state': '4',
}) })
# --- # ---
# name: test_todos[todo.test_user_to_do_s-entry] # name: test_todos[todo.test_user_to_do_s-entry]

View File

@ -622,6 +622,7 @@ async def test_move_todo_item_exception(
("duedate_fixture_6.json", "2024-10-21"), ("duedate_fixture_6.json", "2024-10-21"),
("duedate_fixture_7.json", None), ("duedate_fixture_7.json", None),
("duedate_fixture_8.json", None), ("duedate_fixture_8.json", None),
("duedate_fixture_9.json", None),
], ],
ids=[ ids=[
"default", "default",
@ -632,6 +633,7 @@ async def test_move_todo_item_exception(
"monthly starts on fixed day", "monthly starts on fixed day",
"grey daily", "grey daily",
"empty nextDue", "empty nextDue",
"grey daily no weekdays",
], ],
) )
@pytest.mark.usefixtures("set_tz") @pytest.mark.usefixtures("set_tz")