Каталог компании в питоне

Каталог компании в питоне ТЭК

Всем здравствуйте. Начну с истории.

Устроился я на работу техником(в тех отдел), через какое-то время ковыряться с компами поднадоело и поговорив с начальником мне предложили заняться разработкой. Опыт верстки и программирования на php был. Первой задачей была «сделать телефонный справочник», погуглив я не нашел готовых решений, тогда начальник предложил WordPress. Ну не долго думая поставил на наш сервер WP, начал пробовать сделать и понял, что все как-то не так.

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

Во-вторых вп подключает в шаблон то, что мне не нужно, а переверстывать желание небыло.

В-третьих скорость работы, нужно было быстро выдавать информацию, записей в бд больше 3к и почему-то WP справлялся с этим крайне долго.

Начав искать новые варианты я наткнулся на node.js, и подумал «а почему бы не написать все самому». К тому же идея управлять бекэндом и фронтом при помощи одного языка мне очень нравилась.

Сказано — сделано, начал учить и сразу писать. Было много трудностей, куча камней и т.д, к тому же начальник уже стучал по голове со словами «ну когда уже». Ну пришлось «поговнокодить» т.к это изрядно ускоряло процесс.

В общем справочник был сдан, была куча правок, куча переделок но все готово и работает. Только вот «говнокод» не давал мне спать по ночам, я просыпался в поту думая о том, что можно было все сделать не идеально но гораздо лучше.

В общем, я созрел и решил сделать еще один справочник, по функционалу проще но все еще удобный для юзера. Справочник я запланировал выложить в общий доступ.

Во-первых это опыт.

Во-вторых я люблю заниматься подобным.

В-третьих мне хочется услышать критику и исправить его недостатки т.к сам я ввиду отсутствия опыта просто их могу не заметить.

В-четвертых хочется помочь людям которым тоже понадобиться такая штука.

Каталог компании в питоне

Тут присутствую 2 группы кнопок

Для удобства понимания на данный момент используется в качестве кнопок branch(отделение) и floor(Этаж), но в целом можно задать все что угодно.

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

Так же есть поиск в 2 режимах. Поиск по все базе вне зависимости от выбранного отделения, и поиск внутри выбранного отделения.

Предельно простой функционал для пользователя.

Если кто-то будет пользоваться этим справочником то доступ

Меняется в файле passport.js

Тут перед нами разворачивается 2 кнопки.

Первая — просто добавление кнопок и людей.

Каталог компании в питоне

Вторая более запутанная для настройки связей и удаления записей.

Каталог компании в питоне

Первым делом на кнопки Edit вас встретит поиск, при помощи него вы ищите человека с которым хотите делать манипуляции.

Каталог компании в питоне

Вторая кнопка Assign all. В ней вы настраиваете связи групп кнопок. Т.е в данном случае какие этажи должны быть в отделениях.  Тут же и удаляется эта связь.

Каталог компании в питоне

Следующая кнопка Edit button, тут вы переименовываете кнопки.

Каталог компании в питоне

Теперь заглянем в кнопку Edit у конкретной записи. Тут можно отредактировать данные либо удалить запись.

Каталог компании в питоне

Последняя кнопка assign, она предназначена для  того, что бы настроить связи у записи.

Для начала обратим внимание на поле link main — тут вы указываете какому отделению принадлежит этот контакт, таких полей 2. В Одном вы можете порвать связь, во втором вы добавляете новую.

В поле link main data вы указываете этаж у связки записей «отделение-контакт». В поле link second вы можете порвать эту связь.

Т.е последовательность добавления такая

На вкладке add добавляем кнопки и записи, идем в edit, жмем Assign all и настраиваем этажи для отделений. Затем ищем запись, жмем assign у нужной и присваиваем ее к отделению, затем указываем на каком этаже внутри этого отделения нужно выводить запись.

Админка получилась запутанная но все же все достаточно просто.

Я понимаю, что скорее всего это Сизифов труд т.к в компаниях редко ведут актуальный справочник но нам понадобился.

В общем я открыт для критики и советам

Код справочника https://github.com/ura2rist/Open-Phone-Book

Корпоративный телефонный справочник с картой +28

JavaScript, HTML, PHP, MySQL, Ajax

Рекомендация: подборка платных и бесплатных курсов Java — https://katalog-kursov.ru/

