diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 43ef7cefc..e23d21691 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -1,608 +1,608 @@
-# 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 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 => " f16 fb c_dblue "
- 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
- 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
- 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
-
-end
+# 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 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
+ 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
+ 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
+
+end
diff --git a/app/views/users/_project_issue_detail.html.erb b/app/views/users/_project_issue_detail.html.erb
index e46761bd1..a6614399d 100644
--- a/app/views/users/_project_issue_detail.html.erb
+++ b/app/views/users/_project_issue_detail.html.erb
@@ -1,115 +1,115 @@
-
-
-
-
-
- <%= form_tag({:controller => 'issues', :action => 'update', :issue_id => activity.id, :issue_detail => true, :type => "prior"},:remote=>'true', :method => :put, :id=>"issue_query_prior_form_#{activity.id}", :class => 'query_form') do %>
- -
-
优先级 :
- <%= activity.priority.name %>
- <%= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]),
- {:include_blank => false,:selected=>@priority_id ? @priority_id : 0},
- {:onchange=>"remote_function('#issue_query_prior_form_#{activity.id}');",:id=>"priority_id",:name=>"priority_id",:class=>"w70 undis issueEdit"}) %>
-
- <% end %>
-
- <%= form_tag({:controller => 'issues', :action => 'update', :issue_id => activity.id, :issue_detail => true, :type => "ratio"},:remote=>'true', :method => :put, :id=>"issue_query_done_form_#{activity.id}", :class => 'query_form') do %>
- -
-
完成度 :
- <%= activity.done_ratio %>%
- <%= select( :issue,:done_ratio, ((0..10).to_a.collect { |r| ["#{r*10} %", r*10] }),
- {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0},
- {:onchange=>"remote_function('#issue_query_done_form_#{activity.id}');",:id=>"done_ratio",:name=>"done_ratio",:class=>"w70 undis issueEdit"}) %>
- <% end %>
-
-
-
-
-
-
- -
-
计划完成 :
- <%= format_date(activity.due_date)? format_date(activity.due_date) : "--" %>
-
- -
-
目标版本 :
- <%= (activity.fixed_version ? link_to_user_version(activity.fixed_version) : "--") %>
-
-
-
+
+
+
+
+
+ <%= form_tag({:controller => 'issues', :action => 'update', :issue_id => activity.id, :issue_detail => true, :type => "prior"},:remote=>'true', :method => :put, :id=>"issue_query_prior_form_#{activity.id}", :class => 'query_form') do %>
+ -
+
优先级 :
+ <%= activity.priority.name %>
+ <%= select( :issue,:prior, [["低",1],["正常",2],["高",3],["紧急",4],["立刻",5]].unshift(["优先级",0]),
+ {:include_blank => false,:selected=>@priority_id ? @priority_id : 0},
+ {:onchange=>"remote_function('#issue_query_prior_form_#{activity.id}');",:id=>"priority_id",:name=>"priority_id",:class=>"w70 undis issueEdit"}) %>
+
+ <% end %>
+
+ <%= form_tag({:controller => 'issues', :action => 'update', :issue_id => activity.id, :issue_detail => true, :type => "ratio"},:remote=>'true', :method => :put, :id=>"issue_query_done_form_#{activity.id}", :class => 'query_form') do %>
+ -
+
完成度 :
+ <%= activity.done_ratio %>%
+ <%= select( :issue,:done_ratio, ((0..10).to_a.collect { |r| ["#{r*10} %", r*10] }),
+ {:include_blank => false, :selected => @done_ratio ? @done_ratio : 0},
+ {:onchange=>"remote_function('#issue_query_done_form_#{activity.id}');",:id=>"done_ratio",:name=>"done_ratio",:class=>"w70 undis issueEdit"}) %>
+ <% end %>
+
+
+
+
+
+
+ -
+
计划完成 :
+ <%= format_date(activity.due_date)? format_date(activity.due_date) : "--" %>
+
+ -
+
目标版本 :
+ <%= (activity.fixed_version ? link_to_user_version(activity.fixed_version) : "--") %>
+
+
+
\ No newline at end of file
diff --git a/db/schema.rb b/db/schema.rb
index 7e6291806..5ef8d4514 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20160122083507) do
+ActiveRecord::Schema.define(:version => 20160122094829) do
create_table "activities", :force => true do |t|
t.integer "act_id", :null => false
@@ -1217,6 +1217,7 @@ ActiveRecord::Schema.define(:version => 20160122083507) do
create_table "org_members", :force => true do |t|
t.integer "user_id"
t.integer "organization_id"
+ t.string "role"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
@@ -1372,6 +1373,7 @@ ActiveRecord::Schema.define(:version => 20160122083507) do
t.integer "board_message_num", :default => 0
t.integer "board_num", :default => 0
t.integer "attach_num", :default => 0
+ t.datetime "commit_time"
end
create_table "project_statuses", :force => true do |t|