
Управление правами доступа
--------------------------

Идея - написать программу(Web приложение), которая будет выдавать права пользователям системы по запросу самого 
пользователя. Например, из 12 человек 3 сейчас работают с правами админа, по окончании рабочей смены они сдают 
свои права (освобождают места) и другие пользователи могут запросить эти права в свое пользование.

Оставшиеся 9 человек получают права легкого агента - без прав редактирования, а только чтение.

Из технологий - программа должна взаимодействовать с api системы Zendesk(система обращений клиентов - жалобы), 
проверять авторизованного пользователя на права(будет возможность менять права напрямую из Zendesk - нужна 
синхронизация прав с приоритетом у Zendesk). 

Если руками в самом Zendesk права у пользователя отобрали или наоборот 
присвоили, то наша программа обновляет статус пользователя в соответствии с данными синхронизации 
(например, раз в минуту). 

Так же в идеале должна быть проверка, что пользователь сайта существует на сайте Zendesk(по токену). 

Сэндбокс Zendesk нам предоставит моя компания, библиотеку для работы с api уже подсказали. 
Сама программа (наша) будет обладать админскими правами и реализовывать контроль и выдачу прав другим пользователям.

*Итого:*


#. Реализовать авторизацию пользователей с проверкой по API на существование такого пользователя
#. Реализовать интерфейс со статистикой рабочих мест(занято, свободно, кто занимает)
#. Реализовать логирование действий(когда взял права, когда отдал - запись в файл и БД)
#. Реализовать передачу прав приложением по запросу от пользователя и замену прав пользователя 
   у которого права отбираются внутри Zendesk (на легкий агент)
#. Реализовать синхронизацию по API на проверку прав(не менялись ли в системе Zendesk)
#. Реализовать возможность добавить большее количество админских прав
#. Реализовать возможность добавления легких агентов(права только на просмотр)
#. Реализовать на общей странице текущую информацию о пользователе - текущие права, карточка пользователя

Технологический стек:
---------------------


* Python 3
* Django 3

Quickstart
----------

Перед запуском необходимо создать ``.env`` файл.

.. code-block:: bash

   cp .env.example .env

Заменить переменные в ``.env`` на актуальные.

.. code-block:: bash

   sudo apt install make
   pip install --upgrade pip
   pip install -r requirements/dev.txt
   ./manage.py migrate
   ./manage.py loaddata data.json
   ./manage.py runserver

Перед запуском для тестирования:
--------------------------------

Убедитесь, что вы зарегистрированы в песочнице ZenDesk, у вас назначена организация ``SYSTEM``
Для админов ZenDesk дополнительно - создайте токен доступа в ZenDesk
При запуске в Docker убедитесь что папка, которая будет служить хранилищем для БД, открыта на запись и чтение

Запуск на локальной машине:
---------------------------


* Скопировать репозиторий на локальную машину
* Перейти в папку приложения
* Активировать виртуальное окружение
* Выполнить команду ``pip install -r requirements/dev.txt``
* В файл ``.env`` добавить следующие переменные:

.. code-block::

   ACTRL_DEBUG={0/1} - включить режим дебага
   ACTRL_HOST={HOSTNAME} - при запуске без дебага, надо указать домен на котором будет работать приложение
   ACTRL_SECRET_KEY={DJANGO_SECRET_KEY} - секретный ключ сгенерированный Django

   ACTRL_EMAIL_HOST={SMTP_HOST} - домен почтового сервера через который приложение будет отправлять письма, например "smtp.gmail.com"
   ACTRL_EMAIL_PORT={SMTP_PORT} - порт для почтового сервера, например 587, 465 , 2525
   ACTRL_EMAIL_TLS={USE_TLS} - использовать TLS для подключения к почтовому серверу, 0 или 1
   ACTRL_EMAIL_HOST_USER={USERNAME} - логин с которым приложение входит на почтовый сервер
   ACTRL_EMAIL_HOST_PASSWORD={PASSWORD} - пароль/ключ с которым приложение входит на почтовый сервер
   ACTRL_FROM_EMAIL={EMAIL} - адрес с которого приложение отправляет письма
   ACTRL_SERVER_EMAIL={EMAIL} - адрес на который отвечают пользователя

   ACTRL_API_EMAIL={EMAIL} - почта админа в ZenDesk
   ACTRL_API_PASSWORD={PASSWORD} - пароль админа ZenDesk
   ACTRL_API_TOKEN={API_TOKEN} - API токен зендеск
   ACTRL_ZENDESK_SUBDOMAIN={DOMAIN} - домен ZenDesk

   ENG_CROLE_ID={ENGINEER_CUSTOM_ROLE_ID} - id роли инженера( custom_role_id сотрдника смены)
   LA_CROLE_ID={LIGHT_AGENT_CUSTOM_ROLE_ID} - id роли легкого агента (custom_role_id роли -легкий агент)
   EMPL_GROUP={EMPLOYEE_GROUP_NAME} - имя группы которой принадлежат сотрудники ССКС
   BUF_GROUP={BUFFER_GROUP_NAME} - имя буферной группы для передачи смен(через нее происходит управление тикетами)
   ST_EMAIL={SOLVED_TICKETS_EMAIL} - почта на которую будут переназначятся закрытые тикеты
   LICENSE_NO={LICENSE_NO} - количество лицензий, отображаемых как доступные в приложении
   SHIFTH={SHIFT_HOURS} - количество часов в рабочей смене (нужно для статистики, пока не реализовано но требует указания значения)