Всем привет! Хочу поделиться корпоративным телефонным справочником с картой офиса. Удобен для ориентирования в большой организации. Особенно будет полезен новым сотрудникам, которые еще не запомнили кто из коллег где сидит.

Источником контактов для справочника служит Active Directory, контакты из которой импортируются в базу MySQL, в дальнейшем справочик оперирует с базой MySQL.

Внутри справочника контакты делятся на два типа:

  • Импортированные из AD
  • Локальные

Импортированные контакты нельзя редактировать, их можно только скрывать из списка и указывать расположение на карте. Все изменения нужно производить в AD, после чего провести повторную синхронизацию, при которой будут добавлены новые и обновлены существующие записи.

  • Импорт контактов и фото из AD
  • Показать/скрыть любой контакт
  • Добавлять, редактировать и удалять локальные контакты
  • Указать расположение сотрудника на схеме офиса

Поиск сотрудника на карте:

P.S. Интересно услышать замечания и подсказки по улучшению дизайна и кода

UPD: Спасибо за наполнение справочника после его полной очистки неизвестным! Было очень неприятно увидеть его пустым, когда набивал справочник вручную с телефона в транспорте.

Удобное представление информации по сотруднику: полное ФИО, должность, дата рождения, контакты и состояние сотрудника (работает, в отпуске или болеет, когда и на сколько собирается отпуск или когда запланировал). Рекомендуется работать через WEB интерфейс

1. Развертывание и автозапуск.

2. Поиск по введенному тексту и функция API speller.

3. Кнопки настройки

4. API и cookie

5. Карточка сотрудника и фото сотрудника

Требуется поднять ВЭБ сервер (я использую Apache, быстро и бесплатно) и опубликовать данную систему.

Система тестировалась на платформе 1С:Предприятие 8.3.11.2867.

При публикации системы на вэб-сервере, не забываем проставить галки Публиковать Web-сервисы по умолчанию и Публиковать Web-сервисы, и галку Table.

Система стартует с условием:

1. Если нет избранных контактов, то ищет контакт с должностью «Генеральный директор», либо «Главный бухгалтер», либо «Бухгалтер». И фильтрует по полученному подразделению сотрудника.

2. Если есть избранные контакты, то выводит список избранных.

Каталог компании в питоне

Если же в поле поиска введен текст в отличной раскладке, система попытается произвести поиск по введенному тексту, если же ничего не найдено, то будет произведена замена раскладки введенного текста и заново произведен поиск. Если после этого будет что-то найдено, в шапке будет описание смены раскладки:

Каталог компании в питоне

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

Про торги:  Fwi полноволновая инверсия

Каталог компании в питоне

Для данной функции используется API speller от Яндекса.

В шапке имеются кнопки Группировать по подразделениям, Подчиненные подразделения, Колонки и Обновить.

Разберем по отдельности:

1. При нажатии на Группировать по подразделениям все выводимые данные в таблице превратятся в иерархический вид:

Каталог компании в питоне

В данном виде, иерархия последовательна по вложению. Некоторым пользователям такой вид более удобен, для чего собственно и было добавлено.

2. При нажатии на кнопку Подчиненные подразделения, в результатах поиска, будут присутствовать также и починенные подразделения:

Каталог компании в питоне

3. Кнопка Колонки дает возможность выбора выводимых колонок. Не всегда, и не всем нужна вся информация по сотрудникам. Кому-то требуется видеть только контакты, и более ничего:

Каталог компании в питоне

Как видим, колонка Состояние исчезло. Настройка также сохраняется в системе, и в последующих входах в систему, будет найдена существующая настройка.

4. Кнопка Обновить обновляет таблицу данными. Так как данная система работает на виртуальной таблице, которая формируется при старте системы, то все проделанные изменения в данных при запущенной системе, отображены не будут. Для этого требуется обновить данные.

Также имеется возможность распечатать таблицу, нажав на значок сверху слева над таблицей.

При отжатой кнопки Группировать по подразделениям можно сортировать колонки, нажимая мышью по шапке.

В группе Информация содержатся отборы по тематикам:

2. Весь справочник

3. На больничном

4. Собираются в отпуск

5. В отпуске

6. Отпуск по графику (данный пункт имеет список месяцев для отбора)

7. Дни рождения (данный пункт имеет список месяцев для отбора)

