Feature #34040 » draft.patch
| app/controllers/issues_controller.rb | ||
|---|---|---|
| 72 | 72 |
:title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}")
|
| 73 | 73 |
end |
| 74 | 74 |
format.csv do |
| 75 |
@issues = @query.issues(:limit => Setting.issues_export_limit.to_i) |
|
| 75 |
@issues = @query.issues(:limit => Setting.issues_export_limit.to_i, :with_notes => (params[:with_notes] == '1'))
|
|
| 76 | 76 |
send_data(query_to_csv(@issues, @query, params[:csv]), |
| 77 | 77 |
:type => 'text/csv; header=present', :filename => 'issues.csv') |
| 78 | 78 |
end |
| app/helpers/queries_helper.rb | ||
|---|---|---|
| 320 | 320 |
columns = query.columns |
| 321 | 321 | |
| 322 | 322 |
Redmine::Export::CSV.generate(:encoding => params[:encoding]) do |csv| |
| 323 |
journal_columns = IssueQuery.journal_columns if params[:with_notes] == '1' |
|
| 324 | ||
| 323 | 325 |
# csv header fields |
| 324 |
csv << columns.map {|c| c.caption.to_s}
|
|
| 326 |
csv << columns.map {|c| c.caption.to_s} + (journal_columns || []).map{|c| c.caption.to_s}
|
|
| 325 | 327 |
# csv lines |
| 326 | 328 |
items.each do |item| |
| 327 |
csv << columns.map {|c| csv_content(c, item)}
|
|
| 329 |
if journal_columns |
|
| 330 |
item.journals_with_notes.each_with_index do |journal, index| |
|
| 331 |
if index == 0 |
|
| 332 |
csv << columns.map {|c| csv_content(c, item)} + journal_columns.map {|c| csv_content(c, journal)}
|
|
| 333 |
else |
|
| 334 |
csv << columns.map {|c| csv_content(c, item) if c.name == :id } + journal_columns.map {|c| csv_content(c, journal)}
|
|
| 335 |
end |
|
| 336 |
end |
|
| 337 |
else |
|
| 338 |
csv << columns.map {|c| csv_content(c, item)}
|
|
| 339 |
end |
|
| 328 | 340 |
end |
| 329 | 341 |
end |
| 330 | 342 |
end |
| app/models/issue.rb | ||
|---|---|---|
| 262 | 262 |
@total_estimated_hours = nil |
| 263 | 263 |
@last_updated_by = nil |
| 264 | 264 |
@last_notes = nil |
| 265 |
@journals_with_notes = nil |
|
| 265 | 266 |
base_reload(*args) |
| 266 | 267 |
end |
| 267 | 268 | |
| ... | ... | |
| 1166 | 1167 |
def last_notes |
| 1167 | 1168 |
if @last_notes |
| 1168 | 1169 |
@last_notes |
| 1170 |
elsif @journals_with_notes.first.notes |
|
| 1171 |
@journals_with_notes.first.notes |
|
| 1169 | 1172 |
else |
| 1170 | 1173 |
journals.where.not(notes: '').reorder(:id => :desc).first.try(:notes) |
| 1171 | 1174 |
end |
| 1172 | 1175 |
end |
| 1173 | 1176 | |
| 1177 |
def journals_with_notes |
|
| 1178 |
if @journals_with_notes |
|
| 1179 |
@journals_with_notes |
|
| 1180 |
else |
|
| 1181 |
journals.where.not(notes: '').reorder(:id => :asc) |
|
| 1182 |
end |
|
| 1183 |
end |
|
| 1184 | ||
| 1174 | 1185 |
# Preloads relations for a collection of issues |
| 1175 | 1186 |
def self.load_relations(issues) |
| 1176 | 1187 |
if issues.any? |
| ... | ... | |
| 1261 | 1272 |
end |
| 1262 | 1273 | |
| 1263 | 1274 |
# Preloads visible last notes for a collection of issues |
| 1264 |
def self.load_visible_last_notes(issues, user=User.current) |
|
| 1275 |
def self.load_visible_last_notes(issues, user=User.current, has_notes=false)
|
|
| 1265 | 1276 |
if issues.any? |
| 1277 |
if has_notes |
|
| 1278 |
issues.each do |issue| |
|
| 1279 |
issue.instance_variable_set("@last_notes", issue.journals_with_notes.last.notes)
|
|
| 1280 |
end |
|
| 1281 |
return |
|
| 1282 |
end |
|
| 1283 | ||
| 1266 | 1284 |
issue_ids = issues.map(&:id) |
| 1267 | 1285 |
journal_ids = Journal.joins(issue: :project). |
| 1268 | 1286 |
where(:journalized_type => 'Issue', :journalized_id => issue_ids). |
| ... | ... | |
| 1280 | 1298 |
end |
| 1281 | 1299 |
end |
| 1282 | 1300 | |
| 1301 |
# Preloads visible journals_with_notes for a collection of issues |
|
| 1302 |
def self.load_visible_journals_with_notes(issues, user=User.current) |
|
| 1303 |
if issues.any? |
|
| 1304 |
issue_ids = issues.map(&:id) |
|
| 1305 |
journals = Journal.joins(issue: :project). |
|
| 1306 |
where(:journalized_type => 'Issue', :journalized_id => issue_ids). |
|
| 1307 |
where(Journal.visible_notes_condition(user, :skip_pre_condition => true)). |
|
| 1308 |
where.not(notes: ''). |
|
| 1309 |
reorder(id: :asc) |
|
| 1310 | ||
| 1311 |
issues.each do |issue| |
|
| 1312 |
issue.instance_variable_set("@journals_with_notes", journals.where(journalized_id: issue.id))
|
|
| 1313 |
end |
|
| 1314 |
end |
|
| 1315 |
end |
|
| 1316 | ||
| 1283 | 1317 |
# Finds an issue relation given its id. |
| 1284 | 1318 |
def find_relation(relation_id) |
| 1285 | 1319 |
IssueRelation.where("issue_to_id = ? OR issue_from_id = ?", id, id).find(relation_id)
|
| app/models/issue_query.rb | ||
|---|---|---|
| 323 | 323 |
@available_columns |
| 324 | 324 |
end |
| 325 | 325 | |
| 326 |
def self.journal_columns |
|
| 327 |
columns = |
|
| 328 |
[ |
|
| 329 |
QueryColumn.new(:id, :caption => :label_notes_id, :inline => false), |
|
| 330 |
QueryColumn.new(:notes, :caption => :field_notes, :inline => false), |
|
| 331 |
QueryColumn.new(:user, :caption => :label_notes_author, :inline => false), |
|
| 332 |
QueryColumn.new(:created_on, :caption => :label_notes_created_on, :inline => false) |
|
| 333 |
] |
|
| 334 |
if User.current.allowed_to?(:set_notes_private, nil, :global => true) |
|
| 335 |
columns << QueryColumn.new(:private_notes, :caption => :field_private_notes, :inline => false) |
|
| 336 |
end |
|
| 337 |
end |
|
| 338 | ||
| 326 | 339 |
def default_columns_names |
| 327 | 340 |
@default_columns_names ||= begin |
| 328 | 341 |
default_columns = Setting.issue_list_default_columns.map(&:to_sym) |
| ... | ... | |
| 405 | 418 |
if has_column?(:relations) |
| 406 | 419 |
Issue.load_visible_relations(issues) |
| 407 | 420 |
end |
| 421 |
if options[:with_notes] |
|
| 422 |
Issue.load_visible_journals_with_notes(issues) |
|
| 423 |
end |
|
| 408 | 424 |
if has_column?(:last_notes) |
| 409 |
Issue.load_visible_last_notes(issues) |
|
| 425 |
Issue.load_visible_last_notes(issues, User.current, options[:with_notes])
|
|
| 410 | 426 |
end |
| 411 | 427 |
issues |
| 412 | 428 |
rescue ::ActiveRecord::StatementInvalid => e |
| app/views/issues/index.html.erb | ||
|---|---|---|
| 55 | 55 |
<% @query.available_block_columns.each do |column| %> |
| 56 | 56 |
<label><%= check_box_tag 'c[]', column.name, @query.has_column?(column), :id => nil %> <%= column.caption %></label> |
| 57 | 57 |
<% end %> |
| 58 |
<label><%= check_box_tag 'with_notes', '1', false, id: nil %> <%= l(:label_all_notes) %></label> |
|
| 58 | 59 |
</fieldset> |
| 59 | 60 |
<% end %> |
| 60 | 61 |
<%= export_csv_encoding_select_tag %> |
| config/locales/en.yml | ||
|---|---|---|
| 1121 | 1121 |
label_display_type_board: Board |
| 1122 | 1122 |
label_my_bookmarks: My bookmarks |
| 1123 | 1123 |
label_assign_to_me: Assign to me |
| 1124 |
label_all_notes: All notes |
|
| 1125 |
label_notes_id: Notes-# |
|
| 1126 |
label_notes_author: Notes author |
|
| 1127 |
label_notes_created_on: Notes created |
|
| 1124 | 1128 | |
| 1125 | 1129 |
button_login: Login |
| 1126 | 1130 |
button_submit: Submit |