<?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=Ddoshi2</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=Ddoshi2"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Ddoshi2"/>
	<updated>2026-05-19T23:37:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=Restart_Instructions_for_Expertiza&amp;diff=147388</id>
		<title>Restart Instructions for Expertiza</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Restart_Instructions_for_Expertiza&amp;diff=147388"/>
		<updated>2023-01-24T01:51:46Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Expertiza application runs under the Phusion Passenger server for Apache. Passenger dynamically starts and kills instances of the rails application as demand on the application changes. After making changes to the application code, only the rails application need be restarted, not Apache. Apache only need be restarted when making changes to the Apache web server configuration in /etc/httpd/.&lt;br /&gt;
&lt;br /&gt;
== Restarting the rails application ==&lt;br /&gt;
&lt;br /&gt;
'''Deprecated'''&lt;br /&gt;
&lt;br /&gt;
Restarting preferably is done via capistrano. See [[Deploying_Expertiza_to_Production]] for capistrano setup instructions.&lt;br /&gt;
&lt;br /&gt;
From your development machine in the expertiza app directory, run&lt;br /&gt;
&lt;br /&gt;
: cap deploy:restart&lt;br /&gt;
&lt;br /&gt;
'''Current System instruction (2023)'''&lt;br /&gt;
&lt;br /&gt;
If you have sudo access, you can SSH into the production server and run&lt;br /&gt;
&lt;br /&gt;
: sudo -u rails touch /var/www/expertiza/current/tmp/restart.txt&lt;br /&gt;
&lt;br /&gt;
If this dosen't work, restart the server using the command - shutdown -r&lt;br /&gt;
After doing shutdown -r, you might need to restart redis server as well using the command &lt;br /&gt;
&lt;br /&gt;
/etc/init.d/redis_6379 start&lt;br /&gt;
&lt;br /&gt;
== Restarting Apache web server ==&lt;br /&gt;
&lt;br /&gt;
: sudo /etc/init.d/httpd restart&lt;br /&gt;
&lt;br /&gt;
SSL Password: expertiza&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
# Apache needs to be started if you get a Connection Refused error when connecting to the site.&lt;br /&gt;
#: Stop the /usr/etc/httpd process if it is running.&lt;br /&gt;
#:: ps –ef | grep httpd&lt;br /&gt;
#: If httpd is running, kill its pid&lt;br /&gt;
#:: kill &amp;amp;lt;process id&amp;amp;gt;&lt;br /&gt;
#: Start the apache server	&lt;br /&gt;
#:: apachectl start&lt;br /&gt;
#:: Enter the SSL password: expertiza&lt;br /&gt;
# MediaWiki will be started as part of the initialization of the environment. There is no further requirement for this processes.&lt;br /&gt;
# It may be necessary to restart MySQL if you are receiving the error: &amp;lt;i&amp;gt;Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'&amp;lt;/i&amp;gt; or &amp;lt;i&amp;gt;Connection refused - /var/lib/mysql/mysql.sock&amp;lt;/i&amp;gt;.&lt;br /&gt;
#: /sbin/service mysqld restart&lt;br /&gt;
&lt;br /&gt;
(Note: If only the MySql server needs to be restarted, simply run: sudo /etc/init.d/mysqld restart )&lt;br /&gt;
&lt;br /&gt;
Back to [[Expertiza_documentation]] Main page.&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141794</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141794"/>
		<updated>2021-11-28T21:39:07Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
#  The previous implementation takes the text area field in the view to fetch the review comment, but it’s not updated dynamically when the user types a comment. The user needs to save the form then go back to edit view and then request feedback.&lt;br /&gt;
&lt;br /&gt;
== Proposed Solution ==&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
### On click of the get review feedback button, we loop through the dynamically created review question form and store the mapping of questions and the reviewer's corresponding comments which on hovered are displayed as a popup.  &lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and refer to the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendable. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementation == &lt;br /&gt;
&lt;br /&gt;
=== UI Changes ===&lt;br /&gt;
We refactored the UI of the generated table showing the problem, suggestion, and sentiment of the review comment, by adding a tooltip for prompting the Question and its corresponding review comment in the table itself. &lt;br /&gt;
==== UI screenshots ====&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - We have added a tooltip in front of every comment number, which on hovering shows the question for which the feedback is given as well as the review comment given for that question.&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes (Dynamic Feedback) ===&lt;br /&gt;
Previously, the implementation took into account the text area field because of which we need to save the form before getting the feedback. We changed the implementation so that users can type in a review comment and dynamically get feedback on it before saving.&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - The global variable response_general was used to store the response, which was not needed as the Promise will return the response and we threw an error in case of rejection, which is handled at the place we call makeRequest&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Refactoring (removing code duplication) ===&lt;br /&gt;
In the previous implementation, code was duplicated for handling different scenarios of fetching the review comment. The code was mostly the same with some conditions. We abstracted the functionality into a method that can be used at multiple places instead of duplicating the code&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description  - The internal function create_comment_object is used for generating comment object according to question and class_name of DOM. This comment JSON is then used to pass to the API for fetching the predictions. &lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Error handling improvements ===&lt;br /&gt;
We introduced error handling by changing the “Loading…” text to “Request failed. Please try again.” if the API for generating feedback fails. Previously, this  case was not handled&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - We have added try-catch blocks while making API call, and if the promise is rejected we catch the error and change the “Loading…” text at the bottom to “Request failed. Please try again.”&lt;br /&gt;
#Files changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests(Manual)===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Important Links ==&lt;br /&gt;
# https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.fxfungdw1d5r&lt;br /&gt;
# https://github.com/expertiza/expertiza/pull/1952 (Previous implementation pull request)&lt;br /&gt;
# https://www.youtube.com/watch?v=OYZvNVa3GZ8&amp;amp;feature=youtu.be (Youtube video for previous implementation)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan Ponnur (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141793</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141793"/>
		<updated>2021-11-28T21:38:44Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
