1

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

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

./redmine-register-file /path/to/my/file.ext "with optional description"

Я считаю, что соответствующая часть интерфейса находится в redmine/apps/views/files/new.html.erb . Доступ к нему осуществляется по index.html.erb , у которого есть небольшая часть, которая, на мой взгляд, важна:

<div class="contextual">
<%= link_to(l(:label_attachment_new), new_project_file_path(@project), :class => 'icon icon-add') if User.current.allowed_to?(:manage_files, @project) %>
</div>

Вот полное содержание new.html.erb:

<h2><%=l(:label_attachment_new)%></h2>

<%= error_messages_for 'attachment' %>
<%= form_tag(project_files_path(@project), :multipart => true, :class => "tabular") do %>
<div class="box">

<% if @versions.any? %>
<p><label for="version_id"><%=l(:field_version)%></label>
<%= select_tag "version_id", content_tag('option', '') +
                             options_from_collection_for_select(@versions, "id", "name") %></p>
<% end %>

<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
</div>
<%= submit_tag l(:button_add) %>
<% end %>

Я не знаю , Руби , что хорошо на всех (ничего , кроме print name.reverse за меня), но я знаю , что все эти двоеточия указывают селекторы. Какую информацию я могу почерпнуть из стандартного интерфейса, который поможет мне в моей задаче, и как может выглядеть законченное решение?


Ближе к решению:

Redmine использует базу данных MySQL для хранения своих регистраций файлов. База данных называется redmine_production и использует следующую схему:

mysql> SHOW COLUMNS FROM redmine_production.attachments;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| container_id   | int(11)      | YES  | MUL | NULL    |                |
| container_type | varchar(30)  | YES  |     | NULL    |                |
| filename       | varchar(255) | NO   |     |         |                |
| disk_filename  | varchar(255) | NO   |     |         |                |
| filesize       | int(11)      | NO   |     | 0       |                |
| content_type   | varchar(255) | YES  |     |         |                |
| digest         | varchar(40)  | NO   |     |         |                |
| downloads      | int(11)      | NO   |     | 0       |                |
| author_id      | int(11)      | NO   | MUL | 0       |                |
| created_on     | datetime     | YES  | MUL | NULL    |                |
| description    | varchar(255) | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

Еще немного Ruby источник

Возможно, это будет полезно: attachment.rb

1 ответ1

1

Для тех, кто пришел по этой теме с созданной мной веткой Redmine : я тоже попытался опубликовать решение, но фильтр СПАМа не позволил бы мне следить за этой веткой. Вероятно, потому, что не было никакого промежуточного ответа (* tear *).


Это заняло немного времени, но я понял это. (Я сделал тестовый экземпляр Redmine, чтобы ничего не портить с нашим рабочим экземпляром, поэтому эти значения являются значениями по умолчанию и должны работать для всех, кто пытается это сделать.)


Краткий обзор процесса:

  1. Найдите внутренний идентификатор проекта, в который вы хотите добавить файлы.
  2. Определить файловую статистику.
  3. Вставьте файл в базу данных.

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


Для этого подключитесь к своей производственной базе данных MySQL. (Обычно, если не всегда, redmine_production . Вы можете получить список всех баз данных MySQL с помощью команды SHOW DATABASES; .)

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

mysql> SELECT * FROM projects;
+----+----------------+-------------+----------+-----------+-----------+---------------------+---------------------+----------------+--------+------+------+
| id | name           | description | homepage | is_public | parent_id | created_on          | updated_on          | identifier     | status | lft  | rgt  |
+----+----------------+-------------+----------+-----------+-----------+---------------------+---------------------+----------------+--------+------+------+
|  1 | git-helloworld | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | git-helloworld |      1 |    1 |    2 |
|  2 | bzr-helloworld | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | bzr-helloworld |      1 |    1 |    2 |
|  3 | hg-helloworld  | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | hg-helloworld  |      1 |    1 |    2 |
|  4 | svn-helloworld | NULL        |          |         1 |      NULL | 2012-01-01 13:00:00 | 2012-01-01 13:00:00 | svn-helloworld |      1 |    1 |    2 |
+----+----------------+-------------+----------+-----------+-----------+---------------------+---------------------+----------------+--------+------+------+
4 rows in set (0.00 sec)

В этом примере мы хотим добавить файлы в git-helloworld , поэтому наш идентификатор равен 1 . Итак, чтобы добавить файл в базу данных, мы выполним команду SQL:

INSERT INTO attachments (container_id, container_type,
                         filename, disk_filename, digest) VALUES (
       1, 'Project',
       'Some File Name', 'file-name-on-disk', '0123456789abcdef');

Несколько заметок об этих полях:

  • container_id: идентификатор проекта, в который вы хотите включить файл
  • container_type: тип контейнера; для этого всегда Project
  • filename: строка для отображения в качестве имени файла
  • disk_filename: фактический путь к файлу относительно /var/www/redmine/files/
  • digest: строка, представляющая контрольную сумму MD5 файла.

Некоторые не обязательные, но рекомендуемые поля:

  • Размер filesize: Размер файла в виде целого числа. Я предполагаю, что это должно быть в байтах или килобайтах, но я не знаю, имеет ли это значение.
  • author_id: пользователь, с которым связан файл. Для моих целей я собираюсь использовать admin . Обратите внимание, что вы можете получить полный список пользователей Redmine с пользователями SELECT * FROM users; ,
  • description: описание файла. (Это то же необязательное описание, которое используется в интерфейсе.)
  • content_type: я бы предположил, что это тип содержимого MIME.
  • created_on: дата создания этого файла.

Для явных типов всех из них, обратитесь к списку столбцов в оригинальном сообщении.

Затем убедитесь, что путь в disk_filename действительно существует относительно вашего redmine/files/ . (Обратите внимание, это означает, что вы можете организовать это!) Вам не нужно этого делать, но вы, очевидно, получите 404, если файла там нет.

После этого вам должно быть хорошо идти!

доказательство

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .