diff --git a/access_controller/settings.py b/access_controller/settings.py index a7585ed..a74ad7f 100644 --- a/access_controller/settings.py +++ b/access_controller/settings.py @@ -19,10 +19,10 @@ BASE_DIR = Path(__file__).resolve().parent.parent # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.getenv('ACTRL_SECRET_KEY','empty') +SECRET_KEY = os.getenv('ACTRL_SECRET_KEY', 'empty') # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = bool(int(os.getenv('ACTRL_DEBUG',1))) +DEBUG = bool(int(os.getenv('ACTRL_DEBUG', 1))) ALLOWED_HOSTS = [ '127.0.0.1', @@ -57,13 +57,13 @@ MIDDLEWARE = [ ROOT_URLCONF = 'access_controller.urls' EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_HOST = os.getenv('ACTRL_EMAIL_HOST','smtp.gmail.com') -EMAIL_PORT = int(os.getenv('ACTRL_EMAIL_PORT',587)) -EMAIL_USE_TLS = bool(int(os.getenv('ACTRL_EMAIL_TLS',1))) -EMAIL_HOST_USER = os.getenv('ACTRL_EMAIL_HOST_USER','group02django@gmail.com') -EMAIL_HOST_PASSWORD = os.getenv('ACTRL_EMAIL_HOST_PASSWORD','djangogroup02') -DEFAULT_FROM_EMAIL = os.getenv('ACTRL_FROM_EMAIL',EMAIL_HOST_USER) -SERVER_EMAIL = os.getenv('ACTRL_SERVER_EMAIL',EMAIL_HOST_USER) +EMAIL_HOST = os.getenv('ACTRL_EMAIL_HOST', 'smtp.gmail.com') +EMAIL_PORT = int(os.getenv('ACTRL_EMAIL_PORT', 587)) +EMAIL_USE_TLS = bool(int(os.getenv('ACTRL_EMAIL_TLS', 1))) +EMAIL_HOST_USER = os.getenv('ACTRL_EMAIL_HOST_USER', 'group02django@gmail.com') +EMAIL_HOST_PASSWORD = os.getenv('ACTRL_EMAIL_HOST_PASSWORD', 'djangogroup02') +DEFAULT_FROM_EMAIL = os.getenv('ACTRL_FROM_EMAIL', EMAIL_HOST_USER) +SERVER_EMAIL = os.getenv('ACTRL_SERVER_EMAIL', EMAIL_HOST_USER) TEMPLATES = [ { @@ -150,8 +150,8 @@ AUTHENTICATION_BACKENDS = [ ZENDESK_ROLES = { - 'engineer': int(os.getenv('ENG_CROLE_ID',0)), - 'light_agent': int(os.getenv('LA_CROLE_ID',0)), + 'engineer': int(os.getenv('ENG_CROLE_ID', 0)), + 'light_agent': int(os.getenv('LA_CROLE_ID', 0)), } ZENDESK_GROUPS = { @@ -161,7 +161,7 @@ ZENDESK_GROUPS = { SOLVED_TICKETS_EMAIL = os.getenv('ST_EMAIL') -ZENDESK_MAX_AGENTS = int(os.getenv('LICENSE_NO',0)) +ZENDESK_MAX_AGENTS = int(os.getenv('LICENSE_NO', 0)) REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, @@ -171,7 +171,7 @@ REST_FRAMEWORK = { ] } -ONE_DAY = int(os.getenv('SHIFTH',0)) # Количество часов в 1 рабочем дне +ONE_DAY = int(os.getenv('SHIFTH', 0)) # Количество часов в 1 рабочем дне ACTRL_ZENDESK_SUBDOMAIN = os.getenv('ACTRL_ZENDESK_SUBDOMAIN') or os.getenv('ZD_DOMAIN') ACTRL_API_EMAIL = os.getenv('ACTRL_API_EMAIL') or os.getenv('ACCESS_CONTROLLER_API_EMAIL') diff --git a/access_controller/urls.py b/access_controller/urls.py index 63dc19f..7df57b3 100644 --- a/access_controller/urls.py +++ b/access_controller/urls.py @@ -22,6 +22,7 @@ from main.views import work_page, work_hand_over, work_become_engineer, work_get AdminPageView, statistic_page from main.urls import router + urlpatterns = [ path('admin/', admin.site.urls, name='admin'), path('', main_page, name='index'), diff --git a/fixtures/data.json b/fixtures/data.json new file mode 100644 index 0000000..a4310a4 --- /dev/null +++ b/fixtures/data.json @@ -0,0 +1,57 @@ +[ + { + "model": "auth.user", + "pk": 1, + "fields": { + "password": "pbkdf2_sha256$216000$gHBBCr1jBELf$ZkEDW3IEd8Wij7u8vkv+0Eze32CS01bcaYWhcD9OIC4=", + "last_login": null, + "is_superuser": true, + "username": "admin@gmail.com", + "first_name": "", + "last_name": "", + "email": "admin@gmail.com", + "is_staff": true, + "is_active": true, + "date_joined": "2021-03-10T16:38:56.303Z", + "groups": [], + "user_permissions": [33] + } + }, + { + "model": "main.userprofile", + "pk": 1, + "fields": { + "name": "ZendeskAdmin", + "user": 1, + "role": "admin" + } + }, + { + "model": "auth.user", + "pk": 2, + "fields": { + "password": "pbkdf2_sha256$216000$5qLJgrm2Quq9$KDBNNymVZXkUx0HKBPFst2m83kLe0egPBnkW7KnkORU=", + "last_login": null, + "is_superuser": false, + "username": "123@test.ru", + "first_name": "", + "last_name": "", + "email": "123@test.ru", + "is_staff": false, + "is_active": true, + "date_joined": "2021-03-10T16:38:56.303Z", + "groups": [], + "user_permissions": [] + } + }, + { + "model": "main.userprofile", + "pk": 2, + "fields": { + "name": "UserForAccessTest", + "user": 2, + "role": "agent", + "custom_role_id": "360005209000" + } + } +] diff --git a/main/tests.py b/main/tests.py index b733ed1..c06bc21 100644 --- a/main/tests.py +++ b/main/tests.py @@ -1,2 +1,83 @@ +from urllib.parse import urlparse + +from django.contrib.auth.models import User +from django.core import mail from django.test import TestCase, Client +from django.urls import reverse +from django.utils import translation + import access_controller.settings as sets +from main.zendesk_admin import zenpy + + +class RegistrationTestCase(TestCase): + fixtures = ['fixtures/data.json'] + + def setUp(self): + self.email_backend = 'django.core.mail.backends.locmem.EmailBackend' + self.any_zendesk_user_email = 'idar.sokurov.05@mail.ru' + self.zendesk_admin_email = 'idar.sokurov.05@mail.ru' + self.client = Client() + + def test_registration_complete_redirect(self): + with self.settings(EMAIL_BACKEND=self.email_backend): + resp = self.client.post(reverse('registration'), data={'email': self.any_zendesk_user_email}) + self.assertRedirects(resp, reverse('password_reset_done')) + + def test_registration_fail_redirect(self): + with self.settings(EMAIL_BACKEND=self.email_backend): + resp = self.client.post(reverse('registration'), data={'email': self.any_zendesk_user_email + 'asd'}) + self.assertRedirects(resp, reverse('django_registration_disallowed')) + + def test_registration_user_already_exist(self): + with self.settings(EMAIL_BACKEND=self.email_backend) and translation.override('ru'): + resp = self.client.post(reverse('registration'), data={'email': '123@test.ru'}) + self.assertContains(resp, 'Этот адрес электронной почты уже используется', count=1, status_code=200) + + def test_registration_email_sending(self): + # TODO: Найти способ лучше проверять сообщения + email_template = [ + '', + 'Вы получили это письмо, потому что вы (или кто-то другой) запросили восстановление пароля ' + 'от учётной записи на сайте testserver, которая связана с этим адресом электронной почты.', + '', + 'Пожалуйста, перейдите на эту страницу и введите новый пароль:', + '', + 'url', + '', + f'Ваше имя пользователя (на случай, если вы его забыли): {self.any_zendesk_user_email}', + '', + 'Спасибо, что используете наш сайт!', + '', + 'Команда сайта testserver', + '', + '', + '', + ] + with self.settings(EMAIL_BACKEND=self.email_backend) and translation.override('ru'): + self.client.post(reverse('registration'), data={'email': self.any_zendesk_user_email}) + + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].to, [self.zendesk_admin_email]) + self.assertEqual(mail.outbox[0].from_email, sets.DEFAULT_FROM_EMAIL) + + message = mail.outbox[0].body.split('\n') + for i in range(len(message)): + if email_template[i] != 'url': + self.assertEqual(message[i], email_template[i]) + else: + self.assertTrue(urlparse(message[i]).scheme) + + def test_registration_user_creating(self): + with self.settings(EMAIL_BACKEND=self.email_backend): + self.client.post(reverse('registration'), data={'email': self.any_zendesk_user_email}) + user = User.objects.get(email=self.any_zendesk_user_email) + zendesk_user = zenpy.get_user(self.any_zendesk_user_email) + self.assertEqual(user.userprofile.name, zendesk_user.name) + + def test_permissions_applying(self): + with self.settings(EMAIL_BACKEND=self.email_backend): + self.client.post(reverse('registration'), data={'email': self.zendesk_admin_email}) + user = User.objects.get(email=self.zendesk_admin_email) + self.assertEqual(user.userprofile.role, 'admin') + self.assertTrue(user.has_perm('main.has_control_access')) diff --git a/main/views.py b/main/views.py index d21a6e9..bd57eab 100644 --- a/main/views.py +++ b/main/views.py @@ -105,7 +105,7 @@ class CustomRegistrationView(RegistrationView): except SMTPException: self.redirect_url = 'email_sending_error' else: - raise ValueError('Непредвиденная ошибка') + self.redirect_url = 'email_sending_error' else: self.redirect_url = 'invalid_zendesk_email'