From 0cda9da3116820266e9f3113875cf0c87fb2ee24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=B5=D0=BD=D0=BA?= =?UTF-8?q?=D0=BE=20=D0=9E=D0=BB=D1=8C=D0=B3=D0=B0?= Date: Wed, 3 Mar 2021 20:59:53 +0300 Subject: [PATCH 1/8] Add views and forms documentation --- main/forms.py | 15 ++++++++------- main/views.py | 35 +++++++++++++++++++++++++---------- requirements.txt | 1 + 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/main/forms.py b/main/forms.py index 176302e..63a3556 100644 --- a/main/forms.py +++ b/main/forms.py @@ -7,13 +7,14 @@ from main.models import UserProfile class CustomRegistrationForm(RegistrationFormUniqueEmail): """ Форма для регистрации :class:`django_registration.forms.RegistrationFormUniqueEmail` - с добавлением bootstrap-класса 'form-control' - :param password_zen: Поле для ввода пароля от Zendesk - :type password_zen: :class:`django.forms.CharField` + с добавлением bootstrap-класса "form-control" + + :param visible_fields.email: Поле для ввода email, зарегистирированного на Zendesk + :type visible_fields.email: :class:`django_registration.forms.RegistrationFormUniqueEmail` """ - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> RegistrationFormUniqueEmail: super().__init__(*args, **kwargs) for visible in self.visible_fields(): if visible.field.widget.attrs.get('class', False): @@ -30,10 +31,10 @@ class CustomRegistrationForm(RegistrationFormUniqueEmail): class AdminPageUsers(forms.Form): """ - Форма для установки статуса + Форма для установки статусов engineer или light_agent пользователям - :param password_zen: Поле для ввода пароля от Zendesk - :type password_zen: :class:`django.forms.CharField` + :param users: Поле для установки статуса + :type users: :class:`ModelMultipleChoiceField` """ users = forms.ModelMultipleChoiceField( diff --git a/main/views.py b/main/views.py index 72d4e52..c7c1849 100644 --- a/main/views.py +++ b/main/views.py @@ -27,13 +27,17 @@ 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): + 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) @@ -61,7 +65,7 @@ class CustomRegistrationView(RegistrationView): else: self.is_allowed = False - def get_success_url(self, user=None): + def get_success_url(self, user: User = None) -> success_url: """ Возвращает url-адрес страницы, куда нужно перейти после успешной/неуспешной регистрации Используется самой django-registration @@ -73,13 +77,9 @@ class CustomRegistrationView(RegistrationView): @login_required() -def profile_page(request): +def profile_page(request: UserProfile) -> UserProfile: """ Отображение страницы профиля - - :param request: объект с деталями запроса - :type request: :class:`django.http.HttpResponse` - :return: объект ответа сервера с HTML-кодом внутри """ user_profile = request.user.userprofile update_profile(user_profile) @@ -95,17 +95,26 @@ def profile_page(request): 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): + 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: @@ -121,7 +130,10 @@ class AdminPageView(FormView, LoginRequiredMixin): [make_light_agent(user) for user in users] @staticmethod - def count_users(users): # TODO: this func counts users from all zendesk instead of just from a model + 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']: @@ -130,7 +142,10 @@ class AdminPageView(FormView, LoginRequiredMixin): light_agents += 1 return engineers, light_agents - def get_context_data(self, **kwargs): + def get_context_data(self, **kwargs) -> list: + """ + Функция формирования контента страницы администратора (с проверкой прав доступа) + """ if self.request.user.userprofile.role != 'admin': raise PermissionDenied context = super().get_context_data(**kwargs) diff --git a/requirements.txt b/requirements.txt index b2e4c64..826cc73 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ django_registration==3.1.1 # Documentation Sphinx==3.4.3 sphinx-rtd-theme==0.5.1 +sphinx-autodoc-typehints==1.11.1 From cd47331ae7496b7a3b02cc1d1ba18c4bf05848ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=B5=D0=BD=D0=BA?= =?UTF-8?q?=D0=BE=20=D0=9E=D0=BB=D1=8C=D0=B3=D0=B0?= Date: Wed, 3 Mar 2021 21:05:31 +0300 Subject: [PATCH 2/8] After mergin develop --- main/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main/forms.py b/main/forms.py index a9624dd..32ed00b 100644 --- a/main/forms.py +++ b/main/forms.py @@ -51,8 +51,8 @@ class AdminPageUsers(forms.Form): class CustomAuthenticationForm(AuthenticationForm): """ - Форма для авторизации :class:`django.contrib.auth.forms.AuthenticationForm` - с изменением поля username на email + Форма для авторизации :class:`django.contrib.auth.forms.AuthenticationForm` + с изменением поля username на email """ username = forms.CharField( label="Электронная почта", From d46b90010de3cd8d62bb5b6ad896b9f2a301ef9b Mon Sep 17 00:00:00 2001 From: Yuriy Kulakov Date: Thu, 4 Mar 2021 18:22:49 +0300 Subject: [PATCH 3/8] Added permissions system to control page --- main/migrations/0005_auto_20210302_2255.py | 17 +++++++++++++ main/migrations/0006_delete_userprofile.py | 16 ++++++++++++ main/migrations/0007_userprofile.py | 29 ++++++++++++++++++++++ main/migrations/0008_auto_20210303_2305.py | 17 +++++++++++++ main/templates/base/menu.html | 3 +++ main/templates/pages/adm_ruleset.html | 23 ++++++++--------- main/views.py | 26 ++++++++++++++----- static/main/js/control.js | 9 +++++++ 8 files changed, 122 insertions(+), 18 deletions(-) create mode 100644 main/migrations/0005_auto_20210302_2255.py create mode 100644 main/migrations/0006_delete_userprofile.py create mode 100644 main/migrations/0007_userprofile.py create mode 100644 main/migrations/0008_auto_20210303_2305.py create mode 100644 static/main/js/control.js diff --git a/main/migrations/0005_auto_20210302_2255.py b/main/migrations/0005_auto_20210302_2255.py new file mode 100644 index 0000000..dff2dc2 --- /dev/null +++ b/main/migrations/0005_auto_20210302_2255.py @@ -0,0 +1,17 @@ +# Generated by Django 3.1.6 on 2021-03-02 19:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0004_rolechangelogs'), + ] + + operations = [ + migrations.AlterModelOptions( + name='userprofile', + options={'permissions': [('admin', 'Have access to control page')]}, + ), + ] diff --git a/main/migrations/0006_delete_userprofile.py b/main/migrations/0006_delete_userprofile.py new file mode 100644 index 0000000..23adaab --- /dev/null +++ b/main/migrations/0006_delete_userprofile.py @@ -0,0 +1,16 @@ +# Generated by Django 3.1.6 on 2021-03-03 19:32 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0005_auto_20210302_2255'), + ] + + operations = [ + migrations.DeleteModel( + name='UserProfile', + ), + ] diff --git a/main/migrations/0007_userprofile.py b/main/migrations/0007_userprofile.py new file mode 100644 index 0000000..2b05dd7 --- /dev/null +++ b/main/migrations/0007_userprofile.py @@ -0,0 +1,29 @@ +# Generated by Django 3.1.6 on 2021-03-03 19:35 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('main', '0006_delete_userprofile'), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('role', models.CharField(default='None', max_length=100)), + ('image', models.URLField(blank=True, null=True)), + ('name', models.CharField(default='None', max_length=100)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'permissions': [('control_access', 'User has access to control page')], + }, + ), + ] diff --git a/main/migrations/0008_auto_20210303_2305.py b/main/migrations/0008_auto_20210303_2305.py new file mode 100644 index 0000000..8082682 --- /dev/null +++ b/main/migrations/0008_auto_20210303_2305.py @@ -0,0 +1,17 @@ +# Generated by Django 3.1.6 on 2021-03-03 20:05 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0007_userprofile'), + ] + + operations = [ + migrations.AlterModelOptions( + name='userprofile', + options={}, + ), + ] diff --git a/main/templates/base/menu.html b/main/templates/base/menu.html index 8448b0c..f64ceb3 100644 --- a/main/templates/base/menu.html +++ b/main/templates/base/menu.html @@ -11,6 +11,9 @@ {% if request.user.is_authenticated %}
Профиль + {% if perms.main.has_control_access %} + Управление + {% endif %} Выйти
{% else %} diff --git a/main/templates/pages/adm_ruleset.html b/main/templates/pages/adm_ruleset.html index 1bddc5f..387cd73 100644 --- a/main/templates/pages/adm_ruleset.html +++ b/main/templates/pages/adm_ruleset.html @@ -2,7 +2,7 @@ {% load static %} -{% block title %}Управление{%endblock %} +{% block title %}Управление{% endblock %} {% block heading %}Управление{% endblock %} @@ -16,19 +16,24 @@

Основная информация о странице

+ {% block form %}
{% csrf_token %}
+ {% block hidden_form %}
{% for field in form.users %} {{ field.tag }} {% endfor %}
+ {% endblock %}
Список сотрудников
+ + {% block table %} @@ -52,10 +57,12 @@
+ {% endblock%}
+ {% block count %}
@@ -91,19 +98,11 @@
+ {% endblock %} + {% endblock %}
- + {% endblock %} diff --git a/main/views.py b/main/views.py index 72d4e52..517ea84 100644 --- a/main/views.py +++ b/main/views.py @@ -1,22 +1,20 @@ -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.contrib.contenttypes.models import ContentType 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 django.contrib.auth.models import User, Permission 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.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin from django.core.exceptions import PermissionDenied import logging @@ -55,12 +53,27 @@ class CustomRegistrationView(RegistrationView): ) forms.save(**opts) update_profile(user.userprofile) + self.set_permission(user) return user else: raise ValueError('Непредвиденная ошибка') else: self.is_allowed = False + @staticmethod + def set_permission(user) -> None: + """ + Дает разрешение на просмотр страница администратора, если пользователь имеет роль admin + """ + + content_type = ContentType.objects.get_for_model(UserProfile) + permission, created = Permission.objects.get_or_create( + codename='has_control_access', + content_type=content_type, + ) + if user.userprofile.role == 'admin': + user.user_permissions.add(permission) + def get_success_url(self, user=None): """ Возвращает url-адрес страницы, куда нужно перейти после успешной/неуспешной регистрации @@ -100,7 +113,8 @@ def main_page(request): return render(request, 'pages/index.html') -class AdminPageView(FormView, LoginRequiredMixin): +class AdminPageView(FormView, LoginRequiredMixin, PermissionRequiredMixin): + permission_required = 'main.has_control_access' template_name = 'pages/adm_ruleset.html' form_class = AdminPageUsers success_url = '/control/' diff --git a/static/main/js/control.js b/static/main/js/control.js new file mode 100644 index 0000000..1fd4f9c --- /dev/null +++ b/static/main/js/control.js @@ -0,0 +1,9 @@ +"use strict"; +let checkboxes = document.getElementsByName("users"); +let fields = document.querySelectorAll(".checkbox_field"); +if (checkboxes.length == fields.length) { + for (let i = 0; i < fields.length; ++i) { + let el = checkboxes[i].cloneNode(true); + fields[i].appendChild(el); + } +} From 525bb256974383a40981d20813d63551ca2649a1 Mon Sep 17 00:00:00 2001 From: Yuriy Kulakov Date: Thu, 4 Mar 2021 19:06:45 +0300 Subject: [PATCH 4/8] Merge branch 'develop' into feature/adm_ruleset/backend --- main/views.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/main/views.py b/main/views.py index 979aa6b..5c5ed12 100644 --- a/main/views.py +++ b/main/views.py @@ -1,15 +1,15 @@ -import os - -from django.contrib.auth.forms import PasswordResetForm import logging import os -from django.contrib.auth.decorators import login_required from django.contrib.auth.tokens import default_token_generator +from django.contrib.auth.forms import PasswordResetForm +from django.contrib.auth.views import LoginView from django.contrib.contenttypes.models import ContentType -from django.shortcuts import render, get_list_or_404 -from django.urls import reverse_lazy +from django.http import HttpResponseRedirect +from django.shortcuts import render, get_list_or_404, redirect +from django.urls import reverse_lazy, reverse from django.views.generic import FormView +from zenpy import Zenpy from access_controller.settings import EMAIL_HOST_USER from main.extra_func import check_user_exist, update_profile, get_user_organization, \ @@ -17,13 +17,14 @@ from main.extra_func import check_user_exist, update_profile, get_user_organizat from django.contrib.auth.models import User, Permission from main.models import UserProfile -from main.forms import CustomRegistrationForm, AdminPageUsers +from main.forms import CustomRegistrationForm, AdminPageUsers, CustomAuthenticationForm from django_registration.views import RegistrationView from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin from django.core.exceptions import PermissionDenied -from access_controller.settings ZENDESK_ROLES +from access_controller.settings import ZENDESK_ROLES +from zenpy.lib.api_objects import User as ZenpyUser class CustomRegistrationView(RegistrationView): From 656081295ee723b9e734e187129f0337e4bbefcc Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Thu, 4 Mar 2021 20:01:10 +0300 Subject: [PATCH 5/8] Profile view page refactoring --- main/templates/pages/profile.html | 27 ++++++++++++--------------- main/views.py | 14 +++++--------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/main/templates/pages/profile.html b/main/templates/pages/profile.html index 6c6ecd2..a0f21f9 100644 --- a/main/templates/pages/profile.html +++ b/main/templates/pages/profile.html @@ -10,17 +10,14 @@ {% block extra_css %} - + {% endblock %} {% block content %} @@ -28,24 +25,24 @@
- {% if image_url %} - Аватар - {% else %} - Нет изображения - {% endif %} + Нет изображения
-
Имя пользователя {{name}}
+
Имя пользователя {{ profile.name }}

