# encoding: utf-8 # # Redmine - project management software # Copyright (C) 2006-2013 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. include AvatarHelper module UsersHelper def users_status_options_for_select(selected) user_count_by_status = User.count(:group => 'status').to_hash options_for_select([[l(:label_all), ''], ["#{l(:status_active)} (#{user_count_by_status[1].to_i})", '1'], ["#{l(:status_registered)} (#{user_count_by_status[2].to_i})", '2'], ["#{l(:status_locked)} (#{user_count_by_status[3].to_i})", '3']], selected.to_s) end def get_resource_type type case type when 'Course' '课程资源' when 'Project' '项目资源' when 'Issue' '缺陷附件' when 'Message' '讨论区附件' when 'Document' '文档附件' when 'News' '通知附件' when 'HomewCommon' '作业附件' when 'StudentWorkScore' '批改附件' when 'Principal' '用户资源' when 'OrgSubfield' '组织资源' end end def get_resource_origin attach type = attach.container_type content = attach.container unless content.nil? case type when 'Course' result = current_time_and_term_resource content when 'Project' result = content.name when 'Issue' result = content.subject when 'Message' result = content.subject when 'News' result = content.title when 'HomewCommon' result = content.name when 'StudentWorkScore' result = content.name when 'Principal' result = content.name when 'OrgSubfield' result = content.name end end end def current_time_and_term_resource course str = "" term = cur_course_term_resource name = course.name if (course.time == course.end_time && course.term == course.end_term) || (course.end_term.nil? && course.end_time.nil?) || course.time > Time.now.year str = name + "(" + course.time.to_s + course.term.to_s + ")" elsif course.time == Time.now.year && set_term_value(cur_course_term) <= set_term_value(course.term) str = name + "(" + course.time.to_s + course.term.to_s + ")" elsif course.end_time < Time.now.year || (course.end_time == Time.now.year && set_term_value(cur_course_term) >= set_term_value(course.term)) str = name + "(" + course.end_time.to_s + course.end_term.to_s + ")" else str = name + "(" + Time.now.year.to_s + cur_course_term_resource.to_s + ")" end str end def cur_course_term_resource month = Time.now.month if month >= 9 || month < 2 term = "秋" elsif (month >= 7 && Time.now.day >= 15) || month == 8 term = "夏" else term = "春" end term end def title_for_message type case type when nil '消息' when 'unviewed' '未读消息' when 'apply' '用户申请' when 'system_messages' '系统消息' when 'homework' '作业消息' when 'course_message' '课程讨论' when 'course_news' '课程通知' when 'poll' '课程问卷' when 'issue' '项目任务' when 'forge_message' '项目讨论' when 'forge_news' '项目新闻' when 'forum' '贴吧帖子' when 'user_feedback' '用户留言' end end def link_to_user_version(version, options = {}) return '' unless version && version.is_a?(Version) link_to_if version.visible?, format_version_name(version), { :controller => 'versions', :action => 'show', :id => version }, :class => "linkBlue" end # 统计未读消息数 def unviewed_message(user) course_count = CourseMessage.where("user_id =? and viewed =?", user, 0).count forge_count = ForgeMessage.where("user_id =? and viewed =?", user, 0).count org_count = OrgMessage.where("user_id =? and viewed =?", user, 0).count user_feedback_count = UserFeedbackMessage.where("user_id =? and viewed =?", user, 0).count user_memo_count = MemoMessage.where("user_id =? and viewed =?", user, 0).count at_count = user.at_messages.where(viewed: false).count messages_count = course_count + forge_count + user_feedback_count + user_memo_count + at_count + org_count end def user_mail_notification_options(user) user.valid_notification_options.collect {|o| [l(o.last), o.first]} end def change_status_link(user) url = {:controller => 'users', :action => 'update', :id => user, :page => params[:page], :status => params[:status], :tab => nil} if user.locked? link_to l(:button_unlock), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock' elsif user.registered? link_to l(:button_activate), url.merge(:user => {:status => User::STATUS_ACTIVE}), :method => :put, :class => 'icon icon-unlock' elsif user != User.current link_to l(:button_lock), url.merge(:user => {:status => User::STATUS_LOCKED}), :method => :put, :class => 'icon icon-lock' end end def user_settings_tabs tabs = [{:name => 'general', :partial => 'users/general', :label => :label_general}, {:name => 'memberships', :partial => 'users/memberships', :label => :label_project_plural} ] if Group.all.any? tabs.insert 1, {:name => 'groups', :partial => 'users/groups', :label => :label_group_plural} end tabs end # this method is used to get all projects that tagged one tag # added by william def get_users_by_tag(tag_name) User.tagged_with(tag_name).order('updated_on desc') end # added by fq # # TODO: 待删 # def show_activity(state) # content = ''.html_safe # case state # when 0 # s = content_tag('span', l(:label_user_all_activity), :class => "current-page") # content << content_tag('li', s) # content << content_tag('li', link_to(l(:label_user_activity_myself), {:controller => 'users', :action => 'show', :type => 1})) # content << content_tag('li', link_to(l(:label_user_all_respond), {:controller => 'users', :action => 'show', :type => 2})) # when 1 # s = content_tag('span', l(:label_user_activity_myself), :class => "current-page") # content << content_tag('li', link_to(l(:label_user_all_activity), {:controller => 'users', :action => 'show'})) # content << content_tag('li', s, :class => "current-page") # content << content_tag('li', link_to(l(:label_user_all_respond), {:controller => 'users', :action => 'show', :type => 2})) # when 2 # s = content_tag('span', l(:label_user_all_respond), :class => "current-page") # content << content_tag('li', link_to(l(:label_user_all_activity), {:controller => 'users', :action => 'show'})) # content << content_tag('li', link_to(l(:label_user_activity_myself), {:controller => 'users', :action => 'show', :type => 1})) # content << content_tag('li', s, :class => "current-page") # end # content_tag('div', content, :class => "pagination") # end #TODO: 待删 def watch_projects(state) content = ''.html_safe case state when 0 s = content_tag('span', l(:label_project_take), :class => "current-page") content << content_tag('li', s) content << content_tag('li', link_to(l(:label_has_watched_project), {:controller => 'users', :action => 'watch_projects', :type => 1})) when 1 s = content_tag('span', l(:label_has_watched_project), :class => "current-page") content << content_tag('li', link_to(l(:label_project_take), {:controller => 'users', :action => 'user_projects'})) content << content_tag('li', s, :class => "current-page") end content_tag('div', content, :class => "pagination") end def user_course(state) content = ''.html_safe if @user != User.current if @user.user_extensions.identity == 0 case state when 0 s = content_tag('span', '他执教的课程', :class => "current-page") content << content_tag('li', s) content << content_tag('li', link_to('他发布的作业', {:controller => 'users', :action => 'user_courses', :type => 1})) content_tag('div', content, :class => "pagination") when 1 s = content_tag('span', '他发布的作业', :class => "current-page") content << content_tag('li', link_to('他执教的课程', {:controller => 'users', :action => 'user_courses'})) content << content_tag('li', s, :class => "current-page") content_tag('div', content, :class => "pagination") end else case state when 0 s = content_tag('span', '他的课程', :class => "current-page") content << content_tag('li', s) content << content_tag('li', link_to('他的作业', {:controller => 'users', :action => 'user_courses', :type => 1})) content_tag('div', content, :class => "pagination") when 1 s = content_tag('span', '他的作业', :class => "current-page") content << content_tag('li', link_to('他的课程', {:controller => 'users', :action => 'user_courses', :type => 0})) content << content_tag('li', s, :class => "current-page") content_tag('div', content, :class => "pagination") end end else if @user.user_extensions.identity == 0 case state when 0 s = content_tag('span', l(:label_teaching_course), :class => "current-page") content << content_tag('li', s) content << content_tag('li', link_to(l(:label_release_homework), {:controller => 'users', :action => 'user_courses', :type => 1})) content_tag('div', content, :class => "pagination") when 1 s = content_tag('span', l(:label_release_homework), :class => "current-page") content << content_tag('li', link_to(l(:label_teaching_course), {:controller => 'users', :action => 'user_courses'})) content << content_tag('li', s, :class => "current-page") content_tag('div', content, :class => "pagination") end else case state when 0 s = content_tag('span', l(:label_my_course), :class => "current-page") content << content_tag('li', s) content << content_tag('li', link_to('我的作业', {:controller => 'users', :action => 'user_courses', :type => 1})) content_tag('div', content, :class => "pagination") when 1 s = content_tag('span', '我的作业', :class => "current-page") content << content_tag('li', link_to(l(:label_my_course), {:controller => 'users', :action => 'user_courses', :type => 0})) content << content_tag('li', s, :class => "current-page") content_tag('div', content, :class => "pagination") end end end end # added by huang def sort_user(state, project_type) content = ''.html_safe case state when 0 content << content_tag('li', link_to(l(:label_sort_by_active), users_path(params.merge({:user_sort_type => '1', :project_type => project_type}) ))) content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(params.merge({:user_sort_type => '2', :project_type => project_type}) ))) content << content_tag('li', link_to(l(:label_sort_by_time), users_path(params.merge({:user_sort_type => '0', :project_type => project_type}) ), :class=>"selected") ) when 1 content << content_tag('li', link_to(l(:label_sort_by_active), users_path(params.merge({:user_sort_type => '1', :project_type => project_type}) ), :class=>"selected") ) content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(params.merge({:user_sort_type => '2', :project_type => project_type}) ))) content << content_tag('li', link_to(l(:label_sort_by_time), users_path(params.merge({:user_sort_type => '0', :project_type => project_type}) ))) when 2 content << content_tag('li', link_to(l(:label_sort_by_active), users_path(params.merge({:user_sort_type => '1', :project_type => project_type}) ))) content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(params.merge({:user_sort_type => '2', :project_type => project_type}) ), :class=>"selected") ) content << content_tag('li', link_to(l(:label_sort_by_time), users_path(params.merge({:user_sort_type => '0', :project_type => project_type}) ))) end content = content_tag('ul', content) content_tag('div', content, :class => "tabs") end def sort_user_enterprise(state, project_type) content = ''.html_safe case state when 0 content << content_tag('li', link_to(l(:label_sort_by_active), users_path(:user_sort_type => '1', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(:user_sort_type => '2', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_time), users_path(:user_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected") when 1 content << content_tag('li', link_to(l(:label_sort_by_active), users_path(:user_sort_type => '1', :project_type => project_type), :class=>"selected"), :class=>"selected") content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(:user_sort_type => '2', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_time), users_path(:user_sort_type => '0', :project_type => project_type))) when 2 content << content_tag('li', link_to(l(:label_sort_by_active), users_path(:user_sort_type => '1', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_influence), users_path(:user_sort_type => '2', :project_type => project_type), :class=>"selected"), :class=>"selected") content << content_tag('li', link_to(l(:label_sort_by_time), users_path(:user_sort_type => '0', :project_type => project_type))) end content = content_tag('ul', content) content_tag('div', content, :class => "tabs_enterprise") end def gender_avatar_uri user img_uri = '/images/sidebar/female.png' return img_uri if user.user_extensions.blank? person_gender = user.user_extensions.gender img_uri = (person_gender == 1) ? '/images/sidebar/female.png' : '/images/sidebar/male.png' end include CoursesHelper def is_watching?(user) login_user = User.current# 登录者 courses = user.projects.where('project_type=1') return true if ((login_user == user) or login_user.admin?) courses.each do |course| return true if login_user.member_of?(course) end ## 下面的代码只判断是否是老师或者助教,上面是成员都可以看到 # people_ids = [] # user.projects.where('project_type=1').each do |project| # tmp = searchTeacherAndAssistant(project) # people_ids += (members_to_user_ids(tmp)) unless tmp.nil? # end # people_ids.include?(login_user.id) or (login_user == user) or login_user.admin? false end # base user上面的navbar显示内容 def show_item_on_navbar params displayed_item = %w|index| displayed_item.include?(params['action']) end # base user上面searchBar显示 def show_search_bar params displayed_flag = %w|index| !displayed_flag.include?(params['action']) end #获取指定用户的未过期的课程列表 def user_courses_list user result = [] user.coursememberships.map(&:course).each do |course| if !course_endTime_timeout?(course) result << course end end return result end #获取用户参与的公开的课程列表 def user_public_course_list user membership = user.coursememberships.all#@user.coursememberships.all(:conditions => Course.visible_condition(User.current)) membership.sort! {|older, newer| newer.created_on <=> older.created_on } memberships = [] membership.collect { |e| memberships.push(e) } ## 判断课程是否过期 [需封装] memberships_doing = [] memberships_done = [] memberships.map { |e| if course_endTime_timeout?(e.course) memberships_done.push e else memberships_doing.push e end } end #获取用户留言相关的连接 def user_jour_feed_back_url active if active.act_type == "JournalsForMessage" jour = JournalsForMessage.find active.act_id if jour case jour.jour_type when "Principal" link_to(l(:label_goto), user_newfeedback_user_path(jour.jour_id)) when "Project" link_to(l(:label_goto), project_feedback_path(jour.jour_id)) when "Bid" link_to(l(:label_goto), course_for_bid_path(jour.jour_id)) when "Course" link_to(l(:label_goto), course_feedback_path(jour.jour_id)) when "Contest" link_to(l(:label_goto), show_contest_contest_path(jour.jour_id)) when "Softapplication" link_to(l(:label_goto), softapplication_path(jour.jour_id)) when "HomeworkAttach" link_to(l(:label_goto), course_for_bid_path(jour.jour_id)) end end end end def get_watcher_users(obj) count = User.watched_by(obj.id).count if count == 0 return [0,[]] end list = User.watched_by(obj.id).order("#{Watcher.table_name}.id desc").limit(10).all return [count,list]; end def get_fans_users(obj) count = obj.watcher_users.count if count == 0 return [0,[]] end list = obj.watcher_users.order("#{Watcher.table_name}.id desc").limit(10).all return [count,list]; end def get_visitor_users(obj) query = Visitor.where("master_id=?",obj.id) count = query.count if count == 0 return [0,[]] end list = query.order("updated_on desc").limit(10).all return [count,list] end def get_create_course_count(user) user.courses.visible.where("tea_id = ?",user.id).count end #获取加入课程数 def get_join_course_count(user) user.courses.visible.count - get_create_course_count(user) end #发布作业数 def get_homework_commons_count(user) HomeworkCommon.where("user_id = ?",user.id).count end #资源数 def get_projectandcourse_attachment_count(user) Attachment.where("author_id = ? and container_type in ('Project','Course')",user.id).count end #创建项目数 def get_create_project_count(user) user.projects.visible.where("projects.user_id=#{user.id}").count end #加入项目数 def get_join_project_count(user) user.projects.visible.count - get_create_project_count(user) end #创建缺陷数 def get_create_issue_count(user) Issue.where("author_id = ?",user.id).count end #解决缺陷数 def get_resolve_issue_count(user) Issue.where("assigned_to_id = ? and status_id=3",user.id).count end #参与匿评数 def get_anonymous_evaluation_count(user) StudentWorksScore.where("user_id = ? and reviewer_role=3",user.id).count end def query_activities(query) list = query.limit(13).all result = [] for item in list container = get_activity_container(item) result << { :item=>item,:e=>container } end result end def get_activity_container activity return activity.activity_container end def get_activity_act_showname_htmlclear(activity) str = get_activity_act_showname(activity) str = str.gsub(/<.*>/,'') str = str.gsub(/\r/,'') str = str.gsub(/\n/,'') str = str.lstrip.rstrip if str == '' str = 'RE:' end return str.html_safe end # journal.details 记录每个动作的新旧值 def get_issue_des_update(journal) no_html = "message" arr = details_to_strings(journal.details, no_html) unless journal.notes.blank? arr << journal.notes end str = '' arr.each { |item| str = str+item } return str end def get_activity_act_showname(activity) case activity.act_type when "HomeworkCommon" return activity.act.name when "Issue" return activity.act.subject when "Journal" arr = details_to_strings(activity.act.details,true) arr << activity.act.notes str = '' arr.each { |item| str = str+item } return str when "JournalsForMessage" return activity.act.notes when "Message" return activity.act.subject when "News" return activity.act.title when "Poll" return activity.act.polls_name when "Contest" return '' when "Contestnotification" return '' when "Principal" return '' else return activity.act_type end end def get_activity_act_createtime(activity) case activity.act_type when "HomeworkCommon" return activity.act.created_at when "Poll" return activity.act.created_at else return activity.act.created_on end end def get_activity_container_url e if !e.visible? return "javascript:;" end if e.class.to_s == 'Course' return url_for(:controller => 'courses', :action=>"show", :id=>e.id, :host=>Setting.host_course) end return url_for(:controller => 'projects', :action=>"show", :id=>e.id, :host=>Setting.host_name) end def get_activity_url(activity,e) if !e.visible? return "javascript:;" end case activity.act_type # when "Contest" # when "Contestnotification" # when "Principal" when "HomeworkCommon" return homework_common_index_path( :course=>e.id ) when "Issue" return issue_path(activity.act.id) when "Journal" return issue_path( activity.act.journalized_id ) when "JournalsForMessage" return e.class.to_s == 'Course' ? course_feedback_path(e) : project_feedback_path(e) when "Message" return e.class.to_s == 'Course' ? course_boards_path(e) : project_boards_path(e) when "News" return news_path(activity.act) #return e.class.to_s == 'Course' ? course_news_index_path(e) : project_news_index_path(e) when "Poll" return poll_index_path( :polls_group_id=>activity.act.polls_group_id, :polls_type=>e.class.to_s ) else return 'javascript:;' end end def get_activity_opt(activity,e) case activity.act_type when "HomeworkCommon" return '创建了作业' when "News" return e.class.to_s == 'Course' ? '发布了通知' : '添加了新闻' when "Issue" return '发表了问题' when "Journal" return '更新了问题' when "JournalsForMessage" return e.class.to_s == 'Course' ? '发表了留言' : '提交了反馈' #return ( activity.act.reply_id == nil || activity.act.reply_id == 0 ) ? '' : '' when "Message" return ( activity.act.parent_id == nil || activity.act.parent_id == '' ) ? '发布了帖子' : '回复了帖子' when "Poll" return '创建了问卷' else return '有了新动态' end end #获取指定用户作为老师的课程 def get_as_teacher_courses user type = [] option = [] option << "请选择发布作业的课程" option << -1 type << option user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(created_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").select{|c| user.allowed_to?(:as_teacher,c)}.each do |course| option = [] option << course.name+"("+course.time.to_s+course.term+")" option << course.id type << option end type end #根据姓名搜索用户 def search_user_by_name user_ids, name result_ids = [] user_ids.each do |user_id| user = User.find user_id username = user.lastname.to_s.downcase + user.firstname.to_s.downcase if username.include?(name) result_ids << user_id end end result_ids end end