From 43a6f312edde2399c9c986ed61b1e9b0e1066db6 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 9 Feb 2008 16:11:18 +0000 Subject: [PATCH] Merged IssuesController #edit and #update into a single actions. Users with 'edit issues' permission can now update any property including custom fields when adding a note or changing the status (#519, #581, #587). git-svn-id: http://redmine.rubyforge.org/svn/trunk@1129 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/issues_controller.rb | 65 +++++++++------------- app/views/issues/_edit.rhtml | 39 +++++++++++++ app/views/issues/_form.rhtml | 8 +-- app/views/issues/_form_update.rhtml | 10 ++++ app/views/issues/_update.rhtml | 54 ------------------ app/views/issues/context_menu.rhtml | 6 +- app/views/issues/edit.rhtml | 18 +----- app/views/issues/new.rhtml | 3 + app/views/issues/show.rhtml | 7 +-- app/views/issues/update.rhtml | 4 -- lang/bg.yml | 1 + lang/cs.yml | 1 + lang/de.yml | 1 + lang/en.yml | 1 + lang/es.yml | 1 + lang/fi.yml | 1 + lang/fr.yml | 1 + lang/he.yml | 1 + lang/it.yml | 1 + lang/ja.yml | 1 + lang/ko.yml | 1 + lang/lt.yml | 1 + lang/nl.yml | 1 + lang/pl.yml | 1 + lang/pt-br.yml | 1 + lang/pt.yml | 1 + lang/ro.yml | 1 + lang/ru.yml | 1 + lang/sr.yml | 1 + lang/sv.yml | 1 + lang/zh-tw.yml | 1 + lang/zh.yml | 1 + lib/redmine.rb | 4 +- public/images/note.png | Bin 469 -> 0 bytes public/stylesheets/application.css | 1 - test/functional/issues_controller_test.rb | 27 ++++----- test/integration/issues_test.rb | 2 +- 37 files changed, 123 insertions(+), 147 deletions(-) create mode 100644 app/views/issues/_edit.rhtml create mode 100644 app/views/issues/_form_update.rhtml delete mode 100644 app/views/issues/_update.rhtml delete mode 100644 app/views/issues/update.rhtml delete mode 100644 public/images/note.png diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index b722d9340..dbb49405c 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -25,7 +25,7 @@ class IssuesController < ApplicationController before_filter :find_optional_project, :only => [:index, :changes] accept_key_auth :index, :changes - cache_sweeper :issue_sweeper, :only => [ :new, :edit, :update, :destroy ] + cache_sweeper :issue_sweeper, :only => [ :new, :edit, :destroy ] helper :journals helper :projects @@ -85,10 +85,12 @@ class IssuesController < ApplicationController end def show - @custom_values = @issue.custom_values.find(:all, :include => :custom_field, :order => "#{CustomField.table_name}.position") + @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) } @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") - @status_options = @issue.new_statuses_allowed_to(User.current) + @allowed_statuses = @issue.new_statuses_allowed_to(User.current) + @edit_allowed = User.current.allowed_to?(:edit_issues, @project) @activities = Enumeration::get_values('ACTI') + @priorities = Enumeration::get_values('IPRI') respond_to do |format| format.html { render :template => 'issues/show.rhtml' } format.pdf { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") } @@ -140,48 +142,33 @@ class IssuesController < ApplicationController render :layout => !request.xhr? end + # Attributes that can be updated on workflow transition (without :edit permission) + # TODO: make it configurable (at least per role) + UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION) + def edit + @allowed_statuses = @issue.new_statuses_allowed_to(User.current) + @activities = Enumeration::get_values('ACTI') @priorities = Enumeration::get_values('IPRI') @custom_values = [] + @edit_allowed = User.current.allowed_to?(:edit_issues, @project) if request.get? @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) } else - begin - journal = @issue.init_journal(User.current) - # Retrieve custom fields and values - if params["custom_fields"] - @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) } - @issue.custom_values = @custom_values - end - @issue.attributes = params[:issue] - if @issue.save - flash[:notice] = l(:notice_successful_update) - Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated') - redirect_to(params[:back_to] || {:action => 'show', :id => @issue}) - end - rescue ActiveRecord::StaleObjectError - # Optimistic locking exception - flash[:error] = l(:notice_locking_conflict) + @notes = params[:notes] + journal = @issue.init_journal(User.current, @notes) + # User can change issue attributes only if he has :edit permission or if a workflow transition is allowed + if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue] + attrs = params[:issue].dup + attrs.delete_if {|k,v| !UPDATABLE_ATTRS_ON_TRANSITION.include?(k) } unless @edit_allowed + attrs.delete(:status_id) unless @allowed_statuses.detect {|s| s.id.to_s == attrs[:status_id].to_s} + @issue.attributes = attrs + end + # Update custom fields if user has :edit permission + if @edit_allowed && params[:custom_fields] + @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) } + @issue.custom_values = @custom_values end - end - end - - # Attributes that can be updated on workflow transition - # TODO: make it configurable (at least per role) - UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION) - - def update - @status_options = @issue.new_statuses_allowed_to(User.current) - @activities = Enumeration::get_values('ACTI') - journal = @issue.init_journal(User.current, params[:notes]) - # User can change issue attributes only if a workflow transition is allowed - if !@status_options.empty? && params[:issue] - attrs = params[:issue].dup - attrs.delete_if {|k,v| !UPDATABLE_ATTRS_ON_TRANSITION.include?(k) } - attrs.delete(:status_id) unless @status_options.detect {|s| s.id.to_s == attrs[:status_id].to_s} - @issue.attributes = attrs - end - if request.post? attachments = attach_files(@issue, params[:attachments]) attachments.each {|a| journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)} if @issue.save @@ -243,7 +230,7 @@ class IssuesController < ApplicationController def preview issue = Issue.find_by_id(params[:id]) @attachements = issue.attachments if issue - @text = (params[:issue] ? params[:issue][:description] : nil) || params[:notes] + @text = params[:notes] || (params[:issue] ? params[:issue][:description] : nil) render :partial => 'common/preview' end diff --git a/app/views/issues/_edit.rhtml b/app/views/issues/_edit.rhtml new file mode 100644 index 000000000..0f843e855 --- /dev/null +++ b/app/views/issues/_edit.rhtml @@ -0,0 +1,39 @@ +<% labelled_tabular_form_for :issue, @issue, + :url => {:action => 'edit', :id => @issue}, + :html => {:id => 'issue-form', + :multipart => true} do |f| %> + <%= error_messages_for 'issue' %> +
+ <% if @edit_allowed || !@allowed_statuses.empty? %> +
+ <%= l(:label_change_properties) %> + <% if !@issue.new_record? && !@issue.errors.any? && @edit_allowed %> + (<%= link_to l(:label_more), {}, :onclick => 'Effect.toggle("issue_descr_fields", "appear", {duration:0.3}); return false;' %>) + <% end %> + + <%= render :partial => (@edit_allowed ? 'form' : 'form_update'), :locals => {:f => f} %> +
+ <% end %> + +
<%= l(:field_notes) %> + <%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> + <%= wikitoolbar_for 'notes' %> + +

