Redmine

10 способов злоупотребления сотрудниками своим служебным положением и методы борьбы с ними с помощью учетной системы Промо

Не так давно на одном из проектов во время инвентаризации была выявлена очень большая недостача. Как результат, одно из важнейших требований клиента по проекту было: разобраться с тем, что у него происходит в системе, и привести остатки, как он выразился, «в адекватное состояние».
А незадолго до этого у меня в практике был случай, когда уже на второй день после внедрения качественной системы учета движения наличных денежных средств (кассы) также была выявлена недостача, но уже в кассе.
И в первом, и во втором случае вину за возникновение проблемы представители заказчика попытались возложить на людей, которые занимались внедрением новой системы. И только после долгих и, надо признаться, довольно неприятных и очень эмоциональных разбирательств, удалось доказать клиенту, что система работает правильно, а виноваты в случившемся сотрудники компании, которые намеренно или ненамеренно создали фактическую недостачу товара и денег.

Testing your plugin¶

plugins/polls/test/test_helper.rb

Here are the contents of my test helper file:

require File.expand_path(File.dirname(__FILE__) + '/../../../test/test_helper')

Contents of for Redmine 4.x:

Contents of for Redmine 3.x:

Running test

Initialize the test database if necessary:

$ rake db:drop db:create db:migrate redmine:plugins:migrate redmine:load_default_data RAILS_ENV=test

To execute the polls_controller_test.rb:

$ RAILS_ENV=test bundle exec rake test TEST=plugins/polls/test/functional/polls_controller_test.rb

Testing with permissions

If your plugin requires membership to a project, add the following to the beginning of your functional tests:

If your plugin requires a specific permission, you can add that to a user role like so (lookup which role is appropriate for the user in the fixtures):

You may enable/disable a specific module like so:

Reference file hierarchy

Here is a simple list of all the files and directories mentioned in this Tutorial and Hooks. This is useful to ensure standard paths are used and also useful for newbies to know here files should go.

plugins/PLUGIN/README.rdoc
plugins/PLUGIN/init.rb
plugins/PLUGIN/app/
plugins/PLUGIN/app/controllers/
plugins/PLUGIN/app/controllers/CONTROLLER_controller.rb
plugins/PLUGIN/app/helpers/
plugins/PLUGIN/app/helpers/CONTROLLER_helper.rb
plugins/PLUGIN/app/models/
plugins/PLUGIN/app/models/MODEL.rb
plugins/PLUGIN/app/views/
plugins/PLUGIN/app/views/CONTROLLER/
plugins/PLUGIN/app/views/CONTROLLER/_PARTIAL.html.erb
plugins/PLUGIN/app/views/CONTROLLER/CONTROLLER-ACTION.html.erb
plugins/PLUGIN/app/views/hooks/
plugins/PLUGIN/app/views/hooks/_HOOK.html.erb
plugins/PLUGIN/app/views/settings/
plugins/PLUGIN/app/views/settings/_MODEL_settings.html.erb
plugins/PLUGIN/assets/
plugins/PLUGIN/assets/images/
plugins/PLUGIN/assets/javascripts/
plugins/PLUGIN/assets/stylesheets/
plugins/PLUGIN/assets/stylesheets/voting.css
plugins/PLUGIN/config/
plugins/PLUGIN/config/locales/
plugins/PLUGIN/config/locales/en.yml
plugins/PLUGIN/config/routes.rb
plugins/PLUGIN/db/
plugins/PLUGIN/db/migrate/
plugins/PLUGIN/db/migrate/001_create_MODELs.rb
plugins/PLUGIN/lib/
plugins/PLUGIN/lib/PLUGIN_hook_listener.rb
plugins/PLUGIN/lib/PLUGIN/
plugins/PLUGIN/lib/PLUGIN/hooks.rb
plugins/PLUGIN/lib/PLUGIN/MODEL_patch.rb
plugins/PLUGIN/lib/tasks/
plugins/PLUGIN/test/
plugins/PLUGIN/test/test_helper.rb
plugins/PLUGIN/test/functional/
plugins/PLUGIN/test/functional/CONTROLLER_controller_test.rb
plugins/PLUGIN/test/unit/
plugins/PLUGIN/test/unit/MODEL_test.rb

