Project

General

Profile

Feature #1554 » private_messages.patch

Used sources from /branches/1.2-stable/ r6484 - Dmitry Polovka, 2011-08-20 12:43

View differences:

app/helpers/journals_helper.rb (working copy)
39 39
    onclick = "new Ajax.Request('#{url_for(url)}', {asynchronous:true, evalScripts:true, method:'get'}); return false;"
40 40
    link_to text, '#', options.merge(:onclick => onclick)
41 41
  end
42

  
43
  def only_private_messages?(journals)
44
     journals.each do |journal|
45
         return false if ! journal.private
46
     end
47
     
48
     true
49
  end
42 50
end
app/models/mailer.rb (working copy)
58 58
  #   Mailer.deliver_issue_edit(journal) => sends an email to issue recipients
59 59
  def issue_edit(journal)
60 60
    issue = journal.journalized.reload
61
    private = journal[:private]
61 62
    redmine_headers 'Project' => issue.project.identifier,
62 63
                    'Issue-Id' => issue.id,
63 64
                    'Issue-Author' => issue.author.login
......
65 66
    message_id journal
66 67
    references issue
67 68
    @author = journal.user
68
    recipients issue.recipients
69

  
70
    @recipients ||= []
71
    watchers = issue.watcher_recipients - @recipients
72

  
73
    processed_recipients = prepare_receivers issue.recipients, issue.project, private
74
    processed_watchers = prepare_receivers watchers, issue.project, private
75

  
76
    recipients processed_recipients
69 77
    # Watchers in cc
70
    cc(issue.watcher_recipients - @recipients)
78
    cc(processed_watchers)
71 79
    s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] "
72 80
    s << "(#{issue.status.name}) " if journal.new_value_for('status_id')
73 81
    s << issue.subject
......
448 456
  def mylogger
449 457
    RAILS_DEFAULT_LOGGER
450 458
  end
459

  
460
  # Method for recipients or watchers preparation
461
  def prepare_receivers(receivers, project, private)
462
      processed_receivers = Array.new()
463

  
464
      receivers.each do |recepient|
465
         current_user = User.find_by_mail(recepient)
466
         can_see_private_messages = current_user.allowed_to?(:view_private_messages, project)
467

  
468
         if private
469
             next if ! can_see_private_messages
470
         end
471

  
472
         processed_receivers << recepient
473
      end
474

  
475
      processed_receivers
476
   end
477

  
451 478
end
452 479

  
453 480
# Patch TMail so that message_id is not overwritten
app/models/issue.rb (working copy)
388 388
    end
389 389
  end
390 390

  
391
  def init_journal(user, notes = "")
392
    @current_journal ||= Journal.new(:journalized => self, :user => user, :notes => notes)
391
  def init_journal(user, notes = "", private = false)
392
    @current_journal ||= Journal.new(:journalized => self, :user => user, :notes => notes, :private => private)
393 393
    @issue_before_change = self.clone
394 394
    @issue_before_change.status = self.status
395 395
    @custom_values_before_change = {}
app/controllers/issues_controller.rb (working copy)
286 286
    @time_entry.attributes = params[:time_entry]
287 287

  
288 288
    @notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil)
289
    @issue.init_journal(User.current, @notes)
289
    @private_message = params[:private_message] || false
290
    @issue.init_journal(User.current, @notes, @private_message)
290 291
    @issue.safe_attributes = params[:issue]
291 292
  end
292 293

  
app/controllers/journals_controller.rb (working copy)
83 83
    (render_403; return false) unless @journal.editable_by?(User.current)
84 84
    if request.post?
85 85
      @journal.update_attributes(:notes => params[:notes]) if params[:notes]
86
      @journal.update_attributes(:private => params[:private_message] || false)
86 87
      @journal.destroy if @journal.details.empty? && @journal.notes.blank?
87 88
      call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params})
88 89
      respond_to do |format|
app/views/journals/_notes_form.rhtml (working copy)
16 16
    <%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
17 17
                                                    "Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
18 18

  
19
    <%= check_box_tag :private_message, true, @journal.private, :id => "private_message_#{@journal.id}" %>
20
    <%= label_tag "private_message_#{@journal.id}", 'Private message', :style => 'font-weight:bold;' %>
21
    
19 22
    <div id="journal_<%= @journal.id %>_preview" class="wiki"></div>