При нажатии на каждый пункт, производится поиск сотрудников.

Также в системе имеется api для обновления данных со сторонней системы, например учетной 1С.

Используется get-запрос с одним параметром text, например:

В примере приведен пример текста XML для теста, для корректности проверки данного функционала. Функция WSПрокси.apibase(ТекстПараметр) возвращает ответ при корректности выполнения «ОК», при ошибке «ERROR».

Параметр referencegroup имеет 2 значения, «0» или «1», 0 — элемент; 1 — группа.

Формат записи параметра schedule, например: schedule=»2_06_2020_14″ — означает, что сотрудник планирует в отпуск в середине июня 2020г. на 14 дней.

Если же несколько плановых отпусков, то записываем через «;», например: «2_06_2020_14;4_08_2020_10»

Первый параметр: 1 — начало месяца, 2 — середина месяца, 3 — конец месяца, 4 — просто в указанном месяце (например: 4_06_2020_14 — в июне 2020г. на 14 дней).

Второй параметр: цифра месяца, в формате «ММ», например: 06 или 10 и т.п.

Третий параметр: год, в формате «гггг».

Четвертый параметр: дней отпуска, число.

Если система развернута через WEB, и в файле default.vrd прописано входить всем под одним пользователем, то нужно как-то разграничивать сохраненные настройки, например: избранных, использование Группировки подразделений, использование Подчиненных подразделений или настройку колонок. Для этого браузер хранит cookie: дату и время первого запуска в миллисекундах, которое используется в качестве идентификатора. При входе через тонкий клиент, в качестве идентификатора используется имя пользователя.

В карточке сотрудника описан каждый параметр XML.

Каталог компании в питоне

Описание полей в XML таблицы Фактический отпуск / болезнь

Если сотрудник в данный момент или собирается в отпуск или болеет, например:

Дата начала и Дата окончания (при болезни в текущий момент, дата окончания пустая) и Причина

Если Дата начала больше текущей даты, то система распознает состояние как Собирается в отпуск, если Дата начала меньше или равна, а Дата окончания больше или равна текущей дате, то состояние В отпуске.

Формат причины: Текст (в поле Причина имеется список вариантов), варианты причин можно передавать со своей базы любые! Это текстовое поле.

НО! чтобы система корректно распознавала отборы:

1) На больничном: в состоянии должно быть слово «болеет» или «больным», например «Болеет» или «Уход за больным ребенком»

2) В отпуске: в состоянии должно быть слово «отпуск», например: «Ежегодный отпуск», «В отпуске по уходу за ребенком», «Отпуск по беременности и родам» и т.п.

В качестве фотографии сотрудника, при обновлении с помощью XML передаем через параметр base64photo. Также можно вручную выбрать фото сотруднику в регистре Фото сотрудников добавить вручную запись, указав сотрудника и выбрать фото. Фото сотрудников хранятся в отдельном регистре, и при обновлении данных не очищаются, заменяются только тогда, когда передано заполненное значение base64photo. Так было сделано специально, чтобы картинки не затирались при обновлении данных.

Каталог компании в питоне

Если же сотруднику прикреплено фото, то оно будет отображаться при наведении на поле ФИО.

Меню для работы с системой вручную, имеется у пользователя с ролью Полные.

1. Доработан блок обработки входящих данных по api. Обновляются только те группы, к которым принадлежат данные. Например понадобилось выгружать данные их 4 разных разных организаций из разных баз. Данные обновляются только по этим организациям, и удаляются отсутствующие касаемые загружаемой организации. Также убраны некоторые параметры в XML из-за ненадобности.

2. Добавлены в константы новые поля и галки:

— Поле «Вариант болеет» (тут указываем как звучит статус, например «болезнь». Каждой базе может отличаться)

— Поле «Вариант отпуск» (тут пишем слово которое присутствует в статсе отпуска, например «отпуск»)

— Галка «Рассчитывать количество в группе» (это показывать количество в группе или нет, очень влияет на скорость формирования загрузки базы. Можно отключить расчет)

— Поле выбора «Группа фильтрации по умолчанию» (фильтровать список при запуске базы по указанному подразделению)

— Галка «Не обновлять контакты» (нужно для того, чтобы не затирать контакты, телефоны и электронный адрес при обмене. Если контакты пустые, обновятся, если же НЕ пустые, при выбранной галке не будут тронуты)

Переработан блок хранения планового месяца отпуска, а также корректное склонение при выводе.

Исправлена ошибка установки прокси для блока speller от yandex.

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

Исправлена ошибка отображения списка отпуска по графику.

Доработан api. Теперь подразделения (включая его родителя, это связано с тем, если подразделение переносится в другую группу) ищутся перед созданием новых, так как раньше очищался весь справочник, и пересоздавался заново. Сделано было для того, чтобы не возникала проблема поиска по УИН (появлялось сообщение о не найденном объекте), так как он менялся, если сотрудник не обновлял данные таблицы.

Также добавлена галка в константах Выполнять поиск по головному подразделению. Не всем нужно выполнять поиск по 1 уровню иерархии меню.

Исправлен подход поиска по подразделениям. При формировании пункта подразделения, что в поле меню, что в в таблице результата, в параметр «id» передается «УИН» ссылки. По которому производится поиск. Возникло такое решение из-за найденного неудобства, когда существуют одинаковые по наименованию подразделения, например по разным филиалам.

Исправлены некоторые интерфейсные моменты. В левом поле вывода фильтров и подразделений, изменен вывод подразделений (убран пункт «Подразделения», выводятся сразу же верхние уровни подразделений). Также при нажатой кнопке «Группировать по подразделениям» названия подразделений стали ссылками, при нажатии на которые происходит фильтрация.

Про торги:  Договор на оказание консалтинговых услуг по торгам

В интернете представлено много реализаций online телефонных справочников организаций. Есть справочники, которые использует для хранения информации базу Active Directory (LDAP), есть справочники, которые реализованы с использованием СУБД (например, MySQL). Но я не нашел справочника, который использует информацию из базы 1С. Далее я рассмотрю данную разработку.

Во многих организациях используются телефонные справочники сотрудников. Сначала у нас был красивый бумажный вариант, разработанный в редакторе векторной графики. Но постепенно мне стало надоедать, что приходится его распечатать, затем вырезать и скрепить, а таких справочников варировалось от 10 до 25 штук. В общем, занимало много времени, и особого желания заниматься этим не было. Далее справочник эволюционировал в электронную версию в Excel. Для меня это был идеальный вариант: работает поиск, простота заполнения. Но акктуализировать информацию приходилось мне, возможно из-за сложности формы, а возможно из-за нежелания сотрудника заниматься изучением справочника. В общем со временем мне надоел и этот вариант.  Поспрашивав друзей из других компаний,  я выяснил, что online телефонный справочник у них реализован с использованием LDAP или PHP+MySQL. Мне не понравились данные реализации по ряду причин:

  • при использовании LDAP пришлось бы забивать в базу контакты людей, которые не пользуются корпоративной сетью вообще;
  • при использовании LDAP для поддержания акктуальной информации пришлось кому-то из сотрудников давать доступ к серверу, а точнее к редактированию данных LDAP;
  • при использовании PHP+MySQL необходимо было бы писать и серверную, и клиентскую часть с нуля, либо модифицировать наработки товарищей под свои нужды. Поскольку, я не силен в PHP, то рассматривать данный вариант не стал.

В итоге я решил использовать в качестве хранения и обработки данных 1C, а для удобного вывода HTML и JavaScript.

Задача разделилась на 3 этапа:

1. Разработка серверной части, т.е.  разработать HTTP-сервис для конфигурации 1С: ЗУП

2.  Разработка клиентской части. Вот тут для меня было сложнее всего, поскольку HTML и JavaScript я знал меньше чем на базовом уровне.

3. Публикация на web-сервере. Об этом я в статье писать не буду, поскольку информации в интернете, да и на infostart.ru много по этому вопросу.

В результате получилась система отображающая контактыне данные о сотрудниках и их ближайшие дни рождения. Итак начнем.

Разработка серверной части

Для начала давайте разберемся, как работать с  HTTP-сервисами в 1С. HTTP-сервисы представляют обработчики HTTP-запросов по определенному URL. URL HTTP-сервиса используется специальный, например:

  • адрес сервера — это адрес серевера публикации базы 1С;
  • имя базы — это название базы данных конфигурации 1С;
  • hs — указывает на то, что мы обращаемся к HTTP-сервису;
  • корневой URL — это группа запросов, объеденных общим смыслом. Указывается в свойствах HTTP-запроса;
  • относительный URL — это сам запрос, который может использоваться по шаблону и указывается в объекте Шаблон URL.

Для телефонного справочника используем корневой URL — person, а относительные URL следующие (рисунок 1):

  • personList — получение списка сотрудников;
  • personInfo — получение контактной информации по сотруднику;
  • birthdayList — получение списка дней рождения и дней оставшихся до него.

Для написания HTTP-сервиса используем методы в шаблонах URL, которые связываются в модуле HTTP-сервиса с функциями. В модуле HTTP-сервиса будут 3 функции getPersonList, getPersonInfo, getBirthdayList.

Каталог компании в питоне

Рисунок 1. HTTP-сервис и шаблоны URL

Алгоритмы трех функций очень схожи и сводятся к одному:

  • Проверяем парметры HTTP-запроса;
  • Составляем запрос к базе данных
  • Обрабатываем результаты базы данных в объекты массив и структуры
  • Формируем из полученных объектов сериализированную строку JSON
  • Формируем ответ и отправляем обратно клиенту

Поскольку, алгоритмы схожи, то расмотрим только функцию personList, если вы поймете как работает эта функция, то разобраться с другими не составит труда. При формировании HTTP-ответа мы создаем JSON строку, в которой будут содержаться данные для отображения.

Для начала создадим объект HTTPСервисОтвет с числовым параметром, соответствующий коду HTTP-состояния и укажем тип возвращаемых данных (javascript). Более подробнее про коды HTTP состояния можно почитать тут.

Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить(«Content-type»,»application/javascript»);

Пока работа с объектом HTTPСервисОтвет закончена. Для того, чтобы получить параметры от клиента мы обрабатываем Запрос методом Получить, аргументом которого идет название параметра:

ПараметрСостояния = ?(Запрос.ПараметрыЗапроса.Получить(«fired») = «0», Перечисления.СостоянияСотрудника.Увольнение, Неопределено);

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

Дальше мы производим запрос к базе данных с параметром:

Заострять внимание на зпросе не будем, поскольку я писать запросы не умею, тема публикации меньше отностися к запросам и поэтому перейду к обработке результатов запроса:

ВыборкаПодразделений = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,»КодПодразделения»);
СписокПодразделений = Новый Массив;
Пока ВыборкаПодразделений.Следующий() Цикл
Подразделение = Новый Структура;
Подразделение.Вставить(«id»,Строка(ВыборкаПодразделений.КодПодразделения));
Подразделение.Вставить(«open»,»true»);
Подразделение.Вставить(«value»,Строка(ВыборкаПодразделений.Подразделение));
СписокСотрудников = Новый Массив;
ВыборкаСотрудники = ВыборкаПодразделений.Выбрать();
Пока ВыборкаСотрудники.Следующий() Цикл
Сотрудник = Новый Структура;
ФИО = ВыборкаСотрудники.Фамилия + » » + Лев( ВыборкаСотрудники.Имя, 1) + «. » + Лев( ВыборкаСотрудники.Отчество, 1) + «.»;
Сотрудник.Вставить(«id»,Строка(ВыборкаСотрудники.КодСотрудника));
Сотрудник.Вставить(«value»,Строка(ФИО));
СписокСотрудников.Добавить(Сотрудник);
КонецЦикла;
Подразделение.Вставить(«data»,СписокСотрудников);
СписокПодразделений.Добавить(Подразделение);
КонецЦикла;

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

Джсон = Новый ЗаписьJSON;
Джсон.УстановитьСтроку();
Настройка = Новый НастройкиСериализацииJSON;
ЗаписатьJSON(Джсон, СписокПодразделений,Настройка);
РезультатСтрока = Джсон.Закрыть();
Ответ.УстановитьТелоИзСтроки(РезультатСтрока,КодировкаТекста.UTF8);
Возврат Ответ;

При формировании JSON использовал пример с its.1c.ru.

Алгоритм остальных функций аналогичен. Переходим к разработке клиентской части

Разработка клиентской части

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

До использования библиотеки Webix я пробовал сам сделать интерфейс, но получилось мягко говоря не очень. Для сравнения покажу старый и новый интерфейс:

Каталог компании в питоне

Рисунок 2. Интерфейс до использования Webix UI

Каталог компании в питоне

Рисунок 3. Исопльзование Webix UI

