redmine_extensions 0.1.14 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/redmine_extensions/redmine_extensions.js.orig +648 -0
- data/app/views/easy_entity_assignments/_query_index.html.erb.orig +16 -0
- data/config/locales/cs.yml +4 -1
- data/config/locales/en.yml +1 -0
- data/lib/generators/redmine_extensions/entity/templates/context_menu.html.erb.erb +14 -1
- data/lib/generators/redmine_extensions/entity/templates/controller.rb.erb +40 -6
- data/lib/generators/redmine_extensions/entity/templates/edit.js.erb.erb +5 -5
- data/lib/generators/redmine_extensions/entity/templates/index.js.erb.erb +3 -3
- data/lib/generators/redmine_extensions/entity/templates/new.js.erb.erb +5 -5
- data/lib/generators/redmine_extensions/entity/templates/show.js.erb.erb +3 -3
- data/lib/redmine_extensions/easy_query_helpers/outputs.rb +18 -2
- data/lib/redmine_extensions/query_output.rb +30 -11
- data/lib/redmine_extensions/redmine_patches/controllers/issues_controller_patch.rb +9 -0
- data/lib/redmine_extensions/version.rb +1 -1
- data/lib/redmine_extensions/version.rb.orig +7 -0
- data/spec/redmine/app/controllers/custom_field_enumerations_controller.rb +75 -0
- data/spec/redmine/app/controllers/imports_controller.rb +121 -0
- data/spec/redmine/app/helpers/imports_helper.rb +47 -0
- data/spec/redmine/app/models/custom_field_enumeration.rb +90 -0
- data/spec/redmine/app/models/import.rb +249 -0
- data/spec/redmine/app/models/import_item.rb +22 -0
- data/spec/redmine/app/models/issue_import.rb +186 -0
- data/spec/redmine/app/views/attachments/image.html.erb +3 -0
- data/spec/redmine/app/views/attachments/other.html.erb +3 -0
- data/spec/redmine/app/views/common/_image.html.erb +1 -0
- data/spec/redmine/app/views/common/_other.html.erb +1 -0
- data/spec/redmine/app/views/custom_field_enumerations/create.js.erb +2 -0
- data/spec/redmine/app/views/custom_field_enumerations/destroy.html.erb +14 -0
- data/spec/redmine/app/views/custom_field_enumerations/index.html.erb +47 -0
- data/spec/redmine/app/views/custom_fields/formats/_enumeration.erb +12 -0
- data/spec/redmine/app/views/imports/_fields_mapping.html.erb +90 -0
- data/spec/redmine/app/views/imports/mapping.html.erb +52 -0
- data/spec/redmine/app/views/imports/mapping.js.erb +1 -0
- data/spec/redmine/app/views/imports/new.html.erb +15 -0
- data/spec/redmine/app/views/imports/run.html.erb +20 -0
- data/spec/redmine/app/views/imports/run.js.erb +11 -0
- data/spec/redmine/app/views/imports/settings.html.erb +30 -0
- data/spec/redmine/app/views/imports/show.html.erb +38 -0
- data/spec/redmine/app/views/layouts/_file.html.erb +15 -0
- data/spec/redmine/app/views/mailer/security_notification.html.erb +13 -0
- data/spec/redmine/app/views/mailer/security_notification.text.erb +8 -0
- data/spec/redmine/app/views/mailer/settings_updated.html.erb +14 -0
- data/spec/redmine/app/views/mailer/settings_updated.text.erb +12 -0
- data/spec/redmine/app/views/queries/_query_form.html.erb +62 -0
- data/spec/redmine/app/views/repositories/_changeset.html.erb +40 -0
- data/spec/redmine/app/views/search/index.api.rsb +12 -0
- data/spec/redmine/app/views/settings/_api.html.erb +10 -0
- data/spec/redmine/app/views/settings/_attachments.html.erb +21 -0
- data/spec/redmine/app/views/wiki/_new_modal.html.erb +21 -0
- data/spec/redmine/app/views/wiki/new.html.erb +17 -0
- data/spec/redmine/app/views/wiki/new.js.erb +2 -0
- data/spec/redmine/appveyor.yml +36 -0
- data/spec/redmine/db/migrate/20150725112753_insert_allowed_statuses_for_new_issues.rb +23 -0
- data/spec/redmine/db/migrate/20150730122707_create_imports.rb +13 -0
- data/spec/redmine/db/migrate/20150730122735_create_import_items.rb +10 -0
- data/spec/redmine/db/migrate/20150921204850_change_time_entries_comments_limit_to_1024.rb +9 -0
- data/spec/redmine/db/migrate/20150921210243_change_wiki_contents_comments_limit_to_1024.rb +11 -0
- data/spec/redmine/db/migrate/20151020182334_change_attachments_filesize_limit_to_8.rb +9 -0
- data/spec/redmine/db/migrate/20151020182731_fix_comma_in_user_format_setting_value.rb +13 -0
- data/spec/redmine/db/migrate/20151021184614_change_issue_categories_name_limit_to_60.rb +9 -0
- data/spec/redmine/db/migrate/20151021185456_change_auth_sources_filter_to_text.rb +9 -0
- data/spec/redmine/db/migrate/20151021190616_change_user_preferences_hide_mail_default_to_true.rb +9 -0
- data/spec/redmine/db/migrate/20151024082034_add_tokens_updated_on.rb +10 -0
- data/spec/redmine/db/migrate/20151025072118_create_custom_field_enumerations.rb +10 -0
- data/spec/redmine/db/migrate/20151031095005_add_projects_default_version_id.rb +12 -0
- data/spec/redmine/db/migrate/20160404080304_force_password_reset_during_setup.rb +9 -0
- data/spec/redmine/db/migrate/20160416072926_remove_position_defaults.rb +13 -0
- data/spec/redmine/db/migrate/20160529063352_add_roles_settings.rb +5 -0
- data/spec/redmine/lib/redmine/acts/positioned.rb +118 -0
- data/spec/redmine/lib/redmine/helpers/url.rb +35 -0
- data/spec/redmine/lib/redmine/hook/listener.rb +32 -0
- data/spec/redmine/lib/redmine/hook/view_listener.rb +78 -0
- data/spec/redmine/log/test.log +2 -0
- data/spec/redmine/plugins/dummy_plugin/Gemfile +1 -0
- data/spec/redmine/plugins/dummy_plugin/app/controllers/dummy_autocompletes_controller.rb +4 -0
- data/spec/redmine/plugins/dummy_plugin/app/views/dummy_autocompletes/index.html.erb +3 -0
- data/spec/redmine/plugins/dummy_plugin/config/locales/en.yml +2 -0
- data/spec/redmine/plugins/dummy_plugin/config/routes.rb +1 -0
- data/spec/redmine/plugins/dummy_plugin/init.rb +34 -0
- data/spec/redmine/plugins/dummy_plugin/lib/dummy_plugin/easy_patch/redmine/controllers/issues_controller_patch.example +30 -0
- data/spec/redmine/plugins/dummy_plugin/lib/dummy_plugin/easy_patch/redmine/helpers/issues_helper_patch.example +30 -0
- data/spec/redmine/plugins/dummy_plugin/lib/dummy_plugin/easy_patch/redmine/models/issue_patch.example +30 -0
- data/spec/redmine/plugins/dummy_plugin/lib/dummy_plugin/hooks.rb +5 -0
- data/spec/redmine/plugins/dummy_plugin/lib/dummy_plugin/internals.rb +4 -0
- data/spec/redmine/public/images/jstoolbar/bt_precode.png +0 -0
- data/spec/redmine/public/images/reorder.png +0 -0
- data/spec/redmine/public/javascripts/jquery-1.11.1-ui-1.11.0-ujs-3.1.4.js +21 -0
- data/spec/redmine/public/javascripts/redmine_extensions/application.js +13 -0
- data/spec/redmine/public/javascripts/redmine_extensions/easy_togglers.js +58 -0
- data/spec/redmine/public/javascripts/redmine_extensions/jquery.entityarray.js +130 -0
- data/spec/redmine/public/javascripts/redmine_extensions/redmine_extensions.js +642 -0
- data/spec/redmine/public/javascripts/responsive.js +83 -0
- data/spec/redmine/public/stylesheets/responsive.css +799 -0
- data/spec/redmine/test/fixtures/files/import_dates.csv +4 -0
- data/spec/redmine/test/fixtures/files/import_iso8859-1.csv +3 -0
- data/spec/redmine/test/fixtures/files/import_issues.csv +4 -0
- data/spec/redmine/test/fixtures/ldap/slapd.centos6.conf +24 -0
- data/spec/redmine/test/fixtures/ldap/slapd.ubuntu.12.04.conf +23 -0
- data/spec/redmine/test/fixtures/mail_handler/issue_update_with_cc.eml +19 -0
- data/spec/redmine/test/fixtures/mail_handler/ticket_on_project_given_by_to_header.eml +60 -0
- data/spec/redmine/test/fixtures/mail_handler/ticket_with_text_attachment_iso-8859-2.eml +31 -0
- data/spec/redmine/test/functional/custom_field_enumerations_controller_test.rb +115 -0
- data/spec/redmine/test/functional/imports_controller_test.rb +205 -0
- data/spec/redmine/test/functional/sessions_controller_test.rb +138 -0
- data/spec/redmine/test/integration/api_test/search_test.rb +92 -0
- data/spec/redmine/test/integration/routing/imports_test.rb +36 -0
- data/spec/redmine/test/integration/sessions_test.rb +97 -0
- data/spec/redmine/test/ui/custom_fields_test_ui.rb +38 -0
- data/spec/redmine/test/unit/attachment_transaction_test.rb +76 -0
- data/spec/redmine/test/unit/helpers/journals_helper_test.rb +48 -0
- data/spec/redmine/test/unit/helpers/wiki_helper_test.rb +45 -0
- data/spec/redmine/test/unit/issue_import_test.rb +178 -0
- data/spec/redmine/test/unit/lib/redmine/acts/positioned_with_scope_test.rb +53 -0
- data/spec/redmine/test/unit/lib/redmine/acts/positioned_without_scope_test.rb +55 -0
- data/spec/redmine/test/unit/lib/redmine/field_format/enumeration_format_test.rb +91 -0
- data/spec/support/easy_queries_helpers.rb +0 -0
- metadata +216 -10
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<h2><%= l(:label_revision) %> <%= format_revision(@changeset) %></h2>
|
|
2
|
+
|
|
3
|
+
<div class="details">
|
|
4
|
+
<h4>
|
|
5
|
+
<%= avatar(@changeset.user, :size => "24") %>
|
|
6
|
+
<%= authoring(@changeset.committed_on, @changeset.author) %>
|
|
7
|
+
</h4>
|
|
8
|
+
<% if @changeset.scmid.present? || @changeset.parents.present? || @changeset.children.present? %>
|
|
9
|
+
<ul class="revision-info">
|
|
10
|
+
<% if @changeset.scmid.present? %>
|
|
11
|
+
<li>
|
|
12
|
+
<strong>ID </strong><%= @changeset.scmid %>
|
|
13
|
+
</li>
|
|
14
|
+
<% end %>
|
|
15
|
+
<% if @changeset.parents.present? %>
|
|
16
|
+
<li>
|
|
17
|
+
<strong><%= l(:label_parent_revision) %></strong>
|
|
18
|
+
<%= @changeset.parents.collect{
|
|
19
|
+
|p| link_to_revision(p, @repository, :text => format_revision(p))
|
|
20
|
+
}.join(", ").html_safe %>
|
|
21
|
+
</li>
|
|
22
|
+
<% end %>
|
|
23
|
+
<% if @changeset.children.present? %>
|
|
24
|
+
<li>
|
|
25
|
+
<strong><%= l(:label_child_revision) %></strong>
|
|
26
|
+
<%= @changeset.children.collect{
|
|
27
|
+
|p| link_to_revision(p, @repository, :text => format_revision(p))
|
|
28
|
+
}.join(", ").html_safe %>
|
|
29
|
+
</li>
|
|
30
|
+
<% end %>
|
|
31
|
+
</ul>
|
|
32
|
+
<% end %>
|
|
33
|
+
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<%= textilizable @changeset.comments %>
|
|
37
|
+
|
|
38
|
+
<% if @changeset.issues.visible.any? || User.current.allowed_to?(:manage_related_issues, @repository.project) %>
|
|
39
|
+
<%= render :partial => 'related_issues' %>
|
|
40
|
+
<% end %>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
api.array :results, api_meta(:total_count => @result_count, :offset => @offset, :limit => @limit) do
|
|
2
|
+
@results.each do |result|
|
|
3
|
+
api.result do
|
|
4
|
+
api.id result.id
|
|
5
|
+
api.title result.event_title
|
|
6
|
+
api.type result.event_type
|
|
7
|
+
api.url url_for(result.event_url(:only_path => false))
|
|
8
|
+
api.description result.event_description
|
|
9
|
+
api.datetime result.event_datetime
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%= form_tag({:action => 'edit', :tab => 'attachments'}) do %>
|
|
2
|
+
|
|
3
|
+
<div class="box tabular settings">
|
|
4
|
+
<p><%= setting_text_field :attachment_max_size, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %></p>
|
|
5
|
+
|
|
6
|
+
<p><%= setting_text_area :attachment_extensions_allowed %>
|
|
7
|
+
<em class="info"><%= l(:text_comma_separated) %> <%= l(:label_example) %>: txt, png</em></p>
|
|
8
|
+
|
|
9
|
+
<p><%= setting_text_area :attachment_extensions_denied %>
|
|
10
|
+
<em class="info"><%= l(:text_comma_separated) %> <%= l(:label_example) %>: js, swf</em></p>
|
|
11
|
+
|
|
12
|
+
<p><%= setting_text_field :file_max_size_displayed, :size => 6 %> <%= l(:"number.human.storage_units.units.kb") %></p>
|
|
13
|
+
|
|
14
|
+
<p><%= setting_text_field :diff_max_lines_displayed, :size => 6 %></p>
|
|
15
|
+
|
|
16
|
+
<p><%= setting_text_field :repositories_encodings, :size => 60 %>
|
|
17
|
+
<em class="info"><%= l(:text_comma_separated) %></em></p>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<%= submit_tag l(:button_save) %>
|
|
21
|
+
<% end %>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<h3 class="title"><%=l(:label_wiki_page_new)%></h3>
|
|
2
|
+
|
|
3
|
+
<%= labelled_form_for :page, @page,
|
|
4
|
+
:url => new_project_wiki_page_path(@project),
|
|
5
|
+
:method => 'post',
|
|
6
|
+
:remote => true do |f| %>
|
|
7
|
+
|
|
8
|
+
<%= render_error_messages @page.errors.full_messages_for(:title) %>
|
|
9
|
+
|
|
10
|
+
<div class="box tabular">
|
|
11
|
+
<p>
|
|
12
|
+
<%= f.text_field :title, :name => 'title', :size => 60, :required => true %>
|
|
13
|
+
<em class="info"><%= l(:text_unallowed_characters) %>: , . / ? ; : |</em>
|
|
14
|
+
</p>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<p class="buttons">
|
|
18
|
+
<%= submit_tag l(:label_next), :name => nil %>
|
|
19
|
+
<%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %>
|
|
20
|
+
</p>
|
|
21
|
+
<% end %>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<%= title l(:label_wiki_page_new) %>
|
|
2
|
+
|
|
3
|
+
<%= labelled_form_for :page, @page,
|
|
4
|
+
:url => new_project_wiki_page_path(@project) do |f| %>
|
|
5
|
+
|
|
6
|
+
<%= render_error_messages @page.errors.full_messages_for(:title) %>
|
|
7
|
+
|
|
8
|
+
<div class="box tabular">
|
|
9
|
+
<p>
|
|
10
|
+
<%= f.text_field :title, :name => 'title', :size => 60, :required => true %>
|
|
11
|
+
<em class="info"><%= l(:text_unallowed_characters) %>: , . / ? ; : |</em>
|
|
12
|
+
</p>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<%= submit_tag(l(:label_next)) %>
|
|
16
|
+
|
|
17
|
+
<% end %>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Redmine runs tests on own continuous integration server.
|
|
2
|
+
# http://www.redmine.org/projects/redmine/wiki/Continuous_integration
|
|
3
|
+
# You can also run tests on your environment.
|
|
4
|
+
|
|
5
|
+
install:
|
|
6
|
+
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
|
7
|
+
- ruby --version
|
|
8
|
+
- gem --version
|
|
9
|
+
- git --version
|
|
10
|
+
- hg --version
|
|
11
|
+
|
|
12
|
+
build: off
|
|
13
|
+
|
|
14
|
+
test_script:
|
|
15
|
+
- bundle install --without rmagick
|
|
16
|
+
- set SCMS=mercurial
|
|
17
|
+
- set RUN_ON_NOT_OFFICIAL=
|
|
18
|
+
- set RUBY_VER=1.9
|
|
19
|
+
- set BRANCH=trunk
|
|
20
|
+
- bundle exec rake config/database.yml
|
|
21
|
+
- bundle install
|
|
22
|
+
- bundle exec rake ci:setup
|
|
23
|
+
- bundle exec rake test
|
|
24
|
+
|
|
25
|
+
environment:
|
|
26
|
+
global:
|
|
27
|
+
RAILS_ENV: test
|
|
28
|
+
DATABASE_ADAPTER: sqlite3
|
|
29
|
+
matrix:
|
|
30
|
+
- ruby_version: "193"
|
|
31
|
+
- ruby_version: "200"
|
|
32
|
+
- ruby_version: "200-x64"
|
|
33
|
+
- ruby_version: "21"
|
|
34
|
+
- ruby_version: "21-x64"
|
|
35
|
+
- ruby_version: "22"
|
|
36
|
+
- ruby_version: "22-x64"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class InsertAllowedStatusesForNewIssues < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
# Adds the default status for all trackers and roles
|
|
4
|
+
sql = "INSERT INTO #{WorkflowTransition.table_name} (tracker_id, old_status_id, new_status_id, role_id, type)" +
|
|
5
|
+
" SELECT t.id, 0, t.default_status_id, r.id, 'WorkflowTransition'" +
|
|
6
|
+
" FROM #{Tracker.table_name} t, #{Role.table_name} r"
|
|
7
|
+
WorkflowTransition.connection.execute(sql)
|
|
8
|
+
|
|
9
|
+
# Adds other statuses that are reachable with one transition
|
|
10
|
+
# to preserve previous behaviour as default
|
|
11
|
+
sql = "INSERT INTO #{WorkflowTransition.table_name} (tracker_id, old_status_id, new_status_id, role_id, type)" +
|
|
12
|
+
" SELECT t.id, 0, w.new_status_id, w.role_id, 'WorkflowTransition'" +
|
|
13
|
+
" FROM #{Tracker.table_name} t" +
|
|
14
|
+
" JOIN #{IssueStatus.table_name} s on s.id = t.default_status_id" +
|
|
15
|
+
" JOIN #{WorkflowTransition.table_name} w on w.tracker_id = t.id and w.old_status_id = s.id and w.type = 'WorkflowTransition'" +
|
|
16
|
+
" WHERE w.new_status_id <> t.default_status_id"
|
|
17
|
+
WorkflowTransition.connection.execute(sql)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.down
|
|
21
|
+
WorkflowTransition.where(:old_status_id => 0).delete_all
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class CreateImports < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :imports do |t|
|
|
4
|
+
t.string :type
|
|
5
|
+
t.integer :user_id, :null => false
|
|
6
|
+
t.string :filename
|
|
7
|
+
t.text :settings
|
|
8
|
+
t.integer :total_items
|
|
9
|
+
t.boolean :finished, :null => false, :default => false
|
|
10
|
+
t.timestamps :null => false
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class ChangeWikiContentsCommentsLimitTo1024 < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
change_column :wiki_content_versions, :comments, :string, :limit => 1024, :default => ''
|
|
4
|
+
change_column :wiki_contents, :comments, :string, :limit => 1024, :default => ''
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def self.down
|
|
8
|
+
change_column :wiki_content_versions, :comments, :string, :limit => 255, :default => ''
|
|
9
|
+
change_column :wiki_contents, :comments, :string, :limit => 255, :default => ''
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class ChangeAttachmentsFilesizeLimitTo8 < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
change_column :attachments, :filesize, :integer, :limit => 8, :default => 0, :null => false
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.down
|
|
7
|
+
change_column :attachments, :filesize, :integer, :limit => 4, :default => 0, :null => false
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class FixCommaInUserFormatSettingValue < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
Setting.
|
|
4
|
+
where(:name => 'user_format', :value => 'lastname_coma_firstname').
|
|
5
|
+
update_all(:value => 'lastname_comma_firstname')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.down
|
|
9
|
+
Setting.
|
|
10
|
+
where(:name => 'user_format', :value => 'lastname_comma_firstname').
|
|
11
|
+
update_all(:value => 'lastname_coma_firstname')
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class ChangeIssueCategoriesNameLimitTo60 < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
change_column :issue_categories, :name, :string, :limit => 60, :default => "", :null => false
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.down
|
|
7
|
+
change_column :issue_categories, :name, :string, :limit => 30, :default => "", :null => false
|
|
8
|
+
end
|
|
9
|
+
end
|
data/spec/redmine/db/migrate/20151021190616_change_user_preferences_hide_mail_default_to_true.rb
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class ChangeUserPreferencesHideMailDefaultToTrue < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
change_column :user_preferences, :hide_mail, :boolean, :default => true
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.down
|
|
7
|
+
change_column :user_preferences, :hide_mail, :boolean, :default => false
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class CreateCustomFieldEnumerations < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :custom_field_enumerations do |t|
|
|
4
|
+
t.integer :custom_field_id, :null => false
|
|
5
|
+
t.string :name, :null => false
|
|
6
|
+
t.boolean :active, :default => true, :null => false
|
|
7
|
+
t.integer :position, :default => 1, :null => false
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class AddProjectsDefaultVersionId < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
# Don't try to add the column if redmine_default_version plugin was used
|
|
4
|
+
unless column_exists?(:projects, :default_version_id, :integer)
|
|
5
|
+
add_column :projects, :default_version_id, :integer, :default => nil
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.down
|
|
10
|
+
remove_column :projects, :default_version_id
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class ForcePasswordResetDuringSetup < ActiveRecord::Migration
|
|
2
|
+
def up
|
|
3
|
+
User.where(login: "admin", last_login_on: nil).update_all(must_change_passwd: true)
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def down
|
|
7
|
+
User.where(login: "admin", last_login_on: nil, must_change_passwd: true).update_all(must_change_passwd: false)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class RemovePositionDefaults < ActiveRecord::Migration
|
|
2
|
+
def up
|
|
3
|
+
[Board, CustomField, Enumeration, IssueStatus, Role, Tracker].each do |klass|
|
|
4
|
+
change_column klass.table_name, :position, :integer, :default => nil
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def down
|
|
9
|
+
[Board, CustomField, Enumeration, IssueStatus, Role, Tracker].each do |klass|
|
|
10
|
+
change_column klass.table_name, :position, :integer, :default => 1
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Redmine - project management software
|
|
2
|
+
# Copyright (C) 2006-2016 Jean-Philippe Lang
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or
|
|
5
|
+
# modify it under the terms of the GNU General Public License
|
|
6
|
+
# as published by the Free Software Foundation; either version 2
|
|
7
|
+
# of the License, or (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
17
|
+
|
|
18
|
+
module Redmine
|
|
19
|
+
module Acts
|
|
20
|
+
module Positioned
|
|
21
|
+
def self.included(base)
|
|
22
|
+
base.extend ClassMethods
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# This extension provides the capabilities for reordering objects in a list.
|
|
26
|
+
# The class needs to have a +position+ column defined as an integer on the
|
|
27
|
+
# mapped database table.
|
|
28
|
+
module ClassMethods
|
|
29
|
+
# Configuration options are:
|
|
30
|
+
#
|
|
31
|
+
# * +scope+ - restricts what is to be considered a list. Must be a symbol
|
|
32
|
+
# or an array of symbols
|
|
33
|
+
def acts_as_positioned(options = {})
|
|
34
|
+
class_attribute :positioned_options
|
|
35
|
+
self.positioned_options = {:scope => Array(options[:scope])}
|
|
36
|
+
|
|
37
|
+
send :include, Redmine::Acts::Positioned::InstanceMethods
|
|
38
|
+
|
|
39
|
+
before_save :set_default_position
|
|
40
|
+
after_save :update_position
|
|
41
|
+
after_destroy :remove_position
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
module InstanceMethods
|
|
46
|
+
def self.included(base)
|
|
47
|
+
base.extend ClassMethods
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def position_scope
|
|
53
|
+
build_position_scope {|c| send(c)}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def position_scope_was
|
|
57
|
+
build_position_scope {|c| send("#{c}_was")}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def build_position_scope
|
|
61
|
+
condition_hash = self.class.positioned_options[:scope].inject({}) do |h, column|
|
|
62
|
+
h[column] = yield(column)
|
|
63
|
+
h
|
|
64
|
+
end
|
|
65
|
+
self.class.where(condition_hash)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def set_default_position
|
|
69
|
+
if position.nil?
|
|
70
|
+
self.position = position_scope.maximum(:position).to_i + (new_record? ? 1 : 0)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def update_position
|
|
75
|
+
if !new_record? && position_scope_changed?
|
|
76
|
+
remove_position
|
|
77
|
+
insert_position
|
|
78
|
+
elsif position_changed?
|
|
79
|
+
if position_was.nil?
|
|
80
|
+
insert_position
|
|
81
|
+
else
|
|
82
|
+
shift_positions
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def insert_position
|
|
88
|
+
position_scope.where("position >= ? AND id <> ?", position, id).update_all("position = position + 1")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def remove_position
|
|
92
|
+
position_scope_was.where("position >= ? AND id <> ?", position_was, id).update_all("position = position - 1")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def position_scope_changed?
|
|
96
|
+
(changed & self.class.positioned_options[:scope].map(&:to_s)).any?
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def shift_positions
|
|
100
|
+
offset = position_was <=> position
|
|
101
|
+
min, max = [position, position_was].sort
|
|
102
|
+
r = position_scope.where("id <> ? AND position BETWEEN ? AND ?", id, min, max).update_all("position = position + #{offset}")
|
|
103
|
+
if r != max - min
|
|
104
|
+
reset_positions_in_list
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def reset_positions_in_list
|
|
109
|
+
position_scope.reorder(:position, :id).pluck(:id).each_with_index do |record_id, p|
|
|
110
|
+
self.class.where(:id => record_id).update_all(:position => p+1)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
ActiveRecord::Base.send :include, Redmine::Acts::Positioned
|