Merge branch 'feature/periodic_upgrade' into 'develop'
Control page displays all users from zendesk and db See merge request 2020-2021/online/s101/group-02/access_controller!52
This commit is contained in:
commit
7b49f45703
@ -263,7 +263,7 @@ def check_user_auth(email: str, password: str) -> bool:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def update_user_in_model(profile: UserProfile, zendesk_user: User) -> UserProfile:
|
def update_user_in_model(profile: UserProfile, zendesk_user: User):
|
||||||
"""
|
"""
|
||||||
Функция обновляет профиль пользователя при изменении данных пользователя на Zendesk.
|
Функция обновляет профиль пользователя при изменении данных пользователя на Zendesk.
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from main.models import UserProfile
|
from main.models import UserProfile
|
||||||
|
from access_controller.settings import ZENDESK_ROLES
|
||||||
|
|
||||||
|
|
||||||
class UserSerializer(serializers.HyperlinkedModelSerializer):
|
class UserSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
@ -13,9 +14,25 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
|
|
||||||
|
|
||||||
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
|
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
"""Сериализатор для модели профиля пользователя"""
|
"""Класс serializer для модели профиля пользователя"""
|
||||||
user = UserSerializer()
|
user = UserSerializer()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UserProfile
|
model = UserProfile
|
||||||
fields = ['user', 'id', 'name', 'zendesk_role']
|
fields = ['user', 'id', 'name', 'zendesk_role']
|
||||||
|
|
||||||
|
|
||||||
|
class ZendeskUserSerializer(serializers.Serializer):
|
||||||
|
"""Класс serializer для объектов пользователей из zenpy"""
|
||||||
|
name = serializers.CharField()
|
||||||
|
zendesk_role = serializers.SerializerMethodField('get_zendesk_role')
|
||||||
|
email = serializers.EmailField()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_zendesk_role(obj):
|
||||||
|
if obj.custom_role_id == ZENDESK_ROLES['engineer']:
|
||||||
|
return 'engineer'
|
||||||
|
elif obj.custom_role_id == ZENDESK_ROLES['light_agent']:
|
||||||
|
return 'light_agent'
|
||||||
|
else:
|
||||||
|
return "empty"
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
<h6 class="table-title">Список сотрудников</h6>
|
<h6 class="table-title">Список сотрудников</h6>
|
||||||
|
|
||||||
{% block table %}
|
{% block table %}
|
||||||
<table class="light-table">
|
<table class="table table-dark light-table">
|
||||||
|
|
||||||
<thead>
|
<thead>
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
@ -42,8 +42,8 @@
|
|||||||
<th>Role</th>
|
<th>Role</th>
|
||||||
<th>Checked</th>
|
<th>Checked</th>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="tbody">
|
<tbody id="tbody"></tbody>
|
||||||
</tbody>
|
|
||||||
</table>
|
</table>
|
||||||
<p id="loading">Данные загружаются...</p>
|
<p id="loading">Данные загружаются...</p>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -31,7 +31,7 @@ from main.extra_func import check_user_exist, update_profile, get_user_organizat
|
|||||||
make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \
|
make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \
|
||||||
StatisticData, log
|
StatisticData, log
|
||||||
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
||||||
from main.serializers import ProfileSerializer
|
from main.serializers import ProfileSerializer, ZendeskUserSerializer
|
||||||
from .models import UserProfile
|
from .models import UserProfile
|
||||||
|
|
||||||
|
|
||||||
@ -239,7 +239,7 @@ def main_page(request: WSGIRequest) -> HttpResponse:
|
|||||||
return render(request, 'pages/index.html')
|
return render(request, 'pages/index.html')
|
||||||
|
|
||||||
|
|
||||||
class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin,SuccessMessageMixin, FormView):
|
class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageMixin, FormView):
|
||||||
"""
|
"""
|
||||||
Класс отображения страницы администратора.
|
Класс отображения страницы администратора.
|
||||||
|
|
||||||
@ -319,16 +319,34 @@ class UsersViewSet(viewsets.ReadOnlyModelViewSet):
|
|||||||
serializer_class = ProfileSerializer
|
serializer_class = ProfileSerializer
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
users = update_users_in_model().values
|
users = update_users_in_model()
|
||||||
count = count_users(users)
|
count = count_users(users.values)
|
||||||
profiles = UserProfile.objects.filter(role='agent')
|
profiles = UserProfile.objects.filter(role='agent')
|
||||||
serializer = self.get_serializer(profiles, many=True)
|
serializer = self.get_serializer(profiles, many=True)
|
||||||
return Response({
|
res = {
|
||||||
'users': serializer.data,
|
'users': serializer.data,
|
||||||
'engineers': count[0],
|
'engineers': count[0],
|
||||||
'light_agents': count[1]
|
'light_agents': count[1],
|
||||||
})
|
"zendesk_users": self.get_zendesk_users(self.choose_users(users.values, profiles))
|
||||||
|
}
|
||||||
|
return Response(res)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def choose_users(zendesk, model):
|
||||||
|
users = []
|
||||||
|
for zendesk_user in zendesk:
|
||||||
|
if zendesk_user.name not in [user.name for user in model]:
|
||||||
|
users.append(zendesk_user)
|
||||||
|
return users
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_zendesk_users(users):
|
||||||
|
zendesk_users = ZendeskUserSerializer(
|
||||||
|
data=[user for user in users if user.role != 'admin'],
|
||||||
|
many=True
|
||||||
|
)
|
||||||
|
zendesk_users.is_valid()
|
||||||
|
return zendesk_users.data
|
||||||
|
|
||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
|
@ -6,7 +6,8 @@ import sys
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Run administrative tasks."""
|
"""Run administrative tasks."""
|
||||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'access_controller.settings')
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE',
|
||||||
|
'access_controller.settings')
|
||||||
try:
|
try:
|
||||||
from django.core.management import execute_from_command_line
|
from django.core.management import execute_from_command_line
|
||||||
except ImportError as exc:
|
except ImportError as exc:
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
// React
|
// React
|
||||||
class TableRow extends React.Component {
|
class ModelUserTableRow extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<tr>
|
<tr className={"table-dark"}>
|
||||||
<td>
|
<td>
|
||||||
<a href="#">{this.props.user.name}</a>
|
<a href="#">{this.props.user.name}</a>
|
||||||
</td>
|
</td>
|
||||||
@ -23,6 +23,43 @@ class TableRow extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ModelUserTableRows extends React.Component {
|
||||||
|
render() {
|
||||||
|
return ReactDOM.createPortal(
|
||||||
|
this.props.users.map((user, key) => (
|
||||||
|
<ModelUserTableRow user={user} key={key} />
|
||||||
|
)),
|
||||||
|
document.getElementById("tbody")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ZendeskUserTableRow extends React.Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<tr className={"table-secondary"}>
|
||||||
|
<td>
|
||||||
|
<a href="#">{this.props.user.name}</a>
|
||||||
|
</td>
|
||||||
|
<td>{this.props.user.email}</td>
|
||||||
|
<td>{this.props.user.zendesk_role}</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ZendeskUserTableRows extends React.Component {
|
||||||
|
render() {
|
||||||
|
return ReactDOM.createPortal(
|
||||||
|
this.props.users.map((user, key) => (
|
||||||
|
<ZendeskUserTableRow user={user} key={key} />
|
||||||
|
)),
|
||||||
|
document.getElementById("tbody")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class TableBody extends React.Component {
|
class TableBody extends React.Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
@ -30,6 +67,7 @@ class TableBody extends React.Component {
|
|||||||
users: [],
|
users: [],
|
||||||
engineers: 0,
|
engineers: 0,
|
||||||
light_agents: 0,
|
light_agents: 0,
|
||||||
|
zendesk_users: [],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,6 +77,7 @@ class TableBody extends React.Component {
|
|||||||
users: response.data.users,
|
users: response.data.users,
|
||||||
engineers: response.data.engineers,
|
engineers: response.data.engineers,
|
||||||
light_agents: response.data.light_agents,
|
light_agents: response.data.light_agents,
|
||||||
|
zendesk_users: response.data.zendesk_users,
|
||||||
});
|
});
|
||||||
let elements = document.querySelectorAll(".info-quantity-value");
|
let elements = document.querySelectorAll(".info-quantity-value");
|
||||||
elements[0].innerHTML = this.state.engineers;
|
elements[0].innerHTML = this.state.engineers;
|
||||||
@ -62,9 +101,12 @@ class TableBody extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return this.state.users.map((user, key) => (
|
return (
|
||||||
<TableRow user={user} key={key} />
|
<tr>
|
||||||
));
|
<ModelUserTableRows users={this.state.users} />
|
||||||
|
<ZendeskUserTableRows users={this.state.zendesk_users} />
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user