Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion django_tasks/backends/database/backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
P = ParamSpec("P")


@dataclass
@dataclass(frozen=True)
class TaskResult(BaseTaskResult[T]):
db_result: "DBTaskResult"

Expand Down
4 changes: 2 additions & 2 deletions django_tasks/backends/database/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,8 @@ def task_result(self) -> "TaskResult[T]":
backend=self.backend_name,
)

result._return_value = self.return_value
result._exception_data = self.exception_data
object.__setattr__(result, "_return_value", self.return_value)
object.__setattr__(result, "_exception_data", self.exception_data)

return result

Expand Down
20 changes: 12 additions & 8 deletions django_tasks/backends/immediate.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,19 @@ def _execute_task(self, task_result: TaskResult) -> None:
async_to_sync(task.func) if iscoroutinefunction(task.func) else task.func
)

task_result.started_at = timezone.now()
object.__setattr__(task_result, "started_at", timezone.now())
try:
task_result._return_value = json_normalize(
calling_task_func(*task_result.args, **task_result.kwargs)
object.__setattr__(
task_result,
"_return_value",
json_normalize(
calling_task_func(*task_result.args, **task_result.kwargs)
),
)
except BaseException as e:
task_result.finished_at = timezone.now()
object.__setattr__(task_result, "finished_at", timezone.now())
try:
task_result._exception_data = exception_to_dict(e)
object.__setattr__(task_result, "_exception_data", exception_to_dict(e))
except Exception:
logger.exception("Task id=%s unable to save exception", task_result.id)

Expand All @@ -53,14 +57,14 @@ def _execute_task(self, task_result: TaskResult) -> None:
task.module_path,
ResultStatus.FAILED,
)
task_result.status = ResultStatus.FAILED
object.__setattr__(task_result, "status", ResultStatus.FAILED)

# If the user tried to terminate, let them
if isinstance(e, KeyboardInterrupt):
raise
else:
task_result.finished_at = timezone.now()
task_result.status = ResultStatus.COMPLETE
object.__setattr__(task_result, "finished_at", timezone.now())
object.__setattr__(task_result, "status", ResultStatus.COMPLETE)

def enqueue(
self, task: Task[P, T], args: P.args, kwargs: P.kwargs
Expand Down
6 changes: 3 additions & 3 deletions django_tasks/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ def wrapper(f: Callable[P, T]) -> Task[P, T]:
return wrapper


@dataclass
@dataclass(frozen=True)
class TaskResult(Generic[T]):
task: Task
"""The task for which this is a result"""
Expand Down Expand Up @@ -292,7 +292,7 @@ def refresh(self) -> None:
refreshed_task = self.task.get_backend().get_result(self.id)

for attr in TASK_REFRESH_ATTRS:
setattr(self, attr, getattr(refreshed_task, attr))
object.__setattr__(self, attr, getattr(refreshed_task, attr))

async def arefresh(self) -> None:
"""
Expand All @@ -301,4 +301,4 @@ async def arefresh(self) -> None:
refreshed_task = await self.task.get_backend().aget_result(self.id)

for attr in TASK_REFRESH_ATTRS:
setattr(self, attr, getattr(refreshed_task, attr))
object.__setattr__(self, attr, getattr(refreshed_task, attr))
4 changes: 2 additions & 2 deletions tests/tests/test_dummy_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def test_refresh_result(self) -> None:
)

enqueued_result = default_task_backend.results[0] # type:ignore[attr-defined]
enqueued_result.status = ResultStatus.COMPLETE
object.__setattr__(enqueued_result, "status", ResultStatus.COMPLETE)

self.assertEqual(result.status, ResultStatus.NEW)
result.refresh()
Expand All @@ -86,7 +86,7 @@ async def test_refresh_result_async(self) -> None:
)

enqueued_result = default_task_backend.results[0] # type:ignore[attr-defined]
enqueued_result.status = ResultStatus.COMPLETE
object.__setattr__(enqueued_result, "status", ResultStatus.COMPLETE)

self.assertEqual(result.status, ResultStatus.NEW)
await result.arefresh()
Expand Down
Loading