ameya86 / redmine_already_read

Manage issue already read or unread.
10 stars 20 forks source link

既読にする条件をチケット担当者にしたい #6

Open inou13139013 opened 9 years ago

inou13139013 commented 9 years ago

井上と申します。

本プラグインを導入するに当たり 未読から既読にする条件を、 「チケットの担当者が見たら既読にする」 ようにしようと思い、 issue_patch.rb の already_read? をいじってみましたがうまくいきませんでした。 (自分ではなくチケット担当者のalready_read_issue_idsにアクセスしたいのですが、 ruby初心者のため途方に暮れてしまいました)

何かアドバイス頂けないでしょうか?

ameya86 commented 9 years ago

アクセスしているユーザは「User.current」で参照でき、 チケットの担当者はチケット(Issue)オブジェクトの「assigned_to」から参照できます。 ので、アクセスユーザを見ている箇所を担当者に置き換えていけばいいと思います。

already_read?なら

# 既読ならtrueを返す
def already_read?(user = self.assigned_to)
  return user && user.already_read_issue_ids.include?(self.id)
end

といった感じでしょうか。

issues_controller_patch.rbあたりは

def issue_read
  if @issue && User.current == @issue.assigned_to && !@issue.already_read?
    User.current.already_read_issues << @issue
  end
end

でしょうか。

実際に動かしてはないので、これで出来るかは不明ですが。

inou13139013 commented 9 years ago

迅速な御回答ありがとうございます。 おかげで意図した動作をさせるようにできました。

担当者が空だとエラーになるため、 以下のようにコードを変更してみました。 (まだ、担当者にグループを設定すると落ちてしまうため改良中。。。)

issue_patch.rb
  # 状態を文字で返す
  def already_read(user = self.assigned_to)
    if user
      return (already_read?(user))? l(:label_already_read_read) : l(:label_already_read_unread)
    else
      return (already_read?(User.current))? l(:label_already_read_read) : l(:label_already_read_unread)
    end
  end

  # 既読ならtrueを返す
  def already_read?(user = User.current)
   return user && user.already_read_issue_ids.include?(self.id)
  end

  # チケットを読んだ日
  def already_read_date(user = self.assigned_to)
    read = already_reads.detect{|r| r.user_id == user.id}
    return (read)? read.created_on : nil
  end
issues_controller_patch.rb
展開頂いた通り修正