<?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=Nkotche</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=Nkotche"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Nkotche"/>
	<updated>2026-05-17T00:13:21Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141593</id>
		<title>CSC/ECE 517 Fall 2021 - E2163. Refactor waitlist functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141593"/>
		<updated>2021-11-10T20:15:36Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Expertiza ==&lt;br /&gt;
The [http://expertiza.ncsu.edu/ Expertiza] platform employs a divide-and-conquer strategy for creating reusable learning objects via active-learning exercises built entirely on [http://rubyonrails.org/ Ruby on Rails] framework. Students get to choose from a list of tasks to complete either individually or in teams. It also allows the instructor to create a list of topics the students can sign up for. They then prepare their work and submit it to a peer-review mechanism. On submission, other students can assess their peers work and provide feedback. Expertiza encourages students to collaborate in order to improve the learning experiences from one another. It aids their learning by making them translate what is taught in the lectures and apply those concepts to a real-world issue.&lt;br /&gt;
&lt;br /&gt;
== Problem Statement ==&lt;br /&gt;
When a team requests a topic which is not available, the team is waitlisted for the topic, given that bidding is not in use for the assignment. When another team drops a topic, then a waitlisted team will be assigned the topic, if there are any teams waitlisted for it. Implement a waitlist object associated with each topic, and a team that requested it when it was not available would just be queued on the waitlist. The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
Currently, the functionality relevant to waitlisting is scattered across the multiple files. These functions need to be consolidated and placed in a single class. &lt;br /&gt;
&lt;br /&gt;
== Control Flow ==&lt;br /&gt;
In the current implementation, multiple models and controllers perform actions that indirectly affect the teams in the waitlist and require to be added or removed from the waitlist. Due to this the same redundant operations of modifying the waitlist is being performed by multiple models and controllers. In order to improve the functionality all the redundant operations being performed on the waitlist need to be moved to the 'waitlist.rb' file and all the other controllers and models will be utilising these methods to manipulate the waitlists.&lt;br /&gt;
&lt;br /&gt;
'''Planned implementation:''' The Context object in our case the waitlist object delegates an algorithm to different Strategy objects to execute waitlist functions as shown below. The Context calls algorithm() on a Strategy1 object, which performs the algorithm and returns the result to Context.&lt;br /&gt;
&lt;br /&gt;
'''Existing Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist current.png|850px]]&lt;br /&gt;
&lt;br /&gt;
'''Modified Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist modified.png|850px]]&lt;br /&gt;
&lt;br /&gt;
== Solution Approach == &lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
Goal of the project is to simplify waitlist functionality by moving all the functions manipulating waitlists to waitlist.rb, along with a WaitingTeam class that would consist of a 〈team_id, topic_id〉pair to store information regarding teams on waitlist for a particular topic. Classes should just invoke methods of waitlist.rb for the following functionality: &lt;br /&gt;
# Add themselves to waitlists&lt;br /&gt;
# Add another team to a waitlist&lt;br /&gt;
# Take a team off a waitlist&lt;br /&gt;
# Purge all waitlists of a specific team&lt;br /&gt;
# Clear a specific waitlist of all waiting teams&lt;br /&gt;
&lt;br /&gt;
Introduce a waitlist object associated with each topic so that any team that requested it when it was not available would just be queued on the waitlist.  The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
 &lt;br /&gt;
