E1936 Specialized Rubrics: Difference between revisions

From Expertiza_Wiki
Jump to navigation Jump to search
Line 340: Line 340:
Use the correct rubric for a particular topic
Use the correct rubric for a particular topic


''?''
''app\controllers\response_controller.rb''


<pre>
<pre>
  def set_questionnaire_for_new_response
    case @map.type
    when "ReviewResponseMap", "SelfReviewResponseMap"
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)
      @current_round = @assignment.number_of_current_round(reviewees_topic)
      @questionnaire = @map.questionnaire(@current_round, reviewees_topic)
    when
      ...
    end
  end
</pre>
</pre>



Revision as of 22:53, 23 April 2019

This wiki page describes the work and goals that have been completed and achieved while implementing Expertiza Project "E1936. Specialized Rubrics for Different Topic Types (e.g., Servo project, refactoring project)" for the CSC/ECE 517 "Object-Oriented Design and Development" class, in the Spring semester of the 2019.

Introduction

This Wiki page is created per CSC/ECE 517: "Object-Oriented Design and Development", Expertiza Project requirements (Spring, 2019).

Our team was assigned the project "E1936. Specialized rubrics for different topic types (e.g., Servo project, refactoring project)". This is an Expertiza project.

In this wiki page we describe the problem to be solved, how we solve that problem, and how we test our solution. We also provide helpful links and contact information for our team.

Project Description

In this section, we discuss the problem we need to solve, the Expertiza feature this problem is related to, what needs to be done to solve the problem (at a high level), and the previous attempt to solve this problem.

Problem Statement

This problem statement summarizes the problem as described in the project description "E1936. Specialized rubrics for different topic types (e.g., Servo project, refactoring project)".

In CSC/ECE 517, there are several types of topics that could be covered in a single class assignment.

  • Code base
    • Expertiza
    • Mozilla
    • etc.
  • Goal
    • Refactoring
    • Testing
    • etc.

However, currently we can only specify one kind of rubric for an assignment. This means that teams working on different topics will be evaluated using the same rubric. With this setup, it's not possible to fine-tune rubrics for different topics - rubrics tend to be overly general.

Feature Description

The Expertiza project already has a feature that allows rubrics to vary by project phase or "round". The feature we will add in this project is a feature to allow rubrics to vary not only by round, but also by topic. This allows more flexibility to the instructor when setting up an assignment, so that they can use rubrics better suited to the tasks that students are performing in an assignment.

When this feature is complete, the following scenarios will be possible, and the instructor will be the judge of which scenario is the best fit to the assignment:

  • Rubric does not vary by round or by topic.
  • Rubric varies by round, but not by topic.
  • Rubric varies by topic, but not by round.
  • Rubric varies by both round and topic.

What Needs to be Done

This section summarizes the work as described in the project description "E1936. Specialized rubrics for different topic types (e.g., Servo project, refactoring project)".

  • In assignment#edit page "Rubrics" tab, add a checkbox to specify whether rubric should vary by topic.
  • In assignment#edit page "Topics" tab, add dropdown(s) next to each topic to specify which rubric(s) are associated with the topic.
    • The dropdown(s) should appear only if rubric should vary by topic, per the Rubrics tab.
    • The topic should have a multiple dropdowns (one for each round) only if rubrics vary by round, per the Rubrics tab.
    • By default, the rubric(s) for each course project will be the one(s) specified in “Rubrics” tab.
    • The dropdown value can overwrite the default rubric.
  • Be careful when making changes to the code
    • The signup_sheet_controller should have as little to do as possible with the selection of rubrics.
    • Anything not germane to selecting topics should be in another controller or (more probably) a helper.
  • Create a DB migration to allow rubric to vary by topic as well as by round.

Screenshots

Current screenshot of Rubrics tab for an Assignment (need to add a checkbox to indicate that rubric should vary by topic)


Current screenshot of Topics tab for an Assignment (need to add a way to select rubrics for particular topics)


Proposed screenshot of Rubrics tab for an Assignment


Proposed screenshot of Topics tab for an Assignment

(drop down shown for only one topic here, but final product will have one for each topic)

