From 5f88a4f2977bbf13959065dff094af3986a50f61 Mon Sep 17 00:00:00 2001 From: Kiselev Igor Date: Thu, 13 May 2021 17:51:28 +0300 Subject: [PATCH 1/4] Fixed statistic view date bug --- main/templates/pages/statistic.html | 4 ++++ main/views.py | 1 + 2 files changed, 5 insertions(+) diff --git a/main/templates/pages/statistic.html b/main/templates/pages/statistic.html index b467250..202d8f2 100644 --- a/main/templates/pages/statistic.html +++ b/main/templates/pages/statistic.html @@ -88,7 +88,11 @@   {% for date in log_stats.keys %} + {% if interval == 'days' %} {{ date | date:'d.m' }} + {% else %} + {{ date }} + {% endif %} {% endfor %} diff --git a/main/views.py b/main/views.py index 69fdd92..5c02a65 100644 --- a/main/views.py +++ b/main/views.py @@ -381,6 +381,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() From 23eb2bf2ecf9041590a7d5994e94844c67439646 Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Thu, 13 May 2021 19:55:21 +0300 Subject: [PATCH 2/4] Fix month display on statistics page --- main/extra_func.py | 2 +- main/templates/pages/statistic.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index c41625a..1aade32 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -373,7 +373,7 @@ class StatisticData: for key, value in stat.items(): current_month_start = max(self.start_date, date(year=key.year, month=key.month, day=1)) current_month_end = min(self.end_date, last_day_of_month(date(year=key.year, month=key.month, day=1))) - index = ' - '.join([str(current_month_start), str(current_month_end)]) + index = (current_month_start, current_month_end) if new_stat.get(index): new_stat[index] += value else: diff --git a/main/templates/pages/statistic.html b/main/templates/pages/statistic.html index 202d8f2..87bea80 100644 --- a/main/templates/pages/statistic.html +++ b/main/templates/pages/statistic.html @@ -91,7 +91,7 @@ {% if interval == 'days' %} {{ date | date:'d.m' }} {% else %} - {{ date }} + {{ date.1 | date:'F' }} {% endif %} {% endfor %} From 9f2d9f11ae0622d01f88aa8fae9984c44e689dce Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Thu, 27 May 2021 19:36:02 +0300 Subject: [PATCH 3/4] Add migration --- main/migrations/0019_auto_20210527_1935.py | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 main/migrations/0019_auto_20210527_1935.py diff --git a/main/migrations/0019_auto_20210527_1935.py b/main/migrations/0019_auto_20210527_1935.py new file mode 100644 index 0000000..b226c76 --- /dev/null +++ b/main/migrations/0019_auto_20210527_1935.py @@ -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'), + ), + ] From fbc65359754cf3e7d2b06a6b64d1375f755345c7 Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Thu, 27 May 2021 20:16:51 +0300 Subject: [PATCH 4/4] Fix pylint, add documentation gen script --- .gitignore | 1 + .pylintrc | 2 +- README.md | 18 +++-- README.rst | 201 ----------------------------------------------- documentation.sh | 7 ++ 5 files changed, 19 insertions(+), 210 deletions(-) delete mode 100644 README.rst create mode 100755 documentation.sh diff --git a/.gitignore b/.gitignore index 2d1bab8..9d4839f 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/.pylintrc b/.pylintrc index 0f1221a..d0114f8 100644 --- a/.pylintrc +++ b/.pylintrc @@ -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 diff --git a/README.md b/README.md index f989953..f8d617f 100644 --- a/README.md +++ b/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) diff --git a/README.rst b/README.rst deleted file mode 100644 index 219cdd7..0000000 --- a/README.rst +++ /dev/null @@ -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 `_ -* Zendesk API: `https://developer.zendesk.com/rest_api/docs/ `_ diff --git a/documentation.sh b/documentation.sh new file mode 100755 index 0000000..bfb2cd0 --- /dev/null +++ b/documentation.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +m2r README.md +cd docs +make html +cd .. +rm README.rst