Версии¶

Projects versions allow you to track and plan changes. You can assign issues to versions and then view the list of assigned issues for each version on the roadmap.You can also assign a wikipage to a version which will be added to the roadmap and the version overview.

Note: the roadmap menu-item shows up in the project-menu only when the issue tracking is enabled for the project and at least one is configured in the projects settings.

Name: The text you want to be displayed to identify the version. This field is required.

Description: A short description to describe the version. This field is optional.

  • Status: the status lets you control how issues can be assigned to the version:

    • open: no restriction (default)
    • locked: can not assign new issues to the version
    • closed: can not assign new issues and can not reopen assigned issues

Wiki Page: The name of a wikipage assigned to the version. This field is optional.

Date: The due date for the version to be completed. This field is optional.

  • Sharing: this option lets you share the version with other projects, so that issues from these other projects can be assigned to the shared versions. Each version can be shared with:

    • subprojects: all the descendant projects
    • projects in the project hierarchy: ancestors + descendants (needs versions management permission on the root project)
    • projects in the project tree: root project + all its descendants (same as above)
    • all projects (can be set by admin users only)
---------------------------------------------------------------------------------
| None          | Subprojects   | Hierarchy     | Tree          | All projects  |
|               |               |               |               |               |
|      X     X  |      X     X  |      o     X  |      o     X  |      o     o  |
|      |     |  |      |     |  |      |     |  |      |     |  |      |     |  |
|    --X--   X  |    --X--   X  |    --o--   X  |    --o--   X  |    --o--   o  |
|   /  |  \     |   /  |  \     |   /  |  \     |   /  |  \     |   /  |  \     |
|  X   V   X    |  X   V   X    |  X   V   X    |  o   V   o    |  o   V   o    |
|     / \       |     / \       |     / \       |     / \       |     / \       |
|    X   X      |    o   o      |    o   o      |    o   o      |    o   o      |
|   /           |   /           |   /           |   /           |   /           |
|  X            |  o            |  o            |  o            |  o            |
---------------------------------------------------------------------------------

V = project with the shared version
o = projects that can assign issues to the shared version
X = projects that can't assigne issues to the shared version

From the versions list, you can click on Close completed versions to automatically set the status of all the completed versions (due date reached and no open issues) to closed.

Строчные элементы¶

Внешние ссылки

Адреса http(s), ftp и mail автоматически преобразуются в «кликабельные» ссылки:

http://www.redmine.org: http://www.redmine.org

Для размещения в ссылке произвольного текста используйте следующую разметку:

«Главная страница проекта Redmine»:http://www.redmine.org: Главная страница проекта Redmine.

someone@foo.bar: someone@foo.bar.

Важно: вместо пробелов в ссылку следует вставлять код %20

Акронимы

Ненавязчиво пояснить аббревиатуры в тексте можно следующим образом:

JPL(Jean-Philippe Lang): JPL.

К сожалению, не работает для кириллицы и смешанного регистра: ИС(Информационные Системы), QoS(Quality of Service)

Изображения

!image_url! — встраивает в текст изображение, находящееся по внешнему адресу image_url.

!image_url(Image title)! — изображение будет снабжено заголовком.

встроенное изображение, причем текст будет продолжен после изображения вот так, а при наведении курсора на изображение появится текст. Этот текст также появится,если изображение по какой-либо причине недоступно — (отображение зависит от браузера)

!>image_url! — изображение выровнено по правому краю, текст обтекает изображение по левому краю.

изображение отображается справа от текста
пример изображения справа от текстаопять справа от текстаеще справа от текстаи тут картинка справа от текстаа тут текст слева от картинки

!attached_image.png! — встраивает в текст изображение attached_image.png, прикрепленное к странице.

!{width:50%}attached_image.png! — задаёт ширину изображения относительно блока, в который его встроили (для больших изображений можно воспользоваться блоком ).

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

Toolbar¶

