Степаненко Ольга 0cda9da311 Add views and forms documentation
2021-03-03 20:59:53 +03:00

156 lines
6.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import PasswordResetForm
from django.contrib.auth.models import User
from django.contrib.auth.tokens import default_token_generator
from django.shortcuts import render, get_list_or_404
from django.urls import reverse_lazy
from django.views.generic import FormView
from django_registration.backends.one_step.views import RegistrationView
from access_controller.settings import EMAIL_HOST_USER
from main.extra_func import check_user_exist, update_profile, get_user_organization, \
make_engineer, make_light_agent, get_users_list
from django.contrib.auth.models import User
from main.models import UserProfile
from main.forms import CustomRegistrationForm, AdminPageUsers
from django_registration.views import RegistrationView
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import PermissionDenied
import logging
from access_controller.settings import ZENDESK_ROLES
class CustomRegistrationView(RegistrationView):
"""
Отображение и логика работы страницы регистрации пользователя
1. Ввод email пользователя, указанный на Zendesk
2. В случае если пользователь с данным паролем зарегистрирован на Zendesk и относится к определенной организации, происходит сброс ссылки с установлением пароля на указанный email
3. Создается пользователь class User, а также его профиль
"""
form_class = CustomRegistrationForm
template_name = 'django_registration/registration_form.html'
success_url = reverse_lazy('django_registration_complete')
is_allowed = True
def register(self, form: CustomRegistrationForm) -> User:
self.is_allowed = True
if check_user_exist(form.data['email']) and get_user_organization(form.data['email']) == 'SYSTEM':
forms = PasswordResetForm(self.request.POST)
if forms.is_valid():
opts = {
'use_https': self.request.is_secure(),
'token_generator': default_token_generator,
'from_email': EMAIL_HOST_USER,
'email_template_name': 'registration/password_reset_email.html',
'subject_template_name': 'registration/password_reset_subject.txt',
'request': self.request,
'html_email_template_name': None,
'extra_email_context': None,
}
user = User.objects.create_user(
username=form.data['email'],
email=form.data['email'],
password=User.objects.make_random_password(length=50)
)
forms.save(**opts)
update_profile(user.userprofile)
return user
else:
raise ValueError('Непредвиденная ошибка')
else:
self.is_allowed = False
def get_success_url(self, user: User = None) -> success_url:
"""
Возвращает url-адрес страницы, куда нужно перейти после успешной/неуспешной регистрации
Используется самой django-registration
"""
if self.is_allowed:
return reverse_lazy('password_reset_done')
else:
return reverse_lazy('django_registration_disallowed')
@login_required()
def profile_page(request: UserProfile) -> UserProfile:
"""
Отображение страницы профиля
"""
user_profile = request.user.userprofile
update_profile(user_profile)
context = {
'email': user_profile.user.email,
'name': user_profile.name,
'role': user_profile.role,
'image_url': user_profile.image,
'pagename': 'Страница профиля'
}
return render(request, 'pages/profile.html', context)
def main_page(request):
"""
Отображение логгирования на главной странице
"""
logger = logging.getLogger('main.index')
logger.info('Index page opened')
return render(request, 'pages/index.html')
class AdminPageView(FormView, LoginRequiredMixin):
"""
Class AdminPageView - логика работы страницы администратора
"""
template_name = 'pages/adm_ruleset.html'
form_class = AdminPageUsers
success_url = '/control/'
def form_valid(self, form: AdminPageUsers) -> AdminPageUsers:
"""
Функция установки ролей пользователям
"""
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):
[make_engineer(user) for user in users]
@staticmethod
def make_light_agents(users):
[make_light_agent(user) for user in users]
@staticmethod
def count_users(users: User) -> int: #.. todolist:: :this func counts users from all zendesk instead of just from a model:
"""
Функция подсчета количества сотрудников с ролями engineer и light_a
"""
engineers, light_agents = 0, 0
for user in users:
if user.custom_role_id == ZENDESK_ROLES['engineer']:
engineers += 1
elif user.custom_role_id == ZENDESK_ROLES['light_agent']:
light_agents += 1
return engineers, light_agents
def get_context_data(self, **kwargs) -> list:
"""
Функция формирования контента страницы администратора (с проверкой прав доступа)
"""
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'], context['light_agents'] = self.count_users(get_users_list())
return context # TODO: need to get profile page url