CSC/ECE 517 Fall 2019 - E1938. OSS project Duke Blue: Fix import glitches
Issue #918
New code introduced is as follows.
File:app/helpers/import_topics_helper.rb
Code:
def self.define_attributes(row_hash)
attributes = {} if !row_hash[:description].nil? and !row_hash[:description].ascii_only? row_hash[:description] = self.trim_non_ascii(row_hash[:description]) puts row_hash[:description] end attributes["topic_identifier"] = row_hash[:topic_identifier].strip attributes["topic_name"] = row_hash[:topic_name].strip attributes["max_choosers"] = row_hash[:max_choosers].strip attributes end
def self.trim_non_ascii(string) string.split().each do |char| !char.ascii_only? ? string.tr!(char, ' ') : nil end string.gsub!(/\s+/, ' ') end
Issue #328
This was an issue to fix the functionality of Insert any new members into existing team. This was due to faulty handling of the option handle_dups and incorrect checking of parameters.
Code was modified to ensure minimal impact to existing testcases and functionalities.
Code:
name = handle_duplicate(team, name, id, options["handle_dups"], teamtype)
After fixing changes
Issue #329
This was a request to add an option to rename existing team if there was a conflict in the team name.
New code introduced was as follows:
In start.html.erb
<option value="rename_existing">rename the existing team and import</option>
In team.rb
# E1938: Added handling for renaming old team when conflict arises if handle_dups == "rename_existing" if teamtype.is_a?(CourseTeam.class) team.update(name: self.generate_team_name(Course.find(id).name)) elsif teamtype.is_a?(AssignmentTeam.class) team.update(name: self.generate_team_name(Assignment.find(id).name)) end return name end
The state of D before conflicting import:
After fixing changes
As you can see the new team got the name D and the old file got renamed to Team_17.
Issue #153
This was a new requirement to add an option to upload topics along with the teams assigned.
Expectations from the import file: Assigned team name should exist in the system, otherwise the import will fail. Instructor has to make sure that the teams which are assigned in the import file should exist with same names in the system or database.
Code Changes: import_file/_sign_up_topic.html.erb (All the select tags has been changed)
<select name="select1" id="select1" class="form-control" style="background-color:lightgrey"> <option value="topic_identifier">Topic Identifier (required)</option> <option value="topic_name">Topic Name (required)</option> <option value="max_choosers">Max Choosers (required)</option> <option value="category">Category (optional)</option> <option value="description">Description (optional)</option> <option value="link">Link (optional)</option> <option value="assigned_team">Assigned Team (optional)</option> </select>
model/sign_up_topic.rb
def self.import(row_hash, session, _id = nil)
if row_hash.length < 3
raise ArgumentError, "The CSV File expects the format: Topic identifier, Topic name, Max choosers, Topic Category (optional), Topic Description (Optional), Topic Link (optional), Assigned Team Name (optional)."
end
topic = SignUpTopic.where(topic_name: row_hash[:topic_name], assignment_id: session[:assignment_id]).first
if topic.nil?
attributes = ImportTopicsHelper.define_attributes(row_hash)
topic_new_id = ImportTopicsHelper.create_new_sign_up_topic(attributes, session)
unless row_hash[:assigned_team].nil?
team = Team.where(name: row_hash[:assigned_team]).first
ImportTopicsHelper.assign_team_topic(topic_new_id, team.id)
end
else
topic.max_choosers = row_hash[:max_choosers]
topic.topic_identifier = row_hash[:topic_identifier]
topic.save
unless row_hash[:assigned_team].nil?
team = Team.where(name: row_hash[:assigned_team]).first
newteam = SignedUpTeam.where(topic_id: topic.id, team_id: team.id).first
if newteam.nil?
ImportTopicsHelper.assign_team_topic(topic.id, team.id)
else
newteam.team_id = team.id
newteam.save
end
end
end
end
helpers/import_topics_helper.rb
def self.assign_team_topic(topic_id, assigned_team)
attributes = {}
attributes["topic_id"] = topic_id
attributes["team_id"] = assigned_team
assign_team = SignedUpTeam.new(attributes)
assign_team.save!
end
def self.create_new_sign_up_topic(attributes, session)
sign_up_topic = SignUpTopic.new(attributes)
sign_up_topic.assignment_id = session[:assignment_id]
sign_up_topic.save
# sign_up_topic
sign_up_topic.save!
sign_up_topic.id
end
controllers/import_file_controller.rb (Optional Count)
if (params[:assigned_team] == 'true')
@optional_count += 1
end
controllers/import_file_controller.rb (import_from_hash)
elsif params[:optional_count] == '4'
new_header = [params[:select1], params[:select2], params[:select3], params[:select4], params[:select5], params[:select6], params[:select7]]
@header_integrated_body = hash_rows_with_headers(new_header,contents_hash[:body])
views/sign_up_sheet/_add_topics.html.erb
<%= link_to 'Import topics',
{
:controller => 'import_file',
:action => 'start',
:model => 'SignUpTopic',
:id => params[:id],
:expected_fields => 'Topic Identifier' +
'  |  ' +
'Topic Name' +
'  |  ' +
'Max Choosers' +
'  |  ' +
'Topic Category (optional)' +
'  |  ' +
'Topic Description (optional)' +
'  |  ' +
'Topic Link (optional)' +
'  |  ' +
'Assigned Team (optional)'
An option column checkbox (Teams Assigned) has been added to the UI
A new column Assigned Team is added where the columns are being mapped.