+ <%= file_field_tag 'attachments[]', :size => 30 %> (<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)

+
+
+ + <%= f.hidden_field :lock_version %> + <%= submit_tag l(:button_submit) %> + <%= link_to_remote l(:label_preview), + { :url => { :controller => 'issues', :action => 'preview', :id => @issue }, + :method => 'post', + :update => 'preview', + :with => 'Form.serialize("issue-form")', + :complete => "location.hash='preview'" + }, :accesskey => accesskey(:preview) %> +<% end %> + +
diff --git a/app/views/issues/_form.rhtml b/app/views/issues/_form.rhtml index d11cea84c..6a4cd0f5f 100644 --- a/app/views/issues/_form.rhtml +++ b/app/views/issues/_form.rhtml @@ -1,6 +1,3 @@ -<%= error_messages_for 'issue' %> -
- <% if @issue.new_record? %>

<%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %>

<%= observe_field :issue_tracker_id, :url => { :action => :new }, @@ -8,15 +5,17 @@ :with => "Form.serialize('issue-form')" %> <% end %> +
>

<%= f.text_field :subject, :size => 80, :required => true %>

<%= f.text_area :description, :required => true, :cols => 60, :rows => (@issue.description.blank? ? 10 : [[10, @issue.description.length / 50].max, 100].min), :accesskey => accesskey(:edit), :class => 'wiki-edit' %>

