diff --git a/docs/source/conf.py b/docs/source/conf.py index 25cd641..972970b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -37,10 +37,7 @@ ManagerDescriptor.__get__ = lambda self, *args, **kwargs: self.manager from django.db.models.query import QuerySet QuerySet.__repr__ = lambda self: self.__class__.__name__ -# try: -# import enchant # NoQA -# except ImportError: -# enchant = None + django.setup() @@ -117,17 +114,12 @@ def skip_queryset(app, what, name, obj, skip, options): return True return skip -def process_signature(app, what, name, obj, options, signature, return_annotation): - return None - def setup(app): # Register the docstring processor with sphinx app.connect('autodoc-process-docstring', process_django_models) app.connect('autodoc-skip-member', skip_queryset) - if enchant is not None: - app.connect('autodoc-process-docstring', process_modules) - app.connect('autodoc-process-signature', process_signature) + app.connect('autodoc-process-docstring', process_modules) @@ -191,6 +183,7 @@ intersphinx_mapping = { autodoc_default_flags = ['members'] # spell checking +print(enchant.list_languages()) spelling_lang = 'ru_RU' tokenizer_lang = 'ru_RU' spelling_word_list_filename = ['spelling_wordlist.txt', 'another_list.txt'] @@ -209,7 +202,6 @@ spelling_ignore_contributor_names=True # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True - set_type_checking_flag = True typehints_fully_qualified = True always_document_param_types = True diff --git a/main/extra_func.py b/main/extra_func.py index 627a93c..8433730 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -242,13 +242,10 @@ def get_timedelta(log: RoleChangeLogs, time=None) -> timedelta: return time -def last_day_of_month(day): +def last_day_of_month(day: int) -> int: """ Функция возвращает последний день текущего месяца. - .. todo:: - Дописать документацию по данной функции (не поняла типы и суть) - :param day: Текущий день :return: Последний день месяца """ @@ -259,10 +256,26 @@ def last_day_of_month(day): class StatisticData: """ Класс для учета статистики интервалов работы пользователей. - Передаваемые параметры: start_date, end_date, user_email. + Передаваемые параметры: start_date, end_date, user_email, stat. - .. todo:: - Дописать описание данного класса + :param display: Формат отображения времени (часы, минуты) + :type display: :class:`list` + :param interval: Инетрвал времени в часах и минутах + :type interval: :class:`list` + :param start_date: Дата начала работы + :type start_date: :class:`date` + :param end_date: Дата окончания работы + :type end_date: :class:`date` + :param email: Email пользователя + :type email: :class:`str` + :param errors: Список ошибок + :type errors: :class:`list` + :param warnings: Список предупрежденй + :type warnings: :class:`list` + :param data: Ретроспектива смены ролей пользователя + :type data: :class:`dict` + :param statistic: Интервалы работы пользователя + :type statistic: :class:`dict` """ def __init__(self, start_date, end_date, user_email, stat=None): self.display = None @@ -362,12 +375,12 @@ class StatisticData: new_stat[key] = item / (ONE_DAY * 3600) return new_stat - def _use_interval(self, stat): + def _use_interval(self, stat: dict) -> dict: """ Функция объединяет ключи и значения в соответствии с интервалом работы. - :param stat: - :return: + :param stat: Статистика работы пользователя + :return: Обновленная статистика """ if not self.is_valid_statistic() or not self.interval: return stat @@ -386,19 +399,21 @@ class StatisticData: new_stat = stat # статистика изначально в днях return new_stat - def check_time(self): + def check_time(self) -> bool: """ - Проверка на правильность введенного времени + Функция проверяет корректность введенного времени. + + :return: True, если время указано корректно. Иначе, False """ if self.end_date < self.start_date or self.end_date > datetime.now().date(): return False return True - def _set_data(self): + def _set_data(self) -> dict: """ Функция возвращает логи в диапазоне дат start_date-end_date для пользователя с указанным email. - :return: + :return: Данные о смене статусов пользователя. Если пользователь не найден или интервал времени некорректен - ошибку. """ if not self.check_time(): self.errors += ['Конец диапазона должен быть позже начала диапазона и раньше текущего времени'] @@ -411,11 +426,11 @@ class StatisticData: except User.DoesNotExist: self.errors += ['Пользователь не найден'] - def _set_statistic(self): + def _set_statistic(self) -> dict: """ Функция заполняет словарь, в котором ключ - дата, значение - кол-во проработанных в этот день секунд. - :return: + :return: Статистика работы пользователя (statistic) """ self.clear_statistic() if not self.get_data(): @@ -445,22 +460,23 @@ class StatisticData: elapsed_time = next_log.change_time - current_log.change_time self.statistic[current_log.change_time.date()] += elapsed_time.total_seconds() - def fill_daterange(self, first, last, val=24 * 3600): + def fill_daterange(self, first: date, last: date, val: int = 24 * 3600) -> dict: """ Функция заполеняет диапазон дат значением val (по умолчанию val = кол-во секунд в 1 дне). - :param first: - :param last: - :param val: - :return: + :param first: Начальная дата интервала + :param last: Последняя дата интервала + :param val: Количество секунд в одном дне + :return: Статистику пользоваиеля с указанным количеством секунд в заданных днях """ for day in daterange(first, last): self.statistic[day] = val - def clear_statistic(self): + def clear_statistic(self) -> dict: """ - Функция осуществляет обновление всех дней - :return: + Функция осуществляет обновление всех дней. + + :return: Статистику пользователя с количеством рабочих секунд = 0 """ self.statistic.clear() self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0) diff --git a/main/views.py b/main/views.py index 570866b..9ed7e6e 100644 --- a/main/views.py +++ b/main/views.py @@ -229,9 +229,14 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): """ Класс отображения страницы администратора. - .. todo:: - Документация для данного класса: - + :param permission_required: Права доступа к странице администратора + :type permission_required: :class:`str` + :param template_name: HTML-шаблон страницы администратора + :type template_name: :class:`str` + :param form_class: Форма страницы администратора + :type form_class: :class:`forms.AdminPageUsersForm` + :param success_url: Адрес страницы администратора + :type success_url: :class:`HttpResponseRedirect` """ permission_required = 'main.has_control_access' template_name = 'pages/adm_ruleset.html' @@ -240,7 +245,10 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): def form_valid(self, form: AdminPageUsers) -> AdminPageUsers: """ - Функция установки ролей пользователям + Функция обновления страницы AdminPageUsers. + + :param form: Форма страницы администратора + :return: Обновленная страница (пользователям проставлены новые статусы) """ if 'engineer' in self.request.POST: self.make_engineers(form.cleaned_data['users']) @@ -250,19 +258,31 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): @staticmethod def make_engineers(users): + """ + Функция проходит по списку пользователей, проставляя статус "engineer". + + :param users: Список пользователей + :return: Обновленный список пользователей + """ [make_engineer(user) for user in users] @staticmethod def make_light_agents(users): + """ + Функция проходит по списку пользователей, проставляя статус "light_agent". + + :param users: Список пользователей + :return: Обновленный список пользователей + """ [make_light_agent(user) for user in users] @staticmethod def count_users(users) -> tuple: """ - Функция подсчета количества сотрудников с ролями "engineer" и "light_agent". + Функция подсчета количества сотрудников с ролями "engineer" и "light_agent". - .. todo:: - this func counts users from all zendesk instead of just from a model: + .. todo:: + this func counts users from all zendesk instead of just from a model: """ engineers, light_agents = 0, 0 for user in users: