<?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=Skandur</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=Skandur"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Skandur"/>
	<updated>2026-06-03T01:05:09Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1908_signupsheet&amp;diff=122601</id>
		<title>E1908 signupsheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1908_signupsheet&amp;diff=122601"/>
		<updated>2019-03-28T01:05:09Z</updated>

		<summary type="html">&lt;p&gt;Skandur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E1908. Refactoring the Sign-up sheet 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;
[http://expertiza.ncsu.edu/Expertiza] is an open source project dependent on [http://rubyonrails.org/Ruby on Rails] structure. Expertiza enables the teacher to make new assignments and alter new or existing assignments. It additionally enables the educator to make a rundown of subjects the students can agree to accept. Students can shape groups in Expertiza to chip away at different undertakings and projects. Students can likewise peer audit other students' entries. Expertiza underpins accommodation crosswise over different record types, including the URLs and wiki pages.&lt;br /&gt;
&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;
* Followed naming conventions throughout and renamed methods with inconsistent names including the calling methods.&lt;br /&gt;
* Rectified several unwanted if-else conditions in methods and optimized the code.&lt;br /&gt;
* Refactored all instance variables and removed unnecessarily defined variables.&lt;br /&gt;
* Removed certain unwanted flash messages that occur for some user actions.&lt;br /&gt;
* Included comments for functionalities throughout for better understanding.&lt;br /&gt;
&lt;br /&gt;
===About Sign-up sheet Controller===&lt;br /&gt;
Sign-up sheet controller contains all functions related to management of the signup sheet for an assignment function to add new topics to an assignment, edit properties of a particular topic, delete a topic, etc are included here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Issues and Fixes=====&lt;br /&gt;
&lt;br /&gt;
* '''Problem 1''': Create method has an if-else condition determining if create or update should be called. Create method should not be responsible for calling update. Identify why the if-else condition exists. The if-else condition exists because the current implementation calls update if a signup sheet with the same name already exists. &lt;br /&gt;
* '''Solution''': Rectified this method by removing the call to update and flashing an error instead.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 if topic.nil?&lt;br /&gt;
      setup_new_topic&lt;br /&gt;
    else&lt;br /&gt;
      # update_existing_topic topic&lt;br /&gt;
      # Create must not be used for calling update. So replaced it with an error message&lt;br /&gt;
      flash[:error] = &amp;quot;The topic already exists.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* '''Problem 2''': Update method has a plethora of instance variables defined before updating. These are not necessary (For e.g., look at update method of bookmarks_controller).&lt;br /&gt;
* '''Solution''': Refactored the variables not needed out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      update_max_choosers @topic&lt;br /&gt;
      # @topic.category = params[:topic][:category]&lt;br /&gt;
      # @topic.topic_name = params[:topic][:topic_name]&lt;br /&gt;
      # @topic.micropayment = params[:topic][:micropayment]&lt;br /&gt;
      # @topic.description = params[:topic][:description]&lt;br /&gt;
      # @topic.link = params[:topic][:link]&lt;br /&gt;
      # @topic.save&lt;br /&gt;
      # Replaced all the above unnecessary variables and save with a single update call for all the parameters&lt;br /&gt;
      @topic.update_attributes(topic_identifier: params[:topic][:topic_identifier], category: params[:topic][:category], topic_name: params[:topic][:topic_name], micropayment: params[:topic][:micropayment], description: params[:topic][:description], link: params[:topic][:link])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 3''': Destroy has a misleading else flash message.&lt;br /&gt;
* '''Solution''': Refactored the mislleading flash messages not needed out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   @topic.destroy&lt;br /&gt;
      undo_link(&amp;quot;The topic: \&amp;quot;#{@topic.topic_name}\&amp;quot; has been successfully deleted. &amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
      # Replaced this flash[:error] = &amp;quot;The topic could not be deleted.&amp;quot; with&lt;br /&gt;
      flash[:error] = &amp;quot;This topic could not be found.&amp;quot; # error message mage more specific&lt;br /&gt;
    end&lt;br /&gt;
    # changing the redirection url to topics tab in edit assignment view.&lt;br /&gt;
    redirect_to edit_assignment_path(params[:assignment_id]) + &amp;quot;#tabs-5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 4''': Add_signup_topics_staggered does not do anything.&lt;br /&gt;
* '''Solution''': Renamed participants variable to 'teams'.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # add_signup_topics_staggered calls add_signup_topics and does nothing else. So removed the following function.&lt;br /&gt;
 def add_signup_topics_staggered&lt;br /&gt;
    add_signup_topics &lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 5''': Several method names are renamed to be more intuitive.&lt;br /&gt;
* '''Solution''': load_add_signup_topics is renamed to get_assignment_data and ad_info is renamed to get_ad.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Contains links that let an admin or Instructor edit, delete, view enrolled/waitlisted members for each topic&lt;br /&gt;
  # Also contains links to delete topics and modify the deadlines for individual topics. Staggered means that different topics can have different deadlines.&lt;br /&gt;
  # def load_add_signup_topics(assignment_id)  previously&lt;br /&gt;
  def get_assignment_data(assignment_id)&lt;br /&gt;
    @id = assignment_id&lt;br /&gt;
    @sign_up_topics = SignUpTopic.where('assignment_id = ?', assignment_id)&lt;br /&gt;
    @slots_filled = SignUpTopic.find_slots_filled(assignment_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 6''': The list method is too long and is sparsely commented.&lt;br /&gt;
* '''Solution''': Added comments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  # function to list all topics and bids to a participant&lt;br /&gt;
  def list&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id].to_i)&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @slots_filled = SignUpTopic.find_slots_filled(@assignment.id)&lt;br /&gt;
    @slots_waitlisted = SignUpTopic.find_slots_waitlisted(@assignment.id)&lt;br /&gt;
    @show_actions = true&lt;br /&gt;
    @priority = 0&lt;br /&gt;
    @sign_up_topics = SignUpTopic.where(assignment_id: @assignment.id, private_to: nil)&lt;br /&gt;
    @max_team_size = @assignment.max_team_size&lt;br /&gt;
    team_id = @participant.team.try(:id)&lt;br /&gt;
&lt;br /&gt;
    # If the assignment supports bidding, add all the bids of an &lt;br /&gt;
    # individual or team to the list of signed topics&lt;br /&gt;
    if @assignment.is_intelligent&lt;br /&gt;
      @bids = team_id.nil? ? [] : Bid.where(team_id: team_id).order(:priority)&lt;br /&gt;
      signed_up_topics = []&lt;br /&gt;
      @bids.each do |bid|&lt;br /&gt;
        sign_up_topic = SignUpTopic.find_by(id: bid.topic_id)&lt;br /&gt;
        signed_up_topics &amp;lt;&amp;lt; sign_up_topic if sign_up_topic&lt;br /&gt;
      end&lt;br /&gt;
      signed_up_topics &amp;amp;= @sign_up_topics&lt;br /&gt;
      @sign_up_topics -= signed_up_topics&lt;br /&gt;
      @bids = signed_up_topics&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @num_of_topics = @sign_up_topics.size&lt;br /&gt;
    @signup_topic_deadline = @assignment.due_dates.find_by(deadline_type_id: 7)&lt;br /&gt;
    @drop_topic_deadline = @assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    @student_bids = team_id.nil? ? [] : Bid.where(team_id: team_id)&lt;br /&gt;
&lt;br /&gt;
    # Show selected topics only if the assignment's deadline hasn't passed&lt;br /&gt;
    unless @assignment.due_dates.find_by(deadline_type_id: 1).nil?&lt;br /&gt;
      @show_actions = false if !@assignment.staggered_deadline? and @assignment.due_dates.find_by(deadline_type_id: 1).due_at &amp;lt; Time.now&lt;br /&gt;
&lt;br /&gt;
      # Find whether the user has signed up for any topics; if so the user won't be able to&lt;br /&gt;
      # sign up again unless the former was a waitlisted topic&lt;br /&gt;
      # if team assignment, then team id needs to be passed as parameter else the user's id&lt;br /&gt;
      users_team = SignedUpTeam.find_team_users(@assignment.id, session[:user].id)&lt;br /&gt;
      @selected_topics = if users_team.empty?&lt;br /&gt;
                           nil&lt;br /&gt;
                         else&lt;br /&gt;
                           # TODO: fix this; cant use 0&lt;br /&gt;
                           SignedUpTeam.find_user_signup_topics(@assignment.id, users_team[0].t_id)&lt;br /&gt;
                         end&lt;br /&gt;
    end&lt;br /&gt;
    render 'sign_up_sheet/intelligent_topic_selection' and return if @assignment.is_intelligent&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 7''': What are the differences between signup_as_instructor and signup_as_instructor_action methods? Investigate if they are needed and improve the method names if both are needed. Provide comments as to what each method does.&lt;br /&gt;
* '''Solution''': signup_as_instructor  specifies the student and displays a new page called via a get request whereas signup_as_instructor_action is an action called via post request which aims to signup a student.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 8''': Participants variable in load_add_signup_topics actually means teams that signed up for a topic.&lt;br /&gt;
* '''Solution''': Renamed participants variable to 'teams'.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    # Though called participants, @participants are actually records in signed_up_teams table, which&lt;br /&gt;
    # is a mapping table between teams and topics (waitlisted recored are also counted)&lt;br /&gt;
    @participants = SignedUpTeam.find_team_participants(assignment_id, session[:ip])&lt;br /&gt;
    @teams = SignedUpTeam.find_team_participants(assignment_id, session[:ip])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 9''': Signup_as_instructor_action has if-else ladder. &lt;br /&gt;
* '''Solution''': It has been made more elegant using a helper function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def signup_student user&lt;br /&gt;
    if SignUpSheet.signup_team(params[:assignment_id], user.id, params[:topic_id])&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully signed up the student for the topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'Instructor signed up student for topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    else&lt;br /&gt;
      flash[:error] = &amp;quot;The student has already signed up for a topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'Instructor is signing up a student who already has a topic')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def signup_as_instructor_action&lt;br /&gt;
    user = User.find_by(name: params[:username])&lt;br /&gt;
    if user.nil? # validate invalid user&lt;br /&gt;
      flash[:error] = &amp;quot;That student does not exist!&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if !user.nil? and AssignmentParticipant.exists? user_id: user.id, parent_id: params[:assignment_id]&lt;br /&gt;
      signup_student(user);&lt;br /&gt;
    else&lt;br /&gt;
      flash[:error] = &amp;quot;The student is not registered for the assignment!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'The student is not registered for the assignment: ' &amp;lt;&amp;lt; user.id)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'assignments', action: 'edit', id: params[:assignment_id]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 10''': Delete_signup and delete_signup_as_instructor have much in common and violates the DRY principle. &lt;br /&gt;
