diff --git a/app/api/mobile/entities/course_dynamic.rb b/app/api/mobile/entities/course_dynamic.rb
index fe31668ff..6077a8722 100644
--- a/app/api/mobile/entities/course_dynamic.rb
+++ b/app/api/mobile/entities/course_dynamic.rb
@@ -4,56 +4,50 @@ module Mobile
include Redmine::I18n
def self.course_dynamic_expose(field)
expose field do |c,opt|
- if field == :update_time
- (format_time(c[field]) if (c.is_a?(Hash) && c.key?(field)))
- elsif field == :news_count
- obj = nil
- c[:dynamics].each do |d|
- if d[:type] == 1
- obj = d[:count]
- end
- end
- obj
- elsif field == :document_count
- obj = nil
- c[:dynamics].each do |d|
- if d[:type] == 3
- obj = d[:count]
- end
- end
- obj
- elsif field == :topic_count
- obj = nil
- c[:dynamics].each do |d|
- if d[:type] == 2
- obj = d[:count]
- end
- end
- obj
- elsif field == :homework_count
- obj = nil
- c[:dynamics].each do |d|
- if d[:type] == 4
- obj = d[:count]
- end
- end
- obj
- else
+ # if field == :news_count
+ # obj = nil
+ # c[:dynamics].each do |d|
+ # if d[:type] == 1
+ # obj = d[:count]
+ # end
+ # end
+ # obj
+ # elsif field == :document_count
+ # obj = nil
+ # c[:dynamics].each do |d|
+ # if d[:type] == 3
+ # obj = d[:count]
+ # end
+ # end
+ # obj
+ # elsif field == :topic_count
+ # obj = nil
+ # c[:dynamics].each do |d|
+ # if d[:type] == 2
+ # obj = d[:count]
+ # end
+ # end
+ # obj
+ # elsif field == :homework_count
+ # obj = nil
+ # c[:dynamics].each do |d|
+ # if d[:type] == 4
+ # obj = d[:count]
+ # end
+ # end
+ # obj
+ # else
c[field] if (c.is_a?(Hash) && c.key?(field))
- end
+ # end
end
end
- course_dynamic_expose :type
- course_dynamic_expose :count
course_dynamic_expose :course_name
course_dynamic_expose :course_term
course_dynamic_expose :course_time
course_dynamic_expose :course_id
course_dynamic_expose :course_img_url
course_dynamic_expose :message
- course_dynamic_expose :update_time
- course_dynamic_expose :count
course_dynamic_expose :news_count
course_dynamic_expose :document_count
course_dynamic_expose :topic_count
@@ -63,62 +57,32 @@ module Mobile
course_dynamic_expose :current_user_is_member
course_dynamic_expose :current_user_is_teacher
- expose :documents,using:Mobile::Entities::Attachment do |f,opt|
- obj = nil
- f[:dynamics].each do |d|
- if d[:type] == 3
- obj = d[:documents]
- end
- end
- obj
- end
+ # expose :documents,using:Mobile::Entities::Attachment do |f,opt|
+ # obj = nil
+ # f[:dynamics].each do |d|
+ # if d[:type] == 3
+ # obj = d[:documents]
+ # end
+ # end
+ # obj
+ # end
expose :topics,using:Mobile::Entities::Message do |f,opt|
- obj = nil
- f[:dynamics].each do |d|
- if d[:type] == 2
- obj = d[:topics]
- end
- end
- obj
+ f[:topics]
end
expose :homeworks,using:Mobile::Entities::Homework do |f,opt|
- obj = nil
- f[:dynamics].each do |d|
- if d[:type] == 4
- obj = d[:homeworks]
- end
- end
- obj
+ f[:homeworks]
end
expose :news,using:Mobile::Entities::News do |f,opt|
- obj = nil
- f[:dynamics].each do |d|
- if d[:type] == 1
- obj = d[:news]
- end
- end
- obj
+ f[:news]
end
expose :better_students,using:Mobile::Entities::User do |f,opt|
- obj = nil
- f[:dynamics].each do |d|
- if d[:type] == 6
- obj = d[:better_students]
- end
- end
- obj
+ f[:better_students]
end
expose :active_students,using:Mobile::Entities::User do |f,opt|
- obj = nil
- f[:dynamics].each do |d|
- if d[:type] == 7
- obj = d[:active_students]
- end
- end
- obj
+ f[:active_students]
end
end
diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb
index 086ecfb7f..1624008f2 100644
--- a/app/controllers/admin_controller.rb
+++ b/app/controllers/admin_controller.rb
@@ -337,6 +337,19 @@ class AdminController < ApplicationController
format.html
end
end
+
+ #学校列表
+ def schools
+ @school_name = params[:school_name]
+ if @school_name
+ @schools = School.where("name like '%#{@school_name}%'")
+ else
+ @schools = School.all
+ end
+ respond_to do |format|
+ format.html
+ end
+ end
#移动端版本管理
def mobile_version
@versions = PhoneAppVersion.reorder('created_at desc')
@@ -382,4 +395,78 @@ class AdminController < ApplicationController
end
+ #留言列表
+ def leave_messages
+ @jour = JournalsForMessage.find_by_sql("SELECT * FROM journals_for_messages AS j1
+ WHERE j1.jour_type IN ('Course','Principal') AND (j1.m_parent_id IS NULL OR (j1.m_parent_id IN (SELECT id FROM journals_for_messages WHERE jour_type IN ('Course','Principal')))) order by created_on desc")
+ @jour = paginateHelper @jour,30
+ @page = (params['page'] || 1).to_i - 1
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ #帖子
+ def messages_list
+ @memo = Memo.reorder("created_at desc")
+ @memo = paginateHelper @memo,30
+ @page = (params['page'] || 1).to_i - 1
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ #课程讨论区的帖子
+ def course_messages
+ @course_ms=Message.joins("join boards on messages.board_id=boards.id where boards.course_id is not NULL").reorder('created_on desc')
+ @course_ms = paginateHelper @course_ms,30
+ @page = (params['page'] || 1).to_i - 1
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ #项目讨论区的帖子
+ def project_messages
+ @project_ms=Message.joins("join boards on messages.board_id=boards.id where boards.project_id != -1").reorder('created_on desc')
+ @project_ms = paginateHelper @project_ms,30
+ @page = (params['page'] || 1).to_i - 1
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ #通知
+ def notices
+ @news = News.where('course_id is not NULL').order('created_on desc')
+ @news = paginateHelper @news,30
+ @page = (params['page'] || 1).to_i - 1
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ #最近登录用户列表
+ def latest_login_users
+ scope = User.order('last_login_on desc')
+ scope = scope.where("last_login_on>= '#{params[:startdate]} 00:00:00'") if params[:startdate].present?
+ scope =scope.where("last_login_on <= '#{params[:enddate]} 23:59:59'") if params[:enddate].present?
+ @user = scope
+ @user = paginateHelper @user,30
+ @page = (params['page'] || 1).to_i - 1
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ #作业
+ def homework
+ @homework = HomeworkCommon.order('end_time desc')
+ @homework = paginateHelper @homework,30
+ @page = (params['page'] || 1).to_i - 1
+ respond_to do |format|
+ format.html
+ end
+ end
+
end
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index a301a1e6c..ee953e913 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -514,6 +514,8 @@ private
end
def has_login
- render_403 unless User.current.logged?
+ unless @attachment && @attachment.container_type == "PhoneAppVersion"
+ render_403 unless User.current.logged?
+ end
end
end
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index a0a61786c..29f2e00f4 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -20,11 +20,10 @@ class CoursesController < ApplicationController
menu_item l(:label_sort_by_influence), :only => :index
before_filter :can_show_course, :except => []
- before_filter :logged_user_by_apptoken,:only => [:show,:new_homework,:feedback]
- before_filter :find_course, :except => [ :index, :search,:list, :new,:join,:unjoin, :create, :copy, :statistics, :new_join, :course, :enterprise_course, :course_enterprise,:view_homework_attaches,:join_private_courses]
- before_filter :authorize_course, :only => [:show, :settings, :edit, :update, :modules, :close, :reopen, :view_homework_attaches, :course]
- before_filter :authorize_course_global, :only => [:view_homework_attaches, :new,:create]
- before_filter :require_admin, :only => [:copy, :archive, :unarchive, :destroy, :calendar]
+ before_filter :logged_user_by_apptoken,:only => [:show,:feedback]
+ before_filter :find_course, :except => [ :index, :search, :new,:join,:unjoin, :create, :new_join, :course,:join_private_courses]
+ before_filter :authorize_course, :only => [:show, :settings, :update, :course]
+ before_filter :authorize_course_global, :only => [:new,:create]
before_filter :toggleCourse, :only => [:finishcourse, :restartcourse]
before_filter :require_login, :only => [:join, :unjoin]
@@ -40,9 +39,14 @@ class CoursesController < ApplicationController
else
@state = 5 #未登录
end
- respond_to do |format|
- format.js { render :partial => 'set_join', :locals => {:user => user, :course => course, :object_id => params[:object_id]} }
- end
+ # if @state == 1 || @state == 3
+ # respond_to course_path(course.id)
+ # else
+ respond_to do |format|
+ format.js { render :partial => 'set_join', :locals => {:user => user, :course => course, :object_id => params[:object_id]} }
+ end
+ #end
+
rescue Exception => e
@state = 4 #已经加入了课程
respond_to do |format|
@@ -102,74 +106,17 @@ class CoursesController < ApplicationController
# 课程搜索
# add by nwb
def search
- courses_all = Course.all_course
- name = params[:name]
- if name.blank?
- @courses = []
- @courses_all = []
- @course_count = 0
- @course_pages = Paginator.new @course_count, per_page_option, params['page']
+ if params[:name].empty?
+ courses = Course.visible
+ @courses = paginateHelper courses,10
else
- @courses = courses_all.visible
- if params[:name].present?
- @courses_all = @courses.like(params[:name])
- else
- @courses_all = @courses;
- end
- @course_count = @courses_all.count
- @course_pages = Paginator.new @course_count, per_page_option, params['page']
-
- # 课程的动态数
- @course_activity_count=Hash.new
- @courses_all.each do |course|
- @course_activity_count[course.id]=0
- end
-
- case params[:course_sort_type]
- when '0'
- @courses = @courses_all.order("created_at desc")
- @s_type = 0
- @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
-
- @course_activity_count=get_course_activity @courses,@course_activity_count
-
- when '1'
- @courses = @courses_all.order("course_ac_para desc")
- @s_type = 1
- @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
-
- @course_activity_count=get_course_activity @courses,@course_activity_count
-
- when '2'
- @courses = @courses_all.order("watchers_count desc")
- @s_type = 2
- @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
-
- @course_activity_count=get_course_activity @courses,@course_activity_count
-
- when '3'
- @course_activity_count=get_course_activity @courses_all,@course_activity_count_array
- @courses=handle_course @courses_all,@course_activity_count
- @s_type = 3
- @courses = @courses[@course_pages.offset, @course_pages.per_page]
-
- else
- @s_type = 0
- @courses = @courses_all.order("created_at desc")
- @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
-
- @course_activity_count=get_course_activity @courses,@course_activity_count
-
- end
+ courses = Course.visible.where("LOWER(name) like '%#{params[:name].to_s.downcase}%'")
+ @courses = paginateHelper courses,10
end
respond_to do |format|
format.html {
render :layout => 'course_base'
- scope = Course
- unless params[:closed]
- scope = scope.active
- end
}
format.atom {
courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
@@ -605,7 +552,7 @@ class CoursesController < ApplicationController
def toggleCourse
@course_prefs = Course.find_by_extra(@course.extra)
- unless (@course_prefs.teacher == User.current || User.current.admin?)
+ unless (User.current.allowed_to?(:as_teacher,@course_prefs) || User.current.admin?)
render_403
end
end
@@ -659,92 +606,9 @@ class CoursesController < ApplicationController
end
def show
- if params[:jump] && redirect_to_course_menu_item(@course, params[:jump])
- return
- end
- @users_by_role = @course.users_by_role
- if(User.find_by_id(CourseInfos.find_by_course_id(@course.id).try(:user_id)))
- @user = User.find_by_id(CourseInfos.find_by_course_id(@course.id).user_id)
- end
- @key = User.current.rss_key
- #新增内容
- @days = Setting.activity_days_default.to_i
- if params[:from]
- begin; @date_to = params[:from].to_date + 1; rescue; end
- end
- has = {
- "show_course_files" => true,
- "show_course_news" => true,
- "show_course_messages" => true,
- #"show_course_journals_for_messages" => true,
- # "show_bids" => true,
- # "show_homeworks" => true,
- "show_polls" => true
- }
- @date_to ||= Date.today + 1
- @date_from = (@date_to - @days) > @course.created_at.to_date ? (@date_to - @days) : @course.created_at.to_date
- @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
- if @author.nil?
- # 显示老师和助教的活动
- # @authors = searchTeacherAndAssistant(@course)
- @authors = course_all_member(@course)
- events = []
- key = "course_events_#{@course.id}".to_sym
- if Rails.env.production? && Setting.course_cahce_enabled?
- events = Rails.cache.read(key) || []
- end
- if events.empty?
- @authors.each do |author|
- @activity = Redmine::Activity::Fetcher.new(User.current, :course => @course,
- :with_subprojects => false,
- :author => author.user)
-
- @activity.scope_select {|t| has["show_#{t}"]}
- # modify by nwb
- # 添加私密性判断
- if User.current.member_of_course?(@course)|| User.current.admin?
- events += @activity.events(@days, @course.created_at)
- else
- events += @activity.events(@days, @course.created_at, :is_public => 1)
- end
- end
- Rails.cache.write(key, events) if Rails.env.production? && Setting.course_cahce_enabled?
- end
- else
- # @author = @course.teacher
- @activity = Redmine::Activity::Fetcher.new(User.current, :course => @course,
- :with_subprojects => false,
- :author => @author)
-
- @activity.scope_select {|t| has["show_#{t}"]}
- # modify by nwb
- # 添加私密性判断
- if User.current.member_of_course?(@course)|| User.current.admin?
- events = @activity.events(@days, @course.created_at)
- else
- events = @activity.events(@days, @course.created_at, :is_public => 1)
- end
- end
-
- # 无新动态时,显示老动态
- if events.count == 0
- if User.current.member_of_course?(@course)|| User.current.admin?
- events = @activity.events
- else
- events = @activity.events(:is_public => 1)
- end
- end
- @sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category'
- if(User.find_by_id(CourseInfos.find_by_course_id(@course.id).try(:user_id)))
- @user = User.find_by_id(CourseInfos.find_by_course_id(@course.id).user_id)
- end
-
- sorted_events = sort_activity_events_course(events)
- events = paginateHelper sorted_events,10
- @events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)}
- # documents
-
-
+ course_activities = @course.course_activities.order("created_at desc")
+ @canShowRealName = User.current.member_of_course? @course
+ @course_activities = paginateHelper course_activities,10
respond_to do |format|
format.html{render :layout => 'base_courses'}
format.api
@@ -809,6 +673,12 @@ class CoursesController < ApplicationController
end
end
+ #删除课程
+ #删除课程只是将课程的is_delete状态改为false,is_delete为false状态的课程只有管理员可以看到
+ def destroy
+
+ end
+
private
def allow_join course
if course_endTime_timeout? course
diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb
index 19c1214e2..7b81d12db 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -177,11 +177,11 @@ class FilesController < ApplicationController
def index
@flag = params[:flag] || false
#sort_init 'filename', 'asc'
- sort_init 'created_on', 'desc'
- sort_update 'created_on' => "#{Attachment.table_name}.created_on",
- 'filename' => "#{Attachment.table_name}.filename",
- 'size' => "#{Attachment.table_name}.filesize",
- 'downloads' => "#{Attachment.table_name}.downloads"
+ # sort_init 'created_on', 'desc'
+ # sort_update 'created_on' => "#{Attachment.table_name}.created_on",
+ # 'filename' => "#{Attachment.table_name}.filename",
+ # 'size' => "#{Attachment.table_name}.filesize",
+ # 'downloads' => "#{Attachment.table_name}.downloads"
sort = ""
@sort = ""
@order = ""
diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb
index 6e6fa7d20..87c1e288b 100644
--- a/app/controllers/homework_common_controller.rb
+++ b/app/controllers/homework_common_controller.rb
@@ -1,6 +1,7 @@
class HomeworkCommonController < ApplicationController
require 'net/http'
require 'json'
+ require "base64"
layout "base_courses"
before_filter :find_course, :only => [:index,:new,:create,:next_step]
before_filter :find_homework, :only => [:edit,:update,:alert_anonymous_comment,:start_anonymous_comment,:stop_anonymous_comment,:destroy]
@@ -18,6 +19,28 @@ class HomeworkCommonController < ApplicationController
end
def new
+ @homework_type = "1"
+
+ @homework = HomeworkCommon.new
+ @homework.safe_attributes = params[:homework_common]
+ @homework.late_penalty = 2
+ @homework.end_time = (Time.now + 3600 * 24).strftime('%Y-%m-%d')
+ @homework.publish_time = Time.now.strftime('%Y-%m-%d')
+
+ if @homework_type == "1"
+ #匿评作业相关属性
+ @homework_detail_manual = HomeworkDetailManual.new
+ @homework_detail_manual.ta_proportion = 0.6
+ @homework_detail_manual.absence_penalty = 2
+ @homework_detail_manual.evaluation_num = 3
+ @homework_detail_manual.evaluation_start = Time.now.strftime('%Y-%m-%d')
+ @homework_detail_manual.evaluation_end = (Time.now + 3600 * 24).strftime('%Y-%m-%d')
+ @homework.homework_detail_manual = @homework_detail_manual
+ elsif @homework_type == "2"
+ #编程作业相关属性
+ @homework_detail_programing = HomeworkDetailPrograming.new
+ @homework.homework_detail_programing = @homework_detail_programing
+ end
respond_to do |format|
format.html
end
@@ -29,7 +52,7 @@ class HomeworkCommonController < ApplicationController
@homework = HomeworkCommon.new
@homework.safe_attributes = params[:homework_common]
- @homework.late_penalty = 0
+ @homework.late_penalty = 2
@homework.end_time = (Time.now + 3600 * 24).strftime('%Y-%m-%d')
@homework.publish_time = Time.now.strftime('%Y-%m-%d')
@@ -37,7 +60,7 @@ class HomeworkCommonController < ApplicationController
#匿评作业相关属性
@homework_detail_manual = HomeworkDetailManual.new
@homework_detail_manual.ta_proportion = 0.6
- @homework_detail_manual.absence_penalty = 0
+ @homework_detail_manual.absence_penalty = 2
@homework_detail_manual.evaluation_num = 3
@homework_detail_manual.evaluation_start = Time.now.strftime('%Y-%m-%d')
@homework_detail_manual.evaluation_end = (Time.now + 3600 * 24).strftime('%Y-%m-%d')
@@ -71,18 +94,20 @@ class HomeworkCommonController < ApplicationController
if homework.homework_type == 2
homework_detail_programing = HomeworkDetailPrograming.new
- homework_detail_programing.language = "C++"
+ homework_detail_programing.language = params[:language]
homework_detail_programing.standard_code = params[:standard_code]
-
+ homework_detail_programing.ta_proportion = params[:ta_proportion] || 0.6
question = {title:homework.name,content:homework.description}
question[:input] = []
question[:output] = []
- if params[:input] && params[:output]
+ if params[:input] && params[:output] && params[:result]
params[:input].each do |k,v|
if params[:output].include? k
homework_test = HomeworkTest.new
homework_test.input = v
homework_test.output = params[:output][k]
+ homework_test.result = params[:result][k]
+ homework_test.error_msg = params[:error_msg]
homework.homework_tests << homework_test
question[:input] << homework_test.input
question[:output] << homework_test.output
@@ -122,6 +147,8 @@ class HomeworkCommonController < ApplicationController
end
if homework.save
+ homework_detail_programing.save if homework_detail_programing
+ homework_detail_manual.save if homework_detail_manual
respond_to do |format|
format.html {
flash[:notice] = l(:notice_successful_create)
@@ -187,8 +214,9 @@ class HomeworkCommonController < ApplicationController
end
if @homework.homework_type == 2 && @homework_detail_programing #编程作业
- @homework_detail_programing.language = "C++"
+ @homework_detail_programing.language = params[:language]
@homework_detail_programing.standard_code = params[:standard_code]
+ @homework_detail_programing.ta_proportion = params[:ta_proportion] || 0.6
homework_tests = @homework.homework_tests
#需要删除的测试
ids = homework_tests.map(&:id) - params[:input].keys.map(&:to_i)
@@ -196,23 +224,45 @@ class HomeworkCommonController < ApplicationController
homework_test = HomeworkTest.find id
homework_test.destroy if homework_test
end
- if params[:input] && params[:output]
+ if params[:input] && params[:output] && params[:result]
params[:input].each do |k,v|
if params[:output].include? k
homework_test = HomeworkTest.find_by_id k
if homework_test #已存在的测试,修改
homework_test.input = v
homework_test.output = params[:output][k]
+ homework_test.result = params[:result][k]
+ homework_test.error_msg = params[:error_msg]
else #不存在的测试,增加
homework_test = HomeworkTest.new
homework_test.input = v
homework_test.output = params[:output][k]
+ homework_test.result = params[:result][k]
+ homework_test.error_msg = params[:error_msg]
homework_test.homework_common = @homework
end
homework_test.save
end
end
end
+
+ #发送修改作业的请求
+ question = {title:@homework.name,content:@homework.description}
+ question[:input] = []
+ question[:output] = []
+ @homework.homework_tests.each do |test|
+ question[:input] << test.input
+ question[:output] << test.output
+ end
+ uri = URI("http://192.168.80.21:8080/api/questions/#{@homework_detail_programing.question_id}.json")
+ body = question.to_json
+ res = Net::HTTP.new(uri.host, uri.port).start do |client|
+ request = Net::HTTP::Put.new(uri.path)
+ request.body = body
+ request["Content-Type"] = "application/json"
+ client.request(request)
+ end
+ result = JSON.parse(res.body)
end
@homework.save_attachments(params[:attachments])
@@ -308,6 +358,24 @@ class HomeworkCommonController < ApplicationController
end
end
+ def programing_test
+ test = {language:params[:language],src:Base64.encode64(params[:src]),input:[params[:input]],output:[params[:output]]}
+ @index = params[:index]
+ uri = URI('http://192.168.80.21:8080/api/realtime.json')
+ body = test.to_json
+ res = Net::HTTP.new(uri.host, uri.port).start do |client|
+ request = Net::HTTP::Post.new(uri.path)
+ request.body = body
+ request["Content-Type"] = "application/json"
+ client.request(request)
+ end
+ result = JSON.parse(res.body)
+ @err_msg = result["compile_error_msg"]
+ result["results"].each do |re|
+ @result = re["status"]
+ end
+ end
+
private
#获取课程
def find_course
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index 539d84e65..0995d1304 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -112,7 +112,19 @@ class IssuesController < ApplicationController
end
def show
-
+ # 当前用户查看指派给他的缺陷消息,则设置消息为已读
+ query = @issue.forge_messages
+ if User.current.id == @issue.assigned_to_id
+ query.update_all(:viewed => true)
+ end
+ # 缺陷状态更新
+ query_journals = @issue.journals
+ if User.current.id == @issue.author_id
+ query_journals.each do |query_journal|
+ query_journal.forge_messages.update_all(:viewed => true)
+ end
+ end
+ #
@journals = @issue.journals.includes(:user, :details).reorder("#{Journal.table_name}.id ASC").all
@journals.each_with_index {|j,i| j.indice = i+1}
@journals.reject!(&:private_notes?) unless User.current.allowed_to?(:view_private_notes, @issue.project)
diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb
index 56b4a30fc..1a8e75b54 100644
--- a/app/controllers/news_controller.rb
+++ b/app/controllers/news_controller.rb
@@ -71,10 +71,15 @@ class NewsController < ApplicationController
scope = @course ? @course.news.course_visible : News.course_visible
@news_count = scope.count
- #@news_pages = Paginator.new @news_count, @limit, params['page']
- #@offset ||= scope_page.offset
- scope_order = scope.all(:include => [:author, :course],
- :order => "#{News.table_name}.created_on DESC")
+ @q = params[:subject]
+ if params[:subject].nil? || params[:subject].blank?
+ scope_order = scope.all(:include => [:author, :course],
+ :order => "#{News.table_name}.created_on DESC")
+ else
+ scope_order = scope.where("#{News.table_name}.title like '#{'%' << params[:subject].to_s << '%'}'").all(:include => [:author, :course],
+ :order => "#{News.table_name}.created_on DESC")
+ end
+
# :offset => @offset,
# :limit => @limit)
@newss = paginateHelper scope_order,10
@@ -83,6 +88,7 @@ class NewsController < ApplicationController
@news = News.new
render :layout => 'base_courses'
}
+ format.js
format.api
format.atom { render_feed(@newss, :title => (@course ? @course.name : Setting.app_title) + ": #{l(:label_news_plural)}") }
end
@@ -141,7 +147,7 @@ class NewsController < ApplicationController
ids = params[:asset_id].split(',')
update_kindeditor_assets_owner ids,@news.id,OwnerTypeHelper::NEWS
end
- # ض̬ļ¼add start
+ # ������ض�̬�ļ�¼add start
teachers = searchTeacherAndAssistant(@course)
for teacher in teachers
if(teacher.user_id != User.current.id)
@@ -155,7 +161,7 @@ class NewsController < ApplicationController
notify.save()
end
end
- # ض̬ļ¼add end
+ # ������ض�̬�ļ�¼add end
render_attachment_warning_if_needed(@news)
flash[:notice] = l(:notice_successful_create)
redirect_to course_news_index_url(@course)
diff --git a/app/controllers/poll_controller.rb b/app/controllers/poll_controller.rb
index 758747e02..edf8c2259 100644
--- a/app/controllers/poll_controller.rb
+++ b/app/controllers/poll_controller.rb
@@ -1,3 +1,4 @@
+#encoding utf-8
class PollController < ApplicationController
before_filter :find_poll_and_course, :only => [:edit,:update,:destroy,:show,:statistics_result,:create_poll_question,:commit_poll,:commit_answer,:publish_poll,:republish_poll,:poll_result,:close_poll,:export_poll]
before_filter :find_container, :only => [:new,:create, :index]
@@ -137,11 +138,19 @@ class PollController < ApplicationController
@poll_questions.poll_answers.new question_option
end
end
- if @poll_questions.save
- respond_to do |format|
- format.js
- end
+ # 如果是插入的话,那么从插入的这个id以后的question_num都将要+1
+ if params[:quest_id]
+ @is_insert = true
+ @poll.poll_questions.where("question_number > #{params[:quest_num].to_i}").update_all(" question_number = question_number + 1")
+ @poll_question_num = params[:quest_num].to_i
+ @poll_questions.question_number = params[:quest_num].to_i + 1
end
+ if @poll_questions.save
+ respond_to do |format|
+ format.js
+ end
+ end
+
end
#修改题目
@@ -328,6 +337,37 @@ class PollController < ApplicationController
end
end
+
+ def import_poll
+ @poll = Poll.find(params[:to_id])
+ question_num = @poll.poll_questions.select("max(question_number) question_number").first.question_number
+ import_poll = Poll.find(params[:import_id])
+ import_poll.poll_questions.each_with_index do |question,index|
+ option = {
+ :is_necessary => question.is_necessary,
+ :question_title => question.question_title,
+ :question_type => question.question_type,
+ :question_number => question_num + index+1
+ }
+ poll_questions = @poll.poll_questions.new option
+ for i in 1..question.poll_answers.count
+ answer = question.poll_answers[i-1][:answer_text]
+ question_option = {
+ :answer_position => i,
+ :answer_text => answer
+ }
+ poll_questions.poll_answers.new question_option
+ end
+ @poll.poll_questions << poll_questions
+ end
+ if @poll.save
+ @poll = Poll.find(params[:to_id])
+ respond_to do |format|
+ format.js
+ end
+ end
+ end
+
#重新发布问卷
def republish_poll
@poll.poll_questions.each do |poll_question|
@@ -371,6 +411,70 @@ class PollController < ApplicationController
end
end
+ # 将其他地方的问卷导出来
+ def other_poll
+ # 查作者是我,或者作者是当前课程的老师,且不在当前课程内的问卷 进行导入
+ tea_ids = '('
+ tea_ids << Course.find(params[:polls_group_id]).tea_id.to_s << ','<< User.current.id.to_s << ')'
+ @polls = Poll.where("user_id in #{tea_ids} and polls_type = 'course' and polls_group_id != #{params[:polls_group_id]}")
+ @polls_group_id = params[:polls_group_id]
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ # 将问卷导入本课程
+ def import_other_poll
+ course_id = params[:course_id]
+ @course = Course.find(course_id)
+ params[:polls].each_with_index do |p,i|
+ poll = Poll.find(p)
+ option = {
+ :polls_name => poll.polls_name || l(:label_poll_new),
+ :polls_type => 'Course',
+ :polls_group_id => course_id,
+ :polls_status => 1,
+ :user_id => User.current.id,
+ :published_at => Time.now,
+ :closed_at => Time.now,
+ :show_result => 1,
+ :polls_description => poll.polls_description
+ }
+ @poll = Poll.create option
+
+ poll.poll_questions.each do | q|
+ #question_title = params[:poll_questions_title].nil? || params[:poll_questions_title].empty? ? l(:label_enter_single_title) : params[:poll_questions_title]
+ option = {
+ :is_necessary => q[:is_necessary],
+ :question_title => q[:question_title],
+ :question_type => q[:question_type] || 1,
+ :question_number => q[:question_number]
+ }
+ @poll_questions = @poll.poll_questions.new option
+
+ for i in 1..q.poll_answers.count
+ answer = q.poll_answers[i-1].nil? ? l(:label_new_answer) : q.poll_answers[i-1][:answer_text]
+ question_option = {
+ :answer_position => i,
+ :answer_text => answer
+ }
+ @poll_questions.poll_answers.new question_option
+ end
+ end
+ @poll.save
+ end
+ @is_teacher = User.current.allowed_to?(:as_teacher,@course)
+ if @is_teacher
+ polls = Poll.where("polls_type = 'Course' and polls_group_id = #{@course.id}")
+ else
+ polls = Poll.where("polls_type = 'Course' and polls_group_id = #{@course.id} and polls_status = 2")
+ end
+ @polls = paginateHelper polls,20 #分页
+ respond_to do |format|
+ format.js
+ end
+ end
+
private
def find_poll_and_course
@poll = Poll.find params[:id]
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index e194c32ab..f042bba50 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -86,8 +86,14 @@ class ProjectsController < ApplicationController
@project_pages = Project.project_entities.visible.like(params[:name]).page(params[:page]).per(10)
else
@project_pages = Project.project_entities.visible.page(params[:page] ).per(10)
+ @project_pages = Project.project_entities.visible.page(params[:page] ).per(10)
end
@projects = @project_pages.order("created_on desc")
+ @limit = 10#per_page_option
+
+ @project_count = Project.project_entities.visible.like(params[:name]).page(params[:page]).count
+ @project_pages = Paginator.new @project_count, @limit, params['page']
+
respond_to do |format|
format.html {
render :layout => 'base'
@@ -150,11 +156,15 @@ class ProjectsController < ApplicationController
end
def new
- @issue_custom_fields = IssueCustomField.sorted.all
- @trackers = Tracker.sorted.all
- @project = Project.new
- @project.safe_attributes = params[:project]
- render :layout => 'base'
+ if User.current.login?
+ @issue_custom_fields = IssueCustomField.sorted.all
+ @trackers = Tracker.sorted.all
+ @project = Project.new
+ @project.safe_attributes = params[:project]
+ render :layout => 'base'
+ else
+ redirect_to signin_url
+ end
end
def share
@@ -167,6 +177,10 @@ class ProjectsController < ApplicationController
end
def create
+ unless User.current.login?
+ redirect_to signin_url
+ return
+ end
@issue_custom_fields = IssueCustomField.sorted.all
@trackers = Tracker.sorted.all
@project = Project.new
@@ -280,11 +294,11 @@ class ProjectsController < ApplicationController
# 根据私密性,取出符合条件的所有数据
if User.current.member_of?(@project) || User.current.admin?
- @events_pages = ForgeActivity.where("project_id = ?",@project).order("created_at desc").page(params['page'|| 1]).per(20);
+ @events_pages = ForgeActivity.where("project_id = ? and forge_act_type != ?",@project, "Document" ).order("created_at desc").page(params['page'|| 1]).per(20);
#events = @activity.events(@date_from, @date_to)
else
@events_pages = ForgeActivity.includes(:project).where("forge_activities.project_id = ? and projects.is_public
- = ?",@project,1).order("created_at desc")
+ = ? and forge_act_type != ? ",@project,1, "Document").order("created_at desc")
.page(params['page'|| 1]).per(10);
# @events = @activity.events(@date_from, @date_to, :is_public => 1)
end
@@ -361,12 +375,6 @@ class ProjectsController < ApplicationController
end
end
- # dts测试工具
- def dts_rep
- render_403 unless User.current.admin?
- @dts = Dts.all
- end
-
#发送邮件邀请新用户
def invite_members_by_mail
if User.current.member_of?(@project) || User.current.admin?
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index b335e1830..e0aea0c2e 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -449,6 +449,8 @@ update
def stats
@project_id = params[:id]
@repository_id = @repository.identifier
+ # 提交次数统计
+ @status_commit_count = Changeset.count(:conditions => ["#{Changeset.table_name}.repository_id = ?", @repository.id])
render :layout => 'base_projects'
end
@@ -459,6 +461,12 @@ update
data = graph_commits_per_month(@repository)
when "commits_per_author"
data = graph_commits_per_author(@repository)
+ when "author_commits_per_month"
+ data = graph_author_commits_per_month(@repository)
+ when "author_commits_six_month"
+ data = author_commits_six_month(@repository)
+ when "author_code_six_months"
+ data = author_code_six_month(@repository)
end
if data
headers["Content-Type"] = "image/svg+xml"
@@ -484,7 +492,18 @@ update
if params[:repository_id].present?
@repository = @project.repositories.find_by_identifier_param(params[:repository_id])
else
- @repository = @project.repository
+ # 多版本库,如果一个版本库为空则去下一个
+ rep_count = @project.repositories.count
+ if @project.repository.nil?
+ for i in 0..rep_count
+ unless @project.repositories[i].nil?
+ @repository = @project.repositories[i]
+ break
+ end
+ end
+ else
+ @repository = @project.repository
+ end
end
(render_404; return false) unless @repository
@path = params[:path].is_a?(Array) ? params[:path].join('/') : params[:path].to_s
@@ -606,6 +625,123 @@ update
)
graph.burn
end
+
+ # 用户最近一年的提交次数
+ def graph_author_commits_per_month(repository)
+ @date_to = Date.today
+ @date_from = @date_to << 12
+ @date_from = Date.civil(@date_from.year, @date_from.month, @date_from.day)
+ commits_by_author = Changeset.count(:all, :group => :committer,
+ :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
+ commits_by_author = commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}.last(25)
+
+ fields = commits_by_author.collect {|r| r.first}
+ commits_data = commits_by_author.collect {|r| r.last}
+
+ fields = fields + [""]*(10 - fields.length) if fields.length<10
+ commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
+
+ # Remove email adress in usernames
+ fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
+
+ graph = SVG::Graph::BarHorizontal.new(
+ :height => 400,
+ :width => 600,
+ :fields => fields,
+ :stack => :side,
+ :scale_integers => true,
+ :show_data_values => true,
+ :rotate_y_labels => false,
+ :graph_title => l(:label_author_commits_year),
+ :show_graph_title => true,
+ :no_css => true
+ )
+ graph.add_data(
+ :data => commits_data,
+ :title => l(:label_revision_commit_count)
+ )
+ graph.burn
+ end
+
+ # 用户最近六个月的提交次数
+ def author_commits_six_month(repository)
+ @date_to = Date.today
+ @date_from = @date_to << 6
+ @date_from = Date.civil(@date_from.year, @date_from.month, @date_from.day)
+ commits_by_author = Changeset.count(:all, :group => :committer,
+ :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
+ commits_by_author = commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}.last(25)
+
+ fields = commits_by_author.collect {|r| r.first}
+ commits_data = commits_by_author.collect {|r| r.last}
+
+ fields = fields + [""]*(10 - fields.length) if fields.length<10
+ commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
+
+ # Remove email adress in usernames
+ fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
+
+ graph = SVG::Graph::BarHorizontal.new(
+ :height => 400,
+ :width => 600,
+ :fields => fields,
+ :stack => :side,
+ :scale_integers => true,
+ :show_data_values => true,
+ :rotate_y_labels => false,
+ :graph_title => l(:label_author_commits_six_month),
+ :show_graph_title => true
+ )
+ graph.add_data(
+ :data => commits_data,
+ :title => l(:label_revision_commit_count)
+ )
+ graph.burn
+ end
+
+ # 最近六个月代码量统计
+ def author_code_six_month(repository)
+ @date_to = Date.today
+ @date_from = @date_to << 6
+ @date_from = Date.civil(@date_from.year, @date_from.month, @date_from.day)
+ commits_by_author = Changeset.count(:group => :committer, :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
+ commits_by_author = commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}.last(40)
+ all_author = []
+ commits_by_author.each do |cba|
+ all_author << cba.first
+ end
+ # all_author = all_author.collect {|c| c.gsub(%r{/ /<.+@.+>}, '') }
+ all_author = all_author.collect {|c| c.split.first }
+ commits_by_author = repository.commits(all_author, "#{@date_from}", "#{@date_to}", repository.id == 150 ? "szzh" : 'master')
+
+ fields = commits_by_author.collect {|r| r.first}
+ commits_data = commits_by_author.collect {|r| r.last}
+
+ fields = fields + [""]*(10 - fields.length) if fields.length<10
+ commits_data = commits_data + [0]*(10 - commits_data.length) if commits_data.length<10
+
+ # Remove email adress in usernames
+ fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
+
+ graph = SVG::Graph::BarHorizontal.new(
+ :height => 400,
+ :width => 600,
+ :fields => fields,
+ :stack => :side,
+ :scale_integers => true,
+ :show_data_values => true,
+ :rotate_y_labels => false,
+ :graph_title => l(:label_author_code_six_month),
+ :show_graph_title => true
+ )
+ graph.add_data(
+ :data => commits_data,
+ :title => l(:lable_revision_code_count)
+ )
+ graph.burn
+ end
+
+
def check_hidden_repo
project = Project.find(params[:id])
if !User.current.member_of?(project)
diff --git a/app/controllers/school_controller.rb b/app/controllers/school_controller.rb
index 008fe00fc..3e0c280ac 100644
--- a/app/controllers/school_controller.rb
+++ b/app/controllers/school_controller.rb
@@ -4,28 +4,21 @@ class SchoolController < ApplicationController
def upload
uploaded_io = params[:logo]
- school_id = 0
- schools = School.where("name = ?", params[:school])
-
- schools.each do |s|
- school_id = s.id
- end
-
+ school_id ||= params[:id]
unless uploaded_io.nil?
File.open(Rails.root.join('public', 'images', 'school', school_id.to_s+'.png'), 'wb') do |file|
file.write(uploaded_io.read)
end
-
s1 = School.find(school_id)
s1.logo_link = '/images/school/'+school_id.to_s+'.png'
s1.save
-
-
- end
+ end
+ redirect_to admin_schools_url(:school_name => params[:school_name])
end
def upload_logo
-
+ @school = School.find params[:id]
+ @school_name = params[:school_name]
end
#获取制定学校开设的课程数
diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb
index dae0bcab6..01f858442 100644
--- a/app/controllers/student_work_controller.rb
+++ b/app/controllers/student_work_controller.rb
@@ -128,7 +128,7 @@ class StudentWorkController < ApplicationController
solutions = {
student_work_id:stundet_work.id,
src:Base64.encode64(stundet_work.description),
- language:1
+ language:@homework.homework_detail_programing.language
}
uri = URI(url)
body = solutions.to_json
@@ -157,7 +157,7 @@ class StudentWorkController < ApplicationController
end
def edit
- if @homework.homework_type == 2 #编程作业不能修改作业
+ if !User.current.admin? && @homework.homework_type == 2 #编程作业不能修改作业
render_403
else
respond_to do |format|
@@ -387,8 +387,8 @@ class StudentWorkController < ApplicationController
if stundet_work && params[:results] && params[:results].class.to_s == "Array"
homework_common = stundet_work.homework_common
params[:results].each do |result|
- homework_test = homework_common.homework_tests.where("input = '#{result[:input]}' AND output = '#{result[:output]}'").first
- if homework_test
+ homework_tests = homework_common.homework_tests.where("input = '#{result[:input]}' AND output = '#{result[:output]}'")
+ homework_tests.each do |homework_test|
student_work_test = StudentWorkTest.new
student_work_test.student_work = stundet_work
student_work_test.homework_test = homework_test
@@ -396,6 +396,7 @@ class StudentWorkController < ApplicationController
if student_work_test.result == 0
student_score_count += 1
end
+ student_work_test.error_msg = params[:compile_error_msg]
student_work_test.save!
end
end
@@ -444,7 +445,7 @@ class StudentWorkController < ApplicationController
#判断是不是当前作品的提交者
#提交者 && (非匿评作业 || 未开启匿评) 可以编辑作品
def author_of_work
- render_403 unless (User.current.id == @work.user_id || User.current.admin?) && (@homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 )
+ render_403 unless User.current.admin? || (User.current.id == @work.user_id && @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 )
end
def teacher_of_course
@@ -467,22 +468,60 @@ class StudentWorkController < ApplicationController
sheet1 = book.create_worksheet :name => "homework"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
sheet1.row(0).default_format = blue
- sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),
- l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_f_score),l(:excel_commit_time)])
- count_row = 1
- items.each do |homework|
- sheet1[count_row,0]=homework.user.id
- sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s
- sheet1[count_row,2] = homework.user.login
- sheet1[count_row,3] = homework.user.user_extensions.student_id
- sheet1[count_row,4] = homework.user.mail
- sheet1[count_row,5] = homework.name
- sheet1[count_row,6] = homework.teacher_score.nil? ? l(:label_without_score) : format("%.2f",homework.teacher_score)
- sheet1[count_row,7] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : format("%.2f",homework.teaching_asistant_score)
- sheet1[count_row,8] = homework.student_score.nil? ? l(:label_without_score) : format("%.2f",homework.student_score)
- sheet1[count_row,9] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : format("%.2f",homework.score) : l(:label_without_score)
- sheet1[count_row,10] = format_time(homework.created_at)
- count_row += 1
+ if @homework.homework_type == 0 #普通作业
+ sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),
+ l(:excel_t_score),l(:excel_ta_score),l(:excel_f_score),l(:excel_commit_time)])
+ count_row = 1
+ items.each do |homework|
+ sheet1[count_row,0]=homework.user.id
+ sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s
+ sheet1[count_row,2] = homework.user.login
+ sheet1[count_row,3] = homework.user.user_extensions.student_id
+ sheet1[count_row,4] = homework.user.mail
+ sheet1[count_row,5] = homework.name
+ sheet1[count_row,6] = homework.teacher_score.nil? ? l(:label_without_score) : format("%.2f",homework.teacher_score)
+ sheet1[count_row,7] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : format("%.2f",homework.teaching_asistant_score)
+ # sheet1[count_row,8] = homework.student_score.nil? ? l(:label_without_score) : format("%.2f",homework.student_score)
+ sheet1[count_row,8] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : format("%.2f",homework.score) : l(:label_without_score)
+ sheet1[count_row,9] = format_time(homework.created_at)
+ count_row += 1
+ end
+ elsif @homework.homework_type == 1 #匿评作业
+ sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),
+ l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_f_score),l(:excel_commit_time)])
+ count_row = 1
+ items.each do |homework|
+ sheet1[count_row,0]=homework.user.id
+ sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s
+ sheet1[count_row,2] = homework.user.login
+ sheet1[count_row,3] = homework.user.user_extensions.student_id
+ sheet1[count_row,4] = homework.user.mail
+ sheet1[count_row,5] = homework.name
+ sheet1[count_row,6] = homework.teacher_score.nil? ? l(:label_without_score) : format("%.2f",homework.teacher_score)
+ sheet1[count_row,7] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : format("%.2f",homework.teaching_asistant_score)
+ sheet1[count_row,8] = homework.student_score.nil? ? l(:label_without_score) : format("%.2f",homework.student_score)
+ sheet1[count_row,9] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : format("%.2f",homework.score) : l(:label_without_score)
+ sheet1[count_row,10] = format_time(homework.created_at)
+ count_row += 1
+ end
+ elsif @homework.homework_type == 2 #编程作业
+ sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),
+ l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_f_score),l(:excel_commit_time)])
+ count_row = 1
+ items.each do |homework|
+ sheet1[count_row,0]=homework.user.id
+ sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s
+ sheet1[count_row,2] = homework.user.login
+ sheet1[count_row,3] = homework.user.user_extensions.student_id
+ sheet1[count_row,4] = homework.user.mail
+ sheet1[count_row,5] = homework.name
+ sheet1[count_row,6] = homework.teacher_score.nil? ? l(:label_without_score) : format("%.2f",homework.teacher_score)
+ sheet1[count_row,7] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : format("%.2f",homework.teaching_asistant_score)
+ sheet1[count_row,8] = homework.student_score.nil? ? l(:label_without_score) : format("%.2f",homework.student_score)
+ sheet1[count_row,9] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : format("%.2f",homework.score) : l(:label_without_score)
+ sheet1[count_row,10] = format_time(homework.created_at)
+ count_row += 1
+ end
end
book.write xls_report
xls_report.string
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index d6597f3da..1aa8de526 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -1,3 +1,4 @@
+#encoding: utf-8
# Redmine - project management software
# Copyright (C) 2006-2013 Jean-Philippe Lang
#
@@ -14,6 +15,7 @@
# 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.
+
class UsersController < ApplicationController
layout :setting_layout
@@ -28,6 +30,7 @@ class UsersController < ApplicationController
# menu_item :requirement_focus, :only => :watch_bids
menu_item :requirement_focus, :only => :watch_contests
menu_item :user_newfeedback, :only => :user_newfeedback
+ menu_item :user_messages, :only => :user_messages
#Ended by young
@@ -40,14 +43,16 @@ class UsersController < ApplicationController
:user_watchlist, :user_fanslist,:update, :user_courses, :user_homeworks, :watch_projects, :show_score, :topic_score_index, :project_score_index,
:activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index,
:activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities,:user_projects_index,
- :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist]
+ :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist,
+ :user_resource,:user_resource_create,:user_resource_delete,:rename_resource,:search_user_course,:add_exist_file_to_course,
+ :search_user_project,:resource_preview,:resource_search,:add_exist_file_to_project]
#edit has been deleted by huang, 2013-9-23
before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses,
:user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments,
:watch_contests, :info, :watch_projects, :show_score, :topic_score_index, :project_score_index,
:activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index,
- :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index,
- :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist]
+ :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index,:user_resource,
+ :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist,:user_messages]
before_filter :auth_user_extension, only: :show
#before_filter :rest_user_score, only: :show
#before_filter :select_entry, only: :user_projects
@@ -95,6 +100,87 @@ class UsersController < ApplicationController
end
end
+ # 用户消息
+ # 说明: homework 发布作业;message:讨论区; news:新闻; poll:问卷;works_reviewers:作品评阅;works_reply:作品回复
+ # issue:问题;journal:缺陷状态更新; forum:公共贴吧: user_feedback: 用户留言; new_reply:新闻回复(comment)
+ def user_messages
+ unless User.current.logged?
+ render_403
+ return
+ end
+ # 当前用户查看消息,则设置消息为已读
+ course_querys = @user.course_messages
+ forge_querys = @user.forge_messages
+ user_querys = @user.user_feedback_messages
+ forum_querys = @user.memo_messages
+ if User.current.id == @user.id
+ course_querys.update_all(:viewed => true)
+ forge_querys.update_all(:viewed => true)
+ user_querys.update_all(:viewed => true)
+ forum_querys.update_all(:viewed => true)
+ end
+ @new_message_count = @user.forge_messages.count + @user.memo_messages.count + @user.course_messages.count + @user.user_feedback_messages.count
+ case params[:type]
+ when nil
+ @user_course_messages = CourseMessage.where("user_id =?",@user).order("created_at desc")
+ @user_forge_messages = ForgeMessage.where("user_id =?",@user).order("created_at desc")
+ @user_memo_messages = MemoMessage.where("user_id =?",@user).order("created_at desc")
+ @user_feedback_messages = UserFeedbackMessage.where("user_id =?",@user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ @user_forge_messages_count = @user_forge_messages.count
+ @user_memo_messages_count = @user_memo_messages.count
+ @user_feedback_messages_count = @user_feedback_messages.count
+ when 'homework'
+ @user_course_messages = CourseMessage.where("course_message_type =? and user_id =?", "HomeworkCommon", @user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ when 'course_message'
+ @user_course_messages = CourseMessage.where("course_message_type =? and user_id =?", "Message", @user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ when 'forge_message'
+ @user_forge_messages = ForgeMessage.where("forge_message_type =? and user_id =?", "Message", @user).order("created_at desc")
+ @user_forge_messages_count = @user_forge_messages.count
+ when 'course_news'
+ @user_course_messages = CourseMessage.where("course_message_type =? and user_id =?", "News", @user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ when 'forge_news'
+ @user_forge_messages = ForgeMessage.where("forge_message_type =? and user_id =?", "News", @user).order("created_at desc")
+ @user_forge_messages_count = @user_forge_messages.count
+ when 'course_news_reply'
+ @user_course_messages = CourseMessage.where("course_message_type =? and user_id =?", "Comment", @user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ when 'forge_news_reply'
+ @user_forge_messages = ForgeMessage.where("course_message_type =? and user_id =?", "Comment", @user).order("created_at desc")
+ @user_forge_messagess_count = @user_forge_messages.count
+ when 'poll'
+ @user_course_messages = CourseMessage.where("course_message_type =? and user_id =?", "Poll", @user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ when 'works_reviewers'
+ @user_course_messages = CourseMessage.where("course_message_type =? and user_id =?", "StudentWorksScore", @user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ when 'works_reply'
+ @user_course_messages = CourseMessage.where("course_message_type =? and user_id =?", "JournalsForMessage", @user).order("created_at desc")
+ @user_course_messages_count = @user_course_messages.count
+ when 'issue'
+ @user_forge_messages = ForgeMessage.where("forge_message_type =? and user_id =?", "Issue", @user).order("created_at desc")
+ @user_forge_messages_count = @user_forge_messages.count
+ when 'issue_update' # 缺陷状态更新、留言
+ @user_forge_messages = ForgeMessage.where("forge_message_type =? and user_id =?", "Journal", @user).order("created_at desc")
+ @user_forge_messages_count = @user_forge_messages.count
+ when 'forum'
+ @user_memo_messages = MemoMessage.where("memo_type =? and user_id =?", "Memo", @user).order("created_at desc")
+ @user_memo_messages_count = @user_memo_messages.count
+ when 'user_feedback'
+ @user_feedback_messages = UserFeedbackMessage.where("journals_for_message_type =? and user_id =?", "Principal", @user).order("created_at desc")
+ @user_feedback_messages_count = @user_feedback_messages.count
+ else
+ render_404
+ return
+ end
+ respond_to do |format|
+ format.html{render :layout=>'base_users_new'}
+ end
+ end
+
def user_projects_index
if User.current.admin?
memberships = @user.memberships.all(conditions: "projects.project_type = #{Project::ProjectType_project}").first
@@ -112,39 +198,20 @@ class UsersController < ApplicationController
#added by young
def user_projects
-
- #add by huang
unless User.current.admin?
if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?)
render_404
return
end
end
- #end
- # if User.current.admin?
- # @memberships = @user.memberships.all(conditions: "projects.project_type = #{Project::ProjectType_project}")
- # else
- # cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1"
- # @memberships = @user.memberships.all(:conditions => cond)
- # end
- #events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 20)
- #@events_by_day = events.group_by(&:event_date)
- # @state = 0
-
- limit = 10;
- query = Project.joins("join members m on #{Project.table_name}.id=m.project_id")
- query = query.where("m.user_id = ? and #{Project.table_name}.project_type=?",@user.id,Project::ProjectType_project)
+ projects = @user.projects.visible.select("projects.*,(SELECT MAX(created_at) FROM `forge_activities` WHERE forge_activities.project_id = projects.id) AS a").order("a desc")
if(params[:status] == '1')
- query = query.where("#{Project.table_name}.user_id = ?",@user.id);
+ projects = projects.where("projects.user_id = ?",@user.id)
elsif(params[:status] == '2')
- query = query.where("#{Project.table_name}.user_id <> ?",@user.id);
+ projects = projects.where("projects.user_id <> ?",@user.id)
end
- @obj_count = query.count();
-
- @obj_pages = Paginator.new @obj_count,limit,params['page']
- @list = query.order("#{Project.table_name}.updated_on desc,#{Project.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all();
- @params = params
-
+ @list = paginateHelper projects,10
+ @params = params[:status]
respond_to do |format|
format.html{render :layout=>'base_users_new'}
format.api
@@ -262,75 +329,35 @@ class UsersController < ApplicationController
def user_courses
unless User.current.admin?
- if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?)
+ if !@user.active?
render_404
return
end
end
-
- #@user.coursememberships.all(:conditions => Course.visible_condition(User.current))
-
- limit = 10;
- query = Course.joins("join members m on #{Course.table_name}.id=m.course_id")
- query = query.where("m.user_id = ?",@user.id)
+ courses = @user.courses.visible.select("courses.*,(SELECT MAX(created_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc")
if(params[:status] == '1')
- query = query.where("endup_time >= ? or endup_time is null or endup_time=''",Time.now);
+ courses = courses.where("endup_time >= ? or endup_time is null or endup_time=''",Time.now)
elsif(params[:status] == '2')
- query = query.where("endup_time < ?",Time.now);
+ courses = courses.where("endup_time < ?",Time.now)
end
- @obj_count = query.count();
-
- @obj_pages = Paginator.new @obj_count,limit,params['page']
- @list = query.order("#{Course.table_name}.updated_at desc,#{Course.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all();
- @params = params
+ @list = paginateHelper courses,10
+ @params = params[:status]
render :layout=>'base_users_new'
-
- # if User.current == @user || User.current.admin?
- # membership = @user.coursememberships.all
- # else
- # membership = @user.coursememberships.all(:conditions => Course.visible_condition(User.current))
- # end
- #
- # membership.sort! {|older, newer| newer.created_on <=> older.created_on }
- # @memberships = []
- # membership.collect { |e|
- # @memberships.push(e)
- # }
- # ## 判断课程是否过期 [需封装]
- # @memberships_doing = []
- # @memberships_done = []
- # #now_time = Time.now.year
- # @memberships.map { |e|
- # #end_time = e.course.get_time.year
- # isDone = course_endTime_timeout?(e.course)
- # if isDone
- # @memberships_done.push e
- # else
- # @memberships_doing.push e
- # end
- # }
- # respond_to do |format|
- # format.html
- # format.api
- # end
end
# modified by fq
def user_newfeedback
- @jours = @user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
- @jours.update_all(:is_readed => true, :status => false)
- @jours.each do |journal|
- fetch_user_leaveWord_reply(journal).update_all(:is_readed => true, :status => false)
+ jours = @user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
+ if User.current == @user
+ jours.update_all(:is_readed => true, :status => false)
+ jours.each do |journal|
+ fetch_user_leaveWord_reply(journal).update_all(:is_readed => true, :status => false)
+ end
end
-
- #@limit = 10
- #@feedback_count = @jours.count
- #@feedback_pages = Paginator.new @feedback_count, @limit, params['page']
- #@offset ||= @feedback_pages.offset
- @jour = paginateHelper @jours,10
+ @jour = paginateHelper jours,10
@state = false
+ render :layout=>'base_users_new'
end
- # end
def user_comments
@@ -448,7 +475,7 @@ class UsersController < ApplicationController
def user_courses4show
query = Course.joins("join members m on #{Course.table_name}.id=m.course_id")
- query = query.where("m.user_id = ?",@user.id)
+ query = query.where("m.user_id = ?",@user.id).order("#{Course.table_name}.id desc")
if User.current == @user #看自己
else
if @user.user_extensions!=nil && @user.user_extensions.identity == 0 #看老师
@@ -456,13 +483,12 @@ class UsersController < ApplicationController
query = query.where("r.role_id in(3,7,9)")
end
query = query.where(Course.table_name+".is_public = 1")
- # or exists (select 1 from courses c2,members m2 where c2.id=m2.course_id and c2.id=#{Course.table_name}.id and m2.user_id= User.current.id)
end
if params[:lastid]!=nil && !params[:lastid].empty?
- query = query.where("( (#{Course.table_name}.updated_at=? and #{Course.table_name}.id < ?) or #{Course.table_name}.updated_at)",params[:lasttime],params[:lastid],params[:lasttime])
+ query = query.where(" #{Course.table_name}.id < ?",params[:lastid],)
end
- @list = query.order("#{Course.table_name}.updated_at desc,#{Course.table_name}.id desc").limit(8).all
+ @list = query.limit(8)
render :layout=>nil
end
@@ -483,95 +509,6 @@ class UsersController < ApplicationController
render :layout=>nil
end
- # def user_course_activities
- # @list = []
- # lastid = nil
- # if params[:lastid]!=nil && !params[:lastid].empty?
- # lastid = params[:lastid];
- # end
- #
- # user_ids = []
- # if @user == User.current
- # watcher = User.watched_by(@user)
- # watcher.push(User.current)
- # user_ids = watcher.map{|x| x.id}
- # else
- # user_ids << @user.id
- # end
- #
- # query_rec_count = 8
- # query_times = 10 #query_times次没查到query_rec_count条记录就不查了
- # query_i = 0;
- # while( true )
- # query_i = query_i+1
- # if(query_i>query_times)
- # break
- # end
- # query = Activity.where(user_id: user_ids)
- # if(lastid != nil)
- # query = query.where("id < ?",lastid)
- # end
- # lastid,item_list = query_activities(query,'course');
- # for item in item_list
- # @list << item
- # if @list.count() >= query_rec_count
- # break
- # end
- # end
- # if @list.count() >= query_rec_count
- # break
- # end
- # if lastid == nil
- # break
- # end
- # end
- # render :layout=>nil
- # end
- #
- # def user_project_activities
- # @list = []
- # lastid = nil
- # if params[:lastid]!=nil && !params[:lastid].empty?
- # lastid = params[:lastid];
- # end
- #
- # user_ids = []
- # if @user == User.current
- # watcher = User.watched_by(@user)
- # watcher.push(User.current)
- # user_ids = watcher.map{|x| x.id}
- # else
- # user_ids << @user.id
- # end
- #
- # query_rec_count = 8
- # query_times = 10 #query_times次没查到query_rec_count条记录就不查了
- # query_i = 0;
- # while( true )
- # query_i = query_i+1
- # if(query_i>query_times)
- # break
- # end
- # query = Activity.where(user_id: user_ids)
- # if(lastid != nil)
- # query = query.where("id < ?",lastid)
- # end
- # lastid,item_list = query_activities(query,'project');
- # for item in item_list
- # @list << item
- # if @list.count() >= query_rec_count
- # break
- # end
- # end
- # if @list.count() >= query_rec_count
- # break
- # end
- # if lastid == nil
- # break
- # end
- # end
- # render :action=>'user_course_activities',:layout=>nil
- # end
def user_course_activities
lastid = nil
if params[:lastid]!=nil && !params[:lastid].empty?
@@ -630,7 +567,7 @@ class UsersController < ApplicationController
query = query.where("#{Activity.table_name}.id < ?",lastid)
end
query = query.order("#{Activity.table_name}.id desc")
- @list = query_activities(query);
+ @list = query_activities(query)
render :action=>'user_course_activities',:layout=>nil
end
@@ -956,6 +893,274 @@ class UsersController < ApplicationController
end
end
+ # 上传用户资源
+ def user_resource_create
+ @user = User.find(params[:id])
+ #@user.save_attachments(params[:attachments],User.current)
+ # Container_type为Principal
+ Attachment.attach_filesex(@user, params[:attachments], params[:attachment_type])
+ if(params[:type].nil? || params[:type] == "1") #全部
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源
+ @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+
+ "or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源
+ @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " +
+ "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " +
+ "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ end
+ elsif params[:type] == "2" #课程资源
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id}
+ @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) ").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中
+ @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+
+ "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ end
+ elsif params[:type] == "3" #项目资源
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc")
+ end
+ elsif params[:type] == "4" #附件
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc")
+ end
+ end
+ @type = params[:type] || 1
+ @limit = 15
+ @is_remote = true
+ @atta_count = @attachments.count
+ @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1
+ @offset ||= @atta_pages.offset
+ #@curse_attachments_all = @all_attachments[@offset, @limit]
+ @attachments = paginateHelper @attachments,15
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ # 删除用户资源,分为批量删除 和 单个删除,只能删除自己上传的资源
+ def user_resource_delete
+ if params[:resource_id].present?
+ Attachment.where("author_id = #{User.current.id}").delete(params[:resource_id])
+ elsif params[:checkbox1].present?
+ params[:checkbox1].each do |id|
+ Attachment.where("author_id = #{User.current.id}").delete(id)
+ end
+ end
+
+ if(params[:type].nil? || params[:type] == "1") #全部
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源
+ @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+
+ "or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源
+ @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " +
+ "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " +
+ "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ end
+ elsif params[:type] == "2" #课程资源
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id}
+ @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) ").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中
+ @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+
+ "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ end
+ elsif params[:type] == "3" #项目资源
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc")
+ end
+ elsif params[:type] == "4" #附件
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc")
+ end
+ end
+ @type = params[:type]
+ @limit = 15
+ @is_remote = true
+ @atta_count = @attachments.count
+ @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1
+ @offset ||= @atta_pages.offset
+ #@curse_attachments_all = @all_attachments[@offset, @limit]
+ @attachments = paginateHelper @attachments,15
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ #根据id或者名称搜索教师或者助教为当前用户的课程
+ def search_user_course
+ @user = User.current
+ if !params[:search].nil?
+ @course = @user.courses.where(" #{Course.table_name}.id = #{params[:search].to_i } or #{Course.table_name}.name like '%#{params[:search.to_s]}%'")
+ .select { |course| @user.allowed_to?(:as_teacher,course)}
+ else
+ @course = @user.courses
+ .select { |course| @user.allowed_to?(:as_teacher,course)}
+ end
+ #这里仅仅是传递需要发送的资源id
+ @send_id = params[:send_id]
+ @send_ids = params[:checkbox1] || params[:send_ids]
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ # 根据id或者名称搜索当前用户所在的项目
+ def search_user_project
+ @user = User.current
+ if !params[:search].nil?
+ @projects = @user.projects.where(" #{Project.table_name}.id = #{params[:search].to_i } or #{Project.table_name}.name like '%#{params[:search.to_s]}%'")
+ else
+ @projects = @user.projects
+ end
+ #这里仅仅是传递需要发送的资源id
+ @send_id = params[:send_id]
+ @send_ids = params[:checkbox1] || params[:send_ids] #搜索的时候 和 直接 用表格提交的时候的send_ids
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ # 将资源发送到对应的课程,分为发送单个,或者批量发送
+ def add_exist_file_to_course
+ if params[:send_id].present?
+ send_id = params[:send_id]
+ ori = Attachment.find_by_id(send_id)
+ course_ids = params[:course_ids]
+ unless course_ids.nil?
+ course_ids.each do |id|
+ next if ori.blank?
+ attach_copied_obj = ori.copy
+ attach_copied_obj.tag_list.add(ori.tag_list) # tag关联
+ attach_copied_obj.container = Course.find(id)
+ attach_copied_obj.created_on = Time.now
+ attach_copied_obj.author_id = User.current.id
+ if attach_copied_obj.attachtype == nil
+ attach_copied_obj.attachtype = 4
+ end
+ attach_copied_obj.save
+ @save_message = attach_copied_obj.errors.full_messages
+ end
+ end
+ elsif params[:send_ids].present?
+ send_ids = params[:send_ids].split(" ")
+ send_ids.each do |send_id|
+ ori = Attachment.find_by_id(send_id)
+ course_ids = params[:course_ids]
+ unless course_ids.nil?
+ course_ids.each do |id|
+ next if ori.blank?
+ attach_copied_obj = ori.copy
+ attach_copied_obj.tag_list.add(ori.tag_list) # tag关联
+ attach_copied_obj.container = Course.find(id)
+ attach_copied_obj.created_on = Time.now
+ attach_copied_obj.author_id = User.current.id
+ if attach_copied_obj.attachtype == nil
+ attach_copied_obj.attachtype = 4
+ end
+ attach_copied_obj.save
+ @save_message = attach_copied_obj.errors.full_messages
+ end
+ end
+ end
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ # 添加资源到对应的项目
+ def add_exist_file_to_project
+ if params[:send_id].present?
+ send_id = params[:send_id]
+ project_ids = params[:projects_ids]
+ ori = Attachment.find_by_id(send_id)
+ unless project_ids.nil?
+ project_ids.each do |project_id|
+ next if ori.blank?
+ attach_copied_obj = ori.copy
+ attach_copied_obj.tag_list.add(ori.tag_list) # tag关联
+ attach_copied_obj.container = Project.find(project_id)
+ attach_copied_obj.created_on = Time.now
+ attach_copied_obj.author_id = User.current.id
+ if attach_copied_obj.attachtype == nil
+ attach_copied_obj.attachtype = 1
+ end
+ attach_copied_obj.save
+ end
+ end
+ elsif params[:send_ids].present?
+ send_ids = params[:send_ids].split(" ")
+ send_ids.each do |send_id|
+ project_ids = params[:projects_ids]
+ ori = Attachment.find_by_id(send_id)
+ unless project_ids.nil?
+ project_ids.each do |project_id|
+ next if ori.blank?
+ attach_copied_obj = ori.copy
+ attach_copied_obj.tag_list.add(ori.tag_list) # tag关联
+ attach_copied_obj.container = Project.find(project_id)
+ attach_copied_obj.created_on = Time.now
+ attach_copied_obj.author_id = User.current.id
+ if attach_copied_obj.attachtype == nil
+ attach_copied_obj.attachtype = 1
+ end
+ attach_copied_obj.save
+ end
+ end
+ end
+ else
+ end
+
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ # 资源预览
+ def resource_preview
+ preview_id = params[:resource_id]
+ @file = Attachment.find(preview_id)
+ @preview_able = false;
+ if %w(pdf pptx doc docx xls xlsx).any?{|x| @file.filename.downcase.end_with?(x)}
+ @preview_able = true;
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ # 重命名资源
+ def rename_resource
+ @attachment = Attachment.find(params[:res_id]) if params[:res_id].present?
+ if @attachment != nil
+ @attachment.filename = params[:res_name]
+ @flag = @attachment.save
+ end
+ # respond_to do |format|
+ # format.js
+ # end
+ if @flag
+ render :text=> download_named_attachment_path(@attachment.id, @attachment.filename)
+ else
+ render :text=>'fail'
+ end
+ end
+
def destroy
@user.destroy
respond_to do |format|
@@ -1157,6 +1362,113 @@ class UsersController < ApplicationController
@user = User.find(params[:id])
end
+ # 资源库 分为全部 课程资源 项目资源 附件
+ def user_resource
+ #确定container_type
+ # @user = User.find(params[:id])
+ # 别人的资源库是没有权限去看的
+ if User.current.id.to_i != params[:id].to_i
+ render_403
+ return
+ end
+ if(params[:type].nil? || params[:type] == "1") #全部
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源
+ @attachments = Attachment.where("(author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+
+ "or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #Ta的资源库的话,应该是他上传的公开资源 加上 他加入的所有我可见课程里的公开资源
+ @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 " +
+ "and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) " +
+ "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ end
+ elsif params[:type] == "2" #课程资源
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id}
+ @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) ").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中
+ @attachments = Attachment.where("(author_id = #{params[:id]} and is_public = 1 and container_type = 'Course')"+
+ "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))").order("created_on desc")
+ end
+ elsif params[:type] == "3" #项目资源
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project'").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' ").order("created_on desc")
+ end
+ elsif params[:type] == "4" #附件
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon')").order("created_on desc")
+ end
+ end
+ @type = params[:type]
+ @limit = 15
+ @is_remote = true
+ @atta_count = @attachments.count
+ @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1
+ @offset ||= @atta_pages.offset
+ #@curse_attachments_all = @all_attachments[@offset, @limit]
+ @attachments = paginateHelper @attachments,15
+ respond_to do |format|
+ format.js
+ format.html {render :layout => 'base_users_new'}
+ end
+ end
+
+ # 根据资源关键字进行搜索
+ def resource_search
+ search = params[:search].to_s.strip.downcase
+ if(params[:type].nil? || params[:type] == "1") #全部
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id} #我的资源库的话,那么应该是我上传的所有资源 加上 我加入的课程的所有资源 取交集并查询
+ @attachments = Attachment.where("((author_id = #{params[:id]} and container_type in('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon')) "+
+ " or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')}))) and (filename like '%#{search}%') ").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中
+ @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type in" +
+ " ('Project','Principal','Course','Issue','Document','Message','News','StudentWorkScore','HomewCommon'))"+
+ " or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) )" +
+ " and (filename like '%#{search}%') ").order("created_on desc")
+ end
+ elsif params[:type] == "2" #课程资源
+ if User.current.id.to_i == params[:id].to_i
+ user_course_ids = User.current.courses.map { |c| c.id}
+ @attachments = Attachment.where("(author_id = #{params[:id]} and container_type = 'Course') or (container_type = 'Course' and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) and (filename like '%#{search}%') ").order("created_on desc")
+ else
+ user_course_ids = User.find(params[:id]).courses.visible.map { |c| c.id} #如果课程私有资源,那么要看这个资源的课程是不是在 这个user的所有我可见的课程中
+ @attachments = Attachment.where("((author_id = #{params[:id]} and is_public = 1 and container_type = 'Course') "+
+ "or (container_type = 'Course' and is_public = 1 and container_id in (#{user_course_ids.empty? ? '0': user_course_ids.join(',')})) )"+
+ " and (filename like '%#{search}%') ").order("created_on desc")
+ end
+ elsif params[:type] == "3" #项目资源
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type = 'Project' and (filename like '%#{search}%')").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type = 'Project' and (filename like '%#{search}%') ").order("created_on desc")
+ end
+ elsif params[:type] == "4" #附件
+ if User.current.id.to_i == params[:id].to_i
+ @attachments = Attachment.where("author_id = #{params[:id]} and container_type in('Project','Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%')").order("created_on desc")
+ else
+ @attachments = Attachment.where("author_id = #{params[:id]} and is_public = 1 and container_type in('Issue','Document','Message','News','StudentWorkScore','HomewCommon') and (filename like '%#{search}%')").order("created_on desc")
+ end
+ end
+ @type = params[:type]
+ @limit = 15
+ @is_remote = true
+ @atta_count = @attachments.count
+ @atta_pages = Paginator.new @atta_count, @limit, params['page'] || 1
+ @offset ||= @atta_pages.offset
+ #@curse_attachments_all = @all_attachments[@offset, @limit]
+ @attachments = paginateHelper @attachments,15
+ respond_to do |format|
+ format.js
+ end
+ end
+
private
def find_user
@@ -1170,7 +1482,7 @@ class UsersController < ApplicationController
render_404
end
- def setting_layout(default_base='base_users')
+ def setting_layout(default_base='base_users_new')
User.current.admin? ? default_base : default_base
end
@@ -1220,4 +1532,7 @@ class UsersController < ApplicationController
impl.save
end
end
+
+
+
end
diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb
index 9ce107f8b..6b14db9bb 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -100,44 +100,6 @@ class WelcomeController < ApplicationController
@course_page = FirstPage.find_by_page_type('course')
@school_id = params[:school_id] || User.current.user_extensions.school.try(:id) || 117
@logoLink ||= logolink()
-
- ##3-8月份为查找春季课程,9-2月份为查找秋季课程
- #month_now = Time.now.strftime("%m").to_i
- #year_now = Time.new.strftime("%Y").to_i
- #(month_now >= 3 && month_now < 9) ? course_term = l(:label_spring) : course_term = l(:label_autumn)
- ##year_now -= 1 if year_now < 3
- #@school_id.nil? ? @cur_school_course = [] : @cur_school_course = find_miracle_course(10,7,@school_id, year_now, course_term)
- ##未登录或者当前学校未开设课程
- #if @cur_school_course.empty?
- # @has_course = false
- # User.current.logged? ? course_count = 9 : course_count = 10
- # @cur_school_course += find_all_new_hot_course(course_count, @school_id, year_now, course_term)
- # while @cur_school_course.count < 9 do
- # if course_term == l(:label_spring)
- # course_term = l(:label_autumn)
- # year_now -= 1
- # else
- # course_term = l(:label_spring)
- # end
- # @cur_school_course += find_all_new_hot_course((10-@cur_school_course.count), nil, year_now, course_term)
- # end
- #else
- # if @cur_school_course.count < 9
- # @has_course = false
- # @cur_school_course += find_all_new_hot_course(9-@cur_school_course.count, @school_id, year_now, course_term)
- # if @cur_school_course.count < 9
- # if course_term == l(:label_spring)
- # course_term = l(:label_autumn)
- # year_now -= 1
- # else
- # course_term = l(:label_spring)
- # end
- # @cur_school_course += find_all_new_hot_course(9-@cur_school_course.count, nil, year_now, course_term)
- # end
- # else
- # @has_course = true
- # end
- #end
end
def logolink()
diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb
index 161791954..5158a99c4 100644
--- a/app/controllers/words_controller.rb
+++ b/app/controllers/words_controller.rb
@@ -4,7 +4,7 @@ class WordsController < ApplicationController
include ApplicationHelper
before_filter :find_user, :only => [:new, :create, :destroy, :more, :back]
def create
- if params[:new_form][:user_message].size>0
+ if params[:new_form][:user_message].size>0 && User.current.logged?
unless params[:user_id].nil?
if params[:reference_content]
message = params[:new_form][:user_message] + "\n" + params[:reference_content]
@@ -18,22 +18,13 @@ class WordsController < ApplicationController
list = User.find(refer_user_id).add_jour(User.current, message, refer_user_id)
end
@jour = list.last
- # @user.count_new_jour
- # if a_message.size > 5
- # @message = a_message[-5, 5]
- # else
- # @message = a_message
- # end
- # @message_count = a_message.count
end
end
- # @jours = @user.journals_for_messages.where('m_parent_id IS NULL').reverse
- # @jour = paginateHelper @jours,10
+ jours = @user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
+ @jour = paginateHelper jours,10
respond_to do |format|
- # format.html { redirect_to_referer_or {render :text => 'Watcher added.', :layout => true}}
format.js
- #format.api { render_api_ok }
end
end
@@ -79,21 +70,22 @@ class WordsController < ApplicationController
end
def destroy
- @journal_destroyed = JournalsForMessage.delete_message(params[:object_id])
- if @journal_destroyed.jour_type == "Bid"
- @bid = Bid.find(@journal_destroyed.jour_id)
- @jours_count = @bid.journals_for_messages.where('m_parent_id IS NULL').count
- elsif @journal_destroyed.jour_type == "Course"
- @course = Course.find @journal_destroyed.jour_id
- @jours_count = @course.journals_for_messages.where('m_parent_id IS NULL').count
- elsif @journal_destroyed.jour_type == "Principal"
- @user = User.find(@journal_destroyed.jour_id)
- @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count
- @is_user = true
- end
- respond_to do |format|
- format.js
- #format.api { render_api_ok }
+ @journal_destroyed = JournalsForMessage.find params[:object_id]
+ if @journal_destroyed.destroy
+ if @journal_destroyed.jour_type == "Bid"
+ @bid = Bid.find(@journal_destroyed.jour_id)
+ @jours_count = @bid.journals_for_messages.where('m_parent_id IS NULL').count
+ elsif @journal_destroyed.jour_type == "Course"
+ @course = Course.find @journal_destroyed.jour_id
+ @jours_count = @course.journals_for_messages.where('m_parent_id IS NULL').count
+ elsif @journal_destroyed.jour_type == "Principal"
+ @user = User.find(@journal_destroyed.jour_id)
+ @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count
+ @is_user = true
+ end
+ respond_to do |format|
+ format.js
+ end
end
end
@@ -206,7 +198,15 @@ class WordsController < ApplicationController
flash[:error] = feedback.errors.full_messages[0]
redirect_to project_feedback_url(params[:id])
end
+ end
+ #给用户留言
+ def leave_user_message
+ @user = User.find(params[:id])
+ if params[:new_form][:user_message].size>0 && User.current.logged? && @user
+ @user.add_jour(User.current, params[:new_form][:user_message])
+ end
+ redirect_to feedback_path(@user)
end
# add by nwb
diff --git a/app/helpers/api_helper.rb b/app/helpers/api_helper.rb
index 1f34112ad..f26f5c19b 100644
--- a/app/helpers/api_helper.rb
+++ b/app/helpers/api_helper.rb
@@ -1,5 +1,11 @@
# encoding: utf-8
module ApiHelper
+ ONE_MINUTE = 60 * 1000
+ ONE_HOUR = 60 * ONE_MINUTE
+ ONE_DAY = 24 * ONE_HOUR
+ ONE_MONTH = 30 * ONE_DAY
+
+ ONE_YEAR = 12 * ONE_MONTH
#获取用户的工作单位
def get_user_work_unit user
work_unit = ""
@@ -163,5 +169,37 @@ module ApiHelper
end
+ # 获取当前时间
+ def time_from_now time
+ lastUpdateTime = time.to_i*1000
+
+ currentTime = Time.now.to_i*1000
+ timePassed = currentTime - lastUpdateTime;
+ timeIntoFormat = 0
+ updateAtValue = ""
+ if timePassed < 0
+ updateAtValue = "时间有问题"
+ elsif timePassed < ONE_MINUTE
+ updateAtValue = "一分钟前"
+ elsif timePassed < ONE_HOUR
+ timeIntoFormat = timePassed / ONE_MINUTE
+ updateAtValue = timeIntoFormat.to_s + "分钟前"
+ elsif (timePassed < ONE_DAY)
+ timeIntoFormat = timePassed / ONE_HOUR
+ updateAtValue = timeIntoFormat.to_s + "小时前"
+ elsif (timePassed < ONE_MONTH)
+ timeIntoFormat = timePassed / ONE_DAY
+ updateAtValue = timeIntoFormat.to_s + "天前"
+ elsif (timePassed < ONE_YEAR)
+ timeIntoFormat = timePassed / ONE_MONTH
+ updateAtValue = timeIntoFormat.to_s + "个月前"
+ else
+ timeIntoFormat = timePassed / ONE_YEAR
+ updateAtValue = timeIntoFormat.to_s + "年前"
+ end
+ updateAtValue
+
+ end
+
end
\ No newline at end of file
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 64a478187..7c7f0c63f 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -1812,7 +1812,7 @@ module ApplicationHelper
#获取用户未过期的课程
def get_user_course user
courses_doing = []
- user.courses.each do |course|
+ user.courses.select("courses.*,(SELECT MAX(created_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").each do |course|
if !course_endTime_timeout?(course)
courses_doing.push course
end
@@ -1824,7 +1824,9 @@ module ApplicationHelper
def attachment_candown attachment
candown = false
if attachment.container
- if attachment.container.class.to_s != "HomeworkAttach" && attachment.container.class.to_s != "StudentWork" && (attachment.container.has_attribute?(:project) || attachment.container.has_attribute?(:project_id)) && attachment.container.project
+ if attachment.container.class.to_s=="PhoneAppVersion"
+ candown = true
+ elsif attachment.container.class.to_s != "HomeworkAttach" && attachment.container.class.to_s != "StudentWork" && (attachment.container.has_attribute?(:project) || attachment.container.has_attribute?(:project_id)) && attachment.container.project
project = attachment.container.project
candown= User.current.member_of?(project) || (project.is_public && attachment.is_public == 1)
elsif attachment.container.is_a?(Project)
@@ -1850,6 +1852,8 @@ module ApplicationHelper
candown = true
elsif attachment.container.class.to_s=="StudentWork"
candown = true
+ elsif attachment.container.class.to_s == "User"
+ candown = (attachment.is_public == 1 || attachment.is_public == true || attachment.author_id == User.current.id)
elsif attachment.container_type == "Bid" && attachment.container && attachment.container.courses
course = attachment.container.courses.first
candown = User.current.member_of_course?(attachment.container.courses.first) || (course.is_public == 1 && attachment.is_public == 1)
@@ -2375,4 +2379,98 @@ module ApplicationHelper
end
notice.html_safe
end
+
+ #老师C语言的标准代码
+ def c_stantard_code_teacher
+ "// 老师您好!这是一个C语言的样例程序
+// 程序功能:输入两个整数,输出两者之和
+// 测试集合:老师可以给出多组测试集,例如:
+// 输入1和2,输出3
+// 输入3和4,输出7
+// ... ...
+// 系统将根据您给出的测试集对学生代码进行自动评分
+
+// 特别提醒:程序采用命令行传参方式,输入通过argv传入
+// 否则您的作业标准代码将不能通过测试
+
+#include //引用必须头文件
+int main(int argc, char** argv) {
+ int a = atoi(argv[1]); //将第一个输入转成整型
+ int b = atoi(argv[2]); //将第二个输入转换为整型
+
+ printf(\"%d\",a+b); //输出a+b
+ return 0;
+}".html_safe
+ end
+
+ #老师C++语言的标准代码
+ def c_stantard_code_teacher_
+ "// 老师您好!这是一个C++语言的样例程序
+// 程序功能:输入两个整数,输出两者之和
+// 测试集合:老师可以给出多组测试集,例如:
+// 输入1和2,输出3
+// 输入3和4,输出7
+// ... ...
+// 系统将根据您给出的测试集对学生代码进行自动评分
+
+// 特别提醒:程序采用命令行传参方式,输入通过argv传入
+// 否则您的作业标准代码将不能通过测试
+
+#include //引用必须头文件
+#include
+using namespace std;
+int main(int argc, char** argv){
+ int a = atoi(argv[1]); //将第一个输入转成整型
+ int b = atoi(argv[2]); //将第二个输入转换为整型
+ cout< //引用必须头文件
+int main(int argc, char** argv) {
+ int a = atoi(argv[1]); //将第一个输入转成整型
+ int b = atoi(argv[2]); //将第二个输入转换为整型
+
+ printf(\"%d\",a+b); //输出a+b
+ return 0;
+}".html_safe
+ end
+
+ #学生C++语言的标准代码
+ def c_stantard_code_student_
+ "// 同学好!这是一个C++语言的样例程序
+// 程序功能:输入两个整数,输出两者之和
+// 测试集合:老师可以给出多组测试集,例如:
+// 输入1和2,输出3
+// 输入3和4,输出7
+// ... ...
+// 系统将根据您给出的测试集对学生代码进行自动评分
+
+// 特别提醒:程序采用命令行传参方式,输入通过argv传入
+// 否则您的作业标准代码将不能通过测试
+
+#include //引用必须头文件
+#include
+using namespace std;
+int main(int argc, char** argv){
+ int a = atoi(argv[1]); //将第一个输入转成整型
+ int b = atoi(argv[2]); //将第二个输入转换为整型
+ cout< activity.course_act.id)
+ when "News"
+ title = "通知公告 " + activity.course_act.title
+ url = course_news_index_path(activity.course)
+ when "Attachment"
+ title = "课件 " + activity.course_act.filename
+ url = course_files_path(activity.course)
+ when "Message"
+ title = "课程讨论区 " + activity.course_act.subject
+ url = course_boards_path(activity.course,:parent_id => activity.course_act.parent_id ? activity.course_act.parent_id : activity.course_act.id, :topic_id => activity.course_act.id)
+ when "JournalsForMessage"
+ title = "留言 " + activity.course_act.notes
+ url = course_feedback_path(activity.course)
+ when "Poll"
+ title = "问卷 " + activity.course_act.polls_name
+ url = poll_path(activity.course_act_id)
+ end
+ end
+ link_to title.gsub(/<(?!img)[^>]*>/,'').html_safe, url, :class => "problem_tit c_dblue fl fb"
+ end
+
+ #课程动态的描述
+ def course_activity_desc activity
+ desc = ""
+ if activity.course_act
+ case activity.course_act_type
+ when "Course"
+ desc = ""
+ when "HomeworkCommon"
+ desc = activity.course_act.description
+ when "News"
+ desc = activity.course_act.description
+ when "Attachment"
+ desc = ""
+ when "Message"
+ desc = activity.course_act.content
+ when "JournalsForMessage"
+ desc = ""
+ when "Poll"
+ desc = activity.course_act.polls_description
+ end
+ end
+ desc.html_safe
+ end
end
diff --git a/app/helpers/homework_common_helper.rb b/app/helpers/homework_common_helper.rb
index 81f817ee9..43f815250 100644
--- a/app/helpers/homework_common_helper.rb
+++ b/app/helpers/homework_common_helper.rb
@@ -27,6 +27,19 @@ module HomeworkCommonHelper
type
end
+ def programing_languages_options
+ type = []
+ option = []
+ option << "C"
+ option << 1
+ type << option
+ option_1 = []
+ option_1 << "C++"
+ option_1 << 2
+ type << option_1
+ type
+ end
+
#缺评扣分
def absence_penalty_option
type = []
@@ -53,4 +66,31 @@ module HomeworkCommonHelper
link
end
+ #将状态转换为错误信息
+ def status_to_err_msg status
+ case status.to_i
+ when -1
+ '编译出错'
+ when -2
+ '输入和输出不匹配'
+ when -3
+ '输入和输出不匹配'
+ when 1
+ '运行出错'
+ when 2
+ '超时'
+ when 3
+ '内存超出'
+ when 4
+ '输出超出'
+ when 5
+ '禁用函数'
+ when 6
+ '其他错误'
+ when 0
+ '成功'
+ else
+ '未知错误'
+ end
+ end
end
\ No newline at end of file
diff --git a/app/helpers/members_helper.rb b/app/helpers/members_helper.rb
index 06b154d36..9dd0bed8c 100644
--- a/app/helpers/members_helper.rb
+++ b/app/helpers/members_helper.rb
@@ -38,7 +38,7 @@ module MembersHelper
scope = []
end
principals = paginateHelper scope,10
- s = content_tag('ul', project_member_check_box_tags_ex('membership[user_ids][]', principals), :class => 'mb5')
+ s = content_tag('ul', project_member_check_box_tags_ex('membership[user_ids][]', principals), :class => 'mb5', :id => 'principals')
links = pagination_links_full(@obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true){|text, parameters, options|
link_to text, autocomplete_project_memberships_path(project, parameters.merge(:q => params[:q],:flag => true, :format => 'js')), :remote => true
}
diff --git a/app/helpers/poll_helper.rb b/app/helpers/poll_helper.rb
index 3156f1b3a..22ee21936 100644
--- a/app/helpers/poll_helper.rb
+++ b/app/helpers/poll_helper.rb
@@ -74,4 +74,13 @@ module PollHelper
end
end
+ #带勾选框的问卷列表
+ def poll_check_box_tags(name,polls,current_poll)
+ s = ''
+ polls.each do |poll|
+ s << "#{ check_box_tag name, poll.id, false, :id => nil } #{h poll.polls_name.blank? ? l(:label_poll_new) : poll.polls_name } [#{ h Course.find(poll.polls_group_id).name}] "
+ end
+ s.html_safe
+ end
+
end
\ No newline at end of file
diff --git a/app/helpers/praise_tread_helper.rb b/app/helpers/praise_tread_helper.rb
index 90ce6d61d..c142f0973 100644
--- a/app/helpers/praise_tread_helper.rb
+++ b/app/helpers/praise_tread_helper.rb
@@ -20,9 +20,9 @@ module PraiseTreadHelper
# when 0
# return @record.tread_num.nil? ? 0 : @record.tread_num
# end
- return (@record.praise_num.to_i-@record.tread_num.to_i)
+ return ((@record.praise_num.nil? ? 0 : @record.praise_num.to_i)-(@record.tread_num.nil? ? 0 : @record.tread_num.to_i))
else
- return 0
+ return 0
end
end
diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb
index 5cbc3af5a..c77eba0c5 100644
--- a/app/helpers/repositories_helper.rb
+++ b/app/helpers/repositories_helper.rb
@@ -236,13 +236,14 @@ module RepositoriesHelper
# 判断项目是否有主版本库
def judge_main_repository(pro)
if pro.repositories.blank?
- return false
+ status = false
else
- pro.repositories.sort.each do |rep|
- rep.is_default?
- return true
+ pro.repositories.each do |rep|
+ status = true and break if rep.is_default?
+ status = false
end
end
+ status
end
# def cvs_field_tags(form, repository)
# content_tag('p', form.text_field(
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index d4f9e4eb8..342ee70be 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -29,6 +29,29 @@ module UsersHelper
["#{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'
+ '用户资源'
+ end
+ end
+
def user_mail_notification_options(user)
user.valid_notification_options.collect {|o| [l(o.last), o.first]}
end
@@ -321,6 +344,7 @@ module UsersHelper
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
@@ -328,109 +352,67 @@ module UsersHelper
return [0,[]]
end
list = query.order("updated_on desc").limit(10).all
- return [count,list];
+ return [count,list]
end
def get_create_course_count(user)
- return Course.where("tea_id = ?",user.id).count()
+ user.courses.visible.where("tea_id = ?",user.id).count
end
+
+ #获取加入课程数
def get_join_course_count(user)
- return user.coursememberships.count() - get_create_course_count(user)
+ user.courses.visible.count - get_create_course_count(user)
end
+
+ #发布作业数
def get_homework_commons_count(user)
- return HomeworkCommon.where("user_id = ?",user.id).count()
+ HomeworkCommon.where("user_id = ?",user.id).count
end
+
+ #资源数
def get_projectandcourse_attachment_count(user)
- return Attachment.where("author_id = ? and container_type in ('Project','Course')",user.id).count()
+ Attachment.where("author_id = ? and container_type in ('Project','Course')",user.id).count
end
+
+ #创建项目数
def get_create_project_count(user)
- return Project.where("user_id = ? and project_type = ?",user.id,Project::ProjectType_project).count()
+ user.projects.visible.where("projects.user_id=#{user.id}").count
end
+
+ #加入项目数
def get_join_project_count(user)
- return user.memberships.count(conditions: "projects.project_type = #{Project::ProjectType_project}") - get_create_project_count(user)
+ user.projects.visible.count - get_create_project_count(user)
end
+
+ #创建缺陷数
def get_create_issue_count(user)
- return Issue.where("author_id = ?",user.id).count()
+ Issue.where("author_id = ?",user.id).count
end
+
+ #解决缺陷数
def get_resolve_issue_count(user)
- return Issue.where("assigned_to_id = ? and status_id=3",user.id).count()
+ Issue.where("assigned_to_id = ? and status_id=3",user.id).count
end
+
+ #参与匿评数
def get_anonymous_evaluation_count(user)
- return StudentWorksScore.where("user_id = ? and reviewer_role=3",user.id).count()
- end
-
-
- # def query_activities(query,type)
- # query_rec_count = 8
- # # query = query.where("act_type='JournalsForMessage'")
- # #query = query.where("act_type not in (?)", ['JournalsForMessage','Message','HomeworkCommon','News','Issue','Journal','Poll'])
- # list = query.order("id desc").limit(query_rec_count).all
- #
- # result = [];
- # for item in list
- # container = get_activity_container(item,type)
- # if( activity_is_show(item,container) )
- # result << { :item=>item,:e=>container }
- # end
- # end
- # return [lastid,result]
- # end
- # def get_activity_container activity,type
- # e = nil;
- # if type == 'Project'
- # if activity.act_type == 'Poll'
- # # 项目没有问卷
- # # e = Project.find_by_id(activity.act.polls_group_id)
- # else
- # e = activity.act.project if activity.act.respond_to?('project')
- # end
- # end
- # if type == 'Course'
- # if activity.act_type == 'Poll'
- # e = Course.find_by_id(activity.act.polls_group_id)
- # else
- # e = activity.act.course if activity.act.respond_to?('course')
- # end
- # end
- #
- # return e;
- # end
+ StudentWorksScore.where("user_id = ? and reviewer_role=3",user.id).count
+ end
+
def query_activities(query)
- list = query.limit(8).all
- result = [];
+ list = query.limit(13).all
+ result = []
for item in list
container = get_activity_container(item)
result << { :item=>item,:e=>container }
end
- return result
+ result
end
+
def get_activity_container activity
return activity.activity_container
- # if type == 'Project'
- # return activity.act.project if activity.act.respond_to?('project')
- # end
- # if type == 'Course'
- # if activity.act_type == 'Poll'
- # return Course.find_by_id(activity.act.polls_group_id)
- # end
- # return activity.act.course if activity.act.respond_to?('course')
- # end
- # return nil;
end
- # def activity_is_show(activity,e)
- # if(!e)
- # return false
- # end
- #
- # if activity.user_id == User.current.id
- # return true
- # end
- # if( e.visible? )
- # return true
- # end
- # return false
- # end
def get_activity_act_showname_htmlclear(activity)
str = get_activity_act_showname(activity)
str = str.gsub(/<.*>/,'')
@@ -442,6 +424,15 @@ module UsersHelper
end
return str.html_safe
end
+
+ def get_issue_des_update(journal)
+ arr = details_to_strings(journal.details,true)
+ arr << journal.notes
+ str = ''
+ arr.each { |item| str = str+item }
+ return str
+ end
+
def get_activity_act_showname(activity)
case activity.act_type
when "HomeworkCommon"
@@ -472,6 +463,7 @@ module UsersHelper
return activity.act_type
end
end
+
def get_activity_act_createtime(activity)
case activity.act_type
when "HomeworkCommon"
@@ -482,6 +474,7 @@ module UsersHelper
return activity.act.created_on
end
end
+
def get_activity_container_url e
if !e.visible?
return "javascript:;"
@@ -492,6 +485,7 @@ module UsersHelper
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:;"
@@ -520,6 +514,7 @@ module UsersHelper
return 'javascript:;'
end
end
+
def get_activity_opt(activity,e)
case activity.act_type
when "HomeworkCommon"
@@ -529,14 +524,14 @@ module UsersHelper
when "Issue"
return '发表了问题'
when "Journal"
- return '回复了问题'
+ 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 '发布了问卷'
+ return '创建了问卷'
else
return '有了新动态'
end
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index f999e27d6..f7fb9b1aa 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -27,6 +27,8 @@ class Attachment < ActiveRecord::Base
belongs_to :attachmentstype, :foreign_key => "attachtype",:primary_key => "id"
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # 课程动态
+ has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
# end
include UserScoreHelper
@@ -71,8 +73,8 @@ class Attachment < ActiveRecord::Base
cattr_accessor :thumbnails_storage_path
@@thumbnails_storage_path = File.join(Rails.root, "tmp", "thumbnails")
- before_save :files_to_final_location
- after_create :office_conver, :be_user_score,:act_as_forge_activity# user_score
+ before_save :files_to_final_location,:act_as_course_activity
+ after_create :office_conver, :be_user_score,:act_as_forge_activity
after_update :office_conver, :be_user_score
after_destroy :delete_from_disk,:down_user_score
@@ -552,4 +554,10 @@ class Attachment < ActiveRecord::Base
end
end
+ #课程动态公共表记录
+ def act_as_course_activity
+ if self.container_type == "Course" && self.course_acts.empty?
+ self.course_acts << CourseActivity.new(:user_id => self.author_id,:course_id => self.container_id)
+ end
+ end
end
diff --git a/app/models/comment.rb b/app/models/comment.rb
index a4842a23f..bb31eb894 100644
--- a/app/models/comment.rb
+++ b/app/models/comment.rb
@@ -21,6 +21,10 @@ class Comment < ActiveRecord::Base
has_many_kindeditor_assets :assets, :dependent => :destroy
has_many :ActivityNotifies,:as => :activity, :dependent => :destroy
+ # 课程/项目 消息
+ has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
+ has_many :forge_messages, :class_name => 'ForgeMessage', :as => :forge_message, :dependent => :destroy
+ #end
acts_as_event :datetime => :updated_on,
:description => :comments,
:type => 'news',
@@ -31,7 +35,19 @@ class Comment < ActiveRecord::Base
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
validates_presence_of :commented, :author, :comments
safe_attributes 'comments'
- after_create :send_mail
+ after_create :send_mail, :act_as_system_message
+
+ def act_as_system_message
+ if self.commented.course
+ if self.author_id != self.commented.author_id
+ self.course_messages << CourseMessage.new(:user_id => self.commented.author_id, :course_id => self.commented.course.id, :viewed => false)
+ end
+ else # 项目相关
+ if self.author_id != self.commented.author_id
+ self.forge_messages << ForgeMessage.new(:user_id => self.commented.author_id, :project_id => self.commented.project.id, :viewed => false)
+ end
+ end
+ end
def send_mail
if self.commented.is_a?(News) && Setting.notified_events.include?('news_comment_added')
diff --git a/app/models/course.rb b/app/models/course.rb
index 6d71ad967..26220f245 100644
--- a/app/models/course.rb
+++ b/app/models/course.rb
@@ -33,6 +33,11 @@ class Course < ActiveRecord::Base
has_many :student_works, :through => :homework_commons, :dependent => :destroy
has_many :course_groups, :dependent => :destroy
+ # 课程动态
+ has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
+
+ has_many :course_activities
+ has_many :course_messages
acts_as_taggable
acts_as_nested_set :order => 'name', :dependent => :destroy
@@ -44,7 +49,7 @@ class Course < ActiveRecord::Base
validates_format_of :name,:with =>/^[^ ]+[a-zA-Z0-9_\u4e00-\u9fa5\s\S]+$/
validates_length_of :description, :maximum => 10000
before_save :self_validate
- after_create :create_board_sync
+ after_create :create_board_sync, :act_as_course_activity
before_destroy :delete_all_members
safe_attributes 'extra',
@@ -310,6 +315,11 @@ class Course < ActiveRecord::Base
end
end
+ #课程动态公共表记录
+ def act_as_course_activity
+ self.course_acts << CourseActivity.new(:user_id => self.tea_id,:course_id => self.id)
+ end
+
#项目与课程分离后,很多课程的名称等信息为空,这些数据信息存储在项目表中!!就是数据兼容的问题
#def name
# read_attribute('name') || Project.find_by_identifier(self.extra).try(:name)
diff --git a/app/models/course_activity.rb b/app/models/course_activity.rb
new file mode 100644
index 000000000..02b6dacf1
--- /dev/null
+++ b/app/models/course_activity.rb
@@ -0,0 +1,7 @@
+class CourseActivity < ActiveRecord::Base
+ attr_accessible :user_id, :course_act_id,:course_act_type,:course_id
+ # 虚拟关联
+ belongs_to :course_act ,:polymorphic => true
+ belongs_to :course
+ belongs_to :user
+end
diff --git a/app/models/course_message.rb b/app/models/course_message.rb
new file mode 100644
index 000000000..59089829d
--- /dev/null
+++ b/app/models/course_message.rb
@@ -0,0 +1,12 @@
+class CourseMessage < ActiveRecord::Base
+ attr_accessible :course_id, :course_message_id, :course_message_type, :user_id, :viewed
+
+ # 多态 虚拟关联
+ belongs_to :course_message ,:polymorphic => true
+ belongs_to :course
+ belongs_to :user
+ validates :user_id,presence: true
+ validates :course_id,presence: true
+ validates :course_message_id,presence: true
+ validates :course_message_type, presence: true
+end
diff --git a/app/models/forge_message.rb b/app/models/forge_message.rb
new file mode 100644
index 000000000..1543fab58
--- /dev/null
+++ b/app/models/forge_message.rb
@@ -0,0 +1,20 @@
+class ForgeMessage < ActiveRecord::Base
+ # 公共表中活动类型,命名规则:TYPE_OF_{类名}_ACT
+ TYPE_OF_ISSUE_ACT = "Issue"
+ TYPE_OF_MESSAGE_ACT = "Message"
+ TYPE_OF_ATTACHMENT_ACT = "Attachment"
+ TYPE_OF_DOCUMENT_ACT = "Document"
+ TYPE_OF_JOURNAL_ACT = "Journal"
+ TYPE_OF_WIKI_ACT = "Wiki"
+ TYPE_OF_NEWS_ACT = "News"
+
+ attr_accessible :forge_message_id, :forge_message_type, :project_id, :user_id, :viewed
+
+ belongs_to :forge_message ,:polymorphic => true
+ belongs_to :project
+ belongs_to :user
+ validates :user_id,presence: true
+ validates :project_id,presence: true
+ validates :forge_message_id,presence: true
+ validates :forge_message_type, presence: true
+end
diff --git a/app/models/forum.rb b/app/models/forum.rb
index 2af1abf9e..530639f81 100644
--- a/app/models/forum.rb
+++ b/app/models/forum.rb
@@ -39,6 +39,7 @@ class Forum < ActiveRecord::Base
logger.debug "send mail for forum add."
Mailer.run.forum_add(self) if Setting.notified_events.include?('forum_add')
end
+
# Updates topic_count, memo_count and last_memo_id attributes for +board_id+
def self.reset_counters!(forum_id)
forum_id = forum_id.to_i
diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb
index 291c14563..217c7d770 100644
--- a/app/models/homework_common.rb
+++ b/app/models/homework_common.rb
@@ -13,17 +13,40 @@ class HomeworkCommon < ActiveRecord::Base
has_many :student_works, :dependent => :destroy
has_many :student_works_evaluation_distributions, :through => :student_works #一个作业的分配的匿评列表
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy #用户活动
+ # 课程动态
+ has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
+ # 课程消息
+ has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
acts_as_attachable
acts_as_event :title => Proc.new {|o| "#{l(:label_course_homework)} ##{o.id}: #{o.name}" },
:description => :description,
:author => :author,
:url => Proc.new {|o| {:controller => 'student_work', :action => 'index', :homework => o.id}}
- after_create :act_as_activity, :send_mail
+ after_create :act_as_activity, :send_mail, :act_as_course_activity, :act_as_course_message
after_destroy :delete_kindeditor_assets
def act_as_activity
self.acts << Activity.new(:user_id => self.user_id)
end
+
+ #课程动态公共表记录
+ def act_as_course_activity
+ if self.course
+ self.course_acts << CourseActivity.new(:user_id => self.user_id,:course_id => self.course_id)
+ end
+ end
+
+ #课程作业消息记录
+ def act_as_course_message
+ if self.course
+ self.course.members.each do |m|
+ if m.user_id != self.user_id
+ self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.course_id, :viewed => false)
+ end
+ end
+ end
+ end
+
#删除对应的图片
def delete_kindeditor_assets
delete_kindeditor_assets_from_disk self.id,OwnerTypeHelper::HOMEWORKCOMMON
diff --git a/app/models/homework_test.rb b/app/models/homework_test.rb
index 7c477bfaf..df2848194 100644
--- a/app/models/homework_test.rb
+++ b/app/models/homework_test.rb
@@ -1,6 +1,6 @@
class HomeworkTest < ActiveRecord::Base
- attr_accessible :input, :output, :homework_common_id
+ attr_accessible :input, :output, :homework_common_id,:result,:error_msg
belongs_to :homework_common
- has_one :student_work_test
+ has_many :student_work_test
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index c2670a0cc..1724e3484 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -49,6 +49,8 @@ class Issue < ActiveRecord::Base
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
+ # ForgeMessage虚拟关联(多态)
+ has_many :forge_messages, :class_name => 'ForgeMessage',:as =>:forge_message ,:dependent => :destroy
acts_as_nested_set :scope => 'root_id', :dependent => :destroy
@@ -80,8 +82,8 @@ class Issue < ActiveRecord::Base
attr_reader :current_journal
# fq
- after_create :act_as_activity,:be_user_score_new_issue,:act_as_forge_activity
- after_update :be_user_score
+ after_create :act_as_activity,:be_user_score_new_issue,:act_as_forge_activity, :act_as_forge_message
+ after_update :be_user_score, :act_as_forge_message_update
after_destroy :down_user_score
# after_create :be_user_score
# end
@@ -138,6 +140,25 @@ class Issue < ActiveRecord::Base
:project_id => self.project_id)
end
# end
+
+ # 发布缺陷forge_messages中添加记录
+ def act_as_forge_message
+ # 指派给自己的缺陷不提示消息
+ unless self.author_id == self.assigned_to_id
+ self.forge_messages << ForgeMessage.new(:user_id => self.assigned_to_id,
+ :project_id => self.project_id,
+ :viewed => false)
+ end
+ end
+
+ # 更新缺陷
+ def act_as_forge_message_update
+ unless self.author_id == self.assigned_to_id
+ self.forge_messages << ForgeMessage.new(:user_id => self.assigned_to_id,
+ :project_id => self.project_id,
+ :viewed => false)
+ end
+ end
# Returns a SQL conditions string used to find all issues visible by the specified user
@@ -235,9 +256,10 @@ class Issue < ActiveRecord::Base
base_reload(*args)
end
- def to_param
- @to_param ||= "#{id}_#{self.project.name}(#{self.project.issues.index(self).to_i+1}-#{self.project.issues.count})"#.parameterize
- end
+ # 之所以注释是以为最终以id形式显示,另外如果项目名称带点号或者纯数字会出现问题
+ # def to_param
+ # @to_param ||= "#{id}_#{self.project.name}(#{self.project.issues.index(self).to_i+1}-#{self.project.issues.count})"#.parameterize
+ # end
# Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields
def available_custom_fields
diff --git a/app/models/journal.rb b/app/models/journal.rb
index 3b660132e..a5bea92af 100644
--- a/app/models/journal.rb
+++ b/app/models/journal.rb
@@ -29,6 +29,8 @@ class Journal < ActiveRecord::Base
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # 被ForgeMessage虚拟关联
+ has_many :forge_messages, :class_name => 'ForgeMessage',:as =>:forge_message ,:dependent => :destroy
# end
attr_accessor :indice
@@ -48,7 +50,7 @@ class Journal < ActiveRecord::Base
before_create :split_private_notes
# fq
- after_save :act_as_activity,:be_user_score,:act_as_forge_activity
+ after_save :act_as_activity,:be_user_score,:act_as_forge_activity, :act_as_forge_message
# end
#after_destroy :down_user_score
#before_save :be_user_score
@@ -163,10 +165,19 @@ class Journal < ActiveRecord::Base
# Description 公共表中需要保存一份该记录
def act_as_forge_activity
self.forge_acts << ForgeActivity.new(:user_id => self.user_id,
- :project_id => self.issue.project.id)
+ :project_id => self.issue.project.id)
end
+ # 缺陷状态更改,消息提醒
+ def act_as_forge_message
+ if self.user_id != self.issue.author_id
+ self.forge_messages << ForgeMessage.new(:user_id => self.issue.author_id,
+ :project_id => self.issue.project_id,
+ :viewed => false)
+ end
+ end
+
# 更新用户分数 -by zjc
def be_user_score
#新建了缺陷留言且留言不为空,不为空白
diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb
index b15c9b2d1..2c56dc035 100644
--- a/app/models/journals_for_message.rb
+++ b/app/models/journals_for_message.rb
@@ -56,9 +56,14 @@ class JournalsForMessage < ActiveRecord::Base
acts_as_attachable
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ # 课程动态
+ has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
+ # 消息关联
+ has_many :course_messages, :class_name => 'CourseMessage',:as =>:course_message ,:dependent => :destroy
+ has_many :user_feedback_messages, :class_name => 'UserFeedbackMessage', :as =>:journals_for_message, :dependent => :destroy
validates :notes, presence: true, if: :is_homework_jour?
- after_create :act_as_activity #huang
+ after_create :act_as_activity, :act_as_course_activity, :act_as_course_message, :act_as_user_feedback_message
after_create :reset_counters!
after_destroy :reset_counters!
after_save :be_user_score
@@ -177,4 +182,61 @@ class JournalsForMessage < ActiveRecord::Base
def delete_kindeditor_assets
delete_kindeditor_assets_from_disk self.id,7
end
+
+ #课程动态公共表记录
+ def act_as_course_activity
+ if self.jour_type == 'Course'
+ self.course_acts << CourseActivity.new(:user_id => self.user_id,:course_id => self.jour_id)
+ end
+ end
+
+ # 课程作品留言消息通知
+ def act_as_course_message
+ if self.jour_type == 'StudentWorksScore'
+ if self.user_id != self.jour.user_id
+ self.course_messages << CourseMessage.new(:user_id => self.jour.user_id,:course_id => self.jour.student_work.homework_common.course.id, :viewed => false)
+ end
+ end
+ end
+
+ # 用户留言消息通知
+ def act_as_user_feedback_message
+ # 主留言
+ receivers = []
+ if self.reply_id == 0
+ if self.user_id != self.jour_id # 过滤自己给自己的留言消息
+ receivers << self.jour
+ end
+ else # 留言回复
+ reply_to = User.find(self.reply_id)
+ if self.user_id != self.parent.user_id
+ receivers << reply_to
+ if self.reply_id != self.parent.user_id
+ receivers << self.parent.user
+ end
+ else
+ receivers << reply_to
+ end
+
+ # 添加留言回复人
+ #reply_to = User.find(self.reply_id)
+ #if self.user_id != self.parent.user_id && self.user_id != self.parent.jour_id # 如果回帖人不是用户自己
+ # receivers << self.parent.user
+ # if self.reply_id != self.parent.user_id
+ # receivers << reply_to
+ # end
+ #else # 用户自己回复别人的,别人收到消息通知
+ # if self.user_id != self.reply_id # 过滤掉自己回复自己的
+ # receivers << reply_to
+ # end
+ #end
+ end
+ if self.jour_type == 'Principal'
+
+ receivers.each do |r|
+ self.user_feedback_messages << UserFeedbackMessage.new(:user_id => r.id, :journals_for_message_id => self.id, :journals_for_message_type => "Principal", :viewed => false)
+ end
+
+ end
+ end
end
diff --git a/app/models/mailer.rb b/app/models/mailer.rb
index 5ae9df001..a25aff6bb 100644
--- a/app/models/mailer.rb
+++ b/app/models/mailer.rb
@@ -388,7 +388,8 @@ class Mailer < ActionMailer::Base
@user = applied.user
recipients = @project.manager_recipients
s = l(:text_applied_project, :id => "##{@user.show_name}", :project => @project.name)
- @applied_url = url_for(:controller => 'projects', :action => 'settings', :id => @project.id,:tab=>'members')
+ @token = Token.get_token_from_user(@user, 'autologin')
+ @applied_url = url_for(:controller => 'projects', :action => 'settings', :id => @project.id,:tab=>'members', :token => @token.value)
mail :to => recipients,
:subject => s
end
diff --git a/app/models/memo.rb b/app/models/memo.rb
index e0abaa19f..f1f9029c1 100644
--- a/app/models/memo.rb
+++ b/app/models/memo.rb
@@ -16,6 +16,9 @@ class Memo < ActiveRecord::Base
acts_as_attachable
has_many :user_score_details, :class_name => 'UserScoreDetails',:as => :score_changeable_obj
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
+ # 消息
+ has_many :memo_messages, :class_name =>'MemoMessage', :dependent => :destroy
+ # end
belongs_to :last_reply, :class_name => 'Memo', :foreign_key => 'last_reply_id'
# acts_as_searchable :column => ['subject', 'content'],
# #:include => { :forum => :p}
@@ -44,7 +47,7 @@ class Memo < ActiveRecord::Base
"parent_id",
"replies_count"
- after_create :add_author_as_watcher, :reset_counters!, :send_mail
+ after_create :add_author_as_watcher, :reset_counters!, :send_mail, :send_message
# after_update :update_memos_forum
after_destroy :reset_counters!,:delete_kindeditor_assets#,:down_user_score -- 公共区发帖暂不计入得分
# after_create :send_notification
@@ -59,6 +62,32 @@ class Memo < ActiveRecord::Base
Mailer.run.forum_message_added(self) if Setting.notified_events.include?('forum_message_added')
end
+ # 公共贴吧消息记录
+ # 原则:贴吧创始人;发帖人,wanglingchun(特殊用户)
+ def send_message
+ receivers = []
+ u = User.find(6)
+ receivers << u
+ # 主贴
+ if self.parent_id.nil?
+ if self.author_id != self.forum.creator_id # 发帖人不是吧主
+ receivers << self.forum.creator
+ end
+ else # 回帖
+ # 添加吧主
+ if self.author_id != self.forum.creator_id
+ receivers << self.forum.creator
+ end
+ # 添加发帖人
+ if self.forum.creator_id != self.parent.author_id
+ receivers << self.parent.author
+ end
+ end
+ receivers.each do |r|
+ self.memo_messages << MemoMessage.new(:user_id => r.id, :forum_id => self.forum_id, :memo_id => self.id, :memo_type => "Memo", :viewed => false)
+ end
+ end
+
def cannot_reply_to_locked_topic
errors.add :base, l(:label_memo_locked) if root.locked? && self != root
end
diff --git a/app/models/memo_message.rb b/app/models/memo_message.rb
new file mode 100644
index 000000000..051fac317
--- /dev/null
+++ b/app/models/memo_message.rb
@@ -0,0 +1,11 @@
+class MemoMessage < ActiveRecord::Base
+ attr_accessible :forum_id, :memo_id, :memo_type, :user_id, :viewed
+
+ belongs_to :memo
+ belongs_to :user
+
+ validates :user_id,presence: true
+ validates :forum_id,presence: true
+ validates :memo_id,presence: true
+ validates :memo_type, presence: true
+end
diff --git a/app/models/message.rb b/app/models/message.rb
index 15d358789..37129885f 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -32,7 +32,13 @@ class Message < ActiveRecord::Base
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # 课程动态
+ has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
# end
+ # 课程/项目 消息
+ has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
+ has_many :forge_messages, :class_name => 'ForgeMessage', :as => :forge_message, :dependent => :destroy
+ #end
has_many :ActivityNotifies,:as => :activity, :dependent => :destroy
@@ -68,7 +74,7 @@ class Message < ActiveRecord::Base
after_update :update_messages_board
after_destroy :reset_counters!,:down_user_score,:delete_kindeditor_assets
- after_create :act_as_activity,:be_user_score,:act_as_forge_activity, :send_mail
+ after_create :act_as_activity,:act_as_course_activity,:be_user_score,:act_as_forge_activity, :act_as_system_message, :send_mail
#before_save :be_user_score
scope :visible, lambda {|*args|
@@ -185,11 +191,56 @@ class Message < ActiveRecord::Base
:project_id => self.board.project.id)
end
end
+
+ #课程动态公共表记录
+ def act_as_course_activity
+ if self.course
+ self.course_acts << CourseActivity.new(:user_id => self.author_id,:course_id => self.board.course_id)
+ end
+ end
+
+ # 课程讨论区添加消息:
+ # 老师发帖所有人都能收到消息
+ # 学生发帖,有人回复则给该学生消息,没回复则不给其它人发送消息
+ # 帖子被回复的可以收到消息通知
+ # 项目讨论区添加消息:
+ # 主贴项目成员都能收到
+ # 回帖:帖子的发布人收到
+ def act_as_system_message
+ if self.course
+ if self.parent_id.nil? # 主贴
+ self.course.members.each do |m|
+ if self.author.allowed_to?(:as_teacher, self.course) && m.user_id != self.author_id # 老师 自己的帖子不给自己发送消息
+ self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.board.course_id, :viewed => false)
+ end
+ end
+ else # 回帖
+ self.course.members.each do |m|
+ if m.user_id == Message.find(self.parent_id).author_id && m.user_id != self.author_id # 只针对主贴回复,回复自己的帖子不发消息
+ self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.board.course_id, :viewed => false)
+ end
+ end
+ end
+ else # 项目相关
+ if self.parent_id.nil? # 主贴
+ self.project.members.each do |m|
+ if m.user_id != self.author_id
+ self.forge_messages << ForgeMessage.new(:user_id => m.user_id, :project_id => self.board.project_id, :viewed => false)
+ end
+ end
+ else # 回帖
+ self.project.members.each do |m|
+ if m.user_id == Message.find(self.parent_id).author_id && m.user_id != self.author_id # 只针对主贴回复,回复自己的帖子不发消息
+ self.forge_messages << ForgeMessage.new(:user_id => m.user_id, :project_id => self.board.project_id, :viewed => false)
+ end
+ end
+ end
+ end
+ end
#更新用户分数 -by zjc
def be_user_score
#新建message且无parent的为发帖
-
if self.parent_id.nil? && !self.board.project.nil?
UserScore.joint(:post_message, self.author,nil,self, { message_id: self.id })
update_memo_number(self.author,1)
diff --git a/app/models/news.rb b/app/models/news.rb
index 7d33d760e..6e2725d1c 100644
--- a/app/models/news.rb
+++ b/app/models/news.rb
@@ -23,12 +23,18 @@ class News < ActiveRecord::Base
#added by nwb
belongs_to :course
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
- has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
+ has_many :comments, :as => :commented, :dependent => :destroy, :order => "created_on"
# fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # 课程动态
+ has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
# end
+ # 课程/项目消息关联
+ has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
+ has_many :forge_messages, :class_name => 'ForgeMessage', :as => :forge_message, :dependent => :destroy
+ #end
has_many :ActivityNotifies,:as => :activity, :dependent => :destroy
@@ -49,7 +55,7 @@ class News < ActiveRecord::Base
:author_key => :author_id
acts_as_watchable
- after_create :act_as_activity,:act_as_forge_activity,:add_author_as_watcher, :send_mail
+ after_create :act_as_activity,:act_as_forge_activity, :act_as_course_activity,:act_as_system_message, :add_author_as_watcher, :send_mail
after_destroy :delete_kindeditor_assets
@@ -121,6 +127,33 @@ class News < ActiveRecord::Base
end
end
+ #课程动态公共表记录
+ def act_as_course_activity
+ if self.course
+ self.course_acts << CourseActivity.new(:user_id => self.author_id,:course_id => self.course_id)
+ end
+ end
+
+ #课程/项目通知 消息发送
+ #消息发送原则:除了消息的发布者,课程的其它成员都能收到消息提醒
+ def act_as_system_message
+ if self.course
+ self.course.members.each do |m|
+ if m.user_id != self.author_id
+ self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.course_id, :viewed => false)
+ end
+ end
+ else
+ if !self.project.nil?
+ self.project.members.each do |m|
+ if m.user_id != self.author_id
+ self.forge_messages << ForgeMessage.new(:user_id => m.user_id, :project_id => self.project_id, :viewed => false)
+ end
+ end
+ end
+ end
+ end
+
# Time 2015-03-31 13:50:54
# Author lizanle
# Description 删除news后删除对应的资源
@@ -132,4 +165,4 @@ class News < ActiveRecord::Base
Mailer.run.news_added(self) if Setting.notified_events.include?('news_added')
end
-end
+end
\ No newline at end of file
diff --git a/app/models/poll.rb b/app/models/poll.rb
index 64e9df79a..67bb9f5a8 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -8,7 +8,12 @@ class Poll < ActiveRecord::Base
has_many :users, :through => :poll_users #该文件被哪些用户提交答案过
# 添加课程的poll动态
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
- after_create :act_as_activity
+ # 课程动态
+ has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
+ after_create :act_as_activity, :act_as_course_activity
+ # 课程消息
+ has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
+ after_save :act_as_course_message, :act_as_activity, :act_as_course_activity
acts_as_event :title => Proc.new {|o| "#{l(:label_course_poll)}: #{o.polls_name}" },
:description => :polls_description,
@@ -27,4 +32,30 @@ class Poll < ActiveRecord::Base
self.acts << Activity.new(:user_id => self.user_id)
end
+ #课程动态公共表记录
+ def act_as_course_activity
+ if self.polls_type == "Course"
+ if self.polls_status == 2 #问卷是发布状态
+ self.course_acts << CourseActivity.new(:user_id => self.user_id,:course_id => self.polls_group_id)
+ elsif self.polls_status == 1 #问卷是新建状态
+ self.course_acts.destroy_all
+ end
+ end
+ end
+
+ # 发布问卷,出了发布者外,其他人都能收到消息通知
+ def act_as_course_message
+ if self.polls_type == "Course"
+ if self.polls_status == 2 #问卷是发布状态
+ Course.find(self.polls_group_id).members.each do |m|
+ if m.user_id != self.user_id
+ self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.polls_group_id, :viewed => false)
+ end
+ end
+ elsif self.polls_status == 1 #问卷是新建状态
+ self.course_messages.destroy_all
+ end
+ end
+ end
+
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 8ab377ccc..77711edff 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -91,6 +91,8 @@ class Project < ActiveRecord::Base
has_many :tags, :through => :project_tags, :class_name => 'Tag'
has_many :project_tags, :class_name => 'ProjectTags'
+ # 关联虚拟表
+ has_many :forge_messages
belongs_to :organization
diff --git a/app/models/repository/git.rb b/app/models/repository/git.rb
index c1f0020eb..7c484e87f 100644
--- a/app/models/repository/git.rb
+++ b/app/models/repository/git.rb
@@ -38,6 +38,12 @@ class Repository::Git < Repository
'Git'
end
+ def commits(authors, start_date, end_date, branch='master')
+ scm.commits(authors, start_date, end_date,branch).map {|commit|
+ [commit[:author], commit[:num]]
+ }
+ end
+
def report_last_commit
extra_report_last_commit
end
diff --git a/app/models/student_work.rb b/app/models/student_work.rb
index c80d1315b..b95c11c11 100644
--- a/app/models/student_work.rb
+++ b/app/models/student_work.rb
@@ -7,7 +7,7 @@ class StudentWork < ActiveRecord::Base
has_many :student_works_evaluation_distributions, :dependent => :destroy
has_many :student_works_scores, :dependent => :destroy
belongs_to :project
- has_one :student_work_test
+ has_many :student_work_test
before_destroy :delete_praise
diff --git a/app/models/student_work_test.rb b/app/models/student_work_test.rb
index d9ac5e935..413528b82 100644
--- a/app/models/student_work_test.rb
+++ b/app/models/student_work_test.rb
@@ -1,12 +1,12 @@
# encoding: utf-8
class StudentWorkTest < ActiveRecord::Base
- attr_accessible :student_work_id, :homework_test_id
+ attr_accessible :student_work_id, :homework_test_id, :result, :error_msg
belongs_to :homework_test
belongs_to :student_work
def status_to_s
- case self.result
+ case self.result.to_i
when -1
'编译出错'
when -2
@@ -33,7 +33,7 @@ class StudentWorkTest < ActiveRecord::Base
end
def test_score
- if self.result == 0
+ if self.result.to_i == 0
format("%.1f",100.0 / self.student_work.homework_common.homework_tests.count)
else
0
diff --git a/app/models/student_works_score.rb b/app/models/student_works_score.rb
index 8fa14f8de..639722389 100644
--- a/app/models/student_works_score.rb
+++ b/app/models/student_works_score.rb
@@ -5,6 +5,17 @@ class StudentWorksScore < ActiveRecord::Base
belongs_to :user
belongs_to :student_work
has_many :journals_for_messages, :as => :jour, :dependent => :destroy
+ has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
acts_as_attachable
+
+ after_create :act_as_course_message
+
+ # 评阅作品消息提示
+ def act_as_course_message
+ if self.student_work
+ receiver = self.student_work.user
+ self.course_messages << CourseMessage.new(:user_id => receiver.id, :course_id => self.student_work.homework_common.course.id, :viewed => false)
+ end
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 005c394a8..61dd60eec 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -109,7 +109,6 @@ class User < Principal
has_many :contests, :foreign_key => 'author_id', :dependent => :destroy
has_many :softapplications, :foreign_key => 'user_id', :dependent => :destroy
has_many :journals_for_messages, :as => :jour, :dependent => :destroy
- has_many :new_jours, :as => :jour, :class_name => 'JournalsForMessage', :conditions => "status=1"
has_many :journal_replies, :dependent => :destroy
has_many :activities, :dependent => :destroy
has_many :students_for_courses
@@ -128,8 +127,16 @@ class User < Principal
has_many :messages, :foreign_key => 'author_id'
has_one :user_score, :dependent => :destroy
has_many :documents # 项目中关联的文档再次与人关联
-# end
+# 关联消息表
+ has_many :forge_messages
+ has_many :course_messages
+ has_many :memo_messages
+ has_many :user_feedback_messages
+# 虚拟转换
+ has_many :new_jours, :as => :jour, :class_name => 'JournalsForMessage', :conditions => "status=1"
+ has_many :issue_assigns, :class_name => 'ForgeMessage', :conditions => 'viewed=0 and forge_message_type="Issue"'
+ has_many :status_updates, :class_name => 'ForgeMessage', :conditions => 'viewed=0 and forge_message_type="Journal"'
# 邮件邀请状态
# has_many :invite_lists
# end
@@ -150,7 +157,8 @@ class User < Principal
nil
}
-
+ acts_as_attachable :view_permission => :view_files,
+ :delete_permission => :manage_files
acts_as_customizable
############################added by william
acts_as_taggable
@@ -235,10 +243,42 @@ class User < Principal
# ======================================================================
+ # 查询用户未读过的记录
+ # 用户留言记录
+ def count_new_jour
+ count = self.new_jours.count
+ # count = self.journals_for_messages(:conditions => ["status=? and is_readed = ? " ,1, 0]).count
+ end
+
+ # 查询指派给我的缺陷记录
+ def count_new_issue_assign_to
+ self.issue_assigns
+ end
+
+ # 新消息统计
+ def count_new_message
+ course_count = CourseMessage.where("user_id =? and viewed =?", User.current.id, 0).count
+ forge_count = ForgeMessage.where("user_id =? and viewed =?", User.current.id, 0).count
+ user_feedback_count = UserFeedbackMessage.where("user_id =? and viewed =?", User.current.id, 0).count
+ user_memo_count = MemoMessage.where("user_id =? and viewed =?", User.current.id, 0).count
+ messages_count = course_count + forge_count + user_feedback_count + user_memo_count
+ end
+ # 查询指派给我的缺陷记录
+ def issue_status_update
+ self.status_updates
+ end
+ # end
+
def extensions
self.user_extensions ||= UserExtensions.new
end
+ # User现在可以作为一个Container_type,而Attachment的Container方法会有一个Container.try(:project),
+ # 所以这里定义一个空方法,保证不报错
+ def project
+
+ end
+
def user_score_attr
self.user_score ||= UserScore.new
end
@@ -258,7 +298,7 @@ class User < Principal
###添加留言 fq
def add_jour(user, notes, reference_user_id = 0, options = {})
if options.count == 0
- self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id, :status => true)
+ self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id, :status => true, :is_readed => false)
else
jfm = self.journals_for_messages.build(options)
jfm.save
@@ -291,11 +331,7 @@ class User < Principal
name
end
## end
-
- def count_new_jour
- count = self.new_jours.count
- end
-
+
#added by nie
def count_new_journal_reply
count = self.journal_reply.count
@@ -418,7 +454,7 @@ class User < Principal
end
def nickname(formatter = nil)
- login
+ login.nil? || (login && login.empty?) ? "AnonymousUser" : login
end
def name(formatter = nil)
diff --git a/app/models/user_feedback_message.rb b/app/models/user_feedback_message.rb
new file mode 100644
index 000000000..98b53e973
--- /dev/null
+++ b/app/models/user_feedback_message.rb
@@ -0,0 +1,10 @@
+class UserFeedbackMessage < ActiveRecord::Base
+ attr_accessible :journals_for_message_id, :journals_for_message_type, :user_id, :viewed
+
+ belongs_to :journals_for_message
+ belongs_to :user
+
+ validates :user_id,presence: true
+ validates :journals_for_message_id,presence: true
+ validates :journals_for_message_type, presence: true
+end
diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb
index 2921cc825..c2944fed5 100644
--- a/app/services/courses_service.rb
+++ b/app/services/courses_service.rb
@@ -654,36 +654,42 @@ class CoursesService
return
end
if current_user == @user || current_user.admin?
- membership = @user.coursememberships.page(1).per(15)
+ membership = @user.coursememberships
else
- membership = @user.coursememberships.page(1).per(15).all(:conditions => Course.visible_condition(current_user))
+ membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user))
end
if membership.nil? || membership.count == 0
raise l(:label_no_courses, :locale => get_user_language(current_user))
end
- membership.sort! { |older, newer| newer.created_on <=> older.created_on }
+ #membership.sort! { |older, newer| newer.created_on <=> older.created_on }
#定义一个数组集合,存放hash数组,该hash数组包括课程的信息,并包含课程的最新发布的资源,最新的讨论区留言,最新的作业,最新的通知
result = []
#对用户所有的课程进行循环,找到每个课程最新发布的资源,最新的讨论区留言,最新的作业,最新的通知,并存进数组
+
membership.each do |mp|
course = mp.course
latest_course_dynamics = []
+ notices_count = 0
+ topic_count = 0
+ topics = nil
+ homeworkss = nil
+ notices = nil
# 课程通知
latest_news = course.news.page(1).per(2).order("created_on desc")
unless latest_news.first.nil?
- latest_course_dynamics << {:type => 1, :time => latest_news.first.created_on,:count=>course.news.count,
- :news => latest_news.all}
+ notices_count = course.news.count
+ notices = latest_news.all
+ latest_course_dynamics << {:time => latest_news.first.created_on }
end
-
# 课程讨论区
latest_message = course.boards.first.topics.page(1).per(2)
unless latest_message.first.nil?
- latest_course_dynamics << {:type => 2, :time => latest_message.first.created_on, :count =>course.boards.nil? ? 0 : course.boards.first.topics.count,
- :topics => latest_message.all}
+ topic_count = course.boards.nil? ? 0 : course.boards.first.topics.count
+ topics = latest_message.all
+ latest_course_dynamics << {:time => latest_message.first.created_on}
end
-
# 课程资源
# latest_attachment = course.attachments.order("created_on desc").page(1).per(2)
# unless latest_attachment.first.nil?
@@ -694,14 +700,17 @@ class CoursesService
#课程作业 已经交的学生列表(暂定显示6人),未交的学生列表,作业的状态
homeworks = course.homework_commons.page(1).per(2).order('created_at desc')
unless homeworks.first.nil?
- latest_course_dynamics << {:type => 4, :time => homeworks.first.updated_at, :count=>course.homework_commons.count , :homeworks => homeworks}
+ homeworkss = homeworks
+ latest_course_dynamics << {:time => homeworks.first.updated_at}
end
latest_course_dynamics.sort! { |order, newer| newer[:time] <=> order[:time] }
# 课程学霸 学生总分数排名靠前的5个人
homework_count = course.homework_commons.count
sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" <<
" where homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{course.id}) GROUP BY student_works.user_id ORDER BY score desc limit 0,4"
+
better_students = User.find_by_sql(sql)
+
# 找出在课程讨论区发帖回帖数最多的
active_students = []
sql1 = " select users.*,count(author_id)*2 active_count from messages " <<
@@ -710,20 +719,41 @@ class CoursesService
" GROUP BY messages.author_id ORDER BY count(author_id) desc " <<
" limit 0,4"
active_students = User.find_by_sql(sql1)
+
if homework_count != 0 && !better_students.empty?
- latest_course_dynamics <<{:type=> 6,:time=>Time.now.to_s,:count=> 4,:better_students=> better_students}
+ latest_course_dynamics <<{:time=>"1970-01-01 0:0:0 +0800"}
end
unless active_students.empty?
- latest_course_dynamics <<{:type=> 7,:time=>Time.now.to_s,:count=> 4,:active_students=>active_students}
+ latest_course_dynamics <<{:time=>"1970-01-01 0:0:0 +0800"}
end
latest_course_dynamic = latest_course_dynamics.first
unless latest_course_dynamic.nil?
- result << {:course_name => course.name,:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course), :course_id => course.id, :course_img_url => url_to_avatar(course), :course_time => course.time, :course_term => course.term,:message => "", :dynamics => latest_course_dynamics,
- :course_student_num=>course ? course.members.count : 0,:time_from_now=> distance_of_time_in_words(Time.now, latest_course_dynamic[:time].to_time) << "前"}
+ result << {:course_name => course.name,
+ :current_user_is_member => current_user.member_of_course?(course),
+ :current_user_is_teacher => is_course_teacher(current_user,course),
+ :course_id => course.id,
+ :course_img_url => url_to_avatar(course),
+ :course_time => course.time,
+ :course_term => course.term,
+ :news_count => notices_count,
+ :homework_count => homework_count,
+ :topic_count => topic_count,
+ :news => notices,
+ :homeworks => homeworkss,
+ :topics => topics,
+ :better_students => better_students,
+ :active_students => active_students,
+ :message => "",
+ :course_student_num=>course ? course.members.count : 0,
+ #:time_from_now=> distance_of_time_in_words(Time.now, latest_course_dynamic[:time].to_time) << "前",
+ :time_from_now=>time_from_now(latest_course_dynamic[:time].to_time), #.strftime('%Y-%m-%d %H:%M:%S').to_s,
+ :time=>latest_course_dynamic[:time].to_time}
end
+
end
#返回数组集合
- result.sort! { |order, newer| newer[:update_time] <=> order[:update_time] }
+ result.sort! { |order, newer| newer[:time] <=> order[:time] }
+
result
end
diff --git a/app/views/account/lost_password.html.erb b/app/views/account/lost_password.html.erb
index 8ed93f36c..3c6c57f52 100644
--- a/app/views/account/lost_password.html.erb
+++ b/app/views/account/lost_password.html.erb
@@ -9,7 +9,7 @@
<%=l(:field_mail)%> *
- <%= text_field_tag 'mail', nil, :size => 40 %>
+ <%= text_field_tag 'mail', nil, :size => 40, :placeholder => '请输入注册邮箱'%>
<%= submit_tag l(:button_submit) %>
diff --git a/app/views/admin/_tab_messages.erb b/app/views/admin/_tab_messages.erb
new file mode 100644
index 000000000..ec04246ba
--- /dev/null
+++ b/app/views/admin/_tab_messages.erb
@@ -0,0 +1,8 @@
+
+
+ <%= link_to l(:label_forum), {:action => 'messages_list'}, class: "#{current_page?(messages_list_path)? 'selected' : nil }" %>
+ <%= link_to l(:label_borad_course), {:action => 'course_messages'}, class: "#{current_page?(course_messages_path)? 'selected' : nil }" %>
+ <%= link_to l(:label_borad_project), {:action => 'project_messages'}, class: "#{current_page?(project_messages_path)? 'selected' : nil }" %>
+
+
+
\ No newline at end of file
diff --git a/app/views/admin/course_messages.html.erb b/app/views/admin/course_messages.html.erb
new file mode 100644
index 000000000..c9e69357f
--- /dev/null
+++ b/app/views/admin/course_messages.html.erb
@@ -0,0 +1,69 @@
+
+ <%=l(:label_message_plural)%>
+
+
+<%= render 'tab_messages' %>
+<%=l(:label_borad_course) %>
+
+
+
+<% html_title(l(:label_message_plural)) -%>
diff --git a/app/views/admin/homework.html.erb b/app/views/admin/homework.html.erb
new file mode 100644
index 000000000..7260d68ff
--- /dev/null
+++ b/app/views/admin/homework.html.erb
@@ -0,0 +1,66 @@
+
+ <%=l(:label_user_homework)%>
+
+
+
+
+
+
+<% html_title(l(:label_user_homework)) -%>
diff --git a/app/views/admin/latest_login_users.html.erb b/app/views/admin/latest_login_users.html.erb
new file mode 100644
index 000000000..89514726a
--- /dev/null
+++ b/app/views/admin/latest_login_users.html.erb
@@ -0,0 +1,96 @@
+<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', :media => 'all' %>
+
+ <%=l(:label_latest_login_user_list)%>
+
+
+<%= form_tag({}, :method => :get) do %>
+
+
+ <%= l(:label_filter_plural) %>
+
+ 开始日期:
+ <%= text_field_tag 'startdate', params[:startdate], :size => 15, :onchange=>"$('#ui-datepicker-div').hide()", :style=>"float:left"%>
+ <%= calendar_for('startdate')%>
+ 结束日期:
+ <%= text_field_tag 'enddate', params[:enddate], :size => 15, :onchange =>"$('#ui-datepicker-div').hide()", :style=>"float:left"%>
+ <%= calendar_for('enddate')%>
+ <%= submit_tag l(:button_apply), :class => "small", :name => nil %>
+ <%= link_to l(:button_clear), {:controller => 'admin', :action => 'latest_login_users'}, :class => 'icon icon-reload' %>
+
+<% end %>
+
+
+
+
+
+
+
+<% html_title(l(:label_latest_login_user_list)) -%>
diff --git a/app/views/admin/leave_messages.html.erb b/app/views/admin/leave_messages.html.erb
new file mode 100644
index 000000000..dee8b7443
--- /dev/null
+++ b/app/views/admin/leave_messages.html.erb
@@ -0,0 +1,96 @@
+
+ <%=l(:label_leave_message_list)%>
+
+
+
+
+
+
+<% html_title(l(:label_leave_message_list)) -%>
diff --git a/app/views/admin/messages_list.html.erb b/app/views/admin/messages_list.html.erb
new file mode 100644
index 000000000..ca84baa24
--- /dev/null
+++ b/app/views/admin/messages_list.html.erb
@@ -0,0 +1,71 @@
+
+ <%=l(:label_message_plural)%>
+
+
+<%= render 'tab_messages' %>
+<%=l(:label_forum) %>
+
+
+
+<% html_title(l(:label_message_plural)) -%>
diff --git a/app/views/admin/notices.html.erb b/app/views/admin/notices.html.erb
new file mode 100644
index 000000000..f03a7b97a
--- /dev/null
+++ b/app/views/admin/notices.html.erb
@@ -0,0 +1,78 @@
+
+ <%=l(:label_notification_list)%>
+
+
+
+
+
+
+<% html_title(l(:label_notification_list)) -%>
diff --git a/app/views/admin/project_messages.html.erb b/app/views/admin/project_messages.html.erb
new file mode 100644
index 000000000..a5639eba7
--- /dev/null
+++ b/app/views/admin/project_messages.html.erb
@@ -0,0 +1,70 @@
+
+ <%=l(:label_message_plural)%>
+
+
+<%= render 'tab_messages' %>
+<%=l(:label_borad_project) %>
+
+
+
+
+<% html_title(l(:label_message_plural)) -%>
diff --git a/app/views/admin/schools.html.erb b/app/views/admin/schools.html.erb
new file mode 100644
index 000000000..0956981e8
--- /dev/null
+++ b/app/views/admin/schools.html.erb
@@ -0,0 +1,50 @@
+
+ <%=l(:label_school_plural)%>
+
+<%= form_tag({:controller => 'admin', :action => 'schools' }, :method => :get,:id=>"search_course_form") do %>
+ <%= submit_tag "搜索",:style => "float: right;margin-right: 15px;"%>
+
+<% end %>
+
+
+
+
+<% html_title(l(:label_project_plural)) -%>
diff --git a/app/views/applied_project/_set_applied.js.erb b/app/views/applied_project/_set_applied.js.erb
index 33d862d1c..472da3c09 100644
--- a/app/views/applied_project/_set_applied.js.erb
+++ b/app/views/applied_project/_set_applied.js.erb
@@ -17,6 +17,8 @@ if (window.Messenger) {
Messenger().post({
id: "label_apply_project_waiting",
message: "<%= l(:label_apply_project_waiting) %>",
- showCloseButton: true,
+ showCloseButton: true
});
};
+
+$("#applied_project_link_<%= @project.id%>").replaceWith("<%= escape_javascript(link_to "加入项目",appliedproject_path(:user_id => User.current.id,:project_id => @project.id,:project_join => true),:class => "blue_n_btn fr mt20", :remote => "true",:method => "post",:id => "applied_project_link_#{@project.id}") %>");
diff --git a/app/views/applied_project/applied_join_project.js.erb b/app/views/applied_project/applied_join_project.js.erb
index 846d2a61d..ae9d3f467 100644
--- a/app/views/applied_project/applied_join_project.js.erb
+++ b/app/views/applied_project/applied_join_project.js.erb
@@ -6,6 +6,7 @@
<% elsif @status == 2%>
alert("<%= l('project.join.tips.success') %>");
hideModal($("#popbox"));
+ $("#applied_project_link_<%= @project.id%>").replaceWith("<%=escape_javascript(link_to '取消申请',appliedproject_applied_path(:project_id => @project.id,:user_id => User.current.id),:class => "blue_n_btn fr mt20", :remote => "true",:method => "delete",:id => "applied_project_link_#{@project.id}")%>");
<% elsif @status == 3%>
alert("<%= l('project.join.tips.has') %>");
<%else%>
diff --git a/app/views/attachments/_project_file_links.html.erb b/app/views/attachments/_project_file_links.html.erb
index b6d934c64..3b76689f5 100644
--- a/app/views/attachments/_project_file_links.html.erb
+++ b/app/views/attachments/_project_file_links.html.erb
@@ -29,32 +29,32 @@
<% is_float ||= false %>
<% for attachment in attachments %>
-
- <%if is_float%>
-
- <% end%>
-
+
+ <%if is_float%>
+
+ <% end%>
+
<% if options[:length] %>
<%= link_to_short_attachment attachment, :class => ' link_file_board', :download => true,:length => options[:length] -%>
<% else %>
<%= link_to_short_attachment attachment, :class => ' link_file_board', :download => true -%>
<% end %>
- <%if is_float%>
-
- <% end%>
+ <%if is_float%>
+
+ <% end%>
- <% if attachment.is_text? %>
- <%= link_to image_tag('magnifier.png'),
- :controller => 'attachments',
- :action => 'show',
- :id => attachment,
- :filename => attachment.filename%>
- <% end %>
+ <% if attachment.is_text? %>
+ <%= link_to image_tag('magnifier.png'),
+ :controller => 'attachments',
+ :action => 'show',
+ :id => attachment,
+ :filename => attachment.filename%>
+ <% end %>
- <%= h(" - #{attachment.description}") unless attachment.description.blank? %>
-
+ <%= h(" - #{attachment.description}") unless attachment.description.blank? %>
+
(
<%= number_to_human_size attachment.filesize %>)
@@ -66,6 +66,16 @@
:class => 'delete delete-homework-icon',
:remote => true,
:title => l(:button_delete) %>
+ <% elsif attachment.container_type == 'Issue' %>
+ <% if User.current == attachment.author %>
+ <%= link_to image_tag('delete.png'), attachment_path(attachment),
+ :data => {:confirm => l(:text_are_you_sure)},
+ :method => :delete,
+ :class => 'delete',
+ #:remote => true,
+ #:id => "attachments_" + attachment.id.to_s,
+ :title => l(:button_delete) %>
+ <% end %>
<% else %>
<%= link_to image_tag('delete.png'), attachment_path(attachment),
:data => {:confirm => l(:text_are_you_sure)},
@@ -89,13 +99,13 @@
<% end %>
- <% if defined?(thumbnails) && thumbnails %>
- <% images = attachments.select(&:thumbnailable?) %>
- <% if images.any? %>
+ <% if defined?(thumbnails) && thumbnails %>
+ <% images = attachments.select(&:thumbnailable?) %>
+ <% if images.any? %>
<% images.each do |attachment| %>
<%= thumbnail_issue_tag(attachment) %>
<% end %>
- <% end %>
- <% end %>
+ <% end %>
+ <% end %>
diff --git a/app/views/avatar/_avatar_form.html.erb b/app/views/avatar/_avatar_form.html.erb
index 632ea5d4d..43aaf9132 100644
--- a/app/views/avatar/_avatar_form.html.erb
+++ b/app/views/avatar/_avatar_form.html.erb
@@ -43,7 +43,7 @@
-<%#= link_to l(:button_delete_file),{:controller => :avatar,:action => :delete_image,:remote=>true,:source_type=> source.class,:source_id=>source.id},:confirm => l(:text_are_you_sure), :method => :post, :class => "btn_addPic", :style => "text-decoration:none;" %>
+<%= link_to l(:button_delete_file),{:controller => :avatar,:action => :delete_image,:remote=>true,:source_type=> source.class,:source_id=>source.id},:confirm => l(:text_are_you_sure), :method => :post, :class => "btn_addPic", :style => "text-decoration:none;" %>
<%= l(:button_upload_photo) %>
diff --git a/app/views/boards/_form.html.erb b/app/views/boards/_form.html.erb
index 47ae0672d..a4f58dcc3 100644
--- a/app/views/boards/_form.html.erb
+++ b/app/views/boards/_form.html.erb
@@ -1,7 +1,7 @@
<%= error_messages_for @board %>
-
+
<%= f.text_field :name, :required => true %>
diff --git a/app/views/boards/show.html.erb b/app/views/boards/show.html.erb
index 5520f526d..609294161 100644
--- a/app/views/boards/show.html.erb
+++ b/app/views/boards/show.html.erb
@@ -1,12 +1,5 @@
\ No newline at end of file
diff --git a/app/views/homework_common/index.html.erb b/app/views/homework_common/index.html.erb
index 2de96bca1..4a804ae60 100644
--- a/app/views/homework_common/index.html.erb
+++ b/app/views/homework_common/index.html.erb
@@ -49,40 +49,54 @@
<% if homework.homework_type == 2 && homework.homework_detail_programing%>
-
-
- ">
-
- 输入
-
-
- 输出
-
-
- <% homework.homework_tests.each do |test|%>
+ <% if @is_teacher%>
+
+
">
- <%=test.input%>
+ 输入
- <%= test.output%>
+ 输出
- <% end%>
-
-
+ <% homework.homework_tests.each do |test|%>
+ ">
+
+ <%=test.input%>
+
+
+ <%= test.output%>
+
+
+ <% end%>
+
+
+
+ <% end%>
+
+
+
开发语言:
+
+ <% if homework.homework_detail_programing.language.to_i == 1%>
+ C
+ <% elsif homework.homework_detail_programing.language.to_i == 2%>
+ C++
+ <% end%>
+
+
+
<% end%>
-
-
- <% unless homework.attachments.empty?%>
+ <% unless homework.attachments.empty?%>
+
附件:
<%= render :partial => 'student_work/work_attachments', :locals => {:attachments => homework.attachments} %>
- <% end%>
-
-
+
+
+ <% end%>
扣分标准:
diff --git a/app/views/homework_common/new.html.erb b/app/views/homework_common/new.html.erb
index b3e433b74..6fc0fff0e 100644
--- a/app/views/homework_common/new.html.erb
+++ b/app/views/homework_common/new.html.erb
@@ -1,27 +1,17 @@
+<%= javascript_include_tag "/assets/kindeditor/kindeditor" %>
+<%= error_messages_for 'homework_common' %>
<%= l(:label_course_homework_new)%>
-
- <%= form_for("new_homework_common",:url => next_step_homework_common_index_path) do |f|%>
-
-
- 请选择将要发布的作业类型
-
-
-
- 人工评分的作业(支持匿名互评、灵活设置评分比例)
-
-
-
-
- 自动评测的编程作业(支持C程序的自动评分)
-
-
-
- 下一步
-
+
+ <%= labelled_form_for @homework,:url => {:controller => 'homework_common',:action => 'create'} do |f| %>
+ <%= hidden_field_tag "course",@course.id%>
+ <%= render :partial => 'homework_common/homework_detail_manual_form', :locals => { :homework => @homework,:f => f,:edit_mode => false } %>
+
提交
+ <%#= link_to "上一步", new_homework_common_path(:course => @course.id), :class => "orange_btn_homework fl"%>
+ <%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%>
<% end%>
diff --git a/app/views/homework_common/next_step.html.erb b/app/views/homework_common/next_step.html.erb
index 75e9f4c0a..e84d0f87a 100644
--- a/app/views/homework_common/next_step.html.erb
+++ b/app/views/homework_common/next_step.html.erb
@@ -11,7 +11,7 @@
<%= hidden_field_tag "course",@course.id%>
<%= render :partial => 'homework_common/homework_detail_manual_form', :locals => { :homework => @homework,:f => f,:edit_mode => false } %>
提交
- <%= link_to "上一步", new_homework_common_path(:course => @course.id), :class => "orange_btn_homework fl"%>
+ <%#= link_to "上一步", new_homework_common_path(:course => @course.id), :class => "orange_btn_homework fl"%>
<%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%>
<% end%>
@@ -22,7 +22,7 @@
<%= hidden_field_tag "homework_common[homework_type]","2"%>
<%= render :partial => 'homework_common/homework_detail_programing_form', :locals => { :homework => @homework,:f => f,:edit_mode => false } %>
提交
- <%= link_to "上一步", new_homework_common_path(:course => @course.id), :class => "orange_btn_homework fl"%>
+ <%#= link_to "上一步", new_homework_common_path(:course => @course.id), :class => "orange_btn_homework fl"%>
<%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%>
<% end%>
diff --git a/app/views/homework_common/programing_test.js.erb b/app/views/homework_common/programing_test.js.erb
new file mode 100644
index 000000000..d1643329b
--- /dev/null
+++ b/app/views/homework_common/programing_test.js.erb
@@ -0,0 +1,12 @@
+$("#test_send_<%= @index%>").replaceWith("
fl ml5 mt1 programing_test' onclick='programing_test(<%= @index%>)' id='test_send_<%= @index%>'><%= @result == 0 ? '正确' : '错误'%> ");
+$("#test_result_<%= @index%>").val("<%= @result%>");
+<% if @err_msg || @result != 0%>
+ $("#homework_work_test_show").show();
+ $("#homework_work_test_desc").text("<%= escape_javascript(@err_msg || status_to_err_msg(@result))%>");
+ <% if @err_msg%>
+ $("#homework_test_error_msg").val("<%= escape_javascript(@err_msg)%>");
+ <% end%>
+<% else%>
+ $("#homework_work_test_show").hide();
+ $("#homework_test_error_msg").val("");
+<% end%>
\ No newline at end of file
diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb
index 8c12d62e0..01cbea1c1 100644
--- a/app/views/issues/show.html.erb
+++ b/app/views/issues/show.html.erb
@@ -6,7 +6,7 @@
<%= link_to "#{@issue.project.name}"+">", project_issues_path(@issue.project) %>
-
<%= "#" + @issue.project_index %>
+
<%= "#" + @issue.id.to_s %>
diff --git a/app/views/layouts/_base_footer_public.html.erb b/app/views/layouts/_base_footer_public.html.erb
new file mode 100644
index 000000000..dba26f1f6
--- /dev/null
+++ b/app/views/layouts/_base_footer_public.html.erb
@@ -0,0 +1,46 @@
+
+
\ No newline at end of file
diff --git a/app/views/layouts/_base_header.html.erb b/app/views/layouts/_base_header.html.erb
index 16fa44c73..8dbacb523 100644
--- a/app/views/layouts/_base_header.html.erb
+++ b/app/views/layouts/_base_header.html.erb
@@ -18,7 +18,7 @@
<% end -%>
diff --git a/app/views/layouts/_base_header_new.html.erb b/app/views/layouts/_base_header_new.html.erb
index 71cf8ab02..c224ee0ab 100644
--- a/app/views/layouts/_base_header_new.html.erb
+++ b/app/views/layouts/_base_header_new.html.erb
@@ -9,65 +9,60 @@