Merge branch 'develop' into feature/documentation
This commit is contained in:
commit
1bcb24b9eb
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,6 +2,7 @@
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/django,pycharm+all,python,linux,macos,windows
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=django,pycharm+all,python,linux,macos,windows
|
||||
|
||||
README.rst
|
||||
|
||||
### Django ###
|
||||
*.log
|
||||
|
@ -37,7 +37,7 @@ limit-inference-results=100
|
||||
# List of plugins (as comma separated values of python module names) to load,
|
||||
# usually to register additional checkers.
|
||||
load-plugins=pylint_django
|
||||
django-settings-module=access_controller_new.access_controller.settings
|
||||
django-settings-module=access_controller.settings
|
||||
|
||||
# Pickle collected data for later comparisons.
|
||||
persistent=yes
|
||||
|
18
README.md
18
README.md
@ -149,22 +149,24 @@ docker run -d -p 8000:8000 \
|
||||
Пример полной конфигурации можно найти в [.env.example](.env.example). Почту и токен админа ZenDesk взять у руководителя (если вы не админ).
|
||||
|
||||
## Для проверки pylint используем:
|
||||
pylint --django-settings-module=access_controller.access_controller.settings ../access_controller (каталог, где лежит проект)
|
||||
```bash
|
||||
pylint main
|
||||
```
|
||||
|
||||
## Для приведения файлов к стандарту PEP8 используем:
|
||||
```bash
|
||||
autopep8 --in-place filename
|
||||
```
|
||||
|
||||
##Для проверки орфографии:
|
||||
```bash
|
||||
cd docs
|
||||
|
||||
make spelling
|
||||
```
|
||||
##Для обновления документации:
|
||||
m2r README.md
|
||||
|
||||
cd docs
|
||||
|
||||
make html
|
||||
|
||||
```bash
|
||||
./documentation.sh
|
||||
```
|
||||
|
||||
## Read more
|
||||
- Zenpy: [http://docs.facetoe.com.au](http://docs.facetoe.com.au)
|
||||
|
201
README.rst
201
README.rst
@ -1,201 +0,0 @@
|
||||
|
||||
Управление правами доступа
|
||||
--------------------------
|
||||
|
||||
Идея - написать программу(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 ../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/>`_
|
7
documentation.sh
Executable file
7
documentation.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
m2r README.md
|
||||
cd docs
|
||||
make html
|
||||
cd ..
|
||||
rm README.rst
|
48
main/migrations/0019_auto_20210527_1935.py
Normal file
48
main/migrations/0019_auto_20210527_1935.py
Normal file
@ -0,0 +1,48 @@
|
||||
# Generated by Django 3.2.3 on 2021-05-27 16:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0018_alter_unassignedticket_ticket_id'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='rolechangelogs',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='rolechangelogs',
|
||||
name='new_role',
|
||||
field=models.BigIntegerField(default=0, help_text='Присвоенная роль'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='rolechangelogs',
|
||||
name='old_role',
|
||||
field=models.BigIntegerField(default=0, help_text='Старая роль'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='unassignedticket',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='unassignedticket',
|
||||
name='status',
|
||||
field=models.IntegerField(choices=[(0, 'Снят с пользователя, перенесён в буферную группу'), (1, 'Авторство восстановлено'), (2, 'Пока нас не было, тикет был перенесен из буферной группы. Дополнительные действия не требуются'), (3, 'Тикет уже был закрыт. Дополнительные действия не требуются'), (4, 'Тикет решён. Записан на пользователя с почтой SOLVED_TICKETS_EMAIL')], default=0, help_text='Статус тикета'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userprofile',
|
||||
name='custom_role_id',
|
||||
field=models.BigIntegerField(default=0, help_text='Код роли пользователя'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userprofile',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||
),
|
||||
]
|
@ -88,7 +88,11 @@
|
||||
<tr>
|
||||
<td scope="col"> </td>
|
||||
{% for date in log_stats.keys %}
|
||||
{% if interval == 'days' %}
|
||||
<td scope="col">{{ date | date:'d.m' }}</td>
|
||||
{% else %}
|
||||
<td scope="col">{{ date.1 | date:'F' }}</td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
|
@ -447,6 +447,7 @@ def statistic_page(request: WSGIRequest) -> HttpResponse:
|
||||
context['errors'] = data.errors
|
||||
if data.warnings:
|
||||
context['warnings'] = data.warnings
|
||||
context['interval'] = data.interval
|
||||
context['log_stats'] = stats if not context['errors'] else None
|
||||
elif request.method == 'GET':
|
||||
form = StatisticForm()
|
||||
|
Loading…
x
Reference in New Issue
Block a user