From 938b9894fe12e98ea6fd10aba0cea4f60533c059 Mon Sep 17 00:00:00 2001 From: Sokurov Idar Date: Wed, 10 Feb 2021 19:05:46 +0300 Subject: [PATCH] Add Zendesk password check Add Bootstrap to forms Add custom form --- main/extra_func.py | 55 +++++++++++++++++++ main/forms.py | 34 ++++++++++++ .../registration_closed.html | 2 +- .../registration_complete.html | 2 +- main/views.py | 35 +++++++----- 5 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 main/forms.py diff --git a/main/extra_func.py b/main/extra_func.py index 487fb13..8f850b8 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,3 +1,8 @@ +import os + +from zenpy import Zenpy +from zenpy.lib.exception import APIException + from main.models import UserProfile @@ -9,6 +14,7 @@ def set_and_get_name(UP: UserProfile): # TODO: Переделать с полу :param UP: Объект профиля пользователя :type UP: :class:`main.models.UserProfile` :return: Имя пользователя + :rtype: :class:`str` """ return UP.user.username @@ -20,6 +26,7 @@ def set_and_get_email(UP: UserProfile): # TODO: Переделать с пол :param UP: Объект профиля пользователя :type UP: :class:`main.models.UserProfile` :return: Почта пользователя + :rtype: :class:`str` """ return UP.user.email @@ -31,6 +38,7 @@ def set_and_get_role(UP: UserProfile): # TODO: Переделать с полу :param UP: Объект профиля пользователя :type UP: :class:`main.models.UserProfile` :return: Роль пользователя + :rtype: :class:`str` """ return UP.role @@ -42,5 +50,52 @@ def load_and_get_image(UP: UserProfile): # TODO: Переделать с пол :param UP: Объект профиля пользователя :type UP: :class:`main.models.UserProfile` :return: Название изображения + :rtype: :class:`str` """ return UP.image.name + + +def check_user_exist(email: str) -> bool: + """ + Функция проверяет, существует ли пользователь + + :param email: Электронная почта пользователя + :type email: :class:`str + :return: True, если существует, иначе False + :rtype: :class:`bool' + """ + admin_creds = { + 'email': os.environ.get('Admin_email'), + 'subdomain': 'ngenix1612197338', + 'token': os.environ.get('Oauth_token'), + } + admin = Zenpy(**admin_creds) + zenpy_user = admin.search(email, type='user') + if zenpy_user: + return True + return False + + +def check_user_auth(email: str, password: str) -> bool: + """ + Функция проверяет, верны ли входные данные + + :param email: Электроная почта пользователя + :type email: :class:`str` + :param password: Пароль пользователя + :type password: :class:`str` + :return: True, если входные данные верны, иначе False + :raise APIException: исключение, вызываемое если пользователь не аутентифицирован + :rtype: :class:`bool` + """ + try: + creds = { + 'email': email, + 'subdomain': 'ngenix1612197338', + 'password': password, + } + user = Zenpy(**creds) + user.search(email, type='user') + except APIException: + return False + return True diff --git a/main/forms.py b/main/forms.py new file mode 100644 index 0000000..fcd8a7f --- /dev/null +++ b/main/forms.py @@ -0,0 +1,34 @@ +from django import forms +from django_registration.forms import RegistrationFormUniqueEmail + + +class CustomRegistrationForm(RegistrationFormUniqueEmail): + """ + Форма для регистрации :class:`django_registration.forms.RegistrationFormUniqueEmail` + с полем для ввода пароля от Zendesk аккаунта и с добавлением bootstrap-класса 'form-control' для всех полей + + :param password_zen: Поле для ввода пароля от Zendesk + :type password_zen: :class:`django.forms.CharField` + """ + password_zen = forms.CharField( + required=True, + label="Пароль от Zendesk аккаунта", + strip=False, + widget=forms.PasswordInput(attrs={ + 'class': 'form-control' + }) + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + for visible in self.visible_fields(): + if visible.field.widget.attrs.get('class', False): + print(visible.field.widget.attrs['class'].find('form-control')) + if visible.field.widget.attrs['class'].find('form-control') < 0: + visible.field.widget.attrs['class'] += 'form-control' + else: + visible.field.widget.attrs['class'] = 'form-control' + + class Meta(RegistrationFormUniqueEmail.Meta): + fields = RegistrationFormUniqueEmail.Meta.fields + fields.insert(2, 'password_zen') diff --git a/main/templates/django_registration/registration_closed.html b/main/templates/django_registration/registration_closed.html index 9aa808d..4fffce6 100644 --- a/main/templates/django_registration/registration_closed.html +++ b/main/templates/django_registration/registration_closed.html @@ -11,5 +11,5 @@ {% block content %}
-

Нет пользователя с указаным адресом электронной почты

+

Нет пользователя с указаным адресом электронной почты, либо был введён неверный пароль

{% endblock %} diff --git a/main/templates/django_registration/registration_complete.html b/main/templates/django_registration/registration_complete.html index 8da81c0..bb064bb 100644 --- a/main/templates/django_registration/registration_complete.html +++ b/main/templates/django_registration/registration_complete.html @@ -10,5 +10,5 @@ {% block content %}
-

Регистрация прошла успешно. Войти сейчас

+

Регистрация прошла успешно. Войти сейчас

{% endblock %} diff --git a/main/views.py b/main/views.py index 2de5f8b..c02dd4d 100644 --- a/main/views.py +++ b/main/views.py @@ -1,29 +1,26 @@ -from django.shortcuts import render, redirect +from django.shortcuts import render from django.urls import reverse_lazy -from main.extra_func import set_and_get_name, set_and_get_email, load_and_get_image, set_and_get_role +from main.extra_func import set_and_get_name, set_and_get_email, load_and_get_image, set_and_get_role, check_user_exist, \ + check_user_auth from main.models import UserProfile from django.contrib.auth.models import User -from django_registration.forms import RegistrationFormUniqueEmail +from main.forms import CustomRegistrationForm from django_registration.views import RegistrationView -from zenpy import Zenpy class CustomRegistrationView(RegistrationView): - form_class = RegistrationFormUniqueEmail + """ + Отображение и логика работы страницы регистрации пользователя + """ + form_class = CustomRegistrationForm template_name = 'django_registration/registration_form.html' success_url = reverse_lazy('django_registration_complete') + is_allowed = True def register(self, form): - creds = { - 'email': 'idar.sokurov.05@mail.ru', - 'subdomain': 'ngenix1612197338', - 'token': 'xRL9Qqz7svFE3X9cHMVC2zOtJUdllzr441C3Z363', - } - client = Zenpy(**creds) - zenpy_user = client.search(form.data['email'], type='user') - if zenpy_user: + if check_user_exist(form.data['email']) and check_user_auth(form.data['email'], form.data['password_zen']): user = User.objects.create_user( username=form.data['username'], email=form.data['email'], @@ -40,7 +37,17 @@ class CustomRegistrationView(RegistrationView): load_and_get_image(profile) profile.save() else: - self.success_url = reverse_lazy('django_registration_disallowed') + self.is_allowed = False + + def get_success_url(self, request): + """ + Вовзращет url-адресс страницы, куда нужно перейти после успешной/неуспешной регистрации + Используется самой django-registration + """ + if self.is_allowed: + return reverse_lazy('django_registration_complete') + else: + return reverse_lazy('django_registration_disallowed') def profile_page(request):