如何以编程方式向 Redmine 注册文件?

如何以编程方式向 Redmine 注册文件?

我想将文件添加到Redmine服务器,而无需通过图形界面。我通过单独的svn checkout进程将文件提供给 Redmine 服务器,因此我只需要能够将文件添加到 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 %>

我不太了解 Ruby根本(超出范围的任何事情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

对于那些通过Redmine 主题我创建了:我也尝试在那里发布解决方案,但垃圾邮件过滤器不允许我跟进该帖子。可能是因为中间没有回复(*泪流满面*)。


虽然花了点时间,但我还是搞明白了。(我创建了一个 Redmine 测试实例,以免弄乱我们的生产实例,因此这些值是默认值,对于任何尝试执行此操作的人来说都应该有效。)


该过程的简要概述:

  1. 找到您想要添加文件的项目的内部 ID。
  2. 确定文件统计信息。
  3. 将文件插入数据库。

实际上没有进行数据库验证,因此即使 (2) 也是可选的。因此,我不会讨论如何获取该信息。(有充足甚至在这个网站上也没有关于如何获取这些信息的资源。)然而,其余部分需要一点关于 Redmine 如何设置其数据库的知识。


要开始此操作,请连接到生产 MySQL 数据库。(这通常是,如果不是总是的话。redmine_production您可以使用命令列出所有 MySQL 数据库SHOW DATABASES;。)

现在,找到您要添加文件的项目的 ID。在上面列出的列中,它将被插入为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,因此我们的 ID 是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:您希望包含该文件的项目的 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。

此后,您就可以出发了!

证明

相关内容