diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 21dac6ada..8fa46bda5 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1133,6 +1133,21 @@ class CoursesController < ApplicationController end end + #切换身份 + def switch_role + members = @course.members.where("user_id = #{params[:user_id]}") + unless members.blank? + #role = MemberRole.where("member_id = #{members.first.id} and role_id = #{params[:role]}").first + curr_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:curr_role]) + tar_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:tar_role]) + unless (curr_role.nil? || tar_role.nil?) + curr_role.update_column('is_current', 0) + tar_role.update_column('is_current', 1) + end + end + redirect_to course_path(@course) + end + private def update_quotes attachment if attachment.copy_from diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 4dc2c52f5..9c6f606f6 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -154,9 +154,11 @@ class MembersController < ApplicationController user_ids = attrs.delete(:user_ids) user_ids.each do |user_id| member = Member.new(:role_ids => params[:membership][:role_ids], :user_id => user_id) - role = Role.find_by_id(params[:membership][:role_ids]) + + role_ids = attrs.delete(:role_ids) + #role = Role.find(params[:membership][:role_ids]) # 这里的判断只能通过角色名,可以弄成常量 - if role && (role.name == "学生" || role.name == "Student") + if role_ids && !role_ids.include?("9") && role_ids.include?("10") StudentsForCourse.create(:student_id => user_id, :course_id =>@course.id) end @@ -252,7 +254,10 @@ class MembersController < ApplicationController if (params[:membership][:role_ids]) role = Role.find(params[:membership][:role_ids][0]) # 这里的判断只能通过角色名,可以弄成常量 - if role.name == "学生" || role.name == "Student" + attrs = params[:membership].dup + role_ids = attrs.delete(:role_ids) + + if role_ids && !role_ids.include?("9") && role_ids.include?("10") StudentsForCourse.create(:student_id => @member.user_id, :course_id =>@course.id) else joined = StudentsForCourse.where('student_id = ? and course_id = ?', @member.user_id,@course.id) diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index 42511f218..46ad4bb1c 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -274,14 +274,19 @@ module CoursesHelper #searchPeopleByRoles(project, TeacherRoles) members = [] project.members.includes(:user).each do |m| - members << m if m && m.user && m.user.allowed_to?(:as_teacher,project) + #members << m if m && m.user && m.user.allowed_to?(:as_teacher,project) + members << m if m && m.user && m.user.has_teacher_role(project) end members end def TeacherAndAssistantCount course - students_count = course.student.count - number = course.members.count - students_count + #students_count = course.student.count + #number = course.members.count - students_count + member_ids = course.members.includes(:user).blank? ? "(-1)" : "(" + course.members.includes(:user).map { |mem| mem.id}.join(",") + ")" + role_ids = "(3, 7, 9)" + number = MemberRole.where("member_id in #{member_ids} and role_id in #{role_ids}").count + #number = (searchTeacherAndAssistant course).count end def search_student_in_group(project, course_group_id) @@ -811,6 +816,10 @@ module CoursesHelper result = l(:label_student) elsif role == "Manager" result = l(:field_admin) + elsif role.include?("TeachingAsistant") && role.include?("Student") + result = l(:label_TA) + " " + l(:label_student) + elsif role.include?("Teacher") && role.include?("Student") + result = l(:label_teacher) + " " + l(:label_student) end result end @@ -894,5 +903,15 @@ module CoursesHelper resource_num*5 + journal_num + homework_journal_num ) desc limit 3;") end + #用户在该课程是否具有某个角色 + def get_user_member_roles_course course, user, role + members = course.members.where("user_id = #{user.id}") + result = false + unless members.blank? + m_roles = MemberRole.where("member_id = #{members.first.id} and role_id = #{role}") + end + result = !m_roles.blank? + result + end end diff --git a/app/models/member.rb b/app/models/member.rb index 3cb70a8fe..cb15e067b 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -53,7 +53,15 @@ class Member < ActiveRecord::Base new_role_ids = ids - role_ids # Add new roles - new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id) } + if new_role_ids.include?(7) && new_role_ids.include?(10) + member_roles << MemberRole.new(:role_id => 7) + member_roles << MemberRole.new(:role_id => 10, :is_current => 0) + elsif new_role_ids.include?(9) && new_role_ids.include?(10) + member_roles << MemberRole.new(:role_id => 9) + member_roles << MemberRole.new(:role_id => 10, :is_current => 0) + else + new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id) } + end # Remove roles (Rails' #role_ids= will not trigger MemberRole#on_destroy) member_roles_to_destroy = member_roles.select {|mr| !ids.include?(mr.role_id)} if member_roles_to_destroy.any? diff --git a/app/models/member_role.rb b/app/models/member_role.rb index 4d493cb27..799720833 100644 --- a/app/models/member_role.rb +++ b/app/models/member_role.rb @@ -16,6 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class MemberRole < ActiveRecord::Base + # multi_role 课程中的多重角色 0:单角色/学生,1:管理员&学生,2:教师&学生,3:教辅&学生 belongs_to :member belongs_to :role diff --git a/app/models/user.rb b/app/models/user.rb index 996aa9be7..afd45e08b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -823,7 +823,7 @@ class User < Principal # Find course membership membership = coursemembership(course) if membership - roles = membership.roles + roles = membership.roles.where("is_current = 1") else @role_non_member ||= Role.non_member roles << @role_non_member @@ -918,6 +918,12 @@ class User < Principal end end + #是否具有老师角色 + def has_teacher_role(course) + member = course.members.where("user_id = #{self.id}").first + role = MemberRole.where("member_id = #{member.id} and role_id in (3, 7, 9)") + !role.blank? + end # Return true if the user is allowed to do the specified action on a specific context # Action can be: diff --git a/app/views/courses/_course_members.html.erb b/app/views/courses/_course_members.html.erb index 9f15405dc..563cbfff3 100644 --- a/app/views/courses/_course_members.html.erb +++ b/app/views/courses/_course_members.html.erb @@ -36,7 +36,7 @@ <% @roles.each do |role| %>
  • - <%= radio_button_tag 'membership[role_ids][]', role.id, role.name == "学生" || role.name == "Student" %> + <%= check_box_tag 'membership[role_ids][]', role.id, role.name == "学生" || role.name == "Student", :id => "add_member_checkbox_#{role.id}" %>
  • <% end %> @@ -47,4 +47,36 @@ <% end%> - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/views/courses/_member.html.erb b/app/views/courses/_member.html.erb index 1bfe3cbd7..f23a74063 100644 --- a/app/views/courses/_member.html.erb +++ b/app/views/courses/_member.html.erb @@ -10,7 +10,7 @@ ) do |f| %> <% @roles.each do |role| %> @@ -35,4 +35,38 @@ :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {confirm: l(:label_delete_confirm)}) if member.deletable? %> <% end%> -<% end%> \ No newline at end of file + + +<% end%> diff --git a/app/views/layouts/_course_base_info.html.erb b/app/views/layouts/_course_base_info.html.erb index 8994dab10..a6d267d76 100644 --- a/app/views/layouts/_course_base_info.html.erb +++ b/app/views/layouts/_course_base_info.html.erb @@ -55,8 +55,15 @@ 学期:<%= current_time_and_term @course %> 单位:<%= get_occupation_from_user(@course.teacher).blank? ? '无' : get_occupation_from_user(@course.teacher) %>

    - - <% unless is_teacher %> + <% is_TA = get_user_member_roles_course @course, User.current, 7 %> + <% is_TE = get_user_member_roles_course @course, User.current, 9 %> + <% is_ST = get_user_member_roles_course @course, User.current, 10 %> + <% if !is_teacher && (is_TA || is_TE) %> + <%= link_to '教师身份', switch_role_course_path(@course, :user_id => User.current.id, :curr_role => 10, :tar_role => (is_TA ? 7 : 9)), :class => "sy_btn_orange mr10 fl" %> + <% elsif is_teacher && is_ST %> + <%= link_to '学生身份', switch_role_course_path(@course, :user_id => User.current.id, :curr_role => (is_TA ? 7 : 9), :tar_role => 10), :class => "sy_btn_orange mr10 fl" %> + <% end %> + <% unless (is_teacher || is_TA || is_TE) %>
    <%= join_in_course_header(@course, User.current) %>
    <% end %> diff --git a/config/routes.rb b/config/routes.rb index 6c16dbd7d..cc75f8dab 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1151,6 +1151,7 @@ RedmineApp::Application.routes.draw do get "homework_search" get "show_comparecode" get "statistics_course" + get "switch_role" end collection do match 'join_private_courses', :via => [:get, :post] diff --git a/db/migrate/20160727065357_add_column_to_member_role.rb b/db/migrate/20160727065357_add_column_to_member_role.rb index b551c18bd..861a32e27 100644 --- a/db/migrate/20160727065357_add_column_to_member_role.rb +++ b/db/migrate/20160727065357_add_column_to_member_role.rb @@ -1,16 +1,5 @@ class AddColumnToMemberRole < ActiveRecord::Migration def change - add_column :member_roles, :multi_role, :integer, :default => 0 - - count = MemberRole.all.count / 30 + 2 - transaction do - for i in 1 ... count do i - MemberRole.page(i).per(30).each do |mr| - if mr.role_id == 3 - mr.update_column('multi_role', 1) - end - end - end - end + add_column :member_roles, :is_current, :integer, :default => 1 end end diff --git a/db/schema.rb b/db/schema.rb index ac6ea0ca8..b8352dde1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1108,7 +1108,7 @@ ActiveRecord::Schema.define(:version => 20160727065357) do t.integer "member_id", :null => false t.integer "role_id", :null => false t.integer "inherited_from" - t.integer "multi_role", :default => 0 + t.integer "is_current", :default => 1 end add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id"