Previous Work

There was previous attempt to implement this project in the Fall of 2018 semester by different team, but it was rejected due to several reasons. Our team was provided with all relevant information and materials about the design and implementation of the previously attempted project. We would like to acknowledge that we use previous implementation and design as reference and our starting point for our own implementation. The following is the list of links with the relevant materials that we have used for better project understanding, determining pros and cons of previously proposed changes, and establishing our design strategy and implementation:

  1. Wiki
  2. Pull Request
  3. Video Demo

After reviewing all relevant materials above, we concluded that the project implementation was incomplete and proposed design had significant flaw. We identified main drawbacks and flaw as follows:

  • Establishing incorrect many-to-one relationship between sign_up_topics and questionnaires tables:
    • Creating a DB migration to add questionnaire_id in the sign_up_topics table to store the dropdown data presumes one-to-one or many-to-one relationship between sign_up_topics and questionnaires tables
    • Correct relationship between sign_up_topics and questionnaires tables is many-to-many. For example, each project topic may have various rubrics depending on the round it is used (e.g., for round 1, topic may have one rubric; but for round 2, the same topic may have different rubric)
    • Proposed previous migration changes would break DB design and would not allow to store correctly topic and its associated rubric per different round.
  • Per project requirement specifications, "The dropdown box should appear only if 'Vary rubric by topic' is selected in the Rubrics tab." This requirement was not met and Vary rubric by topic checkbox in the Rubrics tab was not implemented. Therefore, dropdown box with the list of rubrics appears regardless of whether "Vary rubric by topic" is selected or not.
  • The dropdown box includes the list of all possible rubrics including default value. However, this condition can be improved. The dropdown box should list the rubrics that were created by the current user (professor who is logged in). This would allow to shorten the list of possible rubrics dramatically and help to avoid any misunderstanding and confusion while user selects desired rubric for the course project.

We found no further issues with the rest implementation and in other project materials. Wiki page is very useful for understanding design of proposed changes, finding drawbacks and the flaw. Considering all the pros and cons, and taking into account drawbacks of the proposed changes, our team evolved different approach that should successfully solve the problem stated for the project without without creating additional issues. Please see our Project Implementation for more details.

Previous Project Requirements

The project requirements originally specified how to alter the databases to support varying rubrics by topic.

Create a new table named topic_questionnaires with field:

  • id
  • topic_id
  • questionnaire_id
  • used_in_round

However, the E1936 team successfully petitioned for this requirement to change to give us more freedom in the implementation. The original suggestion had a flaw. There is already an existing table in the Expertiza project called assignment_questionnaires, which has columns including assignment_id, questionnaire_id, and used_in_round. It is this table that maintains the knowledge of which rubric is used in which round of an assignment. If we were to add a new table to maintains the knowledge of which rubric is used in which topic of an assignment as originally suggested, then we would have a big problem. Knowledge of round-rubric relationship is duplicated. This would lead (best case scenario) to extra work, and (worst case scenario) to lots of bugs caused by inconsistencies in how these tables are handled with CRUD operations throughout the code. In other words, this is not a DRY solution.

Project Implementation

In this section, we propose our solution to the problem, discuss implementation techniques and details, and list the goals we achieved.

We start by analyzing Entity Relationship Diagram where we state the solution to the problem. Further we discuss design strategy by breaking project problem into multiple staged sub-problems and provide solutions for each of these sub-problems. We also discuss some implementation details and provide the list of involved files. Finally, we demonstrate how the implemented feature can be used by providing a How To sub-section.

Entity Relationship Diagram

Our solution is best introduced by first discussing how the database will be modified. This modification will be done with a new database migration.

The sections of the diagram highlighted in yellow show newly introduced items. That is, we are adding a new column called topic_id to assignment_questionnaires, in order to link assignment_questionnaires to sign_up_topics.

Any assignment, topic, or questionnaire may be represented by multiple records within assignment_questionnaires, but each record within assignment_questionnaires refers to just one assignment, topic, or questionnaire. It is the ability to have an assignment represented by multiple records, and the new relationship to sign_up_topics, that allows us to support all of the required scenarios:

  • Rubric does not vary by round or by topic.
  • Rubric varies by round, but not by topic.
  • Rubric varies by topic, but not by round.
  • Rubric varies by both round and topic.

