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 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.

View File

@ -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"

View File

@ -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 %}

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, \ 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()

View File

@ -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:

View File

@ -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>
);
} }
} }