-
Электронная почта {{email}}
+
Электронная почта {{ profile.user.email }}

-
Текущая роль {{role}}
+
Текущая роль {{ profile.role }}
{% endblock %} diff --git a/main/views.py b/main/views.py index 5c5ed12..b5d953a 100644 --- a/main/views.py +++ b/main/views.py @@ -5,7 +5,8 @@ from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.forms import PasswordResetForm from django.contrib.auth.views import LoginView from django.contrib.contenttypes.models import ContentType -from django.http import HttpResponseRedirect +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.urls import reverse_lazy, reverse from django.views.generic import FormView @@ -95,19 +96,14 @@ class CustomRegistrationView(RegistrationView): @login_required() -def profile_page(request: UserProfile) -> UserProfile: +def profile_page(request: WSGIRequest) -> HttpResponse: """ Отображение страницы профиля """ - user_profile = request.user.userprofile + user_profile: UserProfile = request.user.userprofile update_profile(user_profile) - context = { - 'email': user_profile.user.email, - 'name': user_profile.name, - 'role': user_profile.role, - 'id': user_profile.id, - 'image_url': user_profile.image, + 'profile': user_profile, 'pagename': 'Страница профиля' } return render(request, 'pages/profile.html', context) From 9ddf1db2a3c4d6e658bc88e84adc63b75eb8c257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B0=D0=BA=D0=BE=D0=B2=20=D0=AE=D1=80?= =?UTF-8?q?=D0=B8=D0=B9?= Date: Thu, 4 Mar 2021 20:45:55 +0300 Subject: [PATCH 6/8] Fixed bug with permissions --- access_controller/urls.py | 6 +----- main/views.py | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/access_controller/urls.py b/access_controller/urls.py index 45d815b..3595e4f 100644 --- a/access_controller/urls.py +++ b/access_controller/urls.py @@ -14,13 +14,9 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.contrib.auth.forms import AuthenticationForm -from django.contrib.auth.views import LoginView from django.contrib.auth import views as auth_views from django.urls import path, include -from access_controller import settings -from access_controller.settings import DEBUG -from main.views import main_page, profile_page, CustomRegistrationView, work_page, work_hand_over, work_become_engineer, AdminPageView +from main.views import work_page, work_hand_over, work_become_engineer, AdminPageView from main.views import main_page, profile_page, CustomRegistrationView, CustomLoginView diff --git a/main/views.py b/main/views.py index 5c5ed12..7486d69 100644 --- a/main/views.py +++ b/main/views.py @@ -27,6 +27,13 @@ from access_controller.settings import ZENDESK_ROLES from zenpy.lib.api_objects import User as ZenpyUser +content_type_temp = ContentType.objects.get_for_model(UserProfile) +permission_temp, created = Permission.objects.get_or_create( + codename='has_control_access', + content_type=content_type_temp, +) + + class CustomRegistrationView(RegistrationView): """ Отображение и логика работы страницы регистрации пользователя @@ -74,13 +81,12 @@ class CustomRegistrationView(RegistrationView): """ Дает разрешение на просмотр страница администратора, если пользователь имеет роль admin """ - - content_type = ContentType.objects.get_for_model(UserProfile) - permission, created = Permission.objects.get_or_create( - codename='has_control_access', - content_type=content_type, - ) if user.userprofile.role == 'admin': + content_type = ContentType.objects.get_for_model(UserProfile) + permission = Permission.objects.get( + codename='has_control_access', + content_type=content_type, + ) user.user_permissions.add(permission) def get_success_url(self, user: User = None) -> success_url: @@ -167,7 +173,7 @@ def main_page(request): return render(request, 'pages/index.html') -class AdminPageView(FormView, LoginRequiredMixin, PermissionRequiredMixin): +class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): permission_required = 'main.has_control_access' template_name = 'pages/adm_ruleset.html' form_class = AdminPageUsers @@ -192,7 +198,7 @@ class AdminPageView(FormView, LoginRequiredMixin, PermissionRequiredMixin): [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: + def count_users(users) -> tuple: #.. todolist:: :this func counts users from all zendesk instead of just from a model: """ Функция подсчета количества сотрудников с ролями engineer и light_a """ @@ -204,7 +210,7 @@ class AdminPageView(FormView, LoginRequiredMixin, PermissionRequiredMixin): light_agents += 1 return engineers, light_agents - def get_context_data(self, **kwargs) -> list: + def get_context_data(self, **kwargs) -> dict: """ Функция формирования контента страницы администратора (с проверкой прав доступа) """ From 1d7ff524b0bd65dcf82ff0ae18da011f978cc323 Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Thu, 4 Mar 2021 20:54:45 +0300 Subject: [PATCH 7/8] Documentation fix Add enchant, remove intersphinx useless links, remove napoleon, fix todos --- docs/source/conf.py | 30 +++++++++++++----------------- main/extra_func.py | 5 ++++- main/models.py | 10 ++-------- main/views.py | 5 ++++- requirements.txt | 4 ++-- 5 files changed, 25 insertions(+), 29 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index fdcc4e4..c9efe47 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -14,21 +14,26 @@ import os import sys import importlib import inspect + sys.path.insert(0, os.path.abspath('../../')) import django + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'access_controller.settings') os.environ.setdefault('DJANGO_CONFIGURATION', 'Dev') # Fix Django's FileFields from django.db.models.fields.files import FileDescriptor -FileDescriptor.__get__ = lambda self, *args, **kwargs: self -from django.db.models.manager import ManagerDescriptor -ManagerDescriptor.__get__ = lambda self, *args, **kwargs: self.manager +FileDescriptor.__get__ = lambda self, *args, **kwargs: self + +from django.db.models.manager import ManagerDescriptor + +ManagerDescriptor.__get__ = lambda self, *args, **kwargs: self.manager # Stop Django from executing DB queries from django.db.models.query import QuerySet + QuerySet.__repr__ = lambda self: self.__class__.__name__ try: import enchant # NoQA @@ -46,7 +51,8 @@ author = 'SHP S101, group 2' # The full version, including alpha/beta/rc tags release = 'v0.01' -#Django sphinx setup by https://gist.github.com/codingjoe/314bda5a07ff3b41f247 + +# Django sphinx setup by https://gist.github.com/codingjoe/314bda5a07ff3b41f247 # -- General configuration --------------------------------------------------- @@ -121,7 +127,6 @@ def setup(app): app.connect('autodoc-process-docstring', process_modules) - # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. @@ -132,7 +137,6 @@ extensions = [ 'sphinx.ext.viewcode', 'sphinx_rtd_theme', 'sphinx.ext.graphviz', - 'sphinx.ext.napoleon', 'sphinx.ext.inheritance_diagram', 'sphinx_autodoc_typehints' @@ -141,7 +145,6 @@ extensions = [ if enchant is not None: extensions.append('sphinxcontrib.spelling') - # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -157,7 +160,6 @@ language = 'ru' # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] - # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for @@ -170,7 +172,6 @@ html_theme = "sphinx_rtd_theme" # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] - # -- Extension configuration ------------------------------------------------- # -- Options for intersphinx extension --------------------------------------- @@ -179,14 +180,9 @@ html_static_path = ['_static'] intersphinx_mapping = { 'https://docs.python.org/3/': None, 'django': ( - 'https://docs.djangoproject.com/en/dev/', - 'https://docs.djangoproject.com/en/dev/_objects/' - ), - 'djangoextensions': ('https://django-extensions.readthedocs.org/en/latest/', None), - 'geoposition': ('https://django-geoposition.readthedocs.org/en/latest/', None), - 'braces': ('https://django-braces.readthedocs.org/en/latest/', None), - 'select2': ('https://django-select2.readthedocs.org/en/latest/', None), - 'celery': ('https://celery.readthedocs.org/en/latest/', None), + 'https://docs.djangoproject.com/en/dev/', + 'https://docs.djangoproject.com/en/dev/_objects/' + ), } autodoc_default_flags = ['members'] diff --git a/main/extra_func.py b/main/extra_func.py index 6227bf1..691bd37 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -74,7 +74,10 @@ class ZendeskAdmin: def get_user(self, email: str) -> str: """ - Функция **get_user** возвращает пользователя (объект) по его email + Функция **get_user** возвращает пользователя (объект) по его email + + :param email: email пользователя + :return: email пользователя, найденного в БД """ return self.admin.users.search(email).values[0] diff --git a/main/models.py b/main/models.py index 8665570..f8f8385 100644 --- a/main/models.py +++ b/main/models.py @@ -5,10 +5,7 @@ from django.dispatch import receiver class UserProfile(models.Model): - """ - Модель профиля пользователя - - """ + """Модель профиля пользователя""" user = models.OneToOneField(to=User, on_delete=models.CASCADE, help_text='Пользователь') role = models.CharField(default='None', max_length=100, help_text='Код роли пользователя') @@ -28,10 +25,7 @@ def save_user_profile(sender, instance, **kwargs): class RoleChangeLogs(models.Model): - """ - Модель для логирования изменений ролей пользователя - - """ + """Модель для логирования изменений ролей пользователя""" user = models.ForeignKey(to=User, on_delete=models.CASCADE, help_text='Пользователь, которому присвоили другую роль') name = models.TextField(help_text='Имя пользователя') new_role = models.TextField(help_text='Присвоенная роль') diff --git a/main/views.py b/main/views.py index b5d953a..0e6aa41 100644 --- a/main/views.py +++ b/main/views.py @@ -188,9 +188,12 @@ class AdminPageView(FormView, LoginRequiredMixin, PermissionRequiredMixin): [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: + def count_users(users: User) -> int: """ Функция подсчета количества сотрудников с ролями engineer и light_a + + .. todo:: + this func counts users from all zendesk instead of just from a model: """ engineers, light_agents = 0, 0 for user in users: diff --git a/requirements.txt b/requirements.txt index 826cc73..7a4f941 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,9 +4,9 @@ Pillow==8.1.0 zenpy~=2.0.24 django_registration==3.1.1 - # Documentation Sphinx==3.4.3 sphinx-rtd-theme==0.5.1 sphinx-autodoc-typehints==1.11.1 - +pyenchant==3.2.0 +sphinxcontrib-spelling==7.1.0 From 5909750fcc0e71f88ed388b8ecab9a4016566e41 Mon Sep 17 00:00:00 2001 From: Andrew Smirnov Date: Thu, 4 Mar 2021 20:56:38 +0300 Subject: [PATCH 8/8] Remove todolist commant --- main/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/views.py b/main/views.py index 5343906..ca8c9c2 100644 --- a/main/views.py +++ b/main/views.py @@ -194,7 +194,7 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): [make_light_agent(user) for user in users] @staticmethod - def count_users(users) -> tuple: #.. todolist:: :this func counts users from all zendesk instead of just from a model: + def count_users(users) -> tuple: """ Функция подсчета количества сотрудников с ролями engineer и light_a