####################################
## Действие при закрытии задачи теста
def get_dev_children(obj, logic_type):
    children = []
    for t in obj.parent_task.child_tasks.load():
        if t == obj:
            continue
        if t.cache_status_type == 'CLOSED':
            continue
        if t.logic_type == logic_type:
            children.append(t)
    return children

def change_children_status(children, status):
    for t in children:
        t.status = status
        t.save()
    return None

def change_parent_status(obj, status):
    obj.parent_task.status = status
    obj.parent_task.save()
    return True

def _main(obj, current_person=None):
    #### Проверяем, что с родителем вообще что-то нужно делать
    parent_cur_status = obj.parent_task.status
    if parent_cur_status.status_type == "CLOSED":
        return None

    #### Определяем воркфлоу родителя, чтобы подобрать правильный статус
    wf_bug = models.CmfWorkflow.get(name='EvaBug')
    wf_feature = models.CmfWorkflow.get(name='EvaFeature')
    wf_dev = models.CmfWorkflow.get(name='EvaDevBack/Front')
    wf_unicorn = models.CmfWorkflow.get(name='Один тащер')

    #### Подбираем подходящий статус для родителя
    wf = obj.parent_task.workflow
    # Закрывать задачи может только постановщик.
    if current_person == obj.cmf_owner:
        if wf == wf_bug:
            parent_status = wf.get_default_status(status_code='closed')
        elif wf == wf_dev:
            parent_status = wf.get_default_status(status_code='eva_devbf_done')
    elif wf == wf_feature:
        parent_status = wf.get_default_status(status_code='in_review')
    elif wf == wf_unicorn:
        if obj.name.startswith('Тестирование INT'):
            # Статус - Тестирование INT создается дочерняя задача  по бп  TEST (  как в БП BUg)
            # успешно в - черепик
            parent_status = wf.get_default_status(status_code='cherry-pick')
        elif obj.name.startswith('Финальное Тестирование'):
            # Статус - Финальное Тестирование создается дочерняя задача  по бп  TEST (  как в БП BUg)
            # успешно в - Подтверждение закрытия
            parent_status = wf.get_default_status(status_code='in_review') # Подтверждение закрытия
    else:
        parent_status = wf.get_default_status(status_type='IN_REVIEW')

    #### Если фича, то переводим задачи разработки в готово
    # if obj.parent_task.logic_type == lt_feature:
    if wf == wf_feature:
        logic_type = models.CmfLogicType.get(code='task.agile:taskdev')
        children = get_dev_children(obj, logic_type)
        status = models.CmfStatus.get(code='eva_devbf_done')
        change_children_status(children, status)

    # Закрываем родителя
    ## Дебаг для TEM-1625024548
    # cmf_alert(f"""
    #     PARENT {obj.parent_task.code} STATUS CHANGE! 
    #     FROM = {parent_cur_status.load()} ! 
    #     TO = {parent_status} ! 
    #     PARENT WORKFLOW = {wf}""")
    from cmf.include import cmfutil
    with cmfutil.disable_acl():
        if parent_status:
            change_parent_status(obj, parent_status)
        else:
            msg = f"""Не могу сменить статус родительской задачи {obj.parent_task}.
                Должен быть статус code \"testirovanie\" или type \"IN_REVIEW\"
                , сейчас тип {parent_cur_status.status_code}."""
            cmf_alert(msg)
    return None


def run(self):
    current_person = g.current_person
    from cmf.util import cmfutil
    with cmfutil.run_system():
        # БП могут использовать в отрыве от EvaFeature/EvaBug
        if self.parent_task:
            _main(self, current_person=current_person)