This table illustrates the possibilities we now have.

  • Assignment 1 does not vary by round or by topic.
  • Assignment 2 varies by round, but not by topic.
  • Assignment 3 varies by topic, but not by round.
  • Assignment 4 varies by both round and topic.

Design Strategy

As we have concrete understanding of the problem and proposed solution, we would like break this problem into multiple more manageable sub-problems with specific tasks and well-defined solutions to these tasks. Generally, each sub-problem requires modification of one or more files. We would like to propose our Design Strategy as follows:

Preparation

  • Clean up code that our implementation will use
    • PROBLEM: We need to add/change content to the edit assignment Topics tab, but unlike other tabs in the views, it does not have its own partial view to work with
      • SOLUTION: Refactor and move the code dealing with topics into separate app/views/assignments/edit/_topics.html.erb file
      • File: app/views/assignments/edit.html.erb
    • PROBLEM: In a section below, we discuss the need to modify existing methods to also accept an optional argument topic_id. In many cases these existing method use confusing variable names or lack sufficient comments.
      • SOLUTION: Clean up methods that we plan to modify
      • FILE: (many)

Implementation

  • Allow an instructor to indicate that rubric should vary by topic
    • PROBLEM: There is no way for an instructor to indicate that an assignments' rubric should vary by topic
      • SOLUTION: Add a new checkbox in the edit assignment Rubric tab to indicate this preference
      • FILE: app/views/assignments/edit/_rubrics.html.erb
  • Allow an instructor to choose different rubrics for different topics
    • PROBLEM: There is no way for an instructor to choose different rubrics for different topics
      • SOLUTION: Add a new column in the edit assignment Topics tab for choosing rubric(s)
        • New column only visible if rubrics vary by topic, per Rubrics tab
        • New column has multiple rounds per topic only if rubrics vary by round, per Rubrics tab
        • Default value for any rubric is that rubric which is shown on Rubrics tab
        • Rubric(s) in the dropdown list is/are only those that were created by the currently logged in instructor
      • FILE: app/views/assignments/edit/_topics.html.erb
    • PROBLEM: The code in app/views/assignments/edit/_rubrics.html.erb includes dropdowns like the ones we need to add for topics, but that code is way too complex for its functionality (too heavy for a view, uses JavaScript)
      • SOLUTION: Use the code in app/views/assignments/edit/_rubrics.html.erb for inspiration only
        • Refactor and move as much actual work as possible out into helper methods that are simply called from this view
        • Views are not intended to do heavy lifting
        • Use as little JavaScript as possible, since this is a Ruby On Rails project, not a JS project
      • FILE: app/views/assignments/edit/_topics.html.erb
  • Support the ability of the database to link rubrics to topics
    • PROBLEM: There is no relationship in the database that can link together rubrics with topics
      • SOLUTION: Add a new migration that adds topic_id field to existing assignment_questionnaires table
        • This new field will reference the id field in the sign_up_topics table
      • FILE: db/migrate/[timestamp]_add_topic_id_to_assignment_questionnaires_table.rb
    • PROBLEM: The AssignmentQuestionnaire model does not have any knowledge of topics
      • SOLUTION: Add a new belongs_to reference in the model, to sign_up_topic
      • FILE: app/models/assignment_questionnaire.rb
    • PROBLEM: The SignUpTopic model does not have any knowledge of assignment_questionnaire records
      • SOLUTION: Add a new has_many reference in the model, to assignment_questionnaires
      • FILE: app/models/sign_up_topic.rb
  • React to an instructor saving an assignment after altering the rubrics-vary-by-topic checkbox
    • PROBLEM: There is nothing in place to remember when an instructor chooses to vary rubrics by topic, or chooses to not vary rubrics by topic
      • SOLUTION: Modify existing method update_assignment_questionnaires(). This method executes upon assignment save (explicit or via tab-change). This method deletes all AssignmentQuestionnaire records before creating new correct records reflecting the user's selections in the edit assignment form. Modify such that this method can create multiple records reflecting multiple topics, in the case where rubric should vary by topic. With this modification, the correct records (with default rubrics) are present when the user goes to the Topics tab, so that the Topics tab can display properly.
      • FILE: app\models\assignment_form.rb
    • PROBLEM: There is no way to refresh the Topics tab to show / hide drop-downs after the instructor changes checkbox on Rubrics tab
      • SOLUTION: Make use of existing "Save"-like functionality when changing tabs on the edit assignment page. When updating due to tab-change, cause a fresh render of the Topics tab. When updating due to "Save" button, keep functionality as-is.
      • FILE: app/controllers/assignments_controller.rb
      • FILE: app/views/assignments/edit.html.erb
  • Support the ability to find the correct rubric for a particular topic
    • PROBLEM: The existing methods allow us to find the correct rubric for a particular round, but not a particular topic
      • SOLUTION: Modify the existing method questionnaire(assignment, type, round_number) to also accept an optional argument topic_id
      • FILE: app/helpers/assignment_helper.rb
      • SOLUTION: Modify the existing method assignment_questionnaire(assignment, type, number) to also accept an optional argument topic_id
      • FILE: app/helpers/assignment_helper.rb
      • SOLUTION: Modify the existing method questionnaire(round = nil) to also accept an optional argument topic_id
      • FILE: app/models/review_response_map.rb
      • SOLUTION: Modify the existing method questionnaire(round) to also accept an optional argument topic_id
      • FILE: app/models/self_review_response_map.rb
      • SOLUTION: Modify the existing method review_questionnaire_id(round = nil) to also accept an optional argument topic_id
      • FILE: app/models/assignment.rb
  • Use the correct rubric for a particular topic
    • PROBLEM: When finding rubrics to display, save results from, calculate scores from, etc. round may be used but topic is not
      • SOLUTION: Examine all callers of methods modified in the previous section and pass in topic_id where appropriate to grab the correct rubric
      • FILE: (many)
  • Support the ability to determine if an assignment has rubrics that vary by topic
    • PROBLEM: There is no handy method to call that can tell us if an assignment has rubrics that vary by topic
      • SOLUTION: Add a new method varying_rubrics_by_topic? based on the existing method varying_rubrics_by_round?
      • FILE: app/models/assignment.rb