* '''Solution''': Refactored them by moving the duplicate code to a helper function.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def can_delete_topic? is_instructor, participant, assignment, drop_topic_deadline&lt;br /&gt;
    submission_error_message = &amp;quot;&amp;quot;&lt;br /&gt;
    deadline_error_message = &amp;quot;&amp;quot;&lt;br /&gt;
    if is_instructor?&lt;br /&gt;
      submission_error_message = &amp;quot;The student has already submitted their work, so you are not allowed to remove them&amp;quot;&lt;br /&gt;
      deadline_error_message = &amp;quot;You cannot drop a student after the drop topic deadline!&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      submission_error_message = &amp;quot;You have already submitted your work, so you are not allowed to drop your topic.&amp;quot;&lt;br /&gt;
      deadline_error_message = &amp;quot;You cannot drop your topic after the drop topic deadline!&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if !participant.team.submitted_files.empty? or !participant.team.hyperlinks.empty?&lt;br /&gt;
      flash[:error] = submission_error_message&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Drop failed for already submitted work: ' + params[:topic_id].to_s)&lt;br /&gt;
      return false&lt;br /&gt;
    elsif !drop_topic_deadline.nil? and Time.now &amp;gt; drop_topic_deadline.due_at&lt;br /&gt;
      flash[:error] = deadline_error_message&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Drop failed for ended work: ' + params[:topic_id].to_s)&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # this function is used to delete a previous signup&lt;br /&gt;
  def delete_signup&lt;br /&gt;
    participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    assignment = participant.assignment&lt;br /&gt;
    drop_topic_deadline = assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    # A student who has already submitted work should not be allowed to drop his/her topic!&lt;br /&gt;
    # (A student/team has submitted if participant directory_num is non-null or submitted_hyperlinks is non-null.)&lt;br /&gt;
    # If there is no drop topic deadline, student can drop topic at any time (if all the submissions are deleted)&lt;br /&gt;
    # If there is a drop topic deadline, student cannot drop topic after this deadline.&lt;br /&gt;
    if can_delete_topic?(false, participant, assignment, drop_topic_deadline)&lt;br /&gt;
      delete_signup_for_topic(assignment.id, params[:topic_id], session[:user].id)&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully dropped your topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].id, 'Student has dropped the topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list', id: params[:id]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def delete_signup_as_instructor&lt;br /&gt;
    # find participant using assignment using team and topic ids&lt;br /&gt;
    team = Team.find(params[:id])&lt;br /&gt;
    assignment = Assignment.find(team.parent_id)&lt;br /&gt;
    user = TeamsUser.find_by(team_id: team.id).user&lt;br /&gt;
    participant = AssignmentParticipant.find_by(user_id: user.id, parent_id: assignment.id)&lt;br /&gt;
    drop_topic_deadline = assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    if can_delete_topic?(true, participant, assignment, drop_topic_deadline)&lt;br /&gt;
      delete_signup_for_topic(assignment.id, params[:topic_id], participant.user_id)&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully dropped the student from the topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Student has been dropped from the topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'assignments', action: 'edit', id: assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testing===&lt;br /&gt;
