diff --git a/Gemfile b/Gemfile index 7d4ab7bf..9ff7d11f 100644 --- a/Gemfile +++ b/Gemfile @@ -60,6 +60,8 @@ gem 'kaminari' gem 'elasticsearch-model' gem 'elasticsearch-rails' +gem 'oauth2' + # cronjob gem 'whenever', require: false diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5e107d39..b1281b12 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -362,6 +362,13 @@ class ApplicationController < ActionController::Base true end + # 运营人员 + def require_business + unless (User.current.business? || User.current.admin?) + render_403 + end + end + def deny_access User.current.logged? ? render_403 : require_login end @@ -1120,4 +1127,25 @@ class ApplicationController < ActionController::Base Time.now < Time.new(2019, 4, 23, 2) end + # 获取Oauth Client + def get_client(site) + client_id = Redmine::Configuration['client_id'] + client_secret = Redmine::Configuration['client_secret'] + + OAuth2::Client.new(client_id, client_secret, site: site) + end + + def handle_openi_request + site = Redmine::Configuration['openi_domain'] + root_url = Redmine::Configuration['educoder_domain'] + get_code_url = "/oauth/get_code" + original_url = request.original_url + + client = get_client(site) + redirect_uri = "#{root_url}#{get_code_url}" + authorize_url = client.auth_code.authorize_url(redirect_uri: redirect_uri) + authorize_url = authorize_url + "&gen_code=true&state=1&original_url=#{original_url}" + + redirect_to authorize_url + end end diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index b65f2219..421e5da3 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1635,7 +1635,7 @@ class CoursesController < ApplicationController @course_modules = @course.course_modules.where(:hidden => 0) course_module_type = @course_modules.map(&:module_type) - @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? + @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin? || User.current.business? if User.current.member_of_course?(@course) && !@is_teacher member = @course.members.where(:user_id => User.current.id).first if member.try(:course_group_id).to_i == 0 diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb index b7e1bd56..07381e57 100644 --- a/app/controllers/managements_controller.rb +++ b/app/controllers/managements_controller.rb @@ -1,6 +1,6 @@ # encoding: utf-8 class ManagementsController < ApplicationController - before_filter :require_admin + before_filter :require_business layout 'base_management' include ManagementsHelper include SortHelper @@ -63,7 +63,6 @@ class ManagementsController < ApplicationController # 工程认证视频导入模板 def ec_template @template = EcTemplate.where(nil) - end def add_template @@ -1191,7 +1190,7 @@ end if params[:search].blank? @partners = Partner.includes(:school).order("partners.created_at desc") else - @partners = Partner.where("name like ? ", "%#{params[:search]}%").includes(:school).order("partners.created_at desc") + @partners = Partner.includes(:school).where("schools.name like ? ", "%#{params[:search]}%").order("partners.created_at desc") end @current_partner = nil @@ -1212,6 +1211,14 @@ end end + def delete_partner + partner = Partner.find params[:partner_id] + partner.destroy + @partners = Partner.includes(:school).order("partners.created_at desc") + @current_partner = nil + end + + # 添加客户 def customers_list @search = params[:search] @@ -1219,11 +1226,10 @@ end partner_id = params[:partner_id] @partner = Partner.find partner_id @customers = @partner.customers - if @customers.present? - @schools = School.where("(partner_id != ? or partner_id is NULL) and customer_id is NULL", @partner.id) - else - @schools = School.where("customer_id is null and (partner_id != ? or partner_id is NULL)", @partner.id) - end + existed_school_ids = @customers.pluck(:school_id) + existed_school_ids = existed_school_ids.present? ? existed_school_ids.join(",") : -1 + @schools = School.where("id not in (#{existed_school_ids})") + if params[:search] @schools = @schools.where("name like ?", "%#{@search}%") end @@ -1247,13 +1253,14 @@ end def add_customers school_ids = params[:school_ids] - if school_ids.length > 0 + partner_id = params[:partner_id] + if school_ids.length > 0 && partner_id.present? school_ids.each do |s| school = School.where("id = ?",s).first if school.present? - customer = Customer.new(partner_id: params[:partner_id]) + customer = Customer.new(school_id: s) customer.save! - school.update_attributes(:customer_id => customer.id) + PartnerCustomer.create(partner_id: partner_id,customer_id: customer.id ) end end render :json => {status: 1, message: "创建成功!"} @@ -1262,17 +1269,20 @@ end def delete_customers if params[:customer] - customer = Customer.where(id: params[:customer]).first - @current_partner = customer.partner - customer.school.update_attributes(:customer_id => nil) + customer = Customer.find(params[:customer]) + @current_partner = Partner.find(params[:partner_id]) customer.destroy end end + # 添加合作伙伴弹框数据 def all_partners @search = params[:search] @province = params[:province] - @schools = School.where("partner_id IS NULL") + # 已经选过的合作伙伴不能再再列表中显示 + used_school_ids = Partner.pluck(:school_id) + used_school_ids = used_school_ids.blank? ? -1 : used_school_ids.join(",") + @schools = School.where("id not in (#{used_school_ids})") if params[:search] @schools = @schools.where("name like ?", "%#{@search}%") @@ -1296,26 +1306,20 @@ end end end - def add_partner school_ids = params[:school_ids] if school_ids.length > 0 school_ids.each do |s| - school = School.where("id = ?",s).first - if school.present? && school.partner_id.nil? - partner = Partner.new(name: school.name) + old_partner = Partner.where(:school_id => s) + if old_partner.blank? + partner = Partner.new(school_id: s) partner.save - school.update_attributes(:partner_id => partner.id) end end end render :json => {status: 1, message: "创建成功!"} end - - - - # 删除部门管理员 def delete_depart_member DepartmentMember.where(:department_id => params[:depart], :user_id => params[:user_id]).destroy_all @@ -3345,7 +3349,7 @@ end end @users = User.where(:id => user_id).where("#{sql}").includes(:apply_actions, user_extensions: [:department, :school]).order("last_login_on desc") - @xls_users = @users.reorder("created_on desc").limit(1000) #导出excel用户 + @xls_users = @users.reorder("created_on desc").limit(3000) #导出excel用户 @page = (params['page'] || 1).to_i @users_count = @users.count @limit = 20 @@ -4176,7 +4180,7 @@ end sheet1 = book.create_worksheet :name => "course" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue - sheet1.row(0).concat(["ID","课堂名称","成员","资源","普通作业"," 实训作业","试卷","私有","状态","创建者单位","创建者","动态时间"]) + sheet1.row(0).concat(["ID","课堂名称","成员","资源","普通作业"," 实训作业","试卷","私有","状态","创建者单位","创建者","动态时间","创建时间"]) count_row = 1 courses.each do |course| school = course.teacher.try(:user_extensions).try(:school).try(:name).blank? ? "--" : course.teacher.school_name @@ -4193,6 +4197,7 @@ end sheet1[count_row,9] = school sheet1[count_row,10] = teacher_name sheet1[count_row,11] = format_time(course.updatetime) + sheet1[count_row,12] = format_time(course.created_at) count_row += 1 end book.write xls_report diff --git a/app/controllers/oauth_controller.rb b/app/controllers/oauth_controller.rb index 54f15c43..64867d55 100644 --- a/app/controllers/oauth_controller.rb +++ b/app/controllers/oauth_controller.rb @@ -1,6 +1,5 @@ #encoding: utf-8 class OauthController < ApplicationController - require include ApplicationHelper before_filter :user_setup @@ -152,8 +151,65 @@ class OauthController < ApplicationController render json: user_info.to_json end + ####--Start-- 获取Openi的授权码,access_token,以及用户信息。为在openi登录的用户创建相关的educoder用户 #### + IDENTITY_SITE = Redmine::Configuration['openi_domain'] + ROOT_URL = Redmine::Configuration['educoder_domain'] + DEFAULT_PASSWORD = "a12345678" + TOKEN_CALL_BACK = "/oauth/get_token_callback" + USER_INFO = "/oauth/userinfo" + + def get_code + # 从OpenI发过来的回调中获取授权码 + code = params[:code] + + # 利用授权码从OpenI这里获取access_token + client = get_client(IDENTITY_SITE) + redirect_uri = "#{ROOT_URL}#{TOKEN_CALL_BACK}" + access_token_hash = client.auth_code.get_token(code, redirect_uri: redirect_uri).to_hash + + # 利用access_token获取OpenI的用户信息 + access_token = access_token_hash[:access_token] + get_info_url = "#{IDENTITY_SITE}#{USER_INFO}?access_token=#{access_token}" + response = HTTParty.get(get_info_url) + body_json = JSON.parse response.body + + openi_user_id = body_json['token'] + avatar_url = body_json['avatar_url'] + login = body_json['login'] + name = body_json['name'] + email = body_json['email'] + + # 根据获取的用户信息来查询数据库,如已经存在对应的Educoder用户,则直接访问用户要访问的实训页面,否则为其创建用户后再访问实训页面 + openi = Openi.find_by_login(login) + unless openi + ActiveRecord::Base.transaction do + user = User.new(lastname: name, mail: email, mail_notification: email) + user.login = custom_openi_login(login) + user.password = DEFAULT_PASSWORD + user.save! + + UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0) + + UserDayCertification.create!(user_id: user.id, status: 1) + + openi = Openi.create!(user_id: user.id, openi_user_id: openi_user_id, avatar_url: avatar_url, login: login, name: name, email: email) + end + end + + self.logged_user = openi.user + original_url = params[:original_url] + redirect_to original_url + end + + def get_token_callback + end + ####--End-- 获取Openi的授权码,access_token,以及用户信息。为在openi登录的用户创建相关的educoder用户 #### private + # 为了保证新创建的用户用户名不与系统中已存在的用户冲突,加上 _openi 后缀 + def custom_openi_login(login) + login + "_openi" + end def require_login require "base64" diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index b2761b60..adcc46c3 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -2,6 +2,8 @@ # REDO: 创建版本库权限控制 class ShixunsController < ApplicationController layout 'base_shixun' + # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 + before_filter :handle_openi_request, if: -> {URI(request.referer).host == 'openi.org.cn' && !current_user.logged?} before_filter :require_login, :except => [:ghook, :download_file, :show, :index] before_filter :check_authentication, :except => [:ghook, :download_file, :show, :index] before_filter :find_shixun, :except => [ :index, :new, :create, :index, :search, :shixun_courses, :new_disscuss, :shixun_migrate, :qrcode, :download_file, :departments, :get_mirror_script, :send_message_to_administrator] @@ -10,6 +12,7 @@ class ShixunsController < ApplicationController before_filter :view_allow, :only => [:collaborators, :propaedeutics, :shixun_discuss, :ranking_list] before_filter :require_manager, :only => [ :settings, :add_script, :publish, :collaborators_delete, :shixun_members_added, :add_collaborators, :update, :destroy] before_filter :validation_email, :only => [:new] + before_filter :require_admin, :only => [:destroy] # 移动云ToC模式权限控制 # before_filter :ecloud_auth, :except => [:show, :index] diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index a59747aa..2db71ee7 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -1,6 +1,8 @@ # encoding: utf-8 class SubjectsController < ApplicationController layout 'base_subject' + # 如要添加或修改before_filter时,请将handle_openi_request这个before_filter放至第一位 + before_filter :handle_openi_request, if: -> {URI(request.referer).host == 'openi.org.cn' && !current_user.logged?} before_filter :require_login, :except => [:show, :index] before_filter :check_authentication, :except => [:show, :index] before_filter :find_subject, :except => [:index, :new, :create, :create_subject, :new_subject, :append_to_stage, :send_to_course] diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index d13db006..df2ce0cd 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -274,7 +274,7 @@ class UsersController < ApplicationController # 私信 def private_messages - if User.current == @user || User.current.admin? + if User.current == @user || User.current.admin? || User.current.business? @onclick_time = User.current.onclick_time.onclick_time User.current.onclick_time.update_attribute(:onclick_time, Time.now) @messages = PrivateMessage.find_by_sql("SELECT ui.* FROM (SELECT * FROM private_messages WHERE STATUS != 2 AND user_id = #{@user.id} ORDER BY id DESC) ui GROUP BY ui.target_id ORDER BY ui.send_time DESC") diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index c6fa78d9..729a9564 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -30,6 +30,17 @@ class WelcomeController < ApplicationController require 'simple_xlsx_reader' DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z) + def local_init + LocalShixun.delete_all + LocalMirrorRepository.delete_all + LocalShixunTagRepertoire.delete_all + LocalChallenge.delete_all + LocalTestSet.delete_all + LocalChallengeTag.delete_all + render :json => {status: 0, message: "success"} + end + + def shixun_to_local identifiers = params[:identifiers].split(",") shixuns = Shixun.where(identifier: identifiers) @@ -62,7 +73,7 @@ class WelcomeController < ApplicationController if shixun.challenges.present? shixun.challenges.each do |challenge| new_challenge = LocalChallenge.new - new_challenge.attributes = challenge.attributes.dup.except("id","shixun_id","user_id") + new_challenge.attributes = challenge.attributes.dup.except("id","shixun_id","user_id", "test_set_score") new_challenge.local_shixun_id = local_shixun.id new_challenge.save! # 评测题,选择题暂时不考虑 @@ -98,6 +109,7 @@ class WelcomeController < ApplicationController def local_to_shixun ActiveRecord::Base.transaction do + shixun_list = [] LocalShixun.find_each do |local_shixun| identifier = generate_identifier shixun = Shixun.create!(name: local_shixun.name, description: local_shixun.description, user_id: User.current.id, @@ -141,7 +153,7 @@ class WelcomeController < ApplicationController if local_challenges.present? local_challenges.each do |local_challenge| new_challenge = Challenge.new - new_challenge.attributes = local_challenge.attributes.dup.except("id","local_shixun_id","user_id") + new_challenge.attributes = local_challenge.attributes.dup.except("id","local_shixun_id","user_id", "test_set_score") new_challenge.user_id = User.current.id new_challenge.shixun_id = shixun.id new_challenge.save! @@ -166,8 +178,9 @@ class WelcomeController < ApplicationController end end end - render :json => {status: 0, message: "success", identifier: shixun.identifier} + shixun_list << shixun.identifier end + render :json => {status: 0, message: "success", identifier: shixun_list} end end @@ -205,7 +218,7 @@ class WelcomeController < ApplicationController @tea_users = User.where(homepage_teacher: 1).includes(:user_extensions).limit(10).order("experience desc") @stu_users = User.includes(:user_extensions).where(user_extensions: {identity: 1}).limit(10).order("experience desc") - render :layout => 'educoder' + render :layout => 'base_local' end # 自动导入用户 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 6a5f8b8d..a2e5948a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -3995,7 +3995,7 @@ module ApplicationHelper # Returns the javascript tags that are included in the html layout head def javascript_heads - tags = javascript_include_tag('jquery-1.8.3-ui-1.9.2-ujs-2.0.3', 'application', 'jquery.colorbox-min', 'baiduTemplate') + tags = javascript_include_tag('jquery-1.8.3-ui-1.9.2-ujs-2.0.3', 'jquery.colorbox-min', 'baiduTemplate') unless User.current.pref.warn_on_leaving_unsaved == '0' tags << "\n".html_safe + javascript_tag("$(window).load(function(){ warnLeavingUnsaved('#{escape_javascript l(:text_warn_on_leaving_unsaved)}'); });") end @@ -4009,6 +4009,15 @@ module ApplicationHelper tags end + # 临时本地版 + def javascript_heads_local + tags = javascript_include_tag('jquery-1.8.3-ui-1.9.2-ujs-2.0.3', 'jquery.colorbox-min') + unless User.current.pref.warn_on_leaving_unsaved == '0' + tags << "\n".html_safe + javascript_tag("$(window).load(function(){ warnLeavingUnsaved('#{escape_javascript l(:text_warn_on_leaving_unsaved)}'); });") + end + tags + end + def hubspot_head tags = javascript_include_tag('hubspot/messenger.min', 'hubspot/messenger-theme-future') tags << stylesheet_link_tag('hubspot/messenger', 'hubspot/messenger-theme-future', 'hubspot/messenger-theme-flat') diff --git a/app/models/customer.rb b/app/models/customer.rb index 673acd20..14b4d710 100644 --- a/app/models/customer.rb +++ b/app/models/customer.rb @@ -1,6 +1,7 @@ class Customer < ActiveRecord::Base default_scope :order => 'customers.created_at desc' - belongs_to :partner - has_one :school + has_many :partners, :through => :partner_customers + has_many :partner_customers, :dependent => :destroy + belongs_to :school has_many :users end diff --git a/app/models/open_source_project.rb b/app/models/open_source_project.rb index 0adc0957..93b91fbb 100644 --- a/app/models/open_source_project.rb +++ b/app/models/open_source_project.rb @@ -121,13 +121,6 @@ class OpenSourceProject < ActiveRecord::Base ApplyProjectMaster.delete_all "apply_type = '#{self.class}' AND apply_id = #{self.id} AND user_id = #{user.id}" end - def admin?(user) - if user.admin? or ApplyProjectMaster.find(:all, :conditions => ["user_id = ? and apply_type = 'OpenSourceProject' and apply_id = ? and status = ?", user.id, self.id, 2]).present? - return true - else - return false - end - end def reset_counters! self.class.reset_counters!(id) diff --git a/app/models/openi.rb b/app/models/openi.rb new file mode 100644 index 00000000..44e7ac83 --- /dev/null +++ b/app/models/openi.rb @@ -0,0 +1,8 @@ +class Openi < ActiveRecord::Base + attr_accessible :allow, :avatar_url, :email, :login, :name, :openi_user_id, :user_id + belongs_to :user + + def self.find_by_login(login) + Openi.where(login: login).first + end +end diff --git a/app/models/partner.rb b/app/models/partner.rb index 217bc1a7..31920e53 100644 --- a/app/models/partner.rb +++ b/app/models/partner.rb @@ -2,7 +2,8 @@ class Partner < ActiveRecord::Base # attr_accessible :name, :active attr_accessor :active - has_one :school - has_many :customers + belongs_to :school + has_many :customers, :through => :partner_customers + has_many :partner_customers, :dependent => :destroy has_many :users end diff --git a/app/models/partner_customer.rb b/app/models/partner_customer.rb new file mode 100644 index 00000000..c9894cc9 --- /dev/null +++ b/app/models/partner_customer.rb @@ -0,0 +1,5 @@ +class PartnerCustomer < ActiveRecord::Base + # attr_accessible :title, :body + belongs_to :partner + belongs_to :customer +end diff --git a/app/models/school.rb b/app/models/school.rb index 8d377e97..021048fb 100644 --- a/app/models/school.rb +++ b/app/models/school.rb @@ -16,8 +16,8 @@ class School < ActiveRecord::Base has_many :ec_majors, :through => :ec_major_schools has_many :ec_major_schools, :dependent => :destroy - belongs_to :partner - belongs_to :customer + has_many :partners, :dependent => :destroy + has_many :customers, :dependent => :destroy # banner图片信息 has_many :school_images, :dependent => :destroy diff --git a/app/services/games_service.rb b/app/services/games_service.rb index 8573c683..bddb03b7 100644 --- a/app/services/games_service.rb +++ b/app/services/games_service.rb @@ -17,7 +17,7 @@ class GamesService myshixun = Myshixun.min.find(game.myshixun_id) shixun = Shixun.min.find(myshixun.shixun_id) - unless (myshixun.user_id == current_user.id || current_user.admin? || current_user.id == shixun.try(:user_id) || current_user.is_certification_teacher) + unless (myshixun.user_id == current_user.id || current_user.admin? || current_user.business? || current_user.id == shixun.try(:user_id) || current_user.is_certification_teacher) return{:status => 403} end game_challenge = Challenge.min.find(game.challenge_id) diff --git a/app/views/account/login.html.erb b/app/views/account/login.html.erb index a4af9782..83b6b152 100644 --- a/app/views/account/login.html.erb +++ b/app/views/account/login.html.erb @@ -73,15 +73,6 @@ <% end %> - - <%= render :partial => "account/copyright_info" %> diff --git a/app/views/layouts/_logined_header.html.erb b/app/views/layouts/_logined_header.html.erb index 6b282631..55cd14c9 100644 --- a/app/views/layouts/_logined_header.html.erb +++ b/app/views/layouts/_logined_header.html.erb @@ -6,25 +6,8 @@
职业路径
- -职业路径
- -