Q&A

Here we paraphrase some questions we received during round 1 of the documentation review.

  • Q: How will the new logic for varying rubric by topic tie in with the existing logic?
    • A: We will add a new field topic_id into the existing table assignment_questionnaires, as noted in the E/R Diagram. We will update methods that find questionnaires to allow these methods to also accept a topic_id argument, as noted in Implementation.
  • Q: How will the "Rubric varies by topic" selection be stored?
    • A: Indirectly, by saving records in the assignment_questionnaires table which either reference a topic_id or leave this field nil. For more details please see the E/R Diagram discussion.
  • Q: What will happen if an instructor selects "Rubric varies by topic", makes selections on the "Topics" tab, and then deselects "Rubric varies by topic"?
    • A: The Topics tab, when next visited, will no longer show dropdowns for selecting rubrics by topic. When the assignment is saved, the appropriate not-varying-by-topic records will be saved in the assignment_questionnaires table. For more details please see Implementation.
  • Q: What will happen after an instructor selects "Rubric varies by topic"?
    • A: The Topics tab, when next visited, will now show dropdowns for selecting rubrics by topic. These rubrics will default to those shown on the Rubrics tab. When the assignment is saved, the appropriate varying-by-topic records will be saved in the assignment_questionnaires table. For more details please see Implementation.
  • Q: How will the appropriate list of questionnaires for the new dropdowns on the Topics tab be determined?
    • A: In the same way that the appropriate list of questionnaires for the existing dropdowns on the Rubrics tab is determined. Namely, by the questionnaire_options method in the file expertiza/app/helpers/assignment_helper.rb.

(Selected) Modified Code

In this section, we provide selected portions of modified code to illustrate how we implemented the new feature.

Allow an instructor to indicate that rubric should vary by topic