Each wiki page has a toolbar located in the upper right corner with buttons for actions to perform on the page. Depending on the Roles and permissions of the site your user might not have permission to perform some of the actions, in this case the respective button will not be displayed at all.

The actions are explained below.

Edit

To edit the current contents of a wiki page click the Edit button. See RedmineTextFormatting for details about text annotation. The pages’s parent can be changed by using the drop down box «Parent page».

Rename (or move)

To rename a wiki page or move a wiki page and its children to another project, click on the Rename button.

If ‘Redirect existing links’ is checked, existing links to the current page are redirected to the new wiki page when renamed or moved. Links to the children-pages move to other project are not redirected. To stop the redirection see a workaround in .

You can specify a parent page in ‘Parent page’.

You can move a page to another project by specifying the destination project in ‘Project’. When moving a page, each child page is also moved unless the destination project contains a page with the same name.

Lock (protect)

Clicking the Lock button locks the page, and transforms the button into Unlock.

A locked wiki page can only be edited by users who have the permission to protect wiki pages, these users can also unlock it again by clicking Unlock.

History

Redmine keeps a record of every change made to a wiki page. You can view the list of these changes by clicking on History.

To view a specific version of the page click on its number.

What is displayed can be misleading: means that you are viewing version 31 out of 41, it does not mean that the diff link will show you the differences between 31 and 41. It does show you the differences between version 30 and 31. If you’re looking at version 30, you’ll see Version 30/41, and the diff will show you the changes in version 30.

If you want to see differences between 40 and 41, go to the revisions list and click ‘View changes’ (by default, it will show the diff of the last version).

You can revert a page to a previous version by clicking on Rollback to this version, then Save. In that case a new page version is created without losing the wiki page history.

If you instead do want to delete all history of a wiki page you have to copy the content of that page to a safe place (copy/paste in edit window), delete the page and re-create it with the same name. Then re-insert the copied content.

Создание платформы управления проектами Redmine на основе Docker

y http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>le=»margin-bottom:5px;»>Теги:  redmine  docker

Эта статья относится к блогу»Docker_redmine построен»Содержание.

Введение в Redmine.

Redmine — это веб-программное обеспечение для управления проектами, разработанным Ruby. Это набор кроссплатформенных систем управления проектами, разработанным ROR Framework. Говорят, что он исходит от версии ROR Basecamp, поддерживает несколько уникальных функций, есть много уникальных функций , Например, Wiki, News и т. Д., Также могут интегрировать другие системы управления версиями и системы отслеживания ошибок, такие как Perforce, SVN, CVS, TD и многое другое. Эта система управления проектами веб-формы использует форму «проекта», чтобы поставить участников, задач (проблем), документов, обсуждений и различных форм ресурсных организаций, и все участвуют в задачах обновлений, документации и другим контентом для продвижения проекта. Прогресс, в то время как система использует временные подсказки и различные динамические формы, чтобы перейти к членам, чтобы сообщить о прогрессе проекта.

Редмин

При развертывании Redmine на основе Docker вам может понадобиться только для композиции.

Затем выполняются следующие инструкции для автоматического развертывания Redmine. Конечно, вам нужно сначала установить docker-copose. После завершения развертывания вы можете получить доступ к http: // localhost: 8080. Имя пользователя и пароль администратора: admin, 12345678.

Установка плагина Redmine

Плагин Redmine имеет много, но наша версия Redmine — 4.0.2, которая ограничена количеством плагинов для этой версии. Мы будемПервые несколько плагинов рангаПлагин для версии 4.0.2 установлен в основном, включая следующее.

  • redmine_checklists
  • redmine_lightbox2
  • redmine_contacts
  • redmine_wktime
  • redmine_agile
  • redmine_issue_templates

Режим монтажа плагинов одинаково. Сначала загрузите плагин и распаковывать (при необходимости), затем скопируйте плагин в контейнер с помощью Docker CP. Впоследствии введите контейнер и установите плагин.

Введите конкретный каталог плагинов, см. В разделе «Источник» https://rubygems.org ‘, если не включен,

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

