@@ -464,6 +464,20 @@ def continue_task(self, task: Task, is_returned: bool = False):
464464 .by_workflow (self .workflow .id ).with_tasks_after (task )
465465 .update (is_completed = False , date_completed = None )
466466 )
467+ if task .skip_for_starter and task .require_completion_by_all :
468+ starter = self .workflow .workflow_starter
469+ if starter :
470+ (
471+ TaskPerformer .objects
472+ .by_task (task .id )
473+ .exclude_directly_deleted ()
474+ .by_user_or_group (starter .id )
475+ .update (
476+ is_completed = True ,
477+ date_completed = timezone .now (),
478+ )
479+ )
480+
467481 # if task force snoozed then start task event already exists
468482 # but if task returned then
469483 if not task_start_event_already_exist :
@@ -479,6 +493,7 @@ def continue_task(self, task: Task, is_returned: bool = False):
479493 TaskPerformer .objects
480494 .by_task (task .id )
481495 .exclude_directly_deleted ()
496+ .not_completed ()
482497 .get_user_ids_emails_subscriber_set ()
483498 )
484499
@@ -615,6 +630,21 @@ def delay_task(self, task: Task, delay: Delay):
615630 delay = delay ,
616631 )
617632
633+ def _skip_task_for_starter (
634+ self ,
635+ task : Task ,
636+ is_returned : bool ,
637+ ):
638+ WorkflowEventService .task_skip_event (task )
639+ if is_returned and task .parents :
640+ task .status = TaskStatus .PENDING
641+ task .save (update_fields = ['status' ])
642+ self ._start_prev_tasks (task )
643+ else :
644+ task .status = TaskStatus .SKIPPED
645+ task .save (update_fields = ['status' ])
646+ self ._start_next_tasks (parent_task = task )
647+
618648 def start_task (
619649 self ,
620650 task : Task ,
@@ -642,16 +672,41 @@ def start_task(
642672 self ._start_prev_tasks (task )
643673 else :
644674 self ._start_next_tasks (parent_task = task )
645- else : # noqa: PLR5501
646- if is_returned :
647- self .continue_workflow (task = task , is_returned = is_returned )
675+ return
676+ if task .skip_for_starter and not self .workflow .is_external :
677+ starter = self .workflow .workflow_starter
678+ starter_perf = (
679+ TaskPerformer .objects
680+ .by_task (task .id )
681+ .exclude_directly_deleted ()
682+ .by_user_or_group (starter .id )
683+ .first ()
684+ )
685+ if starter_perf :
686+ if not task .require_completion_by_all :
687+ self ._skip_task_for_starter (task , is_returned )
688+ return
689+
690+ has_other_performers = (
691+ TaskPerformer .objects
692+ .by_task (task .id )
693+ .exclude_directly_deleted ()
694+ .exclude (pk = starter_perf .pk )
695+ .exists ()
696+ )
697+ if not has_other_performers :
698+ self ._skip_task_for_starter (task , is_returned )
699+ return
700+
701+ if is_returned :
702+ self .continue_workflow (task = task , is_returned = is_returned )
703+ else :
704+ delay = task .get_active_delay ()
705+ if delay :
706+ self .delay_task (task = task , delay = delay )
707+ self ._start_next_tasks ()
648708 else :
649- delay = task .get_active_delay ()
650- if delay :
651- self .delay_task (task = task , delay = delay )
652- self ._start_next_tasks ()
653- else :
654- self .continue_workflow (task = task , is_returned = is_returned )
709+ self .continue_workflow (task = task , is_returned = is_returned )
655710
656711 def complete_task (self , task : Task , by_user : bool = False ):
657712
0 commit comments