From 034c3eed7027c2b8266abae0a640d0145296a37d Mon Sep 17 00:00:00 2001 From: Yuriy Kulakov Date: Sun, 21 Feb 2021 21:35:36 +0300 Subject: [PATCH] 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