From 848c56d54ef985a1e747d3e89b7de373a1530b59 Mon Sep 17 00:00:00 2001
From: cxt
Date: Fri, 29 Jul 2016 14:34:42 +0800
Subject: [PATCH] =?UTF-8?q?=E7=8F=AD=E7=BA=A7=E4=B8=BB=E9=A1=B5=E8=BA=AB?=
=?UTF-8?q?=E4=BB=BD=E5=88=87=E6=8D=A2=E3=80=81=E6=88=90=E5=91=98=E7=AE=A1?=
=?UTF-8?q?=E7=90=86=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=A4=9A=E9=87=8D=E8=BA=AB?=
=?UTF-8?q?=E4=BB=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/courses_controller.rb | 15 ++++++++
app/controllers/members_controller.rb | 11 ++++--
app/helpers/courses_helper.rb | 25 ++++++++++--
app/models/member.rb | 10 ++++-
app/models/member_role.rb | 1 +
app/models/user.rb | 8 +++-
app/views/courses/_course_members.html.erb | 36 +++++++++++++++++-
app/views/courses/_member.html.erb | 38 ++++++++++++++++++-
app/views/layouts/_course_base_info.html.erb | 11 +++++-
config/routes.rb | 1 +
...0160727065357_add_column_to_member_role.rb | 13 +------
db/schema.rb | 2 +-
12 files changed, 144 insertions(+), 27 deletions(-)
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}" %>
<%= zh_course_role(h role) %>
<% 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| %>
- <%= radio_button_tag 'membership[role_ids][]', role.id, member.roles.include?(role),
+ <%= check_box_tag 'membership[role_ids][]', role.id, member.roles.include?(role), :id => "edit_member_role_#{member.id}_#{role.id}",
:disabled => member.member_roles.detect { |mr| mr.role_id == role.id && !mr.inherited_from.nil? } %>
<%= zh_course_role(h 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) %>
<% 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"