<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Swen4</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Swen4"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Swen4"/>
	<updated>2026-06-27T02:52:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126685</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126685"/>
		<updated>2019-10-30T01:36:50Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* E1961 Email notification to reviewers and instructors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
* Deployed on VCL: [http://152.46.17.97:8080 VCL]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
* previous version&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
 def send_email_to_reviewee(map)&lt;br /&gt;
    participant = Participant.find(map.reviewer_id)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, participant, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
* current version&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* refactor the email method, which is called by send_email_to_reviewee.&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Changing the email content, which is the message content send toward the receiver.&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  %&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
We manually tested our functions including the mentioned issues. Please check our video test.&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126684</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126684"/>
		<updated>2019-10-30T01:31:32Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* E1961 Email notification to reviewers and instructors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
* Deployed on VCL: [http://152.46.17.97:8080 VCL]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
* previous version&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
 def send_email_to_reviewee(map)&lt;br /&gt;
    participant = Participant.find(map.reviewer_id)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, participant, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
* current version&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* refactor the email method, which is called by send_email_to_reviewee.&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Changing the email content, which is the message content send toward the receiver.&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  %&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test Plan===&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126566</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126566"/>
		<updated>2019-10-29T03:56:47Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Brief Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
* Deployed on VCL: [http://152.46.17.97:8080 VCL]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
 def send_email_to_reviewee(map)&lt;br /&gt;
    participant = Participant.find(map.reviewer_id)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, participant, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  %&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126563</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126563"/>
		<updated>2019-10-29T03:55:47Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* E1961 Email notification to reviewers and instructors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
* Deployed on VCL: [152.46.7.97:8080 VCL]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
 def send_email_to_reviewee(map)&lt;br /&gt;
    participant = Participant.find(map.reviewer_id)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, participant, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  %&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126545</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126545"/>
		<updated>2019-10-29T03:48:17Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
 def send_email_to_reviewee(map)&lt;br /&gt;
    participant = Participant.find(map.reviewer_id)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, participant, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  %&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126419</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126419"/>
		<updated>2019-10-29T02:56:50Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue1: email to reviewee */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
 def send_email_to_reviewee(map)&lt;br /&gt;
    participant = Participant.find(map.reviewer_id)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, participant, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126335</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126335"/>
		<updated>2019-10-29T01:44:07Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126332</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126332"/>
		<updated>2019-10-29T01:43:44Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
====Process Video Test====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;
====Rspec test====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126329</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126329"/>
		<updated>2019-10-29T01:42:27Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
* we modified the email address of instructor6, student10 and 11 to do the test in the video&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126325</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126325"/>
		<updated>2019-10-29T01:41:07Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ----&amp;gt;the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission ---&amp;gt;the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126319</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126319"/>
		<updated>2019-10-29T01:39:11Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10&lt;br /&gt;
##the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission&lt;br /&gt;
##the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126318</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126318"/>
		<updated>2019-10-29T01:38:53Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10&lt;br /&gt;
* the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
#student 10 resubmit another hyperlink as the second submission&lt;br /&gt;
* the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126316</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126316"/>
		<updated>2019-10-29T01:37:52Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10&lt;br /&gt;
:: the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
5.student 10 resubmit another hyperlink as the second submission&lt;br /&gt;
:: the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126314</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126314"/>
		<updated>2019-10-29T01:37:33Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
1.instructor6 create a new assignment&lt;br /&gt;
2.student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
3.nstructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
4.student 11 does the review for student 10&lt;br /&gt;
:: the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
5.student 10 resubmit another hyperlink as the second submission&lt;br /&gt;
:: the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126311</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126311"/>
		<updated>2019-10-29T01:36:45Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#instructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10 ::the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
# student 10 resubmit another hyperlink as the second submission&lt;br /&gt;
the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126309</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126309"/>
		<updated>2019-10-29T01:36:16Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#instructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10&lt;br /&gt;
  :: the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
# student 10 resubmit another hyperlink as the second submission&lt;br /&gt;
  :: the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126305</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126305"/>
		<updated>2019-10-29T01:35:32Z</updated>

		<summary type="html">&lt;p&gt;Swen4: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
#instructor6 create a new assignment&lt;br /&gt;
#student10, student11 submit a hyperlink as the first submission&lt;br /&gt;
#instructor6 modify the due date of first submission(For the test, the student only can do the review after the due date of the first submission)&lt;br /&gt;
#student 11 does the review for student 10&lt;br /&gt;
:: the student 10 and the instructor6(Blind carbon copy) should receive the email to notify that there's a new review&lt;br /&gt;
# student 10 resubmit another hyperlink as the second submission&lt;br /&gt;
:: the student 11 and the instructor6(Blind carbon copy) should receive the email to notify that he needs to update the review&lt;br /&gt;
&lt;br /&gt;
Database:&lt;br /&gt;
[[File:Database.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Database.png&amp;diff=126290</id>
		<title>File:Database.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Database.png&amp;diff=126290"/>
		<updated>2019-10-29T01:26:21Z</updated>

		<summary type="html">&lt;p&gt;Swen4: uploaded a new version of &amp;amp;quot;File:Database.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Database Schema&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Database.png&amp;diff=126284</id>
		<title>File:Database.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Database.png&amp;diff=126284"/>
		<updated>2019-10-29T01:21:23Z</updated>

		<summary type="html">&lt;p&gt;Swen4: uploaded a new version of &amp;amp;quot;File:Database.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Database Schema&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126237</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126237"/>
		<updated>2019-10-29T00:46:19Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* E1961 Email notification to reviewers and instructors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox on the profile page.&lt;br /&gt;
'''Changed files: app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''Changed files: app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''Changed files: app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''Changed files: app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
'''Changed files: app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126232</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126232"/>
		<updated>2019-10-29T00:43:35Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue3: bcc to Instructor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Add a new attribute: bcc_mail_address&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
 &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
  def self.send_mail_to_reviewer(user, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126227</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126227"/>
		<updated>2019-10-29T00:41:16Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue3: bcc to Instructor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126225</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126225"/>
		<updated>2019-10-29T00:40:11Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue3: bcc to Instructor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&lt;br /&gt;
 def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126218</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126218"/>
		<updated>2019-10-29T00:35:13Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* E1961 Email notification to reviewers and instructors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
=====Rspec test=====&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126213</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126213"/>
		<updated>2019-10-29T00:33:47Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* E1961 Email notification to reviewers and instructors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
&lt;br /&gt;
=====Process Video Test=====&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126209</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126209"/>
		<updated>2019-10-29T00:30:07Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fix issue disable email_on_review is not working on profile&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
* previous version:&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
* correct version:&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126206</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126206"/>
		<updated>2019-10-29T00:28:52Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126204</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126204"/>
		<updated>2019-10-29T00:28:37Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox_new.png.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126202</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126202"/>
		<updated>2019-10-29T00:28:20Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox new.png.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Checkbox_new.png&amp;diff=126200</id>
		<title>File:Checkbox new.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Checkbox_new.png&amp;diff=126200"/>
		<updated>2019-10-29T00:27:48Z</updated>

		<summary type="html">&lt;p&gt;Swen4: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126199</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126199"/>
		<updated>2019-10-29T00:26:02Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
[[File:Email_on_review_wrong.png]]&lt;br /&gt;
[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126195</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126195"/>
		<updated>2019-10-29T00:25:31Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;[[File:Email_on_review_correct.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Email_on_review_correct.png&amp;diff=126193</id>
		<title>File:Email on review correct.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Email_on_review_correct.png&amp;diff=126193"/>
		<updated>2019-10-29T00:24:27Z</updated>

		<summary type="html">&lt;p&gt;Swen4: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Email_on_review_wrong.png&amp;diff=126192</id>
		<title>File:Email on review wrong.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Email_on_review_wrong.png&amp;diff=126192"/>
		<updated>2019-10-29T00:24:09Z</updated>

		<summary type="html">&lt;p&gt;Swen4: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126187</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126187"/>
		<updated>2019-10-29T00:22:21Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;[[File:Email_on_review.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[File:problem2.jpg]]&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126185</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126185"/>
		<updated>2019-10-29T00:21:19Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;[[File:Email_on_review.png]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126176</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126176"/>
		<updated>2019-10-29T00:19:33Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
&lt;br /&gt;
[[File:Email_on_review.png]]&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126175</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=126175"/>
		<updated>2019-10-29T00:19:02Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/models/review_response_map.rb&lt;br /&gt;
[[File:Email_on_review.png]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Email_on_review.png&amp;diff=126174</id>
		<title>File:Email on review.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Email_on_review.png&amp;diff=126174"/>
		<updated>2019-10-29T00:18:35Z</updated>

		<summary type="html">&lt;p&gt;Swen4: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125724</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125724"/>
		<updated>2019-10-27T23:53:24Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
* [https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125723</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125723"/>
		<updated>2019-10-27T23:53:10Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Process Video */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
[https://youtu.be/DSDINg_N1tQ video test]&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125668</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125668"/>
		<updated>2019-10-27T20:48:04Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* E1961 Email notification to reviewers and instructors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/response_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/models/review_response_map.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  def email(defn, assignment)&lt;br /&gt;
    defn[:body][:type] = &amp;quot;Peer Review&amp;quot;&lt;br /&gt;
    AssignmentTeam.find(reviewee_id).users.each do |user|&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* The instructor is able to get copies of emails that are sent to students by the system. Also the instructor could cancel the function by editing the checkbox in the profile page.&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      instructor = User.find(user.parent_id)&lt;br /&gt;
      bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
      if instructor.copy_of_emails == true &amp;amp;&amp;amp; user.email_on_review == true&lt;br /&gt;
        bcc_mail_address = instructor.email&lt;br /&gt;
      end&lt;br /&gt;
      if user.email_on_review?&lt;br /&gt;
        defn[:bcc] = bcc_mail_address&lt;br /&gt;
        defn[:body][:obj_name] = assignment.name&lt;br /&gt;
        defn[:body][:first_name] = User.find(user.id).fullname&lt;br /&gt;
        defn[:to] = User.find(user.id).email&lt;br /&gt;
        Mailer.sync_message(defn).deliver_now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125661</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125661"/>
		<updated>2019-10-27T20:13:27Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;{},  true, false  &amp;lt;/font&amp;gt;%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125660</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125660"/>
		<updated>2019-10-27T20:10:49Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125659</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125659"/>
		<updated>2019-10-27T20:08:35Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;     &lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125658</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125658"/>
		<updated>2019-10-27T20:08:07Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
     [[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125657</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125657"/>
		<updated>2019-10-27T20:07:55Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
  [[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125656</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125656"/>
		<updated>2019-10-27T20:06:58Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
[[File:Checkbox.png]]&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125654</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125654"/>
		<updated>2019-10-27T20:04:47Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
[[File:Checkbox.png]]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125653</id>
		<title>CSC/ECE 517 Fall 2019 - E1961. Email notification to reviewers and instructors</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2019_-_E1961._Email_notification_to_reviewers_and_instructors&amp;diff=125653"/>
		<updated>2019-10-27T20:02:35Z</updated>

		<summary type="html">&lt;p&gt;Swen4: /* Issue4: the user could choose checkbox options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=E1961 Email notification to reviewers and instructors=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Brief Introduction===&lt;br /&gt;
 &lt;br /&gt;
* E1961 Project aims to fix the problems of making the email notification function more reliable.&lt;br /&gt;
&lt;br /&gt;
* The forked git repository for this project can be found [https://github.com/wangdavid84/expertiza.git wangdavid84/expertiza.git]&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* '''Issue1:''' Fix the problem that the author(reviewee) cannot receive the email notification about the review from someone else. The Expertiza is supposed to email authors each time a review of their work is submitted.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue2:''' Fix the bugs to make Expertiza emails reviewers each time an author that they have reviewed submits new work.&lt;br /&gt;
&lt;br /&gt;
* '''Issue3:''' The instructor could get a Blind carbon copy every time.  &lt;br /&gt;
&lt;br /&gt;
* '''Issue4:''' The users can turn off those email notifications by unchecking boxes on their profile page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue1: email to reviewee====&lt;br /&gt;
&lt;br /&gt;
* Add a method in both &amp;quot;update&amp;quot; and &amp;quot;create&amp;quot; functions to call the email function to make the Experiza send the email to reviewee when reviewers submit the reviews&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
app/controllers/response_controller.rb:&lt;br /&gt;
&lt;br /&gt;
  def send_email_to_reviewee(map)&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;} }&lt;br /&gt;
    map.email(defn, Assignment.find(Participant.find(map.reviewer_id).parent_id))&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Issue2: email to reviewer(new submission)====&lt;br /&gt;
&lt;br /&gt;
* Add new function to email all reviewers a new submission is ready to review:&lt;br /&gt;
::* In the first round, there is no reviewer before they take a request&lt;br /&gt;
::* Except the first round, reviewers get an email every time when there is a new submission&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
email_all_reviewers(@participant)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'edit', id: @participant.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def email_all_reviewers(participant)&lt;br /&gt;
    if participant.reviewers != []&lt;br /&gt;
      participant.reviewers.each do |reviewer|&lt;br /&gt;
        map = ReviewResponseMap.where(['reviewer_id = ? and reviewee_id = ?', reviewer.id, participant.team.id]).first&lt;br /&gt;
        responses = Response.where(:map_id =&amp;gt; map.id)&lt;br /&gt;
        responses = responses.sort_by { |obj| obj.updated_at }&lt;br /&gt;
&lt;br /&gt;
        # the latest response will be the last&lt;br /&gt;
        latest_response = responses.last&lt;br /&gt;
&lt;br /&gt;
        # we need to pass the id of lastest_response in the URL mentioned in the mail.&lt;br /&gt;
        # this will open the correct /response/edit?id=#{latest_response.id} page for the reviewer when (s)he clicks on it.&lt;br /&gt;
&lt;br /&gt;
        user = User.find(reviewer.user_id)&lt;br /&gt;
        instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
        if user.email_on_submission?&lt;br /&gt;
          MailerHelper.send_mail_to_reviewer(user,&lt;br /&gt;
                                             bcc_mail_address,&lt;br /&gt;
                                             &amp;quot;You have a new submission to review&amp;quot;,&lt;br /&gt;
                                             &amp;quot;update&amp;quot;,&lt;br /&gt;
                                             &amp;quot;Please visit https://expertiza.ncsu.edu/response/edit?id=#{latest_response.id} and proceed to peer reviews.&amp;quot;).deliver&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''app/helpers/mailer_helper.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def self.send_mail_to_reviewer(user, bcc_mail_address, subject, partial_name, note)&lt;br /&gt;
    Mailer.new_review_request_message ({&lt;br /&gt;
        to: user.email,&lt;br /&gt;
        bcc: bcc_mail_address,&lt;br /&gt;
        subject: subject,&lt;br /&gt;
        body: {&lt;br /&gt;
            user: user,&lt;br /&gt;
            first_name: ApplicationHelper.get_user_first_name(user),&lt;br /&gt;
            message: note,&lt;br /&gt;
            partial_name: partial_name&lt;br /&gt;
        }&lt;br /&gt;
    })&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/new_review_message.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
  &amp;lt;meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;%= render :partial =&amp;gt; 'mailer/partials/'+@partial_name+'_html' %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This message has been generated by &amp;lt;A HREF=&amp;quot;http://expertiza.ncsu.edu&amp;quot;&amp;gt;Expertiza&amp;lt;/A&amp;gt;&amp;lt;BR/&amp;gt;&lt;br /&gt;
http://expertiza.ncsu.edu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''app/views/mailer/partials/update.html.html.erb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hi &amp;lt;%= @first_name %&amp;gt;,&amp;lt;/br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
  One of the assignments you are reviewing has just been entered or revised.&lt;br /&gt;
  &amp;quot;&amp;lt;%= @message %&amp;gt;&amp;quot;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue3: bcc to Instructor====&lt;br /&gt;
* ..........................................................................................&lt;br /&gt;
'''app/controllers/submitted_content_controller.rb:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
instructor = User.find(user.parent_id)&lt;br /&gt;
        bcc_mail_address = &amp;quot;&amp;quot;&lt;br /&gt;
        if instructor.copy_of_emails?&lt;br /&gt;
          bcc_mail_address = instructor.email&lt;br /&gt;
        else&lt;br /&gt;
          # do noting&lt;br /&gt;
        end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 bcc: bcc_mail_address,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Issue4: the user could choose checkbox options ====&lt;br /&gt;
* Fix the problem that the users cannot choose to uncheck the email options.&lt;br /&gt;
'''app/views/users/_prefs.html.erb:'''&lt;br /&gt;
[[File:Checkbox.png|x100px]]&amp;lt;/br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* previous version:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission', {},  true, false  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review', {},  true, false %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* correct version:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;reviews&amp;lt;/strong&amp;gt; my work&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_submission&amp;quot;&amp;gt;When someone else &amp;lt;strong&amp;gt;submits&amp;lt;/strong&amp;gt; work I am assigned to review&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_submission'  %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
          &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;label for=&amp;quot;user_email_on_review_of_review&amp;quot;&amp;gt;When someone else reviews one of my reviews (&amp;lt;strong&amp;gt;metareviews&amp;lt;/strong&amp;gt; my work)&amp;lt;/label&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= check_box 'user', 'email_on_review_of_review' %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Process Video===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
* test function: if the user unchecked the box of email_on_review(When someone else reviews my work) option, he should not receive the email.&lt;br /&gt;
::* We create a new student2 with email_on_review options is false (default is true)&lt;br /&gt;
&lt;br /&gt;
'''app/spec/models/review_response_map_spec.rb:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
let(:student2) { build(:student, id: 3, name: &amp;quot;name2&amp;quot;, fullname: 'no one', email: 'expertiza@mailinator.com', email_on_review: false) }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
it '#email should not send email when email on review attribute is disabled' do&lt;br /&gt;
    reviewer_id = 1&lt;br /&gt;
    allow(Participant).to receive(:find).with(1).and_return(participant)&lt;br /&gt;
    allow(Assignment).to receive(:find).with(1).and_return(assignment)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:find).with(3).and_return(team2)&lt;br /&gt;
    allow(AssignmentTeam).to receive(:users).and_return(student2)&lt;br /&gt;
    allow(User).to receive(:find).with(3).and_return(student2)&lt;br /&gt;
    review_response_map2.reviewee_id = 3&lt;br /&gt;
    defn = {body: {type: &amp;quot;Peer Review&amp;quot;, obj_name: &amp;quot;Test Assgt&amp;quot;, first_name: &amp;quot;no one&amp;quot;, partial_name: &amp;quot;new_submission&amp;quot;}, to: &amp;quot;expertiza@mailinator.com&amp;quot;}&lt;br /&gt;
    expect { review_response_map2.email(defn, participant, Assignment.find(Participant.find(reviewer_id).parent_id)) }&lt;br /&gt;
        .to change { ActionMailer::Base.deliveries.count }.by 0&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Team Information===&lt;br /&gt;
#Siwei Wen (swen4@ncsu.edu)&lt;br /&gt;
#Shuzheng Wang (swang41@ncsu.edu)&lt;br /&gt;
#Zhifeng Zhu (zzhu25@ncsu.edu)&lt;br /&gt;
#'''Mentor:''' Ed Gehringer (efg@ncsu.edu)&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[http://expertiza.ncsu.edu/ The live Expertiza website] &lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://github.com/WintersLt/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://bit.ly/myexpertiza  Demo link]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;/div&gt;</summary>
		<author><name>Swen4</name></author>
	</entry>
</feed>