From 034c3eed7027c2b8266abae0a640d0145296a37d Mon Sep 17 00:00:00 2001 From: Yuriy Kulakov Date: Sun, 21 Feb 2021 21:35:36 +0300 Subject: [PATCH 1/6] Added admin control page --- access_controller/settings.py | 5 + access_controller/urls.py | 3 +- main/extra_func.py | 28 ++++- main/forms.py | 14 +++ main/models.py | 2 +- main/templates/pages/adm_ruleset.html | 141 +++++++++++++++----------- main/views.py | 43 +++++++- 7 files changed, 168 insertions(+), 68 deletions(-) diff --git a/access_controller/settings.py b/access_controller/settings.py index eecfa19..4c25e78 100644 --- a/access_controller/settings.py +++ b/access_controller/settings.py @@ -127,3 +127,8 @@ MEDIA_URL = '/media/' LOGIN_REDIRECT_URL = '/' LOGOUT_REDIRECT_URL = '/' + +ZENDESK_ROLES = { + 'engineer': '360005209000', + 'light_agent': '360005208980', +} diff --git a/access_controller/urls.py b/access_controller/urls.py index b2603b2..1de1835 100644 --- a/access_controller/urls.py +++ b/access_controller/urls.py @@ -20,7 +20,7 @@ from django.urls import path, include from access_controller import settings from access_controller.settings import DEBUG -from main.views import main_page, profile_page, CustomRegistrationView +from main.views import main_page, profile_page, CustomRegistrationView, AdminPageView urlpatterns = [ path('admin/', admin.site.urls, name='admin'), @@ -30,4 +30,5 @@ urlpatterns = [ path('accounts/login/', LoginView.as_view(extra_context={}), name='login'), # TODO add extra context path('accounts/', include('django.contrib.auth.urls')), path('accounts/', include('django_registration.backends.one_step.urls')), + path('control/', AdminPageView.as_view(), name='control') ] diff --git a/main/extra_func.py b/main/extra_func.py index d510430..26dffa5 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -5,6 +5,8 @@ from zenpy.lib.exception import APIException from main.models import UserProfile +from access_controller.settings import ZENDESK_ROLES as ROLES + class ZendeskAdmin: """ @@ -106,6 +108,24 @@ class ZendeskAdmin: except APIException: raise ValueError('invalid access_controller`s login data') + def get_user(self, email): + user = self.admin.users.search(email).values[0] + return user + + +def make_engineer(user_profile): + zendesk = ZendeskAdmin() + user = zendesk.get_user(user_profile.user.email) + user.custom_role_id = ROLES['engineer'] + zendesk.admin.users.update(user) + + +def make_light_agent(user_profile): + zendesk = ZendeskAdmin() + user = zendesk.get_user(user_profile.user.email) + user.custom_role_id = ROLES['light_agent'] + zendesk.admin.users.update(user) + def update_profile(user_profile: UserProfile): """ @@ -145,10 +165,10 @@ def check_user_auth(email: str, password: str) -> bool: :rtype: :class:`bool` """ creds = { - 'email': email, - 'password': password, - 'subdomain': 'ngenix1612197338', - } + 'email': email, + 'password': password, + 'subdomain': 'ngenix1612197338', + } try: user = Zenpy(**creds) user.search(email, type='user') diff --git a/main/forms.py b/main/forms.py index fcd8a7f..87aa217 100644 --- a/main/forms.py +++ b/main/forms.py @@ -1,6 +1,8 @@ from django import forms from django_registration.forms import RegistrationFormUniqueEmail +from main.models import UserProfile + class CustomRegistrationForm(RegistrationFormUniqueEmail): """ @@ -32,3 +34,15 @@ class CustomRegistrationForm(RegistrationFormUniqueEmail): class Meta(RegistrationFormUniqueEmail.Meta): fields = RegistrationFormUniqueEmail.Meta.fields fields.insert(2, 'password_zen') + + +class AdminPageUsers(forms.Form): + users = forms.ModelMultipleChoiceField( + queryset=UserProfile.objects.filter(role='agent'), + widget=forms.CheckboxSelectMultiple( + attrs={ + 'class': 'form-check-input' + } + ), + label='' + ) diff --git a/main/models.py b/main/models.py index 3e3fe29..b7b30dd 100644 --- a/main/models.py +++ b/main/models.py @@ -1,5 +1,5 @@ -from django.contrib.auth.models import User from django.db import models +from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver diff --git a/main/templates/pages/adm_ruleset.html b/main/templates/pages/adm_ruleset.html index a2e3e9d..460d8d2 100644 --- a/main/templates/pages/adm_ruleset.html +++ b/main/templates/pages/adm_ruleset.html @@ -2,76 +2,101 @@ {% load static %} -{% block title %}{{ pagename }}{% endblock %} +{% block title %} +Управление +{%endblock %} -{% block heading %}Управление{% endblock %} +{% block heading %} +Управление +{% endblock %} {% block extra_css %} - + {% endblock %} {% block content %}
- -
-

Основаная информация о странице

-
- +
+

Основаная информация о странице

+
+
+ {% csrf_token %}
-
-
Список сотрудников
- - - - - - - - - - - - - - - - - - - - - - - - - -
IDEmailRoleName(link to profile)Checked
1big_boss123@example.ruengineerИван Иванов
2gachi_cool456@example.rulight engineerПётр Петров
+
+ {% for field in form.users %} + {{ field.tag }} + {% endfor %} +
+
+
+
+
+
Список сотрудников
+ + + + + + + + + + {% for user in users %} + + + + + + + + {% endfor %} + +
IDEmailRoleName(link to profile)Checked
{{ user.id }}{{ user.user.email }}{{ user.role }}{{ user.name }}
+
-
-
-
-
Инженеров:
-
-
- 13 -
-
-
-
Легких агентов:
-
-
- 22 -
- -
+
+
+
+
Инженеров:
+
+
+ 13
+
+
+
Легких агентов:
+
+
+ 22 +
+
-
- - -
+
+
+ + +
+
-{% endblock %} \ No newline at end of file + + + +{% endblock %} diff --git a/main/views.py b/main/views.py index 797ea8b..e494062 100644 --- a/main/views.py +++ b/main/views.py @@ -1,14 +1,17 @@ -from django.shortcuts import render +from django.core.exceptions import PermissionDenied +from django.shortcuts import render, get_list_or_404 from django.urls import reverse_lazy -from main.extra_func import check_user_exist, check_user_auth, update_profile +from main.apiauth import api_auth +from main.extra_func import check_user_exist, check_user_auth, update_profile, make_engineer, make_light_agent from main.models import UserProfile from django.contrib.auth.models import User -from main.forms import CustomRegistrationForm -from django_registration.views import RegistrationView +from main.forms import CustomRegistrationForm, AdminPageUsers +from django_registration.views import RegistrationView, FormView from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin from zenpy import Zenpy @@ -70,3 +73,35 @@ def profile_page(request): def main_page(request): return render(request, 'pages/index.html') + + +class AdminPageView(FormView, LoginRequiredMixin): + template_name = 'pages/adm_ruleset.html' + form_class = AdminPageUsers + success_url = '/control/' + + def form_valid(self, form): + if 'engineer' in self.request.POST: + self.make_engineers(form.cleaned_data['users']) + elif 'light_agent' in self.request.POST: + self.make_light_agents(form.cleaned_data['users']) + return super().form_valid(form) + + @staticmethod + def make_engineers(users): + for user in users: + make_engineer(user) + + @staticmethod + def make_light_agents(users): + for user in users: + make_light_agent(user) + + def get_context_data(self, **kwargs): # TODO: add engineers and agents count + if self.request.user.userprofile.role != 'admin': + raise PermissionDenied + context = super().get_context_data(**kwargs) + context['users'] = get_list_or_404( + UserProfile, role='agent') + context['engineers'] = get_list_or_404(UserProfile, ) + return context # TODO: need to get profile page url From baf02cca44ac2dc6041a8561de50df8d904ff021 Mon Sep 17 00:00:00 2001 From: Yuriy Kulakov Date: Tue, 23 Feb 2021 19:46:43 +0300 Subject: [PATCH 2/6] Added user list function --- access_controller/settings.py | 4 +-- main/extra_func.py | 7 +++++ main/templates/pages/adm_ruleset.html | 41 ++++++++++++--------------- main/views.py | 17 +++++++++-- 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/access_controller/settings.py b/access_controller/settings.py index 4c25e78..4112bab 100644 --- a/access_controller/settings.py +++ b/access_controller/settings.py @@ -129,6 +129,6 @@ LOGIN_REDIRECT_URL = '/' LOGOUT_REDIRECT_URL = '/' ZENDESK_ROLES = { - 'engineer': '360005209000', - 'light_agent': '360005208980', + 'engineer': 360005209000, + 'light_agent': 360005208980, } diff --git a/main/extra_func.py b/main/extra_func.py index 26dffa5..4cfd45b 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -127,6 +127,13 @@ def make_light_agent(user_profile): zendesk.admin.users.update(user) +def get_users_list(): + zendesk = ZendeskAdmin() + admin = zendesk.get_user(zendesk.email) + group = next(zendesk.admin.users.groups(user=admin)) # TODO: user can be in many groups + return zendesk.admin.groups.users(group) # TODO: add role parameter + + def update_profile(user_profile: UserProfile): """ Функция обновляет профиль пользователя в соотвтетствии с текущим в Zendesk diff --git a/main/templates/pages/adm_ruleset.html b/main/templates/pages/adm_ruleset.html index 460d8d2..e025c27 100644 --- a/main/templates/pages/adm_ruleset.html +++ b/main/templates/pages/adm_ruleset.html @@ -27,30 +27,26 @@ {{ field.tag }} {% endfor %}
-
-
-
-
Список сотрудников
- - - - - - + + + + + + - {% for user in users %} - - - - - - - - {% endfor %} + {% for user in users %} + + + + + + + + {% endfor %}
IDEmailRoleName(link to profile)Checked
IDEmailRoleName(link to profile)Checked
{{ user.id }}{{ user.user.email }}{{ user.role }}{{ user.name }}
{{ user.id }}{{ user.user.email }}{{ user.role }}{{ user.name }}
@@ -62,20 +58,20 @@
Инженеров:
- 13 + {{ engineers }}
Легких агентов:
- 22 + {{ light_agents }}
- + +
From 62b4b912e878d5b43c894599494e2f352c26ec83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B0=D0=BA=D0=BE=D0=B2=20=D0=AE=D1=80?= =?UTF-8?q?=D0=B8=D0=B9?= Date: Thu, 25 Feb 2021 20:38:29 +0300 Subject: [PATCH 5/6] changed function name --- main/extra_func.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index c35aa99..5a6f11b 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -115,21 +115,21 @@ class ZendeskAdmin: except APIException: raise ValueError('invalid access_controller`s login data') - def get_user(self, email): + def get_user_object(self, email): user = self.admin.users.search(email).values[0] return user def make_engineer(user_profile): zendesk = ZendeskAdmin() - user = zendesk.get_user(user_profile.user.email) + user = zendesk.get_user_object(user_profile.user.email) user.custom_role_id = ROLES['engineer'] zendesk.admin.users.update(user) def make_light_agent(user_profile): zendesk = ZendeskAdmin() - user = zendesk.get_user(user_profile.user.email) + user = zendesk.get_user_object(user_profile.user.email) user.custom_role_id = ROLES['light_agent'] zendesk.admin.users.update(user) From 8df2b66b7aefa60ac285dd2458550d9a40fd6ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B0=D0=BA=D0=BE=D0=B2=20=D0=AE=D1=80?= =?UTF-8?q?=D0=B8=D0=B9?= Date: Thu, 25 Feb 2021 21:57:04 +0300 Subject: [PATCH 6/6] Added engineers and light_agents count from organization to control page --- main/extra_func.py | 4 ++-- main/templates/pages/adm_ruleset.html | 8 ++------ main/templates/registration/login.html | 11 +++++------ main/views.py | 8 +++----- 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index b408e8d..20c3712 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -134,8 +134,8 @@ def make_light_agent(user_profile): def get_users_list(): zendesk = ZendeskAdmin() admin = zendesk.get_user(zendesk.email) - group = next(zendesk.admin.users.groups(user=admin)) # TODO: user can be in many groups - return zendesk.admin.groups.users(group) # TODO: add role parameter + org = next(zendesk.admin.users.organizations(user=admin)) + return zendesk.admin.organizations.users(org) def update_profile(user_profile: UserProfile): diff --git a/main/templates/pages/adm_ruleset.html b/main/templates/pages/adm_ruleset.html index 3366a43..1bddc5f 100644 --- a/main/templates/pages/adm_ruleset.html +++ b/main/templates/pages/adm_ruleset.html @@ -2,13 +2,9 @@ {% load static %} -{% block title %} -Управление -{%endblock %} +{% block title %}Управление{%endblock %} -{% block heading %} -Управление -{% endblock %} +{% block heading %}Управление{% endblock %} {% block extra_css %} diff --git a/main/templates/registration/login.html b/main/templates/registration/login.html index 9bb5175..7a3ab68 100644 --- a/main/templates/registration/login.html +++ b/main/templates/registration/login.html @@ -1,10 +1,9 @@ {% extends 'base/base.html' %} -{% block title %} - Авторизация -{% endblock %} -{% block heading %} - Авторизация -{% endblock %} + +{% block title %}Авторизация{% endblock %} + +{% block heading %}Авторизация{% endblock %} + {% block content %}
diff --git a/main/views.py b/main/views.py index b5d02f1..72d4e52 100644 --- a/main/views.py +++ b/main/views.py @@ -114,13 +114,11 @@ class AdminPageView(FormView, LoginRequiredMixin): @staticmethod def make_engineers(users): - for user in users: - make_engineer(user) + [make_engineer(user) for user in users] @staticmethod def make_light_agents(users): - for user in users: - make_light_agent(user) + [make_light_agent(user) for user in users] @staticmethod def count_users(users): # TODO: this func counts users from all zendesk instead of just from a model @@ -132,7 +130,7 @@ class AdminPageView(FormView, LoginRequiredMixin): light_agents += 1 return engineers, light_agents - def get_context_data(self, **kwargs): # TODO: add engineers and agents count + def get_context_data(self, **kwargs): if self.request.user.userprofile.role != 'admin': raise PermissionDenied context = super().get_context_data(**kwargs)