diff --git a/app/models/issue.rb b/app/models/issue.rb index a73160e577f4e8f02257bfdacd5b755a4aa55cb5..0e9e7745a8578ae719ca528a3851f322e4f7d22b 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -59,6 +59,11 @@ class Issue < ActiveRecord::Base if start_date && soonest_start && start_date < soonest_start errors.add :start_date, :activerecord_error_invalid end + + # validate assignment + if assigned_to && !assignable_users.include?(assigned_to) + errors.add :assigned_to_id, :activerecord_error_invalid + end end def before_create @@ -105,6 +110,11 @@ class Issue < ActiveRecord::Base @current_journal end + # Users the issue can be assigned to + def assignable_users + project.members.select {|m| m.role.assignable?}.collect {|m| m.user} + end + def spent_hours @spent_hours ||= time_entries.sum(:hours) || 0 end diff --git a/app/views/issues/change_status.rhtml b/app/views/issues/change_status.rhtml index 550a5d6e0d6df8b966840d4b4512d5bbf7488bdc..79a4412dbf2edcf3c0c30661da75d7e053798688 100644 --- a/app/views/issues/change_status.rhtml +++ b/app/views/issues/change_status.rhtml @@ -10,7 +10,7 @@ <div class="box"> <div class="splitcontentleft"> <p><label><%=l(:label_issue_status_new)%></label> <%= @new_status.name %></p> -<p><%= f.select :assigned_to_id, (@issue.project.members.collect {|m| [m.name, m.user_id]}), :include_blank => true %></p> +<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p> <p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p> <p><%= f.select :fixed_version_id, (@project.versions.sort.collect {|v| [v.name, v.id]}), { :include_blank => true } %></p> </div> diff --git a/app/views/issues/edit.rhtml b/app/views/issues/edit.rhtml index 18d6e0108c73ceca1126bb916f8234c7c13a7b68..f131041edb604c20b4573bc74c7c7de90a623cbe 100644 --- a/app/views/issues/edit.rhtml +++ b/app/views/issues/edit.rhtml @@ -7,7 +7,7 @@ <div class="splitcontentleft"> <p><label><%=l(:field_status)%></label> <%= @issue.status.name %></p> <p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p> -<p><%= f.select :assigned_to_id, (@issue.project.members.collect {|m| [m.name, m.user_id]}), :include_blank => true %></p> +<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p> <p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %> <%= prompt_to_remote(l(:label_issue_category_new), l(:label_issue_category_new), 'category[name]', diff --git a/app/views/projects/add_issue.rhtml b/app/views/projects/add_issue.rhtml index d35f7f4845f148c33f29f0b1787f03b6cd27f7b7..1793ef1d8386d47970ad6a2e67e17bdeac8dbe49 100644 --- a/app/views/projects/add_issue.rhtml +++ b/app/views/projects/add_issue.rhtml @@ -9,7 +9,7 @@ <div class="splitcontentleft"> <p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p> <p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p> -<p><%= f.select :assigned_to_id, (@issue.project.members.collect {|m| [m.name, m.user_id]}), :include_blank => true %></p> +<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p> <p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %> <%= prompt_to_remote(l(:label_issue_category_new), l(:label_issue_category_new), 'category[name]', diff --git a/app/views/roles/_form.rhtml b/app/views/roles/_form.rhtml index a80d990f99277c42a2bf4e2693147f8688fd7d70..d69fff132df50143727932a51e852b82bc26d049 100644 --- a/app/views/roles/_form.rhtml +++ b/app/views/roles/_form.rhtml @@ -2,6 +2,8 @@ <div class="box"> <!--[form:role]--> <p><%= f.text_field :name, :required => true %></p> +<p><%= f.check_box :assignable %></p> +<div class="clear"></div> <h3><%=l(:label_permissions)%></h3> <% permissions = @permissions.group_by {|p| p.group_id } %> diff --git a/db/migrate/059_add_roles_assignable.rb b/db/migrate/059_add_roles_assignable.rb new file mode 100644 index 0000000000000000000000000000000000000000..a1ba7963433151164d1145d5d4bb17952f67f474 --- /dev/null +++ b/db/migrate/059_add_roles_assignable.rb @@ -0,0 +1,9 @@ +class AddRolesAssignable < ActiveRecord::Migration + def self.up + add_column :roles, :assignable, :boolean, :default => true + end + + def self.down + remove_column :roles, :assignable + end +end diff --git a/lang/bg.yml b/lang/bg.yml index 337b167b5832719927349aa660a082531005db57..9f616532d4357ce908818ff2efa1f6663109d1ae 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -155,6 +155,7 @@ field_identifier: Идентификатор field_is_filter: Използва Ñе за филтър field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: Заглавие setting_app_subtitle: ОпиÑание diff --git a/lang/de.yml b/lang/de.yml index 32ad4bcee75c4b34e9091c2cba04ffb9c749112a..da9f7ff8921bbfc561a6da35a94ab618d6ced3e7 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -155,6 +155,7 @@ field_identifier: Identifier field_is_filter: Used as a filter field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: Applikation Titel setting_app_subtitle: Applikation Untertitel diff --git a/lang/en.yml b/lang/en.yml index 3488ee345938c9e48f564ab3efa63e64a233cb7a..c7dd0d2efb79006ebd105bd2bb639e4035827df6 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -155,6 +155,7 @@ field_identifier: Identifier field_is_filter: Used as a filter field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: Application title setting_app_subtitle: Application subtitle diff --git a/lang/es.yml b/lang/es.yml index 26eca0bca778185a3795a85b1df6d539bdaf8b61..5bf61df6afe258d5be671ce1310f2c1973d61851 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -155,6 +155,7 @@ field_identifier: Identifier field_is_filter: Used as a filter field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: TÃtulo del aplicación setting_app_subtitle: SubtÃtulo del aplicación diff --git a/lang/fr.yml b/lang/fr.yml index 364359787a5f1ba23f63de54eed591163b0091da..ca1fb16bece72357542e14859497f8380a362fe0 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -155,6 +155,7 @@ field_identifier: Identifiant field_is_filter: Utilisé comme filtre field_issue_to_id: Demande liée field_delay: Retard +field_assignable: Demandes assignables à ce rôle setting_app_title: Titre de l'application setting_app_subtitle: Sous-titre de l'application diff --git a/lang/it.yml b/lang/it.yml index d3f04b9c6662746e41150f4b8b5d2a3f8c0dbafb..b568873e73babad2782c195cadb6d8dae9293c6a 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -155,6 +155,7 @@ field_identifier: Identifier field_is_filter: Used as a filter field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: Titolo applicazione setting_app_subtitle: Sottotitolo applicazione diff --git a/lang/ja.yml b/lang/ja.yml index 703652bcc43250ab6af0e0ece5840cbb62274d7e..87fe5eb36899418da2236be2073a54284eee4d96 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -156,6 +156,7 @@ field_identifier: è˜åˆ¥å field_is_filter: フィルタã¨ã—ã¦ä½¿ã† field_issue_to_id: 関連ã™ã‚‹å•é¡Œ field_delay: é…延 +field_assignable: Issues can be assigned to this role setting_app_title: アプリケーションã®ã‚¿ã‚¤ãƒˆãƒ« setting_app_subtitle: アプリケーションã®ã‚µãƒ–タイトル diff --git a/lang/nl.yml b/lang/nl.yml index 29b7751c57d3856d43cd1b74306e4962e6decea2..b80467aec6fe90f0b586bb66755bfbcfe7ba9b3b 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -155,6 +155,7 @@ field_identifier: Identificatiecode field_is_filter: Gebruikt als een filter field_issue_to_id: Gerelateerd issue field_delay: Vertraging +field_assignable: Issues can be assigned to this role setting_app_title: Applicatie titel setting_app_subtitle: Applicatie ondertitel diff --git a/lang/pt-br.yml b/lang/pt-br.yml index 7196db85648e9cdf68e919c8f4d34e954de5e9c1..d7ac1ef5dae348a95cf82e8079f65ec57742f96f 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -155,6 +155,7 @@ field_identifier: Identificador field_is_filter: Used as a filter field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: Titulo da aplicacao setting_app_subtitle: Sub-titulo da aplicacao diff --git a/lang/pt.yml b/lang/pt.yml index face383c853645dd8b736fe1e075539d8c99176c..b0b2210fc353a6c014e29021112719c042f18ca8 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -155,6 +155,7 @@ field_identifier: Identificador field_is_filter: Usado como filtro field_issue_to_id: Tarefa relacionada field_delay: Atraso +field_assignable: Issues can be assigned to this role setting_app_title: TÃtulo da aplicação setting_app_subtitle: Sub-tÃtulo da aplicação diff --git a/lang/sv.yml b/lang/sv.yml index 70cb15c3da842e53b9383bb3bec32c77b6c4f3f4..8b0254602309cd46b6a13f3a4eadf69329c0ee5a 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -155,6 +155,7 @@ field_identifier: Identifierare field_is_filter: Used as a filter field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: Applikationstitel setting_app_subtitle: Applicationsunderrubrik diff --git a/lang/zh.yml b/lang/zh.yml index de8cfdb7f5014be245e1e2861f005c4077f7c132..7a7ec7b3e0fecc7cf02338f1ba66285e27423b73 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -158,6 +158,7 @@ field_identifier: Identifier field_is_filter: Used as a filter field_issue_to_id: Related issue field_delay: Delay +field_assignable: Issues can be assigned to this role setting_app_title: 应用程åºæ ‡é¢˜ setting_app_subtitle: 应用程åºåæ ‡é¢˜