diff --git a/Gemfile b/Gemfile index b6d49c15c..893c75789 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,8 @@ gem "coderay", "~> 1.0.6" gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "builder", "3.0.0" gem 'acts-as-taggable-on', '2.4.1' +gem 'spreadsheet' +gem 'ruby-ole' group :development do gem 'grape-swagger' diff --git a/Gemfile.lock b/Gemfile.lock index 619c1d072..e89b80221 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -193,6 +193,7 @@ GEM rails (>= 3.2.0) sass-rails rmagick (2.13.2) + ruby-ole (1.2.11.7) ruby-openid (2.1.8) rubyzip (1.1.6) sass (3.3.10) @@ -211,6 +212,8 @@ GEM shoulda-context (1.2.1) shoulda-matchers (2.6.1) activesupport (>= 3.0.0) + spreadsheet (1.0.0) + ruby-ole (>= 1.0) sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) @@ -271,10 +274,12 @@ DEPENDENCIES rails (= 3.2.13) rich (= 1.4.6) rmagick (>= 2.0.0) + ruby-ole ruby-openid (~> 2.1.4) sass-rails (~> 3.2.3) seems_rateable! selenium-webdriver (~> 2.42.0) shoulda (~> 3.5.0) + spreadsheet therubyracer uglifier (>= 1.0.3) diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index d352cf11a..49ee726e2 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -224,7 +224,16 @@ class AccountController < ApplicationController def email_valid end + def resendmail + user = User.find(params[:user]) if params[:user] + token = Token.new(:user => user, :action => "register") + if token.save + Mailer.register(token).deliver + else + yield if block_given? + end + end private def authenticate_user diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 78ac4d208..2721c57c7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -236,13 +236,7 @@ class ApplicationController < ActionController::Base # Authorize the user for the requested action def authorize(ctrl = params[:controller], action = params[:action], global = false) #modify by NWB - if @project - allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global) - elsif @course - allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @course || @courses, :global => global) - else - allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global) - end + allowed = authorize_allowed(params[:controller], params[:action],global) if allowed true @@ -255,6 +249,17 @@ class ApplicationController < ActionController::Base end end + def authorize_allowed(ctrl = params[:controller], action = params[:action], global = false) + #modify by NWB + if @project + allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global) + elsif @course + allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @course || @courses, :global => global) + else + allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project || @projects, :global => global) + end + allowed + end def authorize_attachment_download(ctrl = params[:controller], action = params[:action], global = false) case @attachment.container_type when "Memo" @@ -754,6 +759,19 @@ class ApplicationController < ActionController::Base end end + def paginateHelper_for_members obj, pre_size=10 + @obj_count = StudentsForCourse.find_by_sql("select count(id) as mem_count from students_for_courses where course_id = #{@course.id}")[0][:mem_count].to_s.to_i + @obj_pages = Paginator.new @obj_count, pre_size, params['page'] + if obj.kind_of? ActiveRecord::Base or obj.kind_of? ActiveRecord::Relation + obj.limit(@obj_pages.per_page).offset(0) + elsif obj.kind_of? Array + obj[0, @obj_pages.per_page] + else + logger.error "[ApplicationController] Error : application_controller#paginateHelper ===> unknow category: #{obj.class}" + raise RuntimeError, 'unknow type, Please input you type into this helper.' + end + end + #查找首页相关信息 def find_first_page @first_page = FirstPage.find_by_page_type('project') diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb index 023c9da69..ec2fb7d77 100644 --- a/app/controllers/bids_controller.rb +++ b/app/controllers/bids_controller.rb @@ -492,27 +492,19 @@ class BidsController < ApplicationController if @bid.homework_type @homework = HomeworkAttach.new @is_teacher = is_course_teacher(User.current,@bid.courses.first) - teachers = "(" - teacher_members = searchTeacherAndAssistant(@bid.courses.first) - teacher_members.each do |member| - if member == teacher_members.last - teachers += member.user_id.to_s + ")" - else - teachers += member.user_id.to_s + "," - end - end if @is_teacher - all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT * FROM (SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN #{teachers}) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN #{teachers}) AS s_score + all_homework_list = HomeworkAttach.find_by_sql("SELECT * FROM (SELECT homework_attaches.*, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE bid_id = #{@bid.id} ORDER BY s_score DESC,created_at ASC) AS table1 WHERE table1.t_score IS NULL") + @not_batch_homework = true @cur_type = 1 else - all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN #{teachers}) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN #{teachers}) AS s_score, - (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id}) AS m_score + all_homework_list = HomeworkAttach.find_by_sql("SELECT homework_attaches.*, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id} AND is_teacher_score = #{@is_teacher ? 1 : 0}) AS m_score FROM homework_attaches INNER JOIN homework_evaluations ON homework_evaluations.homework_attach_id = homework_attaches.id WHERE homework_attaches.bid_id = #{@bid.id} AND homework_evaluations.user_id = #{User.current.id} ORDER BY s_score DESC") @@ -1048,8 +1040,18 @@ class BidsController < ApplicationController end def alert_anonymous_comment - hws = HomeworkService.new - @bid,@totle_size,@cur_size,@percent = hws.alert_homework_anonymous_comment(params) + @bid = Bid.find params[:id] + @course = @bid.courses.first + if @bid.comment_status == 0 + @totle_size = searchStudent(@course).size + @cur_size = @bid.homeworks.size + elsif @bid.comment_status == 1 + @totle_size = 0 + @bid.homeworks.map { |homework| @totle_size += homework.homework_evaluations.count} + @cur_size = 0 + @bid.homeworks.map { |homework| @cur_size += homework.rates(:quality).where("seems_rateable_rates.is_teacher_score = 0").count} + end + @percent = format("%.2f",(@cur_size.to_f / ( @totle_size == 0 ? 1 : @totle_size)) * 100) respond_to do |format| format.js end diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index 6213b2315..d3edde756 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -134,9 +134,8 @@ class ContestsController < ApplicationController @state = false respond_to do |format| - layout_file = 'base_newcontest' format.html { - render :layout => layout_file + render :layout => 'base_newcontest' } format.api end diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index fa76bd0e5..16fe60bd2 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -19,7 +19,7 @@ class CoursesController < ApplicationController 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 :toggleCourse, only: [:finishcourse, :restartcourse] + before_filter :toggleCourse, :only => [:finishcourse, :restartcourse] before_filter :require_login, :only => [:join, :unjoin] #before_filter :allow_join, :only => [:join] @@ -252,14 +252,17 @@ class CoursesController < ApplicationController @subPage_title = '' #@members = @course.member_principals.includes(:roles, :principal).all.sort @is_remote = true + @score_sort_by = "desc" q = "#{params[:name].strip}" #(redirect_to stores_url, :notice => l(:label_sumbit_empty);return) if params[:name].blank? if params[:incourse] - @results = searchStudent_by_name(@course, q) + @results = searchmember_by_name(student_homework_score(0,0,0,"desc"), q) + elsif params[:ingroup] @group = CourseGroup.find(params[:search_group_id]) - @results = searchgroupstudent_by_name(@group, @course, q) + @results = searchmember_by_name(student_homework_score(@group.id,0,0,"desc"), q) end + @is_remote = true @result_count = @results.count @results = paginateHelper @results @@ -283,8 +286,7 @@ class CoursesController < ApplicationController end @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true - @members = searchStudent(@course) - @membercount = @members.count + @course_groups = @course.course_groups end @@ -293,8 +295,7 @@ class CoursesController < ApplicationController @subPage_title = l :label_student_list @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true - @members = searchStudent(@course) - @membercount = @members.count + @course_groups = @course.course_groups end @@ -307,10 +308,28 @@ class CoursesController < ApplicationController end @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true - @members = searchStudent(@course) - @membercount = @members.count + @course_groups = @course.course_groups end + + def valid_ajax + req = Hash.new(false) + req[:message] = '' + + valid_attr = params[:valid] + valid_value = params[:value] + + faker = CourseGroup.new + + if valid_attr.eql?('name') + faker.name = valid_value + faker.valid? + req[:valid] = faker.errors[:name].blank? + req[:message] = faker.errors[:name] + end + req[:message] = l(:modal_valid_passing) if req[:message].blank? + render :json => req + end def join_group @subPage_title = l :label_student_list group = CourseGroup.find(params[:object_id]) @@ -318,9 +337,9 @@ class CoursesController < ApplicationController member.course_group_id = group.id member.save @group = group - @members = searchStudent(@course) + @course_groups = @course.course_groups - @membercount = @members.count + search_group_members group end def unjoin_group @@ -331,8 +350,7 @@ class CoursesController < ApplicationController member.save @group = group @course_groups = @course.course_groups - @members = searchStudent(@course) - @membercount = @members.count + search_group_members group end def searchgroupmembers @@ -340,65 +358,115 @@ class CoursesController < ApplicationController @render_file = 'member_list' @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true + @score_sort_by = "desc" if params[:group_id] && params[:group_id] != "0" @group = CourseGroup.find(params[:group_id]) - @results = searchStudent_by_group(@group, @course) + + @results = student_homework_score(@group.id,0, 0,"desc") + @results = paginateHelper @results, 10 + + else - @results = searchStudent(@course) + page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) + @results = student_homework_score(0,page_from, 10,"desc") + @results = paginateHelper_for_members @results, 10 end - @members = searchStudent(@course) - @membercount = @members.count - @results = paginateHelper @results - end - def search_group_members group - @subPage_title = l :label_student_list - @render_file = 'member_list' - @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' - @is_remote = true - @members = searchStudent(@course) - @membercount = @members.count - @results = searchStudent_by_group(group, @course) - @results = paginateHelper @results + + + end + + def member ## 有角色参数的才是课程,没有的就是项目 if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course))) + @render_file = 'member_list' - @teachers= searchTeacherAndAssistant(@course) + @score_sort_by = "desc" @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' - @role = params[:role] + @role = params[:role].nil? ? '2':params[:role] + @is_remote = true @course_groups = @course.course_groups if @course.course_groups - @course_group_id = params[:@course_group_id] unless params[:@course_group_id].nil? @show_serch = params[:role] == '2' - case params[:role] + case @role when '1' @subPage_title = l :label_teacher_list - @members = searchTeacherAndAssistant(@course) + @all_members = searchTeacherAndAssistant(@course) + @members = paginateHelper @all_members, 10 when '2' @subPage_title = l :label_student_list + page = params[:page].nil? ? 0 : (params['page'].to_i - 1) + @all_members = student_homework_score(0,page, 10,"desc") + + @members = paginateHelper_for_members @all_members, 10 - @members = searchStudent(@course) - @membercount = @members.count + end + + respond_to do |format| + if params[:page] + format.js else - @subPage_title = '' - @members = @course.member_principals.includes(:roles, :principal).all.sort + format.html {render :layout => 'base_courses'} + end end - @members = paginateHelper @members - render :layout => 'base_courses' + + # render :layout => 'base_courses' else render_403 end end - #判断指定用户是否为课程教师 - def isCourseTeacher(id) - result = false - if @teachers.find_by_user_id(id) != nil - result = true + def export_course_member_excel + @all_members = student_homework_score(0,0,0,"desc") + respond_to do |format| + format.xls { + send_data(member_to_xls(@all_members,@course.course_groups), :type => "text/excel;charset=utf-8; header=present", + :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname.to_s }_#{@course.name}_#{@course.time.to_s + @course.term}#{l(:excel_member_list)}.xls") + } end - result + end + + def member_score_sort + + # @teachers= searchTeacherAndAssistant(@course) + @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' + # @role = params[:role] + # @course_groups = @course.course_groups if @course.course_groups + # @show_serch = params[:role] == '2' + @subPage_title = l :label_student_list + @render_file = 'member_list' + # @results = params[:result] if params[:result] + # unless @result.nil? + # @results = @result.reverse + # + # end + # @results = paginateHelper @results@score_sort_by = "desc" + @is_remote = true + @score_sort_by = params[:sort_by] if params[:sort_by] + group_id = params[:group_id] + if group_id == '0' + page = params[:page].nil? ? 0 : (params['page'].to_i - 1) + @results = student_homework_score(0,page, 10,@score_sort_by) + + @results = paginateHelper_for_members @results, 10 + else + @group = CourseGroup.find(group_id) + @results = student_homework_score(group_id, 0, 0,@score_sort_by) + @results = paginateHelper @results, 10 + end + end + # 显示每个学生的作业评分详情 + def show_member_score + + @member_score = Member.find(params[:member_id]) if params[:member_id] + respond_to do |format| + format.html {render :layout => 'course_base'} + format.js + + end + end def handle_course courses, activities @@ -504,12 +572,13 @@ class CoursesController < ApplicationController # end end - def course + def + course @school_id = params[:school_id] per_page_option = 10 if @school_id == "0" or @school_id.nil? @courses_all = Course.active.visible. - joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id"). + joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id") else @courses_all = Course.active.visible. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id"). @@ -912,4 +981,104 @@ class CoursesController < ApplicationController render_404 end end + + def student_homework_score(groupid,start_from, nums, score_sort_by) + #teachers = find_course_teachers(@course) + start_from = start_from * nums + sql_select = "" + if groupid == 0 + if nums == 0 + sql_select = "SELECT members.*, SUM(homework_attaches.score) as score FROM members, homework_attaches + WHERE members.course_id = #{@course.id} AND members.user_id in (SELECT students_for_courses.student_id FROM students_for_courses WHERE course_id = #{@course.id}) AND members.user_id = homework_attaches.user_id +AND homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{@course.id}) GROUP BY members.user_id +UNION all +SELECT members.*, 0 as score FROM members,homework_attaches,students_for_courses WHERE members.course_id = #{@course.id} AND +students_for_courses.course_id = #{@course.id} and members.user_id = students_for_courses.student_id AND +members.user_id NOT IN (SELECT homework_attaches.user_id FROM homework_attaches WHERE homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{@course.id} ) +) +GROUP BY members.user_id ORDER BY score #{score_sort_by}" + else + sql_select = "SELECT members.*, SUM(homework_attaches.score) as score FROM members, homework_attaches + WHERE members.course_id = #{@course.id} AND members.user_id in (SELECT students_for_courses.student_id FROM students_for_courses WHERE course_id = #{@course.id}) AND members.user_id = homework_attaches.user_id +AND homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{@course.id}) GROUP BY members.user_id +UNION all +SELECT members.*, 0 as score FROM members,homework_attaches,students_for_courses WHERE members.course_id = #{@course.id} AND +students_for_courses.course_id = #{@course.id} and members.user_id = students_for_courses.student_id AND +members.user_id NOT IN (SELECT homework_attaches.user_id FROM homework_attaches WHERE homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{@course.id} ) +) +GROUP BY members.user_id ORDER BY score #{score_sort_by} limit #{start_from}, #{nums}" + + end + else + sql_select = "SELECT members.*, SUM(homework_attaches.score) as score FROM members, homework_attaches + WHERE members.course_id = #{@course.id} AND members.user_id in (SELECT students_for_courses.student_id FROM students_for_courses WHERE course_id = #{@course.id}) AND members.user_id = homework_attaches.user_id + and members.course_group_id = #{groupid} AND homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{@course.id}) + GROUP BY members.user_id +UNION all +SELECT members.*, 0 as score FROM members,homework_attaches,students_for_courses WHERE members.course_id = #{@course.id} +and members.course_group_id = #{groupid} AND +students_for_courses.course_id = #{@course.id} and members.user_id = students_for_courses.student_id AND +members.user_id NOT IN (SELECT homework_attaches.user_id FROM homework_attaches WHERE homework_attaches.bid_id in (SELECT bid_id FROM homework_for_courses WHERE course_id = #{@course.id} ) +) +GROUP BY members.user_id ORDER BY score #{score_sort_by}" + end + sql = ActiveRecord::Base.connection() + homework_scores = Member.find_by_sql(sql_select) + sql.close() + + homework_scores + end + #获取课程的老师列表 + def find_course_teachers course + searchTeacherAndAssistant(course).map{|teacher| teacher.user_id}.join(",") + end + + #当加入,退出分班时查询分班的学生 + def search_group_members group + @subPage_title = l :label_student_list + @render_file = 'member_list' + @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' + @is_remote = true + @score_sort_by = "desc" + page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) + @results = student_homework_score(group.id,0,0, "desc") + @results = paginateHelper @results, 10 + + end + + def member_to_xls members,groups + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + sheet1 = book.create_worksheet :name => "student" + + 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_score)]) + count_row = 1 + group0 = CourseGroup.new(); + group0.id = 0; + group0.name = l(:excel_member_with_out_class) + groups_dup = groups.dup + groups_dup << group0 + groups_dup.each do |group| + sheet1[count_row,0] = l(:excel_class) + sheet1[count_row,1] = group.name + count_row += 1 + members.each do |member| + if member.course_group_id == group.id + sheet1[count_row,0]= member.user.id + sheet1[count_row,1] = member.user.lastname.to_s + member.user.firstname.to_s + sheet1[count_row,2] = member.user.login + sheet1[count_row,3] = member.user.user_extensions.student_id + sheet1[count_row,4] = member.user.mail + sheet1[count_row,5] = format("%0.2f",member.score.nil? ? 0:member.score.to_s) + count_row += 1 + end + end + end + book.write xls_report + xls_report.string + end + end diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 2f33ab554..56f760e13 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -201,6 +201,7 @@ class FilesController < ApplicationController def quote_resource_show @file = Attachment.find(params[:id]) + @can_quote = attachment_candown @file end def new @@ -394,16 +395,18 @@ class FilesController < ApplicationController render :layout => 'base_courses' } end + else + show_attachments @containers + @attachtype = params[:type].to_i + @contenttype = params[:contentType].to_s + + respond_to do |format| + format.js + format.html + end end - show_attachments @containers - @attachtype = params[:type].to_i - @contenttype = params[:contentType].to_s - respond_to do |format| - format.js - format.html - end end end diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb index cd51d2e58..03d1454ef 100644 --- a/app/controllers/forums_controller.rb +++ b/app/controllers/forums_controller.rb @@ -13,6 +13,44 @@ class ForumsController < ApplicationController include SortHelper PageLimit = 20 + def create_feedback + if User.current.logged? + @memo = Memo.new(params[:memo]) + @memo.forum_id = "1" + @memo.author_id = User.current.id + #@forum = @memo.forum + respond_to do |format| + if @memo.save + format.html { redirect_to forum_path(@memo.forum) } + else + sort_init 'updated_at', 'desc' + sort_update 'created_at' => "#{Memo.table_name}.created_at", + 'replies' => "#{Memo.table_name}.replies_count", + 'updated_at' => "COALESCE (last_replies_memos.created_at, #{Memo.table_name}.created_at)" + + @topic_count = @forum.topics.count + @topic_pages = Paginator.new @topic_count, per_page_option, params['page'] + @memos = @forum.topics. + reorder("#{Memo.table_name}.sticky DESC"). + includes(:last_reply). + limit(@topic_pages.per_page). + offset(@topic_pages.offset). + order(sort_clause). + preload(:author, {:last_reply => :author}). + all + + flash.now[:error] = "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" + # back_error_page = @memo.parent_id.nil? ? forum_path(@forum) : forum_memo_path(@forum, @memo.parent_id) + format.html { render action: :show, layout: 'base_forums' }#, error: "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" } + format.json { render json: @memo.errors, status: :unprocessable_entity } + end + end + else + respond_to do |format| + format.html { redirect_to signin_path } + end + end + end def create_memo @memo = Memo.new(params[:memo]) @@ -49,16 +87,15 @@ class ForumsController < ApplicationController end end end - + def index @offset, @limit = api_offset_and_limit({:limit => 10}) @forums_all = Forum.reorder("sticky DESC") @forums_count = @forums_all.count @forums_pages = Paginator.new @forums_count, @limit, params['page'] - @offset ||= @forums_pages.offset - @forums = @forums_all.offset(@offset).limit(@limit).all + @forums = @forums_all.offset(@offset).limit(@limit).all #@forums = Forum.all respond_to do |format| format.html # index.html.erb @@ -86,14 +123,12 @@ class ForumsController < ApplicationController preload(:author, {:last_reply => :author}). all - - # @offset, @limit = api_offset_and_limit({:limit => 10}) # @forum = Forum.find(params[:id]) # @memos_all = @forum.topics # @topic_count = @memos_all.count # @topic_pages = Paginator.new @topic_count, @limit, params['page'] - + # @offset ||= @topic_pages.offset # @memos = @memos_all.offset(@offset).limit(@limit).all respond_to do |format| @@ -176,7 +211,6 @@ class ForumsController < ApplicationController @forums_count = @forums_all.count @forums_pages = Paginator.new @forums_count, @limit, params['page'] - @offset ||= @forums_pages.offset @forums = @forums_all.offset(@offset).limit(@limit).all respond_to do |format| @@ -197,7 +231,7 @@ class ForumsController < ApplicationController @memos_all = @forum.topics.where("subject LIKE ?", q) @topic_count = @memos_all.count @topic_pages = Paginator.new @topic_count, @limit, params['page'] - + @offset ||= @topic_pages.offset @memos = @memos_all.offset(@offset).limit(@limit).all respond_to do |format| @@ -205,20 +239,17 @@ class ForumsController < ApplicationController render 'show', :layout => 'base_forums' } format.json { render json: @forum } - end + end end - - private - def find_forum_if_available @forum = Forum.find(params[:id]) if params[:id] rescue ActiveRecord::RecordNotFound render_404 nil - end + end def authenticate_user_edit find_forum_if_available diff --git a/app/controllers/homework_attach_controller.rb b/app/controllers/homework_attach_controller.rb index 72755dc6a..8b9bf9099 100644 --- a/app/controllers/homework_attach_controller.rb +++ b/app/controllers/homework_attach_controller.rb @@ -21,20 +21,25 @@ class HomeworkAttachController < ApplicationController #获取未批作业列表 def get_not_batch_homework + @not_batch_homework = true sort, direction = params[:sort] || "s_socre", params[:direction] || "desc" - teachers = find_course_teachers @course - get_not_batch_homework_list sort,direction,teachers, @bid.id + get_not_batch_homework_list sort,direction, @bid.id @cur_page = params[:page] || 1 @cur_type = 1 @direction = direction == 'asc'? 'desc' : 'asc' respond_to do |format| format.js + format.xls { + send_data(homework_to_xls(@all_homework_list), :type => "text/excel;charset=utf-8; header=present", + :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}(#{l(:excel_not_rated)}).xls") + } end end #获取已评作业列表 def get_batch_homeworks sort, direction = params[:sort] || "s_socre", params[:direction] || "desc" + @is_batch_homeworks = true if sort == 't_socre' order_by = "t_score #{direction}" elsif sort == 's_socre' @@ -42,10 +47,9 @@ class HomeworkAttachController < ApplicationController elsif sort == 'time' order_by = "created_at #{direction}" end - teachers = find_course_teachers @course all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT * FROM (SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN (#{teachers}) and stars IS NOT NULL) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN (#{teachers})) AS s_score + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE bid_id = #{@bid.id} ORDER BY #{order_by}) AS table1 WHERE table1.t_score IS NOT NULL") @@ -55,11 +59,18 @@ class HomeworkAttachController < ApplicationController @direction = direction == 'asc'? 'desc' : 'asc' respond_to do |format| format.js + format.xls { + send_data(homework_to_xls(all_homework_list), :type => "text/excel;charset=utf-8; header=present", + :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}(#{l(:excel_been_rated)}).xls") + } end end + + #获取所有作业列表 def get_homeworks + @is_all_homeworks = true sort, direction = params[:sort] || "s_socre", params[:direction] || "desc" if sort == 't_socre' order_by = "t_score #{direction}" @@ -68,10 +79,9 @@ class HomeworkAttachController < ApplicationController elsif sort == 'time' order_by = "created_at #{direction}" end - teachers = find_course_teachers @course all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id in (#{teachers})) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id not in (#{teachers})) AS s_score + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE bid_id = #{@bid.id} ORDER BY #{order_by}") @cur_page = params[:page] || 1 @@ -80,17 +90,20 @@ class HomeworkAttachController < ApplicationController @direction = direction == 'asc'? 'desc' : 'asc' respond_to do |format| format.js + format.xls { + send_data(homework_to_xls(all_homework_list), :type => "text/excel;charset=utf-8; header=present", + :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}.xls") + } end end #获取学生匿评列表 def get_student_batch_homework @is_student_batch_homework = true - teachers = find_course_teachers @course all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN (#{teachers})) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN (#{teachers})) AS s_score, - (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id}) AS m_score + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id} AND is_teacher_score = 0) AS m_score FROM homework_attaches INNER JOIN homework_evaluations ON homework_evaluations.homework_attach_id = homework_attaches.id WHERE homework_attaches.bid_id = #{@bid.id} AND homework_evaluations.user_id = #{User.current.id} ORDER BY m_score DESC") @@ -105,17 +118,16 @@ class HomeworkAttachController < ApplicationController #获取我的作业 def get_my_homework @is_my_homework = true - teachers = find_course_teachers @course all_homework_list = HomeworkAttach.find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN (#{teachers})) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN (#{teachers})) AS s_score + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE homework_attaches.bid_id = #{@bid.id} AND homework_attaches.user_id = #{User.current.id}") #如果我没有创建过作业,就检索我是否参与了某个作业 if all_homework_list.empty? all_homework_list = HomeworkAttach.find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN (#{teachers})) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN (#{teachers})) AS s_score + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches INNER JOIN homework_users ON homework_users.homework_attach_id = homework_attaches.id WHERE homework_attaches.bid_id = #{@bid.id} AND homework_users.user_id = #{User.current.id}") @@ -348,7 +360,7 @@ class HomeworkAttachController < ApplicationController else end else - render_403 :message => :notice_not_authorized + render_403 end end @@ -358,12 +370,11 @@ class HomeworkAttachController < ApplicationController # 作业打分列表 @stars_reates = @homework.rates(:quality) #我的评分 - @has_evaluation = @stars_reates.where("rater_id = #{User.current.id}").first - @m_score = @has_evaluation.nil? ? 0 : @has_evaluation.stars - teachers = find_course_teachers(@course) - @teacher_stars = @stars_reates.where("rater_id in (#{teachers})") #老师评分列表 - @student_stars = @stars_reates.where("rater_id not in (#{teachers})") #学生评分列表 @is_teacher = is_course_teacher User.current,@course + @has_evaluation = @stars_reates.where("rater_id = #{User.current.id} and is_teacher_score=#{@is_teacher ? 1 : 0}").first + @m_score = @has_evaluation.nil? ? 0 : @has_evaluation.stars + @teacher_stars = @stars_reates.where("is_teacher_score = 1") #老师评分列表 + @student_stars = @stars_reates.where("is_teacher_score = 0") #学生评分列表 @is_anonymous_comments = @bid.comment_status == 1 && !@homework.users.include?(User.current) && @homework.user != User.current && !@is_teacher #判断是不是匿评(开启匿评,当前用户不是作业的创建者或者参与者,不是老师) jours = @homework.journals_for_messages.where("is_comprehensive_evaluation = 3 or is_comprehensive_evaluation is null").order("created_on DESC")#jours留言 is null条件用以兼容历史数据 @jour = paginateHelper jours,5 #留言 @@ -385,10 +396,9 @@ class HomeworkAttachController < ApplicationController @journal_destroyed = JournalsForMessage.find(params[:object_id]) if @journal_destroyed.is_comprehensive_evaluation == 3 && @journal_destroyed.destroy render_403 unless User.current == @journal_destroyed.user || User.current.admin? - teachers = find_course_teachers(@homework.bid.courses.first) @stars_reates = @homework.rates(:quality) - @teacher_stars = @stars_reates.where("rater_id in (#{teachers})") #老师评分列表 - @student_stars = @stars_reates.where("rater_id not in (#{teachers})") #学生评分列表 + @teacher_stars = @stars_reates.where("is_teacher_score = 1)") #老师评分列表 + @student_stars = @stars_reates.where("is_teacher_score = 0") #学生评分列表 jours = @homework.journals_for_messages.where("is_comprehensive_evaluation = 3 or is_comprehensive_evaluation is null").order("created_on DESC")#jours留言 is null条件用以兼容历史数据 @jour = paginateHelper jours,5 #留言 else @@ -425,41 +435,67 @@ class HomeworkAttachController < ApplicationController @is_teacher,@is_anonymous_comments,@m_score = params[:is_teacher]=="true",params[:is_anonymous_comments]=="true",params[:stars_value] @cur_page,@cur_type = params[:cur_page] || 1,params[:cur_type] || 5 @homework = HomeworkAttach.find(params[:homework_id]) + @stars_reates = @homework.rates(:quality) + homework = @homework + is_teacher = @is_teacher ? 1 : 0 + #保存评分@homework.rate(@m_score.to_i,User.current.id,:quality, (@is_teacher ? 1 : 0)) + if @m_score + rate = @homework.rates(:quality).where(:rater_id => User.current.id, :is_teacher_score => is_teacher).first + if rate + rate.stars = @m_score + rate.save! + else + @homework.rates(:quality).new(:stars => @m_score, :rater_id => User.current.id, :is_teacher_score => is_teacher).save! + end + + if homework.is_teacher_score == 0 + if is_teacher == 1 + homework.score = @m_score + homework.is_teacher_score = 1 + else + sql = "SELECT AVG(stars) as stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = #{homework.id}" + score= HomeworkAttach.find_by_sql(sql).first.stars + homework.score = score + end + else + if is_teacher == 1 + homework.score = @m_score + homework.is_teacher_score = 1 + end + end + homework.save! + end - #保存评分 - @homework.rate(@m_score.to_i,User.current.id,:quality) if @m_score #保存评论 @is_comprehensive_evaluation = @is_teacher ? 1 : (@is_anonymous_comments ? 2 : 3) #判断当前评论是老师评论?匿评?留言 if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != "" #有没有留言 @homework.addjours User.current.id, params[:new_form][:user_message],0,@is_comprehensive_evaluation end - teachers = find_course_teachers(@homework.bid.courses.first) - @stars_reates = @homework.rates(:quality) - @teacher_stars = @stars_reates.where("rater_id in (#{teachers})") #老师评分列表 - @student_stars = @stars_reates.where("rater_id not in (#{teachers})") #学生评分列表 + @teacher_stars = @stars_reates.where("is_teacher_score = 1") #老师评分列表 + @student_stars = @stars_reates.where("is_teacher_score = 0") #学生评分列表 jours = @homework.journals_for_messages.where("is_comprehensive_evaluation = 3 or is_comprehensive_evaluation is null").order("created_on DESC")#jours留言 is null条件用以兼容历史数据 @jour = paginateHelper jours,5 #留言 if @cur_type == "1" #如果当前是老师未批列表,需要刷新整个作业列表界面 @bid = @homework.bid - get_not_batch_homework_list "s_socre","desc",teachers,@homework.bid_id + get_not_batch_homework_list "s_socre","desc",@homework.bid_id elsif @cur_type == "2" #老师已批列表 - @result_homework = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN (#{teachers}) and stars IS NOT NULL) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN (#{teachers})) AS s_score + @result_homework = HomeworkAttach.find_by_sql("SELECT homework_attaches.*, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE id = #{@homework.id}").first elsif @cur_type == "3" #全部作业列表 - @result_homework = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id in (#{teachers})) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id not in (#{teachers})) AS s_score + @result_homework = HomeworkAttach.find_by_sql("SELECT homework_attaches.*, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE id = #{@homework.id}").first elsif @cur_type == "4" #匿评作业列表 @is_student_batch_homework = true - @result_homework = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN (#{teachers})) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN (#{teachers})) AS s_score, - (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id}) AS m_score + @result_homework = HomeworkAttach.find_by_sql("SELECT homework_attaches.*, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id} AND is_teacher_score = #{is_teacher}) AS m_score FROM homework_attaches WHERE homework_attaches.id = #{@homework.id}").first else #其他的不用管 @@ -552,7 +588,7 @@ class HomeworkAttachController < ApplicationController teacher_proportion end - def get_not_batch_homework_list sort,direction,teachers,bid_id + def get_not_batch_homework_list sort,direction,bid_id if sort == 't_socre' order_by = "t_score #{direction}" elsif sort == 's_socre' @@ -560,18 +596,65 @@ class HomeworkAttachController < ApplicationController elsif sort == 'time' order_by = "created_at #{direction}" end - all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT * FROM (SELECT homework_attaches.*, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id IN (#{teachers})) AS t_score, - (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id NOT IN (#{teachers})) AS s_score + @all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT * FROM (SELECT homework_attaches.*, + (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,1) AS t_score, + (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE bid_id = #{bid_id} ORDER BY #{order_by}) AS table1 WHERE table1.t_score IS NULL") - @homework_list = paginateHelper all_homework_list,10 + @homework_list = paginateHelper @all_homework_list,10 end #获取指定作业的所有成员 def users_for_homework homework homework.nil? ? [] : (homework.users + [homework.user]) end + + def homework_to_csv items + encoding = l(:general_csv_encoding) + columns = ["student_id","user_name","login","student_num","mail","work_name","teacher_score","ni_score","commit_time"] + + + export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| + # csv header fields + csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c, encoding) } + # csv lines + items.each do |homework| + csv << [homework.user.id,Redmine::CodesetUtil.from_utf8(homework.user.lastname.to_s + homework.user.firstname.to_s, encoding),Redmine::CodesetUtil.from_utf8(homework.user.login, encoding), + Redmine::CodesetUtil.from_utf8(homework.user.user_extensions.student_id, encoding),Redmine::CodesetUtil.from_utf8(homework.user.mail, encoding),Redmine::CodesetUtil.from_utf8(homework.name, encoding), + Redmine::CodesetUtil.from_utf8((homework.t_score.nil? || (homework.t_score && homework.t_score.to_i == 0)) ? l(:label_without_score) : format("%.2f",homework.t_score), encoding), + Redmine::CodesetUtil.from_utf8( homework.s_score.nil? ? l(:label_without_score) : format("%.2f",homework.s_score), encoding),Redmine::CodesetUtil.from_utf8(format_time(homework.created_at), encoding)] + end + end + export + end + + def homework_to_xls items + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + 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_n_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.t_score.nil? || (homework.t_score && homework.t_score.to_i == 0)) ? l(:label_without_score) : format("%.2f",homework.t_score) + sheet1[count_row,7] = homework.s_score.nil? ? l(:label_without_score) : format("%.2f",homework.s_score) + sheet1[count_row,8] = format_time(homework.created_at) + count_row += 1 + end + + book.write xls_report + xls_report.string + end end diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index 867c2a302..ce899eff5 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -129,7 +129,7 @@ class MembersController < ApplicationController member = Member.new(:role_ids => params[:membership][:role_ids], :user_id => user_id) role = Role.find_by_id(params[:membership][:role_ids]) # 这里的判断只能通过角色名,可以弄成常量 - if role.name == "学生" + if role.name == "学生" || role.name == "Student" StudentsForCourse.create(:student_id => user_id, :course_id =>@course.id) end members << member @@ -210,7 +210,7 @@ class MembersController < ApplicationController if (params[:membership][:role_ids]) role = Role.find(params[:membership][:role_ids][0]) # 这里的判断只能通过角色名,可以弄成常量 - if role.name == "学生" + if role.name == "学生" || role.name == "Student" StudentsForCourse.create(:student_id => @member.user_id, :course_id =>@course.id) else joined = StudentsForCourse.where('student_id = ? and course_id = ?', @member.user_id,@course.id) diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index 88c59f9d7..17daea2ac 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -150,6 +150,7 @@ class MyController < ApplicationController File.delete(diskfile1) end end + end # Destroys user's account diff --git a/app/controllers/poll_answer_controller.rb b/app/controllers/poll_answer_controller.rb new file mode 100644 index 000000000..521f7ed3f --- /dev/null +++ b/app/controllers/poll_answer_controller.rb @@ -0,0 +1,2 @@ +class PollAnswerController < ApplicationController +end \ No newline at end of file diff --git a/app/controllers/poll_controller.rb b/app/controllers/poll_controller.rb new file mode 100644 index 000000000..a21fdb549 --- /dev/null +++ b/app/controllers/poll_controller.rb @@ -0,0 +1,2 @@ +class PollController < ApplicationController +end \ No newline at end of file diff --git a/app/controllers/poll_question_controller.rb b/app/controllers/poll_question_controller.rb new file mode 100644 index 000000000..46a75c0ab --- /dev/null +++ b/app/controllers/poll_question_controller.rb @@ -0,0 +1,2 @@ +class PollQuestionController < ApplicationController +end \ No newline at end of file diff --git a/app/controllers/poll_user_controller.rb b/app/controllers/poll_user_controller.rb new file mode 100644 index 000000000..0373fe085 --- /dev/null +++ b/app/controllers/poll_user_controller.rb @@ -0,0 +1,2 @@ +class PollUserController < ApplicationController +end \ No newline at end of file diff --git a/app/controllers/poll_vote_controller.rb b/app/controllers/poll_vote_controller.rb new file mode 100644 index 000000000..e77bdc622 --- /dev/null +++ b/app/controllers/poll_vote_controller.rb @@ -0,0 +1,2 @@ +class PollVoteController < ApplicationController +end \ No newline at end of file diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb index 5b6111187..e47cfc2ff 100644 --- a/app/controllers/softapplications_controller.rb +++ b/app/controllers/softapplications_controller.rb @@ -48,7 +48,7 @@ class SoftapplicationsController < ApplicationController def show @softapplication = Softapplication.find(params[:id]) - @project = @softapplication.project + #@project = @softapplication.project # 打分统计 stars_reates = @softapplication. rates(:quality) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 084e720d8..9752459b9 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -41,7 +41,7 @@ class UsersController < ApplicationController :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] before_filter :auth_user_extension, only: :show - before_filter :rest_user_score, only: :show + #before_filter :rest_user_score, only: :show #before_filter :select_entry, only: :user_projects accept_api_auth :index, :show, :create, :update, :destroy,:tag_save , :tag_saveEx @@ -129,7 +129,7 @@ class UsersController < ApplicationController end def show_new_score - render :layout => false + render :layout => 'users_base' end # end @@ -188,9 +188,9 @@ class UsersController < ApplicationController for user in @watcher events << Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 30) end - - - + + + @events_by_day = events.group_by(&:event_date) unless User.current.admin? @@ -393,7 +393,6 @@ class UsersController < ApplicationController end @users = scope.offset(@offset).limit(limit).all.reverse end - respond_to do |format| format.html { @groups = Group.all.sort @@ -435,9 +434,16 @@ class UsersController < ApplicationController else activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc') end + @activity_count = activity.count @activity_pages = Paginator.new @activity_count, pre_count, params['page'] - @activity = activity.offset(@activity_pages.offset).limit(@activity_pages.per_page).all + activity_page = activity.slice(@activity_pages.offset,@activity_pages.per_page * 2) + activity_page = activity_page.reject { |e| + ((e.act_type=="Issue") && ( !e.act.visible?(User.current))) || + ((e.act_type == "Journal") && (!e.act.project.visible?(User.current))) || + ((e.act_type == "Bid") && ((!User.current.member_of_course?(e.act.courses.first) || !User.current.admin?))) + } + @activity = activity.slice(0,@activity_pages.per_page) @state = 0 end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 94717a4ce..8e11bceb5 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -62,13 +62,49 @@ class WelcomeController < ApplicationController @course_page = FirstPage.find_by_page_type('course') @school_id = params[:school_id] || User.current.user_extensions.school.try(:id) @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() - @course_page = FirstPage.find_by_page_type('course') - logo = get_avatar?(@course_page) + + def logolink() + @course_page = FirstPage.find_by_page_type('course') + logo = get_avatar?(@course_page) id = params[:school_id] logo_link = "" if id.nil? && (User.current.user_extensions.nil? || User.current.user_extensions.school.nil?) @@ -110,6 +146,7 @@ class WelcomeController < ApplicationController def search search_condition = params[:q] search_type = params[:search_type].to_sym unless search_condition.blank? + search_by = params[:search_by] if search_type.nil? && params[:contests_search] && params[:name] != "" search_type = :contests @@ -127,11 +164,11 @@ class WelcomeController < ApplicationController when :contests redirect_to contests_url(:name => search_condition) when :users - redirect_to users_search_url(:name => search_condition) + redirect_to users_search_url(:name => search_condition,:search_by => search_by) when :users_teacher - redirect_to users_search_url(:name => search_condition, :role => :teacher) + redirect_to users_search_url(:name => search_condition, :search_by => search_by, :role => :teacher) when :users_student - redirect_to users_search_url(:name => search_condition, :role => :student) + redirect_to users_search_url(:name => search_condition, :search_by => search_by, :role => :student) else #redirect_to home_path, :alert => l(:label_sumbit_empty) (redirect_to home_url, :notice => l(:label_sumbit_empty);return) #if params[:name].blank? diff --git a/app/controllers/zipdown_controller.rb b/app/controllers/zipdown_controller.rb index 3612bf7a4..12637e2fb 100644 --- a/app/controllers/zipdown_controller.rb +++ b/app/controllers/zipdown_controller.rb @@ -75,16 +75,21 @@ class ZipdownController < ApplicationController def zip_homework_by_user(homeattach) homeworks_attach_path = [] + not_exist_file = [] # 需要将所有homework.attachments遍历加入zip # 并且返回zip路径 homeattach.attachments.each do |attach| - homeworks_attach_path << attach.diskfile#.to_s.slice((length+1)..-1) + if File.exist?(attach.diskfile) + homeworks_attach_path << attach.diskfile + else + not_exist_file << attach.filename + end end - zipping("#{homeattach.user.lastname}#{homeattach.user.firstname}_#{((homeattach.user.user_extensions.nil? || homeattach.user.user_extensions.student_id.nil?) ? "" : homeattach.user.user_extensions.student_id)}_#{Time.now.to_i.to_s}.zip", homeworks_attach_path, OUTPUT_FOLDER, true) + zipping("#{homeattach.user.lastname}#{homeattach.user.firstname}_#{((homeattach.user.user_extensions.nil? || homeattach.user.user_extensions.student_id.nil?) ? "" : homeattach.user.user_extensions.student_id)}_#{Time.now.to_i.to_s}.zip", homeworks_attach_path, OUTPUT_FOLDER, true, not_exist_file) end - def zipping(zip_name_refer, files_paths, output_path, is_attachment=false) + def zipping(zip_name_refer, files_paths, output_path, is_attachment=false, not_exist_file=[]) # 输入待打包的文件列表,已经打包文件定位到ouput_path ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE') input_filename = files_paths @@ -101,9 +106,11 @@ class ZipdownController < ApplicationController zipfile.add(rename_file, filename) end - #zipfile.get_output_stream('ReadMe') do |os| - # os.write 'Homeworks' - #end + unless not_exist_file.empty? + zipfile.get_output_stream('FILE_LOST.txt') do |os| + os.write l(:label_file_lost) + not_exist_file.join(',').to_s + end + end end zipfile_name rescue Errno => e @@ -119,4 +126,4 @@ class ZipdownController < ApplicationController attach = Attachment.find_by_disk_filename(name) attach.filename end -end +end \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8c2542aa2..cb88742ad 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1593,6 +1593,12 @@ module ApplicationHelper end s end + + def get_memo + @new_memo = Memo.new + #@new_memo.subject = "有什么想说的,尽管来咆哮吧~~" + @public_forum = Forum.find(1) + end private diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index a1199a55a..a862753ef 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -20,7 +20,7 @@ module CoursesHelper # 返回教师数量,即roles表中定义的Manager def teacherCount project - searchTeacherAndAssistant(project).count + project.members.count - studentCount(project).to_i # or # searchTeacherAndAssistant(project).count end @@ -114,7 +114,7 @@ module CoursesHelper # 学生人数计算 # add by nwb def studentCount course - searchStudent(course).count.to_s#course.student.count + course.student.count.to_s#course.student.count end #课程成员数计算 @@ -164,13 +164,20 @@ module CoursesHelper members end def searchStudent project - #searchPeopleByRoles(project, StudentRoles) - members = [] - project.members.each do |m| - members << m if m && m.user && m.user.allowed_to?(:as_student,project) + #searchPeopleByRoles(project, StudentRoles) + members = [] + + project.members.each do |m| + if m && m.user && m.user.allowed_to?(:as_student,project) + members << m + end + end members end + + + def searchStudent_by_name project, name #searchPeopleByRoles(project, StudentRoles) members = [] @@ -184,6 +191,39 @@ module CoursesHelper end members end + def searchmember_by_name members, name + #searchPeopleByRoles(project, StudentRoles) + mems = [] + if name != "" + members.each do |m| + + username = m.user[:lastname].to_s + m.user[:firstname].to_s + if(m.user[:login].to_s.include?(name) || m.user.user_extensions[:student_id].to_s.include?(name) || username.include?(name)) + mems << m + end + end + else + mems = members + end + mems + end + def searchgroupmember_by_name members, name, group + #searchPeopleByRoles(project, StudentRoles) + mems = [] + if name != "" + members.each do |m| + if m.course_group_id == group.id + username = m.user[:lastname].to_s + m.user[:firstname].to_s + if(m.user[:login].to_s.include?(name) || m.user.user_extensions[:student_id].to_s.include?(name) || username.include?(name)) + mems << m + end + end + end + else + mems = members + end + mems + end def searchgroupstudent_by_name(group, project, name) members = [] group.members.each do |m| @@ -392,7 +432,13 @@ module CoursesHelper return teacher_score_for_homework homework end end - + def score_for_homework_new homework + if teacher_score_for_homework(homework) != 0 + return teacher_score_for_homework homework + else + return student_score_for_homework homework + end + end #获取作业的互评得分 def student_score_for_homework homework #member = searchTeacherAndAssistant(homework.bid.courses.first).first#searchPeopleByRoles(homework.bid.courses.first,TeacherRoles).first diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index dfa485a70..8390fc61c 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -227,7 +227,7 @@ module IssuesHelper strings = [] values_by_field = {} details.each do |detail| - unless detail.property == 'attachment' + if detail.property == 'cf' field_id = detail.prop_key field = CustomField.find_by_id(field_id) @@ -243,7 +243,7 @@ module IssuesHelper end end strings << show_detail(detail, no_html, options) - end + end values_by_field.each do |field_id, changes| detail = JournalDetail.new(:property => 'cf', :prop_key => field_id) diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb index 935fb440e..842e1f1b7 100644 --- a/app/helpers/watchers_helper.rb +++ b/app/helpers/watchers_helper.rb @@ -98,7 +98,7 @@ module WatchersHelper # modify by nwb # 主讲教师不允许退出课程 return '' if user.id == course.tea_id - joined = user.member_of_course?(course) + joined = course.members.map{|m| m.user}.include? user text = joined ? l(:label_exit_course) : l(:label_new_join) url = joined ? join_path(:object_id => course.id) : try_join_path(:object_id => course.id) method = joined ? 'delete' : 'post' diff --git a/app/models/course.rb b/app/models/course.rb index 30bbaeba3..a5de93cf7 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -36,9 +36,9 @@ class Course < ActiveRecord::Base acts_as_attachable :view_permission => :view_course_files, :delete_permission => :manage_files - validates_presence_of :password, :term,:name,:description + validates_presence_of :password, :term,:name validates_format_of :class_period, :with =>/^[1-9]\d*$/ - validates_format_of :name,:with =>/^[a-zA-Z0-9_\u4e00-\u9fa5]+$/ + 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 diff --git a/app/models/issue.rb b/app/models/issue.rb index 09e093177..4dc685b3b 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -51,7 +51,7 @@ class Issue < ActiveRecord::Base acts_as_nested_set :scope => 'root_id', :dependent => :destroy - acts_as_attachable :after_add => :attachment_added, :after_remove => :attachment_removed + acts_as_attachable :before_add => :attachment_added, :after_remove => :attachment_removed acts_as_customizable acts_as_watchable acts_as_searchable :columns => ['subject', "#{table_name}.description", "#{Journal.table_name}.notes"], @@ -1359,7 +1359,7 @@ class Issue < ActiveRecord::Base # Callback on file attachment def attachment_added(obj) - if @current_journal && !obj.new_record? && @current_journal.journalized_id == obj.author_id + if @current_journal && @current_journal.user_id == obj.author_id && JournalDetail.find_all_by_value(obj.filename).count == 0 @current_journal.details << JournalDetail.new(:property => 'attachment', :prop_key => obj.id, :value => obj.filename) end end diff --git a/app/models/member.rb b/app/models/member.rb index 716f6a7c5..f1a139f74 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -114,9 +114,36 @@ class Member < ActiveRecord::Base member end + # 查找每个学生每个作业的评分 + def student_homework_score + score_count = 0 + homework_score = HomeworkAttach.find_by_sql("SELECT bids.name, homework_attaches.score as score + FROM homework_attaches, bids where homework_attaches.user_id = #{self.user_id} + and homework_attaches.bid_id IN (SELECT bid_id FROM homework_for_courses where course_id = #{self.course_id}) + AND homework_attaches.bid_id = bids.id ") + homework_score.each do |homework| + mem_score = 0 + if homework[:score] + mem_score = homework[:score] + end + score_count = score_count + mem_score + end + [homework_score, format("%0.2f", score_count)] + end protected def validate_role errors.add_on_empty :role if member_roles.empty? && roles.empty? end + + + + def searchTeacherAndAssistant project + #searchPeopleByRoles(project, TeacherRoles) + members = [] + project.members.each do |m| + members << m if m && m.user && m.user.allowed_to?(:as_teacher,project) + end + members + end end diff --git a/app/models/poll.rb b/app/models/poll.rb new file mode 100644 index 000000000..803ee6ac6 --- /dev/null +++ b/app/models/poll.rb @@ -0,0 +1,9 @@ +class Poll < ActiveRecord::Base + #attr_accessible :closed_at, :polls_group_id, :polls_name, :polls_status, :polls_type, :published_at, :user_id + include Redmine::SafeAttributes + + belongs_to :user + has_many :poll_questions, :dependent => :destroy + has_many :poll_users, :dependent => :destroy + has_many :users, :through => :poll_users #该文件被哪些用户提交答案过 +end diff --git a/app/models/poll_answer.rb b/app/models/poll_answer.rb new file mode 100644 index 000000000..93c75da97 --- /dev/null +++ b/app/models/poll_answer.rb @@ -0,0 +1,7 @@ +class PollAnswer < ActiveRecord::Base + # attr_accessible :answer_position, :answer_text, :poll_questions_id + include Redmine::SafeAttributes + + belongs_to :poll_question + has_many :poll_votes, :dependent => :destroy +end diff --git a/app/models/poll_question.rb b/app/models/poll_question.rb new file mode 100644 index 000000000..66dcea67e --- /dev/null +++ b/app/models/poll_question.rb @@ -0,0 +1,8 @@ +class PollQuestion < ActiveRecord::Base + # attr_accessible :is_necessary, :polls_id, :question_title, :question_type + include Redmine::SafeAttributes + + belongs_to :poll + has_many :poll_answers, :dependent => :destroy + has_many :poll_votes, :dependent => :destroy +end diff --git a/app/models/poll_user.rb b/app/models/poll_user.rb new file mode 100644 index 000000000..e7a122da9 --- /dev/null +++ b/app/models/poll_user.rb @@ -0,0 +1,7 @@ +class PollUser < ActiveRecord::Base + # attr_accessible :poll_id, :user_id + include Redmine::SafeAttributes + + belongs_to :poll + belongs_to :user +end diff --git a/app/models/poll_vote.rb b/app/models/poll_vote.rb new file mode 100644 index 000000000..550563e38 --- /dev/null +++ b/app/models/poll_vote.rb @@ -0,0 +1,8 @@ +class PollVote < ActiveRecord::Base + # attr_accessible :poll_answers_id, :poll_questions_id, :user_id, :vote_text + include Redmine::SafeAttributes + + belongs_to :poll_answer + belongs_to :poll_question + belongs_to :user +end diff --git a/app/models/query.rb b/app/models/query.rb index 550047c57..19bd1bed5 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -173,6 +173,7 @@ class Query < ActiveRecord::Base :string => [ "=", "~", "!", "!~", "!*", "*" ], :text => [ "~", "!~", "!*", "*" ], :integer => [ "=", ">=", "<=", "><", "!*", "*" ], + :integer_done => [ "=", ">=", "<=", "><", "!*", "*" ], :float => [ "=", ">=", "<=", "><", "!*", "*" ], :relation => ["=", "=p", "=!p", "!p", "!*", "*"] } @@ -217,6 +218,8 @@ class Query < ActiveRecord::Base case type_for(field) when :integer add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+$/) } + when :integer_done + add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+$/) || (v.match(/^[+-]?\d+$/) && (v.to_i<0 || v.to_i> 100)) } when :float add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^[+-]?\d+(\.\d*)?$/) } when :date, :date_past @@ -602,6 +605,12 @@ class Query < ActiveRecord::Base else sql = "#{db_table}.#{db_field} = #{value.first.to_i}" end + when :integer_done + if is_custom_filter + sql = "(#{db_table}.#{db_field} <> '' AND CAST(CASE #{db_table}.#{db_field} WHEN '' THEN '0' ELSE #{db_table}.#{db_field} END AS decimal(30,3)) = #{value.first.to_i})" + else + sql = "#{db_table}.#{db_field} = #{value.first.to_i}" + end when :float if is_custom_filter sql = "(#{db_table}.#{db_field} <> '' AND CAST(CASE #{db_table}.#{db_field} WHEN '' THEN '0' ELSE #{db_table}.#{db_field} END AS decimal(30,3)) BETWEEN #{value.first.to_f - 1e-5} AND #{value.first.to_f + 1e-5})" diff --git a/app/models/seems_rateable_rates.rb b/app/models/seems_rateable_rates.rb new file mode 100644 index 000000000..664f987ba --- /dev/null +++ b/app/models/seems_rateable_rates.rb @@ -0,0 +1,3 @@ +class SeemsRateableRates < ActiveRecord::Base + attr_accessible :rater_id, :rateable_id, :rateable_type, :stars, :dimension, :is_teacher_score +end diff --git a/app/models/user.rb b/app/models/user.rb index 70e4e8187..735b80762 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -77,6 +77,13 @@ class User < Principal has_many :homework_attaches, :through => :homework_users has_many :homework_evaluations + #问卷相关关关系 + has_many :poll_users, :dependent => :destroy + has_many :poll_votes, :dependent => :destroy + has_many :poll, :dependent => :destroy #用户创建的问卷 + has_many :answers, :source => :poll, :through => :poll_users, :dependent => :destroy #用户已经完成问答的问卷 + # end + has_and_belongs_to_many :groups, :after_add => Proc.new {|user, group| group.user_added(user)}, :after_remove => Proc.new {|user, group| group.user_removed(user)} has_many :changesets, :dependent => :nullify @@ -90,7 +97,7 @@ class User < Principal has_many :contesting_projects, :dependent => :destroy belongs_to :softapplication, :foreign_key => 'id', :dependent => :destroy ##ended by xianbo - + #####fq has_many :jours, :class_name => 'JournalsForMessage', :dependent => :destroy has_many :journals_messages, :class_name => 'JournalsForMessage', :foreign_key => "user_id", :dependent => :destroy @@ -105,7 +112,7 @@ class User < Principal #has_many :courses, :through => :students_for_courses, :source => :project has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy has_many :file_commit, :class_name => 'Attachment', :foreign_key => 'author_id', :conditions => "container_type = 'Project' or container_type = 'Version'" -#### +#### # added by bai has_many :join_in_contests, :dependent => :destroy has_many :news, :foreign_key => 'author_id' @@ -206,11 +213,11 @@ class User < Principal pattern = "%#{arg.to_s.strip.downcase}%" #where(" LOWER(concat(lastname, firstname)) LIKE :p ", :p => pattern) if type == "0" - where(" LOWER(login) LIKE :p ", :p => pattern) + where(" LOWER(login) LIKE '#{pattern}' ") elsif type == "1" - where(" LOWER(concat(lastname, firstname)) LIKE :p ", :p => pattern) + where(" LOWER(concat(lastname, firstname)) LIKE '#{pattern}' ") else - where(" LOWER(mail) LIKE :p ", :p => pattern) + where(" LOWER(mail) LIKE '#{pattern}' ") end end } diff --git a/app/services/users_service.rb b/app/services/users_service.rb index c1074c1c0..cc4d0f725 100644 --- a/app/services/users_service.rb +++ b/app/services/users_service.rb @@ -175,7 +175,7 @@ class UsersService "show_changesets" => true } scope = User.logged.status(@status) - @search_by = params[:search_by] ? params[:search_by][:id] : 0 + @search_by = params[:search_by] ? params[:search_by] : "0" scope = scope.like(params[:name],@search_by) if params[:name].present? scope end diff --git a/app/views/account/email_valid.html.erb b/app/views/account/email_valid.html.erb index c77c0294e..e6bc2a2db 100644 --- a/app/views/account/email_valid.html.erb +++ b/app/views/account/email_valid.html.erb @@ -4,7 +4,7 @@ 注册帐号 @@ -32,7 +32,9 @@ border: none; padding: 10px 16px; - line-height: 1.33;" target="_blank">立即查收邮件