#  The previous implementation takes the text area field in the view to fetch the review comment, but it’s not updated dynamically when the user types a comment. The user needs to save the form then go back to edit view and then request feedback.&lt;br /&gt;
&lt;br /&gt;
===  Proposed Solution ===&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
### On click of the get review feedback button, we loop through the dynamically created review question form and store the mapping of questions and the reviewer's corresponding comments which on hovered are displayed as a popup.  &lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and refer to the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendable. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Implementation == &lt;br /&gt;
&lt;br /&gt;
=== UI Changes ===&lt;br /&gt;
We refactored the UI of the generated table showing the problem, suggestion, and sentiment of the review comment, by adding a tooltip for prompting the Question and its corresponding review comment in the table itself. &lt;br /&gt;
==== UI screenshots ====&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - We have added a tooltip in front of every comment number, which on hovering shows the question for which the feedback is given as well as the review comment given for that question.&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes (Dynamic Feedback) ===&lt;br /&gt;
Previously, the implementation took into account the text area field because of which we need to save the form before getting the feedback. We changed the implementation so that users can type in a review comment and dynamically get feedback on it before saving.&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - The global variable response_general was used to store the response, which was not needed as the Promise will return the response and we threw an error in case of rejection, which is handled at the place we call makeRequest&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Refactoring (removing code duplication) ===&lt;br /&gt;
In the previous implementation, code was duplicated for handling different scenarios of fetching the review comment. The code was mostly the same with some conditions. We abstracted the functionality into a method that can be used at multiple places instead of duplicating the code&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description  - The internal function create_comment_object is used for generating comment object according to question and class_name of DOM. This comment JSON is then used to pass to the API for fetching the predictions. &lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Error handling improvements ===&lt;br /&gt;
We introduced error handling by changing the “Loading…” text to “Request failed. Please try again.” if the API for generating feedback fails. Previously, this  case was not handled&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - We have added try-catch blocks while making API call, and if the promise is rejected we catch the error and change the “Loading…” text at the bottom to “Request failed. Please try again.”&lt;br /&gt;
#Files changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests(Manual)===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Important Links ==&lt;br /&gt;
# https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.fxfungdw1d5r&lt;br /&gt;
# https://github.com/expertiza/expertiza/pull/1952 (Previous implementation pull request)&lt;br /&gt;
# https://www.youtube.com/watch?v=OYZvNVa3GZ8&amp;amp;feature=youtu.be (Youtube video for previous implementation)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan Ponnur (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141792</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141792"/>
		<updated>2021-11-28T21:31:31Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
#  The previous implementation takes the text area field in the view to fetch the review comment, but it’s not updated dynamically when the user types a comment. The user needs to save the form then go back to edit view and then request feedback.&lt;br /&gt;
&lt;br /&gt;
== Implementation == &lt;br /&gt;
&lt;br /&gt;
=== UI Changes ===&lt;br /&gt;
We refactored the UI of the generated table showing the problem, suggestion, and sentiment of the review comment, by adding a tooltip for prompting the Question and its corresponding review comment in the table itself. &lt;br /&gt;
==== UI screenshots ====&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - We have added a tooltip in front of every comment number, which on hovering shows the question for which the feedback is given as well as the review comment given for that question.&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes (Dynamic Feedback) ===&lt;br /&gt;
Previously, the implementation took into account the text area field because of which we need to save the form before getting the feedback. We changed the implementation so that users can type in a review comment and dynamically get feedback on it before saving.&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - The global variable response_general was used to store the response, which was not needed as the Promise will return the response and we threw an error in case of rejection, which is handled at the place we call makeRequest&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Refactoring (removing code duplication) ===&lt;br /&gt;
In the previous implementation, code was duplicated for handling different scenarios of fetching the review comment. The code was mostly the same with some conditions. We abstracted the functionality into a method that can be used at multiple places instead of duplicating the code&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description  - The internal function create_comment_object is used for generating comment object according to question and class_name of DOM. This comment JSON is then used to pass to the API for fetching the predictions. &lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Error handling improvements ===&lt;br /&gt;
We introduced error handling by changing the “Loading…” text to “Request failed. Please try again.” if the API for generating feedback fails. Previously, this  case was not handled&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - We have added try-catch blocks while making API call, and if the promise is rejected we catch the error and change the “Loading…” text at the bottom to “Request failed. Please try again.”&lt;br /&gt;
#Files changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Refactoring ===&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
### On click of the get review feedback button, we loop through the dynamically created review question form and store the mapping of questions and the reviewer's corresponding comments which on hovered are displayed as a popup.  &lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and refer to the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendable. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests(Manual)===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Important Links ==&lt;br /&gt;
# https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.fxfungdw1d5r&lt;br /&gt;
# https://github.com/expertiza/expertiza/pull/1952 (Previous implementation pull request)&lt;br /&gt;
# https://www.youtube.com/watch?v=OYZvNVa3GZ8&amp;amp;feature=youtu.be (Youtube video for previous implementation)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan Ponnur (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141791</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141791"/>
		<updated>2021-11-28T21:21:57Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
#  The previous implementation takes the text area field in the view to fetch the review comment, but it’s not updated dynamically when the user types a comment. The user needs to save the form then go back to edit view and then request feedback.&lt;br /&gt;
&lt;br /&gt;
== Implementation == &lt;br /&gt;
=== UI Changes ===&lt;br /&gt;
We refactored the UI of the generated table showing the problem, suggestion, and sentiment of the review comment, by adding a tooltip for prompting the Question and its corresponding review comment in the table itself. &lt;br /&gt;
==== UI screenshots ====&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes (Dynamic Feedback) ===&lt;br /&gt;
Previously, the implementation took into account the text area field because of which we need to save the form before getting the feedback. We changed the implementation so that users can type in a review comment and dynamically get feedback on it before saving.&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
[[File:Dynamic_1.png]]&lt;br /&gt;
[[File:Dynamic_2.png]]&lt;br /&gt;
#Description - The global variable response_general was used to store the response, which was not needed as the Promise will return the response and we threw an error in case of rejection, which is handled at the place we call makeRequest&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Refactoring (removing code duplication) ===&lt;br /&gt;
In the previous implementation, code was duplicated for handling different scenarios of fetching the review comment. The code was mostly the same with some conditions. We abstracted the functionality into a method that can be used at multiple places instead of duplicating the code&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
[[File:Code_duplication_1.png]]&lt;br /&gt;
#Description  - The internal function create_comment_object is used for generating comment object according to question and class_name of DOM. This comment JSON is then used to pass to the API for fetching the predictions. &lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Error handling improvements ===&lt;br /&gt;
We introduced error handling by changing the “Loading…” text to “Request failed. Please try again.” if the API for generating feedback fails. Previously, this  case was not handled&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
[[File:Error_handling_1.png]]&lt;br /&gt;
#Description - We have added try-catch blocks while making API call, and if the promise is rejected we catch the error and change the “Loading…” text at the bottom to “Request failed. Please try again.”&lt;br /&gt;
#Files changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Refactoring ===&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
### On click of the get review feedback button, we loop through the dynamically created review question form and store the mapping of questions and the reviewer's corresponding comments which on hovered are displayed as a popup.  &lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and refer to the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendable. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests(Manual)===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Important Links ==&lt;br /&gt;
# https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.fxfungdw1d5r&lt;br /&gt;
# https://github.com/expertiza/expertiza/pull/1952 (Previous implementation pull request)&lt;br /&gt;
# https://www.youtube.com/watch?v=OYZvNVa3GZ8&amp;amp;feature=youtu.be (Youtube video for previous implementation)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan Ponnur (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141789</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141789"/>
		<updated>2021-11-28T21:13:49Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
