From 8c0a589173369abb318273e63b1602103439d53c Mon Sep 17 00:00:00 2001 From: Sokurov Idar Date: Sun, 11 Apr 2021 01:12:07 +0300 Subject: [PATCH 1/4] Add SMTP error check --- main/extra_func.py | 4 +-- .../registration_closed.html | 2 +- main/views.py | 33 +++++++++---------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index 8b75346..03add3e 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -92,12 +92,12 @@ class ZendeskAdmin: def get_group(self, name: str) -> str: """ - Функция возвращает группы, к которым принадлежит пользователь. + Функция возвращает группу по названию :param name: Имя пользователя :return: Группы пользователя (в случае отсутствия None) """ - groups = self.admin.search(name) + groups = self.admin.search(name, type='group') for group in groups: return group return None diff --git a/main/templates/django_registration/registration_closed.html b/main/templates/django_registration/registration_closed.html index 9c5e013..fdf4e36 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/views.py b/main/views.py index 0a1a070..41aa856 100644 --- a/main/views.py +++ b/main/views.py @@ -1,7 +1,6 @@ -import logging -import os -from datetime import datetime +from smtplib import SMTPException +from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import PasswordResetForm from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin @@ -13,23 +12,19 @@ from django.contrib.messages.views import SuccessMessageMixin from django.core.exceptions import PermissionDenied from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponseRedirect, HttpResponse -from django.shortcuts import render, get_list_or_404, redirect +from django.shortcuts import render, redirect from django.urls import reverse_lazy, reverse from django.views.generic import FormView from django_registration.views import RegistrationView -from django.contrib import messages - # Django REST from rest_framework import viewsets from rest_framework.response import Response - from zenpy.lib.api_objects import User as ZenpyUser -from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_MAX_AGENTS -from main.extra_func import ZendeskAdmin +from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_MAX_AGENTS, ZENDESK_GROUPS from main.extra_func import check_user_exist, update_profile, get_user_organization, \ make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \ - StatisticData + StatisticData,ZendeskAdmin from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm from main.serializers import ProfileSerializer from .models import UserProfile @@ -79,14 +74,18 @@ class CustomRegistrationView(RegistrationView): '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) + username=form.data['email'], + email=form.data['email'], + password=User.objects.make_random_password(length=50) ) - forms.save(**opts) - update_profile(user.userprofile) - self.set_permission(user) - return user + try: + forms.save(**opts) + update_profile(user.userprofile) + self.set_permission(user) + return user + except SMTPException: + user.delete() + self.is_allowed = False else: raise ValueError('Непредвиденная ошибка') else: From 897cd1210b402dc17c7491d42f38686ed7b80f81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=B7=D1=83=D1=80=D0=BE=D0=B2=20=D0=A2=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=84=D0=B5=D0=B9?= Date: Tue, 13 Apr 2021 13:51:06 +0000 Subject: [PATCH 2/4] Add directory for logs. Issue #60 --- logs/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 logs/.gitkeep diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 0000000..e69de29 From 68b1f64d362b70e0e4a3d671e7b1a17dd4944a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=BE=D0=BA=D1=83=D1=80=D0=BE=D0=B2=20=D0=98=D0=B4?= =?UTF-8?q?=D0=B0=D1=80?= Date: Tue, 13 Apr 2021 14:15:12 +0000 Subject: [PATCH 3/4] Change sequence of actions --- main/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/views.py b/main/views.py index 41aa856..a0fc402 100644 --- a/main/views.py +++ b/main/views.py @@ -79,12 +79,12 @@ class CustomRegistrationView(RegistrationView): password=User.objects.make_random_password(length=50) ) try: - forms.save(**opts) update_profile(user.userprofile) self.set_permission(user) + forms.save(**opts) return user except SMTPException: - user.delete() + # user.delete() self.is_allowed = False else: raise ValueError('Непредвиденная ошибка') From 8a0a1639fc9fbe1acdc604b941cb201ebc8a3a46 Mon Sep 17 00:00:00 2001 From: Sokurov Idar Date: Tue, 13 Apr 2021 20:58:36 +0300 Subject: [PATCH 4/4] Add new page if email has not sent --- access_controller/urls.py | 9 ++--- .../registration_closed.html | 2 +- .../registration_error.html | 15 +++++++ main/views.py | 39 ++++++++++--------- 4 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 main/templates/django_registration/registration_error.html diff --git a/access_controller/urls.py b/access_controller/urls.py index e174717..9550e6b 100644 --- a/access_controller/urls.py +++ b/access_controller/urls.py @@ -17,28 +17,27 @@ from django.contrib import admin from django.contrib.auth import views as auth_views from django.urls import path, include -from main.views import main_page, profile_page, CustomRegistrationView, CustomLoginView +from main.views import main_page, profile_page, CustomRegistrationView, CustomLoginView, registration_error from main.views import work_page, work_hand_over, work_become_engineer, \ AdminPageView, statistic_page from main.urls import router - urlpatterns = [ path('admin/', admin.site.urls, name='admin'), path('', main_page, name='index'), path('accounts/profile/', profile_page, name='profile'), path('accounts/register/', CustomRegistrationView.as_view(), name='registration'), + path('accounts/register/error/', registration_error, name='registration_email_error'), path('accounts/login/', CustomLoginView.as_view(), name='login'), path('accounts/', include('django.contrib.auth.urls')), path('accounts/', include('django_registration.backends.one_step.urls')), path('work/', work_page, name="work"), path('work/hand_over/', work_hand_over, name="work_hand_over"), path('work/become_engineer/', work_become_engineer, name="work_become_engineer"), - path('accounts/', include('django_registration.backends.activation.urls')), path('accounts/login/', include('django.contrib.auth.urls')), path('control/', AdminPageView.as_view(), name='control'), path('statistic/', statistic_page, name='statistic') - ] +] urlpatterns += [ path( @@ -47,7 +46,7 @@ urlpatterns += [ name='password_reset' ), path( - 'password-reset/done/', + 'password_reset/done/', auth_views.PasswordResetDoneView.as_view(), name='password_reset_done' ), diff --git a/main/templates/django_registration/registration_closed.html b/main/templates/django_registration/registration_closed.html index fdf4e36..9c5e013 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_error.html b/main/templates/django_registration/registration_error.html new file mode 100644 index 0000000..603e103 --- /dev/null +++ b/main/templates/django_registration/registration_error.html @@ -0,0 +1,15 @@ +{% extends 'base/base.html' %} +{% load static %} + +{% block title %} + Регистрация завершена +{% endblock %} + +{% block heading %} + Регистрация +{% endblock %} + +{% block content %} +
+