+ line-height: 1.33;" target="_blank">立即查收邮件 +     <%= link_to l(:label_mail_resend), { :controller => 'account', :action => 'resendmail',:user => @user}, :remote => true, :method => 'get' %> +

diff --git a/app/views/bids/_alert_anonyoms.html.erb b/app/views/bids/_alert_anonyoms.html.erb index e4e9076a5..f26487126 100644 --- a/app/views/bids/_alert_anonyoms.html.erb +++ b/app/views/bids/_alert_anonyoms.html.erb @@ -50,7 +50,7 @@

开启匿评功能

开启匿评后学生将不能对作业进行 - 提交、修改、删除 + 修改、删除 等操作,目前有 <%= totle_size%>个 学生,共提交了 diff --git a/app/views/bids/_bid_homework_show.html.erb b/app/views/bids/_bid_homework_show.html.erb index e7b58fefc..2d6c35555 100644 --- a/app/views/bids/_bid_homework_show.html.erb +++ b/app/views/bids/_bid_homework_show.html.erb @@ -45,7 +45,7 @@ - + @@ -164,7 +158,7 @@ - -
+ <%= link_to(bid.author.lastname+bid.author.firstname, user_path(bid.author)) %> @@ -55,6 +55,8 @@ <%= link_to(bid.name, course_for_bid_path(bid), :class => 'bid_path') %> + <% if User.current.logged? && is_cur_course_student(@course) %> <% cur_user_homework = cur_user_homework_for_bid(bid) %> @@ -83,8 +85,8 @@ <%end%> <%= link_to( - l(:button_edit), - {:action => 'edit', :controller=>'bids', :course_id =>@course.id, :bid_id => bid.id} + l(:button_edit), + {:action => 'edit', :controller=>'bids', :course_id =>@course.id, :bid_id => bid.id} ) %> <%#= link_to( @@ -124,14 +126,6 @@ ) <% end %> - - <%= l(:label_students_responses) %> - ( - - <%= bid.commit.nil? ? 0 : bid.commit %> - - ) -
+ <%= l(:label_create_time) %> :  @@ -184,7 +178,6 @@ <% end %>
diff --git a/app/views/bids/_homework_form.html.erb b/app/views/bids/_homework_form.html.erb index ffe0fc1b9..e2fa117a9 100644 --- a/app/views/bids/_homework_form.html.erb +++ b/app/views/bids/_homework_form.html.erb @@ -22,7 +22,7 @@ <%= error_messages_for 'bid' %>