+
-<% if @issue.new_record? %> +<% if @issue.new_record? || @allowed_statuses %>

<%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %>

<% else %>

<%= @issue.status.name %>

@@ -49,7 +48,6 @@ <%= image_to_function "add.png", "addFileField();return false" %> <%= file_field_tag 'attachments[]', :size => 30 %> (<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)

<% end %> -
<%= wikitoolbar_for 'issue_description' %> diff --git a/app/views/issues/_form_update.rhtml b/app/views/issues/_form_update.rhtml new file mode 100644 index 000000000..25e81a7fd --- /dev/null +++ b/app/views/issues/_form_update.rhtml @@ -0,0 +1,10 @@ +
+

<%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %>

+

<%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %>

+
+
+

<%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %>

+<%= content_tag('p', f.select(:fixed_version_id, + (@project.versions.sort.collect {|v| [v.name, v.id]}), + { :include_blank => true })) unless @project.versions.empty? %> +
diff --git a/app/views/issues/_update.rhtml b/app/views/issues/_update.rhtml deleted file mode 100644 index 49d1473d9..000000000 --- a/app/views/issues/_update.rhtml +++ /dev/null @@ -1,54 +0,0 @@ -<% labelled_tabular_form_for(:issue, @issue, :url => {:action => 'update', :id => @issue}, - :html => {:multipart => true, - :id => 'issue-form'}) do |f| %> - -
-<% unless @status_options.empty? %> -<%= f.hidden_field :lock_version %> -
<%= l(:label_change_properties) %> -
-

<%= f.select :status_id, (@status_options.collect {|p| [p.name, p.id]}), :required => true %>

-

<%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %>

-
-
-

<%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %>

-

<%= f.select :fixed_version_id, (@project.versions.sort.collect {|v| [v.name, v.id]}), { :include_blank => true } %>

-
-
-<% end%> -<% if authorize_for('timelog', 'edit') %> -
<%= l(:button_log_time) %> - <% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %> -
-

<%= time_entry.text_field :hours, :size => 6, :label => :label_spent_time %> <%= l(:field_hours) %>

-
-
-

<%= time_entry.text_field :comments, :size => 40 %>

-

<%= time_entry.select :activity_id, (@activities.collect {|p| [p.name, p.id]}) %>

-
- <% end %> -
-<% end %> - -
<%= l(:field_notes) %> -<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %> -<%= wikitoolbar_for 'notes' %> - -

-<%= file_field_tag 'attachments[]', :size => 30 %> (<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)

-
-
- -<%= submit_tag l(:button_submit) %> -<%= link_to_remote l(:label_preview), - { :url => { :controller => 'issues', :action => 'preview', :id => @issue }, - :method => 'post', - :update => 'preview', - :with => "Form.serialize('issue-form')", - :complete => "window.location.hash='preview'" - }, :accesskey => accesskey(:preview) %> | -<%= toggle_link l(:button_cancel), 'update' %> -<% end %> - -
diff --git a/app/views/issues/context_menu.rhtml b/app/views/issues/context_menu.rhtml index 9691a7713..46b177067 100644 --- a/app/views/issues/context_menu.rhtml +++ b/app/views/issues/context_menu.rhtml @@ -6,7 +6,7 @@ <%= l(:field_status) %> @@ -24,10 +24,10 @@ <%= l(:field_assigned_to) %> diff --git a/app/views/issues/edit.rhtml b/app/views/issues/edit.rhtml index 1577216ed..97f26a205 100644 --- a/app/views/issues/edit.rhtml +++ b/app/views/issues/edit.rhtml @@ -1,19 +1,3 @@

<%=h "#{@issue.tracker.name} ##{@issue.id}" %>

