+
+
{% endblock %}
diff --git a/main/templates/pages/registration_failed.html b/main/templates/pages/registration_failed.html
new file mode 100644
index 0000000..5cae8c3
--- /dev/null
+++ b/main/templates/pages/registration_failed.html
@@ -0,0 +1,12 @@
+{% extends 'base/base.html' %}
+
+{% block title %}
+Регистрация закрыта
+{% endblock %}
+
+{% block content %}
+
+
К сожалению, регистрация закрыта.
+
На главную
+
+{% endblock %}
\ No newline at end of file
diff --git a/main/tests.py b/main/tests.py
index 9d87037..5365782 100644
--- a/main/tests.py
+++ b/main/tests.py
@@ -12,11 +12,30 @@ from django.http import HttpResponseRedirect
from django.template.loader import render_to_string
from django.test import TestCase, Client
from django.urls import reverse, reverse_lazy
-from django.utils import translation
+from django.utils import translation, timezone
import access_controller.settings as sets
from main.zendesk_admin import zenpy
+from main.extra_func import log
+
+
+class UsersBaseTestCase(TestCase):
+ """Базовый класс загружения данных для тестов с пользователями"""
+ fixtures = ['fixtures/test_users.json']
+
+ def setUp(self):
+ """Добавление в переменные почт и клиентов для пользователей"""
+ self.light_agent = '123@test.ru'
+ self.admin = 'admin@gmail.com'
+ self.engineer = 'customer@example.com'
+ self.agent_client = Client()
+ self.agent_client.force_login(User.objects.get(email=self.light_agent))
+ self.admin_client = Client()
+ self.admin_client.force_login(User.objects.get(email=self.admin))
+ self.engineer_client = Client()
+ self.engineer_client.force_login(User.objects.get(email=self.engineer))
+
class RegistrationTestCase(TestCase):
"""
@@ -96,41 +115,27 @@ class RegistrationTestCase(TestCase):
self.assertTrue(user.has_perm('main.has_control_access'))
-class MakeEngineerTestCase(TestCase):
+class MakeEngineerTestCase(UsersBaseTestCase):
"""
Класс тестов для проверки функции назначения роли engineer.
"""
- fixtures = ['fixtures/test_make_engineer.json']
-
- def setUp(self):
- """
- Предустановленные значения для проведения тестов.
- """
- self.light_agent = '123@test.ru'
- self.admin = 'admin@gmail.com'
- self.engineer = 'customer@example.com'
- self.client = Client()
- self.client.force_login(get_user_model().objects.get(email=self.light_agent))
- self.admin_client = Client()
- self.admin_client.force_login(get_user_model().objects.get(email=self.admin))
-
@patch('main.extra_func.zenpy')
- def test_redirect(self, zenpy_mock):
+ def test_become_engineer_redirect(self, _zenpy_mock):
"""
Функция проверки переадресации пользователя на рабочую страницу после назначения роли engineer.
"""
user = get_user_model().objects.get(email=self.light_agent)
- resp = self.client.post(reverse_lazy('work_become_engineer'))
+ resp = self.agent_client.post(reverse_lazy('work_become_engineer'))
self.assertRedirects(resp, reverse('work', args=[user.id]))
self.assertEqual(resp.status_code, 302)
- self.assertFalse(zenpy_mock.called)
+ self.assertFalse(_zenpy_mock.called)
@patch('main.extra_func.zenpy')
def test_light_agent_make_engineer(self, zenpy_mock):
"""
Функция проверки назначения light_agent на роль engineer.
"""
- self.client.post(reverse_lazy('work_become_engineer'))
+ self.agent_client.post(reverse_lazy('work_become_engineer'))
self.assertEqual(zenpy_mock.update_user.call_args[0][0].custom_role_id, sets.ZENDESK_ROLES['engineer'])
@patch('main.extra_func.zenpy')
@@ -146,13 +151,11 @@ class MakeEngineerTestCase(TestCase):
"""
Функция проверки назначения engineer на роль engineer.
"""
- client = Client()
- client.force_login(get_user_model().objects.get(email=self.engineer))
- client.post(reverse_lazy('work_become_engineer'))
+ self.engineer_client.post(reverse_lazy('work_become_engineer'))
self.assertEqual(zenpy_mock.update_user.call_args[0][0].custom_role_id, sets.ZENDESK_ROLES['engineer'])
@patch('main.extra_func.zenpy')
- def test_control_page_make_one(self, zenpy_mock):
+ def test_control_page_make_engineer_one(self, zenpy_mock):
"""
Функция проверки назначения администратором на роль engineer одного пользователя.
"""
@@ -167,7 +170,7 @@ class MakeEngineerTestCase(TestCase):
self.assertEqual(mock_object.custom_role_id, sets.ZENDESK_ROLES['engineer'])
@patch('main.extra_func.zenpy')
- def test_control_page_make_many(self, zenpy_mock):
+ def test_control_page_make_engineer_many(self, zenpy_mock):
"""
Функция проверки назначения администратором на роль engineer нескольких пользователей.
"""
@@ -188,27 +191,111 @@ class MakeEngineerTestCase(TestCase):
self.assertEqual(obj[0][0].custom_role_id, sets.ZENDESK_ROLES['engineer'])
-class PasswordResetTestCase(TestCase):
+class MakeLightAgentTestCase(UsersBaseTestCase):
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[[]])
+ @patch('main.extra_func.zenpy')
+ def test_hand_over_redirect(self, _zenpy_mock, _user_tickets_mock):
+ user = get_user_model().objects.get(email=self.engineer)
+ resp = self.engineer_client.post(reverse_lazy('work_hand_over'))
+ self.assertRedirects(resp, reverse('work', args=[user.id]))
+ self.assertEqual(resp.status_code, 302)
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[[]])
+ @patch('main.extra_func.zenpy')
+ def test_engineer_make_light_agent_no_tickets(self, zenpy_mock, _user_tickets_mock):
+ self.engineer_client.post(reverse_lazy('work_hand_over'))
+ self.assertEqual(zenpy_mock.update_user.call_args[0][0].custom_role_id, sets.ZENDESK_ROLES['light_agent'])
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[
+ [Mock(id=1, status='solved'), Mock(id=2, status='open'), Mock(id=3, status='open')]
+ ])
+ @patch('main.extra_func.zenpy')
+ def test_engineer_make_light_agent_with_tickets(self, zenpy_mock, _user_tickets_mock):
+ zenpy_mock.solved_tickets_user_id = Mock()
+ self.engineer_client.post(reverse_lazy('work_hand_over'))
+
+ tickets_update = zenpy_mock.admin.tickets.update.call_args[0][0]
+ self.assertEqual(tickets_update[0].assignee_id, zenpy_mock.solved_tickets_user_id)
+ self.assertIsNone(tickets_update[1].assignee)
+ self.assertIsNone(tickets_update[2].assignee)
+ self.assertEqual(zenpy_mock.update_user.call_args[0][0].custom_role_id, sets.ZENDESK_ROLES['light_agent'])
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[[]])
+ @patch('main.extra_func.zenpy')
+ def test_admin_make_light_agent_no_tickets(self, zenpy_mock, _user_tickets_mock):
+ self.admin_client.post(reverse_lazy('work_hand_over'))
+ self.assertEqual(zenpy_mock.update_user.call_args[0][0].custom_role_id, sets.ZENDESK_ROLES['light_agent'])
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[
+ [Mock(id=1, status='solved'), Mock(id=2, status='open'), Mock(id=3, status='open')]
+ ])
+ @patch('main.extra_func.zenpy')
+ def test_admin_make_light_agent_with_tickets(self, zenpy_mock, _user_tickets_mock):
+ zenpy_mock.solved_tickets_user_id = Mock()
+ self.admin_client.post(reverse_lazy('work_hand_over'))
+
+ tickets_update = zenpy_mock.admin.tickets.update.call_args[0][0]
+ self.assertEqual(tickets_update[0].assignee_id, zenpy_mock.solved_tickets_user_id)
+ self.assertIsNone(tickets_update[1].assignee)
+ self.assertIsNone(tickets_update[2].assignee)
+ self.assertEqual(zenpy_mock.update_user.call_args[0][0].custom_role_id, sets.ZENDESK_ROLES['light_agent'])
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[[]])
+ @patch('main.extra_func.zenpy')
+ def test_light_agent_make_light_agent(self, zenpy_mock, _user_tickets_mock):
+ self.agent_client.post(reverse_lazy('work_hand_over'))
+ self.assertEqual(zenpy_mock.update_user.call_args[0][0].custom_role_id, sets.ZENDESK_ROLES['light_agent'])
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[[]])
+ @patch('main.extra_func.zenpy')
+ def test_control_page_make_light_agent_one(self, zenpy_mock, _user_tickets_mock):
+ self.admin_client.post(
+ reverse_lazy('control'),
+ data={'users': [get_user_model().objects.get(email=self.engineer).userprofile.id], 'light_agent': 'light_agent'}
+ )
+ call_list = zenpy_mock.update_user.call_args_list
+ mock_object = call_list[0][0][0]
+ self.assertEqual(len(call_list), 1)
+ self.assertEqual(mock_object.custom_role_id, sets.ZENDESK_ROLES['light_agent'])
+
+ @patch('main.requester.TicketListRequester.get_tickets_list_for_user', side_effect=[[], []])
+ @patch('main.extra_func.zenpy')
+ def test_control_page_make_light_agent_many(self, zenpy_mock, _user_tickets_mock):
+ self.admin_client.post(
+ reverse_lazy('control'),
+ data={
+ 'users': [
+ get_user_model().objects.get(email=self.light_agent).userprofile.id,
+ get_user_model().objects.get(email=self.engineer).userprofile.id,
+ ],
+ 'light_agent': 'light_agent'
+ }
+ )
+ call_list = zenpy_mock.update_user.call_args_list
+ mock_objects = list(call_list)
+ self.assertEqual(len(call_list), 2)
+ for obj in mock_objects:
+ self.assertEqual(obj[0][0].custom_role_id, sets.ZENDESK_ROLES['light_agent'])
+
+
+class PasswordResetTestCase(UsersBaseTestCase):
"""
Класс тестов сброса пароля.
"""
- fixtures = ['fixtures/test_make_engineer.json']
-
def setUp(self):
"""
Предустановленные значения для проведения тестов.
"""
- self.user = '123@test.ru'
+ super().setUp()
self.email_backend = 'django.core.mail.backends.locmem.EmailBackend'
- self.client = Client()
- self.client.force_login(get_user_model().objects.get(email=self.user))
def test_redirect(self):
"""
Функция проверки переадресации на страницу уведомления о сбросе пароля на email.
"""
with self.settings(EMAIL_BACKEND=self.email_backend):
- resp = self.client.post(reverse_lazy('password_reset'), data={'email': self.user})
+ resp = self.agent_client.post(reverse_lazy('password_reset'), data={'email': self.light_agent})
self.assertRedirects(resp, reverse('password_reset_done'))
self.assertEqual(resp.status_code, 302)
@@ -218,10 +305,10 @@ class PasswordResetTestCase(TestCase):
"""
with self.settings(EMAIL_BACKEND=self.email_backend):
response: HttpResponseRedirect = \
- self.client.post(reverse_lazy('password_reset'), data={'email': self.user})
+ self.agent_client.post(reverse_lazy('password_reset'), data={'email': self.light_agent})
self.assertEqual(response.status_code, 302)
self.assertEqual(len(mail.outbox), 1)
- self.assertEqual(mail.outbox[0].to, [self.user])
+ self.assertEqual(mail.outbox[0].to, [self.light_agent])
# context that the email template was rendered with
email_context = response.context[0].dicts[1]
@@ -235,7 +322,7 @@ class PasswordResetTestCase(TestCase):
Функция проверки уведомления клиента о некорректности введенного email.
"""
with self.settings(EMAIL_BACKEND=self.email_backend) and translation.override('ru'):
- resp = self.client.post(reverse_lazy('password_reset'), data={'email': 1})
+ resp = self.agent_client.post(reverse_lazy('password_reset'), data={'email': 1})
self.assertContains(resp, 'Введите правильный адрес электронной почты.', count=1, status_code=200)
def test_user_does_not_exist(self):
@@ -243,41 +330,37 @@ class PasswordResetTestCase(TestCase):
Функция корректности отработки неверно введенного email.
"""
with self.settings(EMAIL_BACKEND=self.email_backend):
- resp = self.client.post(reverse_lazy('password_reset'), data={'email': self.user + str(random.random())})
+ resp = self.agent_client.post(reverse_lazy('password_reset'), data={'email': self.light_agent + str(random.random())})
self.assertRedirects(resp, reverse('password_reset_done'))
self.assertEqual(resp.status_code, 302)
self.assertEqual(len(mail.outbox), 0)
-class PasswordChangeTestCase(TestCase):
+class PasswordChangeTestCase(UsersBaseTestCase):
"""
Класс тестирования смены пароля.
"""
- fixtures = ['fixtures/test_make_engineer.json']
-
def setUp(self):
"""
Предустановленные значения для проведения тестов.
"""
- self.user = '123@test.ru'
- self.client = Client()
- self.client.force_login(get_user_model().objects.get(email=self.user))
+ super().setUp()
self.set_password()
def set_password(self):
"""
Пароль, сформированный для тестирования.
"""
- user: get_user_model() = get_user_model().objects.get(email=self.user)
+ user: get_user_model() = get_user_model().objects.get(email=self.light_agent)
user.set_password('ImpossiblyHardPassword')
user.save()
- self.client.force_login(get_user_model().objects.get(email=self.user))
+ self.agent_client.force_login(get_user_model().objects.get(email=self.light_agent))
def test_change_successful(self):
"""
Функция тестирования успешного изменения пароля.
"""
- self.client.post(
+ self.agent_client.post(
reverse_lazy('password_change'),
data={
'old_password': 'ImpossiblyHardPassword',
@@ -285,7 +368,7 @@ class PasswordChangeTestCase(TestCase):
'new_password2': 'EasyPassword',
}
)
- user = get_user_model().objects.get(email=self.user)
+ user = get_user_model().objects.get(email=self.light_agent)
self.assertTrue(user.check_password('EasyPassword'))
def test_invalid_old_password(self):
@@ -293,7 +376,7 @@ class PasswordChangeTestCase(TestCase):
Функция тестирования отработки неверно введенного старого пароля при смене.
"""
with translation.override('ru'):
- resp = self.client.post(
+ resp = self.agent_client.post(
reverse_lazy('password_change'),
data={
'old_password': 'EasyPassword',
@@ -308,7 +391,7 @@ class PasswordChangeTestCase(TestCase):
Функция тестирования случая с вводом двух разных новых паролей.
"""
with translation.override('ru'):
- resp = self.client.post(
+ resp = self.agent_client.post(
reverse_lazy('password_change'),
data={
'old_password': 'ImpossiblyHardPassword',
@@ -323,7 +406,7 @@ class PasswordChangeTestCase(TestCase):
Функция тестирования случая с неправильно подобранным новым паролем (слишком короткий).
"""
with translation.override('ru'):
- resp = self.client.post(
+ resp = self.agent_client.post(
reverse_lazy('password_change'),
data={
'old_password': 'ImpossiblyHardPassword',
@@ -338,7 +421,7 @@ class PasswordChangeTestCase(TestCase):
Функция тестирования случая с неправильно подобранным новым паролем (употребляются только цифры).
"""
with translation.override('ru'):
- resp = self.client.post(
+ resp = self.agent_client.post(
reverse_lazy('password_change'),
data={
'old_password': 'ImpossiblyHardPassword',
@@ -353,68 +436,56 @@ class PasswordChangeTestCase(TestCase):
Функция тестирования случая с неправильно подобранным новым паролем (совпадает с именем пользователя).
"""
with translation.override('ru'):
- resp = self.client.post(
+ resp = self.agent_client.post(
reverse_lazy('password_change'),
data={
'old_password': 'ImpossiblyHardPassword',
- 'new_password1': self.user,
- 'new_password2': self.user,
+ 'new_password1': self.light_agent,
+ 'new_password2': self.light_agent,
}
)
self.assertContains(resp, 'Введённый пароль слишком похож на имя пользователя', count=1, status_code=200)
-class GetTicketsTestCase(TestCase):
+class GetTicketsTestCase(UsersBaseTestCase):
"""
Класс тестов для проверки функции получения тикетов.
"""
- fixtures = ['fixtures/test_make_engineer.json']
-
- def setUp(self):
- """
- Предустановленные значения для проведения тестов.
- """
- self.light_agent = '123@test.ru'
- self.engineer = 'customer@example.com'
- self.client = Client()
- self.client.force_login(get_user_model().objects.get(email=self.engineer))
- self.light_agent_client = Client()
- self.light_agent_client.force_login(get_user_model().objects.get(email=self.light_agent))
@patch('main.views.zenpy.get_user')
@patch('main.extra_func.zenpy')
- def test_redirect(self, zenpy_mock, get_user_mock):
+ def test_redirect(self, _zenpy_mock, get_user_mock):
"""
Функция проверки переадресации пользователя на рабочую страницу.
"""
get_user_mock.return_value = Mock()
user = get_user_model().objects.get(email=self.engineer)
- resp = self.client.post(reverse('work_get_tickets'))
+ resp = self.engineer_client.post(reverse('work_get_tickets'))
self.assertRedirects(resp, reverse('work', args=[user.id]))
self.assertEqual(resp.status_code, 302)
- self.assertFalse(zenpy_mock.called)
+ self.assertFalse(_zenpy_mock.called)
@patch('main.views.zenpy')
@patch('main.views.get_tickets_list_for_group')
- def test_take_one_ticket(self, tickets_mock, zenpy_views_mock):
+ def test_take_one_ticket(self, group_tickets_mock, zenpy_mock):
"""
Функция проверки назначения одного тикета на engineer.
"""
- tickets_mock.return_value = [Mock()]
- zenpy_views_mock.get_user.return_value = Mock(role='agent', custom_role_id=sets.ZENDESK_ROLES['engineer'])
- self.client.post(reverse('work_get_tickets'), data={'count_tickets': 1})
- tickets = zenpy_views_mock.update_tickets.call_args
- self.assertEqual(tickets[0][0][0].assignee, zenpy_views_mock.get_user.return_value)
+ group_tickets_mock.return_value = [Mock()]
+ zenpy_mock.get_user.return_value = Mock(role='agent', custom_role_id=sets.ZENDESK_ROLES['engineer'])
+ self.engineer_client.post(reverse('work_get_tickets'), data={'count_tickets': 1})
+ tickets = zenpy_mock.update_tickets.call_args
+ self.assertEqual(tickets[0][0][0].assignee, zenpy_mock.get_user.return_value)
@patch('main.views.get_tickets_list_for_group')
@patch('main.views.zenpy')
- def test_take_many_tickets(self, zenpy_mock, tickets_mock):
+ def test_take_many_tickets(self, zenpy_mock, group_tickets_mock):
"""
Функция проверки назначения нескольких тикетов на engineer.
"""
- tickets_mock.return_value = [Mock()] * 3
+ group_tickets_mock.return_value = [Mock()] * 3
zenpy_mock.get_user.return_value = Mock(role='agent', custom_role_id=sets.ZENDESK_ROLES['engineer'])
- self.client.post(reverse('work_get_tickets'), data={'count_tickets': 3})
+ self.engineer_client.post(reverse('work_get_tickets'), data={'count_tickets': 3})
tickets = zenpy_mock.update_tickets.call_args
for ticket in tickets[0][0]:
self.assertEqual(ticket.assignee, zenpy_mock.get_user.return_value)
@@ -426,31 +497,31 @@ class GetTicketsTestCase(TestCase):
Функция проверки попытки назначения тикета на light_agent.
"""
get_user_mock.return_value = Mock(role='agent', custom_role_id=sets.ZENDESK_ROLES['light_agent'])
- self.light_agent_client.post(reverse('work_get_tickets'), data={'count_tickets': 3})
+ self.agent_client.post(reverse('work_get_tickets'), data={'count_tickets': 3})
tickets = zenpy_mock.update_tickets.call_args
self.assertIsNone(tickets)
@patch('main.views.zenpy')
@patch('main.views.get_tickets_list_for_group')
- def test_take_zero_tickets(self, tickets_mock, zenpy_mock):
+ def test_take_zero_tickets(self, TicketsMock, zenpy_mock):
"""
Функция проверки попытки назначения нуля тикета на engineer.
"""
- tickets_mock.return_value = [Mock()] * 3
+ TicketsMock.return_value = [Mock()] * 3
zenpy_mock.get_user.return_value = Mock(role='agent', custom_role_id=sets.ZENDESK_ROLES['engineer'])
- self.client.post(reverse('work_get_tickets'), data={'count_tickets': 0})
+ self.engineer_client.post(reverse('work_get_tickets'), data={'count_tickets': 0})
tickets = zenpy_mock.update_tickets.call_args[0][0]
self.assertListEqual(tickets, [])
@patch('main.views.get_tickets_list_for_group')
@patch('main.views.zenpy')
- def test_take_invalid_count_tickets(self, zenpy_mock, tickets_mock):
+ def test_take_invalid_count_tickets(self, zenpy_mock, group_tickets_mock):
"""
Функция проверки попытки назначения нуля тикетов на engineer.
"""
- tickets_mock.return_value = [Mock()] * 3
+ group_tickets_mock.return_value = [Mock()] * 3
zenpy_mock.get_user.return_value = Mock(role='agent', custom_role_id=sets.ZENDESK_ROLES['engineer'])
- self.client.post(reverse('work_get_tickets'), data={'count_tickets': 'asd'})
+ self.engineer_client.post(reverse('work_get_tickets'), data={'count_tickets': 'asd'})
tickets = zenpy_mock.update_tickets.call_args
self.assertIsNone(tickets)
@@ -513,3 +584,43 @@ class ProfileTestCase(TestCase):
resp = self.client.get(reverse('profile'))
user = zenpy.get_user(self.zendesk_agent_email)
self.assertEqual(resp.context['profile'].image, user.photo['content_url'] if user.photo else None)
+
+
+class LoggingTestCase(UsersBaseTestCase):
+
+ def setUp(self):
+ super().setUp()
+ self.admin_profile = get_user_model().objects.get(email=self.admin).userprofile
+ self.agent_profile = get_user_model().objects.get(email=self.light_agent).userprofile
+ self.engineer_profile = get_user_model().objects.get(email=self.engineer).userprofile
+
+ @staticmethod
+ def get_file_output():
+ file = open('logs/logs.csv', 'r')
+ file_output = file.readlines()[-1]
+ file.close()
+ return file_output
+
+ def test_engineer_with_admin(self):
+ log(self.engineer_profile, self.admin_profile)
+ file_output = self.get_file_output()
+ self.assertEqual(file_output, f'UserForAccessTest,engineer,'
+ f'{str(timezone.now().today())[:16]},ZendeskAdmin\n')
+
+ def test_engineer_without_admin(self):
+ log(self.engineer_profile)
+ file_output = self.get_file_output()
+ self.assertEqual(file_output, f'UserForAccessTest,engineer,'
+ f'{str(timezone.now().today())[:16]},UserForAccessTest\n')
+
+ def test_light_agent_with_admin(self):
+ log(self.agent_profile, self.admin_profile)
+ file_output = self.get_file_output()
+ self.assertEqual(file_output, f'UserForAccessTest,light_agent,'
+ f'{str(timezone.now().today())[:16]},ZendeskAdmin\n')
+
+ def test_light_agent_without_admin(self):
+ log(self.agent_profile)
+ file_output = self.get_file_output()
+ self.assertEqual(file_output, f'UserForAccessTest,light_agent,'
+ f'{str(timezone.now().today())[:16]},UserForAccessTest\n')
diff --git a/main/views.py b/main/views.py
index 1369d94..7c00d8f 100644
--- a/main/views.py
+++ b/main/views.py
@@ -438,3 +438,6 @@ def statistic_page(request: WSGIRequest) -> HttpResponse:
form = StatisticForm()
context['form'] = form
return render(request, 'pages/statistic.html', context)
+
+def registration_failed(request):
+ return render(request, 'pages/registration_failed.html')
diff --git a/main/zendesk_admin.py b/main/zendesk_admin.py
index c6a383f..92c1f57 100644
--- a/main/zendesk_admin.py
+++ b/main/zendesk_admin.py
@@ -8,8 +8,8 @@ from zenpy import Zenpy
from zenpy.lib.api_objects import User as ZenpyUser, Group as ZenpyGroup, Ticket as ZenpyTicket
from zenpy.lib.exception import APIException
-from access_controller.settings import ACTRL_ZENDESK_SUBDOMAIN, ACTRL_API_EMAIL, ACTRL_API_TOKEN, ACTRL_API_PASSWORD, \
- ZENDESK_GROUPS, SOLVED_TICKETS_EMAIL
+from access_controller.settings import ACTRL_ZENDESK_SUBDOMAIN, ACTRL_API_EMAIL, ACTRL_API_TOKEN, \
+ ZENDESK_GROUPS, SOLVED_TICKETS_EMAIL #ACTRL_API_PASSWORD,
class ZendeskAdmin:
@@ -115,5 +115,5 @@ zenpy = ZendeskAdmin({
'subdomain': ACTRL_ZENDESK_SUBDOMAIN,
'email': ACTRL_API_EMAIL,
'token': ACTRL_API_TOKEN,
- 'password': ACTRL_API_PASSWORD,
+ #'password': ACTRL_API_PASSWORD,
})
diff --git a/requirements/common.txt b/requirements/common.txt
index c8a8d08..7452fc5 100644
--- a/requirements/common.txt
+++ b/requirements/common.txt
@@ -1,11 +1,10 @@
# Contains requirements common to all environments
# Engine
-Django==3.1.6
-Pillow==8.1.0
+Django==3.2.3
zenpy~=2.0.24
-django_registration==3.1.1
-djangorestframework==3.12.2
+django_registration==3.1.2
+djangorestframework==3.12.4
# Misc
python-dotenv==0.17.1
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 0ce1a9e..80ddb87 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -2,13 +2,16 @@
-r common.txt
# Documentation
-Sphinx==3.4.3
-sphinx-rtd-theme==0.5.1
-sphinx-autodoc-typehints==1.11.1
+Sphinx==3.5.4
+sphinx-rtd-theme==0.5.2
+sphinx-autodoc-typehints==1.12.0
pyenchant==3.2.0
-sphinxcontrib-spelling==7.1.0
+sphinxcontrib-spelling==7.2.1
m2r == 0.2.1
+# Tests
+coverage==5.5
+
# Code style
pylint == 2.8.2
pylint-django == 2.4.4
diff --git a/requirements/prod.txt b/requirements/prod.txt
index b0e6925..479c608 100644
--- a/requirements/prod.txt
+++ b/requirements/prod.txt
@@ -1,5 +1,5 @@
# Production specific dependencies
-r common.txt
-daphne==3.0.1
+daphne==3.0.2
Twisted[tls,http2]==21.2.0