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:
Кравченко Артем 2021-04-13 12:01:29 +00:00
commit 7b49f45703
6 changed files with 96 additions and 18 deletions

View File

@ -263,7 +263,7 @@ def check_user_auth(email: str, password: str) -> bool:
return True
def update_user_in_model(profile: UserProfile, zendesk_user: User) -> UserProfile:
def update_user_in_model(profile: UserProfile, zendesk_user: User):
"""
Функция обновляет профиль пользователя при изменении данных пользователя на Zendesk.

View File

@ -1,6 +1,7 @@
from django.contrib.auth.models import User
from rest_framework import serializers
from main.models import UserProfile
from access_controller.settings import ZENDESK_ROLES
class UserSerializer(serializers.HyperlinkedModelSerializer):
@ -13,9 +14,25 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
class ProfileSerializer(serializers.HyperlinkedModelSerializer):
"""Сериализатор для модели профиля пользователя"""
"""Класс serializer для модели профиля пользователя"""
user = UserSerializer()
class Meta:
model = UserProfile
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"

View File

@ -34,7 +34,7 @@
<h6 class="table-title">Список сотрудников</h6>
{% block table %}
<table class="light-table">
<table class="table table-dark light-table">
<thead>
<th>Name</th>
@ -42,8 +42,8 @@
<th>Role</th>
<th>Checked</th>
</thead>
<tbody id="tbody">
</tbody>
<tbody id="tbody"></tbody>
</table>
<p id="loading">Данные загружаются...</p>
{% endblock %}

View File

@ -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, \
StatisticData, log
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
from main.serializers import ProfileSerializer
from main.serializers import ProfileSerializer, ZendeskUserSerializer
from .models import UserProfile
@ -239,7 +239,7 @@ def main_page(request: WSGIRequest) -> HttpResponse:
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
def list(self, request, *args, **kwargs):
users = update_users_in_model().values
count = count_users(users)
users = update_users_in_model()
count = count_users(users.values)
profiles = UserProfile.objects.filter(role='agent')
serializer = self.get_serializer(profiles, many=True)
return Response({
res = {
'users': serializer.data,
'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()

View File

@ -6,7 +6,8 @@ import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'access_controller.settings')
os.environ.setdefault('DJANGO_SETTINGS_MODULE',
'access_controller.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:

View File

@ -1,10 +1,10 @@
"use strict";
// React
class TableRow extends React.Component {
class ModelUserTableRow extends React.Component {
render() {
return (
<tr>
<tr className={"table-dark"}>
<td>
<a href="#">{this.props.user.name}</a>
</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 {
constructor(props) {
super(props);
@ -30,6 +67,7 @@ class TableBody extends React.Component {
users: [],
engineers: 0,
light_agents: 0,
zendesk_users: [],
};
}
@ -39,6 +77,7 @@ class TableBody extends React.Component {
users: response.data.users,
engineers: response.data.engineers,
light_agents: response.data.light_agents,
zendesk_users: response.data.zendesk_users,
});
let elements = document.querySelectorAll(".info-quantity-value");
elements[0].innerHTML = this.state.engineers;
@ -62,9 +101,12 @@ class TableBody extends React.Component {
}
render() {
return this.state.users.map((user, key) => (
<TableRow user={user} key={key} />
));
return (
<tr>
<ModelUserTableRows users={this.state.users} />
<ZendeskUserTableRows users={this.state.zendesk_users} />
</tr>
);
}
}