app\views\assignments\edit\_rubrics.html.erb

  <input name="vary_by_topic" type="hidden" value="false" />
  <%= check_box_tag('vary_by_topic', 'true', @review_vary_by_topic_check) %>
  <%= label_tag('vary_by_topic', 'Review rubric varies by topic?') %>

Allow an instructor to choose different rubrics for different topics

app\views\sign_up_sheet\_table_line.html.erb

  <% if @assignment_form.assignment.varying_rubrics_by_topic? %>
    ...
    <td>
      <table id = <%=table_id %>>
        <tr>
          <script>
              ...
              <% if @assignment_form.assignment.varying_rubrics_by_round? %>
                <% for round in 1..@assignment_form.assignment.rounds_of_reviews %>
                  ...
                <% end %>
              <% else %>
                ...
              <% end %>
          </script>
        </tr>
      </table>
    </td>
  <% end %>

Support the ability of the database to link rubrics to topics

app\models\sign_up_topic.rb

  class SignUpTopic < ActiveRecord::Base
    ...
    has_many :assignment_questionnaires, class_name: 'AssignmentQuestionnaire', foreign_key: 'topic_id', dependent: :destroy
    ...
  end

React to an instructor saving an assignment after altering the rubrics-vary-by-topic checkbox

app/controllers/assignments_controller.rb

  def update
    ...
    # What to do next depends on how we got here
    if params['button'].nil?
      # REFRESH the topics tab after changing tabs
      ...
      render :partial => "assignments/edit/topics"
    else
      # SAVE button was used (do a redirect)
      redirect_to edit_assignment_path @assignment_form.assignment.id
    end
  end

Support the ability to find the correct rubric for a particular topic

app/helpers/assignment_helper.rb

  def assignment_questionnaire(assignment, questionnaire_type, round_number = nil, topic_id = nil)
    q_by_type = assignment.questionnaires.find_by(type: questionnaire_type)
    if q_by_type.nil?
      ...
    else
      ...
      aq_by_type = assignment.assignment_questionnaires.find_by(questionnaire_id: q_by_type.id)
      if round_number.nil? && topic_id.nil?
        # Find by type
        aq = aq_by_type
      elsif topic_id.nil?
        # Find by round
        aq = assignment.assignment_questionnaires.find_by(used_in_round: round_number)
      elsif round_number.nil?
        # Find by topic
        aq = assignment.assignment_questionnaires.find_by(topic_id: topic_id)
      else
        # Find by round and topic
        aq = assignment.assignment_questionnaires.where(used_in_round: round_number, topic_id: topic_id).first
      end
      aq.nil? ? aq_by_type : aq
    end
  end

Use the correct rubric for a particular topic

app\controllers\response_controller.rb

  def set_questionnaire_for_new_response
    case @map.type
    when "ReviewResponseMap", "SelfReviewResponseMap"
      reviewees_topic = SignedUpTeam.topic_id_by_team_id(@contributor.id)
      @current_round = @assignment.number_of_current_round(reviewees_topic)
      @questionnaire = @map.questionnaire(@current_round, reviewees_topic)
    when
      ...
    end
  end

Support the ability to determine if an assignment has rubrics that vary by topic

app\models\assignment.rb

  def varying_rubrics_by_topic?
    aq_no_topic_id = AssignmentQuestionnaire.where(assignment_id: self.id, topic_id: nil).size >= 1
    aq_with_topic_id = AssignmentQuestionnaire.where(assignment_id: self.id).where.not(topic_id: nil).size >= 1
    if !aq_no_topic_id && !aq_with_topic_id
      return false
    elsif aq_no_topic_id && !aq_with_topic_id
      return false
    elsif !aq_no_topic_id && aq_with_topic_id
      return true
    else
      raise StandardError.new("Assignment with id " + self.id.to_s + " has a conflict about whether or not it varies by topic")
    end
  end

List of Modified Files

In this section, we list all files that were modified while implementing the new feature.

  • [to be populated after coding is complete]

How To

In this section, we describe how to use the newly implemented feature.

Add a New Rubric

  • [to be populated after coding is complete]

Select a Rubric for a Topic

  • [to be populated after coding is complete]

Project Testing

Strategy

