# Создание поздадач на документацию и в маркетинг

def create_or_update(logic_type = None, name = None, obj = None,
                     responsible = None, lists = None, tmplt = None):
    """
    Создаст подзадачу и скопирует в неё нужные данные из родительской.
    Можно создать задачу из шаблона.
    """
    # Ключевые параметры, обязательные
    if not obj or not name:
        cmf_alert('Необходимо указать имя новой задачи и родительскую задачу')
        raise ValueError

    # Ищем задачу
    task = models.CmfTask.get(parent_task=obj, name=name)

    # Если не нашли, создаём
    if not task:
        # Задача из шаблона
        if tmplt:
            task = tmplt.create_task_from_template({'parent': obj.parent, 'is_dummy': False})
            task = models.CmfTask.get(id=task)
        # Задача без шаблона
        elif logic_type:
            task = models.CmfTask()
            task.logic_type = logic_type
        else:
            cmf_alert('Необходимо передать задачу-шаблон (tmplt) или логический тип (logit_type)')
            raise ValueError

    # Устанавливаем поля
    task.name = name
    task.parent_task = obj
    task.parent = obj.parent
    task.priority = obj.priority
    task.deadline = obj.deadline

    # Добавляем в списки
    if lists:
        for lst in lists:
            task.copy_to_list(lst)

    # Ответственный
    if responsible:
        task.responsible = responsible

    # Дублируем теги родительской задачи
    for tag in obj.tags.load():
        task.tags.append(tag)
    
    # Дублируем компоненты родительской задачи
    for comp in obj.components.load():
        task.components.append(comp)

    # Сразу аппрувим, иначе менеджеры тонут в уведомлениях
    task.approved = True

    # Сохраняем, что получилось.
    task.save()

def run(self):
    from cmf.util import cmfutil
    with cmfutil.run_system():
        if self.parent_task:
            # Скрипт используется в БП EvaFeature и EvaDevBack/Front
            # В первом случае, исходная задача с БП EvaFeature 
            # и на статусе "В разработку"создаётся подзадача с БП EvaDevBack/Front
            # Тогда задачи на доку и маркетинг должны создаваться только из EvaFeature.
            return

        logic_type = models.CmfLogicType.get(code='task.agile:dokumentatsija_na_produkt')
        if not logic_type:
            logic_type = models.CmfLogicType.get(code='task.agile:default')
        responsible = None
        lists = None

        # https://bcrm.carbonsoft.ru/desk/Task/CLD-1625033066
        # CmfList(LST-011442: 📝 Документация Evateam)
        lists = [models.CmfList.get(code='LST-011442')]
        name = f'Документация. {self.name}'
        responsible = models.CmfPerson.get(login='y.polina@carbonsoft.ru')
        if not responsible:
            cmf_alert(f'Не удалось найти ответственного для задачи {name}')
        create_or_update(logic_type = logic_type, name = name,
                         obj = self, responsible = responsible, lists = lists)

        # https://bcrm.carbonsoft.ru/desk/Task/CLD-1625033066
        # CmfList(SPR-011493: 📢 Новости разработки Evateam)
        lists = [models.CmfList.get(code='SPR-011493')]
        name = f'Маркетинг. {self.name}'
        responsible = models.CmfPerson.get(login='t.redkozubova@carbonsoft.ru')
        if not responsible:
            cmf_alert(f'Не удалось найти ответственного для задачи {name}')
        create_or_update(logic_type = logic_type, name = name,
                         obj = self, responsible = responsible, lists = lists)

        # https://bcrm.carbonsoft.ru/project/Task/EVAPJ-8840
        # CmfTask(TEM-1625019044: SPEC. Внести изменения)
        # CmfTask.is_template(True)
        tmplt = models.CmfTask.get(code='TEM-1625019044', is_template=True)
        create_or_update(tmplt = tmplt, obj = self, name = f'SPEC. Внести изменения. {self.name}')
