Merge branch 'develop' into feature/documentation
# Conflicts: # README.md # main/apiauth.py # main/tests.py # requirements/dev.txt
This commit is contained in:
commit
8747fc4aa1
@ -148,7 +148,6 @@ LOGIN_REDIRECT_URL = '/'
|
|||||||
LOGOUT_REDIRECT_URL = '/'
|
LOGOUT_REDIRECT_URL = '/'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Название_приложения.Название_файла.Название_класса_обработчика
|
# Название_приложения.Название_файла.Название_класса_обработчика
|
||||||
AUTHENTICATION_BACKENDS = [
|
AUTHENTICATION_BACKENDS = [
|
||||||
'access_controller.auth.EmailAuthBackend',
|
'access_controller.auth.EmailAuthBackend',
|
||||||
@ -186,3 +185,6 @@ ACTRL_ZENDESK_SUBDOMAIN = os.getenv('ACTRL_ZENDESK_SUBDOMAIN') or os.getenv('ZD_
|
|||||||
ACTRL_API_EMAIL = os.getenv('ACTRL_API_EMAIL') or os.getenv('ACCESS_CONTROLLER_API_EMAIL')
|
ACTRL_API_EMAIL = os.getenv('ACTRL_API_EMAIL') or os.getenv('ACCESS_CONTROLLER_API_EMAIL')
|
||||||
ACTRL_API_TOKEN = os.getenv('ACTRL_API_TOKEN') or os.getenv('ACCESS_CONTROLLER_API_TOKEN')
|
ACTRL_API_TOKEN = os.getenv('ACTRL_API_TOKEN') or os.getenv('ACCESS_CONTROLLER_API_TOKEN')
|
||||||
ACTRL_API_PASSWORD = os.getenv('ACTRL_API_PASSWORD') or os.getenv('ACCESS_CONTROLLER_API_PASSWORD')
|
ACTRL_API_PASSWORD = os.getenv('ACTRL_API_PASSWORD') or os.getenv('ACCESS_CONTROLLER_API_PASSWORD')
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
@ -22,8 +22,9 @@
|
|||||||
"pk": 1,
|
"pk": 1,
|
||||||
"fields": {
|
"fields": {
|
||||||
"name": "ZendeskAdmin",
|
"name": "ZendeskAdmin",
|
||||||
"user": 1,
|
"user": 3,
|
||||||
"role": "admin"
|
"role": "admin",
|
||||||
|
"user_id": 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
18
main/migrations/0018_alter_unassignedticket_ticket_id.py
Normal file
18
main/migrations/0018_alter_unassignedticket_ticket_id.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 3.2.3 on 2021-05-20 17:00
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('main', '0017_auto_20210408_1943'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='unassignedticket',
|
||||||
|
name='ticket_id',
|
||||||
|
field=models.IntegerField(help_text='Номер тикета, для которого сняли ответственного'),
|
||||||
|
),
|
||||||
|
]
|
@ -23,7 +23,7 @@ class UserProfile(models.Model):
|
|||||||
|
|
||||||
user = models.OneToOneField(to=get_user_model(), on_delete=models.CASCADE, help_text='Пользователь')
|
user = models.OneToOneField(to=get_user_model(), on_delete=models.CASCADE, help_text='Пользователь')
|
||||||
role = models.CharField(default='None', max_length=100, help_text='Глобальное имя роли пользователя')
|
role = models.CharField(default='None', max_length=100, help_text='Глобальное имя роли пользователя')
|
||||||
custom_role_id = models.IntegerField(default=0, help_text='Код роли пользователя')
|
custom_role_id = models.BigIntegerField(default=0, help_text='Код роли пользователя')
|
||||||
image = models.URLField(null=True, blank=True, help_text='Аватарка')
|
image = models.URLField(null=True, blank=True, help_text='Аватарка')
|
||||||
name = models.CharField(default='None', max_length=100, help_text='Имя пользователя на нашем сайте')
|
name = models.CharField(default='None', max_length=100, help_text='Имя пользователя на нашем сайте')
|
||||||
|
|
||||||
@ -70,8 +70,8 @@ class RoleChangeLogs(models.Model):
|
|||||||
"""
|
"""
|
||||||
user = models.ForeignKey(to=get_user_model(), on_delete=models.CASCADE,
|
user = models.ForeignKey(to=get_user_model(), on_delete=models.CASCADE,
|
||||||
help_text='Пользователь, которому присвоили другую роль')
|
help_text='Пользователь, которому присвоили другую роль')
|
||||||
old_role = models.IntegerField(default=0, help_text='Старая роль')
|
old_role = models.BigIntegerField(default=0, help_text='Старая роль')
|
||||||
new_role = models.IntegerField(default=0, help_text='Присвоенная роль')
|
new_role = models.BigIntegerField(default=0, help_text='Присвоенная роль')
|
||||||
change_time = models.DateTimeField(default=timezone.now, help_text='Дата и время изменения роли')
|
change_time = models.DateTimeField(default=timezone.now, help_text='Дата и время изменения роли')
|
||||||
changed_by = models.ForeignKey(to=get_user_model(), on_delete=models.CASCADE, related_name='changed_by',
|
changed_by = models.ForeignKey(to=get_user_model(), on_delete=models.CASCADE, related_name='changed_by',
|
||||||
help_text='Кем была изменена роль')
|
help_text='Кем была изменена роль')
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
@media (min-width: 768px) {
|
||||||
.bd-placeholder-img-lg {
|
.bd-placeholder-img-lg {
|
||||||
font-size: 3.5rem;
|
font-size: 3.5rem;
|
||||||
|
@ -39,10 +39,10 @@
|
|||||||
<div class="row justify-content-center new-section">
|
<div class="row justify-content-center new-section">
|
||||||
|
|
||||||
<div class="col-10">
|
<div class="col-10">
|
||||||
<h6 class="table-title">Список сотрудников</h6>
|
<h3 class="py-4 text-center font-weight-bold">Список сотрудников</h3>
|
||||||
|
|
||||||
{% block table %}
|
{% block table %}
|
||||||
<table class="table table-dark light-table">
|
<table class="table table-dark">
|
||||||
|
|
||||||
<thead>
|
<thead>
|
||||||
<th>
|
<th>
|
||||||
@ -71,7 +71,7 @@
|
|||||||
<div class="info">
|
<div class="info">
|
||||||
|
|
||||||
<div class="info-row">
|
<div class="info-row">
|
||||||
<div class="info-target">Инженеров:</div>
|
<div class="info-target px-4"><h6>Инженеров:</h6></div>
|
||||||
<div class="info-quantity">
|
<div class="info-quantity">
|
||||||
<div class="status-circle-small light-green"></div>
|
<div class="status-circle-small light-green"></div>
|
||||||
<span class="info-quantity-value">{{ engineers }}</span>
|
<span class="info-quantity-value">{{ engineers }}</span>
|
||||||
@ -79,7 +79,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="info-row">
|
<div class="info-row">
|
||||||
<div class="info-target">Легких агентов:</div>
|
<div class="info-target px-4"><h6>Легких агентов:</h6></div>
|
||||||
<div class="info-quantity">
|
<div class="info-quantity">
|
||||||
<div class="status-circle-small light-yellow"></div>
|
<div class="status-circle-small light-yellow"></div>
|
||||||
<span class="info-quantity-value">{{ light_agents }}</span>
|
<span class="info-quantity-value">{{ light_agents }}</span>
|
||||||
@ -93,11 +93,11 @@
|
|||||||
{% block buttons %}
|
{% block buttons %}
|
||||||
<div class="col-5">
|
<div class="col-5">
|
||||||
|
|
||||||
<button type="submit" name="engineer" class="request-acess-button default-button">
|
<button type="submit" name="engineer" class="btn default-button btn-warning btn-block btn-sm py-3">
|
||||||
Назначить выбранных на роль инженера
|
Назначить выбранных на роль инженера
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button type="submit" name="light_agent" class="hand-over-acess-button default-button">
|
<button type="submit" name="light_agent" class="btn default-button btn-warning btn-block btn-sm py-3">
|
||||||
Назначить выбранных на роль легкого агента
|
Назначить выбранных на роль легкого агента
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<br>
|
<br>
|
||||||
<div class="row px-4 py-4">
|
<div class="row px-4 py-4">
|
||||||
<div class="col-auto">
|
<div class="col-auto px-4 py-4">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<img
|
<img
|
||||||
src="{% if profile.image %}{{ profile.image }}{% else %}{% static 'no_avatar.png' %}{% endif %}"
|
src="{% if profile.image %}{{ profile.image }}{% else %}{% static 'no_avatar.png' %}{% endif %}"
|
||||||
@ -31,7 +31,9 @@
|
|||||||
alt="Нет изображения"
|
alt="Нет изображения"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<a href="{%url 'password_change' %}">Сменить пароль</a>
|
<div class="px-3 py-5">
|
||||||
|
<a href="{%url 'password_change' %}" class="btn btn-info">Сменить пароль</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h4><span class="badge bg-secondary text-light">Имя пользователя</span></h4> <h5><strong>{{ profile.name }}</strong></h5>
|
<h4><span class="badge bg-secondary text-light">Имя пользователя</span></h4> <h5><strong>{{ profile.name }}</strong></h5>
|
||||||
@ -44,7 +46,7 @@
|
|||||||
{% elif profile.custom_role_id == ZENDESK_ROLES.light_agent %}
|
{% elif profile.custom_role_id == ZENDESK_ROLES.light_agent %}
|
||||||
<h5><strong>light_agent</strong></h5>
|
<h5><strong>light_agent</strong></h5>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h5><strong><small class="text-muted">None</small></strong></h5>
|
<h5><strong><small class="text-muted">Без роли</small></strong></h5>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -52,7 +54,7 @@
|
|||||||
<br>
|
<br>
|
||||||
<div align="center" >
|
<div align="center" >
|
||||||
<form action="">
|
<form action="">
|
||||||
<a href="{% url 'work' profile.user.id %}" class="btn btn-primary btn-lg">Запросить права доступа</a>
|
<a href="{% url 'work' profile.user.id %}" type="submit" class="btn default-button btn-success btn-lg px-4 py-3">Запросить права доступа</a>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -7,21 +7,21 @@
|
|||||||
{% block heading %} Страницы просмотра статистики{% endblock %}
|
{% block heading %} Страницы просмотра статистики{% endblock %}
|
||||||
|
|
||||||
{% block content%}
|
{% block content%}
|
||||||
<div class="mt-5">
|
<div class="mt-5 py-4">
|
||||||
<div class="container-fluid" style="font-size:2rem">
|
<div class="container-fluid" style="font-size:2rem">
|
||||||
<form method="post">
|
<form method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="row g-3">
|
<div class="row g-3">
|
||||||
<div class="col-auto">
|
<div class="col-auto p-2">
|
||||||
{{ form.email.label }}
|
<h4 class="py-1">{{ form.email.label }}</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto mt-4">
|
<div class="col-auto mt-4">
|
||||||
{{ form.email }}
|
{{ form.email }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row g-3 mt-4">
|
<div class="row g-3 mt-4">
|
||||||
<div class="col-auto">
|
<div class="col-auto p-2">
|
||||||
{{ form.interval.label }}
|
<h4 class="py-1">{{ form.interval.label }}</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
{% for radio in form.interval%}
|
{% for radio in form.interval%}
|
||||||
@ -33,8 +33,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row g-3 mt-4">
|
<div class="row g-3 mt-4">
|
||||||
<div class="col-auto">
|
<div class="col-auto p-2">
|
||||||
{{ form.display_format.label }}
|
<h4 class="py-1">{{ form.display_format.label }}</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
{% for radio in form.display_format%}
|
{% for radio in form.display_format%}
|
||||||
@ -46,8 +46,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row g-3 mt-4">
|
<div class="row g-3 mt-4">
|
||||||
<div class="col-auto">
|
<div class="col-auto p-2">
|
||||||
{{ form.range_start.label}}
|
<h4 class="py-1">{{ form.range_start.label}}</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<div class='col-sm-7'>
|
<div class='col-sm-7'>
|
||||||
@ -56,8 +56,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row g-3 mt-4">
|
<div class="row g-3 mt-4">
|
||||||
<div class="col-auto">
|
<div class="col-auto p-2">
|
||||||
{{ form.range_end.label}}
|
<h4 class="py-1">{{ form.range_end.label}}</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<div class='col-sm-7'>
|
<div class='col-sm-7'>
|
||||||
@ -65,9 +65,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row text-center">
|
<div class="form-row text-center py-5">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<button type="submit" class="btn btn-outline-primary">Посмотреть статистику</button>
|
<button type="submit" class="btn default-button btn-info py-3 px-5">Посмотреть статистику</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -16,16 +16,13 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="container-md">
|
|
||||||
|
|
||||||
<div class="new-section">
|
|
||||||
<p class="row page-description">Свободных Мест: {{ licences_remaining }}</p>
|
<p class="row page-description">Свободных Мест: {{ licences_remaining }}</p>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row justify-content-center new-section">
|
<div class="row justify-content-center new-section">
|
||||||
<div class="col-10">
|
<div class="col-10 py-3">
|
||||||
<h6 class="table-title">Список сотрудников с правами инженера</h6>
|
<h3 class="py-4 text-center font-weight-bold">Список сотрудников с правами инженера</h3>
|
||||||
<table class="light-table">
|
<table class="table table-dark">
|
||||||
<thead>
|
<thead>
|
||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
@ -45,14 +42,14 @@
|
|||||||
<div class="col-5">
|
<div class="col-5">
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<div class="info-row">
|
<div class="info-row">
|
||||||
<div class="info-target">инженеров: </div>
|
<div class="info-target px-4"><h6>инженеров:</h6></div>
|
||||||
<div class="info-quantity">
|
<div class="info-quantity">
|
||||||
<div class="status-circle-small light-green"></div>
|
<div class="status-circle-small light-green"></div>
|
||||||
<span class="info-quantity-value">{{ engineers|length }}</span>
|
<span class="info-quantity-value">{{ engineers|length }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-row">
|
<div class="info-row">
|
||||||
<div class="info-target">легких агентов:</div>
|
<div class="info-target px-4"><h6>легких агентов:</h6></div>
|
||||||
<div class="info-quantity">
|
<div class="info-quantity">
|
||||||
<div class="status-circle-small light-yellow"></div>
|
<div class="status-circle-small light-yellow"></div>
|
||||||
<span class="info-quantity-value">{{ agents|length }}</span>
|
<span class="info-quantity-value">{{ agents|length }}</span>
|
||||||
@ -61,21 +58,31 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-5">
|
<div class="col-5 mb-3 py-1">
|
||||||
<a href="/work/become_engineer" class="request-acess-button default-button">Получить права инженера</a>
|
<div class="row mb-2">
|
||||||
<a href="/work/hand_over" class="hand-over-acess-button default-button">Сдать права инженера</a>
|
<div class="col">
|
||||||
|
<a href="/work/become_engineer" class="btn btn-success btn-block py-3">Получить права инженера</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-2 py-1">
|
||||||
|
<div class="col">
|
||||||
|
<a href="/work/hand_over" class="btn btn-danger btn-block py-3">Сдать права инженера</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form class="row g-3 align-items-center" method="GET" action="/work/get_tickets">
|
||||||
|
<div class="col-2">
|
||||||
|
<input class="form-control" type="number" min="1" value="1" name="count_tickets">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-10">
|
<div class="col-10">
|
||||||
<form method="post" action="{% url 'work_get_tickets' %}">
|
<button type="submit" class="btn default-button btn-warning btn-block btn-sm py-3">Взять тикеты в работу</button>
|
||||||
{% csrf_token %}
|
</div>
|
||||||
{{ get_tickets_form.count_tickets }}
|
|
||||||
<button type="submit" class="default-button">Взять тикеты в работу</button>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% for message in messages %}
|
{% for message in messages %}
|
||||||
<script>create_notification('{{message}}','','{{message.tags}}',2000)</script>
|
<script>create_notification('{{message}}','','{{message.tags}}',5000)</script>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
@ -7,6 +7,12 @@ sphinx-rtd-theme==0.5.2
|
|||||||
sphinx-autodoc-typehints==1.12.0
|
sphinx-autodoc-typehints==1.12.0
|
||||||
pyenchant==3.2.0
|
pyenchant==3.2.0
|
||||||
sphinxcontrib-spelling==7.2.1
|
sphinxcontrib-spelling==7.2.1
|
||||||
|
m2r == 0.2.1
|
||||||
|
|
||||||
# Tests
|
# Tests
|
||||||
coverage==5.5
|
coverage==5.5
|
||||||
|
|
||||||
|
# Code style
|
||||||
|
pylint == 2.8.2
|
||||||
|
pylint-django == 2.4.4
|
||||||
|
autopep8 == 1.5.6
|
||||||
|
@ -21,9 +21,7 @@ class ModelUserTableRow extends React.Component {
|
|||||||
name="users"
|
name="users"
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>{this.props.user.name}</td>
|
||||||
<a href="#">{this.props.user.name}</a>
|
|
||||||
</td>
|
|
||||||
<td>{this.props.user.user.email}</td>
|
<td>{this.props.user.user.email}</td>
|
||||||
<td>{this.props.user.zendesk_role}</td>
|
<td>{this.props.user.zendesk_role}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user