# Как использовать переменные(контекст) для создания скриптов для действия по событию в Swarmica
# Вопрос

Как использовать переменные(контекст) для создания скриптов для действия по событию

# Ответ

В Swarmica для **Действия по событию** в качестве действия можно использовать Python скрипты.

Подробнее о написании скриптов можно узнать в [этой статье](https://support.swarmica.com/article/ru/1157-napisanie-plaginov-dlya-avtomatizacii-dejstvij-na-python.html).

В зависимости от сценария в скрипт передаются данные о конкретном событии и дополнительный контекст(если требуется).

Для действий по событию используется 5 видов событий:

[**ArticleEvent** ](https://support.swarmica.com/articles/1605/view#articleevent)- События Статьи
[**CustomFieldEvent** ](https://support.swarmica.com/articles/1605/view#customfieldevent)- События Кастомного поля
[**KCSEvent** ](https://support.swarmica.com/articles/1605/view#kcsevent)- События KCS
[**TicketEvent** ](https://support.swarmica.com/articles/1605/view#ticketevent)- События Заявки
[**UserEvent** ](https://support.swarmica.com/articles/1605/view#userevent)- События Пользователя

Для каждого из событий передаются определенные параметры, описанные в этой [статье](https://support.swarmica.com/article/ru/1605).

Когда срабатывает триггер, передаются данные в таком виде:

```python
{'data': {'event_id': <ID>, 'event': <TicketEvent: TicketEvent object (<ID>)>[, <ДОП_КОНТЕКСТ>]}
```

### Обработка данных События

Для использования данных о Cобытии необходимо обрабатывать Объект event, передаваемый в данных. Можно вывести этот Объект в отдельную переменную. Например:

```python
event = data.get('event', None)
```

или

```python
event = <EVENT_NAME>.objects.filter(id=data['event_id']).first()
```

где `<EVENT_NAME>` - соответствующее событие.

Например, сценарий должен срабатывать по Событию Заявки([TicketEvent](https://support.swarmica.com/articles/1605/view#ticketevent)). В таком случае код будет следующим:

```python
event = TicketEvent.objects.filter(id=data['event_id']).first()
```

Далее полученную переменную `event` можно использовать для обработки параметров передаваемых соответствующим Событием. Структура переменной для параметров выглядит так:

```python
event.Параметр[.Параметр[.<...>]]
```

Если Параметр является Объектом, содержащим собственные Параметры, то конечная структура переменной усложняется.

Например, используется сценарий по Событию [TicketEvent](https://support.swarmica.com/articles/1605/view#ticketevent). Событие [TicketEvent](https://support.swarmica.com/article/ru/1605#ticketevent) - само по себе является сущностью(объектом), включающим следующие параметры:

| Параметр        | Что делает                                               | Значения                                                                              |
| --------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| responsible     | передает Исполнителя События                             | Объект [user](https://support.swarmica.com/articles/1605/view#user)                   |
| date            | передает дату События                                    |                                                                                       |
| old\_value      | передает старые значения События                         |                                                                                       |
| new\_value      | передает новые значения События                          |                                                                                       |
| ticket          | передает Заявку, в которой произошло Событие             | Объект [ticket](https://support.swarmica.com/articles/1605/view#ticket)               |
| ticket\_comment | Передает комментарии Заявки, в которой произошло Событие | Объект [ticketcomment](https://support.swarmica.com/articles/1605/view#ticketcomment) |

И нам нужно произвести действие с самой Заявкой. В параметрах, как видно, передается Объект [ticket](https://support.swarmica.com/articles/1605/view#ticket). Соответственно надо обрабатывать этот самый объект и переменная будет выглядеть так:

```python
event.ticket
```

Для удобства можно определить объект в отдельную переменную:

```python
ticket = event.ticket
```

Например, нам нужно вывести информацию о Заявке(id) и дате её создания(created\_at) в лог, тогда код может выглядеть так:

```python
ticket = event.ticket
logger.info(f"Заявка #{ticket.id} создана {ticket.created_at}")
```

или так:

```python
logger.info(f"Заявка #{event.ticket.id} создана {event.ticket.created_at}")
```

### Обработка дополнительного контекста

Подробнее о контексте можно узнать в [этой статье](https://support.swarmica.com/article/ru/1351-chto-takoe-kontekst-v-dejstviyah-po-sobytiyu-i-raspisaniyu.html)

Также для действия по событию можно добавить дополнительный контекст в **Настройки - Действия по Событию - Действие** в поле **Добавить данные в контекст**. Данные добавляются в формате json.

При срабатывании События доп контекст передается вместе с данными о событии. Например в доп. контекст добавлено следующее:

```json
{
  "id": "1234"
}
```

Тогда данные передаваемые в скрипт будут выглядеть так:

```txt
{'data': {'event_id': <ID>, 'event': <TicketEvent: TicketEvent object (<ID>)>, 'id':'1234'}
```

Для работы с данными доп контекста в самом скрипте можно вывести их в отдельную переменную:

```python
id = data.get('id', None)
```

### Пример

Допустим есть сценарий: при повышении приоритета Заявки до "Критичный" необходимо поместить Заявку в отдельную группу.

В условиях для события устанавливаем:

```txt
Тип события=Приоритет заявки изменён
Заявка: Приоритет= Срочный
```

В данном сценарии используется [**TicketEvent**](https://support.swarmica.com/articles/1605/view#ticketevent)(События Заявки). Для передачи в скрипт Группы, на которую нужно назначить Заявку мы будет использовать дополнительный контекст.

В дополнительный контекст добавляем UID новой группы:

```json
{
  "new_group_uid": "ABCMWvoee35feOeA"
}
```

Скрипт будет выглядеть так:

```python
# Подгружаем необходимые модули для запуска скрипта и для работы с задействованными объектами
from runtime.runners import BaseRunner             
from core.models import TicketEvent, Group, Ticket  

# модуль для логирования
import logging                                     
logger = logging.getLogger(__name__)

class Runner(BaseRunner):
    def run(self, *args, **kwargs):
        logger.info(kwargs)
        # Помещаем передаваемые в Событии данные в переменную data
        data = kwargs.get('data', {})

        # Помещаем объект TicketEvent в переменную event c помощью data['event_id'] 
        event = TicketEvent.objects.filter(id=data['event_id']).first()

        # Если Событие не передалось пишем об этом в лог
        if not event:
            logger.error(f"No event with {data['event_id']} found, exiting")
            return

        # Помещаем объект ticket из event в переменную ticket
        ticket=event.ticket

        # Далее удостоверяемся, что заявка передана в Событии
        if ticket:                                       
            ticket_id = event.ticket.id                  # помещаем id Заявки из События в переменную ticket_id
            group_uid = data.get('new_group_uid',None)   # помещаем UID группы из дополнительного контекста в переменную group_uid
            new_group = Group.objects.get(uid=group_uid) # помещаем Объект нужной группы в переменную, используя переменную group_uid
            logger.info(f"Заявка #{ticket_id} должна быть назначена на группу с UID {group_uid}")

            # Далее проверяем, что Заявка находится в другой группе и назначаем на нужную группу
            if ticket.group.uid != group_uid:
                ticket.group = new_group
                ticket.save()
                logger.info(f"ticket group changed")                
            else: # если заявка изначально была уже назначена на нужну группу пишем об этом в лог и ничего не делаем
                logger.info(f"ticket is in proper group already")               
                
        else: # если заявки нет в Событии, то пишем об этом в лог
            logger.warning(f"Ticket is not found in event {data['event_id']},exiting")
            return
```