Установка темы Redmine

Хотя тема Redmine по умолчанию в порядке, все еще есть определенный дефект. отРедмин тема спискаПоиск открытий, в последней теме, есть только один бесплатный. Так что я выбираюPurplemine2Эта тема. Метод установки — скопировать пакет темы на публичные / темы и перезапустить Redmine.

Интеллектуальная рекомендация

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

1. Предположим, что вы tomcat6 и добавили библиотеку драйверов mysql в D: \ Program Files \ Apache Software Foundation \ Tomcat 6.0 \ lib   2. Добавьте в «Tomcat 6.0 \ conf \ context.xml&ra…

4. Условное суждение После выполнения условного тестового выражения обычно возвращается «истина» или «ложь», так же как возвращаемое значение после выполнения команды равно 0 д…

1. Что такое куча? Стек: особый видПолное двоичное деревоструктура.    Большая корневая куча: полное двоичное дерево, удовлетворяющее тому, что любой узел больше, чем его дочерний узел.Большой; Неболь…

Вам также может понравиться

1. Введение Аполлон (Аполлон) — это НИОКР в Ctrip Framework SectorРаспределенный Центр конфигурацииМожно централизовать управление для управления различными средами, разными кластерами. После настройк…

               …

Список может быть изменен, но иногда вам необходимо создать серию немодифицируемых элементов, а кортеж может удовлетворить эти потребности. Значение, которое не может быть изменено в Python, называетс…

