Основной репозиторий Eva CRM

## Как развернуть стенд для разработки

Патчим конфиг: отключаем rdisk, redis и прописываем account на localhost:

``` python
data_sources = {
    "default": {
        "type": "sqlalchemy",
        "sqlalchemy.url": "sqlite:///db.sqlite3",
        "sqlalchemy.echo": True,
    },
}
cache_settings = {
    "default": {
        "type": "memory"
    }
}
AUTH_SESSION_COOKIE_DOMAIN = ".127.0.0.1"
AUTH_SERVER_URL = "http://127.0.0.1:8080"
PROPAGATE_EXCEPTIONS = False
UPLOAD_DIR = "/opt/eva-app/files/"
SMS_URL = "http://smsgate.carbonsoft.ru/?login=000-000-000-000-001&pass=empty&tel={phone}&text={text}"
```

Обновляем или устанавливаем nodejs:

MacOS:

``` shell
brew install node
brew upgrade node
```

В Linux debian-based: см. apt репы, в RHEL-based - по аналогии с `fox_acrm.git/acrm_install.sh`

Устанавливаем 460мб зависимостей:

``` shell
npm ci
```

Инициализируем приложение

```
cp -af cmf/contrib/new_project/manage.py ./manage.py
chmod a+x manage.py
# генерируем ключи
./manage.py generate_rsa_keypair
# создаём структуру базы данных
./manage.py init_db
```

И, наконец, запускаем:

``` shell
# В одной вкладке запускаем бэкенд
./manage.py start
# В другой вкладке запускаем фронтенд
npm run start
```


#### cmf shell - командная оболочка

Может работать интерактивно в контексте cmf, либо выполнять команды/скрипты.

Usage:
```
cd /opt/eva-app

# Интерактивный режим
python3 ./manage.py shell

# Не интерактивный режим
python3 ./manage.py shell <<<"print('Hello World')"
python3 ./manage.py shell "print('line1')" "print('line2')" ...
cat data_file | python3 ./manage.py shell "proccess_stdout_func()"

```

Помимо стандартного окружения cmf.include, в консоле есть функции commit(), rollback()

В не интерактивном режиме, коммит выполняется автоматически, если небыло ошибки.

В интерактивном режиме commit() нужно выполнять явно, чтобы не фиксировать работу, в которой мы не уверены.

Так же важно делать commit() сразу после изменений, чтобы долго не держать транзакцию и возможные блокировки. 


#### Клонирование БД на стенд

Хак, для экранирования сложных команд для выполнения через ssh
```
ssh host "sudo - postgres -c $(printf '%q' "some nested command")"
```

```
(
    set -eu
    cd /opt/acrm
    systemd stop stop eva-app redis
    # (optional) backup db
    su - postgres -c "pg_dump -C evadb" > evacrm_local_$(date "+%Y-%m-%d_%H%M%S")
    # drop db
    su - postgres -c "psql -c 'drop database evacrm;'"
    # Загрузим базу с нужного сервера: -C - заскриптовать создание БД
    ssh some_host "su - postgres -c pg_dump\ -C\ evadb" \
        | su - postgres -c psql
    # (optional) Накатим актуальные миграции и запустим
    python3 -m alembic upgrade head
    systemd stop start redis eva-app
    echo "Success"
)
```


#### Build Relation Cache - вложенные зависимости объектов

Скрипт выполняет:
 - удаляет старые связи
 - прочищает m2m таблицы от старых деревьев и от возможных дублей 
 - создаёт новые связи

Логично запускать при каждом обнолении, но ребилд базы БСРМ занимает 8 минут (TODO оптимизировать, в коде есть пометки).

Предварительно стоит сделать бэкап(todo !!! CMF shell должен делать rollback при ошибке)

Поэтому запускаем по необходимости.

```
cd /opt/eva-app
python3 ./manage.py shell <<<"models.RelationCache.recalculate()"
```