===Design Pattern===&lt;br /&gt;
As we are decoupling the functionality manipulating waitlists that is scattered across various files and putting it all under a single class the design pattern opted for is Strategy Design Pattern. It is a behavioural design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.  The plan is to isolate the code, internal data, and dependencies of various algorithms related to waitlist from the rest of the code. Various clients now get a simple class to execute the algorithms and switch them at runtime.&lt;br /&gt;
&lt;br /&gt;
'''Tentative list of files to be modified'''&lt;br /&gt;
# sign_up_topic.rb&lt;br /&gt;
# invitation.rb&lt;br /&gt;
# waitlist.rb&lt;br /&gt;
# lottery_controller.rb&lt;br /&gt;
# suggestion_controller.rb &lt;br /&gt;
# signed_up_team.rb&lt;br /&gt;
# student_teams_controller.rb&lt;br /&gt;
&lt;br /&gt;
== UI Test Steps ==&lt;br /&gt;
* Step 1: Signup as an instructor and click on Manage Assignments&lt;br /&gt;
&lt;br /&gt;
[[File:Manage assignments.png|550px]]&lt;br /&gt;
[[File:Add assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 2: Create an assignment with the required configurations and click on create.&lt;br /&gt;
&lt;br /&gt;
[[File:Create assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 3: Post assignment creation, go to manage assignments, and edit the newly created assignment&lt;br /&gt;
&lt;br /&gt;
[[File:Edit new assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 4: Selected the 'has topics' options and create new topics for the students to sign up using the topics tab.&lt;br /&gt;
&lt;br /&gt;
[[File:Has_topics_assignment_option.png|550px]]&lt;br /&gt;
[[File:Create topics.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 5: Add participants to the assignment using the participant tab and then assign the participants to teams using the teams tab and save the changes.&lt;br /&gt;
&lt;br /&gt;
[[File:Add participants and teams.png|550px]]&lt;br /&gt;
[[File:Add teams.png|550px]]&lt;br /&gt;
[[File:Add participants.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 6: Impersonate one student that you had added to one team in the previous step.&lt;br /&gt;
&lt;br /&gt;
[[File:Impersonate user.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 7: In the assignment tabs, choose the assignment that you had created in the previous step and click on sign-up sheet to sign up for a topic. &lt;br /&gt;
&lt;br /&gt;
[[File:Signup_sheet.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 8: Sign up for any topic of your choice. If it is available then you will be assigned the slot and the number of available slots will be updated.&lt;br /&gt;
&lt;br /&gt;
[[File:Student7488 signup.png|550px]]&lt;br /&gt;
[[File:Student7488 signedup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 9: Impersonate as another student from another team that you had created for the same assignment in the previous steps and follow the same steps as mentioned above to sign up for a topic. Sign up for the same topic as the previously impersonated student.&lt;br /&gt;
&lt;br /&gt;
[[File:Student431 signup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 10: You will now notice that since there was only one available slot and the previous team already signed up for it, the current team will be added to the waitlist for that topic.&lt;br /&gt;
&lt;br /&gt;
[[File:Student 431 waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 11: You can also check the student currently assigned to a topic and the waitlisted students in the manage assignments tab on logging in as an instructor(As done in the previous steps)&lt;br /&gt;
&lt;br /&gt;
[[File:Teams signedup waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 12: Following the above mentioned steps various scenarios can be tested via the UI like: &lt;br /&gt;
# Adding more topics&lt;br /&gt;
# Multiple teams signing up for the same topic&lt;br /&gt;
# Teams dropping topics etc.&lt;br /&gt;
&lt;br /&gt;
'''In the current implemention the following issue exists which will be fixed:'''&lt;br /&gt;
&lt;br /&gt;
'''Scenario 1:''' Assigned teams dropping topics&lt;br /&gt;
&lt;br /&gt;
'''Expected Behaviour :'''&lt;br /&gt;
After one team signs up for a topic and the second team that signs up for the same topic is added to the waitlist, if the first team drops the topic, ideally the available slots should be updated and the second team should be assigned the topic since it is the first on the waitlist.&lt;br /&gt;
&lt;br /&gt;
'''Current Issue :'''&lt;br /&gt;
The available slot after one team drops the topic does not update due to which the first team in the waitlist is not automatically assigned the topic.&lt;br /&gt;
[[File:Topic dropped.png|550px]]&lt;br /&gt;
&lt;br /&gt;
'''Proposed Solution :'''&lt;br /&gt;
Implement a new waitlist object to maintain the list of topics and the teams in the waitlist as ordered pairs: 〈team_id, topic_id〉as soon as the first team drops the topic the team_id field will be updated to the second team since it is the first on the waitlist.&lt;br /&gt;
&lt;br /&gt;
'''Scenario 2:''' Instructor intervention when assigned teams drops topics&lt;br /&gt;
&lt;br /&gt;
'''Expected Behaviour :'''&lt;br /&gt;
After one team signs up for a topic and the second team that signs up for the same topic is added to the waitlist, if the first team drops the topic, ideally the available slots should be updated and the second team should be assigned the topic since it is the first on the waitlist also we know that the manage topics tab while the instructor edits the assignment also contains the team that is currently assigned the topic and the list of waitlisted teams it should be updated when a change occurs.&lt;br /&gt;
&lt;br /&gt;
'''Current Issue :'''&lt;br /&gt;
The instructor does not see in the manage assignments topics tab that the topic is not assigned to the first team once it chooses to drop it.&lt;br /&gt;
[[File:Teams signedup waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
'''Proposed Solution :'''&lt;br /&gt;
Since the same functionality of maintaining the waitlist is being done at multiple places, the code does not update for the manage assignments topic tab for the instructor. In order to fix this, implementation of a new waitlist object is done to maintain the list of topics and the teams in the waitlist as ordered pairs: 〈team_id, topic_id〉as soon as the first team drops the topic the team_id field will be updated to the second team since it is the first on the waitlist and the same object will be consumed everywhere. Hence, the manage assignments topic will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
This project entails code refactoring such that all functionality relevant to waitlist is easily available under one class. Focus is on ensuring existing tests work as expected as the newly added code will not impact functionality per se. However, new unit tests will be written for testing waitlist.rb independently. Furthermore, test cases for suggestion_controller.rb &amp;amp; signed_up_team.rb are missing in the current implementation. Hence, we will be adding spec files for the aforementioned files as well. Certain edge cases will also be tested which have not been covered by the current tests.&lt;br /&gt;
&lt;br /&gt;
'''Test Files'''&lt;br /&gt;
# sign_up_topic_spec.rb&lt;br /&gt;
# invitation_spec.rb&lt;br /&gt;
# waitlist_spec.rb&lt;br /&gt;
# lottery_controller_spec.rb&lt;br /&gt;
# suggestion_controller_spec.rb&lt;br /&gt;
# signed_up_team_spec.rb&lt;br /&gt;
# student_teams_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
'''Cases To Be Tested'''&lt;br /&gt;
# Add team to waitlist if topic isn't available.&lt;br /&gt;
# Push the first waitlisted member (if exists) in case a confirmed slot is deleted.&lt;br /&gt;
# Remove waitlists for team if a topic is confirmed.&lt;br /&gt;
# Clean waitlists &amp;amp; assign topic if the user has a team but not a topic.&lt;br /&gt;
# Remove old team from waitlists.&lt;br /&gt;
&lt;br /&gt;
'''Automated Tests'''&lt;br /&gt;
&lt;br /&gt;
Automated testing can be done using Capybara. Since a major part of the scenario can be tested using the UI, an automated test to create teams and sign up for topics can be created using Capybara with Cucumber. These tests can be written using the TDD approach prior to defining the code.&lt;br /&gt;
&lt;br /&gt;
'''Code Coverage:''' Code coverage for the test cases can be obtained using the Code Coverage plugin and SimpleCov gem. The lines in the functions for which test cases are written in the corresponding spec file are highlighted in green and the rest of the lines are highlighted in red. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.r80b3xxz9peq Problem Statement]&lt;br /&gt;
# [https://github.com/nehajaideep/expertiza Forked Repository]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
* Ankit Singh (asingh072318)&lt;br /&gt;
&lt;br /&gt;
* Asrita Kuchibhotla (kAsrita)&lt;br /&gt;
&lt;br /&gt;
* Neha Kotcherlakota (nehajaideep)&lt;br /&gt;
&lt;br /&gt;
* Vinit Desai (VinitDesai1998)&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141586</id>
		<title>CSC/ECE 517 Fall 2021 - E2163. Refactor waitlist functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141586"/>
		<updated>2021-11-10T05:44:22Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Expertiza ==&lt;br /&gt;
The [http://expertiza.ncsu.edu/ Expertiza] platform employs a divide-and-conquer strategy for creating reusable learning objects via active-learning exercises built entirely on [http://rubyonrails.org/ Ruby on Rails] framework. Students get to choose from a list of tasks to complete either individually or in teams. It also allows the instructor to create a list of topics the students can sign up for. They then prepare their work and submit it to a peer-review mechanism. On submission, other students can assess their peers work and provide feedback. Expertiza encourages students to collaborate in order to improve the learning experiences from one another. It aids their learning by making them translate what is taught in the lectures and apply those concepts to a real-world issue.&lt;br /&gt;
&lt;br /&gt;
== Problem Statement ==&lt;br /&gt;
When a team requests a topic which is not available, the team is waitlisted for the topic, given that bidding is not in use for the assignment. When another team drops a topic, then a waitlisted team will be assigned the topic, if there are any teams waitlisted for it. Implement a waitlist object associated with each topic, and a team that requested it when it was not available would just be queued on the waitlist. The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
Currently, the functionality relevant to waitlisting is scattered across the multiple files. These functions need to be consolidated and placed in a single class. &lt;br /&gt;
&lt;br /&gt;
== Control Flow ==&lt;br /&gt;
In the current implementation, multiple models and controllers perform actions that indirectly affect the teams in the waitlist and require to be added or removed from the waitlist. Due to this the same redundant operations of modifying the waitlist is being performed by multiple models and controllers. In order to improve the functionality all the redundant operations being performed on the waitlist need to be moved to the 'waitlist.rb' file and all the other controllers and models will be utilising these methods to manipulate the waitlists.&lt;br /&gt;
Planned implementation: The Context object in our case the waitlist object delegates an algorithm to different Strategy objects to execute waitlist functions as shown below. The Context calls algorithm() on a Strategy1 object, which performs the algorithm and returns the result to Context.&lt;br /&gt;
&lt;br /&gt;
'''Existing Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist current.png|850px]]&lt;br /&gt;
&lt;br /&gt;
'''Modified Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist modified.png|850px]]&lt;br /&gt;
&lt;br /&gt;
== Solution Approach == &lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
Goal of the project is to simplify waitlist functionality by moving all the functions manipulating waitlists to waitlist.rb, along with a WaitingTeam class that would consist of a 〈team_id, topic_id〉pair to store information regarding teams on waitlist for a particular topic. Classes should just invoke methods of waitlist.rb for the following functionality: &lt;br /&gt;
# Add themselves to waitlists&lt;br /&gt;
# Add another team to a waitlist&lt;br /&gt;
# Take a team off a waitlist&lt;br /&gt;
# Purge all waitlists of a specific team&lt;br /&gt;
# Clear a specific waitlist of all waiting teams&lt;br /&gt;
&lt;br /&gt;
Introduce a waitlist object associated with each topic so that any team that requested it when it was not available would just be queued on the waitlist.  The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
 &lt;br /&gt;
===Design Pattern===&lt;br /&gt;
As we are decoupling the functionality manipulating waitlists that is scattered across various files and putting it all under a single class the design pattern opted for is Strategy Design Pattern. It is a behavioral design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.  The plan is to isolate the code, internal data, and dependencies of various algorithms related to waitlist from the rest of the code. Various clients now get a simple class to execute the algorithms and switch them at runtime.&lt;br /&gt;
&lt;br /&gt;
'''Tentative list of files to be modified'''&lt;br /&gt;
# sign_up_topic.rb&lt;br /&gt;
# invitation.rb&lt;br /&gt;
# waitlist.rb&lt;br /&gt;
# lottery_controller.rb&lt;br /&gt;
# suggestion_controller.rb &lt;br /&gt;
# signed_up_team.rb&lt;br /&gt;
# student_teams_controller.rb&lt;br /&gt;
&lt;br /&gt;
== UI Test Steps ==&lt;br /&gt;
* Step 1: Signup as an instructor and click on Manage Assignments&lt;br /&gt;
&lt;br /&gt;
[[File:Manage assignments.png|550px]]&lt;br /&gt;
[[File:Add assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 2: Create an assignment with the required configurations and click on create.&lt;br /&gt;
&lt;br /&gt;
[[File:Create assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 3: Post assignment creation, go to manage assignments, and edit the newly created assignment&lt;br /&gt;
&lt;br /&gt;
[[File:Edit new assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 4: Selected the 'has topics' options and create new topics for the students to sign up using the topics tab.&lt;br /&gt;
&lt;br /&gt;
[[File:Has_topics_assignment_option.png|550px]]&lt;br /&gt;
[[File:Create topics.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 5: Add participants to the assignment using the participant tab and then assign the participants to teams using the teams tab and save the changes.&lt;br /&gt;
&lt;br /&gt;
[[File:Add participants and teams.png|550px]]&lt;br /&gt;
[[File:Add teams.png|550px]]&lt;br /&gt;
[[File:Add participants.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 6: Impersonate one student that you had added to one team in the previous step.&lt;br /&gt;
&lt;br /&gt;
[[File:Impersonate user.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 7: In the assignment tabs, choose the assignment that you had created in the previous step and click on sign-up sheet to sign up for a topic. &lt;br /&gt;
&lt;br /&gt;
[[File:Signup_sheet.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 8: Sign up for any topic of your choice. If it is available then you will be assigned the slot and the number of available slots will be updated.&lt;br /&gt;
&lt;br /&gt;
[[File:Student7488 signup.png|550px]]&lt;br /&gt;
[[File:Student7488 signedup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 9: Impersonate as another student from another team that you had created for the same assignment in the previous steps and follow the same steps as mentioned above to sign up for a topic. Sign up for the same topic as the previously impersonated student.&lt;br /&gt;
&lt;br /&gt;
[[File:Student431 signup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 10: You will now notice that since there was only one available slot and the previous team already signed up for it, the current team will be added to the waitlist for that topic.&lt;br /&gt;
&lt;br /&gt;
[[File:Student 431 waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 11: You can also check the student currently assigned to a topic and the waitlisted students in the manage assignments tab on logging in as an instructor(As done in the previous steps)&lt;br /&gt;
&lt;br /&gt;
[[File:Teams signedup waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 12: Following the above mentioned steps various scenarios can be tested via the UI like: &lt;br /&gt;
# Adding more topics&lt;br /&gt;
# Multiple teams signing up for the same topic&lt;br /&gt;
# Teams dropping topics etc.&lt;br /&gt;
&lt;br /&gt;
'''In the current implemention the following issue exists which will be fixed:'''&lt;br /&gt;
&lt;br /&gt;
'''Scenario 1:''' Assigned teams dropping topics&lt;br /&gt;
&lt;br /&gt;
'''Expected Behaviour :'''&lt;br /&gt;
After one team signs up for a topic and the second team that signs up for the same topic is added to the waitlist, if the first team drops the topic, ideally the available slots should be updated and the second team should be assigned the topic since it is the first on the waitlist.&lt;br /&gt;
&lt;br /&gt;
'''Current Issue :'''&lt;br /&gt;
The available slot after one team drops the topic does not update due to which the first team in the waitlist is not automatically assigned the topic.&lt;br /&gt;
[[File:Topic dropped.png|550px]]&lt;br /&gt;
&lt;br /&gt;
'''Proposed Solution :'''&lt;br /&gt;
Implement a new waitlist object to maintain the list of topics and the teams in the waitlist as ordered pairs: 〈team_id, topic_id〉as soon as the first team drops the topic the team_id field will be updated to the second team since it is the first on the waitlist.&lt;br /&gt;
&lt;br /&gt;
'''Scenario 2:''' Instructor intervention when assigned teams drops topics&lt;br /&gt;
&lt;br /&gt;
'''Expected Behaviour :'''&lt;br /&gt;
After one team signs up for a topic and the second team that signs up for the same topic is added to the waitlist, if the first team drops the topic, ideally the available slots should be updated and the second team should be assigned the topic since it is the first on the waitlist also we know that the manage topics tab while the instructor edits the assignment also contains the team that is currently assigned the topic and the list of waitlisted teams it should be updated when a change occurs.&lt;br /&gt;
&lt;br /&gt;
'''Current Issue :'''&lt;br /&gt;
The instructor does not see in the manage assignments topics tab that the topic is not assigned to the first team once it chooses to drop it.&lt;br /&gt;
[[File:Teams signedup waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
'''Proposed Solution :'''&lt;br /&gt;
Since the same functionality of maintaining the waitlist is being done at multiple places, the code does not update for the manage assignments topic tab for the instructor. In order to fix this, implementation of a new waitlist object is done to maintain the list of topics and the teams in the waitlist as ordered pairs: 〈team_id, topic_id〉as soon as the first team drops the topic the team_id field will be updated to the second team since it is the first on the waitlist and the same object will be consumed everywhere. Hence, the manage assignments topic will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
This project entails code refactoring such that all functionality relevant to waitlist is easily available under one class. Focus is on ensuring existing tests work as expected as the newly added code will not impact functionality per se. However, new unit tests will be written for testing waitlist.rb independently. Furthermore, test cases for suggestion_controller.rb &amp;amp; signed_up_team.rb are missing in the current implementation. Hence, we will be adding spec files for the aforementioned files as well. Certain edge cases will also be tested which have not been covered by the current tests.&lt;br /&gt;
&lt;br /&gt;
'''Test Files'''&lt;br /&gt;
# sign_up_topic_spec.rb&lt;br /&gt;
# invitation_spec.rb&lt;br /&gt;
# waitlist_spec.rb&lt;br /&gt;
# lottery_controller_spec.rb&lt;br /&gt;
# suggestion_controller_spec.rb&lt;br /&gt;
# signed_up_team_spec.rb&lt;br /&gt;
# student_teams_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
'''Cases To Be Tested'''&lt;br /&gt;
# Add team to waitlist if topic isn't available.&lt;br /&gt;
# Push the first waitlisted member (if exists) in case a confirmed slot is deleted.&lt;br /&gt;
# Remove waitlists for team if a topic is confirmed.&lt;br /&gt;
# Clean waitlists &amp;amp; assign topic if the user has a team but not a topic.&lt;br /&gt;
# Remove old team from waitlists.&lt;br /&gt;
&lt;br /&gt;
'''Automated Test Plan'''&lt;br /&gt;
&lt;br /&gt;
Automated testing can be done using Capybara. Since a major part of the scenario can be tested using the UI, an automated test to create teams and sign up for topics can be created using Capybara with Cucumber. These tests can be written using the TDD approach prior to defining the code.&lt;br /&gt;
&lt;br /&gt;
'''Code Coverage:''' Code coverage for the test cases can be obtained using the Code Coverage plugin and SimpleCov gem. The lines in the functions for which test cases are written in the corresponding spec file are highlighted in green and the rest of the lines are highlighted in red. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.r80b3xxz9peq Problem Statement]&lt;br /&gt;
# [https://github.com/nehajaideep/expertiza Forked Repository]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
* Ankit Singh (asingh072318)&lt;br /&gt;
&lt;br /&gt;
* Asrita Kuchibhotla (kAsrita)&lt;br /&gt;
&lt;br /&gt;
* Neha Kotcherlakota (nehajaideep)&lt;br /&gt;
&lt;br /&gt;
* Vinit Desai (VinitDesai1998)&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141573</id>
		<title>CSC/ECE 517 Fall 2021 - E2163. Refactor waitlist functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141573"/>
		<updated>2021-11-09T21:48:02Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Expertiza ==&lt;br /&gt;
The [http://expertiza.ncsu.edu/ Expertiza] platform employs a divide-and-conquer strategy for creating reusable learning objects via active-learning exercises built entirely on [http://rubyonrails.org/ Ruby on Rails] framework. Students get to choose from a list of tasks to complete either individually or in teams. It also allows the instructor to create a list of topics the students can sign up for. They then prepare their work and submit it to a peer-review mechanism. On submission, other students can assess their peers work and provide feedback. Expertiza encourages students to collaborate in order to improve the learning experiences from one another. It aids their learning by making them translate what is taught in the lectures and apply those concepts to a real-world issue.&lt;br /&gt;
&lt;br /&gt;
== Problem Statement ==&lt;br /&gt;
When a team requests a topic which is not available, the team is waitlisted for the topic, given that bidding is not in use for the assignment. When another team drops a topic, then a waitlisted team will be assigned the topic, if there are any teams waitlisted for it. Implement a waitlist object associated with each topic, and a team that requested it when it was not available would just be queued on the waitlist. The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
Currently, the functionality relevant to waitlisting is scattered across the multiple files. These functions need to be consolidated and placed in a single class. &lt;br /&gt;
&lt;br /&gt;
== Control Flow ==&lt;br /&gt;
In the current implementation, multiple models and controllers perform actions that indirectly affect the teams in the waitlist and require to be added or removed from the waitlist. Due to this the same redundant operations of modifying the waitlist is being performed by multiple models and controllers. In order to improve the functionality all the redundant operations being performed on the waitlist need to be moved to the 'waitlist.rb' file and all the other controllers and models will be utilising these methods to manipulate the waitlists.&lt;br /&gt;
Planned implementation: The Context object in our case the waitlist object delegates an algorithm to different Strategy objects to execute waitlist functions as shown below. The Context calls algorithm() on a Strategy1 object, which performs the algorithm and returns the result to Context.&lt;br /&gt;
&lt;br /&gt;
'''Existing Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist current.png|850px]]&lt;br /&gt;
&lt;br /&gt;
'''Modified Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist modified.png|850px]]&lt;br /&gt;
&lt;br /&gt;
== Solution Approach == &lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
Goal of the project is to simplify waitlist functionality by moving all the functions manipulating waitlists to waitlist.rb, along with a WaitingTeam class that would consist of a 〈team_id, topic_id〉pair to store information regarding teams on waitlist for a particular topic. Classes should just invoke methods of waitlist.rb for the following functionality: &lt;br /&gt;
# Add themselves to waitlists&lt;br /&gt;
# Add another team to a waitlist&lt;br /&gt;
# Take a team off a waitlist&lt;br /&gt;
# Purge all waitlists of a specific team&lt;br /&gt;
# Clear a specific waitlist of all waiting teams&lt;br /&gt;
&lt;br /&gt;
Introduce a waitlist object associated with each topic so that any team that requested it when it was not available would just be queued on the waitlist.  The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
 &lt;br /&gt;
===Design Pattern===&lt;br /&gt;
As we are decoupling the functionality manipulating waitlists that is scattered across various files and putting it all under a single class the design pattern opted for is Strategy Design Pattern. It is a behavioral design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.  The plan is to isolate the code, internal data, and dependencies of various algorithms related to waitlist from the rest of the code. Various clients now get a simple class to execute the algorithms and switch them at runtime.&lt;br /&gt;
&lt;br /&gt;
'''Tentative list of files to be modified'''&lt;br /&gt;
# sign_up_topic.rb&lt;br /&gt;
# invitation.rb&lt;br /&gt;
# waitlist.rb&lt;br /&gt;
# lottery_controller.rb&lt;br /&gt;
# suggestion_controller.rb &lt;br /&gt;
# signed_up_team.rb&lt;br /&gt;
# student_teams_controller.rb&lt;br /&gt;
&lt;br /&gt;
== UI Test Steps ==&lt;br /&gt;
* Step 1: Signup as an instructor and click on Manage Assignments&lt;br /&gt;
&lt;br /&gt;
[[File:Manage assignments.png|550px]]&lt;br /&gt;
[[File:Add assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 2: Create an assignment with the required configurations and click on create.&lt;br /&gt;
&lt;br /&gt;
[[File:Create assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 3: Post assignment creation, go to manage assignments, and edit the newly created assignment&lt;br /&gt;
&lt;br /&gt;
[[File:Edit new assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 4: Selected the 'has topics' options and create new topics for the students to sign up using the topics tab.&lt;br /&gt;
&lt;br /&gt;
[[File:Has_topics_assignment_option.png|550px]]&lt;br /&gt;
[[File:Create topics.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 5: Add participants to the assignment using the participant tab and then assign the participants to teams using the teams tab and save the changes.&lt;br /&gt;
&lt;br /&gt;
[[File:Add participants and teams.png|550px]]&lt;br /&gt;
[[File:Add teams.png|550px]]&lt;br /&gt;
[[File:Add participants.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 6: Impersonate one student that you had added to one team in the previous step.&lt;br /&gt;
&lt;br /&gt;
[[File:Impersonate user.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 7: In the assignment tabs, choose the assignment that you had created in the previous step and click on sign-up sheet to sign up for a topic. &lt;br /&gt;
&lt;br /&gt;
[[File:Signup_sheet.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 8: Sign up for any topic of your choice. If it is available then you will be assigned the slot and the number of available slots will be updated.&lt;br /&gt;
&lt;br /&gt;
[[File:Student7488 signup.png|550px]]&lt;br /&gt;
[[File:Student7488 signedup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 9: Impersonate as another student from another team that you had created for the same assignment in the previous steps and follow the same steps as mentioned above to sign up for a topic. Sign up for the same topic as the previously impersonated student.&lt;br /&gt;
&lt;br /&gt;
[[File:Student431 signup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 10: You will now notice that since there was only one available slot and the previous team already signed up for it, the current team will be added to the waitlist for that topic.&lt;br /&gt;
&lt;br /&gt;
[[File:Student 431 waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 11: You can also check the student currently assigned to a topic and the waitlisted students in the manage assignments tab on logging in as an instructor(As done in the previous steps)&lt;br /&gt;
&lt;br /&gt;
[[File:Teams signedup waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 12: Following the above mentioned steps various scenarios can be tested via the UI like: &lt;br /&gt;
# Adding more topics&lt;br /&gt;
# Multiple teams signing up for the same topic&lt;br /&gt;
# Teams dropping topics etc.&lt;br /&gt;
&lt;br /&gt;
'''In the current implemention the following issue exists which will be fixed:'''&lt;br /&gt;
&lt;br /&gt;
'''Scenario 1:''' Assigned teams dropping topics&lt;br /&gt;
&lt;br /&gt;
'''Expected Behaviour :'''&lt;br /&gt;
After one team signs up for a topic and the second team that signs up for the same topic is added to the waitlist, if the first team drops the topic, ideally the available slots should be updated and the second team should be assigned the topic since it is the first on the waitlist.&lt;br /&gt;
&lt;br /&gt;
'''Current Issue :'''&lt;br /&gt;
The available slot after one team drops the topic does not update due to which the first team in the waitlist is not automatically assigned the topic.&lt;br /&gt;
[[File:Topic dropped.png|550px]]&lt;br /&gt;
&lt;br /&gt;
'''Proposed Solution :'''&lt;br /&gt;
Implement a new waitlist object to maintain the list of topics and the teams in the waitlist as ordered pairs: 〈team_id, topic_id〉as soon as the first team drops the topic the team_id field will be updated to the second team since it is the first on the waitlist.&lt;br /&gt;
&lt;br /&gt;
'''Scenario 2:''' Instructor intervention when assigned teams drops topics&lt;br /&gt;
&lt;br /&gt;
'''Expected Behaviour :'''&lt;br /&gt;
After one team signs up for a topic and the second team that signs up for the same topic is added to the waitlist, if the first team drops the topic, ideally the available slots should be updated and the second team should be assigned the topic since it is the first on the waitlist also we know that the manage topics tab while the instructor edits the assignment also contains the team that is currently assigned the topic and the list of waitlisted teams it should be updated when a change occurs.&lt;br /&gt;
&lt;br /&gt;
'''Current Issue :'''&lt;br /&gt;
The instructor does not see in the manage assignments topics tab that the topic is not assigned to the first team once it chooses to drop it.&lt;br /&gt;
[[File:Teams signedup waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
'''Proposed Solution :'''&lt;br /&gt;
Since the same functionality of maintaining the waitlist is being done at multiple places, the code does not update for the manage assignments topic tab for the instructor. In order to fix this, implementation of a new waitlist object is done to maintain the list of topics and the teams in the waitlist as ordered pairs: 〈team_id, topic_id〉as soon as the first team drops the topic the team_id field will be updated to the second team since it is the first on the waitlist and the same object will be consumed everywhere. Hence, the manage assignments topic will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
This project entails code refactoring such that all functionality relevant to waitlist is easily available under one class. Focus is on ensuring existing tests work as expected as the newly added code will not impact functionality per se. However, new unit tests will be written for testing waitlist.rb independently. Furthermore, test cases for suggestion_controller.rb &amp;amp; signed_up_team.rb are missing in the current implementation. Hence, we will be adding spec files for the aforementioned files as well. Certain edge cases will also be tested which have not been covered by the current tests.&lt;br /&gt;
&lt;br /&gt;
'''Test Files'''&lt;br /&gt;
# sign_up_topic_spec.rb&lt;br /&gt;
# invitation_spec.rb&lt;br /&gt;
# waitlist_spec.rb&lt;br /&gt;
# lottery_controller_spec.rb&lt;br /&gt;
# suggestion_controller_spec.rb&lt;br /&gt;
# signed_up_team_spec.rb&lt;br /&gt;
# student_teams_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
'''Cases To Be Tested'''&lt;br /&gt;
# Add team to waitlist if topic isn't available.&lt;br /&gt;
# Push the first waitlisted member (if exists) in case a confirmed slot is deleted.&lt;br /&gt;
# Remove waitlists for team if a topic is confirmed.&lt;br /&gt;
# Clean waitlists &amp;amp; assign topic if the user has a team but not a topic.&lt;br /&gt;
# Remove old team from waitlists.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.r80b3xxz9peq Problem Statement]&lt;br /&gt;
# [https://github.com/nehajaideep/expertiza Forked Repository]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
* Ankit Singh (asingh072318)&lt;br /&gt;
&lt;br /&gt;
* Asrita Kuchibhotla (kAsrita)&lt;br /&gt;
&lt;br /&gt;
* Neha Kotcherlakota (nehajaideep)&lt;br /&gt;
&lt;br /&gt;
* Vinit Desai (VinitDesai1998)&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Topic_dropped.png&amp;diff=141570</id>
		<title>File:Topic dropped.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Topic_dropped.png&amp;diff=141570"/>
		<updated>2021-11-09T21:36:11Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141550</id>
		<title>CSC/ECE 517 Fall 2021 - E2163. Refactor waitlist functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=141550"/>
		<updated>2021-11-09T08:26:28Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Expertiza ==&lt;br /&gt;
The [http://expertiza.ncsu.edu/ Expertiza] platform employs a divide-and-conquer strategy for creating reusable learning objects via active-learning exercises built entirely on [http://rubyonrails.org/ Ruby on Rails] framework. Students get to choose from a list of tasks to complete either individually or in teams. It also allows the instructor to create a list of topics the students can sign up for. They then prepare their work and submit it to a peer-review mechanism. On submission, other students can assess their peers work and provide feedback. Expertiza encourages students to collaborate in order to improve the learning experiences from one another. It aids their learning by making them translate what is taught in the lectures and apply those concepts to a real-world issue.&lt;br /&gt;
&lt;br /&gt;
== Problem Statement ==&lt;br /&gt;
When a team requests a topic which is not available, the team is waitlisted for the topic, given that bidding is not in use for the assignment. When another team drops a topic, then a waitlisted team will be assigned the topic, if there are any teams waitlisted for it. Implement a waitlist object associated with each topic, and a team that requested it when it was not available would just be queued on the waitlist. The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
Currently, the functionality relevant to waitlisting is scattered across the multiple files. These functions need to be consolidated and placed in a single class. &lt;br /&gt;
&lt;br /&gt;
== Control Flow ==&lt;br /&gt;
In the current implementation, multiple models and controllers perform actions that indirectly affect the teams in the waitlist and require to be added or removed from the waitlist. Due to this the same redundant operations of modifying the waitlist is being performed by multiple models and controllers. In order to improve the functionality all the redundant operations being performed on the waitlist need to be moved to the 'waitlist.rb' file and all the other controllers and models will be utilising these methods to manipulate the waitlists.&lt;br /&gt;
&lt;br /&gt;
'''Existing Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist current.png|850px]]&lt;br /&gt;
&lt;br /&gt;
'''Modified Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist modified.png|850px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Solution Approach == &lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
Goal of the project is to simplify waitlist functionality by moving all the functions manipulating waitlists to waitlist.rb, along with a WaitingTeam class that would consist of a 〈team_id, topic_id〉pair to store information regarding teams on waitlist for a particular topic. Classes should just invoke methods of waitlist.rb for the following functionality: &lt;br /&gt;
# Add themselves to waitlists&lt;br /&gt;
# Add another team to a waitlist&lt;br /&gt;
# Take a team off a waitlist&lt;br /&gt;
# Purge all waitlists of a specific team&lt;br /&gt;
# Clear a specific waitlist of all waiting teams&lt;br /&gt;
&lt;br /&gt;
Introduce a waitlist object associated with each topic so that any team that requested it when it was not available would just be queued on the waitlist.  The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
 &lt;br /&gt;
===Design Pattern===&lt;br /&gt;
As we are decoupling the functionality manipulating waitlists that is scattered across various files and putting it all under a single class the design pattern opted for is Strategy Design Pattern. It is a behavioural design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.  &lt;br /&gt;
&lt;br /&gt;
'''Tentative list of files to be modified'''&lt;br /&gt;
# sign_up_topic.rb&lt;br /&gt;
# invitation.rb&lt;br /&gt;
# waitlist.rb&lt;br /&gt;
# lottery_controller.rb&lt;br /&gt;
# suggestion_controller.rb &lt;br /&gt;
# signed_up_team.rb&lt;br /&gt;
# student_teams_controller.rb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI Test Steps ==&lt;br /&gt;
* Step 1: Signup as an instructor and click on Manage Assignments&lt;br /&gt;
&lt;br /&gt;
[[File:Manage assignments.png|550px]]&lt;br /&gt;
[[File:Add assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 2: Create an assignment with the required configurations and click on create.&lt;br /&gt;
&lt;br /&gt;
[[File:Create assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 3: Post assignment creation, go to manage assignments, and edit the newly created assignment&lt;br /&gt;
&lt;br /&gt;
[[File:Edit new assignment.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 4: Selected the 'has topics' options and create new topics for the students to sign up using the topics tab.&lt;br /&gt;
&lt;br /&gt;
[[File:Has_topics_assignment_option.png|550px]]&lt;br /&gt;
[[File:Create topics.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 5: Add participants to the assignment using the participant tab and then assign the participants to teams using the teams tab and save the changes.&lt;br /&gt;
&lt;br /&gt;
[[File:Add participants and teams.png|550px]]&lt;br /&gt;
[[File:Add teams.png|550px]]&lt;br /&gt;
[[File:Add participants.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 6: Impersonate one student that you had added to one team in the previous step.&lt;br /&gt;
&lt;br /&gt;
[[File:Impersonate user.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 7: In the assignment tabs, choose the assignment that you had created in the previous step and click on sign-up sheet to sign up for a topic. &lt;br /&gt;
&lt;br /&gt;
[[File:Signup_sheet.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 8: Sign up for any topic of your choice. If it is available then you will be assigned the slot and the number of available slots will be updated.&lt;br /&gt;
&lt;br /&gt;
[[File:Student7488 signup.png|550px]]&lt;br /&gt;
[[File:Student7488 signedup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 9: Impersonate as another student from another team that you had created for the same assignment in the previous steps and follow the same steps as mentioned above to sign up for a topic. Sign up for the same topic as the previously impersonated student.&lt;br /&gt;
&lt;br /&gt;
[[File:Student431 signup.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 10: You will now notice that since there was only one available slot and the previous team already signed up for it, the current team will be added to the waitlist for that topic.&lt;br /&gt;
&lt;br /&gt;
[[File:Student 431 waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 11: You can also check the student currently assigned to a topic and the waitlisted students in the manage assignments tab on logging in as an instructor(As done in the previous steps)&lt;br /&gt;
&lt;br /&gt;
[[File:Teams signedup waitlisted.png|550px]]&lt;br /&gt;
&lt;br /&gt;
* Step 12: Following the above mentioned steps various scenarios can be tested via the UI like: &lt;br /&gt;
# Adding more topics&lt;br /&gt;
# Multiple teams signing up for the same topic&lt;br /&gt;
# Teams dropping topics etc.&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
This project entails code refactoring such that all functionality relevant to waitlist is easily available under one class. Focus is on ensuring existing tests work as expected as the newly added code will not impact functionality per se. However, new unit tests will be written for testing waitlist.rb independently. Furthermore, test cases for suggestion_controller.rb &amp;amp; signed_up_team.rb are missing in the current implementation. Hence, we will be adding spec files for the aforementioned files as well. Certain edge cases will also be tested which have not been covered by the current tests.&lt;br /&gt;
&lt;br /&gt;
'''Test Files'''&lt;br /&gt;
# sign_up_topic_spec.rb&lt;br /&gt;
# invitation_spec.rb&lt;br /&gt;
# waitlist_spec.rb&lt;br /&gt;
# lottery_controller_spec.rb&lt;br /&gt;
# suggestion_controller_spec.rb&lt;br /&gt;
# signed_up_team_spec.rb&lt;br /&gt;
# student_teams_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
'''Cases To Be Tested'''&lt;br /&gt;
# Add team to waitlist if topic isn't available.&lt;br /&gt;
# Push the first waitlisted member (if exists) in case a confirmed slot is deleted.&lt;br /&gt;
# Remove waitlists for team if a topic is confirmed.&lt;br /&gt;
# Clean waitlists &amp;amp; assign topic if the user has a team but not a topic.&lt;br /&gt;
# Remove old team from waitlists.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.r80b3xxz9peq Problem Statement]&lt;br /&gt;
# [https://github.com/nehajaideep/expertiza Forked Repository]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
* Ankit Singh (asingh072318)&lt;br /&gt;
&lt;br /&gt;
* Asrita Kuchibhotla (kAsrita)&lt;br /&gt;
&lt;br /&gt;
* Neha Kotcherlakota (nehajaideep)&lt;br /&gt;
&lt;br /&gt;
* Vinit Desai (VinitDesai1998)&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Teams_signedup_waitlisted.png&amp;diff=141549</id>
		<title>File:Teams signedup waitlisted.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Teams_signedup_waitlisted.png&amp;diff=141549"/>
		<updated>2021-11-09T08:20:30Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_participants.png&amp;diff=141548</id>
		<title>File:Add participants.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_participants.png&amp;diff=141548"/>
		<updated>2021-11-09T08:18:37Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Add participants.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_teams.png&amp;diff=141547</id>
		<title>File:Add teams.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_teams.png&amp;diff=141547"/>
		<updated>2021-11-09T08:17:59Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student_431_waitlisted.png&amp;diff=141546</id>
		<title>File:Student 431 waitlisted.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student_431_waitlisted.png&amp;diff=141546"/>
		<updated>2021-11-09T07:56:45Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141545</id>
		<title>File:Student431 signup.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141545"/>
		<updated>2021-11-09T07:55:01Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Student431 signup.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141544</id>
		<title>File:Student431 signup.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141544"/>
		<updated>2021-11-09T07:52:08Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Student431 signup.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student7488_signedup.png&amp;diff=141543</id>
		<title>File:Student7488 signedup.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student7488_signedup.png&amp;diff=141543"/>
		<updated>2021-11-09T07:48:38Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student7488_signup.png&amp;diff=141542</id>
		<title>File:Student7488 signup.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student7488_signup.png&amp;diff=141542"/>
		<updated>2021-11-09T07:47:47Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141541</id>
		<title>File:Student431 signup.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141541"/>
		<updated>2021-11-09T07:43:46Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Student431 signup.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141540</id>
		<title>File:Student431 signup.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Student431_signup.png&amp;diff=141540"/>
		<updated>2021-11-09T07:38:44Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Signup_sheet.png&amp;diff=141539</id>
		<title>File:Signup sheet.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Signup_sheet.png&amp;diff=141539"/>
		<updated>2021-11-09T07:27:01Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Impersonate_user.png&amp;diff=141538</id>
		<title>File:Impersonate user.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Impersonate_user.png&amp;diff=141538"/>
		<updated>2021-11-09T07:23:33Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_participants_and_teams.png&amp;diff=141537</id>
		<title>File:Add participants and teams.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_participants_and_teams.png&amp;diff=141537"/>
		<updated>2021-11-09T06:35:42Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Create_topics.png&amp;diff=141536</id>
		<title>File:Create topics.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Create_topics.png&amp;diff=141536"/>
		<updated>2021-11-09T06:26:03Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Create topics.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Create_topics.png&amp;diff=141535</id>
		<title>File:Create topics.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Create_topics.png&amp;diff=141535"/>
		<updated>2021-11-09T06:21:07Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_assignment_option.png&amp;diff=141534</id>
		<title>File:Has topics assignment option.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_assignment_option.png&amp;diff=141534"/>
		<updated>2021-11-09T06:13:35Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Has topics assignment option.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_assignment_option.png&amp;diff=141533</id>
		<title>File:Has topics assignment option.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_assignment_option.png&amp;diff=141533"/>
		<updated>2021-11-09T06:13:30Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Has topics assignment option.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_assignment_option.png&amp;diff=141531</id>
		<title>File:Has topics assignment option.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_assignment_option.png&amp;diff=141531"/>
		<updated>2021-11-09T06:11:55Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_options_assignment.png&amp;diff=141529</id>
		<title>File:Has topics options assignment.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_options_assignment.png&amp;diff=141529"/>
		<updated>2021-11-09T06:10:20Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_options.png&amp;diff=141528</id>
		<title>File:Has topics options.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Has_topics_options.png&amp;diff=141528"/>
		<updated>2021-11-09T06:08:48Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Edit_new_assignment.png&amp;diff=141512</id>
		<title>File:Edit new assignment.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Edit_new_assignment.png&amp;diff=141512"/>
		<updated>2021-11-09T05:55:46Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Create_assignment.png&amp;diff=141511</id>
		<title>File:Create assignment.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Create_assignment.png&amp;diff=141511"/>
		<updated>2021-11-09T05:49:11Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Create assignment.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_assignments.png&amp;diff=141464</id>
		<title>File:Manage assignments.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_assignments.png&amp;diff=141464"/>
		<updated>2021-11-09T04:30:19Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_assignment.png&amp;diff=141463</id>
		<title>File:Add assignment.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_assignment.png&amp;diff=141463"/>
		<updated>2021-11-09T04:29:30Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Add assignment.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_assignment.png&amp;diff=141462</id>
		<title>File:Add assignment.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_assignment.png&amp;diff=141462"/>
		<updated>2021-11-09T04:27:23Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Add assignment.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_assignment.png&amp;diff=141460</id>
		<title>File:Add assignment.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Add_assignment.png&amp;diff=141460"/>
		<updated>2021-11-09T04:22:05Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_current.png&amp;diff=140890</id>
		<title>File:Block diagram waitlist current.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_current.png&amp;diff=140890"/>
		<updated>2021-11-04T04:23:44Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Block diagram waitlist current.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_current.png&amp;diff=140889</id>
		<title>File:Block diagram waitlist current.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_current.png&amp;diff=140889"/>
		<updated>2021-11-04T04:22:57Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Block diagram waitlist current.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=140888</id>
		<title>CSC/ECE 517 Fall 2021 - E2163. Refactor waitlist functionality</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2163._Refactor_waitlist_functionality&amp;diff=140888"/>
		<updated>2021-11-04T04:16:06Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Expertiza ==&lt;br /&gt;
The [http://expertiza.ncsu.edu/ Expertiza] platform employs a divide-and-conquer strategy for creating reusable learning objects via active-learning exercises built entirely on [http://rubyonrails.org/ Ruby on Rails] framework. Students get to choose from a list of tasks to complete either individually or in teams. It also allows the instructor to create a list of topics the students can sign up for. They then prepare their work and submit it to a peer-review mechanism. On submission, other students can assess their peers work and provide feedback. Expertiza encourages students to collaborate in order to improve the learning experiences from one another. It aids their learning by making them translate what is taught in the lectures and apply those concepts to a real-world issue.&lt;br /&gt;
&lt;br /&gt;
== Problem Statement ==&lt;br /&gt;
When a team requests a topic which is not available, the team is waitlisted for the topic, given that bidding is not in use for the assignment. When another team drops a topic, then a waitlisted team will be assigned the topic, if there are any teams waitlisted for it. Implement a waitlist object associated with each topic, and a team that requested it when it was not available would just be queued on the waitlist. The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
Currently, the functionality relevant to waitlisting is scattered across the multiple files. These functions need to be consolidated and placed in a single class. &lt;br /&gt;
&lt;br /&gt;
== Control Flow ==&lt;br /&gt;
In the current implementation, multiple models and controllers perform actions that indirectly affect the teams in the waitlist and require to be added or removed from the waitlist. Due to this the same redundant operations of modifying the waitlist is being performed by multiple models and controllers. In order to improve the functionality all the redundant operations being performed on the waitlist need to be moved to the 'waitlist.rb' file and all the other controllers and models will be utilising these methods to manipulate the waitlists.&lt;br /&gt;
&lt;br /&gt;
'''Existing Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist current.png|850px]]&lt;br /&gt;
&lt;br /&gt;
'''Modified Control Flow'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Block diagram waitlist modified.png|850px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Solution Approach == &lt;br /&gt;
&lt;br /&gt;
===Refactoring===&lt;br /&gt;
Goal of the project is to simplify waitlist functionality by moving all the functions manipulating waitlists to waitlist.rb, along with a WaitingTeam class that would consist of a 〈team_id, topic_id〉pair to store information regarding teams on waitlist for a particular topic. Classes should just invoke methods of waitlist.rb for the following functionality: &lt;br /&gt;
# Add themselves to waitlists&lt;br /&gt;
# Add another team to a waitlist&lt;br /&gt;
# Take a team off a waitlist&lt;br /&gt;
# Purge all waitlists of a specific team&lt;br /&gt;
# Clear a specific waitlist of all waiting teams&lt;br /&gt;
&lt;br /&gt;
Introduce a waitlist object associated with each topic so that any team that requested it when it was not available would just be queued on the waitlist.  The waitlist would just enqueue ordered pairs〈team_id, topic_id〉&lt;br /&gt;
 &lt;br /&gt;
===Design Pattern===&lt;br /&gt;
As we are decoupling the functionality manipulating waitlists that is scattered across various files and putting it all under a single class the design pattern opted for is Strategy Design Pattern. It is a behavioural design pattern that lets you define a family of algorithms, put each of them into a separate class, and make their objects interchangeable.  &lt;br /&gt;
&lt;br /&gt;
'''Tentative list of files to be modified'''&lt;br /&gt;
# sign_up_topic.rb&lt;br /&gt;
# invitation.rb&lt;br /&gt;
# waitlist.rb&lt;br /&gt;
# lottery_controller.rb&lt;br /&gt;
# suggestion_controller.rb &lt;br /&gt;
# signed_up_team.rb&lt;br /&gt;
# student_teams_controller.rb&lt;br /&gt;
&lt;br /&gt;
== Test Plan ==&lt;br /&gt;
This project entails code refactoring such that all functionality relevant to waitlist is easily available under one class. Focus is on ensuring existing tests work as expected as the newly added code will not impact functionality per se. However, new unit tests will be written for testing waitlist.rb independently.&lt;br /&gt;
&lt;br /&gt;
'''Test Files'''&lt;br /&gt;
# sign_up_topic_spec.rb&lt;br /&gt;
# invitation_spec.rb&lt;br /&gt;
# waitlist_spec.rb&lt;br /&gt;
# lottery_controller_spec.rb&lt;br /&gt;
# suggestion_controller_spec.rb&lt;br /&gt;
# signed_up_team_spec.rb&lt;br /&gt;
# student_teams_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
# [https://docs.google.com/document/d/1slx4HPIbgTH-psIKMSCF-HDF9brxf-FuYhzVT9ZiIrM/edit#heading=h.r80b3xxz9peq Problem Statement]&lt;br /&gt;
# [https://github.com/nehajaideep/expertiza Forked Repository]&lt;br /&gt;
&lt;br /&gt;
== Team ==&lt;br /&gt;
* Ankit Singh (asingh072318)&lt;br /&gt;
&lt;br /&gt;
* Asrita Kuchibhotla (kAsrita)&lt;br /&gt;
&lt;br /&gt;
* Neha Kotcherlakota (nehajaideep)&lt;br /&gt;
&lt;br /&gt;
* Vinit Desai (VinitDesai1998)&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_current.png&amp;diff=140887</id>
		<title>File:Block diagram waitlist current.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_current.png&amp;diff=140887"/>
		<updated>2021-11-04T04:03:38Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_modified.png&amp;diff=140886</id>
		<title>File:Block diagram waitlist modified.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_modified.png&amp;diff=140886"/>
		<updated>2021-11-04T03:58:45Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Block diagram waitlist modified.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_modified.png&amp;diff=140884</id>
		<title>File:Block diagram waitlist modified.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Block_diagram_waitlist_modified.png&amp;diff=140884"/>
		<updated>2021-11-04T03:45:35Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139963</id>
		<title>CSC/ECE 517 Fall 2021 - E2131. Improve assessment360 controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139963"/>
		<updated>2021-10-24T23:19:41Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: /* Code Improvement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2131. Improving the Assessment 360 Controller==&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===About Expertiza===&lt;br /&gt;
&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project based on [http://rubyonrails.org/ Ruby on Rails] framework. Expertiza allows the instructor to create new assignments and customize new or existing assignments. It also allows the instructor to create a list of topics the students can sign up for. Students can form teams in Expertiza to work on various projects and assignments. Students can also peer review other students' submissions. Expertiza supports submission across various document types, including the URLs and wiki pages.&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* Improved the clarity of code by improving the variable and parameter names.&lt;br /&gt;
* Long character strings were taken and given appropriate names.&lt;br /&gt;
* Combined two views: Grade summary by student &amp;amp; Aggregate teammate and Meta Review to 1 page : All Students All Reviews.&lt;br /&gt;
* Added a new functionality for the user to customise the table to view relevant columns.&lt;br /&gt;
* Added RSPEC test cases for testing changes made in the Assessment360 Controller&lt;br /&gt;
&lt;br /&gt;
===About Assessment 360 Controller===&lt;br /&gt;
This controller provides functionality for displaying course-level data, specifically, review averages, and for each student who is a course participant, a list of the projects they worked on and the grades that they received.  The reason it is called “assessment 360” is because that’s a term that relates to evaluating performance by combining a lot of different perspectives into a single view.  Its externally callable methods are all_students_all_reviews and course_student_grade_summary. I believe that all other methods are simply helper methods for these methods, but please check, because I’m not sure of it.&lt;br /&gt;
&lt;br /&gt;
===Current Implementation===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Functionality=====&lt;br /&gt;
* Every course instructor that logs in to Expertiza should be able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course&lt;br /&gt;
* The instructor can navigate to 2 different views: all_students_all_review and course_student_grade_summary to view the scores.&lt;br /&gt;
* all_students_all_review view - Allows the instructor to view the teammate review and the meta review scores corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
* course_student_grade_summary - Allows the instructor to view the peer review score, instructor grade corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
&lt;br /&gt;
====Drawbacks and Solutions=====&lt;br /&gt;
* '''Problem 1''': The instructor has to navigate to two different views to view the data regarding the scores of all the students enrolled in a particular course. The following are the issues caused due to 2 views:&lt;br /&gt;
* 1. Difficult to view consolidated data regarding student scores at one place.&lt;br /&gt;
* 2. Redundant columns&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:All students all reviews view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* course_student_grade_summary&lt;br /&gt;
[[File:Course grade summary view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been changed in the following way to address the issues:&lt;br /&gt;
* One consolidated view is made : all_student_all_reviews which displays all the scores corresponding to each assignment for every student enrolled in a particular course&lt;br /&gt;
* No redundant columns exist since the entire data is consolidated in a single view.&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:Consolidated view.png|800px]]&lt;br /&gt;
&lt;br /&gt;
* '''Problem 2''': Every course instructor that logs in to Expertiza is able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course in a tabular form in 2 different views. Although, it is difficult to view respective teammate and meta review scores on sorting by peer review scores or instructor grades and vice versa.&lt;br /&gt;
For example: The instructor cannot sort the peer review scores in the table based on the teammate reviews or the meta reviews since they are in 2 different views &lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been modified such that an instructor can sort any column in the table and view respective data for other columns. This can be done since the entire data can now be seen in a single consolidated view.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot; class=&amp;quot;noborder sorter-true&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;30&amp;quot; class=&amp;quot;noborder&amp;quot;&amp;gt;Teammate Count&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;th colspan=&amp;quot;&amp;lt;%= @colspan %&amp;gt;&amp;quot; class=&amp;quot;sorter-false&amp;quot;&amp;gt;&amp;lt;%= assignment.name %&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
            .......&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    ...............&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Problem 3''': Page loading time for all_student_all_reviews is extremely high since a network call is being made as soon as a user clicks on a link to navigate to that page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
      .....&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;% (0..@assignments.size).each do %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
        .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Since there is no condition on rendering the entire view is loaded as soon as the user navigates to the page. This makes the page load extremely slow since the network call is made immediately on page load making it a bad user experience.&lt;br /&gt;
* '''Solution''': The implementation has been changed such that instructor can customise the table to only view the columns relevant to them and post selecting the network call is made. Due to this the page loads faster, as soon as the user clicks a link to navigate to the page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;%# This section renders the checkboxes and passes values to controller as different variables %&amp;gt;&lt;br /&gt;
  &amp;lt;%= form_tag({:action =&amp;gt; 'all_students_all_reviews'},{:method =&amp;gt; :get}) %&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Which field do you want to see?&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: inline-flex;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_topics&amp;quot; id=&amp;quot;show_topics&amp;quot; value=true&amp;gt;Topics &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_teammate_reviews&amp;quot; id=&amp;quot;show_teammate_reviews&amp;quot; value=true&amp;gt;Teammate reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_meta_reviews&amp;quot; id=&amp;quot;show_meta_reviews&amp;quot; value=true&amp;gt;Meta-reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_peer_scores&amp;quot; id=&amp;quot;show_peer_scores&amp;quot; value=true&amp;gt;Peer scores &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_instructor_grades&amp;quot; id=&amp;quot;show_instructor_grades&amp;quot; value=true&amp;gt;Instructor grades&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;%= button_tag 'Go', value: @course_id, type: :submit, name: :course_id%&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;% if @render_partial %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render 'assessment' %&amp;gt; &lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The assessment view is rendered only if the render_partial variable is true. Due to this check, the all_students_all_reviews page loads faster on navigation since the network call is not made immediately. Instead it is made after a user action which makes it a better user experience.&lt;br /&gt;
&lt;br /&gt;
===New Implementation===&lt;br /&gt;
* '''Consolidation of views''' - The 2 views all_students_all_review and course_student_grade_summary are now merged into 1 view: views all_students_all_review. This view can be accessed using the list icon from the Manage Courses page.&lt;br /&gt;
Navigation to the manage courses page: &lt;br /&gt;
* 1. Choose Manage on the navigation bar on the top of the screen.&lt;br /&gt;
* 2. Choose Courses from the list&lt;br /&gt;
[[File:Manage courses option.png|900px]]&lt;br /&gt;
* 3. Choose the list icon corresponding to the course for which you need to view the student score summary.&lt;br /&gt;
*Previous Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:Two views.png|900px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Modified Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:One view.png|900px]]&lt;br /&gt;
* '''Customisation''' - New checkbox functionality is added which allows the instructor to customise the view by selecting from a list of columns and viewing only those that are relevant to them. Checkboxes for the following columns exist:&lt;br /&gt;
* 1. Topics&lt;br /&gt;
* 2. Teammate reviews&lt;br /&gt;
* 3. Meta reviews&lt;br /&gt;
* 4. Peer scores&lt;br /&gt;
* 5. Instructor grades&lt;br /&gt;
* The instructor can customise the table by selecting the any or all of the above mentioned columns and only view columns that are relevant to them.&lt;br /&gt;
[[File:Checkboxes option.png|900px]]&lt;br /&gt;
* '''Dynamic UI''' - A new functionality in the UI is added that ensures '''dynamic resizing''' of the table based on the number of columns to be displayed.&lt;br /&gt;
* '''UI Enhancement''' - The UI of the all_student_all_reviews page is enhanced for better user experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Code Improvement===&lt;br /&gt;
* '''Implementation of partials''' - Refactoring of the code was done to ensure better readability by implementing partials. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;%# Partial to render the table %&amp;gt;&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Topic&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Peer Score&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;th class=&amp;quot;sorter-true&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Total Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Class Average&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end%&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_meta_review_grade / total_meta_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_teammate_review_grade / total_teammate_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Code comments''' - Code comments for every new implementation are added to provide a better understanding and easier experience for developers viewing the code.&lt;br /&gt;
* '''Refactoring''' - Refactoring of the code is done by renaming certain variables based on the naming convention, choosing ideal names for all the newly added variables, removing unused code.&lt;br /&gt;
* 1. Removed the view - course_student_grade_summary&lt;br /&gt;
* 2. Replaced teamed_count to teammate count&lt;br /&gt;
* Previous code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teamed_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end%&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Modified code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 3. Added variables names according to the naming convention&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    @topics = {}&lt;br /&gt;
    @assignment_grades = {}&lt;br /&gt;
    @peer_review_scores = {}&lt;br /&gt;
    @final_grades = {}&lt;br /&gt;
    course = Course.find(params[:course_id])&lt;br /&gt;
    @course_id = params[:course_id]&lt;br /&gt;
    @assignments = course.assignments.reject(&amp;amp;:is_calibrated).reject {|a| a.participants.empty? }&lt;br /&gt;
    @course_participants = course.get_participants&lt;br /&gt;
    # variable to check if we have to render just the checkboxes or partials too&lt;br /&gt;
    @render_partial = false&lt;br /&gt;
    insure_existence_of(@course_participants,course)&lt;br /&gt;
    # hashes for view&lt;br /&gt;
    @meta_review = {}&lt;br /&gt;
    @teammate_review = {}&lt;br /&gt;
    @teammate_count = {}&lt;br /&gt;
    # instance variables based on each checkbox&lt;br /&gt;
    @show_teammate_reviews = params[:show_teammate_reviews] || false&lt;br /&gt;
    @show_meta_reviews = params[:show_meta_reviews] || false&lt;br /&gt;
    @show_peer_scores = params[:show_peer_scores] || false&lt;br /&gt;
    @show_instructor_grades = params[:show_instructor_grades] || false&lt;br /&gt;
    @show_topics = params[:show_topics] || false&lt;br /&gt;
    @checkboxes_array = [@show_teammate_reviews,@show_meta_reviews,@show_peer_scores,@show_instructor_grades,@show_topics]&lt;br /&gt;
    # number of columns to span for each assignment&lt;br /&gt;
    @colspan = assignment_colspan @checkboxes_array&lt;br /&gt;
    # number of columns to span for Aggregate Score table header&lt;br /&gt;
    @colspan_review = review_colspan @checkboxes_array&lt;br /&gt;
    # for course&lt;br /&gt;
    # eg. @overall_teammate_review_grades = {assgt_id1: 100, assgt_id2: 178, ...}&lt;br /&gt;
    # @overall_teammate_review_count = {assgt_id1: 1, assgt_id2: 2, ...}&lt;br /&gt;
    # network calls to be done only when we need to render_partial&lt;br /&gt;
    @render_partial = show_table? @checkboxes_array&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Improved Performance''' - Improved the application performance by enhancing the user experience on navigation to the all_students_all_reviews page by changing when the network call should be made.&lt;br /&gt;
* '''Relevant Test Cases''' - Added relevant test cases for all the newly implemented code.&lt;br /&gt;
&lt;br /&gt;
===Modified File===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. assessment_360.controller.rb&lt;br /&gt;
* 2. course_student_grade_summary.html.erb - removed&lt;br /&gt;
* 3. all_students_all_review.html.erb - removed&lt;br /&gt;
* 4. tree_display.jsx&lt;br /&gt;
* 5. assessment360_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
===Steps to run the application on your local===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. git clone https://github.com/asingh072318/expertiza&lt;br /&gt;
* 2. cd expertiza&lt;br /&gt;
* 3. bash setup.sh [Linux or Unix]&lt;br /&gt;
* 4. bundle install&lt;br /&gt;
* 5. rake db:migrate&lt;br /&gt;
* 6. rails s&lt;br /&gt;
&lt;br /&gt;
===Test Plan - TDD Approach===&lt;br /&gt;
Testing on the assessment 360 controller was done for the following cases:&lt;br /&gt;
* 1. '''Edge cases''' : &lt;br /&gt;
* When no score currently exists for a particular assignment.&lt;br /&gt;
* When an entire column does not exist for an assignment&lt;br /&gt;
* 2. '''Ideal case''':&lt;br /&gt;
* When there exists atleast one student with a score for every assignment.&lt;br /&gt;
* 3. '''Invalid Inputs''': Atleast one column needs to be selected by the user to view the table. No column selected is an invalid input case.&lt;br /&gt;
&lt;br /&gt;
===Testing using RSPEC===&lt;br /&gt;
In the existing version of Expertiza there existed certain test cases for the Assessment360 controller.We have added an additional set of RSPEC tests for Assessment360 contoller, to test all the modifications made to the controller and have also removed the testcases corresponding to the code that was removed. The tests can be executed &amp;quot;rpec rspec spec/controllers/assessment360_controller_spec.rb&amp;quot; command as shown below.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user-expertiza $rspec spec/controllers/assessment360_controller_spec.rb&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
........................&lt;br /&gt;
&lt;br /&gt;
Finished in 1 minute 36.91 seconds (files took 6.76 seconds to load)&lt;br /&gt;
24 examples, 0 failures&lt;br /&gt;
&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Project Team===&lt;br /&gt;
* '''Mentor''' - Dr. Edward Gehringer&lt;br /&gt;
* '''Members'''&lt;br /&gt;
* 1. Neha Kotcherlakota&lt;br /&gt;
* 2. Ankit Singh&lt;br /&gt;
* 3. Supriya Krishna&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[https://github.com/asingh072318/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://152.7.176.208:3000/ The live Expertiza website]&lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;br /&gt;
#Clean Code: A handbook of agile software craftsmanship. Author: Robert C Martin&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139889</id>
		<title>CSC/ECE 517 Fall 2021 - E2131. Improve assessment360 controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139889"/>
		<updated>2021-10-21T14:26:51Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2131. Improving the Assessment 360 Controller==&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===About Expertiza===&lt;br /&gt;
&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project based on [http://rubyonrails.org/ Ruby on Rails] framework. Expertiza allows the instructor to create new assignments and customize new or existing assignments. It also allows the instructor to create a list of topics the students can sign up for. Students can form teams in Expertiza to work on various projects and assignments. Students can also peer review other students' submissions. Expertiza supports submission across various document types, including the URLs and wiki pages.&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* Improved the clarity of code by improving the variable and parameter names.&lt;br /&gt;
* Long character strings were taken and given appropriate names.&lt;br /&gt;
* Combined two views: Grade summary by student &amp;amp; Aggregate teammate and Meta Review to 1 page : All Students All Reviews.&lt;br /&gt;
* Added a new functionality for the user to customise the table to view relevant columns.&lt;br /&gt;
* Added RSPEC test cases for testing changes made in the Assessment360 Controller&lt;br /&gt;
&lt;br /&gt;
===About Assessment 360 Controller===&lt;br /&gt;
This controller provides functionality for displaying course-level data, specifically, review averages, and for each student who is a course participant, a list of the projects they worked on and the grades that they received.  The reason it is called “assessment 360” is because that’s a term that relates to evaluating performance by combining a lot of different perspectives into a single view.  Its externally callable methods are all_students_all_reviews and course_student_grade_summary. I believe that all other methods are simply helper methods for these methods, but please check, because I’m not sure of it.&lt;br /&gt;
&lt;br /&gt;
===Current Implementation===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Functionality=====&lt;br /&gt;
* Every course instructor that logs in to Expertiza should be able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course&lt;br /&gt;
* The instructor can navigate to 2 different views: all_students_all_review and course_student_grade_summary to view the scores.&lt;br /&gt;
* all_students_all_review view - Allows the instructor to view the teammate review and the meta review scores corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
* course_student_grade_summary - Allows the instructor to view the peer review score, instructor grade corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
&lt;br /&gt;
====Drawbacks and Solutions=====&lt;br /&gt;
* '''Problem 1''': The instructor has to navigate to two different views to view the data regarding the scores of all the students enrolled in a particular course. The following are the issues caused due to 2 views:&lt;br /&gt;
* 1. Difficult to view consolidated data regarding student scores at one place.&lt;br /&gt;
* 2. Redundant columns&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:All students all reviews view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* course_student_grade_summary&lt;br /&gt;
[[File:Course grade summary view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been changed in the following way to address the issues:&lt;br /&gt;
* One consolidated view is made : all_student_all_reviews which displays all the scores corresponding to each assignment for every student enrolled in a particular course&lt;br /&gt;
* No redundant columns exist since the entire data is consolidated in a single view.&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:Consolidated view.png|800px]]&lt;br /&gt;
&lt;br /&gt;
* '''Problem 2''': Every course instructor that logs in to Expertiza is able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course in a tabular form in 2 different views. Although, it is difficult to view respective teammate and meta review scores on sorting by peer review scores or instructor grades and vice versa.&lt;br /&gt;
For example: The instructor cannot sort the peer review scores in the table based on the teammate reviews or the meta reviews since they are in 2 different views &lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been modified such that an instructor can sort any column in the table and view respective data for other columns. This can be done since the entire data can now be seen in a single consolidated view.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot; class=&amp;quot;noborder sorter-true&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;30&amp;quot; class=&amp;quot;noborder&amp;quot;&amp;gt;Teammate Count&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;th colspan=&amp;quot;&amp;lt;%= @colspan %&amp;gt;&amp;quot; class=&amp;quot;sorter-false&amp;quot;&amp;gt;&amp;lt;%= assignment.name %&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
            .......&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    ...............&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Problem 3''': Page loading time for all_student_all_reviews is extremely high since a network call is being made as soon as a user clicks on a link to navigate to that page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
      .....&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;% (0..@assignments.size).each do %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
        .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Since there is no condition on rendering the entire view is loaded as soon as the user navigates to the page. This makes the page load extremely slow since the network call is made immediately on page load making it a bad user experience.&lt;br /&gt;
* '''Solution''': The implementation has been changed such that instructor can customise the table to only view the columns relevant to them and post selecting the network call is made. Due to this the page loads faster, as soon as the user clicks a link to navigate to the page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;%# This section renders the checkboxes and passes values to controller as different variables %&amp;gt;&lt;br /&gt;
  &amp;lt;%= form_tag({:action =&amp;gt; 'all_students_all_reviews'},{:method =&amp;gt; :get}) %&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Which field do you want to see?&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: inline-flex;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_topics&amp;quot; id=&amp;quot;show_topics&amp;quot; value=true&amp;gt;Topics &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_teammate_reviews&amp;quot; id=&amp;quot;show_teammate_reviews&amp;quot; value=true&amp;gt;Teammate reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_meta_reviews&amp;quot; id=&amp;quot;show_meta_reviews&amp;quot; value=true&amp;gt;Meta-reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_peer_scores&amp;quot; id=&amp;quot;show_peer_scores&amp;quot; value=true&amp;gt;Peer scores &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_instructor_grades&amp;quot; id=&amp;quot;show_instructor_grades&amp;quot; value=true&amp;gt;Instructor grades&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;%= button_tag 'Go', value: @course_id, type: :submit, name: :course_id%&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;% if @render_partial %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render 'assessment' %&amp;gt; &lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The assessment view is rendered only if the render_partial variable is true. Due to this check, the all_students_all_reviews page loads faster on navigation since the network call is not made immediately. Instead it is made after a user action which makes it a better user experience.&lt;br /&gt;
&lt;br /&gt;
===New Implementation===&lt;br /&gt;
* '''Consolidation of views''' - The 2 views all_students_all_review and course_student_grade_summary are now merged into 1 view: views all_students_all_review. This view can be accessed using the list icon from the Manage Courses page.&lt;br /&gt;
Navigation to the manage courses page: &lt;br /&gt;
* 1. Choose Manage on the navigation bar on the top of the screen.&lt;br /&gt;
* 2. Choose Courses from the list&lt;br /&gt;
[[File:Manage courses option.png|900px]]&lt;br /&gt;
* 3. Choose the list icon corresponding to the course for which you need to view the student score summary.&lt;br /&gt;
*Previous Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:Two views.png|900px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Modified Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:One view.png|900px]]&lt;br /&gt;
* '''Customisation''' - New checkbox functionality is added which allows the instructor to customise the view by selecting from a list of columns and viewing only those that are relevant to them. Checkboxes for the following columns exist:&lt;br /&gt;
* 1. Topics&lt;br /&gt;
* 2. Teammate reviews&lt;br /&gt;
* 3. Meta reviews&lt;br /&gt;
* 4. Peer scores&lt;br /&gt;
* 5. Instructor grades&lt;br /&gt;
* The instructor can customise the table by selecting the any or all of the above mentioned columns and only view columns that are relevant to them.&lt;br /&gt;
[[File:Checkboxes option.png|900px]]&lt;br /&gt;
* '''Dynamic UI''' - A new functionality in the UI is added that ensures '''dynamic resizing''' of the table based on the number of columns to be displayed.&lt;br /&gt;
* '''UI Enhancement''' - The UI of the all_student_all_reviews page is enhanced for better user experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Code Improvement===&lt;br /&gt;
* '''Implementation of partials''' - Refactoring of the code was done to ensure better readability by implementing partials. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;%# Partial to render the table %&amp;gt;&lt;br /&gt;
&amp;lt;%# Format of table %&amp;gt;&lt;br /&gt;
&amp;lt;%#                          |                   Assignment1                      |     Assignment2     |     Assignment3   |  Final Grades     |     Aggregate Score          %&amp;gt;&lt;br /&gt;
&amp;lt;%# Students  Teammate_Count |Metareview Teammate_review Topic Peer Instructor    |                     |                   | Total Inst Grade  | Metareview | Teammate Review %&amp;gt;&lt;br /&gt;
&amp;lt;%#  s1                      |                                                    |                     |                   |                   |            |                 %&amp;gt;&lt;br /&gt;
&amp;lt;%#  s2                      |                                                    |                     |                   |                   |            |                 %&amp;gt;&lt;br /&gt;
&amp;lt;%# Class_Average            |  x%            y%          N/A  N/A    N/A         |                     |                   |       N/A         |     x'%    |      y'%        %&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Topic&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Peer Score&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;th class=&amp;quot;sorter-true&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Total Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Class Average&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end%&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_meta_review_grade / total_meta_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_teammate_review_grade / total_teammate_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Code comments''' - Code comments for every new implementation are added to provide a better understanding and easier experience for developers viewing the code.&lt;br /&gt;
* '''Refactoring''' - Refactoring of the code is done by renaming certain variables based on the naming convention, choosing ideal names for all the newly added variables, removing unused code.&lt;br /&gt;
* 1. Removed the view - course_student_grade_summary&lt;br /&gt;
* 2. Replaced teamed_count to teammate count&lt;br /&gt;
* Previous code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teamed_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end%&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Modified code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 3. Added variables names according to the naming convention&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    @topics = {}&lt;br /&gt;
    @assignment_grades = {}&lt;br /&gt;
    @peer_review_scores = {}&lt;br /&gt;
    @final_grades = {}&lt;br /&gt;
    course = Course.find(params[:course_id])&lt;br /&gt;
    @course_id = params[:course_id]&lt;br /&gt;
    @assignments = course.assignments.reject(&amp;amp;:is_calibrated).reject {|a| a.participants.empty? }&lt;br /&gt;
    @course_participants = course.get_participants&lt;br /&gt;
    # variable to check if we have to render just the checkboxes or partials too&lt;br /&gt;
    @render_partial = false&lt;br /&gt;
    insure_existence_of(@course_participants,course)&lt;br /&gt;
    # hashes for view&lt;br /&gt;
    @meta_review = {}&lt;br /&gt;
    @teammate_review = {}&lt;br /&gt;
    @teammate_count = {}&lt;br /&gt;
    # instance variables based on each checkbox&lt;br /&gt;
    @show_teammate_reviews = params[:show_teammate_reviews] || false&lt;br /&gt;
    @show_meta_reviews = params[:show_meta_reviews] || false&lt;br /&gt;
    @show_peer_scores = params[:show_peer_scores] || false&lt;br /&gt;
    @show_instructor_grades = params[:show_instructor_grades] || false&lt;br /&gt;
    @show_topics = params[:show_topics] || false&lt;br /&gt;
    @checkboxes_array = [@show_teammate_reviews,@show_meta_reviews,@show_peer_scores,@show_instructor_grades,@show_topics]&lt;br /&gt;
    # number of columns to span for each assignment&lt;br /&gt;
    @colspan = assignment_colspan @checkboxes_array&lt;br /&gt;
    # number of columns to span for Aggregate Score table header&lt;br /&gt;
    @colspan_review = review_colspan @checkboxes_array&lt;br /&gt;
    # for course&lt;br /&gt;
    # eg. @overall_teammate_review_grades = {assgt_id1: 100, assgt_id2: 178, ...}&lt;br /&gt;
    # @overall_teammate_review_count = {assgt_id1: 1, assgt_id2: 2, ...}&lt;br /&gt;
    # network calls to be done only when we need to render_partial&lt;br /&gt;
    @render_partial = show_table? @checkboxes_array&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Improved Performance''' - Improved the application performance by enhancing the user experience on navigation to the all_students_all_reviews page by changing when the network call should be made.&lt;br /&gt;
* '''Relevant Test Cases''' - Added relevant test cases for all the newly implemented code.&lt;br /&gt;
&lt;br /&gt;
===Modified File===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. assessment_360.controller.rb&lt;br /&gt;
* 2. course_student_grade_summary.html.erb - removed&lt;br /&gt;
* 3. all_students_all_review.html.erb - removed&lt;br /&gt;
* 4. tree_display.jsx&lt;br /&gt;
* 5. assessment360_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
===Steps to run the application on your local===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. git clone https://github.com/asingh072318/expertiza&lt;br /&gt;
* 2. cd expertiza&lt;br /&gt;
* 3. bash setup.sh [Linux or Unix]&lt;br /&gt;
* 4. bundle install&lt;br /&gt;
* 5. rake db:migrate&lt;br /&gt;
* 6. rails s&lt;br /&gt;
&lt;br /&gt;
===Test Plan - TDD Approach===&lt;br /&gt;
Testing on the assessment 360 controller was done for the following cases:&lt;br /&gt;
* 1. '''Edge cases''' : &lt;br /&gt;
* When no score currently exists for a particular assignment.&lt;br /&gt;
* When an entire column does not exist for an assignment&lt;br /&gt;
* 2. '''Ideal case''':&lt;br /&gt;
* When there exists atleast one student with a score for every assignment.&lt;br /&gt;
* 3. '''Invalid Inputs''': Atleast one column needs to be selected by the user to view the table. No column selected is an invalid input case.&lt;br /&gt;
&lt;br /&gt;
===Testing using RSPEC===&lt;br /&gt;
In the existing version of Expertiza there existed certain test cases for the Assessment360 controller.We have added an additional set of RSPEC tests for Assessment360 contoller, to test all the modifications made to the controller and have also removed the testcases corresponding to the code that was removed. The tests can be executed &amp;quot;rpec rspec spec/controllers/assessment360_controller_spec.rb&amp;quot; command as shown below.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user-expertiza $rspec spec/controllers/assessment360_controller_spec.rb&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
........................&lt;br /&gt;
&lt;br /&gt;
Finished in 1 minute 36.91 seconds (files took 6.76 seconds to load)&lt;br /&gt;
24 examples, 0 failures&lt;br /&gt;
&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Project Team===&lt;br /&gt;
* '''Mentor''' - Dr. Edward Gehringer&lt;br /&gt;
* '''Members'''&lt;br /&gt;
* 1. Neha Kotcherlakota&lt;br /&gt;
* 2. Ankit Singh&lt;br /&gt;
* 3. Supriya Krishna&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[https://github.com/asingh072318/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://152.7.176.208:3000/ The live Expertiza website]&lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;br /&gt;
#Clean Code: A handbook of agile software craftsmanship. Author: Robert C Martin&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139888</id>
		<title>CSC/ECE 517 Fall 2021 - E2131. Improve assessment360 controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139888"/>
		<updated>2021-10-21T14:26:15Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2131. Improving the Assessment 360 Controller==&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===About Expertiza===&lt;br /&gt;
&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project based on [http://rubyonrails.org/ Ruby on Rails] framework. Expertiza allows the instructor to create new assignments and customize new or existing assignments. It also allows the instructor to create a list of topics the students can sign up for. Students can form teams in Expertiza to work on various projects and assignments. Students can also peer review other students' submissions. Expertiza supports submission across various document types, including the URLs and wiki pages.&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* Improved the clarity of code by improving the variable and parameter names.&lt;br /&gt;
* Long character strings were taken and given appropriate names.&lt;br /&gt;
* Combined two views: Grade summary by student &amp;amp; Aggregate teammate and Meta Review to 1 page : All Students All Reviews.&lt;br /&gt;
* Added a new functionality for the user to customise the table to view relevant columns.&lt;br /&gt;
* Added RSPEC test cases for testing changes made in the Assessment360 Controller&lt;br /&gt;
&lt;br /&gt;
===About Assessment 360 Controller===&lt;br /&gt;
This controller provides functionality for displaying course-level data, specifically, review averages, and for each student who is a course participant, a list of the projects they worked on and the grades that they received.  The reason it is called “assessment 360” is because that’s a term that relates to evaluating performance by combining a lot of different perspectives into a single view.  Its externally callable methods are all_students_all_reviews and course_student_grade_summary. I believe that all other methods are simply helper methods for these methods, but please check, because I’m not sure of it.&lt;br /&gt;
&lt;br /&gt;
===Current Implementation===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Functionality=====&lt;br /&gt;
* Every course instructor that logs in to Expertiza should be able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course&lt;br /&gt;
* The instructor can navigate to 2 different views: all_students_all_review and course_student_grade_summary to view the scores.&lt;br /&gt;
* all_students_all_review view - Allows the instructor to view the teammate review and the meta review scores corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
* course_student_grade_summary - Allows the instructor to view the peer review score, instructor grade corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
&lt;br /&gt;
====Drawbacks and Solutions=====&lt;br /&gt;
* '''Problem 1''': The instructor has to navigate to two different views to view the data regarding the scores of all the students enrolled in a particular course. The following are the issues caused due to 2 views:&lt;br /&gt;
* 1. Difficult to view consolidated data regarding student scores at one place.&lt;br /&gt;
* 2. Redundant columns&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:All students all reviews view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* course_student_grade_summary&lt;br /&gt;
[[File:Course grade summary view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been changed in the following way to address the issues:&lt;br /&gt;
* One consolidated view is made : all_student_all_reviews which displays all the scores corresponding to each assignment for every student enrolled in a particular course&lt;br /&gt;
* No redundant columns exist since the entire data is consolidated in a single view.&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:Consolidated view.png|800px]]&lt;br /&gt;
&lt;br /&gt;
* '''Problem 2''': Every course instructor that logs in to Expertiza is able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course in a tabular form in 2 different views. Although, it is difficult to view respective teammate and meta review scores on sorting by peer review scores or instructor grades and vice versa.&lt;br /&gt;
For example: The instructor cannot sort the peer review scores in the table based on the teammate reviews or the meta reviews since they are in 2 different views &lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been modified such that an instructor can sort any column in the table and view respective data for other columns. This can be done since the entire data can now be seen in a single consolidated view.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot; class=&amp;quot;noborder sorter-true&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;30&amp;quot; class=&amp;quot;noborder&amp;quot;&amp;gt;Teammate Count&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;th colspan=&amp;quot;&amp;lt;%= @colspan %&amp;gt;&amp;quot; class=&amp;quot;sorter-false&amp;quot;&amp;gt;&amp;lt;%= assignment.name %&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
            .......&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    ...............&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Problem 3''': Page loading time for all_student_all_reviews is extremely high since a network call is being made as soon as a user clicks on a link to navigate to that page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
      .....&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;% (0..@assignments.size).each do %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
        .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Since there is no condition on rendering the entire view is loaded as soon as the user navigates to the page. This makes the page load extremely slow since the network call is made immediately on page load making it a bad user experience.&lt;br /&gt;
* '''Solution''': The implementation has been changed such that instructor can customise the table to only view the columns relevant to them and post selecting the network call is made. Due to this the page loads faster, as soon as the user clicks a link to navigate to the page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;%# This section renders the checkboxes and passes values to controller as different variables %&amp;gt;&lt;br /&gt;
  &amp;lt;%= form_tag({:action =&amp;gt; 'all_students_all_reviews'},{:method =&amp;gt; :get}) %&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Which field do you want to see?&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: inline-flex;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_topics&amp;quot; id=&amp;quot;show_topics&amp;quot; value=true&amp;gt;Topics &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_teammate_reviews&amp;quot; id=&amp;quot;show_teammate_reviews&amp;quot; value=true&amp;gt;Teammate reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_meta_reviews&amp;quot; id=&amp;quot;show_meta_reviews&amp;quot; value=true&amp;gt;Meta-reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_peer_scores&amp;quot; id=&amp;quot;show_peer_scores&amp;quot; value=true&amp;gt;Peer scores &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_instructor_grades&amp;quot; id=&amp;quot;show_instructor_grades&amp;quot; value=true&amp;gt;Instructor grades&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;%= button_tag 'Go', value: @course_id, type: :submit, name: :course_id%&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;% if @render_partial %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render 'assessment' %&amp;gt; &lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The assessment view is rendered only if the render_partial variable is true. Due to this check, the all_students_all_reviews page loads faster on navigation since the network call is not made immediately. Instead it is made after a user action which makes it a better user experience.&lt;br /&gt;
&lt;br /&gt;
===New Implementation===&lt;br /&gt;
* '''Consolidation of views''' - The 2 views all_students_all_review and course_student_grade_summary are now merged into 1 view: views all_students_all_review. This view can be accessed using the list icon from the Manage Courses page.&lt;br /&gt;
Navigation to the manage courses page: &lt;br /&gt;
* 1. Choose Manage on the navigation bar on the top of the screen.&lt;br /&gt;
* 2. Choose Courses from the list&lt;br /&gt;
[[File:Manage courses option.png|900px]]&lt;br /&gt;
* 3. Choose the list icon corresponding to the course for which you need to view the student score summary.&lt;br /&gt;
*Previous Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:Two views.png|900px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Modified Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:One view.png|900px]]&lt;br /&gt;
* '''Customisation''' - New checkbox functionality is added which allows the instructor to customise the view by selecting from a list of columns and viewing only those that are relevant to them. Checkboxes for the following columns exist:&lt;br /&gt;
* 1. Topics&lt;br /&gt;
* 2. Teammate reviews&lt;br /&gt;
* 3. Meta reviews&lt;br /&gt;
* 4. Peer scores&lt;br /&gt;
* 5. Instructor grades&lt;br /&gt;
* The instructor can customise the table by selecting the any or all of the above mentioned columns and only view columns that are relevant to them.&lt;br /&gt;
[[File:Checkboxes option.png|900px]]&lt;br /&gt;
* '''Dynamic UI''' - A new functionality in the UI is added that ensures '''dynamic resizing''' of the table based on the number of columns to be displayed.&lt;br /&gt;
* '''UI Enhancement''' - The UI of the all_student_all_reviews page is enhanced for better user experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Code Improvement===&lt;br /&gt;
* '''Implementation of partials''' - Refactoring of the code was done to ensure better readability by implementing partials. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;%# Partial to render the table %&amp;gt;&lt;br /&gt;
&amp;lt;%# Format of table %&amp;gt;&lt;br /&gt;
&amp;lt;%#                          |                   Assignment1                      |     Assignment2     |     Assignment3   |  Final Grades     |     Aggregate Score          %&amp;gt;&lt;br /&gt;
&amp;lt;%# Students  Teammate_Count |Metareview Teammate_review Topic Peer Instructor    |                     |                   | Total Inst Grade  | Metareview | Teammate Review %&amp;gt;&lt;br /&gt;
&amp;lt;%#  s1                      |                                                    |                     |                   |                   |            |                 %&amp;gt;&lt;br /&gt;
&amp;lt;%#  s2                      |                                                    |                     |                   |                   |            |                 %&amp;gt;&lt;br /&gt;
&amp;lt;%# Class_Average            |  x%            y%          N/A  N/A    N/A         |                     |                   |       N/A         |     x'%    |      y'%        %&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Topic&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Peer Score&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;th class=&amp;quot;sorter-true&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Total Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Class Average&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end%&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_meta_review_grade / total_meta_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_teammate_review_grade / total_teammate_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Code comments''' - Code comments for every new implementation are added to provide a better understanding and easier experience for developers viewing the code.&lt;br /&gt;
* '''Refactoring''' - Refactoring of the code is done by renaming certain variables based on the naming convention, choosing ideal names for all the newly added variables, removing unused code.&lt;br /&gt;
* 1. Removed the view - course_student_grade_summary&lt;br /&gt;
* 2. Replaced teamed_count to teammate count&lt;br /&gt;
* Previous code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teamed_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end%&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Modified code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 3. Added variables names according to the naming convention&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    @topics = {}&lt;br /&gt;
    @assignment_grades = {}&lt;br /&gt;
    @peer_review_scores = {}&lt;br /&gt;
    @final_grades = {}&lt;br /&gt;
    course = Course.find(params[:course_id])&lt;br /&gt;
    @course_id = params[:course_id]&lt;br /&gt;
    @assignments = course.assignments.reject(&amp;amp;:is_calibrated).reject {|a| a.participants.empty? }&lt;br /&gt;
    @course_participants = course.get_participants&lt;br /&gt;
    # variable to check if we have to render just the checkboxes or partials too&lt;br /&gt;
    @render_partial = false&lt;br /&gt;
    insure_existence_of(@course_participants,course)&lt;br /&gt;
    # hashes for view&lt;br /&gt;
    @meta_review = {}&lt;br /&gt;
    @teammate_review = {}&lt;br /&gt;
    @teammate_count = {}&lt;br /&gt;
    # instance variables based on each checkbox&lt;br /&gt;
    @show_teammate_reviews = params[:show_teammate_reviews] || false&lt;br /&gt;
    @show_meta_reviews = params[:show_meta_reviews] || false&lt;br /&gt;
    @show_peer_scores = params[:show_peer_scores] || false&lt;br /&gt;
    @show_instructor_grades = params[:show_instructor_grades] || false&lt;br /&gt;
    @show_topics = params[:show_topics] || false&lt;br /&gt;
    @checkboxes_array = [@show_teammate_reviews,@show_meta_reviews,@show_peer_scores,@show_instructor_grades,@show_topics]&lt;br /&gt;
    # number of columns to span for each assignment&lt;br /&gt;
    @colspan = assignment_colspan @checkboxes_array&lt;br /&gt;
    # number of columns to span for Aggregate Score table header&lt;br /&gt;
    @colspan_review = review_colspan @checkboxes_array&lt;br /&gt;
    # for course&lt;br /&gt;
    # eg. @overall_teammate_review_grades = {assgt_id1: 100, assgt_id2: 178, ...}&lt;br /&gt;
    # @overall_teammate_review_count = {assgt_id1: 1, assgt_id2: 2, ...}&lt;br /&gt;
    # network calls to be done only when we need to render_partial&lt;br /&gt;
    @render_partial = show_table? @checkboxes_array&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Improved Performance''' - Improved the application performance by enhancing the user experience on navigation to the all_students_all_reviews page by changing when the network call should be made.&lt;br /&gt;
* '''Relevant Test Cases''' - Added relevant test cases for all the newly implemented code.&lt;br /&gt;
&lt;br /&gt;
===Modified File===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. assessment_360.controller.rb&lt;br /&gt;
* 2. course_student_grade_summary.html.erb - removed&lt;br /&gt;
* 3. all_students_all_review.html.erb - removed&lt;br /&gt;
* 4. tree_display.jsx&lt;br /&gt;
* 5. assessment360_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Steps to run the application on your local===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. git clone https://github.com/asingh072318/expertiza&lt;br /&gt;
* 2. cd expertiza&lt;br /&gt;
* 3. bash setup.sh [Linux or Unix]&lt;br /&gt;
* 4. bundle install&lt;br /&gt;
* 5. rake db:migrate&lt;br /&gt;
* 6. rails s&lt;br /&gt;
&lt;br /&gt;
===Test Plan - TDD Approach===&lt;br /&gt;
Testing on the assessment 360 controller was done for the following cases:&lt;br /&gt;
* 1. '''Edge cases''' : &lt;br /&gt;
* When no score currently exists for a particular assignment.&lt;br /&gt;
* When an entire column does not exist for an assignment&lt;br /&gt;
* 2. '''Ideal case''':&lt;br /&gt;
* When there exists atleast one student with a score for every assignment.&lt;br /&gt;
* 3. '''Invalid Inputs''': Atleast one column needs to be selected by the user to view the table. No column selected is an invalid input case.&lt;br /&gt;
&lt;br /&gt;
===Testing using RSPEC===&lt;br /&gt;
In the existing version of Expertiza there existed certain test cases for the Assessment360 controller.We have added an additional set of RSPEC tests for Assessment360 contoller, to test all the modifications made to the controller and have also removed the testcases corresponding to the code that was removed. The tests can be executed &amp;quot;rpec rspec spec/controllers/assessment360_controller_spec.rb&amp;quot; command as shown below.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user-expertiza $rspec spec/controllers/assessment360_controller_spec.rb&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
........................&lt;br /&gt;
&lt;br /&gt;
Finished in 1 minute 36.91 seconds (files took 6.76 seconds to load)&lt;br /&gt;
24 examples, 0 failures&lt;br /&gt;
&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Project Team===&lt;br /&gt;
* '''Mentor''' - Dr. Edward Gehringer&lt;br /&gt;
* '''Members'''&lt;br /&gt;
* 1. Neha Kotcherlakota&lt;br /&gt;
* 2. Ankit Singh&lt;br /&gt;
* 3. Supriya Krishna&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[https://github.com/asingh072318/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://152.7.176.208:3000/ The live Expertiza website]&lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;br /&gt;
#Clean Code: A handbook of agile software craftsmanship. Author: Robert C Martin&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139596</id>
		<title>CSC/ECE 517 Fall 2021 - E2131. Improve assessment360 controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2021_-_E2131._Improve_assessment360_controller.rb&amp;diff=139596"/>
		<updated>2021-10-21T00:17:52Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Created page with &amp;quot;==E2131. Improving the Assessment 360 Controller==  This page provides a description of the Expertiza based OSS project.    __TOC__   ===About Expertiza===  [http://expertiza....&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E2131. Improving the Assessment 360 Controller==&lt;br /&gt;
&lt;br /&gt;
This page provides a description of the Expertiza based OSS project. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===About Expertiza===&lt;br /&gt;
&lt;br /&gt;
[http://expertiza.ncsu.edu/ Expertiza] is an open source project based on [http://rubyonrails.org/ Ruby on Rails] framework. Expertiza allows the instructor to create new assignments and customize new or existing assignments. It also allows the instructor to create a list of topics the students can sign up for. Students can form teams in Expertiza to work on various projects and assignments. Students can also peer review other students' submissions. Expertiza supports submission across various document types, including the URLs and wiki pages.&lt;br /&gt;
&lt;br /&gt;
===Problem Statement===&lt;br /&gt;
The following tasks were accomplished in this project:&lt;br /&gt;
&lt;br /&gt;
* Improved the clarity of code by improving the variable and parameter names.&lt;br /&gt;
* Long character strings were taken and given appropriate names.&lt;br /&gt;
* Combined two views: Grade summary by student &amp;amp; Aggregate teammate and Meta Review to 1 page : All Students All Reviews.&lt;br /&gt;
* Added a new functionality for the user to customise the table to view relevant columns.&lt;br /&gt;
* Added RSPEC test cases for testing changes made in the Assessment360 Controller&lt;br /&gt;
&lt;br /&gt;
===About Assessment 360 Controller===&lt;br /&gt;
This controller provides functionality for displaying course-level data, specifically, review averages, and for each student who is a course participant, a list of the projects they worked on and the grades that they received.  The reason it is called “assessment 360” is because that’s a term that relates to evaluating performance by combining a lot of different perspectives into a single view.  Its externally callable methods are all_students_all_reviews and course_student_grade_summary. I believe that all other methods are simply helper methods for these methods, but please check, because I’m not sure of it.&lt;br /&gt;
&lt;br /&gt;
===Current Implementation===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Functionality=====&lt;br /&gt;
* Every course instructor that logs in to Expertiza should be able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course&lt;br /&gt;
* The instructor can navigate to 2 different views: all_students_all_review and course_student_grade_summary to view the scores.&lt;br /&gt;
* all_students_all_review view - Allows the instructor to view the teammate review and the meta review scores corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
* course_student_grade_summary - Allows the instructor to view the peer review score, instructor grade corresponding to each assignment of every student enrolled in a particular course in a tabular form. These details can be viewed along with details like: &lt;br /&gt;
&lt;br /&gt;
====Drawbacks and Solutions=====&lt;br /&gt;
* '''Problem 1''': The instructor has to navigate to two different views to view the data regarding the scores of all the students enrolled in a particular course. The following are the issues caused due to 2 views:&lt;br /&gt;
* 1. Difficult to view consolidated data regarding student scores at one place.&lt;br /&gt;
* 2. Redundant columns&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:All students all reviews view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* course_student_grade_summary&lt;br /&gt;
[[File:Course grade summary view.png|800px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been changed in the following way to address the issues:&lt;br /&gt;
* One consolidated view is made : all_student_all_reviews which displays all the scores corresponding to each assignment for every student enrolled in a particular course&lt;br /&gt;
* No redundant columns exist since the entire data is consolidated in a single view.&lt;br /&gt;
* all_students_all_review view&lt;br /&gt;
[[File:Consolidated view.png|800px]]&lt;br /&gt;
&lt;br /&gt;
* '''Problem 2''': Every course instructor that logs in to Expertiza is able to view the course grade summary and the teammate and meta review scores corresponding to each assignment for all the students enrolled in a particular course in a tabular form in 2 different views. Although, it is difficult to view respective teammate and meta review scores on sorting by peer review scores or instructor grades and vice versa.&lt;br /&gt;
For example: The instructor cannot sort the peer review scores in the table based on the teammate reviews or the meta reviews since they are in 2 different views &lt;br /&gt;
&lt;br /&gt;
* '''Solution''': The implementation has been modified such that an instructor can sort any column in the table and view respective data for other columns. This can be done since the entire data can now be seen in a single consolidated view.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot; class=&amp;quot;noborder sorter-true&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;th rowspan=2 width=&amp;quot;30&amp;quot; class=&amp;quot;noborder&amp;quot;&amp;gt;Teammate Count&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;th colspan=&amp;quot;&amp;lt;%= @colspan %&amp;gt;&amp;quot; class=&amp;quot;sorter-false&amp;quot;&amp;gt;&amp;lt;%= assignment.name %&amp;gt; &amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
            .......&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    ...............&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Problem 3''': Page loading time for all_student_all_reviews is extremely high since a network call is being made as soon as a user clicks on a link to navigate to that page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;lt;table class=&amp;quot;table table-striped&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;th rowspan=2 width=&amp;quot;320&amp;quot;&amp;gt;Students&amp;lt;/th&amp;gt;&lt;br /&gt;
      .....&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;% (0..@assignments.size).each do %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
        .....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Since there is no condition on rendering the entire view is loaded as soon as the user navigates to the page. This makes the page load extremely slow since the network call is made immediately on page load making it a bad user experience.&lt;br /&gt;
* '''Solution''': The implementation has been changed such that instructor can customise the table to only view the columns relevant to them and post selecting the network call is made. Due to this the page loads faster, as soon as the user clicks a link to navigate to the page.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;%# This section renders the checkboxes and passes values to controller as different variables %&amp;gt;&lt;br /&gt;
  &amp;lt;%= form_tag({:action =&amp;gt; 'all_students_all_reviews'},{:method =&amp;gt; :get}) %&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt;Which field do you want to see?&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display: inline-flex;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_topics&amp;quot; id=&amp;quot;show_topics&amp;quot; value=true&amp;gt;Topics &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_teammate_reviews&amp;quot; id=&amp;quot;show_teammate_reviews&amp;quot; value=true&amp;gt;Teammate reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_meta_reviews&amp;quot; id=&amp;quot;show_meta_reviews&amp;quot; value=true&amp;gt;Meta-reviews &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_peer_scores&amp;quot; id=&amp;quot;show_peer_scores&amp;quot; value=true&amp;gt;Peer scores &amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;show_instructor_grades&amp;quot; id=&amp;quot;show_instructor_grades&amp;quot; value=true&amp;gt;Instructor grades&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;%= button_tag 'Go', value: @course_id, type: :submit, name: :course_id%&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;% if @render_partial %&amp;gt;&lt;br /&gt;
    &amp;lt;%= render 'assessment' %&amp;gt; &lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The assessment view is rendered only if the render_partial variable is true. Due to this check, the all_students_all_reviews page loads faster on navigation since the network call is not made immediately. Instead it is made after a user action which makes it a better user experience.&lt;br /&gt;
&lt;br /&gt;
===New Implementation===&lt;br /&gt;
* '''Consolidation of views''' - The 2 views all_students_all_review and course_student_grade_summary are now merged into 1 view: views all_students_all_review. This view can be accessed using the list icon from the Manage Courses page.&lt;br /&gt;
Navigation to the manage courses page: &lt;br /&gt;
* 1. Choose Manage on the navigation bar on the top of the screen.&lt;br /&gt;
* 2. Choose Courses from the list&lt;br /&gt;
[[File:Manage courses option.png|900px]]&lt;br /&gt;
* 3. Choose the list icon corresponding to the course for which you need to view the student score summary.&lt;br /&gt;
*Previous Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:Two views.png|900px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
*Modified Implementation&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;[[File:One view.png|900px]]&lt;br /&gt;
* '''Customisation''' - New checkbox functionality is added which allows the instructor to customise the view by selecting from a list of columns and viewing only those that are relevant to them. Checkboxes for the following columns exist:&lt;br /&gt;
* 1. Topics&lt;br /&gt;
* 2. Teammate reviews&lt;br /&gt;
* 3. Meta reviews&lt;br /&gt;
* 4. Peer scores&lt;br /&gt;
* 5. Instructor grades&lt;br /&gt;
* The instructor can customise the table by selecting the any or all of the above mentioned columns and only view columns that are relevant to them.&lt;br /&gt;
[[File:Checkboxes option.png|900px]]&lt;br /&gt;
* '''Dynamic UI''' - A new functionality in the UI is added that ensures '''dynamic resizing''' of the table based on the number of columns to be displayed.&lt;br /&gt;
* '''UI Enhancement''' - The UI of the all_student_all_reviews page is enhanced for better user experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Code Improvement===&lt;br /&gt;
* '''Implementation of partials''' - Refactoring of the code was done to ensure better readability by implementing partials. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;%# Partial to render the table %&amp;gt;&lt;br /&gt;
&amp;lt;%# Format of table %&amp;gt;&lt;br /&gt;
&amp;lt;%#                          |                   Assignment1                      |     Assignment2     |     Assignment3   |  Final Grades     |     Aggregate Score          %&amp;gt;&lt;br /&gt;
&amp;lt;%# Students  Teammate_Count |Metareview Teammate_review Topic Peer Instructor    |                     |                   | Total Inst Grade  | Metareview | Teammate Review %&amp;gt;&lt;br /&gt;
&amp;lt;%#  s1                      |                                                    |                     |                   |                   |            |                 %&amp;gt;&lt;br /&gt;
&amp;lt;%#  s2                      |                                                    |                     |                   |                   |            |                 %&amp;gt;&lt;br /&gt;
&amp;lt;%# Class_Average            |  x%            y%          N/A  N/A    N/A         |                     |                   |       N/A         |     x'%    |      y'%        %&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.......&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    $(function() {&lt;br /&gt;
        /*Function for sorting the table */&lt;br /&gt;
        $(&amp;quot;.sortable&amp;quot;).tablesorter({&lt;br /&gt;
            sortList: [[0,0]] // sort by Student name&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;table table-striped sortable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;thead&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          ....&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment| %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Topic&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Peer Score&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
              &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
                &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
              &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;th class=&amp;quot;sorter-true&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Total Instructor Grade&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Metareviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;th&amp;gt;&amp;lt;b&amp;gt;Teammate Reviews&amp;lt;/b&amp;gt;&amp;lt;/th&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/thead&amp;gt;&lt;br /&gt;
    &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Class Average&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_meta_review_grades[assignment.id] / @overall_meta_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{@overall_teammate_review_grades[assignment.id] / @overall_teammate_review_count[assignment.id]}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
        &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% end%&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_grade = @overall_meta_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_meta_review_count = @overall_meta_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;—&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_meta_review_grade / total_meta_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_grade = @overall_teammate_review_grades.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% total_teammate_review_count = @overall_teammate_review_count.inject(0) {|sum, (k, v)| sum + v } %&amp;gt;&lt;br /&gt;
      &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;#{total_teammate_review_grade / total_teammate_review_count}%&amp;quot; %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;% end %&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Code comments''' - Code comments for every new implementation are added to provide a better understanding and easier experience for developers viewing the code.&lt;br /&gt;
* '''Refactoring''' - Refactoring of the code is done by renaming certain variables based on the naming convention, choosing ideal names for all the newly added variables, removing unused code.&lt;br /&gt;
* 1. Removed the view - course_student_grade_summary&lt;br /&gt;
* 2. Replaced teamed_count to teammate count&lt;br /&gt;
* Previous code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teamed_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
                &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end%&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;%end%&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Modified code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;lt;% @course_participants.each do |cp|%&amp;gt;&lt;br /&gt;
      &amp;lt;tr&amp;gt;&lt;br /&gt;
          &amp;lt;td align=&amp;quot;center&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;#{cp.name(session[:ip])} (#{cp.fullname(session[:ip])})&amp;quot; %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;td&amp;gt;&amp;lt;%= @teammate_count[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% @assignments.each do |assignment|%&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][assignment.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_topics%&amp;gt;&lt;br /&gt;
              &amp;lt;% topic = format_topic(@topics[cp.id][assignment.id]) %&amp;gt;&lt;br /&gt;
              &amp;lt;td title=&amp;quot;&amp;lt;%= topic %&amp;gt;&amp;quot; class=&amp;quot;topic topic-tooltip&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;%= topic %&amp;gt;&lt;br /&gt;
              &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_peer_scores %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@peer_review_scores[cp.id][assignment.id]) %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
            &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
              &amp;lt;td&amp;gt;&amp;lt;%= format_score(@assignment_grades[cp.id][assignment.id]) %&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_instructor_grades %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @final_grades[cp.id] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_meta_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @meta_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
          &amp;lt;% if @show_teammate_reviews %&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;%= @teammate_review[cp.id][:avg_grade_for_assgt] %&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
          &amp;lt;% end %&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;% end %&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 3. Added variables names according to the naming convention&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    @topics = {}&lt;br /&gt;
    @assignment_grades = {}&lt;br /&gt;
    @peer_review_scores = {}&lt;br /&gt;
    @final_grades = {}&lt;br /&gt;
    course = Course.find(params[:course_id])&lt;br /&gt;
    @course_id = params[:course_id]&lt;br /&gt;
    @assignments = course.assignments.reject(&amp;amp;:is_calibrated).reject {|a| a.participants.empty? }&lt;br /&gt;
    @course_participants = course.get_participants&lt;br /&gt;
    # variable to check if we have to render just the checkboxes or partials too&lt;br /&gt;
    @render_partial = false&lt;br /&gt;
    insure_existence_of(@course_participants,course)&lt;br /&gt;
    # hashes for view&lt;br /&gt;
    @meta_review = {}&lt;br /&gt;
    @teammate_review = {}&lt;br /&gt;
    @teammate_count = {}&lt;br /&gt;
    # instance variables based on each checkbox&lt;br /&gt;
    @show_teammate_reviews = params[:show_teammate_reviews] || false&lt;br /&gt;
    @show_meta_reviews = params[:show_meta_reviews] || false&lt;br /&gt;
    @show_peer_scores = params[:show_peer_scores] || false&lt;br /&gt;
    @show_instructor_grades = params[:show_instructor_grades] || false&lt;br /&gt;
    @show_topics = params[:show_topics] || false&lt;br /&gt;
    @checkboxes_array = [@show_teammate_reviews,@show_meta_reviews,@show_peer_scores,@show_instructor_grades,@show_topics]&lt;br /&gt;
    # number of columns to span for each assignment&lt;br /&gt;
    @colspan = assignment_colspan @checkboxes_array&lt;br /&gt;
    # number of columns to span for Aggregate Score table header&lt;br /&gt;
    @colspan_review = review_colspan @checkboxes_array&lt;br /&gt;
    # for course&lt;br /&gt;
    # eg. @overall_teammate_review_grades = {assgt_id1: 100, assgt_id2: 178, ...}&lt;br /&gt;
    # @overall_teammate_review_count = {assgt_id1: 1, assgt_id2: 2, ...}&lt;br /&gt;
    # network calls to be done only when we need to render_partial&lt;br /&gt;
    @render_partial = show_table? @checkboxes_array&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* '''Improved Performance''' - Improved the application performance by enhancing the user experience on navigation to the all_students_all_reviews page by changing when the network call should be made.&lt;br /&gt;
* '''Relevant Test Cases''' - Added relevant test cases for all the newly implemented code.&lt;br /&gt;
&lt;br /&gt;
===Modified File===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. assessment_360.controller.rb&lt;br /&gt;
* 2. course_student_grade_summary.html.erb - removed&lt;br /&gt;
* 3. all_students_all_review.html.erb - removed&lt;br /&gt;
* 4. tree_display.jsx&lt;br /&gt;
* 5. assessment360_controller_spec.rb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Steps to run the application on your local===&lt;br /&gt;
* The following are the list of modified files:&lt;br /&gt;
* 1. git clone https://github.com/asingh072318/expertiza&lt;br /&gt;
* 2. cd expertiza&lt;br /&gt;
* 3. bash setup.sh [Linux or Unix]&lt;br /&gt;
* 4. bundle install&lt;br /&gt;
* 5. rake db:migrate&lt;br /&gt;
* 6. rails s&lt;br /&gt;
&lt;br /&gt;
===Testing using RSPEC===&lt;br /&gt;
In the existing version of Expertiza there existed certain test cases for the Assessment360 controller.We have added an additional set of RSPEC tests for Assessment360 contoller, to test all the modifications made to the controller and have also removed the testcases corresponding to the code that was removed. The tests can be executed &amp;quot;rpec rspec spec/controllers/assessment360_controller_spec.rb&amp;quot; command as shown below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
user-expertiza $rspec spec/controllers/assessment360_controller_spec.rb&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
........................&lt;br /&gt;
&lt;br /&gt;
Finished in 1 minute 36.91 seconds (files took 6.76 seconds to load)&lt;br /&gt;
24 examples, 0 failures&lt;br /&gt;
&lt;br /&gt;
Randomized with seed 52813&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Project Team===&lt;br /&gt;
* '''Mentor''' - Dr. Edward Gehringer&lt;br /&gt;
* '''Members'''&lt;br /&gt;
* 1. Neha Kotcherlakota&lt;br /&gt;
* 2. Ankit Singh&lt;br /&gt;
* 3. Supriya Krishna&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
#[https://github.com/expertiza/expertiza Expertiza on GitHub]&lt;br /&gt;
#[https://github.com/asingh072318/expertiza GitHub Project Repository Fork]&lt;br /&gt;
#[http://152.7.176.208:3000/ The live Expertiza website]&lt;br /&gt;
#[http://wikis.lib.ncsu.edu/index.php/Expertiza Expertiza project documentation wiki]&lt;br /&gt;
#[https://relishapp.com/rspec Rspec Documentation]&lt;br /&gt;
#Clean Code: A handbook of agile software craftsmanship. Author: Robert C Martin&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Checkboxes_option.png&amp;diff=139488</id>
		<title>File:Checkboxes option.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Checkboxes_option.png&amp;diff=139488"/>
		<updated>2021-10-20T19:51:16Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_courses_option.png&amp;diff=139487</id>
		<title>File:Manage courses option.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Manage_courses_option.png&amp;diff=139487"/>
		<updated>2021-10-20T19:49:57Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Consolidated_view.png&amp;diff=139452</id>
		<title>File:Consolidated view.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Consolidated_view.png&amp;diff=139452"/>
		<updated>2021-10-20T18:54:48Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Checkboxes_selected.png&amp;diff=139451</id>
		<title>File:Checkboxes selected.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Checkboxes_selected.png&amp;diff=139451"/>
		<updated>2021-10-20T18:53:56Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Course_grade_summary_view.png&amp;diff=139448</id>
		<title>File:Course grade summary view.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Course_grade_summary_view.png&amp;diff=139448"/>
		<updated>2021-10-20T18:51:10Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:All_students_all_reviews_view.png&amp;diff=139445</id>
		<title>File:All students all reviews view.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:All_students_all_reviews_view.png&amp;diff=139445"/>
		<updated>2021-10-20T18:49:24Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:One_view.png&amp;diff=139398</id>
		<title>File:One view.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:One_view.png&amp;diff=139398"/>
		<updated>2021-10-20T16:00:12Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Two_views.png&amp;diff=139396</id>
		<title>File:Two views.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Two_views.png&amp;diff=139396"/>
		<updated>2021-10-20T15:51:55Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: Nkotche uploaded a new version of File:Two views.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=File:Two_views.png&amp;diff=139395</id>
		<title>File:Two views.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=File:Two_views.png&amp;diff=139395"/>
		<updated>2021-10-20T15:46:00Z</updated>

		<summary type="html">&lt;p&gt;Nkotche: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Nkotche</name></author>
	</entry>
</feed>