тема: код показан ниже: Ожидание является обратной величиной вероятности. Накопите все ожидаемые значения, чтобы получить: N + N / 2 +… + 1, и положите N, чтобы получить: N (1 + 1/2 +… +…

1. Ролевое управление фоновым менеджментом 1.1 Определение ролевой формы для управления ролями Определите форму роли в файле forms.py в каталоге администратора приложения. 1.2 Список всех ролей в упра…

Почему Redmine?

  • Это сладкое слово «халява». Redmine бесплатен, правда, с оговоркой, что к нему есть платные плагины, которые вы сами для себя выбираете. В любом случае у вас появляется какое-то прогнозирование затрат, потому что если вы купили плагин и не меняете платформу Redmine, то какое-то время этим плагином можно пользоваться без дополнительных вложений. А если вам, например, нужно его обновить, то вы платите за это обновление и используете его дальше. Обновление платформы Redmine происходит раз или два в год, а обновляться или нет – это уже по вашему желанию.
  • У Redmine интуитивно понятный интерфейс. Мы у себя внедрили Redmine не только как продукт для управления ИТ, но и как продукт, куда поступают заявки от пользователей для различных отделов. Например, выделена отдельная ветка для заявок административно-хозяйственного отдела.
  • Есть возможность управления приоритетами в различных аналитических формах, в том числе и индивидуально по задачам.
  • Управление временем и ресурсами. Я думаю, что это – основной блок для руководителя. Он позволяет понимать, насколько загружен его отдел, с какими задачами какие затраты связаны и как можно классифицировать затраты, но об этом ниже.
  • Аналитика и отчеты в Redmine выражены слабо, но есть обширный API. Можно взять данные из базы по API, выгрузить их в свою систему и получить любые отчеты.
  • Гибкие настройки, кастомизация и автоматизация ручных операций с помощью плагинов.
  • Интеграция с Git – это один из важных показателей. Хранилище нашей базы подключено к GitLab, и в любой задаче Redmine можно посмотреть логи (связанные редакции): кто, когда и что изменил по этой задаче, с переходом в GitLab.

Для информации: Git — это распределенная система управления версиями. Она отслеживает, фиксирует и хранит информацию (версии) об изменениях в любых файлах и каталогах, а также следит за целостностью данных. В нашем случае речь идет об исходном коде 1С.

Вот так выглядит список связанных редакций:

CSS¶

Идентификаторы

p(#id). — присваивает абзацу идентификатор id.

Пример:

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

Классы

p(class_name). — присваивает абзацу класс.

%(class_name)span_content% — присваивает диапазону класс.

Примеры:

Хлебные крошки Руководство » Руководство пользователя »

Избранное

Стили

%{background:lightgreen}Зеленый фон% — Зеленый фон

%{text-decoration:overline}»Надчеркивание»% — «Надчеркивание»

Комбинирование стилей:

%{background:silver;color:black;border-style:outset;padding:5px}Отмена% — Отмена

Еще немного о функциях Redmine

Из дополнительных полезных функций в Redmine хотелось бы выделить:

Режим аутентификации – либо по ad, либо по логину и паролю;

  • Объединение пользователей в группы. С помощью этого инструмента можно сформировать внутри Redmine иерархическую структуру предприятия. Существуют плагины по интеграции с учетной системой и клонированием ее структуры в группы;
  • Ролевая модель прав, с множественной разноуровневой настройкой;

Настройка Workflow (жизненного цикла) каждого трекера для каждой роли;

  • Также существуют плагины для интеграции с системами мгновенного обмена сообщениями, такими как Telegram, и SMS-шлюзами. По любому каналу связи можно присылать оповещения, например по возникшим инцидентам, мониторинговые сведения и т.д.;
  • При наличии компетенции есть возможность просто самим сделать любые плагины.

Серверная поддержка

У каждой конфигурации свои особенности. Даже если мы предоставляем виртуальную машину с готовым приложением, она работает в клиентской среде вне сферы нашего контроля. Поэтому мы ввели ограничения на объём поддержки в случае возникновения инцидента, связанного с внешней средой. Тем не менее, мы сделаем всё возможное, чтобы помочь вам, независимо от источника проблемы.

Что входит в комплект услуг по серверной поддержке?

  • Помощь при установке, обновлении, переносе данных
  • Помощь с развёртыванием или запуском виртуальной машины
  • Помощь с настройкой конфигурации среды (до, во время или после установки или развёртывания приложения)
  • Помощь с сервисами (такими как планировщик задач), компонентами (такими как диск), процессами, веб-серверами, серверами приложений, базой данных
  • Помощь с настройкой электронной почты
  • Тренинги по всем перечисленным выше вопросам
  • Анализ локальных отказов приложения

Как предоставляются услуги по серверной поддержке?

  • У наших специалистов должен быть доступ к клиентскому серверу
  • Удалённая сессия планируется заранее на определённое время
  • Если клиент переносит сессию позднее чем за сутки до назначенного времени, мы взимаем неустойку
  • После сессии мы выставляем счёт по количеству часов работы специалиста

Как оплачиваются часы работы специалиста поддержки?

Generating a controller¶

For now, the plugin doesn’t do anything. So let’s create a controller for our plugin.We can use the plugin controller generator for that. Syntax is:

bundle exec rails generate redmine_plugin_controller <plugin_name> <controller_name> 

So go back to the command prompt and run:

$ bundle exec rails generate redmine_plugin_controller Polls polls index vote
      create  plugins/polls/app/controllers/polls_controller.rb
      create  plugins/polls/app/helpers/polls_helper.rb
      create  plugins/polls/test/functional/polls_controller_test.rb
      create  plugins/polls/app/views/polls/index.html.erb
      create  plugins/polls/app/views/polls/vote.html.erb

A controller with 2 actions ( and ) is created.

Edit to implement these 2 actions.

Then edit that will display existing polls:

You can remove since no rendering is done by the action.

Adding routes

Redmine does not provide the default wildcard route (). Plugins have to declare the routes they need in their proper file. So edit to add the 2 routes for the 2 actions:

You can find more information about Rails routes here: http://guides.rubyonrails.org/routing.html.

Now, restart the application and point your browser to http://localhost:3000/polls.You should see the 2 polls and you should be able to vote for them:

Настройки SCM¶

  • изменить имена команд по-умолчанию, если бинарники SCM в используют нестандартные имена (Windows .bat/.cmd не работают)
  • определить полный путь к бинарникам

Пример(для Subversion):

Переопределение имени команды:

scm_subversion_command: "svn_replacement.exe" 

Абсолютный путь:

scm_subversion_command: "C:\Program Files\Subversion\bin\svn.exe" 

Настройка хранилища вложений

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

Примеры:

attachments_storage_path: /var/redmine/files
attachments_storage_path: D:/redmine/files

Configuration¶

Redmine settings are defined in a file named .

If you need to override default application settings, simply copy to and edit the new file; the file is well commented by itself, so you should have a look at it.

These settings may be defined per Rails environment (//).

: don’t forget to restart the application after any change.

SCM settings

  • override default commands names if the SCM binaries present in the variable doesn’t use the standard name (Windows .bat/.cmd names won’t work)
  • specify the full path to the binary

Examples (with Subversion):

Command name override:

Absolute path:

Attachment storage settings

You can set a path where Redmine attachments will be stored which is different from the default ‘files’ directory of your Redmine instance using the setting.

Examples:

Структура «Проектов»

Мы используем Redmine не по стандартному руководству. Как пример, в рамках системы понятие «Проект» – это отдельная ветка в иерархии структуры. Мы же используем дерево «Проектов» как классификацию уровней. На верхнем уровне находится отдел-исполнитель, ему подчиняются обслуживаемые департаменты, далее идут системы, подсистемы и сервисы.

Примерно так выглядят части дерева:

В отделе системного администрирования также используется свой подход иерархии «Проектов». Работа выстроена на основе классификации предоставляемых сервисов – это помогло решить проблему с сервисным управлением. Поэтому в ветке ITSM иерархия «Проектов» – это каталог бизнес-сервисов. Для удобства они пронумерованы.

Adding new permissions¶

For now, anyone can vote for polls. Let’s make it more configurable by changing the permission declaration.We’re going to declare 2 project based permissions, one for viewing the polls and an other one for voting. These permissions are no longer public ( option is removed).

Edit to replace the previous permission declaration with these 2 lines:

Restart the application and go to http://localhost:3000/roles/permissions:

You’re now able to give these permissions to your existing roles.

Of course, some code needs to be added to the PollsController so that actions are actually protected according to the permissions of the current user. For this, we just need to append the filter and make sure that the @project instance variable is properly set before calling this filter.

Here is how it would look like for the action:

Retrieving the current project before the action could be done using a similar way.After this, viewing and voting polls will be only available to admin users or users that have the appropriate role on the project.

If you want to display the symbols of your permissions in a multilingual way, you need to add the necessary text labels in a language file.Simply create an *.yml (eg. ) file in and fill it with labels like this:

In this example the created file is known as , but all other supported language files are also possible too.As you can see on the example above, the labels consists of the permission symbols and with an additional added at the front.

Restart your application and point the permission section.

Что мы имеем в итоге:

Исходя из всего вышеописанного, подведем краткие итоги.

Плюсы:

  • Redmine – OpenSource-продукт с большим и активным сообществом;
  • Он прогнозируемый по затратам, недорогой, гибкий, кастомизируемый, легко интегрируемый и масштабируемый;
  • Полностью покрывает Bug Tracker, наполовину – управление проектами, совсем немного – ITSM;
  • Имеет интеграцию с Git;
  • Кастомизируется «на лету»;
  • Имеет довольно широкий спектр плагинов. Кроме того, несложно найти специалистов для автоматизации своих процессов;
  • Удобный учет фактических трудозатрат. Возможность планирования трудозатрат и бюджетов.

Минусы:

  • Неудобный Wiki;
  • При необходимости автоматизации своих процессов и при отсутствии компетенции по Ruby on Rails возможно только использование плагинов или поиск сторонних разработчиков;
  • Небольшое количество аналитических отчетов;
  • Не всегда «дружественный» интерфейс;
  • Неудобные массовые классификаторы, которые хотелось бы хранить в виде иерархии.

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

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

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

В общем, выбирайте инструмент, и пусть ваш хаос не останется незамеченным.

****************

Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2017 COMMUNITY. Больше статей можно прочитать здесь.

В 2020 году приглашаем всех принять участие в 7 региональных митапах, а также юбилейной INFOSTART EVENT 2020 в Москве.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector