diff --git a/main/extra_func.py b/main/extra_func.py index 821e11a..6358d7e 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -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. diff --git a/main/serializers.py b/main/serializers.py index cfc70a8..8436b54 100644 --- a/main/serializers.py +++ b/main/serializers.py @@ -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" diff --git a/main/templates/pages/adm_ruleset.html b/main/templates/pages/adm_ruleset.html index 1fb9baf..c0a5ad9 100644 --- a/main/templates/pages/adm_ruleset.html +++ b/main/templates/pages/adm_ruleset.html @@ -34,7 +34,7 @@
Список сотрудников
{% block table %} - +
@@ -42,8 +42,8 @@ - - + +
NameRole Checked

Данные загружаются...

{% endblock %} diff --git a/main/views.py b/main/views.py index 52ee23d..00784f1 100644 --- a/main/views.py +++ b/main/views.py @@ -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() diff --git a/manage.py b/manage.py index 3601c76..2554164 100755 --- a/manage.py +++ b/manage.py @@ -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: diff --git a/static/main/js/control.js b/static/main/js/control.js index 55d1d1a..82f9f27 100644 --- a/static/main/js/control.js +++ b/static/main/js/control.js @@ -1,10 +1,10 @@ "use strict"; // React -class TableRow extends React.Component { +class ModelUserTableRow extends React.Component { render() { return ( - + {this.props.user.name} @@ -23,6 +23,43 @@ class TableRow extends React.Component { } } +class ModelUserTableRows extends React.Component { + render() { + return ReactDOM.createPortal( + this.props.users.map((user, key) => ( + + )), + document.getElementById("tbody") + ); + } +} + +class ZendeskUserTableRow extends React.Component { + render() { + return ( + + + {this.props.user.name} + + {this.props.user.email} + {this.props.user.zendesk_role} + + + ); + } +} + +class ZendeskUserTableRows extends React.Component { + render() { + return ReactDOM.createPortal( + this.props.users.map((user, 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) => ( - - )); + return ( + + + + + ); } }