#  The previous implementation takes the text area field in the view to fetch the review comment, but it’s not updated dynamically when the user types a comment. The user needs to save the form then go back to edit view and then request feedback.&lt;br /&gt;
&lt;br /&gt;
== Implementation == &lt;br /&gt;
=== UI Changes ===&lt;br /&gt;
We refactored the UI of the generated table showing the problem, suggestion, and sentiment of the review comment, by adding a tooltip for prompting the Question and its corresponding review comment in the table itself. &lt;br /&gt;
==== UI screenshots ====&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes (Dynamic Feedback) ===&lt;br /&gt;
Previously, the implementation took into account the text area field because of which we need to save the form before getting the feedback. We changed the implementation so that users can type in a review comment and dynamically get feedback on it before saving.&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - The global variable response_general was used to store the response, which was not needed as the Promise will return the response and we threw an error in case of rejection, which is handled at the place we call makeRequest&lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Refactoring (removing code duplication) ===&lt;br /&gt;
In the previous implementation, code was duplicated for handling different scenarios of fetching the review comment. The code was mostly the same with some conditions. We abstracted the functionality into a method that can be used at multiple places instead of duplicating the code&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description  - The internal function create_comment_object is used for generating comment object according to question and class_name of DOM. This comment JSON is then used to pass to the API for fetching the predictions. &lt;br /&gt;
#File changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
=== Error handling improvements ===&lt;br /&gt;
We introduced error handling by changing the “Loading…” text to “retry” if the API for generating feedback fails. Previously, this  case was not handled&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
#Description - We have added try-catch blocks while making API call, and if the promise is rejected we catch the error and change the “Loading…” text at the bottom to “Request failed. Please try again.”&lt;br /&gt;
#Files changed - app/views/response/_response_analysis.html.erb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===  Refactoring ===&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
### On click of the get review feedback button, we loop through the dynamically created review question form and store the mapping of questions and the reviewer's corresponding comments which on hovered are displayed as a popup.  &lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and refer to the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendable. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests(Manual)===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Important Links ==&lt;br /&gt;
# https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.fxfungdw1d5r&lt;br /&gt;
# https://github.com/expertiza/expertiza/pull/1952 (Previous implementation pull request)&lt;br /&gt;
# https://www.youtube.com/watch?v=OYZvNVa3GZ8&amp;amp;feature=youtu.be (Youtube video for previous implementation)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan Ponnur (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Error_handling_1.png&amp;diff=141788</id>
		<title>File:Error handling 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Error_handling_1.png&amp;diff=141788"/>
		<updated>2021-11-28T21:05:15Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Code_duplication_1.png&amp;diff=141787</id>
		<title>File:Code duplication 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Code_duplication_1.png&amp;diff=141787"/>
		<updated>2021-11-28T21:04:54Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Global_var_2.png&amp;diff=141786</id>
		<title>File:Global var 2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Global_var_2.png&amp;diff=141786"/>
		<updated>2021-11-28T21:04:36Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Global_var_1.png&amp;diff=141785</id>
		<title>File:Global var 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Global_var_1.png&amp;diff=141785"/>
		<updated>2021-11-28T21:04:19Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Dynamic_2.png&amp;diff=141784</id>
		<title>File:Dynamic 2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Dynamic_2.png&amp;diff=141784"/>
		<updated>2021-11-28T21:01:47Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Dynamic_1.png&amp;diff=141783</id>
		<title>File:Dynamic 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Dynamic_1.png&amp;diff=141783"/>
		<updated>2021-11-28T21:01:04Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141782</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=141782"/>
		<updated>2021-11-28T20:53:42Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
#  The previous implementation takes the text area field in the view to fetch the review comment, but it’s not updated dynamically when the user types a comment. The user needs to save the form then go back to edit view and then request feedback.&lt;br /&gt;
&lt;br /&gt;
== Implementation == &lt;br /&gt;
=== UI Changes ===&lt;br /&gt;
We refactored the UI of the generated table showing the problem, suggestion, and sentiment of the review comment, by adding a tooltip for prompting the Question and its corresponding review comment in the table itself. &lt;br /&gt;
==== UI screenshots ====&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes (Dynamic Feedback) ===&lt;br /&gt;
Previously, the implementation took into account the text area field because of which we need to save the form before getting the feedback. We changed the implementation so that users can type in a review comment and dynamically get feedback on it before saving.&lt;br /&gt;
==== Javascript implementation ====&lt;br /&gt;
&lt;br /&gt;
===  Refactoring ===&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
### On click of the get review feedback button, we loop through the dynamically created review question form and store the mapping of questions and the reviewer's corresponding comments which on hovered are displayed as a popup.  &lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and refer to the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendable. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests(Manual)===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Important Links ==&lt;br /&gt;
# https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.fxfungdw1d5r&lt;br /&gt;
# https://github.com/expertiza/expertiza/pull/1952 (Previous implementation pull request)&lt;br /&gt;
# https://www.youtube.com/watch?v=OYZvNVa3GZ8&amp;amp;feature=youtu.be (Youtube video for previous implementation)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan Ponnur (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140598</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140598"/>
		<updated>2021-11-03T05:47:41Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Proposed Solution == &lt;br /&gt;
