Wie kann ich eine Datei programmgesteuert bei Redmine registrieren?

1071
Sean Allred

Ich möchte eine Datei zu einem Redmine- Server hinzufügen, ohne die grafische Oberfläche zu durchlaufen. Ich mache die Dateien durch einen separaten svn checkoutProzess für den Redmine-Server verfügbar, so dass ich die Dateien nur in die eigene Datenbank von Redmine einfügen kann.

Im Idealfall möchte ich eine Lösung, die folgendermaßen ausgeführt werden kann:

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

Ich glaube, der relevante Teil der Schnittstelle befindet sich in redmine/apps/views/files/new.html.erb. Es ist über zugänglich index.html.erb, was einen kleinen Teil hat, der meiner Meinung nach relevant ist:

<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> 

Hier ist der vollständige Inhalt von 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 %> 

Ich weiß nicht, Rubin, der gut überhaupt (etwas über print name.reverseüber mich), aber ich weiß, dass alle diese Doppelpunkte Selektoren zeigen. Welche Informationen kann ich der Standardschnittstelle entnehmen, die mir bei meiner Aufgabe helfen wird, und wie könnte eine Komplettlösung aussehen?


Näher an einer Lösung:

Redmine verwendet eine MySQL-Datenbank zum Speichern der Dateiregistrierungen. Die Datenbank wird aufgerufen redmine_productionund verwendet das folgende Schema:

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) 

Noch mehr Ruby-Quelle

Vielleicht wird dies von Nutzen sein: attachment.rb

1

1 Antwort auf die Frage

1
Sean Allred

Für diejenigen, die durch den von mir geschaffenen Redmine-Thread dazukommen : Ich habe auch versucht, die Lösung dort zu posten, aber der SPAM-Filter ließ mich den Thread nicht verfolgen. Dies liegt wahrscheinlich daran, dass es keine Zwischenantwort (* Träne *) gab.


Es hat ein bisschen gedauert, aber ich habe es herausgefunden. (Ich habe eine Testinstanz von Redmine erstellt, um nichts mit unserer Produktionsinstanz zu verwechseln. Diese Werte sind also Standardwerte und sollten für jeden geeignet sein, der dies versucht.)


Eine kurze Zusammenfassung des Prozesses:

  1. Suchen Sie nach der internen ID des Projekts, zu dem Sie die Dateien hinzufügen möchten.
  2. Ermitteln Sie die Dateistatistik.
  3. Datei in die Datenbank einfügen

Es findet tatsächlich keine Datenbankvalidierung statt, also ist sogar (2) optional. Deshalb werde ich nicht darauf eingehen, wie ich diese Informationen bekomme. (Auch auf dieser Website gibt es reichlich Ressourcen, um diese Informationen zu erhalten.) Der Rest erfordert jedoch ein kleines bisschen Wissen darüber, wie die Datenbanken von Redmine eingerichtet sind.


Um dies zu starten, stellen Sie eine Verbindung zu Ihrer MySQL-Datenbank her. (Dies ist normalerweise, wenn nicht immer, möglich redmine_production. Sie können alle MySQL-Datenbanken mit dem Befehl auflisten SHOW DATABASES;.)

Suchen Sie nun die ID Ihres Projekts, zu der Sie die Datei hinzufügen möchten. In der Spaltenliste oben wird dies als eingefügt 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) 

In diesem Beispiel möchten wir die Dateien hinzufügen git-helloworld, also unsere ID 1. Um eine Datei zur Datenbank hinzuzufügen, führen wir den SQL-Befehl aus:

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

Ein paar Anmerkungen zu diesen Bereichen:

  • container_id: Die ID des Projekts, in das Sie die Datei einfügen möchten
  • container_type: Die Art des Behälters, der dies ist; zu diesem Zweck ist es immer Project
  • filename: Die Zeichenfolge, die als Dateiname angezeigt werden soll
  • disk_filename: Der tatsächliche Pfad der Datei relativ zu /var/www/redmine/files/
  • digest: Eine Zeichenfolge, die die MD5-Prüfsumme der Datei darstellt.

Einige nicht erforderliche, aber empfohlene Felder:

  • filesize: Die Größe der Datei als ganze Zahl. Ich gehe davon aus, dass dies in Bytes oder Kilobytes sein soll, aber ich weiß nicht, ob es wichtig ist.
  • author_id: Ein Benutzer, dem die Datei zugeordnet werden soll. Für meine Zwecke werde ich verwenden admin. Beachten Sie, dass Sie mit eine vollständige Liste der Redmine-Benutzer erhalten können SELECT * FROM users;.
  • description: Eine Dateibeschreibung. (Dies ist dieselbe optionale Beschreibung, die in der Schnittstelle verwendet wird.)
  • content_typeIch würde davon ausgehen, dass dies ein MIME-Inhaltstyp ist.
  • created_on: Das Datum, an dem diese Datei erstellt wurde.

Informationen zu den expliziten Typen finden Sie in der Spaltenliste des ursprünglichen Beitrags.

Stellen Sie anschließend sicher, dass der Pfad disk_filenamerelativ zu Ihrem redmine/files/Verzeichnis tatsächlich vorhanden ist . (Hinweis : Dies bedeutet, dass Sie es tatsächlich organisieren!) Sie nicht haben dies zu tun, aber Sie werden offensichtlich ein 404 erhalten, wenn die Datei nicht vorhanden ist.

Danach solltest du gut sein!

Beweis