#coding=utf-8 class CoursesService include ApplicationHelper include CoursesHelper include HomeworkAttachHelper include ApiHelper include ActionView::Helpers::DateHelper #参数school_id为0或不传时返回所有课程,否则返回对应学校的课程 #参数per_page_count分页功能,每页显示的课程数 #参数page分页功能,当前页码 def course_list params,current_user @school_id = params[:school_id] per_page_option = params[:per_page_count] || 10 page_no = params[:page] || 1 if @school_id == "0" || @school_id.nil? @courses_all = Course.active.visible. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id") else @courses_all = Course.active.visible. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id"). where("#{Course.table_name}.school_id = ?", @school_id) end @course_count = @courses_all.count @course_pages = Redmine::Pagination::Paginator.new @course_count, per_page_option,page_no @courses = @courses_all.order("created_at desc") @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page) course_list = [] @courses.each do |course| course_list << {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)} end course_list end def user_courses_list(current_user) courses = current_user.courses.not_deleted courses.inject([]) {|course_list, course| course_list << {:course => course,:img_url => url_to_avatar(course), :current_user_is_member => current_user.member_of_course?(course), :current_user_is_teacher => is_course_teacher(current_user,course), course_student_num: searchStudent(course).count } } end #搜索课程 def search_course params,current_user courses_all = Course.all_course name = params[:name] if name.blank? raise 'sumbit empty' end @courses = courses_all.visible(current_user) if params[:name].present? @courses_all = @courses.like(params[:name]).order("created_at desc") else @courses_all = @courses.order("created_at desc"); end @courses_all course_list = [] @courses_all.each do |course| course_list << {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)} end course_list end #获取头像 def get_img obj url_to_avatar(obj) end #课程老师或课程学生列表 def course_teacher_or_student_list params,course,current_user if course.is_a?(Course) c = course else c = Course.find(course) end # if current_user.nil? || !(current_user.admin? || c.is_public == 1 || (c.is_public == 0 && current_user.member_of_course?(c))) if current_user.nil? raise '403' end #@canShowCode = isCourseTeacher(User.current.id,course) && params[:role] != '1' case params[:role] when '1' #@subPage_title = l :label_teacher_list @members = searchTeacherAndAssistant(c) when '2' #@subPage_title = l :label_student_list # @members = searchStudent(c) @members = searchmember_by_name(student_homework_score(0,c.id, 0,"desc"),"") else #@subPage_title = '' @members = c.member_principals.includes(:roles, :principal).all.sort end users = [] @members.each do |m| img_url = "/images/"+url_to_avatar(m.user) gender = m.user.user_extensions.gender.nil? ? 0 : m.user.user_extensions.gender work_unit = get_user_work_unit m.user location = get_user_location m.user role_ids = [] m.roles.each do |r| role_ids << r.id end #双重身份 学生列表中不显示 # unless (params[:role] == '2' && role_ids.length >= 2) users << {:id => m.user.id, :img_url => img_url, :nickname => m.user.login, :gender => gender, :work_unit => work_unit, :mail => m.user.mail, :location => location, role_name: m.roles.first.name, name: m.user.show_name, roles_id: role_ids.include?(7) ? 7 : (role_ids.include?(9) ? 9 : 10 ), :brief_introduction => m.user.user_extensions.brief_introduction,:realname=>m.user.realname,:is_me => current_user.id == m.user.id ? 1:0 } # end end users end def reviewers_list course_id reviewers = [] c = Course.find(course_id) if c messages = CourseMessage.where("course_id=? and course_message_type = 'JoinCourseRequest' and status = 0 ",course_id) messages.each do |m| user = User.find(m.course_message_id) if user img_url = url_to_avatar(user) gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender work_unit = get_user_work_unit user location = get_user_location user roles_ids = m.content.split(",") reviewers << {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, :work_unit => work_unit, :mail => user.mail, :location => location, role_name: "", name: user.show_name, roles_id: roles_ids.include?("7") ? 7 : 9, :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname} end end end reviewers end def get_reviewer_info params status = -1 info = nil c = Course.find(params[:course_id]) if c messages = CourseMessage.where("course_id=? and course_message_id = ? and course_message_type = 'JoinCourseRequest' ",params[:course_id],params[:user_id]).last if messages #status 0未处理 1同意 2 通过 status = messages.status user = User.find(params[:user_id]) if user img_url = url_to_avatar(user) gender = user.user_extensions.gender.nil? ? 0 : user.user_extensions.gender work_unit = get_user_work_unit user location = get_user_location user roles_ids = messages.content.split(",") info = {:id => user.id, :img_url => img_url, :nickname => user.login, :gender => gender, :work_unit => work_unit, :mail => user.mail, :location => location, role_name: "", name: user.show_name, roles_id: roles_ids.include?("7") ? 7 : 9, :brief_introduction => user.user_extensions.brief_introduction,:realname=>user.realname} end end end {status:status,reviewer:info} end def deal_join_apply params,current_user status = -1 message = "" c = Course.find(params[:course_id]) if c messages = CourseMessage.where("course_id=? and course_message_id = ? and course_message_type = 'JoinCourseRequest' and status = 0 ",params[:course_id],params[:user_id]).first if messages apply_user = User.find(params[:user_id]) ids = messages.content.split(",") # content保存的是申请的职位角色 integer_ids = [] ids.each do |role_id| integer_ids << role_id.to_i end if params[:type] == 0 if apply_user.member_of_course?(c) #将角色改为老师或者教辅 member = c.members.where(:user_id=>apply_user.id).all[0] member.role_ids = integer_ids #删除为学生的记录 unless member.role_ids.include?(10) joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,c.id) joined.each do |join| join.destroy end end member.course_group_id = 0 member.save CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false,:content=> messages.content,:course_message_id=>current_user.id,:course_message_type=>'CourseRequestDealResult',:status=>1) messages.update_attributes(:status=>1,:viewed=>1) else members = [] members << Member.new(:role_ids => integer_ids, :user_id => apply_user.id) c.members << members CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false,:content=> messages.content,:course_message_id=>current_user.id,:course_message_type=>'CourseRequestDealResult',:status=>1) messages.update_attributes(:status=>1,:viewed=>1) end if integer_ids.include?(9) message = "您已同意教师"+apply_user.show_name+",加入班级" send_wechat_join_class_notice apply_user,c,9,0 else message = "您已同意助教"+apply_user.show_name+",加入班级" send_wechat_join_class_notice apply_user,c,7,0 end else CourseMessage.create(:user_id => apply_user.id, :course_id => c.id, :viewed => false,:content=> messages.content,:course_message_id=>current_user.id,:course_message_type=>'CourseRequestDealResult',:status=>2) messages.update_attributes(:status=>2,:viewed=>1) if integer_ids.include?(9) message = "您已拒绝教师"+apply_user.show_name+",加入班级" send_wechat_join_class_notice apply_user,c,9,1 else message = "您已拒绝助教"+apply_user.show_name+",加入班级" send_wechat_join_class_notice apply_user,c,7,1 end end status = 0 else message = "该申请不存在或已被处理" end else message = "该班级不存在或已被删除" end {:status => status,:message => message} end #获取用户的工作单位 def get_user_work_unit user work_unit = "" if user.user_extensions.identity == 0 || user.user_extensions.identity == 1 work_unit = user.user_extensions.school.name unless user.user_extensions.school.nil? elsif user.user_extensions.identity == 3 work_unit = user.user_extensions.occupation elsif user.user_extensions.identity == 2 work_unit = user.firstname end work_unit end #获取用户地区 def get_user_location user location = "" location << (user.user_extensions.location || '') location << (user.user_extensions.location_city || '') location end #课程通知列表 def course_news_list params,current_user if params[:course_id] && @course==nil @course = Course.find(params[:course_id]) end if current_user.nil? || !(current_user.admin? || @course.is_public == 1 || (@course.is_public == 0 && current_user.member_of_course?(@course))) raise '403' end scope = @course ? @course.news.order("news.created_on desc").course_visible(current_user) : News.order("news.created_on desc").course_visible(current_user) news = [] scope.each do |n| news << {:id => n.id,:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :author=>n.author, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count} end news end #查看新闻权限验证 def show_course_news_authorize(current_user) unless current_user.allowed_to?({:controller => 'news', :action => 'show'}, false) raise '403' end end #显示课程通知(包括评论) 需验证权限 def show_course_news params,current_user @news = News.find(params[:id]) @course = @news.course if @course if current_user.nil? || !(current_user.admin? || @course.is_public == 1 || (@course.is_public == 0 && current_user.member_of_course?(@course))) raise '403' end end @comments = @news.comments.reorder("created_on desc") @comments.reverse! if current_user.wants_comments_in_reverse_order? {:news => @news,:comments => @comments} #comments = [] #@comments.each do |comment| # comments << {:author_id => comment.author_id,:author_name => comment.author.name,:commont_content => comment.comments,:time => format_time(comment.created_on)} #end #{:title => @news.title,:author_name => @news.author.name,:author_id => @news.author.id, :description => @news.description,:created_on => format_time(@news.created_on), # :comments_count => @news.comments_count,:comments => comments} end #显示课程 def show_course(params,current_user) course = Course.find(params[:id]) course.generate_invite_code course.generate_qrcode if course.school work_unit = course.school.name else work_unit = get_user_work_unit course.teacher end # unless (course.is_public == 1 || current_user.member_of_course?(course) || current_user.admin?) # raise '403' # end groupnum = 0 groupnum = course.course_groups.length if course.course_groups {:course => course,:syllabus_title => course.syllabus.nil? ? "":course.syllabus.title ,:work_unit => work_unit, :img_url => "/images/"+url_to_avatar(course),:current_user_is_member => current_user.nil? ? false : current_user.member_of_course?(course),:current_user_is_teacher => current_user.nil? ? false : is_course_teacher(current_user,course),:course_student_num => course ? course.student.count.to_s : 0,:groupnum => groupnum} end #创建课程 #current_user当前用户对象(不是id) # params[:course][:name]:课程名称 #params[:course][:password]:密码 #params[:course][:description]:描述 #params[:course][:is_public]:是否公开1公开,0私有 #params[:course][:open_student]:是否公开学生列表1公开,0不公开,不公开时非课程成员无法看到学生列表 #params[:course][:course_type]:暂时默认给1值。 #params[:term]:学期(秋季学期或春季学期) #params[:time]: 年份(例:2014) #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 @course.extra = 'course' + DateTime.parse(Time.now.to_s).strftime('%Y-%m-%d_%H-%M-%S').to_s @course.send(:safe_attributes=, params[:course], current_user) #@course.safe_attributes(current_user,params[:course]) #@course.password = params[:course][:password] @course.tea_id = current_user.id @course.syllabus_id = params[:syllabus_id].to_i @course.term = params[:term] @course.time = params[:time] @course.end_term = params[:end_term] @course.end_time = params[:end_time] #@course.school_id = params[:occupation] @course.school_id = current_user.user_extensions.school_id @course.setup_time = params[:setup_time] @course.endup_time = params[:endup_time] @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 @issue_custom_fields = IssueCustomField.sorted.all @trackers = Tracker.sorted.all if @course && @course.save #unless User.current.admin? r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first m = Member.new(:user => current_user, :roles => [r]) m.project_id = -1 course = CourseInfos.new(:user_id => current_user.id, :course_id => @course.id) #user_grades = UserGrade.create(:user_id => User.current.id, :course_id => @course.id) if params[:course][:is_public] == '1' course_status = CourseStatus.create(:course_id => @course.id, :watchers_count => 0, :changesets_count => 0, :grade => 0, :course_type => @course_tag) end @course.members << m @course.course_infos << course end {:course => @course,:img_url => url_to_avatar(@course),:current_user_is_member => current_user.member_of_course?(@course),:current_user_is_teacher => is_course_teacher(current_user,@course)} end #验证编辑课程的权限 #当前 def edit_course_authorize(current_user,course) unless current_user.allowed_to?({:controller => 'courses', :action => 'update'}, course) raise '403' end end #编辑课程 需验证权限 # params[:course][:name]:课程名称 #params[:course][:password]:密码 #params[:course][:description]:描述 #params[:course][:is_public]:是否公开1公开,0私有 #params[:course][:open_student]:是否公开学生列表1公开,0不公开,不公开时非课程成员无法看到学生列表 #params[:course][:course_type]:暂时默认给1值。 #params[:term]:学期(秋季学期或春季学期) #params[:time]: 年份(例:2014) #params[:class_period]:学时总数 #params[:publish_resource] 允许学生上传资源 0 不允许 1 允许 def edit_course(params,course,current_user) course.send(:safe_attributes=, params[:course], current_user) #course.safe_attributes = params[:course] #course.password = params[:course][:password] #course.syllabus_id = params[:syllabus_id].to_i course.time = params[:time] course.term = params[:term] course.end_time = params[:end_time] course.end_term = params[:end_term] 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 if course.save if params[:course][:is_public] == '0' course_status = CourseStatus.find_by_course_id(course.id) course_status.destroy if course_status elsif params[:course][:is_public] == '1' course_status = CourseStatus.find_by_course_id(course.id) course_status.destroy if course_status course_status = CourseStatus.create(:course_id => course.id, :grade => 0) end end {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)} end #退出课程 #object_id: 课程id #user:当前用户 #@state == 0 退出成功 #@state == 1 不在课程中 #@state == 2 您还未登录 #@state 其他 未知错误,请稍后再试 def exit_course params,user if user.nil? @state = 2 return @state end @member = Member.where('course_id = ? and user_id = ?', params[:object_id], user.id).first if @member.nil? @state = 1 return @state end student_role = @member.member_roles.where("role_id = 10").first teacher_role = @member.member_roles.where("role_id = 7 || role_id = 9").first if @member.member_roles.count > 1 && student_role && teacher_role student_role.destroy teacher_role.update_attribute("is_current", 1) @member.update_attribute("course_group_id", 0) else @member.destroy end joined = StudentsForCourse.where('student_id = ? and course_id = ?', user.id, params[:object_id]) joined.each do |join| join.destroy end @state = 0 @state end class JoinCourseError < Errors define_error [ 0, '加入成功', 1, '密码错误', 2, '班级已过期 请联系班级管理员重启班级。', 3, '您已经是该班级的成员了', 4, '您的邀请码不正确', 5, '您还未登录', 6, '您的申请已提交,请等待管理员审批', 7, '您已经发送过申请了,请耐心等待', 8, '您已经是该班级的教师了', 9, '您已经是该班级的教辅了', 10, '您已经是该班级的管理员了', 11, '该班级不存在或已被删除啦', 12, '您已经发送过申请了,请耐心等待', 13, '您的申请已提交,请等待管理员审批', '未知错误,请稍后再试' ] end #加入课程 #object_id:课程id #course_password :加入课程的密码 def join_course params,current_user course = Course.find_by_invite_code(params[:invite_code]) if params[:invite_code] @state = 10 if course if course_endTime_timeout? course @state = 2 elsif course[:is_delete] == 1 @state = 11 else if current_user.member_of_course?(course) #如果已经是成员 member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0] roleName = member.roles[0].name if member if params[:invite_code].present? #如果加入角色为学生 并且当前是学生 if roleName == "Student" @state = 3 #如果加入的角色为老师,并且当前已经是老师 elsif roleName == "Teacher" @state = 8 #如果加入的角色教辅并且当前为教辅 elsif roleName == "TeachingAsistant" @state = 9 elsif roleName == "Manager" @state = 10 end else @state = 1 end else if params[:invite_code].present? members = [] members << Member.new(:role_ids => [10], :user_id => current_user.id) course.members << members StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id) @state = 0 else @state = 1 end end end else @state = 4 end {:state => @state,:course => course} end #加入班级结果 def send_wechat_join_class_notice user,course,role_id,result count = ShieldWechatMessage.where("container_type='User' and container_id=#{user.id} and shield_type='Course' and shield_id=#{course.id}").count if count == 0 ws = WechatService.new role_name = role_id == 7 ? "助教" : role_id == 9 ? "教师" : "学生" result_name = result == 0 ? "通过" : "被拒绝" content = "您以"+role_name+"身份加入班级的申请已"+result_name+"。" if result == 0 title = "恭喜您加入班级成功。" remark = "点击查看班级详情。" uid = 0 type = "class" else title = "很遗憾您未能成功加入班级。" remark = "点击查看申请详情。" uid = user.id type = "review_class_member" end name = course.syllabus.nil? ? course.name : course.syllabus.title+" • "+course.name ws = WechatService.new ws.class_notice user.id, type, course.id, title,name, user.show_name, format_time(Time.now), content, remark,uid end end #多个角色加入课程 def join_course_roles params,current_user course = Course.find_by_invite_code(params[:invite_code]) if params[:invite_code] go_coursegroup_flag = 0 course_id = 0 @state = 10 if course if course_endTime_timeout? course @state = 2 elsif course[:is_delete] == 1 @state = 11 elsif course[:invite_code_halt] == 1 @state = 14 else if current_user.member_of_course?(course) #如果已经是成员 @state = 3 # member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0] # role_ids = params[:role] # #roleName = member.roles[0].name if member # #roleName = member.roles.map{|role| role.name}.join(",") if member # if params[:invite_code].present? # #如果加入角色为学生 并且当前是学生 # if role_ids == "10" && roleName.include?("Student") && !roleName.include?("Teacher") && !roleName.include?("TeachingAsistant")&& !roleName.include?("Manager") # @state = 3 # #如果加入的角色为老师,并且当前已经是老师 # elsif role_ids == "9" && roleName.include?("Teacher") && !roleName.include?("Student") # @state = 8 # #如果加入的角色教辅并且当前为教辅 # elsif role_ids == "7" && roleName.include?("TeachingAsistant") && !roleName.include?("Student") # @state = 9 # elsif roleName.include?("Manager") # @state = 10 # #如果加入角色为教师或者教辅,并且当前是学生,或者是要成为教辅,当前不是教辅,或者要成为教师,当前不是教师。那么要发送请求 # elsif (params[:role] != "10" && roleName == "Student") || (params[:role] == "7" && roleName != "TeachingAsistant" ) || (params[:role] == "9" && roleName != "Teacher" ) # #如果已经发送过消息了,那么就要给个提示 # if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = #{params[:role]} and course_message_id = #{User.current.id} and course_id = #{course.id} and status = 0 ").count != 0 # @state = 7 # else # Mailer.run.join_course_request(course, User.current, params[:role]) # CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false,:content=> params[:role],:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest',:status=>0) # @state = 6 # end # #如果加入角色是学生,但是是当前课程的教师或者教辅 # elsif params[:role] == "10" && roleName != "Student" # member.role_ids = [params[:role]] # member.save # StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id) # @state = 0 # end # else # @state = 1 # end else if params[:invite_code].present? role_ids = params[:role] role_str = role_ids.join(",") if role_ids.include?("10") && !role_ids.include?("7") && !role_ids.include?("9") members = [] members << Member.new(:role_ids => [10], :user_id => current_user.id) course.members << members StudentsForCourse.create(:student_id => current_user.id, :course_id => course.id) @state = 0 go_coursegroup_flag = 1 if course.course_groups course_id = course.id send_wechat_join_class_notice current_user,course,10,0 else is_stu = false if role_ids.include?("10") members = [] members << Member.new(:role_ids => [10], :user_id => current_user.id) course.members << members StudentsForCourse.create(:student_id => current_user.id, :course_id =>course.id) is_stu = true go_coursegroup_flag = 1 if course.course_groups course_id = course.id send_wechat_join_class_notice current_user,course,10,0 end #如果已经发送过消息了,那么就要给个提示 if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = '#{role_str}' and course_message_id = #{current_user.id} and course_id = #{course.id} and status = 0").count != 0 if is_stu @state = 12 else @state = 7 end else # Mailer.run.join_course_request(course, current_user, params[:role]) CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false,:content=> role_str,:course_message_id=>current_user.id,:course_message_type=>'JoinCourseRequest',:status=>0) #----------------微信通知---------------------- if role_ids.include?("7") || role_ids.include?("9") tea_user = User.find(course.tea_id) count = ShieldWechatMessage.where("container_type='User' and container_id=#{tea_user.id} and shield_type='Course' and shield_id=#{course.id}").count if count == 0 rolename = role_ids.include?("7") ? "助教" : "教师" content = current_user.show_name + "申请以"+rolename+"身份加入班级,等待您的审批。" name = course.syllabus.nil? ? course.name : course.syllabus.title+" • "+course.name ws = WechatService.new ws.class_notice tea_user.id, "review_class_member", course.id, "班级成员审批通知。", name, tea_user.show_name, format_time(Time.now), content, "点击查看申请详情。",current_user.id end end #-------------------------------------------- if is_stu @state = 13 else @state = 6 end end end else @state = 1 end end end else @state = 4 end {:state => @state,:course => course,:go_coursegroup_flag => go_coursegroup_flag,:course_id=>course_id} end #作业列表 #已提交的作业数量获取 bid.homeworks.count #学生提问数量获取 bid.commit.nil? ? 0 : bid.commit def homework_list params,current_user course = Course.find(params[:id]) if course.is_public != 0 || current_user.member_of_course?(course) bids = course.homework_commons.where("publish_time <= ?",Time.now.strftime("%Y-%m-%d")).page(params[:page] || 1).per(20).reorder('created_at DESC') bids = bids.like(params[:name]) if params[:name].present? homeworks = [] bids.each do |bid| homeworks << show_homework_info(course,bid,current_user,is_course_teacher(current_user,course)) end homeworks else raise '403' end end def course_dynamic(params,current_user) @user = User.find(params[:id]) if current_user.nil? && !current_user.admin? && !@user.active? raise '404' return end if current_user == @user || current_user.admin? membership = @user.coursememberships.all else membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user)) end if membership.nil? || membership.count == 0 raise l(:label_no_courses,:locale => get_user_language(current_user)) end membership.sort! {|older, newer| newer.created_on <=> older.created_on } result = [] membership.each do |mp| course = mp.course latest_course_dynamics = [] latest_news = course.news.order("created_on desc").first unless latest_news.nil? latest_course_dynamics << {:type => 1,:time => latest_news.created_on, :message =>latest_news.author.realname<< l(:label_recently_updated_notification,:locale => get_user_language(current_user))<<":"<< latest_news.title } end latest_message = course.journals_for_messages.order("created_on desc").first unless latest_message.nil? latest_course_dynamics << {:type => 2,:time => latest_message.created_on,:message =>latest_message.user.realname << l(:label_recently_updated_message,:locale => get_user_language(current_user))<<":"< 3,:time => latest_attachment.created_on,:message =>latest_attachment.author.realname<< l(:label_recently_updated_courseware,:locale => get_user_language(current_user))<<":"< 4,:time => latest_bid.updated_at,:message => latest_bid.user.realname< get_user_language(current_user))<<":"< 5,:time => course.created_at,:message =>l(:label_recently,:locale => get_user_language(current_user)) << create_user_name << l(:label_creat,:locale => get_user_language(current_user))} end #每个作业中的最新留言 # messages = [] # course.homework_commons.each do |hc| # jour = hc.journals_for_messages.order("created_on desc").first # unless jour.nil? # messages << jour # end # end # unless messages.count == 0 # messages.sort!{|order,newer| newer.created_on <=> order.created_on} # end # latest_bid_message = messages.first # unless latest_bid_message.nil? # latest_course_dynamics << {:type => 4,:time => latest_bid_message.created_on,:message => l(:label_recently_updated_message,:locale => get_user_language(current_user))} # end #每个作业中学生最后提交的作业 homeworks = [] course.homework_commons.each do |bid| homework_attach = bid.student_works.order('updated_at DESC').first unless homework_attach.nil? homeworks << homework_attach end end unless homeworks.count == 0 homeworks.sort!{|order,newer| newer.updated_at <=> order.updated_at} end latest_homework_attach = homeworks.first unless latest_homework_attach.nil? latest_course_dynamics << {:type => 4,:time => latest_homework_attach.updated_at,:message =>latest_homework_attach.user.realname<< l(:label_recently_updated_homework,:locale => get_user_language(current_user))<<":"<<(latest_homework_attach.name.nil? ? latest_homework_attach.description : latest_homework_attach.name)} end latest_course_dynamics.sort!{|order,newer| newer[:time] <=> order[:time]} latest_course_dynamic = latest_course_dynamics.first unless latest_course_dynamic.nil? result << {:course_name => course.name,:course_id => course.id,:course_img_url => url_to_avatar(course),:course_time => course.time,:course_term => course.term,:type => latest_course_dynamic[:type],:update_time => latest_course_dynamic[:time],:message => latest_course_dynamic[:message],:count => nil} end end result.sort!{|order,newer| newer[:update_time] <=> order[:update_time]} result end # 课程课件 def course_attachments params result = [] course = Course.find(params[:course_id]) attachments = course.attachments.where("is_publish = 1").reorder("created_on desc") if !params[:name].nil? && params[:name] != "" attachments.each do |atta| result << atta if atta.filename.include?(params[:name]) end else result = attachments end result end # 课程学生列表 def course_members params @all_members = searchmember_by_name(student_homework_score(0,params[:course_id], 10,"desc"),params[:name]) end def show_member_score params @member_score = Member.find(params[:member_id]) if params[:member_id] atta = @member_score.student_homework_score[0] result = [] atta.each do |t| if !params[:homeworkName].nil? && params[:homeworkName] != "" result << {:name=>t[:name],:score=>t[:score]} if t[:name].include?(params[:homeworkName]) else result << {:name=>t[:name],:score=>t[:score]} end end result end # 设置人员为课程教辅 def set_as_assitant_teacher params members = [] #找到课程 course = Course.find(params[:course_id]) #新建课程人员 member = Member.new(:role_ids =>[7], :user_id => params[:user_id],:course_id=>params[:course_id]) joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,course.id) joined.each do |join| join.destroy end member.course_group_id = 0 members << member course.members << members #将课程人员设置为教辅 end def del_assitant_teacher params member = Member.where("user_id = ? and course_id = ?",params[:user_id],params[:course_id]) member.each do |m| m.destroy end user_admin = CourseInfos.where("user_id = ? and course_id = ?",params[:user_id], params[:course_id]) if user_admin.size > 0 user_admin.each do |user| user.destroy end end joined = StudentsForCourse.where('student_id = ? and course_id = ?', params[:user_id],params[:course_id]) joined.each do |join| join.destroy end end def create_course_notice params ,current_user n = News.new(:course_id =>params[:course_id], :author_id => current_user.id,:title =>params[:title],:description=> params[:desc]) n.save {:id => n.id,:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count} end private def searchmember_by_name members, name #searchPeopleByRoles(project, StudentRoles) mems = [] if name != "" name = name.to_s.downcase members.each do |m| username = m.user[:lastname].to_s.downcase + m.user[:firstname].to_s.downcase if(m.user[:login].to_s.downcase.include?(name) || m.user.user_extensions[:student_id].to_s.downcase.include?(name) || username.include?(name)) mems << m end end else mems = members end mems end def show_homework_info course,bid,current_user,is_course_teacher author_real_name = bid.user.lastname + bid.user.firstname many_times = course.homework_commons.index(bid) + 1 name = bid.name homework_count = bid.student_works.count #已提交的作业数量 #student_questions_count = bid.journals_for_messages.where('m_parent_id IS NULL').count description = bid.description #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2 #state = bid.homework_detail_manual.comment_status if !bid.nil? if bid.homework_type == 1 && bid.homework_detail_manual case bid.homework_detail_manual.comment_status when 1 state = show_homework_deadline bid when 2 state = "正在匿评中" when 3 state = "匿评已结束" end elsif bid.homework_type == 0 state = "未启用匿评" elsif bid.homework_type == 2 state = "编程作业" else end end # studentlist = [] # bid.student_works.order("created_at desc").page(1).per(6).each do |work| # studentlist << work.user # end # unless is_course_teacher # homework_for_anonymous_comments = get_student_batch_homework_list bid,current_user # end #end open_anonymous_evaluation = bid.homework_detail_manual.comment_status {:course_name => course.name,:course_id => course.id,:id => bid.id, :author => bid.user,:author_real_name => author_real_name, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => 0, :description => description, :homework_state => state, :open_anonymous_evaluation => open_anonymous_evaluation, #:homework_for_anonymous_comments => homework_for_anonymous_comments, :created_on => bid.created_at,:deadline => bid.end_time, :homework_notsubmit_num => bid.course.members.count - bid.student_works.count, :homework_submit_num => bid.student_works.count, :homework_status_student => get_homework_status( bid),:homework_status_teacher => homework_status_desc( bid), :student_evaluation_part => get_evaluation_part( bid ,3), :ta_evaluation_part => get_evaluation_part( bid ,2),:homework_anony_type => bid.homework_type == 1 && !bid.homework_detail_manual.nil?,:current_user_is_teacher => is_course_teacher} end #显示作业列表的同时显示分配给当前学生匿评的作业 def show_homework_info_with_batch course,bid author = bid.author.lastname + bid.author.firstname many_times = course.homeworks.index(bid) + 1 name = bid.name homework_count = bid.homeworks.count #已提交的作业数量 student_questions_count = bid.journals_for_messages.where('m_parent_id IS NULL').count description = bid.description #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2 state = bid.comment_status #end open_anonymous_evaluation = bid.open_anonymous_evaluation {:course_name => course.name,:id => bid.id, :course_teacher => author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count, :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation} end def student_homework_score(groupid,course_id, nums, score_sort_by, sort_type = 'score') sql_select = "" if groupid == 0 sql_select = "SELECT members.*,( SELECT SUM(student_works.work_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,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{course_id} AND ccs.user_id = members.user_id ) AS act_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 #{sort_type} #{score_sort_by}" else sql_select = "SELECT members.*,( SELECT SUM(student_works.work_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,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 + resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{course_id} AND ccs.user_id = members.user_id ) AS act_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} AND members.course_group_id = #{groupid} ORDER BY #{sort_type} #{score_sort_by}" end sql = ActiveRecord::Base.connection() homework_scores = Member.find_by_sql(sql_select) sql.close() homework_scores end #app新版api # # #课程动态 public def all_course_dynamics params, current_user #获取当前用户的所有课程 @user = User.find(params[:id]) if current_user.nil? && !current_user.admin? && !@user.active? raise '404' return end if current_user == @user || current_user.admin? membership = @user.coursememberships else membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user)) end if membership.nil? || membership.count == 0 raise l(:label_no_courses, :locale => get_user_language(current_user)) end #membership.sort! { |older, newer| newer.created_on <=> older.created_on } #定义一个数组集合,存放hash数组,该hash数组包括课程的信息,并包含课程的最新发布的资源,最新的讨论区留言,最新的作业,最新的通知 result = [] #对用户所有的课程进行循环,找到每个课程最新发布的资源,最新的讨论区留言,最新的作业,最新的通知,并存进数组 membership.each do |mp| course = mp.course latest_course_dynamics = [] notices_count = 0 topic_count = 0 topics = nil homeworkss = nil notices = nil # 课程通知 latest_news = course.news.page(1).per(2).order("created_on desc") unless latest_news.first.nil? notices_count = course.news.count notices = latest_news.all latest_course_dynamics << {:time => latest_news.first.created_on } end # 课程讨论区 latest_message = course.boards.first.topics.page(1).per(2) unless latest_message.first.nil? topic_count = course.boards.nil? ? 0 : course.boards.first.topics.count topics = latest_message.all latest_course_dynamics << {:time => latest_message.first.created_on} end # 课程资源 # latest_attachment = course.attachments.order("created_on desc").page(1).per(2) # unless latest_attachment.first.nil? # latest_course_dynamics << {:type => 3, :time => latest_attachment.first.created_on,:count =>course.attachments.count , :documents=>latest_attachment} # dynamics_count += 1 # end #课程作业 已经交的学生列表(暂定显示6人),未交的学生列表,作业的状态 homeworks = course.homework_commons.page(1).per(2).order('created_at desc') unless homeworks.first.nil? homeworkss = homeworks latest_course_dynamics << {:time => homeworks.first.updated_at} end latest_course_dynamics.sort! { |order, newer| newer[:time] <=> order[:time] } # 课程学霸 学生总分数排名靠前的5个人 homework_count = course.homework_commons.count sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" << " where homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{course.id}) GROUP BY student_works.user_id ORDER BY score desc limit 0,4" better_students = User.find_by_sql(sql) # 找出在课程讨论区发帖回帖数最多的 active_students = [] sql1 = " select users.*,count(author_id)*2 active_count from messages " << " LEFT JOIN users on messages.author_id = users.id " << " where messages.board_id in (select id from boards where boards.course_id = #{course.id} ) " << " GROUP BY messages.author_id ORDER BY count(author_id) desc " << " limit 0,4" active_students = User.find_by_sql(sql1) if homework_count != 0 && !better_students.empty? latest_course_dynamics <<{:time=>"1970-01-01 0:0:0 +0800"} end unless active_students.empty? latest_course_dynamics <<{:time=>"1970-01-01 0:0:0 +0800"} end latest_course_dynamic = latest_course_dynamics.first unless latest_course_dynamic.nil? result << {:course_name => course.name, :current_user_is_member => current_user.member_of_course?(course), :current_user_is_teacher => is_course_teacher(current_user,course), :course_id => course.id, :course_img_url => url_to_avatar(course), :course_time => course.time, :course_term => course.term, :news_count => notices_count, :homework_count => homework_count, :topic_count => topic_count, :news => notices, :homeworks => homeworkss, :topics => topics, :better_students => better_students, :active_students => active_students, :message => "", :course_student_num=>course ? course.members.count : 0, #:time_from_now=> distance_of_time_in_words(Time.now, latest_course_dynamic[:time].to_time) << "前", :time_from_now=>time_from_now(latest_course_dynamic[:time].to_time), #.strftime('%Y-%m-%d %H:%M:%S').to_s, :time=>latest_course_dynamic[:time].to_time} end end #返回数组集合 result.sort! { |order, newer| newer[:time] <=> order[:time] } result end # 获取课程历次作业的学生总成绩 def students_score_list params,current_user page = (params[:page] || 1) - 1 user_list = [] max_size = 0 if params[:type] == 1 sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" << " where homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) GROUP BY student_works.user_id ORDER BY score desc limit #{page*10},10" sql_count = " select count(distinct(student_works.user_id) ) " << " from student_works left outer join users on student_works.user_id = users.id " << " where homework_common_id in " << " ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) " max_size = ActiveRecord::Base.connection().select_value(sql_count) user_list = User.find_by_sql(sql) else sql1 = " select users.*,count(author_id)*2 active_count from messages " << " LEFT JOIN users on messages.author_id = users.id " << " where messages.board_id in (select id from boards where boards.course_id = #{params[:course_id]} ) " << " GROUP BY messages.author_id ORDER BY count(author_id) desc " << " limit #{page*10},10" sql1_count = " select count(DISTINCT(messages.author_id))" << " from messages LEFT JOIN users on messages.author_id = users.id " << " where messages.board_id in (select id from boards where boards.course_id = #{params[:course_id]} )" max_size = ActiveRecord::Base.connection().select_value(sql1_count) user_list = User.find_by_sql(sql1) end {:user_list=>user_list,:max_size=>max_size} end # 获取某次作业的所有作业列表 def student_work_list params,current_user is_teacher = current_user.allowed_to?(:as_teacher,Course.find(params[:course_id])) homework = HomeworkCommon.find(params[:homework_id]) student_works = [] #老师 || 非匿评作业 || 匿评结束 显示所有的作品 show_all = is_teacher || homework.homework_type != 1 || homework.homework_detail_manual.comment_status == 3 if show_all if homework.homework_type == 1 || is_teacher || current_user.admin? student_works = homework.student_works.page(params[:page] || 1).per(10).order("final_score desc ") else my_work = homework.student_works.where(:user_id => current_user.id) if my_work.empty? student_works = [] else student_works = homework.student_works.page(params[:page] || 1).per(10).order("final_score desc") end end else #学生 if homework.homework_detail_manual.comment_status == 1 #未开启匿评,只显示我的作品 student_works = homework.student_works.where(:user_id => current_user.id).page(params[:page] || 1).per(10) elsif homework.homework_detail_manual.comment_status == 2 #匿评列表,显示匿评作品和我的作品 #is_evaluation = true my_work = homework.student_works.where(:user_id => current_user.id).page(params[:page] || 1).per(10) student_works = my_work + current_user.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == homework.id} end end student_works end # 获取课程的讨论区信息 def board_message_list params,current_user # 课程讨论区 course = Course.find(params[:course_id]) latest_message = course.boards.first.topics.page(params[:page] || 1).per(10) end #获取回复列表 def board_message_reply_list params,current_user board = Board.find(params[:board_id]) reply_list = board.topics.where("id = #{params[:msg_id]}").first.children.order("created_on desc").page(params[:page] || 1).per(10) end #回复讨论区 def board_message_reply params,current_user author = Message.find(params[:parent_id]).author quote = "
" << author.realname << "(" << author.nickname << ")写到:
" << params[:quote] <<"
" reply = Message.new reply.author = current_user reply.board = Board.find(params[:board_id]) params[:reply] = {} params[:reply][:subject] = params[:subject] #本回复标题 params[:reply][:content] = params[:content] #本回复内容 params[:reply][:quote] = {} params[:reply][:quote][:quote] = params[:quote] #本回复引用的内容,也是父id内容 params[:reply][:parent_topic] = params[:parent_id] # 父id params[:reply][:board_id] = params[:board_id] #讨论区id params[:reply][:id] = params[:root_id] #根id reply.safe_attributes = params[:reply] if params[:root_id] == params[:parent_id] reply.content = reply.content else reply.content = quote + reply.content end Message.find(params[:root_id]).children << reply reply end # # 开启匿评 # #statue 1:启动成功,2:启动失败,作业总数大于等于2份时才能启动匿评,3:已开启匿评,请务重复开启,4:没有开启匿评的权限 # def start_anonymous_comment params,current_user # homework = HomeworkCommon.find(params[:homework_id]) # return {:status=>4} unless current_user.admin? || current_user.allowed_to?(:as_teacher,Course.find(params[:course_id])) # return {:status=>5} if Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") # homework_detail_manual = homework.homework_detail_manual # if homework_detail_manual.comment_status == 1 # student_works = homework.student_works # if student_works && student_works.size >=2 # student_works.each_with_index do |work, index| # user = work.user # n = homework_detail_manual.evaluation_num # n = n < student_works.size ? n : student_works.size - 1 # assigned_homeworks = get_assigned_homeworks(student_works, n, index) # assigned_homeworks.each do |h| # student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: user.id, student_work_id: h.id) # student_works_evaluation_distributions.save # end # end # homework_detail_manual.update_column('comment_status', 2) # statue = 1 # else # statue = 2 # end # else # statue = 3 # end # {:status => statue} # end # # def get_assigned_homeworks(student_works, n, index) # student_works += student_works # student_works[index + 1 .. index + n] # end #修改班级成员角色 def modify_user_course_role params,roles_id status = -1 c = Course.find("#{params[:id]}") # member = c.member_principals.includes(:roles, :principal).where("user_id=?",params[:user_id]).first member = c.members.where("user_id=?",params[:user_id]).first if member member.role_ids = roles_id role = Role.find(roles_id[0]) # 这里的判断只能通过角色名,可以弄成常量 if roles_id && roles_id.include?(10) StudentsForCourse.create(:student_id => params[:user_id], :course_id =>params[:id]) else joined = StudentsForCourse.where('student_id = ? and course_id = ?', params[:user_id],params[:id]) joined.each do |join| join.destroy end member.course_group_id = 0 end if role.allowed_to?(:is_manager) courseInfo = CourseInfos.new(:user_id => params[:user_id], :course_id => params[:id]) courseInfo.save else user_admin = CourseInfos.where("user_id = ? and course_id = ?", params[:user_id], params[:id]) if user_admin.size > 0 user_admin.each do |user| user.destroy end end end Role.givable.all[3..5] if member.save status = 0 end end status end #删除班级成员 def delete_course_member course,user_id,current_user if current_user.nil? state = -1 return state end member = course.members.where("user_id=?",user_id).first if member != nil member.destroy user_admin = CourseInfos.where("user_id = ? and course_id = ?", member.user_id, course.id) if user_admin.size > 0 user_admin.each do |user| user.destroy end end joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,course.id) joined.each do |join| join.destroy end roles = Role.givable.all[3..5] #移出课程发送消息 CourseMessage.create(:user_id => member.user_id, :course_id => course.id, :course_message_type => "RemoveFromCourse", :viewed => false, :course_message_id => current_user.id) return 0 else return 1 end end end