* Выполнить команду ``python manage.py migrate``
* Запустить приложение командой ``python manage.py runserver`` (можно указать в параметрах для файла manage.py)
* Перейти по ссылке в консоли (вероятнее всего откроется по адресу http://127.0.0.1:8000/)

Запуск в Docker:
----------------

Требуется установленный и настроенный Docker


* Скопировать репозиторий на локальную машину
* В командной строке перейти в папку проекта
* Выполнить команду ``docker build --tag access_controller:latest .``
* Выполнить команду 
  .. code-block:: bash

     docker run -d -p 8000:8000 \
     ACTRL_DEBUG={0/1} \
     ACTRL_HOST={HOSTNAME} \
     ACTRL_SECRET_KEY={DJANGO_SECRET_KEY} \
     ACTRL_EMAIL_HOST={SMTP_HOST} \
     ACTRL_EMAIL_PORT={SMTP_PORT} \
     ACTRL_EMAIL_TLS={USE_TLS} \
     ACTRL_EMAIL_HOST_USER={USERNAME} \
     ACTRL_EMAIL_HOST_PASSWORD={PASSWORD} \
     ACTRL_FROM_EMAIL={EMAIL} \
     ACTRL_SERVER_EMAIL={EMAIL} \
     ACTRL_API_EMAIL={EMAIL} \
     ACTRL_API_PASSWORD={PASSWORD} \
     ACTRL_API_TOKEN={API_TOKEN} \
     ACTRL_ZENDESK_SUBDOMAIN={DOMAIN} \
     ENG_CROLE_ID={ENGINEER_CUSTOM_ROLE_ID} \
     LA_CROLE_ID={LIGHT_AGENT_CUSTOM_ROLE_ID} \
     EMPL_GROUP={EMPLOYEE_GROUP_NAME} \
     BUF_GROUP={BUFFER_GROUP_NAME} \
     ST_EMAIL={SOLVED_TICKETS_EMAIL} \
     LICENSE_NO={LICENSE_NO} \
     SHIFTH={SHIFT_HOURS} \
     -v {ABSOLUTE_PATH_TO_DB}:/zendesk-access-controller/db \
     access_controller:latest

* открываем запущенный контейнер в браузере (можно перейти по ссылке http://localhost:8000/)

Запуск с тестовыми юзерами:
---------------------------

На локальной машине - перед запуском команды ``python manage.py runserver`` выполнить команду ``python manage.py loaddata data.json``
Это создаст тестового админа и тестового пользователя в приложении для песочницы ZenDesk. 


* Админ - ``admin@gmail.com`` / ``zendeskadmin``
* Пользователь - ``123@test.ru`` / ``zendeskuser``

Не сработает если домен песочницы отличается от ``ngenix1612197338`` (на другом домене нужно будет создать сначала пользователей в песочнице с правами админа и легкого агента
с этими же email, назначить им организацию ``SYSTEM``\ )

Параметры тестовой песочницы:
-----------------------------

Пример полной конфигурации можно найти в `.env.example <.env.example>`_. Почту и токен админа ZenDesk взять у руководителя (если вы не админ).

Для проверки pylint используем:
-------------------------------

pylint --django-settings-module=access_controller.access_controller.settings ../access_controller (каталог, где лежит проект)

Для приведения файлов к стандарту PEP8 используем:
--------------------------------------------------

autopep8 --in-place filename

Для проверки орфографии:
------------------------

cd docs

make spelling

Для обновления документации:
----------------------------

m2r README.md

cd docs

make html

Read more
---------


* Zenpy: `http://docs.facetoe.com.au <http://docs.facetoe.com.au>`_
* Zendesk API: `https://developer.zendesk.com/rest_api/docs/ <https://developer.zendesk.com/rest_api/docs/>`_