To test code implementation, correctness of the added feature, verify that the team did not break any existing functionalities in the Expertiza, and ensure that no bugs were introduced in the code, we developed the following Test Strategy:

  1. Code inspection
  2. Run and pass existing RSpec Tests
  3. Develop New RSpec Tests
  4. Run through live UI to test a feature using Expertiza instance

Rspec Testing

Existing Tests

Run all existing RSpec tests on any changed files, after our changes, to ensure that we have not introduced any failures. The commands and results are shown below.

  [to be populated after coding is complete]

New Tests

Write comprehensive RSpec tests, for all new or modified methods.

  • FILE: spec/helpers/assignment_helper_spec.rb
    • METHODS TO TEST:
      • questionnaire(assignment, type, round_number, topic_id)
      • assignment_questionnaire(assignment, type, number, topic_id)
  • FILE: spec/models/review_response_map_spec.rb
      • METHODS TO TEST:
        • questionnaire(round, topic_id)
  • FILE: spec/models/self_review_response_map_spec.rb
      • METHODS TO TEST:
        • questionnaire(round, topic_id)
  • FILE: spec/models/assignment_spec.rb
      • METHODS TO TEST:
        • review_questionnaire_id(round, topic_id)
        • varying_rubrics_by_topic?()

Run these tests, to ensure that the new code works as intended. The commands and results are shown below.

  [to be populated after coding is complete]

The test suite for a single new method is shown below.

  • There are many such suites added in expertiza/spec
  • This example illustrates our general strategy:
    • test missing input
    • test bad input
    • test various acceptable forms of input
    • test scenarios that lead to various return values
  describe "#questionnaire" do

    ...

    it "throws exception if assignment argument nil" do
      ...
    end

    it "throws exception if all arguments nil except for assignment" do
      ...
    end

    it "finds by type if round number & topic id not given" do
      ...
    end

    it "throws exception if round number & topic id not given, no luck finding by type" do
      ...
    end

    it "finds by round number alone if round number alone is given" do
      ...
    end

    it "creates new questionnaire of given type if round number alone is given, no luck finding by round" do
      ...
    end

    it "finds by topic id alone if topic id alone is given" do
      ...
    end

    it "creates new questionnaire of given type if topic id alone is given, no luck finding by topic" do
      ...
    end

    it "finds by round number and topic id if both are given" do
      ...
    end

    it "creates new questionnaire of given type if round and topic are given, no luck finding by round and topic" do
      ...
    end

  end

UI Testing

Here we describe manual UI Testing that was performed.

Rubric does not vary by round or by topic

[to be populated after coding is complete]

Rubric varies by round, but not by topic

[to be populated after coding is complete]

Rubric varies by topic, but not by round

[to be populated after coding is complete]

Rubric varies by both round and topic

[to be populated after coding is complete]

Conclusion

[to be populated after coding is complete]

Useful Links

In this section we provide useful links related to the work that has been completed by our team.

  1. Forked Project Repository
  2. [(add link here) Pull Request]
  3. [(add link here) Video Demonstration of Specialized Rubrics]
  4. [(add link here) Video Demonstration of Passing Rspec Tests]

Team

Contacts

We have 4 (four) members in our team and 1 (one) mentor was also assigned to us. For any project-related questions/concerns please contact us:

  • Aurora Tiffany-Davis - attiffan@ncsu.edu
  • Ginger Balmat - gabalmat@ncsu.edu
  • Joe Hutchinson - jehutch3@ncsu.edu
  • Nikolay Titov - ngtitov@ncsu.edu
  • Zhewei Hu (mentor) - zhu6@ncsu.edu

Contribution Based Inquiry

For any questions or concerns related to the project design, implementation, testing of the feature developed by our team, please contact an engineer who worked closely on the topic of your interest based on the Contribution Assignment Grid we created to keep track of our progress and contribution. Please carbon copy all team members and our mentor in the email.

References

  • Expertiza Web [1]
  • Expertiza on GitHub [2]
  • Expertiza Wiki [3]
  • Rspec Documentation [4]
  • Wiki with Previous Work [5]
  • Pull Request of the Previous Work [6]