20 23
<% end %>
21 24
<%= wikitoolbar_for "journal_#{@journal.id}_notes" %>
app/views/issues/_history.rhtml (working copy)
1 1
<% reply_links = authorize_for('issues', 'edit') -%>
2
<% view_private = User.current.allowed_to?(:view_private_messages, @project) %>
3
<% @skipped = 0 %>
4

  
2 5
<% for journal in journals %>
3
  <div id="change-<%= journal.id %>" class="<%= journal.css_classes %>">
4
    <h4><div class="journal-link"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
6

  
7
  <% private = journal.private %>
8

  
9
  <% if private %>
10
    <% if ! view_private %>
11
      <% @skipped += 1 %>
12
      <% next %>
13
    <% end %>
14
  <% end %>
15

  
16
  <div id="change-<%= journal.id %>" class="<%= journal.css_classes %> <%= 'private' if journal.private %>">
17
    <h4><div class="journal-link"><%= link_to "##{journal.indice - @skipped}", :anchor => "note-#{journal.indice - @skipped}" %></div>
5 18
    <%= avatar(journal.user, :size => "24") %>
6
    <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
7
		<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4>
19
    <%= content_tag('a', '', :name => "note-#{journal.indice - @skipped}")%>
20
		<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %>
21
    <% if journal.private %>
22
      <span>(private)</span>
23
    <% end %>
24
    </h4>
8 25
    
9 26
    <% if journal.details.any? %>
10 27
    <ul class="details">
app/views/issues/show.rhtml (working copy)
90 90
<% end %>
91 91

  
92 92
<% if @journals.present? %>
93
<div id="history">
94
<h3><%=l(:label_history)%></h3>
95
<%= render :partial => 'history', :locals => { :issue => @issue, :journals => @journals } %>
96
</div>
93
  <% view_private = User.current.allowed_to?(:view_private_messages, @project) %>
94
  <% if ! only_private_messages?(@journals) || view_private %>
95
    <div id="history">
96
    <h3><%=l(:label_history)%></h3>
97
    <%= render :partial => 'history', :locals => { :issue => @issue, :journals => @journals } %>
98
    </div>
99
  <% end %>
97 100
<% end %>
98 101

  
99 102

  
app/views/issues/_edit.rhtml (working copy)
5 5
                                       :method => :put,
6 6
                                       :multipart => true} do |f| %>
7 7
    <%= error_messages_for 'issue', 'time_entry' %>
8

  
9
    <% view_private = User.current.allowed_to?(:view_private_messages, @project) %>
10

  
8 11
    <div class="box">
9 12
    <% if @edit_allowed || !@allowed_statuses.empty? %>
10 13
        <fieldset class="tabular"><legend><%= l(:label_change_properties) %>
......
31 34
        <% end %>
32 35
    </fieldset>
33 36
    <% end %>
34
    
37

  
35 38
    <fieldset><legend><%= l(:field_notes) %></legend>
36 39
    <%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
37 40
    <%= wikitoolbar_for 'notes' %>
38 41
    <%= call_hook(:view_issues_edit_notes_bottom, { :issue => @issue, :notes => @notes, :form => f }) %>
39
    
42

  
43
     <% if view_private %>
44
       <%= check_box_tag :private_message, true, false %>
45
       <%= label_tag :private_message, 'Private message', :style => 'font-weight:bold;' %>
46
     <% end %>
47

  
40 48
    <p><%=l(:label_attachment_plural)%><br /><%= render :partial => 'attachments/form' %></p>
41 49
    </fieldset>
42 50
    </div>
43
    
51

  
44 52
    <%= f.hidden_field :lock_version %>
45 53
    <%= submit_tag l(:button_submit) %>
46
    <%= link_to_remote l(:label_preview), 
54
    <%= link_to_remote l(:label_preview),
47 55
                       { :url => preview_issue_path(:project_id => @project, :id => @issue),
48 56
                         :method => 'post',
49 57
                         :update => 'preview',
......
52 60
                       }, :accesskey => accesskey(:preview) %>
53 61
<% end %>
54 62

  
55
<div id="preview" class="wiki"></div>
63
<div id="preview" class="wiki"></div>
lib/redmine.rb (working copy)
85 85
    map.permission :view_issue_watchers, {}
86 86
    map.permission :add_issue_watchers, {:watchers => :new}
87 87
    map.permission :delete_issue_watchers, {:watchers => :destroy}
88
    # Private messages
89
    map.permission :view_private_messages, {}
88 90
  end
89 91
  
90 92
  map.project_module :time_tracking do |map|
(1-1/8)