-<% labelled_tabular_form_for :issue, @issue, - :url => {:action => 'edit'}, - :html => {:id => 'issue-form'} do |f| %> - <%= render :partial => 'form', :locals => {:f => f} %> - <%= f.hidden_field :lock_version %> - <%= submit_tag l(:button_save) %> - <%= link_to_remote l(:label_preview), - { :url => { :controller => 'issues', :action => 'preview', :id => @issue }, - :method => 'post', - :update => 'preview', - :with => "Form.serialize('issue-form')", - :complete => "location.href='#preview-top'" - }, :accesskey => accesskey(:preview) %> -<% end %> - - -
+<%= render :partial => 'edit' %> diff --git a/app/views/issues/new.rhtml b/app/views/issues/new.rhtml index 8ff07f226..1e9e323fe 100644 --- a/app/views/issues/new.rhtml +++ b/app/views/issues/new.rhtml @@ -2,7 +2,10 @@ <% labelled_tabular_form_for :issue, @issue, :html => {:multipart => true, :id => 'issue-form'} do |f| %> + <%= error_messages_for 'issue' %> +
<%= render :partial => 'issues/form', :locals => {:f => f} %> +
<%= submit_tag l(:button_create) %> <%= link_to_remote l(:label_preview), { :url => { :controller => 'issues', :action => 'preview', :id => @issue }, diff --git a/app/views/issues/show.rhtml b/app/views/issues/show.rhtml index d29b1b88f..a16dc60e0 100644 --- a/app/views/issues/show.rhtml +++ b/app/views/issues/show.rhtml @@ -1,6 +1,5 @@
-<%= show_and_goto_link(l(:button_update), 'update', :class => 'icon icon-note') if authorize_for('issues', 'update') %> -<%= link_to_if_authorized l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue}, :class => 'icon icon-edit', :accesskey => accesskey(:edit) %> +<%= show_and_goto_link(l(:button_update), 'update', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if authorize_for('issues', 'edit') %> <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time' %> <%= watcher_tag(@issue, User.current) %> <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %> @@ -89,11 +88,11 @@ end %>
<% end %> -<% if authorize_for('issues', 'update') %> +<% if authorize_for('issues', 'edit') %> <% end %> diff --git a/app/views/issues/update.rhtml b/app/views/issues/update.rhtml deleted file mode 100644 index 44e72da87..000000000 --- a/app/views/issues/update.rhtml +++ /dev/null @@ -1,4 +0,0 @@ -

<%= @issue.tracker.name %> #<%= @issue.id %>: <%=h @issue.subject %>

- -<%= error_messages_for 'issue' %> -<%= render :partial => 'update' %> diff --git a/lang/bg.yml b/lang/bg.yml index 6fb1cf6de..bc0e070c0 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -567,3 +567,4 @@ label_repository_plural: Хранилища label_associated_revisions: Асоциирани ревизии setting_user_format: Потребителски формат text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/cs.yml b/lang/cs.yml index 894568f20..35bda2b6a 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -567,3 +567,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/de.yml b/lang/de.yml index 668c4333c..fd296b600 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -567,3 +567,4 @@ enumeration_issue_priorities: Ticket-Prioritäten enumeration_doc_categories: Dokumentenkategorien enumeration_activities: Aktivitäten (Zeiterfassung) text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/en.yml b/lang/en.yml index c056c6ce5..b86eeef2b 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -469,6 +469,7 @@ label_display_per_page: 'Per page: %s' label_age: Age label_change_properties: Change properties label_general: General +label_more: More button_login: Login button_submit: Submit diff --git a/lang/es.yml b/lang/es.yml index b80d82178..60e4a4d13 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -570,3 +570,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/fi.yml b/lang/fi.yml index 3e297932d..38cf19a46 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -571,3 +571,4 @@ enumeration_activities: Aktiviteetit (ajan seuranta) label_associated_revisions: Liittyvät versiot setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/fr.yml b/lang/fr.yml index ac615f03c..e428935af 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -470,6 +470,7 @@ label_display_per_page: 'Par page: %s' label_age: Age label_change_properties: Changer les propriétés label_general: Général +label_more: Plus button_login: Connexion button_submit: Soumettre diff --git a/lang/he.yml b/lang/he.yml index 4063d2fcd..ca577558a 100644 --- a/lang/he.yml +++ b/lang/he.yml @@ -567,3 +567,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/it.yml b/lang/it.yml index 216a1ada4..f227c6942 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -567,3 +567,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/ja.yml b/lang/ja.yml index 7607b21de..92b79b6ef 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -568,3 +568,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/ko.yml b/lang/ko.yml index 31ac5bf9f..097d74788 100644 --- a/lang/ko.yml +++ b/lang/ko.yml @@ -567,3 +567,4 @@ label_repository_plural: 저장소들 label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/lt.yml b/lang/lt.yml index 3aa86702a..3106bd764 100644 --- a/lang/lt.yml +++ b/lang/lt.yml @@ -568,3 +568,4 @@ error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: label_associated_revisions: susijusios revizijos setting_user_format: Vartotojo atvaizdavimo formatas text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/nl.yml b/lang/nl.yml index c54273873..1c76180be 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -568,3 +568,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/pl.yml b/lang/pl.yml index e3fc957b4..3ebce3e92 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -567,3 +567,4 @@ label_repository_plural: Repozytoria label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/pt-br.yml b/lang/pt-br.yml index ce68c5bac..688ce0cfd 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -567,3 +567,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/pt.yml b/lang/pt.yml index 246705599..4734c66fc 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -567,3 +567,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/ro.yml b/lang/ro.yml index 97bb794dd..be566b959 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -567,3 +567,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/ru.yml b/lang/ru.yml index 1358b648d..6921169ce 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -568,3 +568,4 @@ enumeration_issue_priorities: Приоритеты задач enumeration_doc_categories: Категории документов enumeration_activities: Действия (учет времени) text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/sr.yml b/lang/sr.yml index e6a268004..ddf84a5d3 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -568,3 +568,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/sv.yml b/lang/sv.yml index da03bf0ba..4bec394ce 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -568,3 +568,4 @@ label_repository_plural: Repositories label_associated_revisions: Associated revisions setting_user_format: Users display format text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/zh-tw.yml b/lang/zh-tw.yml index 833e98b00..50a6384f2 100644 --- a/lang/zh-tw.yml +++ b/lang/zh-tw.yml @@ -567,3 +567,4 @@ enumeration_issue_priorities: 項目重要性 enumeration_doc_categories: 文件分類 enumeration_activities: 活動 (time tracking) text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lang/zh.yml b/lang/zh.yml index cdaeeaa04..dc431f5c0 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -570,3 +570,4 @@ label_repository_plural: 源代码库 label_associated_revisions: 相关的版本 setting_user_format: 用户显示格式 text_status_changed_by_changeset: Applied in changeset %s. +label_more: More diff --git a/lib/redmine.rb b/lib/redmine.rb index c4c55a932..69151012b 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -32,9 +32,9 @@ Redmine::AccessControl.map do |map| :reports => :issue_report}, :public => true map.permission :add_issues, {:issues => :new} map.permission :edit_issues, {:projects => :bulk_edit_issues, - :issues => [:edit, :update, :destroy_attachment]} + :issues => [:edit, :destroy_attachment]} map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]} - map.permission :add_issue_notes, {:issues => :update} + map.permission :add_issue_notes, {:issues => :edit} map.permission :move_issues, {:projects => :move_issues}, :require => :loggedin map.permission :delete_issues, {:issues => :destroy}, :require => :member # Queries diff --git a/public/images/note.png b/public/images/note.png deleted file mode 100644 index 256368397286776fa63c18805623ef4efdb750b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmV;`0V@89P)WdL?%ZZ04)F(7kgaC9ypGB7YVATlsIH8eUjIUp-AF)%O-KQw*-000Mc zNliru*9jF90SKU&=dl0)010qNS#tmY3labT3lag+-G2N4000DMK}|sb0I`n?{9y$E z005;>OjJex|Nrmr@8{>|z23b_dqQ)yYpuPl*4Ebd_xHW`t^fbd#^;=Ky<^74#?H>p zrSF{o|L26~Yf`;R-rnA|=e6(m=kNd4Ip;YD&Inq@QiR@wt^c)z_ly|lAtC1}QpQq@ z=ajww#+3h@2-XNn#zN=!=alD^od2bJrCP@S#%tbV-Z5H?drIf;=l9mu|0!CvLNWLM z_pQd1_r}imrL~l$Yu@+XY&1RZ0001ZNklsRFYFxLGY!dW#lB}Igt6X5|SJo9E==bK@m|gaS2H#AYfz! z3-AkY2@3JC3kx$rHF0ur^YHSqGs4VZW?^MxXF{0BzzEdKKnef=KAs3D*$m`T00000 LNkvXXu0mjfayQNg diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index b3b8b341d..b386c3285 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -512,7 +512,6 @@ vertical-align: middle; .icon-reload { background-image: url(../images/reload.png); } .icon-lock { background-image: url(../images/locked.png); } .icon-unlock { background-image: url(../images/unlock.png); } -.icon-note { background-image: url(../images/note.png); } .icon-checked { background-image: url(../images/true.png); } .icon22-projects { background-image: url(../images/22x22/projects.png); } diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index f4c99f1ed..6fdbb0341 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -217,18 +217,11 @@ class IssuesControllerTest < Test::Unit::TestCase assert mail.body.include?("Subject changed from #{old_subject} to #{new_subject}") end - def test_get_update - @request.session[:user_id] = 2 - get :update, :id => 1 - assert_response :success - assert_template 'update' - end - - def test_update_with_status_and_assignee_change + def test_post_edit_with_status_and_assignee_change issue = Issue.find(1) assert_equal 1, issue.status_id @request.session[:user_id] = 2 - post :update, + post :edit, :id => 1, :issue => { :status_id => 2, :assigned_to_id => 3 }, :notes => 'Assigned to dlopper' @@ -243,10 +236,10 @@ class IssuesControllerTest < Test::Unit::TestCase assert mail.body.include?("Status changed from New to Assigned") end - def test_update_with_note_only + def test_post_edit_with_note_only notes = 'Note added by IssuesControllerTest#test_update_with_note_only' # anonymous user - post :update, + post :edit, :id => 1, :notes => notes assert_redirected_to 'issues/show/1' @@ -259,10 +252,10 @@ class IssuesControllerTest < Test::Unit::TestCase assert mail.body.include?(notes) end - def test_update_with_note_and_spent_time + def test_post_edit_with_note_and_spent_time @request.session[:user_id] = 2 spent_hours_before = Issue.find(1).spent_hours - post :update, + post :edit, :id => 1, :notes => '2.5 hours added', :time_entry => { :hours => '2.5', :comments => '', :activity_id => Enumeration.get_values('ACTI').first } @@ -280,9 +273,9 @@ class IssuesControllerTest < Test::Unit::TestCase assert_equal spent_hours_before + 2.5, issue.spent_hours end - def test_update_with_attachment_only + def test_post_edit_with_attachment_only # anonymous user - post :update, + post :edit, :id => 1, :notes => '', :attachments => [ test_uploaded_file('testfile.txt', 'text/plain') ] @@ -297,12 +290,12 @@ class IssuesControllerTest < Test::Unit::TestCase assert mail.body.include?('testfile.txt') end - def test_update_with_no_change + def test_post_edit_with_no_change issue = Issue.find(1) issue.journals.clear ActionMailer::Base.deliveries.clear - post :update, + post :edit, :id => 1, :notes => '' assert_redirected_to 'issues/show/1' diff --git a/test/integration/issues_test.rb b/test/integration/issues_test.rb index 7249ed3da..eda4ef676 100644 --- a/test/integration/issues_test.rb +++ b/test/integration/issues_test.rb @@ -48,7 +48,7 @@ class IssuesTest < ActionController::IntegrationTest def test_issue_attachements log_user('jsmith', 'jsmith') - post 'issues/update/1', + post 'issues/edit/1', :notes => 'Some notes', :attachments => ([] << ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/testfile.txt', 'text/plain')) assert_redirected_to "issues/show/1" -- 2.39.5