- <%= f.text_field :name, :required => true, :size => 60, :style => "width:490px;", :maxlength => Bid::NAME_LENGTH_LIMIT, :onblur => "regexName();" %> + <%= f.text_field :name, :required => true, :size => 60, :style => "width:490px;", :maxlength => Bid::NAME_LENGTH_LIMIT, :onkeyup => "regexName();" %>

@@ -48,7 +48,7 @@

- <%= f.text_field :evaluation_num, :required => true, :size => 60, :style => "width:150px;", :onblur => "regexEvaluationNum();" , :maxlength => 4%> + <%= f.text_field :evaluation_num, :required => true, :size => 60, :style => "width:150px;", :onkeyup => "regexEvaluationNum();" , :maxlength => 4%> 即每份作业被允许匿评的人数

diff --git a/app/views/bids/_homework_list.html.erb b/app/views/bids/_homework_list.html.erb index 202a2ee91..6572ee2c9 100644 --- a/app/views/bids/_homework_list.html.erb +++ b/app/views/bids/_homework_list.html.erb @@ -59,7 +59,7 @@ :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :remote => false, - :is_student_batch_homework => @is_student_batch_homework}%> + :not_batch_homework => @not_batch_homework,:is_student_batch_homework => @is_student_batch_homework}%> diff --git a/app/views/boards/_course_show.html.erb b/app/views/boards/_course_show.html.erb index 7a7d001ed..eac85e2d7 100644 --- a/app/views/boards/_course_show.html.erb +++ b/app/views/boards/_course_show.html.erb @@ -1,10 +1,7 @@