Помимо данной библиотеки клиентская часть, состоит из  следующих файлов:

  • index.html — точка входа, именно на эту страницу попадает клиент и с нее уже подгружаются logic.js и ui.js
  • logic.js — файл описывающий логику интерфейса: действия при нажатии на элементы, запросы к серверу и т. д.
  • ui.js — файл описывающий сам интерфейс.

Интерфейс страницы (ui_scheme) представляет собой рабочую област,ь разделенную на три части:

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

Дерево подразделений и сотрудников — это иерархический список где родителями являются подразделения, а подчиненными являются сотрудники.

Также имеется окно (win_birthday), которое состоит из заголовка окна, кнопки закрыть и списка сотрудников с указанием даты рождения и дней до дня рождения. Размеры и положения окна можно изменять и оно является модальным.

Когда выполняется файл logic.js, он загружает интерфейс и подключает индикатор загрузки

webix.ui(ui_scheme);
webix.ui(win_birthday);
webix.extend($$(«phonebook»), webix.ProgressBar);
webix.extend($$(«birthday_persons»), webix.ProgressBar);

Про торги:  ГОСТ 28852-90 Рассада цветочных культур. Функции

Затем вызывается функция update_list(), которая формирует список сотрудников и подразделений, отправляя запрос на сервер. После чего добавляются события к следующим объектам

При нажатии на клавишу «Показывать уволенных сотрудников» происходит обновление списка подразделений и сотрудников

При нажатии на элементе дерева подразделений и сотрудников проверяется, является ли этот элемент сотрудником или подразделением (имеет ли дочерние объекты), если сотрудник, то обновляется область информации.

При нажатии на кнопку «День рождения» отображается окно и обновляется список сотрудников и дат рождений в данном окне.

При изменении значения «До дня рождения» обновляется список сотрудников и дат рождений

Если поле search будет изменено то применяется фильтр к дереву подразделений и сотрудников.

Алгоритмы обновления информации о сотрудниках, подразделениях и дат рождения очень схожи:

  • Формируется URL для запроса
  • Формируется строка авторизации
  • До отправки запроса отправляется запрос авторизации
  • Отправляется запрос на сервер
  • Обрабатывается результат и парсится в объекты страницы.

Я надеюсь, что данный материал был интересен и полезен для читателя. С радостью отвечу на вопросы в комментариях и выслушаю критику по данному материалу.

в 15:52, , рубрики: python

Часто, в территориально и инфраструктурно разнесенных офисах предприятия, сотрудники пользуются «файликом» для поиска номеров других сотрудников. Это связанно либо с отсутствием нормального корп.портала, бардаком в АД либо с ее отсутствием вообще.

  • Создать web справочник для компании со множеством партнерских и дочерних офисов;
  • Минимальный интерфейс для пользователей;
  • Вывод информации в табличном виде и детальный вывод отдельно взятого контакта;
  • Автодонабор имени в строке поиска;
  • Обеспечить возможность редактирования записей справочника секретарями офисов;
  • Обеспечить возможность ограничения прав на редактирование справочника;
  • Возможность вывести данные отдельного предприятия;
  • Отдельное отображение общих (сервисных) номеров.

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

В моем проекте на Github-е будет уже заполненная тестовая база SQLite.

Ссылка на github

Интерфейс поиска

Каталог компании в питоне

Каталог компании в питоне

Каталог компании в питоне

Каталог компании в питоне

Админ. интерфейс реализован с помощью библиотеки Flask-Admin

login: demo
password: demo!

Каталог компании в питоне

Каталог компании в питоне

Каталог компании в питоне

Каталог компании в питоне

Каталог компании в питоне

в 11:49, , рубрики: active directory, ajax, html, javascript, mysql, phonebook, php, метки: phonebook

Каталог компании в питоне

Каталог компании в питоне

Каталог компании в питоне

Телефонный справочник для Active Directory

Каталог компании в питоне

Для тех, кто статью читать не захочет, сразу репозиторий на github.

А остальных под катом ждёт бессвязная и бессмысленная история о том, как я дошёл до жизни такой, при помощи node-webkit, написал приложение, которого джва года ждал.
Всю свою сознательную жизнь карьеру сисадмина я восхищался Active Directory от MS. И как только появилась такая возможность — внедрил её на предприятии, где работаю.

