Доброго дня! Меня зовут Антон, я работаю инженером, в отделе технического обслуживания и администрирования. Языки программирования начал изучать совсем недавно, хотя всегда очень хотелось.
С чего всё началось.
История началась примерно полтора года назад. Блуждая по просторам сети, наткнулся на какой-то курс по программированию (на самом деле достаточно известный), подумал, что давно хотел мигрировать из поддержки в разработчики и записался на пробную часть. Курс был по программированию на Python. Достаточно быстро прошёл вводную часть, научился некоторым азам и понял, что это интересно. Дальше решил уже самостоятельно, с помощью материалов из сети, совершенствовать свои навыки.
Первое что пришло в голову, написать десктопную программу для мониторинга IP-видеокамер. Логика была следующая, если ping до камеры есть, то всё хорошо, если иначе – что-то пошло не так и нужно оповестить об этом специально обученного человека (для оперативности, желательно в Telegram). Задача простая, но полезная для обучающегося программиста. В основу лёг фреймворк PyQt5. Пришлось конечно немного помучатся с мультипроцессингом и зависанием приложения, но итоге приложение было написано и передано в пользование специалисту по видеонаблюдению. Он был рад и пользуется приложением до сих пор. Проект закончен, но хочется дальше развиваться и чем-то помочь коллегам. Вот тут-то и пришла в голову мысль, написать свой Helpdesk.
Проблема и идея
В нашем управлении ИТ работает всего 10 человек – это отдел технического обслуживания, отдел разработки и участок связи. Все, в какой-то степени, занимаются технической поддержкой пользователей. На тот момент все заявки приходили, либо по электронной почте, либо по телефону. Мне показалось что это жутко не удобно и плохо контролируемо:
не было чёткого представления о текущих задачах
о многих заявках можно было попросту забыть
для пользователей не очень понятно в каком состоянии их заявка сейчас
нет никакой очерёдности выполнения, всё по принципу, «кто успел, того и тапки»
нет оперативного уведомления о новых заявках, в следствии чего постоянно разрывающийся телефон, от звонков пользователей
Ранее, у меня уже был опыт использования Helpdesk систем, на базе:
Microsoft SharePoint 2007
OTRS
Первый проработал не долго, в связи с неудобством и отсутствием человека, который бы занимался его поддержкой. Второй, был поднят и настроен мной, но руководство по каким-то причинам, так его и не внедрили. Попытка номер 3, подумал я, и преступил к проектированию, своего helpdesk’a.
Проектирование Helpdesk
Итак, исходные данные:
В организации примерно 500 пользователей, в планах, что все они будут пользоваться helpdesk’ом
10 сотрудников, в 3 отделах, которые также будут использовать helpdesk в работе
Все пользователи делятся на группы, по компаниям и входят в один домен (Active Directory)
Для пользователей системы нужны уведомления по email (для сотрудников ещё в Telegram)
Система будет использоваться только внутри предприятия
Начал с базо��ой схемы:

То есть сервис, как минимум, должен иметь:
сквозную авторизацию через контроллер домена, форму заявки,
интерфейс пользователя,
интерфейс сотрудника,
уметь уведомлять о новых заявках и о результате их выполнения,
формировать отчёты по заявкам, за определённый период времени, с группировкой по компаниям, отделам, работникам и т.д. И выгружать это, например, в Excel.
Так как я начал изучать Python, было решено делать это всё на Django. Первым делом начал искать и изучать подобные системы, и что они в себя включают. Получилась примерно такая структура:

Вперёд к знаниям
Согласно схеме БД:
Пользователь имеет основной профиль и дополнительный
Каждая заявка привязана к пользователю
К заявке можно оставлять комментарии
К заявке можно прикрепить файл
Каждый пользователь имеет доступ к уведомлениям о своих заявках
На основе этого, были созданы соответствующие модели и проведены миграции.
Авторизация
Так как все пользователи на предприятии работают на компьютерах, находящихся в домене и авторизуются на компьютерах с помощью Active Directory, то и на helpdesk’e авторизация должна быть через Active Directory. Причём это должно происходить без участия пользователя. То есть, если пользователь вошёл на компьютер под своей учётной записью, то при открыт��и helpdesk’a он автоматически авторизуется.
Начитавший информации в интернете приступил за дело. Для такого функционала мне понадобился:
Nginx, собранный с модулем SPNEGO
дополнительные библиотеки для Django – django-auth-ldap и django-remote-auth-ldap
Ещё хотелось, чтобы информация о пользователях хранящаяся в Active Directory (компания, подразделение, телефон и т.д.) автоматически подтягивалась в профиль пользователя. К счастью это, достаточно просто получилось реализовать с помощью тех же средств и сигналов Django.
Как это всё настроить есть информация в Интернете. У меня это работает так:
Пользователь заходит на сайт
Nginx авторизует его, и передает параметр REMOTE_USER в Django
Если такого пользователя ещё нет, Django, с помощью django-auth-ldap, создаёт новую учётную запись. Если есть, проверяет соответствие данных в учетной записи и в Active Directory и обновляет их.
Как итог, пользователи попадают на helpdesk уже авторизованными.
Создание заявки
Следующим этапом было, непосредственно само создание заявки. Начал с создания формы заявки. Она должна быть достаточно простая и легко понимаемая для пользователя. Остановился на такой форме заявки:

Заявитель, подразделение и телефон автоматически подтягиваются из профиля пользователя (если там есть такая информация). Пользователю остаётся лишь выбрать категорию, добавить описание, если нужно, приложить файлы. По моему мнению, получилось достаточно просто и понятно.
Список всех заявок
Список всех заявок решил сделать в виде таблицы с некоторыми фильтрами.

Так выглядит интерфейс всех заявок в кабинете пользователя. Пользователь видит только заявки, созданные непосредственно им.
В кабинете сотрудника, таблица выглядит немного иначе, чуть больше информации.

Сотрудники видят только те заявки, которые предназначены их отделу. Это значит, что, сотрудник из отдела разработки увидит только заявки, отправленные в категорию «Отдел разработки».
Так же есть группа для руководителей, они видят заявки всех категорий. И если пользователь, ��лучайно отправил заявку не в тот отдел, руководитель может её скорректировать.

Редактирование заявки
Редактирование заявки было решено выводить с помощью модального окна, в виде обычных форм.

Для сотрудников и руководителей форма более содержательная и с большими правами на редактирование:

Уведомления
При создании (изменении) заявки необходимо было отправлять уведомления, сотрудникам соответствующих отделов и пользователям, на электронную почту. В зависимости от категории заявки, уведомление отправляется только определённой группе сотрудников.
Для уведомления по эл. почте использовалась стандартная библиотека send_mail. Иногда происходило подвисание интерфейса, при каких-либо действиях с заявкой. Пришлось покопаться и как позже выяснилось, это происходит из-за долгого ответа почтового сервера. Пришлось искать выход, и он был найден в лице Celery. Настроил Celery таким образом, чтобы он создавал таски на отправку и формировал очередь. Это позволило не подвисать интерфейсу при долгом ответе почтового сервера и работать более стабильно.
Для большей оперативности, для сотрудников было реализовано уведомление в Telegram с помощью библиотеки pyTelegramBotAPI. Пример уведомления ниже:

Как только происходят изменения c заявкой, backend даёт команду боту отправить уведомление в соответствующую отделу группу в Telegram. Группы в Telegram для соответствующих отделов, были созданы предварительно.
Отчёты по заявкам
Для отчётов по заявкам была выделена отдельная страница с формой:

После выбора параметров генерируется отчёт, который можно скачать в формате Excel. Доступ к отчётам доступен только руководителям подразделений.
Введение в работу
По завершению работы, насколько смог протестировал систему. Коллегам тоже пришлось поработать в качестве тестировщиков. Все баги, которые нашли, я как порядочный разработчик старался исправить.
С помощью групповых политик раскидал ярлык Helpdesk’a на рабочие столы пользователей и написал инструкцию «Как пользоваться Helpdesk’ом»
Старт Helpdesk’a был назначен. В назначенный день всем по электронной почте разослали инструкцию. С тех пор система заявок работает. Сначала пользователи по привычке пытались оставлять заявки по телефону и по электронной почте, но со временем почти все привыкли и стали использовать Helpdesk.
Заключение
На этом первая часть Pet-проекта для обучения, была закончена. Система Helpdesk получилась вполне рабочая, люди ей пользуются, многим это даже нравится. Я же немного продвинулся в сторону разработки и это радует.
Пишу в первый раз, поэтому не судите строго.
P.S. Спустя почти год после запуска уже многое было переделано, изменено и добавлено. Сейчас используется уже такой стек технологий:
Nginx - в роли обратного прокси сервера, с SSO авторизацией в Active Directory,
Django (DRF) – backend с LDAP авторизацией,
Django Channels – для работы с WebSocket,
Celery - для очереди заданий,
Redis,
PostgreSQL,
React (React Redux) – в качестве frontend’a,
Docker (Docker-compose) - для сборки всего вышеперечисленного.
UPD: Исправил схему БД, надеюсь сейчас правильно составлена )
