diff --git a/app/assets/javascripts/org_courses.js.coffee b/app/assets/javascripts/org_courses.js.coffee
new file mode 100644
index 000000000..761567942
--- /dev/null
+++ b/app/assets/javascripts/org_courses.js.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
diff --git a/app/assets/stylesheets/org_courses.css.scss b/app/assets/stylesheets/org_courses.css.scss
new file mode 100644
index 000000000..026af5d01
--- /dev/null
+++ b/app/assets/stylesheets/org_courses.css.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the org_courses controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index 1a561006a..cd1de16fc 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -29,6 +29,30 @@ class CoursesController < ApplicationController
before_filter :require_login, :only => [:join, :unjoin]
#before_filter :allow_join, :only => [:join]
+ #查找组织
+ def search_public_orgs_not_in_course
+ condition = '%%'
+ if !params[:name].nil?
+ condition = "%#{params[:name].strip}%".gsub(" ","")
+ end
+ course_org_ids = OrgCourse.find_by_sql("select distinct organization_id from org_courses where course_id = #{params[:id]}").map(&:organization_id)
+ if course_org_ids.empty?
+ @orgs_not_in_course = Organization.where("(is_public or creator_id =?) and name like ?",User.current.id, condition).page((params[:page].to_i || 1)).per(10)
+ @org_count = Organization.where("is_public = 1 or creator_id =?", User.current.id).where("name like ?", condition).count
+ else
+ course_org_ids = "(" + course_org_ids.join(',') + ")"
+ @orgs_not_in_course = Organization.where("id not in #{course_org_ids} and (is_public = 1 or creator_id =?) and name like ?", User.current.id, condition).page((params[:page].to_i || 1)).per(10)
+ @org_count = Organization.where("id not in #{course_org_ids} and (is_public = 1 or creator_id =?)", User.current.id).where("name like ?", condition).count
+ end
+ # @course_count = Project.course_entities.visible.like(params[:name]).page(params[:page]).count
+ @orgs_page = Paginator.new @org_count, 10,params[:page]
+ @hint_flag = params[:hint_flag]
+ #render :json => {:orgs => @orgs_not_in_course, :count => @org_count}.to_json
+ respond_to do |format|
+ format.js
+ end
+ end
+
def join
if User.current.logged?
cs = CoursesService.new
diff --git a/app/controllers/exercise_controller.rb b/app/controllers/exercise_controller.rb
new file mode 100644
index 000000000..0a95fd025
--- /dev/null
+++ b/app/controllers/exercise_controller.rb
@@ -0,0 +1,641 @@
+class ExerciseController < ApplicationController
+ layout "base_courses"
+
+ before_filter :find_exercise_and_course, :only => [:create_exercise_question, :edit, :update, :show, :destroy, :commit_exercise, :commit_answer,:publish_exercise,:republish_exercise]
+ before_filter :find_course, :only => [:index,:new,:create,:student_exercise_list]
+ include ExerciseHelper
+
+ def index
+ if @course.is_public == 0 && !User.current.member_of_course?(@course)
+ render_403
+ return
+ end
+ remove_invalid_exercise(@course)
+ @is_teacher = User.current.allowed_to?(:as_teacher,@course)
+ if @is_teacher
+ exercises = @course.exercises.order("created_at asc")
+ else
+ exercises = @course.exercises.where(:exercise_status => 2).order("created_at asc")
+ end
+ @exercises = paginateHelper exercises,20 #分页
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ def show
+ unless User.current.member_of_course?(@course)
+ render_403
+ return
+ end
+ @exercise = Exercise.find params[:id]
+ @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
+ if @exercise.exercise_status != 2 && (!User.current.allowed_to?(:as_teacher,@course) || User.current.admin?)
+ render_403
+ return
+ end
+ exercise_end = Time.parse(format_time(@exercise.end_time)).strftime("%Y-%m-%d %H:%M:%S") > Time.now.strftime("%Y-%m-%d %H:%M:%S")
+ if @exercise.time == -1
+ @can_edit_excercise = exercise_end
+ else
+ @can_edit_excercise = (!has_commit_exercise?(@exercise.id,User.current.id)&& exercise_end) || User.current.admin?
+ end
+ @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
+ # 学生点击的时候即创建关联,自动保存
+ #eu = ExerciseUser.create(:user_id => User.current, :exercise_id => @exercise.id, :start_at => Time.now, :status => false)
+
+ # 已提交问卷的用户不能再访问该界面
+=begin
+ if has_commit_exercise?(@exercise.id, User.current.id) && (!User.current.admin?)
+ respond_to do |format|
+ format.html {render :layout => 'base_courses'}
+ end
+ else
+=end
+ if !@is_teacher && !has_click_exercise?(@exercise.id, User.current.id)
+ eu = ExerciseUser.create(:user_id => User.current.id, :exercise_id => @exercise.id, :start_at => Time.now, :status => false)
+ @exercise_user = ExerciseUser.where("user_id=? and exercise_id=?", User.current.id, @exercise.id).first
+ end
+ # @percent = get_percent(@exercise,User.current)
+ exercise_questions = @exercise.exercise_questions
+ @exercise_questions = paginateHelper exercise_questions,5 #分页
+ respond_to do |format|
+ format.html {render :layout => 'base_courses'}
+ end
+ #end
+ end
+
+ def new
+ option = {
+ :exercise_name => "",
+ :course_id => @course.id,
+ :exercise_status => 1,
+ :user_id => User.current.id,
+ :time => "",
+ :end_time => "",
+ :publish_time => "",
+ :exercise_description => "",
+ :show_result => 1
+ }
+ @exercise = Exercise.create option
+ if @exercise
+ redirect_to edit_exercise_url @exercise.id
+ end
+ end
+
+ def create
+ if params[:exercise]
+ exercise = Exercise.find(params[:exercise_id]) if params[:exercise_id]
+ exercise ||= Exercise.new
+ exercise.exercise_name = params[:exercise][:exercise_name]
+ exercise.exercise_description = params[:exercise][:exercise_description]
+ exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
+ exercise.publish_time = params[:exercise][:publish_time]
+ exercise.user_id = User.current.id
+ exercise.time = params[:exercise][:time]
+ exercise.course_id = params[:course_id]
+ exercise.exercise_status = 1
+ if exercise.save
+ @exercise = exercise
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+ end
+
+ def edit
+ respond_to do |format|
+ format.html{render :layout => 'base_courses'}
+ end
+ end
+
+ def update
+ @exercise.exercise_name = params[:exercise][:exercise_name]
+ @exercise.exercise_description = params[:exercise][:exercise_description]
+ @exercise.time = params[:exercise][:time].blank? ? -1 : params[:exercise][:time]
+ @exercise.end_time = Time.at(params[:exercise][:end_time].to_time.to_i + 16*60*60 -1)
+ @exercise.publish_time = params[:exercise][:publish_time]
+ @exercise.show_result = params[:exercise][:show_result].blank? ? 1 : params[:exercise][:show_result]
+ if @exercise.save
+ respond_to do |format|
+ format.js
+ end
+ else
+ render_404
+ end
+ end
+
+ def destroy
+ @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
+ if @exercise && @exercise.destroy
+ if @is_teacher
+ exercises = Exercise.where("course_id =?", @course.id)
+ else
+ exercises = Exercise.where("course_id =? and exercise_status =?", @course.id, 2)
+ end
+ @exercises = paginateHelper exercises,20 #分页
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+
+ # 统计结果
+ def statistics_result
+ @exercise = Exercise.find(params[:id])
+ exercise_questions = @exercise.exercise_questions
+ @exercise_questions = paginateHelper exercise_questions, 5
+ respond_to do |format|
+ format.html{render :layout => 'base_courses'}
+ end
+ end
+
+ # 添加题目
+ # question_type 1:单选 2:多选 3:填空题
+ def create_exercise_question
+ question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
+ option = {
+ :question_title => question_title,
+ :question_type => params[:question_type] || 1,
+ :question_number => params[:question_type] == "1"? @exercise.exercise_questions.where("question_type = 1").count + 1 :
+ (params[:question_type] == "2" ? (@exercise.exercise_questions.where("question_type = 2").count + 1) :
+ @exercise.exercise_questions.where("question_type = 3").count + 1),
+ :question_score => params[:question_score]
+ }
+ @exercise_questions = @exercise.exercise_questions.new option
+ # params[:question_answer] 题目选项
+ if params[:question_answer]
+ for i in 1..params[:question_answer].count
+ answer = (params[:question_answer].values[i-1].nil? || params[:question_answer].values[i-1].empty?) ? l(:label_new_answer) : params[:question_answer].values[i-1]
+ question_option = {
+ :choice_position => i,
+ :choice_text => answer
+ }
+ @exercise_questions.exercise_choices.new question_option
+ end
+ end
+ # 如果是插入的话,那么从插入的这个id以后的question_num都将要+1
+ if params[:quest_id]
+ @is_insert = true
+ if @exercise_questions.question_type == 1
+ ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number + 1")
+ #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
+ elsif @exercise_questions.question_type == 2
+ ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number + 1")
+ else
+ ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number + 1")
+ end
+ # @exercise_question_num = params[:quest_num].to_i
+ @exercise_questions.question_number = params[:quest_num].to_i + 1
+ end
+ if @exercise_questions.save
+ # params[:exercise_choice] 标准答案参数
+ # 问答题标准答案有三个,单独处理
+ if @exercise_questions.question_type == 3
+ for i in 1..params[:exercise_choice].count
+ standart_answer = ExerciseStandardAnswer.new
+ standart_answer.exercise_question_id = @exercise_questions.id
+ standart_answer.answer_text = params[:exercise_choice].values[i-1]
+ standart_answer.save
+ end
+ else
+ standart_answer = ExerciseStandardAnswer.new
+ standart_answer.exercise_question_id = @exercise_questions.id
+ if @exercise_questions.question_type == 1
+ standart_answer.exercise_choice_id = sigle_selection_standard_answer(params[:exercise_choice])
+ else
+ standart_answer.exercise_choice_id = multiselect_standard_answer(params[:exercise_choice])
+ end
+ standart_answer.save
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ end
+
+ # 修改题目
+ # params[:exercise_question] The id of exercise_question
+ # params[:question_answer] eg:A、B、C选项
+ def update_exercise_question
+ @exercise_question = ExerciseQuestion.find params[:exercise_question]
+ @exercise_question.question_title = params[:question_title].nil? || params[:question_title].empty? ? l(:label_enter_single_title) : params[:question_title]
+ @exercise_question.question_score = params[:question_score]
+ # 处理选项:如果选了某个选项,那么则要删除之前的选项
+ if params[:question_answer]
+ @exercise_question.exercise_choices.each do |answer|
+ answer.destroy unless params[:question_answer].keys.include? answer.id.to_s
+ end
+ for i in 1..params[:question_answer].count
+ question = @exercise_question.exercise_choices.find_by_id params[:question_answer].keys[i-1]
+ answer = (params[:question_answer].values[i-1].nil? || params[:question_answer].values[i-1].empty?) ? l(:label_new_answer) : params[:question_answer].values[i-1]
+ if question
+ question.choice_position = i
+ question.choice_text = answer
+ question.save
+ else
+ question_option = {
+ :choice_position => i,
+ :choice_text => answer
+ }
+ @exercise_question.exercise_choices.new question_option
+ end
+ end
+ end
+ # 更新标准答案
+ if params[:exercise_choice]
+ if @exercise_question.question_type == 3
+ # 删除不合理的选项
+ @exercise_question.exercise_standard_answers.each do |answer|
+ answer.destroy unless params[:exercise_choice].keys.include? answer.id.to_s
+ end
+ for i in 1..params[:exercise_choice].count
+ # 找到对应的标准答案
+ question_standart = @exercise_question.exercise_standard_answers.find_by_id params[:exercise_choice].keys[i-1]
+ # 标准答案值
+ answer_standart = (params[:exercise_choice].values[i-1].nil? || params[:exercise_choice].values[i-1].empty?) ? l(:label_new_answer) : params[:exercise_choice].values[i-1]
+ if question_standart
+ question_standart.answer_text = answer_standart
+ question_standart.save
+ else
+ standart_answer_option = {
+ :answer_text => answer_standart
+ }
+ @exercise_question.exercise_standard_answers.new standart_answer_option
+ end
+ end
+ else
+ answer_standart = @exercise_question.exercise_standard_answers.first
+ answer_standart.exercise_choice_id = @exercise_question.question_type == 1 ? sigle_selection_standard_answer(params[:exercise_choice]) : multiselect_standard_answer(params[:exercise_choice])
+ answer_standart.save
+ end
+ @exercise_question.save
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+
+ # 删除题目
+ def delete_exercise_question
+ @exercise_question = ExerciseQuestion.find params[:exercise_question]
+ @exercise = @exercise_question.exercise
+
+ if @exercise_question.question_type == 1
+ ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 1).update_all(" question_number = question_number - 1")
+ #@exercise.exercise_questions.where("question_number > #{params[:quest_num].to_i} and question_type == 1").update_all(" question_number = question_number + 1")
+ elsif @exercise_question.question_type == 2
+ ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 2).update_all(" question_number = question_number - 1")
+ else
+ ExerciseQuestion.where("question_number>? and question_type=?",params[:quest_num].to_i, 3).update_all(" question_number = question_number - 1")
+ end
+ # @exercise_question_num = params[:quest_num].to_i
+ # @exercise_questions.question_number = params[:quest_num].to_i - 1
+ #
+ # exercise_questions = @exercise.exercise_questions.where("question_number > #{@exercise_question.question_number}")
+ # exercise_questions.each do |question|
+ # question.question_number -= 1
+ # question.save
+ # end
+ if @exercise_question && @exercise_question.destroy
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+
+ # 发布试卷
+ def publish_exercise
+ @is_teacher = User.current.allowed_to?(:as_teacher,@course)
+ @index = params[:index]
+ @exercise.exercise_status = 2
+ @exercise.publish_time = Time.now
+ if @exercise.save
+ #redirect_to exercise_index_url(:course_id=> @course.id)
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+
+ # 重新发布试卷
+ # 重新发布的时候会删除所有的答题
+ def republish_exercise
+ @is_teacher = User.current.allowed_to?(:as_teacher,@course)
+ @index = params[:index]
+ @exercise.exercise_questions.each do |exercise_question|
+ exercise_question.exercise_answers.destroy_all
+ end
+ @exercise.exercise_users.destroy_all
+ @exercise.exercise_status = 1
+ @exercise.publish_time = nil
+ @exercise.save
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def student_exercise_list
+ @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
+ @exercise = Exercise.find params[:id]
+ @all_exercises = @course.exercises.where("exercise_status > 1").order("created_at desc")
+ @exercise_count = @exercise.exercise_users.where('score is not NULL').count
+ if @is_teacher || (!@exercise.exercise_users.where(:user_id => User.current.id).empty? && Time.parse(@exercise.end_time.to_s).strftime("%Y-%m-%d-%H-%M-%S") <= Time.now.strftime("%Y-%m-%d-%H-%M-%S"))
+ @exercise_users_list = @exercise.exercise_users.where('score is not NULL')
+ @show_all = true;
+ elsif !@exercise.exercise_users.where(:user_id => User.current.id).empty? && Time.parse(@exercise.end_time.to_s).strftime("%Y-%m-%d-%H-%M-%S") > Time.now.strftime("%Y-%m-%d-%H-%M-%S")
+ @exercise_users_list = @exercise.exercise_users.where("user_id = ? and score is not NULL",User.current.id)
+ else
+ @exercise_users_list = []
+ end
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ # 学生提交答卷,选中答案的过程中提交
+ def commit_answer
+ eq = ExerciseQuestion.find(params[:exercise_question_id])
+ # 已提交过的且是限时的则不允许答题
+ if (has_commit_exercise?(@exercise.id,User.current.id) && (!User.current.admin?) && @exercise.time != -1) || Time.parse(format_time(@exercise.end_time)).strftime("%Y-%m-%d %H:%M:%S") < Time.now.strftime("%Y-%m-%d %H:%M:%S")
+ render :json => {:text => "failure"}
+ return
+ end
+ if eq.question_type == 1
+ # 单选题
+ ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id],User.current.id)
+ if ea.nil?
+ # 尚未答该题,添加答案
+ ea = ExerciseAnswer.new
+ ea.user_id = User.current.id
+ ea.exercise_question_id = params[:exercise_question_id]
+ end
+ #修改该题对应答案
+ ea.exercise_choice_id = params[:exercise_choice_id]
+ if ea.save
+ # 保存成功返回成功信息及当前以答题百分比
+ uncomplete_question = get_uncomplete_question(@exercise, User.current)
+ if uncomplete_question.count < 1
+ complete = 1;
+ else
+ complete = 0;
+ end
+ @percent = get_percent(@exercise,User.current)
+ render :json => {:text => "ok" ,:complete => complete,:percent => format("%.2f" ,@percent)}
+ else
+ #返回失败信息
+ render :json => {:text => "failure"}
+ end
+ elsif eq.question_type == 2
+ #多选题
+ ea = ExerciseAnswer.find_by_exercise_choice_id_and_user_id(params[:exercise_choice_id],User.current.id)
+ if ea.nil?
+ #尚未答该题,添加答案
+ ea = ExerciseAnswer.new
+ ea.user_id = User.current.id
+ ea.exercise_question_id = params[:exercise_question_id]
+ ea.exercise_choice_id = params[:exercise_choice_id]
+ if ea.save
+ uncomplete_question = get_uncomplete_question(@exercise, User.current)
+ if uncomplete_question.count < 1
+ complete = 1;
+ else
+ complete = 0;
+ end
+ @percent = get_percent(@exercise,User.current)
+ render :json => {:text => "ok",:complete => complete,:percent => format("%.2f" ,@percent)}
+ else
+ render :json => {:text => "failure"}
+ end
+ else
+ #pv不为空,则当前选项之前已被选择,再次点击则是不再选择该项,故删除该答案
+ if ea.delete
+ @percent = get_percent(@exercise, User.current)
+ render :json => {:text => "false" ,:percent => format("%.2f" , @percent)}
+ else
+ render :json => {:text => "failure"}
+ end
+ end
+ elsif eq.question_type == 3
+ #单行文本,多行文本题
+ ea = ExerciseAnswer.find_by_exercise_question_id_and_user_id(params[:exercise_question_id], User.current.id)
+ if ea.nil?
+ # ea为空之前尚未答题,添加答案
+ if params[:answer_text].nil? || params[:answer_text].blank?
+ #用户提交空答案,视作不作答
+ @percent = get_percent(@exercise,User.current)
+ render :json => {:text => ea.answer_text,:percent => format("%.2f", @percent)}
+ else
+ #添加答案
+ ea = ExerciseAnswer.new
+ ea.user_id = User.current.id
+ ea.exercise_question_id = params[:exercise_question_id]
+ ea.answer_text = params[:answer_text]
+ if ea.save
+ uncomplete_question = get_uncomplete_question(@exercise, User.current)
+ if uncomplete_question.count < 1
+ complete = 1;
+ else
+ complete = 0;
+ end
+ @percent = get_percent(@exercise,User.current)
+ render :json => {:text => ea.answer_text,:complete => complete,:percent => format("%.2f",@percent)}
+ else
+ render :json => {:text => "failure"}
+ end
+ end
+ else
+ # ea不为空说明用户之前已作答
+ if params[:answer_text].nil? || params[:answer_text].blank?
+ # 用户提交空答案,视为删除答案
+ if ea.delete
+ @percent = get_percent(@exercise,User.current)
+ render :json => {:text => ea.answer_text,:percent => format("%.2f", @percent)}
+ else
+ render :json => {:text => "failure"}
+ end
+ else
+ #用户修改答案
+ ea.answer_text = params[:answer_text]
+ if ea.save
+ @percent = get_percent(@exercise,User.current)
+ render :json => {:text => pv.vote_text,:percent => format("%.2f", @percent)}
+ else
+ render :json => {:text => "failure"}
+ end
+ end
+ end
+
+ else
+ render :json => {:text => "failure"}
+ end
+ end
+
+ # 提交问卷
+ def commit_exercise
+ # 老师不需要提交
+ if User.current.allowed_to?(:as_teacher,@course)
+ if @exercise.publish_time.nil?
+ @exercise.update_attributes(:show_result => params[:show_result])
+ @exercise.update_attributes(:exercise_status => 2)
+ @exercise.update_attributes(:publish_time => Time.now)
+ redirect_to exercise_url(@exercise)
+ return
+ elsif Time.parse(@exercise.publish_time.to_s).strftime("%Y-%m-%d-%H-%M-%S") > Time.now.strftime("%Y-%m-%d-%H-%M-%S")
+ @exercise.update_attributes(:show_result => params[:show_result])
+ redirect_to exercise_url(@exercise)
+ return
+ end
+ @exercise.update_attributes(:show_result => params[:show_result])
+ redirect_to exercise_url(@exercise)
+ # REDO: 提示提交成功
+ else
+ # 更新提交状态
+ cur_exercise_user = ExerciseUser.where("user_id =? and exercise_id=?", User.current, @exercise.id).first
+ cur_exercise_user.update_attributes(:status => 1)
+ # 答题过程中需要统计完成量
+ @uncomplete_question = get_uncomplete_question(@exercise, User.current)
+ # 获取改学生的考试得分
+ @score = calculate_student_score(@exercise, User.current)
+ # @score = 100
+ if @uncomplete_question.count < 1
+ # 查看是否有已提交记录
+ eu = get_exercise_user(@exercise.id, User.current.id)
+ eu.user_id = User.current.id
+ eu.exercise_id = @exercise.id
+ eu.score = @score
+ if eu.save
+ #redirect_to poll_index_path(:polls_group_id => @course.id,:polls_type => 'Course')
+ @status = 0 #提交成功
+ else
+ @status = 2 #未知错误
+ end
+ else
+ @status = 1 #有未做得必答题
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+
+ # 计算学生得分
+ def calculate_student_score(exercise, user)
+ score = 0
+ score1 = 0
+ score2 = 0
+ score3 = 0
+ exercise_qustions = exercise.exercise_questions
+ exercise_qustions.each do |question|
+ answer = get_user_answer(question, user)
+ standard_answer = get_user_standard_answer(question, user)
+ unless answer.empty?
+ # 问答题有多个答案
+ if question.question_type == 3
+ if standard_answer.include?(answer.first.answer_text)
+ score1 = score1+ question.question_score unless question.question_score.nil?
+ end
+ elsif question.question_type == 1
+ if answer.first.exercise_choice.choice_position == standard_answer.exercise_choice_id
+ score2 = score2 + question.question_score unless question.question_score.nil?
+ end
+ else
+ arr = get_mulscore(question, user)
+ if arr.to_i == standard_answer.exercise_choice_id
+ score3 = score3 + question.question_score unless question.question_score.nil?
+ end
+ # ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id)
+ # arr = []
+ # ecs.each do |ec|
+ # arr << ec.exercise_choice.choice_position
+ # end
+ # arr.sort
+ # arr = arr.join("")
+ # if arr.to_i == standard_answer.exercise_choice_id
+ # score3 = score + question.question_score unless question.question_score.nil?
+ # end
+ end
+ end
+ end
+ score = score1 + score2 + score3
+ end
+
+ private
+
+ # ExerciseUser记录用户是否已提交问卷有对应的记录则已提交,没有则新建一个
+ def get_exercise_user exercise_id,user_id
+ eu = ExerciseUser.find_by_exercise_id_and_user_id(exercise_id,user_id)
+ if eu.nil?
+ eu = ExerciseUser.new
+ end
+ eu
+ end
+
+ # 获取当前学生回答问题的答案
+ def get_user_answer(question,user)
+ # user_answer = ExerciseAnswer.where("user_id=? and exercise_question_id=?", user.id, question.id).first
+ user_answer = question.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id}")
+ user_answer
+ end
+
+ # 获取问题的标准答案
+ def get_user_standard_answer(question,user)
+ if question.question_type == 3
+ standard_answer =[]
+ question.exercise_standard_answers.each do |answer|
+ standard_answer << answer.answer_text
+ end
+ else
+ standard_answer = question.exercise_standard_answers.first
+ end
+ standard_answer
+ end
+ # 是否完成了答题
+ def get_complete_question(exercise,user)
+ questions = exercise.exercise_questions
+ complete_question = []
+ questions.each do |question|
+ answers = get_user_answer(question,user)
+ if !(answers.nil? || answers.count < 1)
+ complete_question << question
+ end
+ end
+ complete_question
+ end
+
+ # 获取答题百分比
+ def get_percent exercise,user
+ complete_count = get_complete_question(exercise,user).count
+ if exercise.exercise_questions.count == 0
+ return 0
+ else
+ return (complete_count.to_f / exercise.exercise_questions.count.to_f)*100
+ end
+ end
+
+ def remove_invalid_exercise(course)
+ exercises = course.exercises.where("exercise_name=?","")
+ unless exercises.empty?
+ exercises.each do |exercise|
+ if exercise.exercise_questions.empty?
+ exercise.destroy
+ end
+ end
+ end
+ end
+
+ def find_exercise_and_course
+ @exercise = Exercise.find params[:id]
+ @course = Course.find @exercise.course_id
+ rescue Exception => e
+ render_404
+ end
+
+ def find_course
+ @course = Course.find params[:course_id]
+ rescue Exception => e
+ render_404
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb
index a2902e3fc..b15be4896 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -374,6 +374,9 @@ class FilesController < ApplicationController
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
Mailer.run.attachments_added(attachments[:files])
end
+ # 更新课程英雄榜得分
+ update_contributor_score(@course, attachments[:files].first)
+ # end
if params[:course_attachment_type] && params[:course_attachment_type].is_a?(Array)
params[:course_attachment_type].each do |type|
tag_name = get_tag_name_by_type_number type
@@ -423,6 +426,20 @@ class FilesController < ApplicationController
end
end
+ def update_contributor_score(course, file )
+ unless file.author.allowed_to?(:as_teacher, course)
+ course_contributor_score = CourseContributorScore.where("course_id =? and user_id =?", course.id, file.author.id).first
+ if course_contributor_score.nil?
+ CourseContributorScore.create(:course_id => course.id, :user_id => file.author.id, :message_num => 0, :message_reply_num => 0,
+ :news_reply_num => 0, :resource_num => 5, :journal_num => 0, :journal_reply_num => 0, :total_score => 5)
+ else
+ score = course_contributor_score.resource_num + 5
+ total_score = course_contributor_score.total_score + 5
+ course_contributor_score.update_attributes(:resource_num => score, :total_score => total_score)
+ end
+ end
+ end
+
def get_tag_name_by_type_number type
case type
when "1"
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index e529dd3b9..edf055370 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -20,11 +20,11 @@ class IssuesController < ApplicationController
default_search_scope :issues
before_filter :authorize1, :only => [:show]
- before_filter :find_issue, :only => [:show, :edit, :update,:add_journal]
+ before_filter :find_issue, :only => [:show, :edit, :update,:add_journal, :add_journal_in_org]
before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :destroy]
before_filter :find_project, :only => [:new, :create, :update_form]
#before_filter :authorize, :except => [:index, :show]
- before_filter :authorize, :except => [:index,:add_journal]
+ before_filter :authorize, :except => [:index,:add_journal, :add_journal_in_org]
before_filter :find_optional_project, :only => [:index]
before_filter :check_for_default_issue_status, :only => [:new, :create]
@@ -397,6 +397,23 @@ class IssuesController < ApplicationController
end
end
+ def add_journal_in_org
+ if User.current.logged?
+ jour = Journal.new
+ jour.user_id = User.current.id
+ jour.notes = params[:notes]
+ jour.journalized = @issue
+ jour.save
+ org_activity = OrgActivity.where("org_act_type='Issue' and org_act_id =#{@issue.id}").first
+ org_activity.updated_at = jour.created_on
+ org_activity.save
+ @user_activity_id = params[:user_activity_id]
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+
private
def find_project
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 4f78d61f5..9b090de9a 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -174,6 +174,11 @@ class MessagesController < ApplicationController
user_activity.updated_at = Time.now
user_activity.save
end
+ org_activity = OrgActivity.where("org_act_type='Message' and org_act_id =#{@topic.id}").first
+ if org_activity
+ org_activity.updated_at = Time.now
+ org_activity.save
+ end
#@topic.update_attribute(:updated_on, Time.now)
if !@reply.new_record?
if params[:asset_id]
diff --git a/app/controllers/org_courses_controller.rb b/app/controllers/org_courses_controller.rb
new file mode 100644
index 000000000..d054e41de
--- /dev/null
+++ b/app/controllers/org_courses_controller.rb
@@ -0,0 +1,20 @@
+class OrgCoursesController < ApplicationController
+ def create
+ org_ids = params[:orgNames]
+ @course = Course.find(params[:course_id])
+ org_ids.each do |org_id|
+ if OrgCourse.where("organization_id =? and course_id =?", org_id.to_i, params[:course_id].to_i).count == 0
+ OrgCourse.create(:organization_id => org_id.to_i, :course_id => params[:course_id].to_i, :created_at => Time.now)
+ end
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def destroy
+ @course = Course.find(params[:course_id])
+ @org_course = OrgCourse.find(params[:id])
+ @org_course.destroy
+ end
+end
diff --git a/app/controllers/org_document_comments_controller.rb b/app/controllers/org_document_comments_controller.rb
index 60522dc3f..02527bdfc 100644
--- a/app/controllers/org_document_comments_controller.rb
+++ b/app/controllers/org_document_comments_controller.rb
@@ -12,7 +12,7 @@ class OrgDocumentCommentsController < ApplicationController
@org_document_comment.title = params[:org_document_comment][:title]
@org_document_comment.content = params[:org_document_comment][:content]
if @org_document_comment.save
- #flash[:notice] = 'success'
+ flash.keep[:notice] = l(:notice_successful_create)
OrgActivity
redirect_to organization_org_document_comments_path(@organization)
else
@@ -20,33 +20,60 @@ class OrgDocumentCommentsController < ApplicationController
end
end
def show
-
+ @document = OrgDocumentComment.find(params[:id])
end
def index
- @documents = @organization.org_document_comments.where("parent_id is null").order("created_at desc")
+ if @organization.is_public? || User.current.admin? || User.current.member_of_org?(@organization)
+ @documents = @organization.org_document_comments.where("parent_id is null").order("created_at desc")
+ else
+ render_403
+ end
end
def update
@org_document = OrgDocumentComment.find(params[:id])
@org_document.update_attributes(:title => params[:org_document_comment][:title], :content => params[:org_document_comment][:content])
+ if @org_document.parent.nil?
+ act = OrgActivity.where("org_act_type='OrgDocumentComment' and org_act_id =?", @org_document.id).first
+ act.update_attributes(:updated_at => @org_document.updated_at)
+ end
respond_to do |format|
- format.html {redirect_to organization_org_document_comments_path(:organization_id => @org_document.organization.id)}
+ format.html {
+ if params[:flag].to_i == 0
+ redirect_to organization_org_document_comments_path(:organization_id => @org_document.organization.id)
+ else
+ redirect_to org_document_comment_path(@org_document.root.id, :organization_id => @org_document.organization.id)
+ end
+ }
end
end
def edit
@org_document = OrgDocumentComment.find(params[:id])
+ @flag = params[:flag]
@organization = Organization.find(params[:organization_id])
end
def add_reply
@document = OrgDocumentComment.find(params[:id]).root
+ @act = OrgActivity.find(params[:id])
@comment = OrgDocumentComment.new(:organization_id => @document.organization_id, :creator_id => User.current.id, :reply_id => params[:id])
@comment.content = params[:org_content]
@document.children << @comment
@document.save
end
+ def add_reply_in_doc
+ @document = OrgDocumentComment.find(params[:id]).root
+ @comment = OrgDocumentComment.new(:organization_id => @document.organization_id, :creator_id => User.current.id, :reply_id => params[:id])
+ @comment.content = params[:org_comment][:org_content]
+ @document.children << @comment
+ @document.save
+ respond_to do |format|
+ format.html {redirect_to org_document_comment_path(:id => @document.id, :organization_id => @document.organization_id)}
+ end
+ end
+
def find_organization
@organization = Organization.find(params[:organization_id])
end
@@ -59,5 +86,66 @@ class OrgDocumentCommentsController < ApplicationController
org.home_id == nil
end
end
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def delete_reply
+ @org_document_comment = OrgDocumentComment.find(params[:id])
+ @document = @org_document_comment.root
+ org = @org_document_comment.organization
+ @org_document_comment.destroy
+ respond_to do |format|
+ format.html {redirect_to org_document_comment_path(:id => @document.id, :organization_id => @document.organization_id)}
+ end
+ end
+ def quote
+ @org_comment = OrgDocumentComment.find(params[:id])
+ @subject = @org_comment.content
+ @subject = "RE: #{@subject}" unless @subject.starts_with?('RE:')
+
+ @content = "> #{ll(Setting.default_language, :text_user_wrote, User.find(@org_comment.creator_id).realname)}\n> "
+ @temp = OrgDocumentComment.new
+ #@course_id = params[:course_id]
+ @temp.content = "
#{ll(Setting.default_language, :text_user_wrote, User.find(@org_comment.creator_id).realname)} #{@org_comment.content.html_safe} ".html_safe
+ respond_to do | format|
+ format.js
+ end
+ end
+
+ def reply
+ @document = OrgDocumentComment.find(params[:id]).root
+ @quote = params[:quote][:quote]
+ @org_document = OrgDocumentComment.new(:creator_id => User.current.id, :reply_id => params[:id])
+
+ # params[:blog_comment][:sticky] = params[:blog_comment][:sticky] || 0
+ # params[:blog_comment][:locked] = params[:blog_comment][:locked] || 0
+ @org_document.title = params[:org_document_comment][:title]
+ @org_document.content = params[:org_document_comment][:content]
+ @org_document.content = @quote + @org_document.content
+ #@org_document.title = "RE: #{@article.title}" unless params[:blog_comment][:title]
+ @document.children << @org_document
+ # @user_activity_id = params[:user_activity_id]
+ # user_activity = UserActivity.where("act_type='BlogComment' and act_id =#{@article.id}").first
+ # if user_activity
+ # user_activity.updated_at = Time.now
+ # user_activity.save
+ # end
+ # attachments = Attachment.attach_files(@org_document, params[:attachments])
+ # render_attachment_warning_if_needed(@org_document)
+ #@article.save
+ # redirect_to user_blogs_path(:user_id=>params[:user_id])
+ respond_to do |format|
+ format.html {
+ # if params[:course_id] #如果呆了course_id过来了,那么这是要跳到课程大纲去的
+ # redirect_to syllabus_course_path(:id=>params[:course_id])
+ # else
+ redirect_to org_document_comment_path(:id => @document.id, :organization_id => @document.organization_id)
+ # end
+
+ }
+ format.js
+ end
end
end
diff --git a/app/controllers/org_projects_controller.rb b/app/controllers/org_projects_controller.rb
index 733df95b7..a455ce408 100644
--- a/app/controllers/org_projects_controller.rb
+++ b/app/controllers/org_projects_controller.rb
@@ -3,8 +3,9 @@ class OrgProjectsController < ApplicationController
org_ids = params[:orgNames]
@project = Project.find(params[:project_id])
org_ids.each do |org_id|
- OrgProject.create(:organization_id => org_id.to_i, :project_id => params[:project_id].to_i, :created_at => Time.now)
- p 1
+ if OrgProject.where("organization_id =? and project_id =?", org_id.to_i, @project.id).count == 0
+ OrgProject.create(:organization_id => org_id.to_i, :project_id => params[:project_id].to_i, :created_at => Time.now)
+ end
end
respond_to do |format|
format.js
@@ -14,18 +15,5 @@ class OrgProjectsController < ApplicationController
@project = Project.find(params[:project_id])
@org_project = OrgProject.find(params[:id])
@org_project.destroy
-
- condition = '%%'
- project_org_ids = OrgProject.find_by_sql("select distinct organization_id from org_projects where project_id = #{params[:project_id]}").map(&:organization_id)
- if project_org_ids.empty?
- @orgs_not_in_project = Organization.where("(is_public or creator_id =?) = 1 and name like ?",User.current.id, condition).page( 1).per(10)
- @org_count = Organization.where("is_public = 1 or creator_id =?", User.current.id).where("name like ?", condition).count
- else
- project_org_ids = "(" + project_org_ids.join(',') + ")"
- @orgs_not_in_project = Organization.where("id not in #{project_org_ids} and (is_public = 1 or creator_id =?) and name like ?", User.current.id, condition).page( 1).per(10)
- @org_count = Organization.where("id not in #{project_org_ids} and (is_public = 1 or creator_id =?)", User.current.id).where("name like ?", condition).count
- end
- # @project_count = Project.project_entities.visible.like(params[:name]).page(params[:page]).count
- @orgs_page = Paginator.new @org_count, 10,1
end
end
diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb
index 6a1030adc..b326051e6 100644
--- a/app/controllers/organizations_controller.rb
+++ b/app/controllers/organizations_controller.rb
@@ -56,13 +56,29 @@ class OrganizationsController < ApplicationController
if @organization.is_public? || User.current.admin? || User.current.member_of_org?(@organization)
@organization = Organization.find(params[:id])
project_ids = @organization.projects.map(&:id) << 0
- @org_activities = OrgActivity.where("(container_id =? and container_type =?) or (container_type ='Project' and container_id in (#{project_ids.join(',')}))",
- @organization.id, 'Organization').order('updated_at desc').page(params[:page] || 1).per(10)
- @org_activities_count = OrgActivity.where("(container_id =? and container_type =?) or (container_type ='Project' and container_id in (#{project_ids.join(',')}))" ,
- @organization.id, 'Organization ').count
- # @org_project_activties = ForgeActivity.where("project_id in (#{project_ids.join(',')}) and forge_act_type in('Issue','Message','ProjectCreateInfo')").order("updated_at desc").page(params[:page] || 1).per(10)
- # @org_project_activties_count = ForgeActivity.where('project_id in (?)',project_ids.join(',')).count
- #@org_activities = paginateHelper @org_activities, 10
+ course_ids = @organization.courses.map(&:id) << 0
+ course_types = "('Message','News','HomeworkCommon','Poll','Course')"
+ case params[:type]
+ when nil
+ @org_activities = OrgActivity.where("(container_id =? and container_type =?) " +
+ "or (container_type ='Project' and org_act_type in ('Issue','Message','ProjectCreateInfo') and container_id in (#{project_ids.join(',')})) "+
+ "or (container_type ='Course' and org_act_type in #{course_types} and container_id in (#{course_ids.join(',')}))",
+ @organization.id, 'Organization').order('updated_at desc').page(params[:page] || 1).per(10)
+ when 'project_issue'
+ @org_activities = OrgActivity.where("container_type = 'Project' and org_act_type = 'Issue' and container_id in (#{project_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
+ when 'project_message'
+ @org_activities = OrgActivity.where("container_type = 'Project' and org_act_type = 'Message' and container_id in (#{project_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
+ when 'org'
+ @org_activities = OrgActivity.where("container_id =? and container_type =?",@organization.id, 'Organization').order('updated_at desc').page(params[:page] || 1).per(10)
+ when 'course_homework'
+ @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'HomeworkCommon' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
+ when 'course_news'
+ @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'News' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
+ when 'course_message'
+ @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'Message' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
+ when 'course_poll'
+ @org_activities = OrgActivity.where("container_type = 'Course' and org_act_type = 'Poll' and container_id in (#{course_ids.join(',')})").order('updated_at desc').page(params[:page] || 1).per(10)
+ end
@page = params[:page]
respond_to do |format|
format.html
@@ -135,13 +151,100 @@ class OrganizationsController < ApplicationController
end
def members
- @members = OrgMember.where("organization_id =?", @organization.id)
+ if @organization.is_public? || User.current.admin? || User.current.member_of_org?(@organization)
+ @members = OrgMember.where("organization_id =?", @organization.id)
+ else
+ render_403
+ end
end
def more_org_projects
@organization = Organization.find params[:id]
@page = params[:page]
- @org_projects = @organization.org_projects.reorder('created_at').page((params[:page].to_i || 1) +1).per(5)
+ @org_projects = @organization.projects.reorder('created_at').uniq.page((params[:page].to_i || 1) +1).per(5)
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def more_org_courses
+ @organization = Organization.find(params[:id])
+ @page = params[:page]
+ @org_courses = @organization.courses.reorder('created_at').uniq.page((params[:page].to_i || 1) + 1 ).per(5)
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def join_course_menu
+ @organization = Organization.find(params[:id])
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def search_courses
+ @organization = Organization.find(params[:id])
+ condition = '%%'
+ if !params[:name].nil?
+ condition = "%#{params[:name].strip}%".gsub(" ","")
+ end
+ sql = "select courses.* from courses inner join members on courses.id = members.course_id where members.user_id = #{User.current.id} and courses.name like '#{condition}'"+
+ "and courses.id not in (select distinct org_courses.course_id from org_courses where org_courses.organization_id = #{@organization.id})"
+ #user_courses = Course.find_by_sql(sql)
+ @courses = Course.find_by_sql(sql)
+ # @added_course_ids = @organization.courses.map(&:id)
+ # @courses = []
+ # user_courses.each do |course|
+ # if !@added_course_ids.include?(course.id)
+ # @courses << course
+ # end
+ # end
+ end
+
+ def join_courses
+ @organization = Organization.find(params[:id])
+ course_ids = params[:courseNames]
+ course_ids.each do |id|
+ OrgCourse.create(:organization_id => @organization.id, :course_id => id.to_i, :created_at => Time.now)
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def join_project_menu
+ @organization = Organization.find(params[:id])
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ def search_projects
+ @organization = Organization.find(params[:id])
+ condition = '%%'
+ if !params[:name].nil?
+ condition = "%#{params[:name].strip}%".gsub(" ","")
+ end
+ sql = "select projects.* from projects inner join members on projects.id = members.project_id where members.user_id = #{User.current.id} and projects.status != 9 and projects.name like '#{condition}'" +
+ " and projects.id not in (select org_projects.project_id from org_projects where organization_id = #{@organization.id})"
+ #user_projects = Course.find_by_sql(sql)
+ @projects = Course.find_by_sql(sql)
+ # @added_course_ids = @organization.projects.map(&:id)
+ # @projects = []
+ # user_projects.each do |project|
+ # if !@added_course_ids.include?(project.id)
+ # @projects << project
+ # end
+ # end
+ end
+
+ def join_projects
+ @organization = Organization.find(params[:id])
+ project_ids = params[:projectNames]
+ project_ids.each do |id|
+ OrgProject.create(:organization_id => @organization.id, :project_id => id.to_i, :created_at => Time.now)
+ end
respond_to do |format|
format.js
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index baa7db060..715f56d3d 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -86,6 +86,7 @@ class ProjectsController < ApplicationController
end
# @project_count = Project.project_entities.visible.like(params[:name]).page(params[:page]).count
@orgs_page = Paginator.new @org_count, 10,params[:page]
+ @no_roll_hint = params[:hint_flag]
#render :json => {:orgs => @orgs_not_in_project, :count => @org_count}.to_json
respond_to do |format|
format.js
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index 1f252cc24..2bd54954a 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -34,7 +34,7 @@ class RepositoriesController < ApplicationController
before_filter :find_repository, :only => [:edit, :update, :destroy, :committers]
before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo,:to_gitlab]
before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue]
- before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab]
+ before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked]
accept_rss_auth :revisions
# hidden repositories filter // 隐藏代码过滤器
before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ]
@@ -42,7 +42,7 @@ class RepositoriesController < ApplicationController
include RepositoriesHelper
helper :project_score
#@root_path = RepositoriesHelper::ROOT_PATH
-
+ $g=Gitlab.client
rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed
def new
@@ -63,6 +63,78 @@ class RepositoriesController < ApplicationController
end
+ def forked
+ # 被forked的标识如果不满足单个用户唯一性,则不执行fork
+ if is_sigle_identifier?(User.current, @repository.identifier)
+ # REDO: 那些人有权限forked项目
+ g = Gitlab.client
+ gproject = g.post ("/projects/fork/#{@project.gpid}?user_id=#{User.current.gid}")
+ if gproject
+ copy_project(@project, gproject)
+ end
+ else
+ flash[:notice] = l(:project_gitlab_fork_double_message)
+ redirect_to settings_project_url(@project, :tab => 'repositories')
+ end
+ end
+
+ # copy a project for fork
+ def copy_project(project, gproject)
+ project = Project.new
+ project.name = @project.name
+ project.is_public = @project.is_public
+ project.status = @project.status
+ project.description = @project.description
+ project.hidden_repo = @project.hidden_repo
+ project.user_id = User.current.id
+ project.project_type = 0
+ project.project_new_type = @project.project_new_type
+ project.gpid = gproject.id
+ if project.save
+ r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
+ m = Member.new(:user => User.current, :roles => [r])
+ project_info = ProjectInfo.new(:user_id => User.current.id, :project_id => project.id)
+ user_grades = UserGrade.create(:user_id => User.current.id, :project_id => project.id)
+ Rails.logger.debug "UserGrade created: #{user_grades.to_json}"
+ project_status = ProjectStatus.create(:project_id => @project.id, :watchers_count => 0, :changesets_count => 0, :project_type => @project.project_type,:grade => 0)
+ Rails.logger.debug "ProjectStatus created: #{project_status.to_json}"
+ project.members << m
+ project.project_infos << project_info
+ copy_repository(project, gproject)
+ respond_to do |format|
+ format.html {
+ flash[:notice] = l(:notice_successful_create)
+ if params[:continue]
+ attrs = {:parent_id => project.parent_id}.reject {|k,v| v.nil?}
+ redirect_to new_project_url(attrs, :course => '0')
+ else
+ redirect_to settings_project_url(project)
+ end
+ }
+ format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'projects', :action => 'show', :id => project.id) }
+ format.js
+ end
+ else
+ respond_to do |format|
+ format.html { render :action => 'forked', :layout => 'base_projects'}
+ format.api { render_validation_errors(@project) }
+ end
+ end
+ end
+
+ def copy_repository(project, gproject)
+ # 避免
+ if is_sigle_identifier?(project.user_id, gproject.name)
+ repository = Repository.factory('Git')
+ repository.project_id = project.id
+ repository.type = 'Repository::Gitlab'
+ repository.url = gproject.name
+ repository.identifier = gproject.name
+ repository = repository.save
+ else
+ flash[:notice] = l(:project_gitlab_create_double_message)
+ end
+ end
def newrepo
scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first
@@ -115,21 +187,27 @@ update
}
def create
- attrs = pickup_extra_info
- @repository = Repository.factory('Git')
- @repository.safe_attributes = params[:repository]
- if attrs[:attrs_extra].keys.any?
- @repository.merge_extra_info(attrs[:attrs_extra])
- end
- @repository.project = @project
- @repository.type = 'Repository::Gitlab'
- @repository.url = @repository.identifier
- if request.post? && @repository.save
- s = Trustie::Gitlab::Sync.new
- s.create_project(@project, @repository)
+ # 判断版本库创建者是否有同名版本库,避免版本库路径一致问题
+ unless is_sigle_identifier?(@project.user_id, params[:repository].first[1])
+ flash[:notice] = l(:project_gitlab_create_double_message)
redirect_to settings_project_url(@project, :tab => 'repositories')
else
- redirect_to settings_project_url(@project, :tab => 'repositories',:repository_error_message=>@repository.errors.full_messages)
+ attrs = pickup_extra_info
+ @repository = Repository.factory('Git')
+ @repository.safe_attributes = params[:repository]
+ if attrs[:attrs_extra].keys.any?
+ @repository.merge_extra_info(attrs[:attrs_extra])
+ end
+ @repository.project = @project
+ @repository.type = 'Repository::Gitlab'
+ @repository.url = @repository.identifier
+ if request.post? && @repository.save
+ s = Trustie::Gitlab::Sync.new
+ s.create_project(@project, @repository)
+ redirect_to settings_project_url(@project, :tab => 'repositories')
+ else
+ redirect_to settings_project_url(@project, :tab => 'repositories',:repository_error_message=>@repository.errors.full_messages)
+ end
end
end
@@ -237,14 +315,34 @@ update
#Modified by young
# (show_error_not_found; return) unless @entries
g = Gitlab.client
- count = 0
- (0..100).each do |page|
- if g.commits(@project.gpid,:page => page).count == 0
- break
- else
- count = count + g.commits(@project.gpid,:page => page).count
- end
+
+ # count = 0
+ # (0..100).each do |page|
+ # if g.commits(@project.gpid,:page => page).count == 0
+ # break
+ # else
+ # count = count + g.commits(@project.gpid,:page => page).count
+ # end
+ # end
+
+
+ #add by hx
+ if g.commits(@project.gpid , :page=>25).count==0
+ count = count_commits(@project.gpid , 0 , 25)
+ elsif g.commits(@project.gpid , :page=>50).count ==0
+ count = count_commits(@project.gpid , 25 , 50)+ 25 * 20
+ elsif g.commits(@project.gpid , :page=>75).count ==0
+ count = count_commits(@project.gpid , 50 , 75)+ 50 * 20
+ elsif g.commits(@project.gpid , :page=>100).count== 0
+ count = count_commits(@project.gpid , 75 , 100) + 75 * 20
+ elsif g.commits(@project.gpid , :page=>125).count==0
+ count = count_commits(@project.gpid , 100 , 125) + 100 * 20
+ elsif g.commits(@project.gpid , :page=>150).count==0
+ count = count_commits(@project.gpid , 125 , 150) + 125 * 20
+ else
+ count = count_commits(@project.gpid , 150 ,200) + 150 * 20
end
+
@changesets = g.commits(@project.gpid)
# @changesets = @repository.latest_changesets(@path, @rev)
# @changesets_count = @repository.latest_changesets(@path, @rev).count
@@ -271,11 +369,30 @@ update
alias_method :browse, :show
+ #add by hx
+ def count_commits(project_id , left , right)
+ count = 0
+ (left..right).each do |page|
+ if $g.commits(project_id,:page => page).count == 0
+ break
+ else
+ count = count + $g.commits(project_id,:page => page).count
+ end
+ end
+ return count
+ end
+
def changes
@entry = @repository.entry(@path, @rev)
(show_error_not_found; return) unless @entry
g = Gitlab.client
- @commits = g.commits(@project.gpid, page:params[:pamge])
+ limit = 20
+ #每次页面的换回值从1开始,但是gitlab的页面查询是从0开始,所以先改变page的类型减一在改回来
+ @commits = g.commits(@project.gpid, page:(params[:page].to_i - 1).to_s)
+ #页面传递必须要str类型,但是Paginator的初始化必须要num类型,需要类型转化
+ @commits_count = params[:commit_count].to_i
+ @commits_pages = Redmine::Pagination::Paginator.new @commits_count,limit,params[:page]
+
@commit = g.commit(@project.gpid,@rev)
# @changesets = g.get ("/projects/#{@project.gpid}/repository/commits?#{@rev}")
#@changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
@@ -284,6 +401,7 @@ update
render :layout => 'base_projects'
end
+
def revisions
@changeset_count = @repository.changesets.count
@changeset_pages = Paginator.new @changeset_count,
@@ -467,8 +585,8 @@ update
def find_repository
@repository = Repository.find(params[:id])
@project = @repository.project
- rescue ActiveRecord::RecordNotFound
- render_404
+ rescue ActiveRecord::RecordNotFound
+ render_404
end
REV_PARAM_RE = %r{\A[a-f0-9]*\Z}i
diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb
index 9ad46cd69..d2aba1386 100644
--- a/app/controllers/student_work_controller.rb
+++ b/app/controllers/student_work_controller.rb
@@ -76,7 +76,7 @@ class StudentWorkController < ApplicationController
end
##################################################################################################################
@order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name] || "",params[:group]
- @homework_commons = @course.homework_commons.order("created_at desc")
+ @homework_commons = @course.homework_commons.where("publish_time <= ?",Time.now.strftime("%Y-%m-%d")).order("created_at desc")
@is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
@is_evaluation = @homework.homework_detail_manual && @homework.homework_detail_manual.comment_status == 2 && !@is_teacher #是不是匿评
@show_all = false
@@ -167,6 +167,18 @@ class StudentWorkController < ApplicationController
end
def create
+ # 提交作品前先判断是否已经提交
+ @has_commit = false;
+ if hsd_committed_work?(User.current.id, @homework.id)
+ @work = StudentWork.where("user_id =? and homework_common_id =?", User.current.id, @homework.id).first
+ @has_commit = true;
+ #flash[:notice] = l(:notice_successful_create)
+ #redirect_to edit_student_work_url(params[:student_work])
+ respond_to do |format|
+ format.js
+ end
+ return
+ end
if params[:student_work]
@submit_result = true
student_work = StudentWork.find(params[:student_work_id]) if params[:student_work_id]
@@ -499,6 +511,12 @@ class StudentWorkController < ApplicationController
end
private
+ def hsd_committed_work?(user, homework)
+ sw = StudentWork.where("user_id =? and homework_common_id =?", user, homework).first
+ sw.nil? ? result = false : result = true
+ result
+ end
+
#获取作业
def find_homework
@homework = HomeworkCommon.find params[:homework]
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 15e29f39c..cbc646eac 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -75,6 +75,50 @@ module ApplicationHelper
end
end
+ # 更新课程英雄榜得分
+ # user传过来必须是学生
+ def course_member_score(course_id,user_id,type)
+ course_contributor_score = CourseContributorScore.where("course_id =? and user_id =?", course_id, user_id).first
+ case type
+ when "JournalForMessage"
+ if course_contributor_score.nil?
+ CourseContributorScore.create(:course_id => course_id, :user_id => user_id, :message_num => 0, :message_reply_num => 0,
+ :news_reply_num => 0, :resource_num => 0, :journal_num => 1, :journal_reply_num => 0, :total_score => 1)
+ else
+ score = course_contributor_score.journal_num + 1
+ total_score = course_contributor_score.total_score + 1
+ course_contributor_score.update_attributes(:journal_num => score, :total_score => total_score)
+ end
+ when "Message"
+ if course_contributor_score.nil?
+ CourseContributorScore.create(:course_id => course_id, :user_id => user_id, :message_num => 2, :message_reply_num => 0,
+ :news_reply_num => 0, :resource_num => 0, :journal_num => 0, :journal_reply_num => 0, :total_score => 2)
+ else
+ score = course_contributor_score.message_num + 2
+ total_score = course_contributor_score.total_score + 2
+ course_contributor_score.update_attributes(:message_num => score, :total_score => total_score)
+ end
+ when "MessageReply"
+ if course_contributor_score.nil?
+ CourseContributorScore.create(:course_id => course_id, :user_id => user_id, :message_num => 0, :message_reply_num => 1,
+ :news_reply_num => 0, :resource_num => 0, :journal_num => 0, :journal_reply_num => 0, :total_score => 1)
+ else
+ score = course_contributor_score.message_reply_num + 1
+ total_score = course_contributor_score.total_score + 1
+ course_contributor_score.update_attributes(:message_reply_num => score, :total_score => total_score)
+ end
+ when "NewReply"
+ if course_contributor_score.nil?
+ CourseContributorScore.create(:course_id => course_id, :user_id => user_id, :message_num => 0, :message_reply_num => 0,
+ :news_reply_num => 1, :resource_num => 0, :journal_num => 0, :journal_reply_num => 0, :total_score => 1)
+ else
+ score = course_contributor_score.news_reply_num + 1
+ total_score = course_contributor_score.total_score + 1
+ course_contributor_score.update_attributes(:news_reply_num => score, :total_score => total_score)
+ end
+ end
+ end
+
# Added by young
# Define the course menu's link class
# 不是数组的转化成数组,然后判断当前menu_item是否在给定的列表
diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb
index caca6fb1e..a1b119cb5 100644
--- a/app/helpers/courses_helper.rb
+++ b/app/helpers/courses_helper.rb
@@ -25,6 +25,10 @@ module CoursesHelper
# searchTeacherAndAssistant(project).count
end
+ def show_nav?(count)
+ count == 0 ? true : false
+ end
+
#课程模块需要展示的模块
def course_model
@nav_dispaly_course_all_label = 1
@@ -733,4 +737,26 @@ module CoursesHelper
end
desc.html_safe
end
+
+ # 学生按作业总分排序,取前8个
+ def hero_homework_score(course, score_sort_by)
+ sql_select = "SELECT members.*,(
+ SELECT SUM(student_works.final_score)
+ FROM student_works,homework_commons
+ WHERE student_works.homework_common_id = homework_commons.id
+ AND homework_commons.course_id = #{course.id}
+ AND student_works.user_id = members.user_id
+ ) AS score
+ FROM members
+ JOIN students_for_courses
+ ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
+ WHERE members.course_id = #{course.id} ORDER BY score #{score_sort_by} limit 9"
+ homework_scores = Member.find_by_sql(sql_select)
+ end
+
+ def contributor_course_scor(course_id)
+ ccs = CourseContributorScore.where("course_id =?", course_id).order("total_score desc") .limit(9)
+ end
+
end
+
diff --git a/app/helpers/exercise_helper.rb b/app/helpers/exercise_helper.rb
new file mode 100644
index 000000000..b0d0118e5
--- /dev/null
+++ b/app/helpers/exercise_helper.rb
@@ -0,0 +1,152 @@
+# encoding: utf-8
+module ExerciseHelper
+
+ # 单选
+ def sigle_selection_standard_answer(params)
+ size = params.ord - 96
+ if size > 0 # 小写字母答案
+ answer = params.ord - 96
+ else
+ answer = params.ord - 64
+ end
+ end
+
+ # 多选
+ def multiselect_standard_answer(params)
+ size = params.ord - 96
+ answer = []
+ if size > 0 # 小写字母答案
+ for i in 0..(params.length-1)
+ answer << (params[i].ord - 96).to_s
+ end
+ else
+ for i in 0..(params.length-1)
+ answer << (params[i].ord - 64)
+ end
+ end
+ answer = answer.sort
+ answer.join("")
+ end
+
+ #
+ def fill_standart_answer(params, standart_answer)
+ params.each do |param|
+ standart_answer.answer_text = param.value
+ standart_answer.save
+ end
+ end
+
+ # 获取多选的得分
+ def get_mulscore(question, user)
+ ecs = ExerciseAnswer.where("user_id =? and exercise_question_id =?", user.id, question.id)
+ arr = []
+ ecs.each do |ec|
+ arr << ec.exercise_choice.choice_position
+ end
+ arr.sort
+ arr = arr.join("")
+ end
+
+ # 判断用户是否已经提交了问卷
+ # status 为0的时候是用户点击试卷。为1表示用户已经提交
+ def has_commit_exercise?(exercise_id, user_id)
+ pu = ExerciseUser.where("exercise_id=? and user_id=? and status=?",exercise_id, user_id, true)
+ if pu.empty?
+ false
+ else
+ true
+ end
+ end
+
+ # 判断学生是否点击过问卷,点击则为他保存一个记录,记录start_at
+ def has_click_exercise?(exercise_id, user_id)
+ pu = ExerciseUser.where("exercise_id=? and user_id=? and status=?",exercise_id, user_id, false)
+ if pu.empty?
+ false
+ else
+ true
+ end
+ end
+
+ def convert_to_char(str)
+ result = ""
+ length = str.length
+ unless str.nil?
+ if length === 1
+ result += (str.to_i + 64).chr
+ return result
+ elsif length > 1
+ for i in 0...length
+ result += (str[i].to_i + 64).chr
+ end
+ return result
+ end
+ end
+ return result
+ end
+
+ def get_current_score exercise
+ score = 0
+ unless exercise.nil?
+ exercise.exercise_questions.each do |exercise_question|
+ unless exercise_question.question_score.nil?
+ score += exercise_question.question_score
+ end
+ end
+ return score
+ end
+ return score
+ end
+
+ def answer_be_selected?(answer,user)
+ pv = answer.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id} ")
+ if !pv.nil? && pv.count > 0
+ true
+ else
+ false
+ end
+ end
+
+ #获取未完成的题目
+ def get_uncomplete_question exercise,user
+ all_questions = exercise.exercise_questions
+ uncomplete_question = []
+ all_questions.each do |question|
+ answers = get_user_answer(question, user)
+ if answers.empty?
+ uncomplete_question << question
+ end
+ end
+ uncomplete_question
+ end
+
+ #获取文本题答案
+ def get_anwser_vote_text(question_id,user_id)
+ pv = ExerciseAnswer.find_by_exercise_question_id_and_user_id(question_id,user_id)
+ if pv.nil?
+ ''
+ else
+ pv.answer_text
+ end
+ end
+
+ # 获取当前学生回答问题的答案
+ def get_user_answer(question,user)
+ user_answer = question.exercise_answers.where("#{ExerciseAnswer.table_name}.user_id = #{user.id}")
+ user_answer
+ end
+
+ # 获取问题的标准答案
+ def get_user_standard_answer(question,user)
+ if question.question_type == 3
+ standard_answer =[]
+ question.exercise_standard_answers.each do |answer|
+ standard_answer << answer.answer_text
+ end
+ else
+ standard_answer = question.exercise_standard_answers
+ end
+ standard_answer
+ end
+
+end
\ No newline at end of file
diff --git a/app/helpers/org_courses_helper.rb b/app/helpers/org_courses_helper.rb
new file mode 100644
index 000000000..28655e52e
--- /dev/null
+++ b/app/helpers/org_courses_helper.rb
@@ -0,0 +1,2 @@
+module OrgCoursesHelper
+end
diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb
index f32bef51b..ff4aa61fb 100644
--- a/app/helpers/repositories_helper.rb
+++ b/app/helpers/repositories_helper.rb
@@ -27,6 +27,20 @@ module RepositoriesHelper
REPO_IP_ADDRESS = Setting.host_repository
REPO_GITLAB_ADDRESS = "git.trustie.net"
+ # 某个成员不能拥有同名版本库,不同的成员可以创建同名版本库
+ def is_sigle_identifier?(user_id, iden)
+ projects = Project.where("user_id =?",user_id)
+ identifiers = []
+ projects.each do |project|
+ # 只针对gitlab类型的,git类型的后期清掉
+ repository = Repository.where("project_id =? and type =?", project.id, "Repository::Gitlab").first
+ if repository
+ identifiers << repository.identifier
+ end
+ end
+ identifiers.include?(iden) ? false :true
+ end
+
def format_revision(revision)
if revision.respond_to? :format_identifier
revision.format_identifier
@@ -47,7 +61,7 @@ module RepositoriesHelper
def user_commit_rep(mail)
user = User.find_by_mail(mail)
- user.nil? ? User.find(2) : User.find_by_mail(mail)
+ #user.nil? ? User.find(2) : User.find_by_mail(mail)
end
def render_properties(properties)
diff --git a/app/models/comment.rb b/app/models/comment.rb
index bb31eb894..9de25c50d 100644
--- a/app/models/comment.rb
+++ b/app/models/comment.rb
@@ -35,7 +35,7 @@ class Comment < ActiveRecord::Base
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
validates_presence_of :commented, :author, :comments
safe_attributes 'comments'
- after_create :send_mail, :act_as_system_message
+ after_create :send_mail, :act_as_system_message, :act_as_student_score
def act_as_system_message
if self.commented.course
@@ -66,13 +66,24 @@ class Comment < ActiveRecord::Base
def set_notify_id(notify_id)
@notify_id= notify_id
end
+
def get_notify_id()
return @notify_id
end
+
def set_notify_is_read(notify_is_read)
@notify_is_read = notify_is_read
end
+
def get_notify_is_read()
return @notify_is_read
end
+
+ # 课程成员得分(英雄榜)
+ def act_as_student_score
+ unless self.author.allowed_to?(:as_teacher, self.commented.course)
+ course_member_score(self.commented.course.id, self.author_id, "NewReply")
+ end
+ end
+
end
diff --git a/app/models/course.rb b/app/models/course.rb
index 0bd14d38b..77850a89d 100644
--- a/app/models/course.rb
+++ b/app/models/course.rb
@@ -32,6 +32,8 @@ class Course < ActiveRecord::Base
:conditions => "#{Principal.table_name}.type='Group' OR (#{Principal.table_name}.type='User' AND #{Principal.table_name}.status=#{Principal::STATUS_ACTIVE})"
has_many :principals, :through => :member_principals, :source => :principal
has_many :users, :through => :members
+ has_many :org_courses
+ has_many :organizations, :through => :org_courses
# has_many :homeworks, :through => :homework_for_courses, :source => :bid, :dependent => :destroy
has_many :journals_for_messages, :as => :jour, :dependent => :destroy
# has_many :homework_for_courses, :dependent => :destroy
@@ -52,7 +54,10 @@ class Course < ActiveRecord::Base
has_many :course_activities
# 课程消息
- has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
+ has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
+ has_many :exercises, :dependent => :destroy
+ # 课程贡献榜
+ has_many :course_contributor_scores, :dependent => :destroy
acts_as_taggable
acts_as_nested_set :order => 'name', :dependent => :destroy
diff --git a/app/models/course_activity.rb b/app/models/course_activity.rb
index 4e74142ad..e1f9ab9f5 100644
--- a/app/models/course_activity.rb
+++ b/app/models/course_activity.rb
@@ -5,8 +5,8 @@ class CourseActivity < ActiveRecord::Base
belongs_to :course
belongs_to :user
has_many :user_acts, :class_name => 'UserAcivity',:as =>:act
- after_save :add_user_activity
- before_destroy :destroy_user_activity
+ after_save :add_user_activity, :add_course_activity
+ before_destroy :destroy_user_activity, :destroy_org_activity
#在个人动态里面增加当前动态
def add_user_activity
@@ -30,8 +30,34 @@ class CourseActivity < ActiveRecord::Base
end
end
+ def add_course_activity
+ org_activity = OrgActivity.where("org_act_type = '#{self.course_act_type.to_s}' and org_act_id = '#{self.course_act_id}'").first
+ if org_activity
+ org_activity.save
+ else
+ if self.course_act_type == 'Message' && !self.course_act.parent_id.nil?
+ org_activity = OrgActivity.where("org_act_type = 'Message' and org_act_id = #{self.course_act.parent.id}").first
+ org_activity.created_at = self.created_at
+ org_activity.save
+ else
+ OrgActivity.create(:user_id => self.user_id,
+ :org_act_id => self.course_act_id,
+ :org_act_type => self.course_act_type,
+ :container_id => self.course_id,
+ :container_type => 'Course',
+ :created_at => self.created_at,
+ :updated_at => self.updated_at)
+ end
+ end
+ end
+
def destroy_user_activity
user_activity = UserActivity.where("act_type = '#{self.course_act_type.to_s}' and act_id = '#{self.course_act_id}'")
user_activity.destroy_all
end
+
+ def destroy_org_activity
+ org_activity = OrgActivity.where("org_act_type = '#{self.course_act_type.to_s}' and org_act_id = '#{self.course_act_id}'")
+ org_activity.destroy_all
+ end
end
diff --git a/app/models/course_contributor_score.rb b/app/models/course_contributor_score.rb
new file mode 100644
index 000000000..f2b05458f
--- /dev/null
+++ b/app/models/course_contributor_score.rb
@@ -0,0 +1,5 @@
+class CourseContributorScore < ActiveRecord::Base
+ attr_accessible :course_id, :journal_num, :journal_reply_num, :message_num, :message_reply_num, :news_reply_num, :resource_num, :user_id, :total_score
+ belongs_to :course
+ belongs_to :user
+end
diff --git a/app/models/exercise.rb b/app/models/exercise.rb
new file mode 100644
index 000000000..e4295971e
--- /dev/null
+++ b/app/models/exercise.rb
@@ -0,0 +1,8 @@
+class Exercise < ActiveRecord::Base
+ #exercise_status: 1,新建;2,发布;3,关闭
+ include Redmine::SafeAttributes
+ belongs_to :user
+ has_many :exercise_questions, :dependent => :destroy,:order => "#{ExerciseQuestion.table_name}.question_number"
+ has_many :exercise_users, :dependent => :destroy
+ has_many :users, :through => :exercise_users #该测试被哪些用户提交答案过
+end
diff --git a/app/models/exercise_answer.rb b/app/models/exercise_answer.rb
new file mode 100644
index 000000000..c62f5bcd5
--- /dev/null
+++ b/app/models/exercise_answer.rb
@@ -0,0 +1,8 @@
+class ExerciseAnswer < ActiveRecord::Base
+ #学生答题
+ include Redmine::SafeAttributes
+
+ belongs_to :user
+ belongs_to :exercise_question
+ belongs_to :exercise_choice
+end
diff --git a/app/models/exercise_choice.rb b/app/models/exercise_choice.rb
new file mode 100644
index 000000000..00d611566
--- /dev/null
+++ b/app/models/exercise_choice.rb
@@ -0,0 +1,7 @@
+class ExerciseChoice < ActiveRecord::Base
+ include Redmine::SafeAttributes
+
+ belongs_to :exercise_question
+ has_many :exercise_answers, :dependent => :destroy
+ has_many :exercise_standard_answers, :dependent => :destroy
+end
diff --git a/app/models/exercise_question.rb b/app/models/exercise_question.rb
new file mode 100644
index 000000000..5189b0274
--- /dev/null
+++ b/app/models/exercise_question.rb
@@ -0,0 +1,8 @@
+class ExerciseQuestion < ActiveRecord::Base
+ include Redmine::SafeAttributes
+
+ belongs_to :exercise
+ has_many :exercise_choices, :order => "#{ExerciseChoice.table_name}.choice_position",:dependent => :destroy
+ has_many :exercise_answers, :dependent => :destroy
+ has_many :exercise_standard_answers, :dependent => :destroy
+end
diff --git a/app/models/exercise_standard_answer.rb b/app/models/exercise_standard_answer.rb
new file mode 100644
index 000000000..ce3d08fbf
--- /dev/null
+++ b/app/models/exercise_standard_answer.rb
@@ -0,0 +1,7 @@
+class ExerciseStandardAnswer < ActiveRecord::Base
+ #标准答案
+ include Redmine::SafeAttributes
+
+ belongs_to :exercise_question
+ belongs_to :exercise_choice
+end
diff --git a/app/models/exercise_user.rb b/app/models/exercise_user.rb
new file mode 100644
index 000000000..2d5da5d95
--- /dev/null
+++ b/app/models/exercise_user.rb
@@ -0,0 +1,6 @@
+class ExerciseUser < ActiveRecord::Base
+ include Redmine::SafeAttributes
+
+ belongs_to :user
+ belongs_to :exercise
+end
diff --git a/app/models/forge_activity.rb b/app/models/forge_activity.rb
index 8a94f1019..bb5f30442 100644
--- a/app/models/forge_activity.rb
+++ b/app/models/forge_activity.rb
@@ -21,7 +21,7 @@ class ForgeActivity < ActiveRecord::Base
validates :forge_act_type, presence: true
has_many :user_acts, :class_name => 'UserAcivity',:as =>:act
after_save :add_user_activity, :add_org_activity
- before_destroy :destroy_user_activity
+ before_destroy :destroy_user_activity, :destroy_org_activity
#在个人动态里面增加当前动态
def add_user_activity
@@ -46,17 +46,28 @@ class ForgeActivity < ActiveRecord::Base
end
def add_org_activity
- OrgActivity.create(:user_id => self.user_id,
+ if self.forge_act_type == 'Message' && !self.forge_act.parent_id.nil?
+ org_activity = OrgActivity.where("org_act_type = 'Message' and org_act_id = #{self.forge_act.parent.id}").first
+ org_activity.created_at = self.created_at
+ org_activity.save
+ else
+ OrgActivity.create(:user_id => self.user_id,
:org_act_id => self.forge_act_id,
:org_act_type => self.forge_act_type,
:container_id => self.project_id,
:container_type => 'Project',
:created_at => self.created_at,
:updated_at => self.updated_at)
+ end
end
def destroy_user_activity
user_activity = UserActivity.where("act_type = '#{self.forge_act_type.to_s}' and act_id = '#{self.forge_act_id}'")
user_activity.destroy_all
end
+
+ def destroy_org_activity
+ org_acts = OrgActivity.where("org_act_type='#{self.forge_act_type.to_s}' and org_act_id = '#{self.forge_act_id}'")
+ org_acts.destroy_all
+ end
end
diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb
index 14760a631..20b3c60bf 100644
--- a/app/models/journals_for_message.rb
+++ b/app/models/journals_for_message.rb
@@ -65,7 +65,7 @@ class JournalsForMessage < ActiveRecord::Base
has_many :user_feedback_messages, :class_name => 'UserFeedbackMessage', :as =>:journals_for_message, :dependent => :destroy
validates :notes, presence: true, if: :is_homework_jour?
- after_create :act_as_activity, :act_as_course_activity, :act_as_course_message, :act_as_user_feedback_message, :act_as_principal_activity
+ after_create :act_as_activity, :act_as_course_activity, :act_as_course_message, :act_as_user_feedback_message, :act_as_principal_activity, :act_as_student_score
after_create :reset_counters!
after_destroy :reset_counters!
after_save :be_user_score
@@ -264,4 +264,12 @@ class JournalsForMessage < ActiveRecord::Base
end
end
+
+ # 课程成员得分(英雄榜)
+ def act_as_student_score
+ unless self.user.allowed_to?(:as_teacher, self.jour)
+ course_member_score(self.jour_id, self.user_id, "JournalForMessage")
+ end
+ end
+
end
diff --git a/app/models/message.rb b/app/models/message.rb
index c5371097a..f18dfc859 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -74,7 +74,7 @@ class Message < ActiveRecord::Base
after_update :update_messages_board
after_destroy :reset_counters!,:down_user_score,:delete_kindeditor_assets
- after_create :act_as_activity,:act_as_course_activity,:be_user_score,:act_as_forge_activity, :act_as_system_message, :send_mail
+ after_create :act_as_activity,:act_as_course_activity,:be_user_score,:act_as_forge_activity, :act_as_system_message, :send_mail, :act_as_student_score
#before_save :be_user_score
scope :visible, lambda {|*args|
@@ -285,4 +285,16 @@ class Message < ActiveRecord::Base
delete_kindeditor_assets_from_disk self.id,OwnerTypeHelper::MESSAGE
end
+ # 课程成员得分(英雄榜)
+ def act_as_student_score
+ unless self.author.allowed_to?(:as_teacher, self.course)
+ if self.parent_id.nil?
+ # 发帖
+ course_member_score(self.course.id, self.author_id, "Message")
+ else
+ # 回帖
+ course_member_score(self.course.id, self.author_id, "MessageReply")
+ end
+ end
+ end
end
diff --git a/app/models/org_course.rb b/app/models/org_course.rb
new file mode 100644
index 000000000..8c198794a
--- /dev/null
+++ b/app/models/org_course.rb
@@ -0,0 +1,5 @@
+class OrgCourse < ActiveRecord::Base
+ #attr_accessible :organization, :course, :created_at
+ belongs_to :organization
+ belongs_to :course
+end
diff --git a/app/models/org_document_comment.rb b/app/models/org_document_comment.rb
index 2b3c9132a..7b9f9cd75 100644
--- a/app/models/org_document_comment.rb
+++ b/app/models/org_document_comment.rb
@@ -11,6 +11,10 @@ class OrgDocumentComment < ActiveRecord::Base
def document_save_as_org_activity
if(self.parent().nil?)
self.org_acts << OrgActivity.new(:user_id => User.current.id, :container_id => self.organization.id, :container_type => 'Organization')
+ else
+ act = OrgActivity.where("org_act_type='OrgDocumentComment' and org_act_id =?", self.root.id).first
+ act.update_attributes(:updated_at => self.updated_at)
end
end
+
end
diff --git a/app/models/organization.rb b/app/models/organization.rb
index 7778da477..d3755b5ee 100644
--- a/app/models/organization.rb
+++ b/app/models/organization.rb
@@ -3,7 +3,9 @@ class Organization < ActiveRecord::Base
has_many :org_members, :dependent => :destroy
has_many :org_projects ,:dependent => :destroy
has_many :projects,:through => :org_projects
+ has_many :courses, :through => :org_courses
has_many :org_document_comments, :dependent => :destroy
+ has_many :org_courses
has_many :users, :through => :org_members
validates_uniqueness_of :name
after_create :save_as_org_activity
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 94b7905c6..f50f37f31 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -40,7 +40,8 @@ class Repository < ActiveRecord::Base
validates_length_of :identifier, :maximum => IDENTIFIER_MAX_LENGTH, :allow_blank => true
validates_presence_of :identifier#, :unless => Proc.new { |r| r.is_default? || r.set_as_default? }
#validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true
- validates_uniqueness_of :identifier, :allow_blank => true
+ # 改成同一用户不能有两个相同名字的版本库
+ # validates_uniqueness_of :identifier, :allow_blank => true
validates_exclusion_of :identifier, :in => %w(show entry raw changes annotate diff show stats graph)
# donwcase letters, digits, dashes, underscores but not digits only
validates_format_of :identifier, :with => /^[a-z0-9_\-]+$/, :allow_blank => true
@@ -52,7 +53,8 @@ class Repository < ActiveRecord::Base
'password',
'path_encoding',
'log_encoding',
- 'is_default'
+ 'is_default',
+ 'type'
safe_attributes 'url',
:if => lambda {|repository, user| repository.new_record?}
@@ -63,6 +65,10 @@ class Repository < ActiveRecord::Base
end
def repo_create_validation
+ # 之所以可以这样改,是因为Fork的时候不需要从Trustie创建版本库,只需从Gitlab关联即可
+ if self.class.name.demodulize == "Repository"
+ return
+ end
unless Setting.enabled_scm.include?(self.class.name.demodulize)
errors.add(:type, :invalid)
end
diff --git a/app/models/user.rb b/app/models/user.rb
index ced747af8..17a8f32ba 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -96,6 +96,12 @@ class User < Principal
has_many :poll, :dependent => :destroy #用户创建的问卷
has_many :answers, :source => :poll, :through => :poll_users, :dependent => :destroy #用户已经完成问答的问卷
# end
+ #在线测验相关关系
+ has_many :exercise_user, :dependent => :destroy #答卷中间表
+ has_many :exercise_answer, :dependent => :destroy #针对每个题目学生的答案
+ has_many :exercises, :dependent => :destroy #创建的试卷
+ has_many :exercises_answers, :source => :exercise, :through => :exercise_user, :dependent => :destroy #用户已经完成问答的试卷
+ #end
#作业相关关系
has_many :homework_commons, :dependent => :destroy
has_many :student_works, :dependent => :destroy
@@ -162,6 +168,8 @@ class User < Principal
# 邮件邀请状态
has_many :invite_lists, :dependent => :destroy
# end
+ # 课程贡献榜
+ has_many :course_contributor_scores, :dependent => :destroy
######added by nie
has_many :project_infos, :dependent => :destroy
diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb
index 04e2c24ee..5d60238bf 100644
--- a/app/services/courses_service.rb
+++ b/app/services/courses_service.rb
@@ -186,6 +186,7 @@ class CoursesService
#params[:setup_time]:暂不传(貌似已经没用了)
#params[:endup_time]: 暂不传(貌似已经没用了)
#params[:class_period]:学时总数
+ #params[:course][:publish_resource]允许学生上传资源
def create_course(params,current_user)
if current_user.user_extensions.identity
@course = Course.new
@@ -202,6 +203,7 @@ class CoursesService
@course.class_period = params[:class_period].to_i
params[:course][:is_public] ? @course.is_public = 1 : @course.is_public = 0
params[:course][:open_student] ? @course.open_student = 1 : @course.open_student = 0
+ params[:course][:publish_resource] ? @course.publish_resource = 1 : @course.publish_resource = 0
else
end
diff --git a/app/views/courses/_tool_expand.html.erb b/app/views/courses/_tool_expand.html.erb
new file mode 100644
index 000000000..9a36b8efb
--- /dev/null
+++ b/app/views/courses/_tool_expand.html.erb
@@ -0,0 +1,47 @@
+<% course_file_num = visable_attachemnts_incourse(@course).count%>
+<% is_teacher = User.current.logged? && (User.current.admin? || User.current.allowed_to?(:as_teacher,@course)) %>
+<% if show_nav?(@course.homework_commons.count) %>
+
+ <%= link_to l(:label_homework), homework_common_index_path(:course => @course.id), :class => "f14 c_blue02 ml10"%>
+ <%= link_to( "", homework_common_index_path(:course => @course.id,:is_new => 1), :class => 'courseMenuSetting', :title =>"#{l(:label_course_homework_new)}") if is_teacher %>
+
+<% end %>
+<% if show_nav?(@course.news.count) %>
+
+ <%= link_to l(:label_course_news), course_news_index_path(@course), :class => "f14 c_blue02 ml10" %>
+ <%= link_to( "", new_course_news_path(@course), :class => 'courseMenuSetting', :title =>"#{l(:label_course_news_new)}") if is_teacher %>
+
+<% end %>
+<% if show_nav?(course_file_num) %>
+
+ <%= link_to l(:label_course_file), course_files_path(@course), :class => "f14 c_blue02 ml10" %>
+ <% if is_teacher || (@course.publish_resource == 1 && User.current.member_of_course?(@course)) %>
+
+
+ <% end %>
+
+<% end %>
+<% if show_nav?(@course.boards.first ? @course.boards.first.topics.count : 0) %>
+
+ <%= link_to l(:label_course_board), course_boards_path(@course), :class => "f14 c_blue02 ml10" %>
+ <%= link_to( "",course_boards_path(@course, :flag => true, :is_new => 1), :class => 'courseMenuSetting', :title =>"#{l(:label_message_new)}") if User.current.member_of_course?(@course) && @course.boards.first %>
+
+<% end %>
+<% if show_nav?(course_feedback_count) %>
+
+ <%= link_to l(:label_course_feedback), course_feedback_path(@course), :class => "f14 c_blue02 ml10" %>
+ <%= link_to "", course_feedback_path(@course), :class => 'courseMenuSetting', :title =>"#{l(:label_message_new)}", :id => "course_jour_count"%>
+
+<% end %>
+<% if show_nav?(course_poll_count) %>
+
+ <%= link_to l(:label_poll), poll_index_path(:polls_type => "Course", :polls_group_id => @course.id), :class => " f14 c_blue02 ml10"%>
+ <%= link_to( "", new_poll_path(:polls_type => "Course",:polls_group_id => @course.id), :class => 'courseMenuSetting', :title =>"#{l(:label_new_poll)}") if is_teacher %>
+
+<% end %>
+<% if show_nav?(User.current.allowed_to?(:as_teacher,@course)? @course.exercises.count : @course.exercises.where("exercise_status=2").count) %>
+
+ <%= link_to "在线测验", exercise_index_path(:course_id => @course.id), :class => " f14 c_blue02 ml10"%>
+ <%= link_to( "", new_exercise_path(:course_id => @course.id), :class => 'courseMenuSetting', :title =>"新建试卷") if is_teacher %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/courses/new.html.erb b/app/views/courses/new.html.erb
index d2c17917e..f1b917816 100644
--- a/app/views/courses/new.html.erb
+++ b/app/views/courses/new.html.erb
@@ -50,6 +50,12 @@
(打钩为"学生列表公开",不打钩为不公开,若不公开,则课程外部人员看不到学生列表)
+
+ 学生上传资源 :
+ id="course_publish_resource" name="course[publish_resource]" type="checkbox" />
+ (打钩为"允许学生上传资源",不打钩为"不允许学生上传资源")
+
+
提交
<%= link_to "取消",user_activities_path(User.current.id),:class => "blue_btn grey_btn fl c_white"%>
diff --git a/app/views/courses/search_public_orgs_not_in_course.js.erb b/app/views/courses/search_public_orgs_not_in_course.js.erb
new file mode 100644
index 000000000..2669f8a0f
--- /dev/null
+++ b/app/views/courses/search_public_orgs_not_in_course.js.erb
@@ -0,0 +1,19 @@
+<% if @hint_flag.nil? %>
+ if($("#join_orgs_for_course input:checked").size() > 0)
+ {
+ alert("翻页或搜索后将丢失当前选择的用户数据");
+ }
+<% end %>
+$("#search_orgs_result_list").html("");
+$("#search_orgs_result_list").append('')
+<% if @org_count > 10 %>
+ $("#paginator").html(' <%= pagination_links_full @orgs_page, @org_count ,:per_page_links => true,:remote =>true,:flag=>true%>');
+ $("#paginator").css("display", "block");
+<% else %>
+ $("#paginator").css("display", "none");
+<% end %>
diff --git a/app/views/courses/settings.html.erb b/app/views/courses/settings.html.erb
index 27ead4e6b..5c3918f00 100644
--- a/app/views/courses/settings.html.erb
+++ b/app/views/courses/settings.html.erb
@@ -10,6 +10,9 @@
成员
+
+ 组织
+
@@ -97,6 +100,10 @@
<%= render :partial => "course_members" %>
+
+
+ <%= render :partial => 'courses/settings/join_org' %>
+
\ No newline at end of file
diff --git a/app/views/exercise/_alert.html.erb b/app/views/exercise/_alert.html.erb
new file mode 100644
index 000000000..b3de53d1f
--- /dev/null
+++ b/app/views/exercise/_alert.html.erb
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/views/exercise/_commit_alert.html.erb b/app/views/exercise/_commit_alert.html.erb
new file mode 100644
index 000000000..e9c3ebf57
--- /dev/null
+++ b/app/views/exercise/_commit_alert.html.erb
@@ -0,0 +1,21 @@
+
+ <% if status == 0 && exercise.time != -1%>
+
提交成功!您的分数是:<%=@score %>分。
+ <%= link_to "确定", exercise_path(),:class => 'commit'%>
+ <% elsif status == 0 && Time.parse(format_time(exercise.end_time)).strftime("%Y-%m-%d %H:%M:%S") > Time.now.strftime("%Y-%m-%d %H:%M:%S") %>
+ 提交成功!
+ <%= link_to "确定", exercise_index_path(:course_id => @course.id),:class => 'commit'%>
+ <% elsif status == 1 && Time.parse(format_time(exercise.end_time)).strftime("%Y-%m-%d %H:%M:%S") > Time.now.strftime("%Y-%m-%d %H:%M:%S")%>
+ 保存成功!
+ <%= link_to "确定",exercise_index_path(:course_id => @course.id),:class => 'commit'%>
+ <% elsif status == 1 && Time.parse(format_time(exercise.end_time)).strftime("%Y-%m-%d %H:%M:%S") <= Time.now.strftime("%Y-%m-%d %H:%M:%S")%>
+ 时间已到!
+ <%= link_to "确定", exercise_path(),:class => 'commit'%>
+ <% elsif status == 2 %>
+ 发生未知错误,请检查您的网络。
+ <%= link_to "确定", "javascript:void(0)",:onclick => 'hidden_atert_form();',:class => 'commit'%>
+ <% else %>
+ 时间已到!您的分数是:<%=@score %>分。
+ <%= link_to "确定", exercise_path(),:class => 'commit'%>
+ <% end %>
+
diff --git a/app/views/exercise/_edit_MC.html.erb b/app/views/exercise/_edit_MC.html.erb
new file mode 100644
index 000000000..f4ececf8f
--- /dev/null
+++ b/app/views/exercise/_edit_MC.html.erb
@@ -0,0 +1,63 @@
+<%= form_for("",:url => update_exercise_question_exercise_index_path(:exercise_question => exercise_question.id),:remote => true) do |f|%>
+
+
+
+
+
+<% end%>
\ No newline at end of file
diff --git a/app/views/exercise/_edit_MCQ.html.erb b/app/views/exercise/_edit_MCQ.html.erb
new file mode 100644
index 000000000..18ae79d1c
--- /dev/null
+++ b/app/views/exercise/_edit_MCQ.html.erb
@@ -0,0 +1,63 @@
+<%= form_for("",:url => update_exercise_question_exercise_index_path(:exercise_question => exercise_question.id),:remote => true) do |f|%>
+
+
+
+
+
+<% end%>
\ No newline at end of file
diff --git a/app/views/exercise/_edit_head.html.erb b/app/views/exercise/_edit_head.html.erb
new file mode 100644
index 000000000..c8ba0c4d7
--- /dev/null
+++ b/app/views/exercise/_edit_head.html.erb
@@ -0,0 +1,39 @@
+<%= form_for @exercise, :remote=>true do |f| %>
+
+
+
+
+
截止时间:
+
+ "/>
+ <%= calendar_for('exercise_end_time')%>
+
+
测验时长: 分钟
+
发布时间(可选):
+
+ "/>
+ <%= calendar_for('exercise_publish_time')%>
+
+
+
+
+
+
+<% end %>
+
\ No newline at end of file
diff --git a/app/views/exercise/_edit_single.html.erb b/app/views/exercise/_edit_single.html.erb
new file mode 100644
index 000000000..0ce2f0943
--- /dev/null
+++ b/app/views/exercise/_edit_single.html.erb
@@ -0,0 +1,59 @@
+<%= form_for("",:url => update_exercise_question_exercise_index_path(:exercise_question => exercise_question.id),:remote => true) do |f|%>
+
+
+
+
+
+<% end%>
\ No newline at end of file
diff --git a/app/views/exercise/_exercise.html.erb b/app/views/exercise/_exercise.html.erb
new file mode 100644
index 000000000..db412672c
--- /dev/null
+++ b/app/views/exercise/_exercise.html.erb
@@ -0,0 +1,60 @@
+<%# has_commit = has_commit_poll?(poll.id ,User.current)%>
+<% exercise_name = exercise.exercise_name.empty? ? l(:label_poll_new) : exercise.exercise_name%>
+<% if @is_teacher%>
+
+
+ <%# if has_commit %>
+ <%#= link_to poll_name, poll_result_poll_path(poll.id), :class => "polls_title polls_title_w fl c_dblue"%>
+ <%# else %>
+ <%#= link_to poll_name, exercise_path(poll.id), :class => "polls_title polls_title_w fl c_dblue" %>
+ <%# end %>
+ <%= link_to (index.to_i+1).to_s+". "+exercise_name, exercise_path(exercise.id), :class => "polls_title polls_title_w fl c_dblue" %>
+
+
+
+ <%# if exercise.exercise_status == 2 %>
+
+ <%# else %>
+
+ <%# end%>
+
+ <%# if exercise.exercise_status == 1%>
+
+ <%# elsif exercise.exercise_status == 2 || exercise.exercise_status == 3 %>
+
+ <%# end%>
+ <% if exercise.exercise_status == 1 %>
+ 发布试卷
+ <% elsif exercise.exercise_status == 2%>
+ 取消发布
+ <% else%>
+ 发布试卷
+ <% end%>
+
+ <% if exercise.exercise_status == 1%>
+ 统计结果
+ <% else %>
+ <%= link_to l(:label_statistical_results), student_exercise_list_exercise_path(exercise.id,:course_id => @course.id), :class => "pollsbtn fr mr10"%>
+ <% end%>
+
+ <%= link_to(l(:button_delete), exercise,:method => :delete, :confirm => l(:text_are_you_sure), :remote => true, :class => "polls_de fr ml5 mr10") %>
+
+ <% if exercise.exercise_status == 1 %>
+ <%= link_to l(:button_edit), edit_exercise_path(exercise.id), :class => "polls_de fr ml10"%>
+ <%=exercise.publish_time.nil? ? "未发布" : "将于"+format_time(exercise.publish_time.to_s)+"发布"%>
+ <% else%>
+ 编辑
+ 已发布
+ <% end%>
+
+<% else%>
+ <% if exercise.exercise_status == 2%>
+ <%# if has_commit%>
+
+ <%#else%>
+ <%= link_to (index.to_i+1).to_s+". "+exercise_name, exercise_path(exercise.id), :class => "polls_title polls_title_st fl c_dblue"%>
+ <%#end%>
+ <% end%>
+ 截止时间:<%= format_time(exercise.end_time.to_s)%>
+<% end%>
\ No newline at end of file
diff --git a/app/views/exercise/_exercise_content.html.erb b/app/views/exercise/_exercise_content.html.erb
new file mode 100644
index 000000000..14add37ec
--- /dev/null
+++ b/app/views/exercise/_exercise_content.html.erb
@@ -0,0 +1,42 @@
+<% mc_question_list = exercise.exercise_questions.where("question_type=1") %>
+<% mcq_question_list = exercise.exercise_questions.where("question_type=2") %>
+<% single_question_list = exercise.exercise_questions.where("question_type=3") %>
+">
+
单选题
+ <% mc_question_list.each do |exercise_question| %>
+
+
+ <%= render :partial => 'show_MC', :locals => {:exercise_question => exercise_question} %>
+
+
+ <%= render :partial => 'edit_MC', :locals => {:exercise_question => exercise_question} %>
+
+
+ <% end %>
+
+">
+
多选题
+ <% mcq_question_list.each do |exercise_question| %>
+
+
+ <%= render :partial => 'show_MCQ', :locals => {:exercise_question => exercise_question} %>
+
+
+ <%= render :partial => 'edit_MCQ', :locals => {:exercise_question => exercise_question} %>
+
+
+ <% end %>
+
+">
+
填空题
+ <% single_question_list.each do |exercise_question| %>
+
+
+ <%= render :partial => 'show_single', :locals => {:exercise_question => exercise_question} %>
+
+
+ <%= render :partial => 'edit_single', :locals => {:exercise_question => exercise_question} %>
+
+
+ <% end %>
+
\ No newline at end of file
diff --git a/app/views/exercise/_exercise_form.html.erb b/app/views/exercise/_exercise_form.html.erb
new file mode 100644
index 000000000..e283f8b0c
--- /dev/null
+++ b/app/views/exercise/_exercise_form.html.erb
@@ -0,0 +1,219 @@
+<%= stylesheet_link_tag 'polls', :media => 'all' %>
+
+
diff --git a/app/views/exercise/_exercise_republish.html.erb b/app/views/exercise/_exercise_republish.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/exercise/_exercise_student.html.erb b/app/views/exercise/_exercise_student.html.erb
new file mode 100644
index 000000000..adaab5021
--- /dev/null
+++ b/app/views/exercise/_exercise_student.html.erb
@@ -0,0 +1,237 @@
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_exercise_student_result.html.erb b/app/views/exercise/_exercise_student_result.html.erb
new file mode 100644
index 000000000..93e52b0a1
--- /dev/null
+++ b/app/views/exercise/_exercise_student_result.html.erb
@@ -0,0 +1,140 @@
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_exercise_submit.html.erb b/app/views/exercise/_exercise_submit.html.erb
new file mode 100644
index 000000000..8e2ad74a2
--- /dev/null
+++ b/app/views/exercise/_exercise_submit.html.erb
@@ -0,0 +1,37 @@
+<%= form_for('',
+ :html => { :multipart => true },
+ :url => {:controller => 'exercise',
+ :action => 'commit_exercise',
+ :id => exercise.id
+ },:remote=>true ) do |f| %>
+
+<% end %>
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_exercise_submit_info.html.erb b/app/views/exercise/_exercise_submit_info.html.erb
new file mode 100644
index 000000000..0744b4fd1
--- /dev/null
+++ b/app/views/exercise/_exercise_submit_info.html.erb
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+ <% current_score = get_current_score exercise %>
+ <% question_count = exercise.exercise_questions.count %>
+ <% mc_count = exercise.exercise_questions.where("question_type=1").count %>
+ <% mcq_count = exercise.exercise_questions.where("question_type=2").count %>
+ <% single_count = exercise.exercise_questions.where("question_type=3").count %>
+
当前测验<%if question_count >0%>共有<%= question_count %>道题,其中<%end%><%if mc_count > 0%><%=mc_count %>道单选、<%end%><%if mcq_count > 0%><%=mcq_count %>道多选、<%end%><%if single_count > 0%><%=single_count %>道填空,<%end%>总分为<%=current_score %> 分。
+
+ <% if exercise.publish_time.nil? %>点击提交后测验将立即发布,<% end %>是否确定提交该测验?
+
+
+
+
+
+
+
+
+
diff --git a/app/views/exercise/_exercise_teacher.html.erb b/app/views/exercise/_exercise_teacher.html.erb
new file mode 100644
index 000000000..24687d28b
--- /dev/null
+++ b/app/views/exercise/_exercise_teacher.html.erb
@@ -0,0 +1,125 @@
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_exercises_list.html.erb b/app/views/exercise/_exercises_list.html.erb
new file mode 100644
index 000000000..89964f032
--- /dev/null
+++ b/app/views/exercise/_exercises_list.html.erb
@@ -0,0 +1,25 @@
+
+
所有试卷
+ (<%= @obj_count%>)
+
+ <% if @is_teacher%>
+ <%#= link_to "导入", other_poll_poll_index_path(:polls_group_id => @course.id), :remote=>true,:class => "newbtn"%>
+ <%= link_to "新建试卷 ", new_exercise_path(:course_id => @course.id), :class => "newbtn" %>
+ <% end%>
+
+
+
+
+ <% @exercises.each_with_index do |exercise,index|%>
+
+ <%= render :partial => 'exercise', :locals => {:exercise => exercise,:index => index} %>
+
+
+ <% end%>
+
+
+ <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%>
+
+
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_new_MC.html.erb b/app/views/exercise/_new_MC.html.erb
new file mode 100644
index 000000000..0d7350570
--- /dev/null
+++ b/app/views/exercise/_new_MC.html.erb
@@ -0,0 +1,62 @@
+<%= form_for(ExerciseQuestion.new,
+ :html => { :multipart => true },
+ :url=>create_exercise_question_exercise_path(exercise.id),
+ :remote=>true ) do |f| %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/exercise/_new_MCQ.html.erb b/app/views/exercise/_new_MCQ.html.erb
new file mode 100644
index 000000000..3ea198d8f
--- /dev/null
+++ b/app/views/exercise/_new_MCQ.html.erb
@@ -0,0 +1,62 @@
+<%= form_for(ExerciseQuestion.new,
+ :html => { :multipart => true },
+ :url=>create_exercise_question_exercise_path(exercise.id),
+ :remote=>true ) do |f| %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/exercise/_new_question.html.erb b/app/views/exercise/_new_question.html.erb
new file mode 100644
index 000000000..faadb08a9
--- /dev/null
+++ b/app/views/exercise/_new_question.html.erb
@@ -0,0 +1,45 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_new_single.html.erb b/app/views/exercise/_new_single.html.erb
new file mode 100644
index 000000000..061b053fd
--- /dev/null
+++ b/app/views/exercise/_new_single.html.erb
@@ -0,0 +1,50 @@
+<%= form_for(ExerciseQuestion.new,
+ :html => { :multipart => true },
+ :url=>create_exercise_question_exercise_path(exercise.id),
+ :remote=>true ) do |f| %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/exercise/_show_MC.html.erb b/app/views/exercise/_show_MC.html.erb
new file mode 100644
index 000000000..d052bd6da
--- /dev/null
+++ b/app/views/exercise/_show_MC.html.erb
@@ -0,0 +1,111 @@
+
+
第<%= exercise_question.question_number%>题.(<%= exercise_question.question_score %>分)
+ <%= exercise_question.question_title %>
+ (<%= convert_to_char(exercise_question.exercise_standard_answers.first.exercise_choice_id.to_s) %>)
+
+
+ <%= link_to("", delete_exercise_question_exercise_index_path(:exercise_question => exercise_question.id, :quest_num => exercise_question.question_number),
+ method: :delete, :confirm => l(:text_are_you_sure), :remote => true, :class => "ur_icon_de") %>
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_show_MCQ.html.erb b/app/views/exercise/_show_MCQ.html.erb
new file mode 100644
index 000000000..a477303d7
--- /dev/null
+++ b/app/views/exercise/_show_MCQ.html.erb
@@ -0,0 +1,109 @@
+
+
第<%= exercise_question.question_number%>题.(<%= exercise_question.question_score %>分)
+ <%= exercise_question.question_title %>
+ (<%= convert_to_char(exercise_question.exercise_standard_answers.first.exercise_choice_id.to_s) %>)
+
+ <%= link_to("", delete_exercise_question_exercise_index_path(:exercise_question => exercise_question.id, :quest_num => exercise_question.question_number),
+ method: :delete, :confirm => l(:text_are_you_sure), :remote => true, :class => "ur_icon_de",:title => "删除") %>
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_show_head.html.erb b/app/views/exercise/_show_head.html.erb
new file mode 100644
index 000000000..f385e58b8
--- /dev/null
+++ b/app/views/exercise/_show_head.html.erb
@@ -0,0 +1,17 @@
+
+
+
+
<%= exercise.exercise_name%>
+
+ <% unless exercise.publish_time.nil? %>
+ 发布时间:<%=Time.parse(h(exercise.publish_time)).strftime("%Y-%m-%d %H:%M:%S") if exercise.publish_time%>
+ <% end %>
+ 截止时间:<%=Time.parse(h(exercise.end_time)).strftime("%Y-%m-%d %H:%M:%S") if exercise.end_time %>
+ <% if exercise.time != -1 %>
+ 测验时长:<%= exercise.time %>分钟
+ <% end %>
+
+
<%= exercise.exercise_description.nil? ? "" : exercise.exercise_description.html_safe%>
+
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_show_single.html.erb b/app/views/exercise/_show_single.html.erb
new file mode 100644
index 000000000..86203b8bb
--- /dev/null
+++ b/app/views/exercise/_show_single.html.erb
@@ -0,0 +1,85 @@
+
+
第<%= exercise_question.question_number%>题.(<%= exercise_question.question_score %>分)
+ <%= exercise_question.question_title %>
+
+ <%= link_to("", delete_exercise_question_exercise_index_path(:exercise_question => exercise_question.id, :quest_num => exercise_question.question_number),
+ method: :delete, :confirm => l(:text_are_you_sure), :remote => true, :class => "ur_icon_de",:title => "删除") %>
+
+
+
+
+ <% exercise_question.exercise_standard_answers.reorder("created_at").each_with_index do |exercise_choice,index| %>
+ 候选答案:<%= exercise_choice.answer_text%>
+ <% end %>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/exercise/_student_exercise.html.erb b/app/views/exercise/_student_exercise.html.erb
new file mode 100644
index 000000000..25bf3f7cd
--- /dev/null
+++ b/app/views/exercise/_student_exercise.html.erb
@@ -0,0 +1,73 @@
+
+
+ 测验
+
+ (<%= @exercise_count%>人已交)
+
+ <% if !@is_teacher && @exercise_users_list.empty?%>
+ 您尚未提交
+ <% elsif !@is_teacher && !@exercise_users_list.empty?%>
+ 您已提交
+ <% end %>
+
+ <%#if @is_teacher || @exercise.exercise_status == 3%>
+
+ <%#= select_tag(:student_work_in_group,options_for_select(course_group_list(@course),@group), {:class => "classSplit"}) unless course_group_list(@course).empty? %>
+ <%# end%>
+
[ 显示测验信息 ]
+
+
+
+
+ <%= render :partial => "student_table"%>
+
+
+
+<% @exercise_users_list.each do |exercise|%>
+
+
+
+
+
+ <%= link_to(image_tag(url_to_avatar(exercise.user),:width =>"40",:height => "40"),user_activities_path(exercise.user)) %>
+
+
+
+
+
+ <%= exercise.user.show_name%>
+
+
+ <%= exercise.user.user_extensions.nil? ? "--" : exercise.user.user_extensions.student_id%>
+
+
+ --
+
+
+
+
+
+
+
+ <% if exercise.created_at%>
+ <%= Time.parse(format_time(exercise.created_at)).strftime("%m-%d %H:%M")%>
+ <% end %>
+
+
+
+ <%= exercise.score.nil? ? "--" : format("%.1f",exercise.score)%>
+
+ 点击查看详情
+
+
+
+<% end%>
\ No newline at end of file
diff --git a/app/views/exercise/_student_table.html.erb b/app/views/exercise/_student_table.html.erb
new file mode 100644
index 000000000..719667973
--- /dev/null
+++ b/app/views/exercise/_student_table.html.erb
@@ -0,0 +1,22 @@
+
+
+
+ 姓名
+ 学号
+ 班级
+
+
+
+ <%= link_to "时间",'',:class => "c_dark f14 fb fl ml50" ,:remote => true%>
+ <%# if @show_all && @order == "created_at"%>
+ <%#= link_to "", student_work_index_path(:homework => @homework.id,:order => "created_at", :sort => @score, :name => @name, :group => @group) ,:class => "#{@score == 'desc' ? 'st_up' : 'st_down'} mt10",:remote => true%>
+ <%# end%>
+
+
+
+ <%= link_to "成绩",'',:class => "c_dark f14 fb fl ml10",:remote => true%>
+ <%# if @show_all && @order == "score"%>
+ <%#= link_to "", student_work_index_path(:homework => @homework.id,:order => "score", :sort => @score, :name => @name, :group => @group) ,:class => "#{@score == 'desc' ? 'st_up' : 'st_down'} mt10",:remote => true%>
+ <%# end%>
+
+
\ No newline at end of file
diff --git a/app/views/exercise/commit_exercise.js.erb b/app/views/exercise/commit_exercise.js.erb
new file mode 100644
index 000000000..5ede8a951
--- /dev/null
+++ b/app/views/exercise/commit_exercise.js.erb
@@ -0,0 +1,9 @@
+$('#ajax-modal').html('<%= escape_javascript(render :partial => 'commit_alert',:locals => {:status => @status,:exercise =>@exercise}) %>');
+showModal('ajax-modal', '270px');
+$('#ajax-modal').css('height','110px');
+$('#ajax-modal').siblings().remove();
+$('#ajax-modal').before("" +
+ " ");
+$('#ajax-modal').parent().removeClass("alert_praise");
+$('#ajax-modal').parent().css("top","").css("left","");
+$('#ajax-modal').parent().addClass("alert_box");
\ No newline at end of file
diff --git a/app/views/exercise/create.js.erb b/app/views/exercise/create.js.erb
new file mode 100644
index 000000000..65b8dd327
--- /dev/null
+++ b/app/views/exercise/create.js.erb
@@ -0,0 +1,4 @@
+$("#polls_head_show").html("<%= escape_javascript(render :partial => 'show_head', :locals => {:exercise => @exercise}) %>");
+$("#polls_head_edit").html("<%= escape_javascript(render :partial => 'edit_head', :locals => {:exercise => @exercise}) %>");
+$("#polls_head_edit").hide();
+$("#polls_head_show").show();
\ No newline at end of file
diff --git a/app/views/exercise/create_exercise_question.js.erb b/app/views/exercise/create_exercise_question.js.erb
new file mode 100644
index 000000000..326a19ec8
--- /dev/null
+++ b/app/views/exercise/create_exercise_question.js.erb
@@ -0,0 +1,42 @@
+<% if @is_insert %>
+ $("#poll_content").html('<%= escape_javascript(render :partial => 'exercise_content', :locals => {:exercise => @exercise})%>');
+ $("#exercise_submit").html("<%= escape_javascript(render :partial => 'exercise_submit', :locals => {:exercise => @exercise}) %>");
+ $("#current_score_div").show();
+ $("#current_score").html("<%=get_current_score @exercise %>分");
+<% else %>
+ $("#new_exercise_question").html('<%= escape_javascript(render :partial => 'new_question', :locals => {:exercise => @exercise}) %>');
+ $("#new_poll_question").html("");
+ $("#exercise_submit").html("<%= escape_javascript(render :partial => 'exercise_submit', :locals => {:exercise => @exercise}) %>");
+ <%if @exercise_questions.question_type == 1%>
+ $("#mc_question_list").show().append("" +
+ "
" +
+ "<%= escape_javascript(render :partial => 'show_MC', :locals => {:exercise_question => @exercise_questions}) %>" +
+ "
" +
+ "
" +
+ "<%= escape_javascript(render :partial => 'edit_MC', :locals => {:exercise_question => @exercise_questions}) %>" +
+ "
" +
+ "
");
+ <% end %>
+ <%if @exercise_questions.question_type == 2%>
+ $("#mcq_question_list").show().append("" +
+ "
" +
+ "<%= escape_javascript(render :partial => 'show_MCQ', :locals => {:exercise_question => @exercise_questions}) %>" +
+ "
" +
+ "
" +
+ "<%= escape_javascript(render :partial => 'edit_MCQ', :locals => {:exercise_question => @exercise_questions}) %>" +
+ "
" +
+ "
");
+ <% end %>
+ <%if @exercise_questions.question_type == 3%>
+ $("#single_question_list").show().append("" +
+ "
" +
+ "<%= escape_javascript(render :partial => 'show_single', :locals => {:exercise_question => @exercise_questions}) %>" +
+ "
" +
+ "
" +
+ "<%= escape_javascript(render :partial => 'edit_single', :locals => {:exercise_question => @exercise_questions}) %>" +
+ "
" +
+ "
");
+ <% end %>
+$("#current_score_div").show();
+$("#current_score").html("<%=get_current_score @exercise %>分");
+<% end %>
diff --git a/app/views/exercise/delete_exercise_question.js.erb b/app/views/exercise/delete_exercise_question.js.erb
new file mode 100644
index 000000000..d07a80b47
--- /dev/null
+++ b/app/views/exercise/delete_exercise_question.js.erb
@@ -0,0 +1,3 @@
+$("#poll_content").html("<%= escape_javascript(render :partial => 'exercise_content', :locals => {:exercise => @exercise}) %>");
+$("#current_score").html("<%=get_current_score @exercise %>分");
+$("#exercise_submit").html("<%= escape_javascript(render :partial => 'exercise_submit', :locals => {:exercise => @exercise}) %>");
\ No newline at end of file
diff --git a/app/views/exercise/destroy.js.erb b/app/views/exercise/destroy.js.erb
new file mode 100644
index 000000000..c17b5a0f6
--- /dev/null
+++ b/app/views/exercise/destroy.js.erb
@@ -0,0 +1 @@
+$("#exercise").html("<%= escape_javascript(render :partial => 'exercises_list') %>");
\ No newline at end of file
diff --git a/app/views/exercise/edit.html.erb b/app/views/exercise/edit.html.erb
new file mode 100644
index 000000000..0b20dc90e
--- /dev/null
+++ b/app/views/exercise/edit.html.erb
@@ -0,0 +1 @@
+<%= render :partial => 'exercise_form'%>
\ No newline at end of file
diff --git a/app/views/exercise/index.html.erb b/app/views/exercise/index.html.erb
new file mode 100644
index 000000000..9b6961e6c
--- /dev/null
+++ b/app/views/exercise/index.html.erb
@@ -0,0 +1,68 @@
+<%= stylesheet_link_tag 'polls', :media => 'all' %>
+
+
+ <%= render :partial => 'exercises_list'%>
+
\ No newline at end of file
diff --git a/app/views/exercise/new.html.erb b/app/views/exercise/new.html.erb
new file mode 100644
index 000000000..3d983d64f
--- /dev/null
+++ b/app/views/exercise/new.html.erb
@@ -0,0 +1 @@
+<%= render :partial => 'exercise_form'%>
diff --git a/app/views/exercise/publish_exercise.js.erb b/app/views/exercise/publish_exercise.js.erb
new file mode 100644
index 000000000..c1c4a4fd5
--- /dev/null
+++ b/app/views/exercise/publish_exercise.js.erb
@@ -0,0 +1,10 @@
+$("#exercises_<%= @exercise.id %>").html("<%= escape_javascript(render :partial => 'exercise',:locals => {:exercise => @exercise,:index =>@index}) %>");
+$('#ajax-modal').html("<%= escape_javascript(render :partial => 'alert', locals: { :message => l(:label_memo_create_succ)}) %>");
+showModal('ajax-modal', '250px');
+//$('#ajax-modal').css('height','111px');
+$('#ajax-modal').siblings().remove();
+$('#ajax-modal').before("" +
+ " ");
+$('#ajax-modal').parent().removeClass("alert_praise");
+$('#ajax-modal').parent().css("top","").css("left","");
+$('#ajax-modal').parent().addClass("poll_alert_form");
\ No newline at end of file
diff --git a/app/views/exercise/republish_exercise.js.erb b/app/views/exercise/republish_exercise.js.erb
new file mode 100644
index 000000000..2b4e67606
--- /dev/null
+++ b/app/views/exercise/republish_exercise.js.erb
@@ -0,0 +1,10 @@
+$("#exercises_<%= @exercise.id %>").html("<%= escape_javascript(render :partial => 'exercise',:locals => {:exercise => @exercise,:index => @index}) %>");
+$('#ajax-modal').html("<%= escape_javascript(render :partial => 'alert', locals: { :message => l(:label_poll_republish_success)}) %>");
+showModal('ajax-modal', '250px');
+//$('#ajax-modal').css('height','80px');
+$('#ajax-modal').siblings().remove();
+$('#ajax-modal').before("" +
+ " ");
+$('#ajax-modal').parent().removeClass("alert_praise");
+$('#ajax-modal').parent().css("top","").css("left","");
+$('#ajax-modal').parent().addClass("poll_alert_form");
\ No newline at end of file
diff --git a/app/views/exercise/show.html.erb b/app/views/exercise/show.html.erb
new file mode 100644
index 000000000..f47710d1c
--- /dev/null
+++ b/app/views/exercise/show.html.erb
@@ -0,0 +1,10 @@
+<%= stylesheet_link_tag 'polls', :media => 'all' %>
+<% if @is_teacher %>
+ <%= render :partial => 'exercise_teacher', :locals =>{:exercise =>@exercise, :exercise_questions => @exercise_questions} %>
+<% else %>
+ <% if @can_edit_excercise %>
+ <%=render :partial => 'exercise_student', :locals => {:exercise =>@exercise, :exercise_questions => @exercise_questions,:exercise_user => @exercise_user} %>
+ <% else %>
+ <%=render :partial => 'exercise_student_result', :locals => {:exercise =>@exercise, :exercise_questions => @exercise_questions,:exercise_user => @exercise_user} %>
+ <% end %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/exercise/student_exercise_list.html.erb b/app/views/exercise/student_exercise_list.html.erb
new file mode 100644
index 000000000..2e51d61af
--- /dev/null
+++ b/app/views/exercise/student_exercise_list.html.erb
@@ -0,0 +1,138 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/views/exercise/update.js.erb b/app/views/exercise/update.js.erb
new file mode 100644
index 000000000..9724b2bd1
--- /dev/null
+++ b/app/views/exercise/update.js.erb
@@ -0,0 +1,5 @@
+$("#polls_head_show").html("<%= escape_javascript(render :partial => 'show_head', :locals => {:exercise => @exercise}) %>");
+$("#polls_head_edit").html("<%= escape_javascript(render :partial => 'edit_head', :locals => {:exercise => @exercise}) %>");
+$("#polls_head_edit").hide();
+$("#polls_head_show").show();
+$("#exercise_submit").html("<%= escape_javascript(render :partial => 'exercise_submit', :locals => {:exercise => @exercise}) %>");
\ No newline at end of file
diff --git a/app/views/exercise/update_exercise_question.js.erb b/app/views/exercise/update_exercise_question.js.erb
new file mode 100644
index 000000000..9e7822cb7
--- /dev/null
+++ b/app/views/exercise/update_exercise_question.js.erb
@@ -0,0 +1,20 @@
+$("#poll_questions_<%= @exercise_question.id%>").html("" +
+ "<% if @exercise_question.question_type == 1%>" +
+ "<%= escape_javascript(render :partial => 'show_MC', :locals => {:exercise_question => @exercise_question}) %>" +
+ "<% elsif @exercise_question.question_type == 2%>" +
+ "<%= escape_javascript(render :partial => 'show_MCQ', :locals => {:exercise_question => @exercise_question}) %>" +
+ "<% elsif @exercise_question.question_type == 3%>" +
+ "<%= escape_javascript(render :partial => 'show_single', :locals => {:exercise_question => @exercise_question}) %>" +
+ "<% end%>" +
+ "
" +
+ "" +
+ "<% if @exercise_question.question_type == 1%>" +
+ "<%= escape_javascript(render :partial => 'edit_MC', :locals => {:exercise_question => @exercise_question}) %>" +
+ "<% elsif @exercise_question.question_type == 2%>" +
+ "<%= escape_javascript(render :partial => 'edit_MCQ', :locals => {:exercise_question => @exercise_question}) %>" +
+ "<% elsif @exercise_question.question_type == 3%>" +
+ "<%= escape_javascript(render :partial => 'edit_single', :locals => {:exercise_question => @exercise_question}) %>" +
+ "<% end%>" +
+ "
");
+$("#current_score").html("<%=get_current_score @exercise_question.exercise %>分");
+$("#exercise_submit").html("<%= escape_javascript(render :partial => 'exercise_submit', :locals => {:exercise => @exercise_question.exercise}) %>");
diff --git a/app/views/issues/add_journal_in_org.js.erb b/app/views/issues/add_journal_in_org.js.erb
new file mode 100644
index 000000000..ad7a85540
--- /dev/null
+++ b/app/views/issues/add_journal_in_org.js.erb
@@ -0,0 +1,3 @@
+$("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'organizations/org_project_issue', :locals => {:activity => @issue,:user_activity_id =>@user_activity_id}) %>");
+
+init_activity_KindEditor_data(<%= @user_activity_id%>,"","87%");
\ No newline at end of file
diff --git a/app/views/layouts/_org_courses.html.erb b/app/views/layouts/_org_courses.html.erb
new file mode 100644
index 000000000..2837ef71f
--- /dev/null
+++ b/app/views/layouts/_org_courses.html.erb
@@ -0,0 +1,12 @@
+<% courses.each do |course|%>
+ <%# pro = Project.find course.course_id %>
+
+<% end %>
+<% if courses.size == 5%>
+
+<% end%>
\ No newline at end of file
diff --git a/app/views/layouts/_org_projects.html.erb b/app/views/layouts/_org_projects.html.erb
index be65fd516..687b54ecd 100644
--- a/app/views/layouts/_org_projects.html.erb
+++ b/app/views/layouts/_org_projects.html.erb
@@ -1,7 +1,7 @@
<% projects.each do |project|%>
- <% pro = Project.find project.project_id %>
+ <%# pro = Project.find project.project_id %>
<% end %>
<% if projects.size == 5%>
diff --git a/app/views/layouts/base_courses.html.erb b/app/views/layouts/base_courses.html.erb
index f2525a014..603f7febb 100644
--- a/app/views/layouts/base_courses.html.erb
+++ b/app/views/layouts/base_courses.html.erb
@@ -136,45 +136,125 @@
+ <% unless show_nav?(@course.course_activities.count) %>
<%= link_to l(:label_activity), course_path(@course), :class => "f14 c_blue02" %>
<%= link_to "(#{@course.course_activities.count})", course_path(@course), :class => "subnav_num c_orange"%>
+ <% end %>
+ <% unless show_nav?(@course.homework_commons.count) %>
<%= link_to l(:label_homework), homework_common_index_path(:course => @course.id), :class => "f14 c_blue02"%>
<%= link_to "(#{@course.homework_commons.count})", homework_common_index_path(:course => @course.id), :class => "subnav_num c_orange"%>
- <%= link_to( "+#{l(:label_course_homework_new)}", homework_common_index_path(:course => @course.id,:is_new => 1), :class => 'subnav_green c_white') if is_teacher %>
+ <%= link_to( "", homework_common_index_path(:course => @course.id,:is_new => 1), :class => 'courseMenuSetting', :title =>"#{l(:label_course_homework_new)}") if is_teacher %>
+ <% end %>
+ <% unless show_nav?(@course.news.count) %>
<%= link_to l(:label_course_news), course_news_index_path(@course), :class => "f14 c_blue02" %>
<%= link_to "(#{@course.news.count})", course_news_index_path(@course), :class => "subnav_num c_orange"%>
- <%= link_to( "+#{l(:label_course_news_new)}", new_course_news_path(@course), :class => 'subnav_green c_white') if is_teacher %>
+ <%= link_to( "", new_course_news_path(@course), :class => 'courseMenuSetting', :title =>"#{l(:label_course_news_new)}") if is_teacher %>
+ <% end %>
+ <% unless show_nav?(course_file_num) %>
<%= link_to l(:label_course_file), course_files_path(@course), :class => "f14 c_blue02" %>
<%= link_to "(#{course_file_num})", course_files_path(@course), :class => "subnav_num c_orange",:id=>'courses_files_count_nav' %>
<% if is_teacher || (@course.publish_resource == 1 && User.current.member_of_course?(@course)) %>
-
+上传资源
+
<% end %>
+ <% end %>
+ <% unless show_nav?(@course.boards.first ? @course.boards.first.topics.count : 0) %>
<%= link_to l(:label_course_board), course_boards_path(@course), :class => "f14 c_blue02" %>
<%= link_to "(#{@course.boards.first ? @course.boards.first.topics.count : 0})", course_boards_path(@course), :class => "subnav_num c_orange" %>
- <%= link_to( "+#{l(:label_message_new)}",course_boards_path(@course, :flag => true, :is_new => 1),:class => 'subnav_green ml95 c_white') if User.current.member_of_course?(@course) && @course.boards.first %>
+ <%= link_to( "",course_boards_path(@course, :flag => true, :is_new => 1), :class => 'courseMenuSetting', :title =>"#{l(:label_message_new)}") if User.current.member_of_course?(@course) && @course.boards.first %>
+ <% end %>
+ <% unless show_nav?(course_feedback_count) %>
<%= link_to l(:label_course_feedback), course_feedback_path(@course), :class => "f14 c_blue02" %>
<%= link_to "(#{course_feedback_count})", course_feedback_path(@course), :class => "subnav_num c_orange", :id => "course_jour_count"%>
+ <%= link_to "", course_feedback_path(@course), :class => 'courseMenuSetting', :title =>"#{l(:label_course_feedback)}", :id => "course_jour_count"%>
+ <% end %>
+ <% unless show_nav?(course_poll_count) %>
<%= link_to l(:label_poll), poll_index_path(:polls_type => "Course", :polls_group_id => @course.id), :class => " f14 c_blue02"%>
<%= link_to "(#{course_poll_count})", poll_index_path(:polls_type => "Course", :polls_group_id => @course.id), :class => "subnav_num c_orange" %>
- <%= link_to( "+#{l(:label_new_poll)}", new_poll_path(:polls_type => "Course",:polls_group_id => @course.id), :class => 'subnav_green c_white') if is_teacher %>
+ <%= link_to( "", new_poll_path(:polls_type => "Course",:polls_group_id => @course.id), :class => 'courseMenuSetting', :title =>"#{l(:label_new_poll)}") if is_teacher %>
+ <% end %>
+ <% unless show_nav?(User.current.allowed_to?(:as_teacher,@course)? @course.exercises.count : @course.exercises.where("exercise_status=2").count) %>
+
+ <%= link_to "在线测验", exercise_index_path(:course_id => @course.id), :class => " f14 c_blue02"%>
+ <%= link_to "(#{User.current.allowed_to?(:as_teacher,@course)? @course.exercises.count : @course.exercises.where("exercise_status=2").count})", exercise_index_path(:course_id => @course.id), :class => "subnav_num c_orange" %>
+ <%= link_to( "", new_exercise_path(:course_id => @course.id), :class => 'courseMenuSetting', :title =>"新建试卷") if is_teacher %>
+
+ <% end %>
+ <%# 工具栏展开 %>
+ <% if @course.homework_commons.count == 0 || @course.news.count == 0 || course_file_num == 0 || course_poll_count == 0 || @course.exercises.count == 0 ||
+ course_feedback_count == 0 || @course.exercises.count == 0 || (@course.boards.first ? @course.boards.first.topics.count : 0) == 0 %>
+
<%= l(:label_project_more) %>
+
+ <%= render 'courses/tool_expand', :locals => {:is_teacher => is_teacher, :course_file_num => course_file_num} %>
+
+ <% end %>
+ <%# 课程贡献榜 %>
+ <% unless contributor_course_scor(@course.id).count == 0 %>
+
+ <% end %>
+
+ <% hero_homework_scores = hero_homework_score(@course, "desc") %>
+ <% unless hero_homework_scores.map(&:score).detect{|s| s != nil}.nil? %>
+
+ <% end %>
+
<%= l(:label_course_brief_introduction)%>:
@@ -273,6 +353,16 @@
$('#ajax-modal').parent().css("top","").css("left","");
$('#ajax-modal').parent().addClass("popbox_polls");
}
+// 鼠标经过的时候显示内容
+ function message_titile_show(obj,e)
+ {
+ obj.parent().parent().next("div").show();
+ obj.parent().next("div").css("top",e.pageY).css("left",e.pageX).css("position","absolute");
+ }
+ function message_titile_hide(obj)
+ {
+ obj.parent().parent().next("div").hide();
+ }
diff --git a/app/views/layouts/base_org.html.erb b/app/views/layouts/base_org.html.erb
index 6b4eab72a..b071a7c3b 100644
--- a/app/views/layouts/base_org.html.erb
+++ b/app/views/layouts/base_org.html.erb
@@ -85,18 +85,55 @@
-
-