Основные требования к такому справочнику:

  • отдельное portable приложение. Каждый раз натыкаясь на web-based справочник думал «если уж поднимать для этого сервак — то там уже сделаю полноценный корпоративный портал, а сейчас мне нужен всего лишь маленький справочник.
  • бесплатный
  • Максимально простой и удобный в использовании. Он всегда представлялся мне просто таблицей с сортировкой и поиском

Из всего зоопарка подобного софта, что я обнаружил, можно выделить несколько типов:

Видел когда-то ещё и серверный вариант на php, правда не нашёл его при написании статьи. Его можно отнести к 3-ей группе, так как требование сервера для меня является недостатком.

По поводу справочника от dmsoft

Выглядит он вот так

И нет никакой возможности хотя бы ширину столбца телефона сделать больше по умолчанию. А настраивать интерфейс каждый раз при запуске жутко раздражает.

Марш-бросок до прототипа

И так. У меня есть 1.5 — 2 часа на то что бы освоить новую технологию (даже две, так как nodejs я тоже, по сути, не знал) и написать с её помощью софт, который почему-то никто из опенсорс программистов до сих пор не написал.

Первым делом — спросил гугл насчёт связи nodejs с ActiveDirectory. Он подсказал целых два модуля: node-activedirectory и ldapjs. Разбираться, что к чему времени не было, так что выбор пал на первый.

var groupName = ‘Employees’;

EMPLOYEES — группа в которую входят все текущие сотрудники

Попытка потыкать второй модуль привела к тому же результату, но за большее время. Курение манов, пинание знакомого nodejs-ника и шальная удача таки дали результат: суперадмин домена почему-то не аутентифицируется, а вот бесправный юзверь, созданный ради гостевого интернета, — сработал!

Времени на разбирательства с правами нету — поехали дальше.

  • git init
  • Лицензия
  • грязный хак для дебаггинга
    require(‘nw.gui’).Window.get().showDevTools();
  • копипаст старого кода

Чуть чуть кода

Из кроватки раздался радостный плачь.

Утренний кофе

  • Автофокус на поле поиска
  • И раскрываем окно на весь экран, чтобы не париться по поводу размеров
    require(‘nw.gui’).Window.get().maximize();

Уже весьма неплохо

Но уже 7:30 и мне пора бежать.

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

в событие получения ответа от ldap поменял это:

а так же добавил в пустое место в скрипте подгрузку с localstorage если не пустой

Как раз и обед закончился.
Но данный функционал уже полностью покрывает все мои планы, так что на этом я пока и остановился.

Установка

  • поставьте node-webkit
  • запускайте
    pathtonodewebkitnw.exe pathtotelephone-directory

Распространение

  • Запакуйте каталог telephone-directory в .zip
  • Переименуйте архив в .nw
  • Немного магии
    copy /b pathtonodewebkitnw.exe+pathtotelephone-directory telephone-directory.exe
  • докиньте все остальные файлы из node-webkit кроме nw.exe в каталог с telephone-directory.exe

Должно получиться так:

Всё — можно выкладывать на сетевой диск или распространять так, как вам вздумается

Код писался впопыхах, так что не блещет красотой. Многие вещи можно и нужно дорабатывать. Но без помощи сообщества я вряд ли буду делать что-то большее чем то, что уже есть. Ибо то, что уже есть — работает и полностью удовлетворяет требованиям — а большего и не надо.

Приложение рассчитано на контору с около 100 сотрудниками (вроде той в которой я работаю). При меньшем количестве вряд ли используется AD. А при большем — может потребоваться какая-то оптимизация кода, но наверняка уже используется корп-портал или что-то подобное.

Кода 45 строк, так что уверен, даже для сисадминов не знающих JS, подгонка проекта под свои нужды не составит труда.

С помощью Free Address Book — Free Phone Book вы можете записать адреса, номера телефонов, мобильные телефоны, факсы, названия компаний, страны, города, адреса веб-сайтов и адреса электронной почты ваших контактов и партнеров.

Добавьте свои настраиваемые поля, где вы можете хранить свои специальные данные, которые не используются по умолчанию в этой программе.

Вы можете легко настроить печатный список контактов и страницу сведений о выбранном контакте.

Экспорт / импорт ваших контактов в формате CSV.

Телефонная книга абсолютно бесплатна!

Организуйте свои контакты легко и быстро!

Оцените статью
ТЭК Торги