===  Refactoring ===&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and use the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendible. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Important Links ==&lt;br /&gt;
# https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.fxfungdw1d5r&lt;br /&gt;
# https://github.com/expertiza/expertiza/pull/1952 (Previous implementation pull request)&lt;br /&gt;
# https://www.youtube.com/watch?v=OYZvNVa3GZ8&amp;amp;feature=youtu.be (Youtube video for previous implementation)&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140597</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140597"/>
		<updated>2021-11-03T05:45:15Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: /* Testing Plan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Proposed Solution == &lt;br /&gt;
===  Refactoring ===&lt;br /&gt;
[[File:PreviousImplementation.jpeg|1000px|thumb| center | previous Implementation]]&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, users can easily check the feedback for each comment given to each rubric item. We propose the following  solution&lt;br /&gt;
## Each comment on hover shows the user's respective comment on the specific rubric review question so that the feedback is easily accessible.&lt;br /&gt;
[[File:Proposedsolution.jpeg|1000px|thumb| center | LOFI Design of Proposed Solution]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and use the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API calls. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendible. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
This project mainly addresses the UI issues and some code refactoring in views. Therefore, we will be focussing on view tests as all the automated tests have been previously implemented and new code won't affect those.&lt;br /&gt;
&lt;br /&gt;
===View Tests===&lt;br /&gt;
&lt;br /&gt;
#The functionality was written on the client side in javascript solely in _response_analysis.html.erb&lt;br /&gt;
#To test this view, any type of review must be accessible as a student.&lt;br /&gt;
#There is a button at the bottom of the review called 'Get Review Feedback'.&lt;br /&gt;
#When pressing button, API calls are issued and the metrics will show up within the table (a sample of which is shown in above screenshot).&lt;br /&gt;
#As API calls will take time, 'Loading..' text will appear until the API calls are complete&lt;br /&gt;
#All the review feedback for the comments will be displayed in a colorful table.&lt;br /&gt;
#In the feedback table, upon hovering on the comment number, we will be able to see the rubric item and review comments associated with that particular rubric item&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire (glbrook2)&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140495</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140495"/>
		<updated>2021-11-03T00:42:37Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Proposed Solution == &lt;br /&gt;
===  Refactoring ===&lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, user can easily check the feedback for each comment given to each rubric item. We propose that instead of showing a table with feedback on all comments, we will be showing the feedback below each rubric item so that the feedback is easily accessible.&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and use the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API call. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendible. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button. We propose to save this information in config files which can be easily modified and will remove unnecessary information from the code.&lt;br /&gt;
&lt;br /&gt;
=== Possible files to be edited === &lt;br /&gt;
# review_metrics.yml&lt;br /&gt;
# response.html.erb&lt;br /&gt;
# _response_analysis.html.erb&lt;br /&gt;
# response_controller.rb&lt;br /&gt;
# response_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
== Sample API Input/Output ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire ()&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan (sponnur)&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140494</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140494"/>
		<updated>2021-11-03T00:23:19Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Definition ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen, it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services. We need to make the UI more intuitive by allowing users to view the feedback of specific review comments and the code needs to be refactored to remove redundancy to follow the DRY principle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Previous Implementation ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
The previous implementation added the following features:&lt;br /&gt;
# Setup a config file 'review_metric.yml' where the instructor can select what review metric to display for the current assignments&lt;br /&gt;
# API calls (sentiment, problem, suggestion) are made and a table is rendered below, displaying the feedback of the review comments.&lt;br /&gt;
# The total time taken by the API calls was also displayed.&lt;br /&gt;
&lt;br /&gt;
=== UI Screenshots ===&lt;br /&gt;
The following image shows how a reviewer interacts with the system to get feedback on the review comments.&lt;br /&gt;
[[File:Steps_metric.png|1200px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
=== Control Flow ===&lt;br /&gt;
&lt;br /&gt;
[[File:Review_metric.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Issues with Previous Work ==&lt;br /&gt;
&lt;br /&gt;
With the previous implementation of this project, students can write comments and request feedback for the comments. There are certain issues with the previous implementation that needs to be addressed.&lt;br /&gt;
&lt;br /&gt;
# The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment.&lt;br /&gt;
# Too much specific information on metrics is encoded into the text.  While some of the info is in configuration files, the help text for the info buttons is in the code.&lt;br /&gt;
# Currently there are many repetitive blocks of code. For Ex.; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Proposed Solution == &lt;br /&gt;
# We need to improve the UI so that if there are many rubric items, user can easily check the feedback for each comment given to each rubric item. We propose that instead of showing a table with feedback on all comments, we will be showing the feedback below each rubric item so that the feedback is easily accessible.&lt;br /&gt;
# Another issue with the current implementation is that code is quite repetitive for making different API calls  (Sentiment, Suggestion, etc). We propose to store the API link in the config file and use the variable in the getReviewFeedback()&lt;br /&gt;
# We also plan to remove a global variable response_general, which is being used to store the response of API call. We will refactor the makeRequest function to directly return the response which can be used in various places. This will resolve implicit coupling issues in the code and make it more easily extendible. &lt;br /&gt;
# The previous implementation has hardcoded configuration information like the help text button.&lt;br /&gt;
&lt;br /&gt;
== Comments on Prior Teams Implementation ==&lt;br /&gt;
* The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  &lt;br /&gt;
** So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment&lt;br /&gt;
* There is too much specific information on metrics that is encoded into the text.&lt;br /&gt;
** While some of the info is in configuration files, the help text for the info buttons is in the code.  Also, calls for each metric are programmed into the code, though, depending on how diverse they are, this is perhaps unavoidable&lt;br /&gt;
* The code can be more modularized. &lt;br /&gt;
** Currently there are many repetitive blocks of code. For ex; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there. So it might be more beneficial to store the API link in the config file and use the variable in the function&lt;br /&gt;
&lt;br /&gt;
== API Endpoints==&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/all for all metrics at once&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/volume for volume metrics only&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/sentiment for sentiment metrics only&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/suggestions for suggestions metrics only&lt;br /&gt;
&lt;br /&gt;
== JSON Formatting ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire ()&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi (ddoshi2)&lt;br /&gt;
&lt;br /&gt;
* Srujan (sponnur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Relevant Links ==&lt;br /&gt;
* https://expertiza.csc.ncsu.edu/index.php/CSC/ECE_517_Spring_2021_-_E2112._Integrate_Suggestion_Detection_Algorithm&lt;br /&gt;
* https://github.com/expertiza/expertiza/pull/1952&lt;br /&gt;
* https://github.com/harshkachhadia/expertiza/tree/beta&lt;br /&gt;
* https://youtu.be/OYZvNVa3GZ8&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140486</id>
		<title>CSC/ECE 517 Fall 2021 - E2150. Integrate suggestion detection algorithm</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2150._Integrate_suggestion_detection_algorithm&amp;diff=140486"/>
		<updated>2021-11-02T23:33:45Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problem Defination ==&lt;br /&gt;
Peer-review systems like Expertiza utilize a lot of students’ input to determine each other’s performance. At the same time, students learn from the reviews they receive to improve their own performance. In order to make this happen,it would be good to have everyone give quality reviews instead of generic ones. Currently, Expertiza has a few classifiers that can detect useful features of review comments, such as whether they contain suggestions. The suggestion-detection algorithm has been coded as a web service, and other detection algorithms, such as problem detection and sentiment analysis, also exist as newer web services.&lt;br /&gt;
With the previous implementation of this project, student can write comments and  request the fee&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tasks ==&lt;br /&gt;
There are Several tasks that we are looking to address by the end of the project which are seen below: &lt;br /&gt;
&lt;br /&gt;
# When a student submits a review (in the response_controller), we would like to call this web service with the student’s review as the input. We would then want to tell the student whether their reviews contain suggestions or not, so they can make improvements based on the results of the webservice. &lt;br /&gt;
#* The response_controller should pass a text string (the comments field of each Answer object) to the web service.&lt;br /&gt;
#* In fact, the response_controller could pass this string to a whole set of metrics (volume, sentiment, problem detection, suggestion counter).&lt;br /&gt;
# We would also like to evaluate how much time this API is taking and if possible work a way out to improve it. We don’t want the system to be terribly slow.&lt;br /&gt;
# We also have a web service for problem detection.  That should be integrated too.&lt;br /&gt;
&lt;br /&gt;
== Issues to be Addressed ==&lt;br /&gt;
# Update how current implementation gets data from the web service.&lt;br /&gt;
#* Yulin's code calls another module that grabs the data from web services in bulk, and divvies it out one item at a time.&lt;br /&gt;
#* How would you call it to get suggestion confidence and problem-detection confidence level, etc.?&lt;br /&gt;
# Reading a data structure that tells which metrics we are interested in now, and therefore which need to be shown in the view.&lt;br /&gt;
#* For example, the data structure may say, For this assignment, we are interested in &lt;br /&gt;
#** problem detection&lt;br /&gt;
#** suggestions, and&lt;br /&gt;
#** sentiment analysis.&lt;br /&gt;
#* For another assignment, it might be&lt;br /&gt;
#** localization and&lt;br /&gt;
#** helpfulness&lt;br /&gt;
#Displaying the information in an appropriate view.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comments on Prior Teams Implementation ==&lt;br /&gt;
* The criteria are numbered in the view, and those numbers do not correspond to anything on the rubric form.  &lt;br /&gt;
** So if the rubric is long, it would be quite difficult for the reviewer to figure out what automated feedback referred to which comment&lt;br /&gt;
* There is too much specific information on metrics that is encoded into the text.&lt;br /&gt;
** While some of the info is in configuration files, the help text for the info buttons is in the code.  Also, calls for each metric are programmed into the code, though, depending on how diverse they are, this is perhaps unavoidable&lt;br /&gt;
* The code can be more modularized. &lt;br /&gt;
** Currently there are many repetitive blocks of code. For ex; in _response_analysis.html for the getReviewFeedback(), the API call for each type of tag (sentiment, suggestion, etc) is being repeated. Only the API link differs there. So it might be more beneficial to store the API link in the config file and use the variable in the function&lt;br /&gt;
&lt;br /&gt;
== API Endpoints==&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/all for all metrics at once&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/volume for volume metrics only&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/sentiment for sentiment metrics only&lt;br /&gt;
* https://peer-reviews-nlp.herokuapp.com/suggestions for suggestions metrics only&lt;br /&gt;
&lt;br /&gt;
== JSON Formatting ==&lt;br /&gt;
* Input Text is passed in the following JSON format&lt;br /&gt;
  { &lt;br /&gt;
      &amp;quot;text&amp;quot; : &amp;quot;This is an excellent project. Keep up the great work&amp;quot; &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
* Output is returned in the following JSON format:&lt;br /&gt;
  {          &lt;br /&gt;
      &amp;quot;sentiment_score&amp;quot;: 0.9,&lt;br /&gt;
      &amp;quot;sentiment_tone&amp;quot;: &amp;quot;Positive&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions&amp;quot;: &amp;quot;absent&amp;quot;,&lt;br /&gt;
      &amp;quot;suggestions_chances&amp;quot;: 10.17,&lt;br /&gt;
      &amp;quot;text&amp;quot;: &amp;quot;This is an excellent project. Keep up the great work&amp;quot;,&lt;br /&gt;
      &amp;quot;total_volume&amp;quot;: 10,&lt;br /&gt;
      &amp;quot;volume_without_stopwords&amp;quot;: 6&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
&lt;br /&gt;
* Prashan Sengo (psengo)&lt;br /&gt;
&lt;br /&gt;
* Griffin Brookshire ()&lt;br /&gt;
&lt;br /&gt;
* Divyang Doshi ()&lt;br /&gt;
&lt;br /&gt;
* Srujan ()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Relevant Links ==&lt;br /&gt;
* https://expertiza.csc.ncsu.edu/index.php/CSC/ECE_517_Spring_2021_-_E2112._Integrate_Suggestion_Detection_Algorithm&lt;br /&gt;
* https://github.com/expertiza/expertiza/pull/1952&lt;br /&gt;
* https://github.com/harshkachhadia/expertiza/tree/beta&lt;br /&gt;
* https://youtu.be/OYZvNVa3GZ8&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139237</id>
		<title>CSC/ECE 517 Fall 2021 - E2139. Remove multiple topics at a time</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139237"/>
		<updated>2021-10-20T01:01:20Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About Expertiza==&lt;br /&gt;
Expertiza is a Ruby on Rails based open source project that allows users to submit a variety of document types, including URLs and wiki pages.&lt;br /&gt;
It allows the instructor to create and customize new or existing assignments as well as a list of topics for which students can sign up.&lt;br /&gt;
Expertiza allows students to form groups to work on various projects and assignments. It also allows students to peer review the work of other students.&lt;br /&gt;
&lt;br /&gt;
==Project Description==&lt;br /&gt;
Expertiza has Assignment objects, which represent an assignment that is done by several users.  For some assignments, students need to select a topic before submitting work. For deleting a topic, there is a checkbox beside each topic that can be selected and then the instructor or TA can delete the selected topics from the assignment. The feature needs to be tested thoroughly for various scenarios where different kinds of flags for the assignment are checked like the staggered deadline, private assignment, micro task assignment. Also, we need to test the feature when all topics are deleted, some topics are deleted and only one topic is deleted. &lt;br /&gt;
&lt;br /&gt;
===Team Members===&lt;br /&gt;
&amp;lt;li&amp;gt; Divyang Doshi &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Hardik Udeshi &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Shlok Sayani &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Files Involved===&lt;br /&gt;
spec/controllers/sign_up_sheet_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
===Running test cases===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
run the command :- rspec spec/controllers/sign_up_sheet_controller_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing scenarios==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is a microtask and all other flags are False. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a microtask assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the microtask assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 6000)&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 6000)&lt;br /&gt;
      params = {assignment_id: 6000}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 6000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/6000/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Deleting multiple topics of microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a microtask assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for not microtask assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000, topic_identifier: 'topic6000')&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 7000, topic_identifier: 'topic7000')&lt;br /&gt;
      create(:topic, id: 8000, assignment_id: 7000, topic_identifier: 'topic8000')&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic6000', 'topic7000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic8000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Deleting single topic of microtask assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a microtask assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a microtask assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 6000, topic_identifier: 'topic6000')&lt;br /&gt;
      params = {assignment_id: 6000, topic_ids: ['topic6000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 6000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/6000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;When the assignment is not microtask assignment and staggered and private flags are True. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of non-microtask assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a non-microtask assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for not microtask assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000, topic_identifier: 'topic6000')&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic6000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of non-microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-microtask assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for not microtask assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000, topic_identifier: 'topic6000')&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 7000, topic_identifier: 'topic7000')&lt;br /&gt;
      create(:topic, id: 8000, assignment_id: 7000, topic_identifier: 'topic8000')&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic6000', 'topic7000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic8000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of non-microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-microtask assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for not microtask assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000)&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 7000)&lt;br /&gt;
      params = {assignment_id: 7000}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is a staggered deadline and microtask and private flags are False. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of staggered deadline assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a staggered deadline assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for a staggered deadline assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 40, topic_identifier: 'E1733')&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1733']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a staggered deadline assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for a staggered deadline assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 40, topic_identifier: 'E1735')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 40, topic_identifier: 'E1736')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 40, topic_identifier: 'E1737')&lt;br /&gt;
      create(:topic, id: 60, assignment_id: 40, topic_identifier: 'E1738')&lt;br /&gt;
      create(:topic, id: 70, assignment_id: 40, topic_identifier: 'E1739')&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1735', 'E1736']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 3&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1737', 'E1738']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1739']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a staggered deadline assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the staggered deadline assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 40, topic_identifier: 'E1740')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 40, topic_identifier: 'E1741')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 40, topic_identifier: 'E1742')&lt;br /&gt;
      params = {assignment_id: 40}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is a non-staggered deadline and microtask and private flags are True. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of non-staggered deadline assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a non-staggered deadline assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for not a staggered deadline assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 30, topic_identifier: 'E1734')&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1734']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of non-staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-staggered deadline assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for not a staggered deadline assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 30, topic_identifier: 'E1735')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 30, topic_identifier: 'E1736')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 30, topic_identifier: 'E1737')&lt;br /&gt;
      create(:topic, id: 60, assignment_id: 30, topic_identifier: 'E1738')&lt;br /&gt;
      create(:topic, id: 70, assignment_id: 30, topic_identifier: 'E1739')&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1735', 'E1736']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 3&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1737', 'E1738']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1739']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of non-staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-staggered deadline assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the non-staggered deadline assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 30, topic_identifier: 'E1740')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 30, topic_identifier: 'E1741')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 30, topic_identifier: 'E1742')&lt;br /&gt;
      params = {assignment_id: 30}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is private and other flags are False. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Test deleting a single topic in private assignments. We first create a topic that is to be deleted afterwards. Then, assign this topic to a private assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a private assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 2, topic_identifier: 'topic2')&lt;br /&gt;
      params = {assignment_id: 2, topic_ids: ['topic2']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a private assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a private assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 2, topic_identifier: 'topic2')&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 2, topic_identifier: 'topic3')&lt;br /&gt;
      create(:topic, id: 4, assignment_id: 2, topic_identifier: 'topic4')&lt;br /&gt;
      params = {assignment_id: 2, topic_ids: ['topic2', 'topic3']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 2, topic_ids: ['topic4']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a private assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the private assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 2)&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 2)&lt;br /&gt;
      params = {assignment_id: 2}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is non-private and other flags are True. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of non-private assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a non-private assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a non private assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 3, topic_identifier: 'topic2')&lt;br /&gt;
      params = {assignment_id: 3, topic_ids: ['topic2']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of non-private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-private assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a non private assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 3, topic_identifier: 'topic2')&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 3, topic_identifier: 'topic3')&lt;br /&gt;
      create(:topic, id: 8, assignment_id: 3, topic_identifier: 'topic4')&lt;br /&gt;
      params = {assignment_id: 3, topic_ids: ['topic2', 'topic3']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 3, topic_ids: ['topic4']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of non-private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-private assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for non private assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 3)&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 3)&lt;br /&gt;
      params = {assignment_id: 3}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test Results==&lt;br /&gt;
&lt;br /&gt;
==Repository Link==&lt;br /&gt;
&lt;br /&gt;
https://github.com/hvudeshi/expertiza/tree/beta&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139233</id>
		<title>CSC/ECE 517 Fall 2021 - E2139. Remove multiple topics at a time</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139233"/>
		<updated>2021-10-20T00:53:09Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About Expertiza==&lt;br /&gt;
Expertiza is a Ruby on Rails based open source project that allows users to submit a variety of document types, including URLs and wiki pages.&lt;br /&gt;
It allows the instructor to create and customize new or existing assignments as well as a list of topics for which students can sign up.&lt;br /&gt;
Expertiza allows students to form groups to work on various projects and assignments. It also allows students to peer review the work of other students.&lt;br /&gt;
&lt;br /&gt;
==Project Description==&lt;br /&gt;
Expertiza has Assignment objects, which represent an assignment that is done by a number of users.  For some assignments, students need to select a topic before submitting work. For deleting a topic, there is a checkbox beside each topic that can be selected and then the instructor or TA can delete the selected topics from the assignment. The feature needs to be tested thoroughly for various scenarios where different kinds of flags for the assignment are checked like staggered deadline, private assignment, micro task assignment. Also, we need to test the feature when all topics are deleted, some topics are deleted and only one topic is deleted. &lt;br /&gt;
&lt;br /&gt;
===Team Members===&lt;br /&gt;
&amp;lt;li&amp;gt; Divyang Doshi &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Hardik Udeshi &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Shlok Sayani &amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Files Involved===&lt;br /&gt;
spec/controllers/sign_up_sheet_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
===Running test cases===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
run the command :- rspec spec/controllers/sign_up_sheet_controller_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing scenarios==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is a microtask and all other flags are False. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a microtask assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the microtask assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 6000)&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 6000)&lt;br /&gt;
      params = {assignment_id: 6000}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 6000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/6000/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Deleting multiple topics of microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a microtask assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for not microtask assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000, topic_identifier: 'topic6000')&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 7000, topic_identifier: 'topic7000')&lt;br /&gt;
      create(:topic, id: 8000, assignment_id: 7000, topic_identifier: 'topic8000')&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic6000', 'topic7000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic8000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&lt;br /&gt;
Deleting single topic of microtask assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a microtask assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a microtask assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 6000, topic_identifier: 'topic6000')&lt;br /&gt;
      params = {assignment_id: 6000, topic_ids: ['topic6000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 6000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/6000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;When the assignment is not microtask assignment and staggered and private flags are True. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of non-microtask assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a non-microtask assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for not microtask assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000, topic_identifier: 'topic6000')&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic6000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of non-microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-microtask assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for not microtask assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000, topic_identifier: 'topic6000')&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 7000, topic_identifier: 'topic7000')&lt;br /&gt;
      create(:topic, id: 8000, assignment_id: 7000, topic_identifier: 'topic8000')&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic6000', 'topic7000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic8000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of non-microtask assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-microtask assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for not microtask assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000)&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 7000)&lt;br /&gt;
      params = {assignment_id: 7000}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is a staggered deadline and microtask and private flags are False. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of staggered deadline assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a staggered deadline assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for a staggered deadline assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 40, topic_identifier: 'E1733')&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1733']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a staggered deadline assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for a staggered deadline assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 40, topic_identifier: 'E1735')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 40, topic_identifier: 'E1736')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 40, topic_identifier: 'E1737')&lt;br /&gt;
      create(:topic, id: 60, assignment_id: 40, topic_identifier: 'E1738')&lt;br /&gt;
      create(:topic, id: 70, assignment_id: 40, topic_identifier: 'E1739')&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1735', 'E1736']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 3&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1737', 'E1738']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 40, topic_ids: ['E1739']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a staggered deadline assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the staggered deadline assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 40, topic_identifier: 'E1740')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 40, topic_identifier: 'E1741')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 40, topic_identifier: 'E1742')&lt;br /&gt;
      params = {assignment_id: 40}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 40).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/40/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is a non-staggered deadline and microtask and private flags are True. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of non-staggered deadline assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a non-staggered deadline assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for not a staggered deadline assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 30, topic_identifier: 'E1734')&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1734']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of non-staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-staggered deadline assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'create topic and delete_all_selected_topics for not a staggered deadline assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 30, topic_identifier: 'E1735')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 30, topic_identifier: 'E1736')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 30, topic_identifier: 'E1737')&lt;br /&gt;
      create(:topic, id: 60, assignment_id: 30, topic_identifier: 'E1738')&lt;br /&gt;
      create(:topic, id: 70, assignment_id: 30, topic_identifier: 'E1739')&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1735', 'E1736']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 3&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1737', 'E1738']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 30, topic_ids: ['E1739']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of non-staggered deadline assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-staggered deadline assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the non-staggered deadline assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 30, assignment_id: 30, topic_identifier: 'E1740')&lt;br /&gt;
      create(:topic, id: 40, assignment_id: 30, topic_identifier: 'E1741')&lt;br /&gt;
      create(:topic, id: 50, assignment_id: 30, topic_identifier: 'E1742')&lt;br /&gt;
      params = {assignment_id: 30}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 30).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/30/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is private and other flags are False. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Test deleting a single topic in private assignments. We first create a topic that is to be deleted afterwards. Then, assign this topic to a private assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a private assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 2, topic_identifier: 'topic2')&lt;br /&gt;
      params = {assignment_id: 2, topic_ids: ['topic2']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a private assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a private assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 2, topic_identifier: 'topic2')&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 2, topic_identifier: 'topic3')&lt;br /&gt;
      create(:topic, id: 4, assignment_id: 2, topic_identifier: 'topic4')&lt;br /&gt;
      params = {assignment_id: 2, topic_ids: ['topic2', 'topic3']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 2, topic_ids: ['topic4']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a private assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for the private assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 2)&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 2)&lt;br /&gt;
      params = {assignment_id: 2}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 2).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/2/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is non-private and other flags are True. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting single topic of non-private assignments. We first create a topic that is to be deleted afterward. Then, assign this topic to a non-private assignment. Then, we pass this topic to delete_all_selected_topics. As of now, this topic needs to be deleted by the method, we fire a query to check the topic with the same topic_id exists in the database or not. If it is successfully deleted, the count should be returned 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a non private assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 3, topic_identifier: 'topic2')&lt;br /&gt;
      params = {assignment_id: 3, topic_ids: ['topic2']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting multiple topics of non-private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-private assignment. Then, we pass these topics multiple at a time to the delete_all_selected_topics method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with the topic remaining by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a non private assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 3, topic_identifier: 'topic2')&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 3, topic_identifier: 'topic3')&lt;br /&gt;
      create(:topic, id: 8, assignment_id: 3, topic_identifier: 'topic4')&lt;br /&gt;
      params = {assignment_id: 3, topic_ids: ['topic2', 'topic3']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 3, topic_ids: ['topic4']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Deleting all topics of non-private assignments. We first create some topics that are to be deleted afterward. Then, assign these topics to a non-private assignment. Then, we pass these topics all at a time to the delete_all_topics_for_assignment method. As of now, these topics need to be deleted by the method, we fire a query to check the topics with the same topic_ids exist in the database or not. If it is successfully deleted, the count should be returned with 0 by the query. We also assert that redirect to edit assignment page is successful after deletion of topics. &lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'deletes all topics for non private assignment and redirects to edit assignment page' do&lt;br /&gt;
      create(:topic, id: 2, assignment_id: 3)&lt;br /&gt;
      create(:topic, id: 3, assignment_id: 3)&lt;br /&gt;
      params = {assignment_id: 3}&lt;br /&gt;
      post :delete_all_topics_for_assignment, params.merge(format: :html)&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 3).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(flash[:success]).to eq('All topics have been deleted successfully.')&lt;br /&gt;
      expect(response).to redirect_to('/assignments/3/edit')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test Results==&lt;br /&gt;
&lt;br /&gt;
==Repository Link==&lt;br /&gt;
&lt;br /&gt;
https://github.com/hvudeshi/expertiza/tree/beta&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139171</id>
		<title>CSC/ECE 517 Fall 2021 - E2139. Remove multiple topics at a time</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139171"/>
		<updated>2021-10-19T07:57:47Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About Expertiza==&lt;br /&gt;
Expertiza is a Ruby on Rails based open source project that allows users to submit a variety of document types, including URLs and wiki pages.&lt;br /&gt;
It allows the instructor to create and customize new or existing assignments as well as a list of topics for which students can sign up.&lt;br /&gt;
Expertiza allows students to form groups to work on various projects and assignments. It also allows students to peer review the work of other students.&lt;br /&gt;
&lt;br /&gt;
==Project Description==&lt;br /&gt;
Expertiza has Assignment objects, which represent an assignment that is done by a number of users.  For some assignments, students need to select a topic before submitting work. For deleting a topic, there is a checkbox beside each topic that can be selected and then the instructor or TA can delete the selected topics from the assignment. The feature needs to be tested thoroughly for various scenarios where different kinds of flags for the assignment are checked like staggered deadline, private assignment, micro task assignment. Also, we need to test the feature when all topics are deleted, some topics are deleted and only one topic is deleted. &lt;br /&gt;
&lt;br /&gt;
===Team Members===&lt;br /&gt;
Divyang Doshi&lt;br /&gt;
Hardik Udeshi&lt;br /&gt;
Shlok Sayani&lt;br /&gt;
&lt;br /&gt;
===Files Involved===&lt;br /&gt;
spec/controllers/sign_up_sheet_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
===Running test cases===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
run the command :- rspec spec/controllers/sign_up_sheet_controller_spec.rb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testing scenarios==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; When the assignment is a microtask and all other flags are False. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Testing deleting all topics for microtask assignment. We test the delete all functionality by creating few topics associated with a microtask assignment and then do a post request on delete_all_selected_topics. We then expect the number of topics related to this assignment should be 0. We also assert that redirect to edit assignment page is successful after deletion of topics.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for a microtask assignment and redirects to edit assignment page with single topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 6000, topic_identifier: 'topic6000')&lt;br /&gt;
      params = {assignment_id: 6000, topic_ids: ['topic6000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 6000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/6000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;Testing deleting multiple topics for microtask assignment. We test the delete multiple functionality by creating few topics associated with a microtask assignment and then do a post request on delete_all_selected_topics. We then expect the number of topics related to this assignment should be number of topics created - number of topics deleted. We also assert that redirect to edit assignment page is successful after deletion of topics.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    it 'delete_all_selected_topics for not microtask assignment and redirects to edit assignment page with multiple topic selected' do&lt;br /&gt;
      create(:topic, id: 6000, assignment_id: 7000, topic_identifier: 'topic6000')&lt;br /&gt;
      create(:topic, id: 7000, assignment_id: 7000, topic_identifier: 'topic7000')&lt;br /&gt;
      create(:topic, id: 8000, assignment_id: 7000, topic_identifier: 'topic8000')&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic6000', 'topic7000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 1&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
&lt;br /&gt;
      params = {assignment_id: 7000, topic_ids: ['topic8000']}&lt;br /&gt;
      post :delete_all_selected_topics, params&lt;br /&gt;
      expect(flash[:success]).to eq('All selected topics have been deleted successfully.')&lt;br /&gt;
      topics_exist = SignUpTopic.where(assignment_id: 7000).count&lt;br /&gt;
      expect(topics_exist).to be_eql 0&lt;br /&gt;
      expect(response).to redirect_to('/assignments/7000/edit#tabs-2')&lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Test Results==&lt;br /&gt;
&lt;br /&gt;
==Repository Link==&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139170</id>
		<title>CSC/ECE 517 Fall 2021 - E2139. Remove multiple topics at a time</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2139._Remove_multiple_topics_at_a_time&amp;diff=139170"/>
		<updated>2021-10-19T04:02:35Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: Created page with &amp;quot;==About Expertiza== Expertiza is a Ruby on Rails based open source project that allows users to submit a variety of document types, including URLs and wiki pages. It allows th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==About Expertiza==&lt;br /&gt;
Expertiza is a Ruby on Rails based open source project that allows users to submit a variety of document types, including URLs and wiki pages.&lt;br /&gt;
It allows the instructor to create and customize new or existing assignments as well as a list of topics for which students can sign up.&lt;br /&gt;
Expertiza allows students to form groups to work on various projects and assignments. It also allows students to peer review the work of other students.&lt;br /&gt;
&lt;br /&gt;
==Project Description==&lt;br /&gt;
&lt;br /&gt;
===Team Members===&lt;br /&gt;
===Files Involved===&lt;br /&gt;
===Running test cases===&lt;br /&gt;
&lt;br /&gt;
==Testing scenarios==&lt;br /&gt;
&lt;br /&gt;
==Test Results==&lt;br /&gt;
&lt;br /&gt;
==Repository Link==&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021&amp;diff=139169</id>
		<title>CSC/ECE 517 Fall 2021</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021&amp;diff=139169"/>
		<updated>2021-10-19T03:46:51Z</updated>

		<summary type="html">&lt;p&gt;Ddoshi2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== OSS Projects ==&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - {$num}. {$desc.title}]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2128. Refactor student_quizzes_controller.rb &amp;amp; late_policies_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2132. Add tests cases for review mapping helper.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2134. Write unit tests for admin_controller.rb and institution_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2138. Auto-generate submission directory names based on assignment]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2142. Improve e-mail notifications]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2133. Write tests for popup_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2120. Refactor reputation_web_service_controller.rb]]&lt;br /&gt;
* [[CSC/ECE 517 Fall 2021 - E2139. Remove multiple topics at a time]]&lt;/div&gt;</summary>
		<author><name>Ddoshi2</name></author>
	</entry>
</feed>