&lt;br /&gt;
As the project involved only refactoring variables and method names, only build tests and already existing unit tests were performed.&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#https://github.com/expertiza/expertiza&lt;br /&gt;
#http://expertiza.ncsu.edu/ The live Expertiza website&lt;/div&gt;</summary>
		<author><name>Skandur</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1908_signupsheet&amp;diff=122529</id>
		<title>E1908 signupsheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1908_signupsheet&amp;diff=122529"/>
		<updated>2019-03-26T16:42:42Z</updated>

		<summary type="html">&lt;p&gt;Skandur: /* Drawbacks and Solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E1908. Refactoring the Sign-up sheet 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;
[http://expertiza.ncsu.edu/Expertiza] is an open source project dependent on [http://rubyonrails.org/Ruby on Rails] structure. Expertiza enables the teacher to make new assignments and alter new or existing assignments. It additionally enables the educator to make a rundown of subjects the students can agree to accept. Students can shape groups in Expertiza to chip away at different undertakings and projects. Students can likewise peer audit other students' entries. Expertiza underpins accommodation crosswise over different record types, including the URLs and wiki pages.&lt;br /&gt;
&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;
* Followed naming conventions throughout and renamed methods with inconsistent names including the calling methods.&lt;br /&gt;
* Rectified several unwanted if-else conditions in methods and optimized the code.&lt;br /&gt;
* Refactored all instance variables and removed unnecessarily defined variables.&lt;br /&gt;
* Removed certain unwanted flash messages that occur for some user actions.&lt;br /&gt;
* Included comments for functionalities throughout for better understanding.&lt;br /&gt;
&lt;br /&gt;
===About Sign-up sheet Controller===&lt;br /&gt;
Sign-up sheet controller contains all functions related to management of the signup sheet for an assignment function to add new topics to an assignment, edit properties of a particular topic, delete a topic, etc are included here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Issues and Fixes=====&lt;br /&gt;
&lt;br /&gt;
* '''Problem 1''': Create method has an if-else condition determining if create or update should be called. Create method should not be responsible for calling update. Identify why the if-else condition exists. The if-else condition exists because the current implementation calls update if a signup sheet with the same name already exists. &lt;br /&gt;
* '''Solution''': Rectified this method by removing the call to update and flashing an error instead.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 if topic.nil?&lt;br /&gt;
      setup_new_topic&lt;br /&gt;
    else&lt;br /&gt;
      # update_existing_topic topic&lt;br /&gt;
      # Create must not be used for calling update. So replaced it with an error message&lt;br /&gt;
      flash[:error] = &amp;quot;The topic already exists.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* '''Problem 2''': Update method has a plethora of instance variables defined before updating. These are not necessary (For e.g., look at update method of bookmarks_controller).&lt;br /&gt;
* '''Solution''': Refactored the variables not needed out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      update_max_choosers @topic&lt;br /&gt;
      # @topic.category = params[:topic][:category]&lt;br /&gt;
      # @topic.topic_name = params[:topic][:topic_name]&lt;br /&gt;
      # @topic.micropayment = params[:topic][:micropayment]&lt;br /&gt;
      # @topic.description = params[:topic][:description]&lt;br /&gt;
      # @topic.link = params[:topic][:link]&lt;br /&gt;
      # @topic.save&lt;br /&gt;
      # Replaced all the above unnecessary variables and save with a single update call for all the parameters&lt;br /&gt;
      @topic.update_attributes(topic_identifier: params[:topic][:topic_identifier], category: params[:topic][:category], topic_name: params[:topic][:topic_name], micropayment: params[:topic][:micropayment], description: params[:topic][:description], link: params[:topic][:link])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 3''': Destroy has a misleading else flash message.&lt;br /&gt;
* '''Solution''': Refactored the mislleading flash messages not needed out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   @topic.destroy&lt;br /&gt;
      undo_link(&amp;quot;The topic: \&amp;quot;#{@topic.topic_name}\&amp;quot; has been successfully deleted. &amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
      # Replaced this flash[:error] = &amp;quot;The topic could not be deleted.&amp;quot; with&lt;br /&gt;
      flash[:error] = &amp;quot;This topic could not be found.&amp;quot; # error message mage more specific&lt;br /&gt;
    end&lt;br /&gt;
    # changing the redirection url to topics tab in edit assignment view.&lt;br /&gt;
    redirect_to edit_assignment_path(params[:assignment_id]) + &amp;quot;#tabs-5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 4''': Add_signup_topics_staggered does not do anything.&lt;br /&gt;
* '''Solution''': Renamed participants variable to 'teams'.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # add_signup_topics_staggered calls add_signup_topics and does nothing else. So removed the following function.&lt;br /&gt;
 def add_signup_topics_staggered&lt;br /&gt;
    add_signup_topics &lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 5''': Several method names are renamed to be more intuitive.&lt;br /&gt;
* '''Solution''': load_add_signup_topics is renamed to get_assignment_data and ad_info is renamed to get_ad.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Contains links that let an admin or Instructor edit, delete, view enrolled/waitlisted members for each topic&lt;br /&gt;
  # Also contains links to delete topics and modify the deadlines for individual topics. Staggered means that different topics can have different deadlines.&lt;br /&gt;
  # def load_add_signup_topics(assignment_id)  previously&lt;br /&gt;
  def get_assignment_data(assignment_id)&lt;br /&gt;
    @id = assignment_id&lt;br /&gt;
    @sign_up_topics = SignUpTopic.where('assignment_id = ?', assignment_id)&lt;br /&gt;
    @slots_filled = SignUpTopic.find_slots_filled(assignment_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 6''': The list method is too long and is sparsely commented.&lt;br /&gt;
* '''Solution''': Added comments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  # function to list all topics and bids to a participant&lt;br /&gt;
  def list&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id].to_i)&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @slots_filled = SignUpTopic.find_slots_filled(@assignment.id)&lt;br /&gt;
    @slots_waitlisted = SignUpTopic.find_slots_waitlisted(@assignment.id)&lt;br /&gt;
    @show_actions = true&lt;br /&gt;
    @priority = 0&lt;br /&gt;
    @sign_up_topics = SignUpTopic.where(assignment_id: @assignment.id, private_to: nil)&lt;br /&gt;
    @max_team_size = @assignment.max_team_size&lt;br /&gt;
    team_id = @participant.team.try(:id)&lt;br /&gt;
&lt;br /&gt;
    # If the assignment supports bidding, add all the bids of an &lt;br /&gt;
    # individual or team to the list of signed topics&lt;br /&gt;
    if @assignment.is_intelligent&lt;br /&gt;
      @bids = team_id.nil? ? [] : Bid.where(team_id: team_id).order(:priority)&lt;br /&gt;
      signed_up_topics = []&lt;br /&gt;
      @bids.each do |bid|&lt;br /&gt;
        sign_up_topic = SignUpTopic.find_by(id: bid.topic_id)&lt;br /&gt;
        signed_up_topics &amp;lt;&amp;lt; sign_up_topic if sign_up_topic&lt;br /&gt;
      end&lt;br /&gt;
      signed_up_topics &amp;amp;= @sign_up_topics&lt;br /&gt;
      @sign_up_topics -= signed_up_topics&lt;br /&gt;
      @bids = signed_up_topics&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @num_of_topics = @sign_up_topics.size&lt;br /&gt;
    @signup_topic_deadline = @assignment.due_dates.find_by(deadline_type_id: 7)&lt;br /&gt;
    @drop_topic_deadline = @assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    @student_bids = team_id.nil? ? [] : Bid.where(team_id: team_id)&lt;br /&gt;
&lt;br /&gt;
    # Show selected topics only if the assignment's deadline hasn't passed&lt;br /&gt;
    unless @assignment.due_dates.find_by(deadline_type_id: 1).nil?&lt;br /&gt;
      @show_actions = false if !@assignment.staggered_deadline? and @assignment.due_dates.find_by(deadline_type_id: 1).due_at &amp;lt; Time.now&lt;br /&gt;
&lt;br /&gt;
      # Find whether the user has signed up for any topics; if so the user won't be able to&lt;br /&gt;
      # sign up again unless the former was a waitlisted topic&lt;br /&gt;
      # if team assignment, then team id needs to be passed as parameter else the user's id&lt;br /&gt;
      users_team = SignedUpTeam.find_team_users(@assignment.id, session[:user].id)&lt;br /&gt;
      @selected_topics = if users_team.empty?&lt;br /&gt;
                           nil&lt;br /&gt;
                         else&lt;br /&gt;
                           # TODO: fix this; cant use 0&lt;br /&gt;
                           SignedUpTeam.find_user_signup_topics(@assignment.id, users_team[0].t_id)&lt;br /&gt;
                         end&lt;br /&gt;
    end&lt;br /&gt;
    render 'sign_up_sheet/intelligent_topic_selection' and return if @assignment.is_intelligent&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 7''': What are the differences between signup_as_instructor and signup_as_instructor_action methods? Investigate if they are needed and improve the method names if both are needed. Provide comments as to what each method does.&lt;br /&gt;
* '''Solution''': signup_as_instructor  specifies the student and displays a new page called via a get request whereas signup_as_instructor_action is an action called via post request which aims to signup a student.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 8''': Participants variable in load_add_signup_topics actually means teams that signed up for a topic.&lt;br /&gt;
* '''Solution''': Renamed participants variable to 'teams'.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    # Though called participants, @participants are actually records in signed_up_teams table, which&lt;br /&gt;
    # is a mapping table between teams and topics (waitlisted recored are also counted)&lt;br /&gt;
    @participants = SignedUpTeam.find_team_participants(assignment_id, session[:ip])&lt;br /&gt;
    @teams = SignedUpTeam.find_team_participants(assignment_id, session[:ip])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 9''': Signup_as_instructor_action has if-else ladder. &lt;br /&gt;
* '''Solution''': It has been made more elegant using a helper function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def signup_student user&lt;br /&gt;
    if SignUpSheet.signup_team(params[:assignment_id], user.id, params[:topic_id])&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully signed up the student for the topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'Instructor signed up student for topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    else&lt;br /&gt;
      flash[:error] = &amp;quot;The student has already signed up for a topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'Instructor is signing up a student who already has a topic')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def signup_as_instructor_action&lt;br /&gt;
    user = User.find_by(name: params[:username])&lt;br /&gt;
    if user.nil? # validate invalid user&lt;br /&gt;
      flash[:error] = &amp;quot;That student does not exist!&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if !user.nil? and AssignmentParticipant.exists? user_id: user.id, parent_id: params[:assignment_id]&lt;br /&gt;
      signup_student(user);&lt;br /&gt;
    else&lt;br /&gt;
      flash[:error] = &amp;quot;The student is not registered for the assignment!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'The student is not registered for the assignment: ' &amp;lt;&amp;lt; user.id)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'assignments', action: 'edit', id: params[:assignment_id]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 10''': Delete_signup and delete_signup_as_instructor have much in common and violates the DRY principle. &lt;br /&gt;
* '''Solution''': Refactored them by moving the duplicate code to a helper function.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def can_delete_topic? is_instructor, participant, assignment, drop_topic_deadline&lt;br /&gt;
    submission_error_message = &amp;quot;&amp;quot;&lt;br /&gt;
    deadline_error_message = &amp;quot;&amp;quot;&lt;br /&gt;
    if is_instructor?&lt;br /&gt;
      submission_error_message = &amp;quot;The student has already submitted their work, so you are not allowed to remove them&amp;quot;&lt;br /&gt;
      deadline_error_message = &amp;quot;You cannot drop a student after the drop topic deadline!&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      submission_error_message = &amp;quot;You have already submitted your work, so you are not allowed to drop your topic.&amp;quot;&lt;br /&gt;
      deadline_error_message = &amp;quot;You cannot drop your topic after the drop topic deadline!&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if !participant.team.submitted_files.empty? or !participant.team.hyperlinks.empty?&lt;br /&gt;
      flash[:error] = submission_error_message&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Drop failed for already submitted work: ' + params[:topic_id].to_s)&lt;br /&gt;
      return false&lt;br /&gt;
    elsif !drop_topic_deadline.nil? and Time.now &amp;gt; drop_topic_deadline.due_at&lt;br /&gt;
      flash[:error] = deadline_error_message&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Drop failed for ended work: ' + params[:topic_id].to_s)&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # this function is used to delete a previous signup&lt;br /&gt;
  def delete_signup&lt;br /&gt;
    participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    assignment = participant.assignment&lt;br /&gt;
    drop_topic_deadline = assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    # A student who has already submitted work should not be allowed to drop his/her topic!&lt;br /&gt;
    # (A student/team has submitted if participant directory_num is non-null or submitted_hyperlinks is non-null.)&lt;br /&gt;
    # If there is no drop topic deadline, student can drop topic at any time (if all the submissions are deleted)&lt;br /&gt;
    # If there is a drop topic deadline, student cannot drop topic after this deadline.&lt;br /&gt;
    if can_delete_topic?(false, participant, assignment, drop_topic_deadline)&lt;br /&gt;
      delete_signup_for_topic(assignment.id, params[:topic_id], session[:user].id)&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully dropped your topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].id, 'Student has dropped the topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list', id: params[:id]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def delete_signup_as_instructor&lt;br /&gt;
    # find participant using assignment using team and topic ids&lt;br /&gt;
    team = Team.find(params[:id])&lt;br /&gt;
    assignment = Assignment.find(team.parent_id)&lt;br /&gt;
    user = TeamsUser.find_by(team_id: team.id).user&lt;br /&gt;
    participant = AssignmentParticipant.find_by(user_id: user.id, parent_id: assignment.id)&lt;br /&gt;
    drop_topic_deadline = assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    if can_delete_topic?(true, participant, assignment, drop_topic_deadline)&lt;br /&gt;
      delete_signup_for_topic(assignment.id, params[:topic_id], participant.user_id)&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully dropped the student from the topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Student has been dropped from the topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'assignments', action: 'edit', id: assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#https://github.com/expertiza/expertiza&lt;br /&gt;
#http://expertiza.ncsu.edu/ The live Expertiza website&lt;/div&gt;</summary>
		<author><name>Skandur</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=E1908_signupsheet&amp;diff=122528</id>
		<title>E1908 signupsheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=E1908_signupsheet&amp;diff=122528"/>
		<updated>2019-03-26T16:41:37Z</updated>

		<summary type="html">&lt;p&gt;Skandur: /* Drawbacks and Solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==E1908. Refactoring the Sign-up sheet 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;
[http://expertiza.ncsu.edu/Expertiza] is an open source project dependent on [http://rubyonrails.org/Ruby on Rails] structure. Expertiza enables the teacher to make new assignments and alter new or existing assignments. It additionally enables the educator to make a rundown of subjects the students can agree to accept. Students can shape groups in Expertiza to chip away at different undertakings and projects. Students can likewise peer audit other students' entries. Expertiza underpins accommodation crosswise over different record types, including the URLs and wiki pages.&lt;br /&gt;
&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;
* Followed naming conventions throughout and renamed methods with inconsistent names including the calling methods.&lt;br /&gt;
* Rectified several unwanted if-else conditions in methods and optimized the code.&lt;br /&gt;
* Refactored all instance variables and removed unnecessarily defined variables.&lt;br /&gt;
* Removed certain unwanted flash messages that occur for some user actions.&lt;br /&gt;
* Included comments for functionalities throughout for better understanding.&lt;br /&gt;
&lt;br /&gt;
===About Sign-up sheet Controller===&lt;br /&gt;
Sign-up sheet controller contains all functions related to management of the signup sheet for an assignment function to add new topics to an assignment, edit properties of a particular topic, delete a topic, etc are included here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Drawbacks and Solutions=====&lt;br /&gt;
&lt;br /&gt;
* '''Problem 1''': Create method has an if-else condition determining if create or update should be called. Create method should not be responsible for calling update. Identify why the if-else condition exists. The if-else condition exists because the current implementation calls update if a signup sheet with the same name already exists. &lt;br /&gt;
* '''Solution''': Rectified this method by removing the call to update and flashing an error instead.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 if topic.nil?&lt;br /&gt;
      setup_new_topic&lt;br /&gt;
    else&lt;br /&gt;
      # update_existing_topic topic&lt;br /&gt;
      # Create must not be used for calling update. So replaced it with an error message&lt;br /&gt;
      flash[:error] = &amp;quot;The topic already exists.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* '''Problem 2''': Update method has a plethora of instance variables defined before updating. These are not necessary (For e.g., look at update method of bookmarks_controller).&lt;br /&gt;
* '''Solution''': Refactored the variables not needed out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      update_max_choosers @topic&lt;br /&gt;
      # @topic.category = params[:topic][:category]&lt;br /&gt;
      # @topic.topic_name = params[:topic][:topic_name]&lt;br /&gt;
      # @topic.micropayment = params[:topic][:micropayment]&lt;br /&gt;
      # @topic.description = params[:topic][:description]&lt;br /&gt;
      # @topic.link = params[:topic][:link]&lt;br /&gt;
      # @topic.save&lt;br /&gt;
      # Replaced all the above unnecessary variables and save with a single update call for all the parameters&lt;br /&gt;
      @topic.update_attributes(topic_identifier: params[:topic][:topic_identifier], category: params[:topic][:category], topic_name: params[:topic][:topic_name], micropayment: params[:topic][:micropayment], description: params[:topic][:description], link: params[:topic][:link])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 3''': Destroy has a misleading else flash message.&lt;br /&gt;
* '''Solution''': Refactored the mislleading flash messages not needed out.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   @topic.destroy&lt;br /&gt;
      undo_link(&amp;quot;The topic: \&amp;quot;#{@topic.topic_name}\&amp;quot; has been successfully deleted. &amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
      # Replaced this flash[:error] = &amp;quot;The topic could not be deleted.&amp;quot; with&lt;br /&gt;
      flash[:error] = &amp;quot;This topic could not be found.&amp;quot; # error message mage more specific&lt;br /&gt;
    end&lt;br /&gt;
    # changing the redirection url to topics tab in edit assignment view.&lt;br /&gt;
    redirect_to edit_assignment_path(params[:assignment_id]) + &amp;quot;#tabs-5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 4''': Add_signup_topics_staggered does not do anything.&lt;br /&gt;
* '''Solution''': Renamed participants variable to 'teams'.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 # add_signup_topics_staggered calls add_signup_topics and does nothing else. So removed the following function.&lt;br /&gt;
 def add_signup_topics_staggered&lt;br /&gt;
    add_signup_topics &lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 5''': Several method names are renamed to be more intuitive.&lt;br /&gt;
* '''Solution''': load_add_signup_topics is renamed to get_assignment_data and ad_info is renamed to get_ad.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  # Contains links that let an admin or Instructor edit, delete, view enrolled/waitlisted members for each topic&lt;br /&gt;
  # Also contains links to delete topics and modify the deadlines for individual topics. Staggered means that different topics can have different deadlines.&lt;br /&gt;
  # def load_add_signup_topics(assignment_id)  previously&lt;br /&gt;
  def get_assignment_data(assignment_id)&lt;br /&gt;
    @id = assignment_id&lt;br /&gt;
    @sign_up_topics = SignUpTopic.where('assignment_id = ?', assignment_id)&lt;br /&gt;
    @slots_filled = SignUpTopic.find_slots_filled(assignment_id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 6''': The list method is too long and is sparsely commented.&lt;br /&gt;
* '''Solution''': Added comments.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  # function to list all topics and bids to a participant&lt;br /&gt;
  def list&lt;br /&gt;
    @participant = AssignmentParticipant.find(params[:id].to_i)&lt;br /&gt;
    @assignment = @participant.assignment&lt;br /&gt;
    @slots_filled = SignUpTopic.find_slots_filled(@assignment.id)&lt;br /&gt;
    @slots_waitlisted = SignUpTopic.find_slots_waitlisted(@assignment.id)&lt;br /&gt;
    @show_actions = true&lt;br /&gt;
    @priority = 0&lt;br /&gt;
    @sign_up_topics = SignUpTopic.where(assignment_id: @assignment.id, private_to: nil)&lt;br /&gt;
    @max_team_size = @assignment.max_team_size&lt;br /&gt;
    team_id = @participant.team.try(:id)&lt;br /&gt;
&lt;br /&gt;
    # If the assignment supports bidding, add all the bids of an &lt;br /&gt;
    # individual or team to the list of signed topics&lt;br /&gt;
    if @assignment.is_intelligent&lt;br /&gt;
      @bids = team_id.nil? ? [] : Bid.where(team_id: team_id).order(:priority)&lt;br /&gt;
      signed_up_topics = []&lt;br /&gt;
      @bids.each do |bid|&lt;br /&gt;
        sign_up_topic = SignUpTopic.find_by(id: bid.topic_id)&lt;br /&gt;
        signed_up_topics &amp;lt;&amp;lt; sign_up_topic if sign_up_topic&lt;br /&gt;
      end&lt;br /&gt;
      signed_up_topics &amp;amp;= @sign_up_topics&lt;br /&gt;
      @sign_up_topics -= signed_up_topics&lt;br /&gt;
      @bids = signed_up_topics&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    @num_of_topics = @sign_up_topics.size&lt;br /&gt;
    @signup_topic_deadline = @assignment.due_dates.find_by(deadline_type_id: 7)&lt;br /&gt;
    @drop_topic_deadline = @assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    @student_bids = team_id.nil? ? [] : Bid.where(team_id: team_id)&lt;br /&gt;
&lt;br /&gt;
    # Show selected topics only if the assignment's deadline hasn't passed&lt;br /&gt;
    unless @assignment.due_dates.find_by(deadline_type_id: 1).nil?&lt;br /&gt;
      @show_actions = false if !@assignment.staggered_deadline? and @assignment.due_dates.find_by(deadline_type_id: 1).due_at &amp;lt; Time.now&lt;br /&gt;
&lt;br /&gt;
      # Find whether the user has signed up for any topics; if so the user won't be able to&lt;br /&gt;
      # sign up again unless the former was a waitlisted topic&lt;br /&gt;
      # if team assignment, then team id needs to be passed as parameter else the user's id&lt;br /&gt;
      users_team = SignedUpTeam.find_team_users(@assignment.id, session[:user].id)&lt;br /&gt;
      @selected_topics = if users_team.empty?&lt;br /&gt;
                           nil&lt;br /&gt;
                         else&lt;br /&gt;
                           # TODO: fix this; cant use 0&lt;br /&gt;
                           SignedUpTeam.find_user_signup_topics(@assignment.id, users_team[0].t_id)&lt;br /&gt;
                         end&lt;br /&gt;
    end&lt;br /&gt;
    render 'sign_up_sheet/intelligent_topic_selection' and return if @assignment.is_intelligent&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 7''': What are the differences between signup_as_instructor and signup_as_instructor_action methods? Investigate if they are needed and improve the method names if both are needed. Provide comments as to what each method does.&lt;br /&gt;
* '''Solution''': signup_as_instructor  specifies the student and displays a new page called via a get request whereas signup_as_instructor_action is an action called via post request which aims to signup a student.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Problem 8''': Participants variable in load_add_signup_topics actually means teams that signed up for a topic.&lt;br /&gt;
* '''Solution''': Renamed participants variable to 'teams'.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    # Though called participants, @participants are actually records in signed_up_teams table, which&lt;br /&gt;
    # is a mapping table between teams and topics (waitlisted recored are also counted)&lt;br /&gt;
    @participants = SignedUpTeam.find_team_participants(assignment_id, session[:ip])&lt;br /&gt;
    @teams = SignedUpTeam.find_team_participants(assignment_id, session[:ip])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 9''': Signup_as_instructor_action has if-else ladder. &lt;br /&gt;
* '''Solution''': It has been made more elegant using a helper function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def signup_student user&lt;br /&gt;
    if SignUpSheet.signup_team(params[:assignment_id], user.id, params[:topic_id])&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully signed up the student for the topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'Instructor signed up student for topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    else&lt;br /&gt;
      flash[:error] = &amp;quot;The student has already signed up for a topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'Instructor is signing up a student who already has a topic')&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def signup_as_instructor_action&lt;br /&gt;
    user = User.find_by(name: params[:username])&lt;br /&gt;
    if user.nil? # validate invalid user&lt;br /&gt;
      flash[:error] = &amp;quot;That student does not exist!&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if !user.nil? and AssignmentParticipant.exists? user_id: user.id, parent_id: params[:assignment_id]&lt;br /&gt;
      signup_student(user);&lt;br /&gt;
    else&lt;br /&gt;
      flash[:error] = &amp;quot;The student is not registered for the assignment!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, '', 'The student is not registered for the assignment: ' &amp;lt;&amp;lt; user.id)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'assignments', action: 'edit', id: params[:assignment_id]&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Problem 10''': Delete_signup and delete_signup_as_instructor have much in common and violates the DRY principle. &lt;br /&gt;
* '''Solution''': Refactored them by moving the duplicate code to a helper function.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  def can_delete_topic? is_instructor, participant, assignment, drop_topic_deadline&lt;br /&gt;
    submission_error_message = &amp;quot;&amp;quot;&lt;br /&gt;
    deadline_error_message = &amp;quot;&amp;quot;&lt;br /&gt;
    if is_instructor?&lt;br /&gt;
      submission_error_message = &amp;quot;The student has already submitted their work, so you are not allowed to remove them&amp;quot;&lt;br /&gt;
      deadline_error_message = &amp;quot;You cannot drop a student after the drop topic deadline!&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      submission_error_message = &amp;quot;You have already submitted your work, so you are not allowed to drop your topic.&amp;quot;&lt;br /&gt;
      deadline_error_message = &amp;quot;You cannot drop your topic after the drop topic deadline!&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if !participant.team.submitted_files.empty? or !participant.team.hyperlinks.empty?&lt;br /&gt;
      flash[:error] = submission_error_message&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Drop failed for already submitted work: ' + params[:topic_id].to_s)&lt;br /&gt;
      return false&lt;br /&gt;
    elsif !drop_topic_deadline.nil? and Time.now &amp;gt; drop_topic_deadline.due_at&lt;br /&gt;
      flash[:error] = deadline_error_message&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Drop failed for ended work: ' + params[:topic_id].to_s)&lt;br /&gt;
      return false&lt;br /&gt;
    end&lt;br /&gt;
    return true&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  # this function is used to delete a previous signup&lt;br /&gt;
  def delete_signup&lt;br /&gt;
    participant = AssignmentParticipant.find(params[:id])&lt;br /&gt;
    assignment = participant.assignment&lt;br /&gt;
    drop_topic_deadline = assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    # A student who has already submitted work should not be allowed to drop his/her topic!&lt;br /&gt;
    # (A student/team has submitted if participant directory_num is non-null or submitted_hyperlinks is non-null.)&lt;br /&gt;
    # If there is no drop topic deadline, student can drop topic at any time (if all the submissions are deleted)&lt;br /&gt;
    # If there is a drop topic deadline, student cannot drop topic after this deadline.&lt;br /&gt;
    if can_delete_topic?(false, participant, assignment, drop_topic_deadline)&lt;br /&gt;
      delete_signup_for_topic(assignment.id, params[:topic_id], session[:user].id)&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully dropped your topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.info LoggerMessage.new(controller_name, session[:user].id, 'Student has dropped the topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list', id: params[:id]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def delete_signup_as_instructor&lt;br /&gt;
    # find participant using assignment using team and topic ids&lt;br /&gt;
    team = Team.find(params[:id])&lt;br /&gt;
    assignment = Assignment.find(team.parent_id)&lt;br /&gt;
    user = TeamsUser.find_by(team_id: team.id).user&lt;br /&gt;
    participant = AssignmentParticipant.find_by(user_id: user.id, parent_id: assignment.id)&lt;br /&gt;
    drop_topic_deadline = assignment.due_dates.find_by(deadline_type_id: 6)&lt;br /&gt;
    if can_delete_topic?(true, participant, assignment, drop_topic_deadline)&lt;br /&gt;
      delete_signup_for_topic(assignment.id, params[:topic_id], participant.user_id)&lt;br /&gt;
      flash[:success] = &amp;quot;You have successfully dropped the student from the topic!&amp;quot;&lt;br /&gt;
      ExpertizaLogger.error LoggerMessage.new(controller_name, session[:user].id, 'Student has been dropped from the topic: ' + params[:topic_id].to_s)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to controller: 'assignments', action: 'edit', id: assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
#https://github.com/expertiza/expertiza&lt;br /&gt;
#http://expertiza.ncsu.edu/ The live Expertiza website&lt;/div&gt;</summary>
		<author><name>Skandur</name></author>
	</entry>
</feed>