diff --git a/app/views/settings/_default_assign.erb b/app/views/settings/_default_assign.erb index 9b514b3..e7ab013 100644 --- a/app/views/settings/_default_assign.erb +++ b/app/views/settings/_default_assign.erb @@ -12,31 +12,42 @@ -%> <% unless users.empty? %> - <%= - select_tag("settings[default_assignee_id]", - content_tag(:option, '') + - options_from_collection_for_select(users, :id, :name, - unless selected.blank? - Integer(selected) - end - ), - :multiple => false, - :size => 5) - %> - <% else %> - <%= link_to(l(:default_assign_missing_users), - :controller => 'users', :action => 'index') %> - <% end %> -

+ <%= + select_tag("settings[default_assignee_id]", + content_tag(:option, '') + + options_from_collection_for_select(users, :id, :name, + unless selected.blank? + Integer(selected) + end + ), + :multiple => false, + :size => 5) + %> + <% else %> + <%= link_to(l(:default_assign_missing_users), + :controller => 'users', :action => 'index') %> + <% end %> +

-

<%= l(:interactive_assignment_explanation) %>

-

- <%= label('settings[interactive_assignment]', l(:interactive_assignment)) %> - <%- - interactive_assignment = @settings['interactive_assignment'] || 'true' - interactive_assignment = (interactive_assignment == 'true') - -%> - <%= hidden_field_tag('settings[interactive_assignment]', false) %> - <%= check_box_tag('settings[interactive_assignment]', true, interactive_assignment) %> -

+

<%= l(:interactive_assignment_explanation) %>

+

+ <%= label('settings[interactive_assignment]', l(:interactive_assignment)) %> + <%- + interactive_assignment = @settings['interactive_assignment'] || 'true' + interactive_assignment = (interactive_assignment == 'true') + -%> + <%= hidden_field_tag('settings[interactive_assignment]', false) %> + <%= check_box_tag('settings[interactive_assignment]', true, interactive_assignment) %> +

+ +

<%= l(:self_assignment_explanation) %>

+

+ <%= label('settings[self_assignment]', l(:self_assignment)) %> + <%- + self_assignment = @settings['self_assignment'] || 'false' + self_assignment = (self_assignment == 'true') + -%> + <%= hidden_field_tag('settings[self_assignment]', false) %> + <%= check_box_tag('settings[self_assignment]', true, self_assignment) %> +

