387 lines
14 KiB
Ruby
387 lines
14 KiB
Ruby
# encoding: utf-8
|
||
## This helper be included in applicationHelper
|
||
module CoursesHelper
|
||
=begin
|
||
1. define TeacherRoles, StudentRoles
|
||
2. define count function
|
||
3. define search by roles
|
||
4. define search member function
|
||
=end
|
||
TeacherRoles = [3, 4, 7, 9]
|
||
StudentRoles = [5, 10]
|
||
AllPeople = StudentRoles+TeacherRoles
|
||
## return people count
|
||
|
||
# 返回x项目成员数量,即roles表中定义的所有成员
|
||
def projectCount project
|
||
searchCountByRoles project, AllPeople
|
||
end
|
||
|
||
# 返回教师数量,即roles表中定义的Manager
|
||
def teacherCount project
|
||
searchCountByRoles project, TeacherRoles
|
||
# or
|
||
# searchTeacherAndAssistant(project).count
|
||
end
|
||
|
||
# 返回学生数量,即roles表中定义的Reporter
|
||
def studentCount project
|
||
searchCountByRoles project,StudentRoles
|
||
# or
|
||
# searchStudent(project).count
|
||
end
|
||
|
||
# 判断用户是否是课程的管理员
|
||
# add by nwb
|
||
def is_course_manager?(user_id,course_id)
|
||
@result = false
|
||
@user_id = CourseInfo.find_by_course_id(course_id)
|
||
if @user_id == user.id
|
||
@result = true
|
||
end
|
||
return @result
|
||
end
|
||
|
||
# 返回课程设置界面
|
||
def course_settings_tabs
|
||
tabs = [{:name => 'info', :action => :edit_course, :partial => 'courses/edit', :label => :label_information_plural},
|
||
{:name => 'members', :action => :manage_members, :partial => 'courses/settings/members', :label => :label_member_plural}
|
||
]
|
||
tabs.select { |tab| User.current.allowed_to?(tab[:action], @course) }
|
||
|
||
end
|
||
|
||
#是否启动互评下拉框
|
||
def is_evaluation_option
|
||
type = []
|
||
option1 = []
|
||
option2 = []
|
||
option1 << l(:lable_start_mutual_evaluation)
|
||
option1 << 1
|
||
option2 << l(:lable_close_mutual_evaluation)
|
||
option2 << 2
|
||
type << option1
|
||
type << option2
|
||
end
|
||
|
||
# garble count 混淆数量
|
||
# alias projectCountOrigin projectCount
|
||
# def projectCount project
|
||
# count = projectCountOrigin project
|
||
# garble count
|
||
# end
|
||
|
||
def homework_type_option
|
||
type = []
|
||
option1 = []
|
||
option2 = []
|
||
option1 << l(:label_task_submit_form_accessory)
|
||
option1 << 1
|
||
option2 << l(:label_task_submit_form_project)
|
||
option2 << 2
|
||
type << option1
|
||
type << option2
|
||
end
|
||
|
||
def proportion_option
|
||
type = []
|
||
i = 0
|
||
while i <= 100
|
||
option = []
|
||
option << i.to_s + "%"
|
||
option << i
|
||
type << option
|
||
i = i + 10
|
||
end
|
||
type
|
||
end
|
||
|
||
|
||
alias teacherCountOrigin teacherCount
|
||
def teacherCount project
|
||
count = teacherCountOrigin project
|
||
garble count
|
||
end
|
||
|
||
alias studentCountOrigin studentCount
|
||
def studentCount course
|
||
count = studentCountOrigin course
|
||
garble count
|
||
end
|
||
|
||
def eventToLanguageCourse event_type, course
|
||
case event_type
|
||
when "issue-note"
|
||
l :label_issue
|
||
when "issue"
|
||
l :label_issue
|
||
when "attachment"
|
||
l :label_attachment
|
||
when "news"
|
||
l :label_notification
|
||
else
|
||
""
|
||
end
|
||
end
|
||
|
||
def garble count
|
||
count = count.round( 1-count.to_s.size ).to_i
|
||
return count.to_s if count.to_s.size.eql?(1)
|
||
count.to_s << '+'
|
||
end
|
||
|
||
# =====================================================================================
|
||
# return people list
|
||
def searchTeacherAndAssistant project
|
||
searchPeopleByRoles(project, TeacherRoles)
|
||
end
|
||
|
||
def searchStudent project
|
||
searchPeopleByRoles(project, StudentRoles)
|
||
end
|
||
# =====================================================================================
|
||
|
||
def searchCountByRoles project, roles_id
|
||
members = searchPeopleByRoles project, roles_id
|
||
members.count
|
||
end
|
||
|
||
def searchPeopleByRoles project, roles_id
|
||
members = []
|
||
begin
|
||
members = project.members.joins(:member_roles).where("member_roles.role_id IN (:role_id)", {:role_id => roles_id})
|
||
rescue Exception => e
|
||
logger.error "[CoursesHelper] ===> #{e}"
|
||
end
|
||
members
|
||
end
|
||
|
||
def sort_courses(state)
|
||
content = ''.html_safe
|
||
case state
|
||
when 0
|
||
|
||
content << content_tag('li', link_to(l(:label_sort_by_active), courses_path(:courses_sort_type => '1')))
|
||
content << content_tag('li', link_to(l(:label_sort_by_influence), courses_path(:courses_sort_type => '2')))
|
||
content << content_tag('li', link_to(l(:label_sort_by_time), courses_path(:courses_sort_type => '0'), :class=>"selected"), :class=>"selected")
|
||
when 1
|
||
|
||
content << content_tag('li', link_to(l(:label_sort_by_active), courses_path(:courses_sort_type => '1'), :class=>"selected"), :class=>"selected")
|
||
content << content_tag('li', link_to(l(:label_sort_by_influence), courses_path(:courses_sort_type => '2')))
|
||
content << content_tag('li', link_to(l(:label_sort_by_time), courses_path(:courses_sort_type => '0')))
|
||
when 2
|
||
content << content_tag('li', link_to(l(:label_sort_by_active), courses_path(:courses_sort_type => '1')))
|
||
content << content_tag('li', link_to(l(:label_sort_by_influence), courses_path(:courses_sort_type => '2'), :class=>"selected"), :class=>"selected")
|
||
content << content_tag('li', link_to(l(:label_sort_by_time), courses_path(:courses_sort_type => '0')))
|
||
end
|
||
content = content_tag('ul', content)
|
||
content_tag('div', content, :class => "tabs")
|
||
end
|
||
|
||
def render_course_hierarchy(courses)
|
||
render_course_nested_lists(courses) do |course|
|
||
s = link_to_course(course, {}, :class => "#{course.css_classes} #{User.current.member_of?(course) ? 'my-course' : nil}").html_safe
|
||
s
|
||
end
|
||
end
|
||
|
||
#useless
|
||
def searchMembersByRole project, role_id
|
||
members = []
|
||
begin
|
||
members = project.members.joins(:member_roles).where("member_roles.role_id = :role_id", {:role_id => role_id })
|
||
rescue Exception => e
|
||
logger.error "[CoursesHelper] ===> #{e}"
|
||
end
|
||
members
|
||
end
|
||
|
||
def sort_course(state, school_id)
|
||
content = ''.html_safe
|
||
case state
|
||
when 0
|
||
content << content_tag('li', link_to(l(:label_sort_by_time), courses_path(:course_sort_type => '0'), :school_id => school_id, :class=>"selected"), :class=>"selected")
|
||
content << content_tag('li', link_to(l(:label_sort_by_active), courses_path(:course_sort_type => '1', :school_id => school_id)))
|
||
content << content_tag('li', link_to(l(:label_sort_by_activity), courses_path(:course_sort_type => '3', :school_id => school_id)))
|
||
|
||
when 1
|
||
content << content_tag('li', link_to(l(:label_sort_by_time), courses_path(:course_sort_type => '0', :school_id => school_id)))
|
||
content << content_tag('li', link_to(l(:label_sort_by_active), courses_path(:course_sort_type => '1', :school_id => school_id), :class=>"selected"), :class=>"selected")
|
||
content << content_tag('li', link_to(l(:label_sort_by_activity), courses_path(:course_sort_type => '3', :school_id => school_id)))
|
||
|
||
when 2
|
||
content << content_tag('li', link_to(l(:label_sort_by_time), courses_path(:course_sort_type => '0', :school_id => school_id)))
|
||
content << content_tag('li', link_to(l(:label_sort_by_active), courses_path(:course_sort_type => '1', :school_id => school_id)))
|
||
content << content_tag('li', link_to(l(:label_sort_by_activity), courses_path(:course_sort_type => '3', :school_id => school_id)))
|
||
|
||
#gcm
|
||
when 3
|
||
content << content_tag('li', link_to(l(:label_sort_by_time), courses_path(:course_sort_type => '0', :school_id => school_id)))
|
||
content << content_tag('li', link_to(l(:label_sort_by_active), courses_path(:course_sort_type => '1', :school_id => school_id)))
|
||
content << content_tag('li', link_to(l(:label_sort_by_activity), courses_path(:course_sort_type => '3', :school_id => school_id), :class=>"selected"), :class=>"selected")
|
||
end
|
||
#gcmend
|
||
|
||
content = content_tag('ul', content)
|
||
content_tag('div', content, :class => "tabs")
|
||
end
|
||
|
||
def findCourseTime project
|
||
str = ""
|
||
begin
|
||
@course = Course.find_by_extra(@project.identifier)
|
||
date_format = l(:zh_date)[:formats][:default]
|
||
if @course
|
||
str = DateTime.parse(@course.setup_time.to_s).strftime("#{date_format}").to_s unless @course.setup_time.blank?
|
||
str << '-' unless @course.setup_time.blank?
|
||
str << DateTime.parse(@course.endup_time.to_s).strftime("#{date_format}").to_s unless @course.endup_time.blank?
|
||
end
|
||
rescue Exception => e
|
||
logger.error "[CoursesHelper] ===> #{e}"
|
||
end
|
||
str
|
||
end
|
||
|
||
# added by nwb
|
||
def get_course_term course
|
||
str = ( course.try(:time).to_s << '.' << course.try(:term).to_s )
|
||
str[0..-4]
|
||
end
|
||
|
||
def members_to_user_ids members
|
||
people = []
|
||
members.each { |member|
|
||
people << member.user_id
|
||
}
|
||
people
|
||
end
|
||
# 截至到2014-03-17 这个是最终的判断课程是否过期的方法
|
||
def course_endTime_timeout? project
|
||
end_time_str = Course.find_by_extra(project.try(:extra)).try(:endup_time)
|
||
begin
|
||
cTime = Time.parse(end_time_str.to_s)
|
||
rescue TypeError,ArgumentError
|
||
cTime = Time.parse("3000-01-01")
|
||
end
|
||
now = Time.now
|
||
|
||
now > cTime
|
||
end
|
||
def find_by_extra_from_project extra
|
||
Course.find_by_extra(try(extra))
|
||
end
|
||
#判断制定用户是不是当前课程的老师
|
||
def is_course_teacher (user,course)
|
||
course.members.joins(:member_roles).where("member_roles.role_id IN (:role_id) and members.user_id = #{user.id}", {:role_id => TeacherRoles}).count != 0
|
||
#修改为根据用户是否有发布任务的权限来判断用户是否是课程的老师
|
||
#is_teacher = false
|
||
#@membership = user.memberships.all(:conditions => Project.visible_condition(User.current))
|
||
#@membership.each do |membership|
|
||
# unless(membership.project.project_type==0)
|
||
# if user.allowed_to?({:controller => "projects", :action => "new_homework"}, membership.project, :global => false)
|
||
# is_teacher = true
|
||
# end
|
||
# end
|
||
#end
|
||
#is_teacher
|
||
end
|
||
#当前用户是不是指定课程的学生
|
||
def is_cur_course_student course
|
||
course.members.joins(:member_roles).where("member_roles.role_id IN (:role_id) and members.user_id = #{User.current.id}", {:role_id => StudentRoles}).count != 0
|
||
#修改:能新建占位且不能新建任务的角色判定为学生
|
||
#is_student = false
|
||
#@membership = User.current.memberships.all(:conditions => Project.visible_condition(User.current))
|
||
#@membership.each do |membership|
|
||
# unless(membership.project.project_type==0)
|
||
# if !User.current.allowed_to?({:controller => "projects", :action => "new_homework"}, membership.project, :global => false) && User.current.allowed_to?({:controller => "homework_attach", :action => "new"}, membership.project, :global => false)
|
||
# is_student = true
|
||
# end
|
||
# end
|
||
#end
|
||
#is_student
|
||
end
|
||
#获取当前用户在指定作业下提交的作业的集合
|
||
def cur_user_homework_for_bid bid
|
||
cur_user_homework = HomeworkAttach.where("user_id = ? and bid_id = ?",User.current,bid.id)
|
||
cur_user_homework
|
||
end
|
||
|
||
#判断当前用户对指定作业是否已经评价过
|
||
def has_evaluation? homework
|
||
seem_count = homework.rates(:quality).where("rater_id = ?",User.current).count
|
||
seem_count > 0
|
||
end
|
||
|
||
#获取指定作业的所有成员
|
||
def users_for_homework homework
|
||
homework.nil? ? [] : (homework.users + [homework.user])
|
||
end
|
||
|
||
#获取指定作业的最终评分
|
||
#最终评分 = 学生评分的平均分 * 0.4 +教师评分 * 0.6
|
||
def score_for_homework homework
|
||
if homework.bid.is_evaluation == 1 || homework.bid.is_evaluation == nil
|
||
return format("%.2f",(homework.bid.proportion * 1.0 / 100) * (teacher_score_for_homework(homework).to_f) + (1 - homework.bid.proportion * 1.0 / 100) * (student_score_for_homework(homework).to_f))
|
||
else
|
||
return teacher_score_for_homework homework
|
||
end
|
||
end
|
||
|
||
#获取作业的互评得分
|
||
def student_score_for_homework homework
|
||
member = searchPeopleByRoles(homework.bid.courses.first,TeacherRoles).first
|
||
student_stars = homework.rates(:quality).where("rater_id <> #{member.user_id}").select("stars")
|
||
student_stars_count = 0
|
||
student_stars.each do |star|
|
||
student_stars_count = student_stars_count + star.stars
|
||
end
|
||
return format("%.2f",student_stars_count / (student_stars.count == 0 ? 1 : student_stars.count))
|
||
end
|
||
|
||
#获取作业的教师评分
|
||
def teacher_score_for_homework homework
|
||
member = searchPeopleByRoles(homework.bid.courses.first,TeacherRoles).first
|
||
teacher_stars = homework.rates(:quality).where("rater_id = #{member.user_id}").select("stars").first
|
||
return format("%.2f",teacher_stars == nil ? 0 : teacher_stars.stars)
|
||
end
|
||
|
||
#获取指定项目的得分
|
||
def project_score project
|
||
issue_count = project.issues.count
|
||
issue_journal_count = project.issue_changes.count
|
||
issue_score = issue_count * 0.2
|
||
issue_journal_score = issue_journal_count * 0.1
|
||
finall_issue_score = issue_score + issue_journal_score
|
||
new_count = project.news.count
|
||
new_score = new_count * 0.1
|
||
finall_new_score = new_score
|
||
document_count = project.documents.count
|
||
file_score = document_count * 0.1
|
||
finall_file_score = file_score
|
||
changeset_count = project.changesets.count
|
||
code_submit_score = changeset_count * 0.3
|
||
finall_code_submit_score = code_submit_score
|
||
board_message_count = 0
|
||
project.boards.each do |board|
|
||
board_message_count += board.messages_count
|
||
end
|
||
topic_score = board_message_count * 0.1
|
||
#finall_topic_score = topic_score
|
||
finall_project_score = finall_issue_score + finall_new_score + finall_file_score + finall_code_submit_score + topic_score
|
||
format("%.2f",finall_project_score)
|
||
end
|
||
|
||
#获取指定作业的参与人员
|
||
#返回结果:张三、李四、王五
|
||
def homework_user_of_homework homework,is_teacher
|
||
homework_users = ""
|
||
homework.users.each do |user|
|
||
homework_users = homework_users + (is_teacher ? user.realname : user.name)
|
||
if user != homework.users.last
|
||
homework_users = homework_users + "、"
|
||
end
|
||
end
|
||
return homework_users
|
||
end
|
||
end
|