From cc46bc0ca559c628f0d96d1f8d4a261ac1534e35 Mon Sep 17 00:00:00 2001 From: HK-Mattew Date: Tue, 19 Nov 2024 18:08:33 -0300 Subject: [PATCH] Fixed an issue with task configuration rewriting in the .add_job method #953 --- src/apscheduler/_schedulers/async_.py | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/apscheduler/_schedulers/async_.py b/src/apscheduler/_schedulers/async_.py index 09821faa1..e6d68bc82 100644 --- a/src/apscheduler/_schedulers/async_.py +++ b/src/apscheduler/_schedulers/async_.py @@ -348,6 +348,7 @@ async def configure_task( """ func_ref: str | None = None + task: Task | None = None if callable(func_or_task_id): task_params = get_task_params(func_or_task_id) if task_params.id is unset: @@ -364,12 +365,24 @@ async def configure_task( metadata=func_or_task_id.metadata, ) elif isinstance(func_or_task_id, str) and func_or_task_id: - task_params = get_task_params(func) if callable(func) else TaskParameters() - task_params.id = func_or_task_id + try: + task = await self.data_store.get_task(func_or_task_id) + task_params = TaskParameters( + id=task.id, + job_executor=task.job_executor, + max_running_jobs=task.max_running_jobs, + misfire_grace_time=task.misfire_grace_time, + metadata=task.metadata, + ) + except TaskLookupError: + task_params = get_task_params(func) if callable(func) else TaskParameters() + task_params.id = func_or_task_id else: raise TypeError( "func_or_task_id must be either a task, its identifier or a callable" ) + + assert task_params.id # Apply any settings passed directly to this function as arguments if job_executor is not unset: @@ -393,7 +406,6 @@ async def configure_task( self.task_defaults.metadata, task_params.metadata, metadata ) - assert task_params.id if callable(func): self._task_callables[task_params.id] = func try: @@ -403,7 +415,7 @@ async def configure_task( modified = False try: - task = await self.data_store.get_task(cast(str, task_params.id)) + task = task or await self.data_store.get_task(cast(str, task_params.id)) except TaskLookupError: task = Task( id=task_params.id, @@ -418,25 +430,22 @@ async def configure_task( changes: dict[str, Any] = {} if func is not unset and task.func != func_ref: changes["func"] = func_ref - modified = True if task_params.job_executor != task.job_executor: changes["job_executor"] = task_params.job_executor - modified = True if task_params.max_running_jobs != task.max_running_jobs: changes["max_running_jobs"] = task_params.max_running_jobs - modified = True if task_params.misfire_grace_time != task.misfire_grace_time: changes["misfire_grace_time"] = task_params.misfire_grace_time - modified = True if task_params.metadata != task.metadata: changes["metadata"] = task_params.metadata - modified = True - task = attrs.evolve(task, **changes) + if changes: + task = attrs.evolve(task, **changes) + modified = True if modified: await self.data_store.add_task(task)