diff --git a/config/locales/de.yml b/config/locales/de.yml index b4a1513..c68a3b7 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -11,3 +11,9 @@ de: interactive_assignment: "Zuständigen interaktiv setzen" label_user: "Benutzer" none_selected: "" + self_assignment: "Assign issue author" + self_assignment_explanation: > + When a new issue is created with no assignee, and the project has no default + assignee set, tick the box below to assign the issue to the user who just + created the issue, if possible. If the box is left unticked, there will be + no assignee, which is the default behaviour in Redmine. diff --git a/config/locales/en.yml b/config/locales/en.yml index 8c6b96d..edc129c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -12,3 +12,9 @@ en: interactive_assignment: "Set Assignee Interactively" label_user: "User" none_selected: "" + self_assignment: "Assign issue author" + self_assignment_explanation: > + When a new issue is created with no assignee, and the project has no default + assignee set, tick the box below to assign the issue to the user who just + created the issue, if possible. If the box is left unticked, there will be + no assignee, which is the default behaviour in Redmine. diff --git a/config/locales/es.yml b/config/locales/es.yml index 3b26bb8..09847b4 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -12,3 +12,9 @@ es: interactive_assignment: "Set Assignee Interactively" label_user: "Usuario" none_selected: "" + self_assignment: "Assign issue author" + self_assignment_explanation: > + When a new issue is created with no assignee, and the project has no default + assignee set, tick the box below to assign the issue to the user who just + created the issue, if possible. If the box is left unticked, there will be + no assignee, which is the default behaviour in Redmine. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index e465f76..d3c07be 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -5,7 +5,7 @@ fr: default_assign_settings_help: "Assignement par defaut pour les nouveaux projets" interactive_assignment: "Assignement interactif" interactive_assignment_explanation: > - Quand vous créez une nouvel demande, le plugin peut peupler le champs + Quand vous créez une nouvelle demande, le plugin peut peupler le champs "Assigné à" immédiatement avec le choix vous avez faite si dessus avant que vous ayez créé la demande. Par contre, quand vous changiez certains champs, le formulaire est rechargé et le champs "Assigné à" est calculé @@ -13,3 +13,10 @@ fr: vous pouvez faire le choix vous-même: label_user: "Utilisateur" none_selected: "" + self_assignment: "Assignement de l'auteur" + self_assignment_explanation: > + Quand on crée une nouvelle demande sans assignement, et il n'y a aucun + assignement par défaut spécifié pour le project, sélectionez la case + si-dessous pour tentir l'assignement de l'auteur de la demande. Sans + sélection, il n'y aura aucun assignement pour la demande, ce qui est le + comportement normal de Redmine. diff --git a/config/locales/it.yml b/config/locales/it.yml index d048bb7..328df76 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -13,3 +13,9 @@ it: interactive_assignment: "Imposta l'assegnatario in maniera interattiva" label_user: "Utente" none_selected: "" + self_assignment: "Assign issue author" + self_assignment_explanation: > + When a new issue is created with no assignee, and the project has no default + assignee set, tick the box below to assign the issue to the user who just + created the issue, if possible. If the box is left unticked, there will be + no assignee, which is the default behaviour in Redmine. diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 47ed345..9bb103f 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -12,3 +12,9 @@ ja: interactive_assignment: "Set Assignee Interactively" label_user: "ユーザー" none_selected: "" + self_assignment: "Assign issue author" + self_assignment_explanation: > + When a new issue is created with no assignee, and the project has no default + assignee set, tick the box below to assign the issue to the user who just + created the issue, if possible. If the box is left unticked, there will be + no assignee, which is the default behaviour in Redmine. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index aa13974..c455c22 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -9,6 +9,12 @@ ru: Однако, при изменении некоторых полей, форма может быть перезагружена и ответственный по умолчанию переназначается. Такое поведение может быть приемлимым, либо нежелательным. Выбор за вами: - interactive_assignment: "Выберать ответственного интерактивно" + interactive_assignment: "Выбирать ответственного интерактивно" label_user: "Пользователь" none_selected: "<Пусто>" + self_assignment: "Назначать задачу на автора" + self_assignment_explanation: > + Если этот пунт выбран - при создании новой задачи, если не выбрано на кого + назначить задачу и если в проекте не выбрано на кого назначать по умолчанию, + то задача будет назначена на автора задачи. Если этот пункт не выбран + задача не будет ни на кого назначена - как сделано в Redmine по умолчанию. diff --git a/db/migrate/001_add_default_assignee_to_project.rb.old b/db/migrate/001_add_default_assignee_to_project.rb.old new file mode 100644 index 0000000..9b6e44e --- /dev/null +++ b/db/migrate/001_add_default_assignee_to_project.rb.old @@ -0,0 +1,17 @@ +class AddDefaultAssigneeToProject < ActiveRecord::Migration[4.2] + def self.up + # Work around migration name change (Github issue #27) + old_num = '20090508035844' + num_deleted = + ::ActiveRecord::Base.connection.delete(<<-SQL.squish) + delete from schema_migrations + where version = '#{old_num}-redmine_default_assign' + SQL + return if num_deleted > 0 + add_column :projects, :default_assignee_id, :integer + end + + def self.down + remove_column :projects, :default_assignee_id + end +end diff --git a/db/migrate/20090508035844_add_default_assignee_to_project.rb b/db/migrate/20090508035844_add_default_assignee_to_project.rb index 10e26df..ef991ff 100644 --- a/db/migrate/20090508035844_add_default_assignee_to_project.rb +++ b/db/migrate/20090508035844_add_default_assignee_to_project.rb @@ -1,4 +1,4 @@ -class AddDefaultAssigneeToProject < ActiveRecord::Migration +class AddDefaultAssigneeToProject < ActiveRecord::Migration[5.2] def self.up add_column :projects, :default_assignee_id, :integer end diff --git a/init.rb b/init.rb index 228232f..afde2b0 100644 --- a/init.rb +++ b/init.rb @@ -9,7 +9,7 @@ require 'default_assign/hooks/default_assign_issues_hooks.rb' if Rails::VERSION::MAJOR >= 3 - ActionDispatch::Callbacks.to_prepare do + ((Rails.version > "5")? ActiveSupport::Reloader : ActionDispatch::Callbacks).to_prepare do require_dependency 'project' require_dependency 'issue' Project.send(:include, DefaultAssignProjectPatch) @@ -27,10 +27,12 @@ Redmine::Plugin.register :redmine_default_assign do name 'Default Assign plugin' author 'Robert Chady / Paul Dann' + author_url 'https://github.com/giddie/redmine_default_assign' description 'Plugin implementing Douglas Campos\' ticket-482 code as a plugin. It has since been extended to offer other features as well.' - version '0.4' + version '0.6' settings :default => {'default_assignee_id' => nil, - 'interactive_assignment' => true}, + 'interactive_assignment' => true, + 'self_assignment' => false}, :partial => 'settings/default_assign' end diff --git a/lib/default_assign/hooks/default_assign_issues_hooks.rb b/lib/default_assign/hooks/default_assign_issues_hooks.rb index 3b0f3ab..9ef5283 100644 --- a/lib/default_assign/hooks/default_assign_issues_hooks.rb +++ b/lib/default_assign/hooks/default_assign_issues_hooks.rb @@ -9,13 +9,19 @@ def view_issues_form_details_top(context = {}) interactive_assignment = (interactive_assignment == 'true') return if not interactive_assignment - if not context[:project].default_assignee.blank? - default_assignee = context[:project].default_assignee - if context[:project].assignable_users.include?(default_assignee) - context[:issue].assigned_to_id = default_assignee.id - end + project = context[:project] + if project.try(:default_assignee).blank? + self_assignment = + Setting.plugin_redmine_default_assign['self_assignment'] || 'false' + self_assignment = (self_assignment == 'true') + default_assignee = User.current if self_assignment + else + default_assignee = project.default_assignee + end + if project && project.assignable_users.include?(default_assignee) + context[:issue].assigned_to_id = default_assignee.id end nil - end + end end diff --git a/lib/default_assign_issue_patch.rb b/lib/default_assign_issue_patch.rb index 741d75b..42d6fb1 100644 --- a/lib/default_assign_issue_patch.rb +++ b/lib/default_assign_issue_patch.rb @@ -6,9 +6,9 @@ def self.included(base) # :nodoc: # Same as typing in the class base.class_eval do - unloadable # Send unloadable so it will not be unloaded in development + unloadable - before_save :assign_default_assignee + before_create :assign_default_assignee end end @@ -16,12 +16,21 @@ module InstanceMethods # If the issue isn't assigned to someone and a default assignee # is set, set it. def assign_default_assignee + return if not self.assigned_to.nil? default_assignee = self.project.default_assignee - unless default_assignee.blank? - if self.project.assignable_users.include?(default_assignee) - self.assigned_to ||= self.project.default_assignee + if default_assignee.blank? + self_assignment = + Setting.plugin_redmine_default_assign['self_assignment'] || 'false' + self_assignment = (self_assignment == 'true') + if self_assignment + default_assignee = User.current + else + return end end + if self.project.assignable_users.include?(default_assignee) + self.assigned_to = default_assignee + end end end end diff --git a/lib/default_assign_project_patch.rb b/lib/default_assign_project_patch.rb index 9fd2372..e5ecaeb 100644 --- a/lib/default_assign_project_patch.rb +++ b/lib/default_assign_project_patch.rb @@ -8,7 +8,7 @@ def self.included(base) safe_attributes :default_assignee_id belongs_to :default_assignee, :class_name => "Principal" - before_save :set_default_assignee + before_create :set_default_assignee end end @@ -16,11 +16,9 @@ def self.included(base) #end module InstanceMethods - def set_default_assignee - if not self.persisted? - self.default_assignee_id ||= - Setting.plugin_redmine_default_assign['default_assignee_id'] - end + def set_default_assignee + self.default_assignee_id ||= + Setting.plugin_redmine_default_assign['default_assignee_id'] end end end