Произошла ошибка при отправке электронного сообщения.

+{% endblock %} diff --git a/main/views.py b/main/views.py index a0fc402..208ab25 100644 --- a/main/views.py +++ b/main/views.py @@ -24,7 +24,7 @@ from zenpy.lib.api_objects import User as ZenpyUser from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES, ZENDESK_MAX_AGENTS, ZENDESK_GROUPS from main.extra_func import check_user_exist, update_profile, get_user_organization, \ make_engineer, make_light_agent, get_users_list, update_users_in_model, count_users, \ - StatisticData,ZendeskAdmin + StatisticData, ZendeskAdmin from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm from main.serializers import ProfileSerializer from .models import UserProfile @@ -45,8 +45,12 @@ class CustomRegistrationView(RegistrationView): """ form_class = CustomRegistrationForm template_name = 'django_registration/registration_form.html' - success_url = reverse_lazy('django_registration_complete') - is_allowed = True + urls = { + 'done': reverse_lazy('password_reset_done'), + 'invalid_zendesk_email': reverse_lazy('django_registration_disallowed'), + 'email_sending_error': reverse_lazy('registration_email_error'), + } + redirect_url = 'done' def register(self, form: CustomRegistrationForm) -> User: """ @@ -59,7 +63,7 @@ class CustomRegistrationView(RegistrationView): :param form: Email пользователя на Zendesk :return: user """ - self.is_allowed = True + self.redirect_url = 'done' if check_user_exist(form.data['email']) and get_user_organization(form.data['email']) == 'SYSTEM': forms = PasswordResetForm(self.request.POST) if forms.is_valid(): @@ -74,9 +78,9 @@ class CustomRegistrationView(RegistrationView): '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) + username=form.data['email'], + email=form.data['email'], + password=User.objects.make_random_password(length=50) ) try: update_profile(user.userprofile) @@ -84,12 +88,11 @@ class CustomRegistrationView(RegistrationView): forms.save(**opts) return user except SMTPException: - # user.delete() - self.is_allowed = False + self.redirect_url = 'email_sending_error' else: raise ValueError('Непредвиденная ошибка') else: - self.is_allowed = False + self.redirect_url = 'invalid_zendesk_email' @staticmethod def set_permission(user: User) -> None: @@ -106,7 +109,7 @@ class CustomRegistrationView(RegistrationView): ) user.user_permissions.add(permission) - def get_success_url(self, user: User = None) -> success_url: + def get_success_url(self, user: User = None): """ Функция возвращает url-адрес страницы, куда нужно перейти после успешной/не успешной регистрации. Используется самой django-registration. @@ -114,10 +117,11 @@ class CustomRegistrationView(RegistrationView): :param user: пользователь, пытающийся зарегистрироваться :return: адресация на страницу успешной регистрации """ - if self.is_allowed: - return reverse_lazy('password_reset_done') - else: - return reverse_lazy('django_registration_disallowed') + return self.urls[self.redirect_url] + + +def registration_error(request): + return render(request, 'django_registration/registration_error.html') @login_required() @@ -232,7 +236,7 @@ def main_page(request): return render(request, 'pages/index.html') -class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin,SuccessMessageMixin, FormView): +class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageMixin, FormView): """ Класс отображения страницы администратора. @@ -315,7 +319,6 @@ class UsersViewSet(viewsets.ReadOnlyModelViewSet): }) - @login_required() def statistic_page(request: WSGIRequest) -> HttpResponse: """ @@ -325,7 +328,7 @@ def statistic_page(request: WSGIRequest) -> HttpResponse: :return: адресация на страницу статистики """ if not request.user.has_perm('main.has_control_access'): - return PermissionDenied + raise PermissionDenied context = { 'pagename': 'страница статистики', 'errors': list(),