diff --git a/Gemfile b/Gemfile index b20c8653a..bfc0b773f 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ unless RUBY_PLATFORM =~ /w32/ gem 'rubyzip' gem 'zip-zip' end -gem 'seems_rateable' +gem 'seems_rateable', path: 'lib/seems_rateable' gem "rails", "3.2.13" gem "jquery-rails", "~> 2.0.2" gem "i18n", "~> 0.6.0" @@ -72,6 +72,10 @@ end group :development do gem "rdoc", ">= 2.4.2" + if nil + gem 'thin' + gem 'rack-mini-profiler' + end end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..54d89f381 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,119 @@ +PATH + remote: lib/seems_rateable + specs: + seems_rateable (1.0.13) + jquery-rails + rails + +GEM + remote: https://rubygems.org/ + specs: + actionmailer (3.2.13) + actionpack (= 3.2.13) + mail (~> 2.5.3) + actionpack (3.2.13) + activemodel (= 3.2.13) + activesupport (= 3.2.13) + builder (~> 3.0.0) + erubis (~> 2.7.0) + journey (~> 1.0.4) + rack (~> 1.4.5) + rack-cache (~> 1.2) + rack-test (~> 0.6.1) + sprockets (~> 2.2.1) + activemodel (3.2.13) + activesupport (= 3.2.13) + builder (~> 3.0.0) + activerecord (3.2.13) + activemodel (= 3.2.13) + activesupport (= 3.2.13) + arel (~> 3.0.2) + tzinfo (~> 0.3.29) + activeresource (3.2.13) + activemodel (= 3.2.13) + activesupport (= 3.2.13) + activesupport (3.2.13) + i18n (= 0.6.1) + multi_json (~> 1.0) + acts-as-taggable-on (2.4.1) + rails (>= 3, < 5) + arel (3.0.2) + builder (3.0.0) + coderay (1.0.9) + erubis (2.7.0) + fastercsv (1.5.0) + hike (1.2.3) + i18n (0.6.1) + journey (1.0.4) + jquery-rails (2.0.3) + railties (>= 3.1.0, < 5.0) + thor (~> 0.14) + json (1.8.0) + mail (2.5.4) + mime-types (~> 1.16) + treetop (~> 1.4.8) + mime-types (1.23) + multi_json (1.7.6) + mysql2 (0.3.11-x86-mingw32) + net-ldap (0.3.1) + polyglot (0.3.3) + rack (1.4.5) + rack-cache (1.2) + rack (>= 0.4) + rack-openid (1.3.1) + rack (>= 1.1.0) + ruby-openid (>= 2.1.8) + rack-ssl (1.3.3) + rack + rack-test (0.6.2) + rack (>= 1.0) + rails (3.2.13) + actionmailer (= 3.2.13) + actionpack (= 3.2.13) + activerecord (= 3.2.13) + activeresource (= 3.2.13) + activesupport (= 3.2.13) + bundler (~> 1.0) + railties (= 3.2.13) + railties (3.2.13) + actionpack (= 3.2.13) + activesupport (= 3.2.13) + rack-ssl (~> 1.3.2) + rake (>= 0.8.7) + rdoc (~> 3.4) + thor (>= 0.14.6, < 2.0) + rake (10.0.4) + rdoc (3.12.2) + json (~> 1.4) + ruby-openid (2.1.8) + sprockets (2.2.2) + hike (~> 1.2) + multi_json (~> 1.0) + rack (~> 1.0) + tilt (~> 1.1, != 1.3.0) + thor (0.18.1) + tilt (1.4.1) + treetop (1.4.14) + polyglot + polyglot (>= 0.3.1) + tzinfo (0.3.37) + +PLATFORMS + x86-mingw32 + +DEPENDENCIES + activerecord-jdbc-adapter (= 1.2.5) + activerecord-jdbcmysql-adapter + acts-as-taggable-on + builder (= 3.0.0) + coderay (~> 1.0.6) + fastercsv (~> 1.5.0) + i18n (~> 0.6.0) + jquery-rails (~> 2.0.2) + mysql2 (~> 0.3.11) + net-ldap (~> 0.3.1) + rack-openid + rails (= 3.2.13) + rdoc (>= 2.4.2) + ruby-openid (~> 2.1.4) + seems_rateable! diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 200810c4b..2f7d6e600 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -114,22 +114,12 @@ class IssuesController < ApplicationController @relations = @issue.relations.select {|r| r.other_issue(@issue) && r.other_issue(@issue).visible? } @allowed_statuses = @issue.new_statuses_allowed_to(User.current) - # @edit_allowed = User.current.allowed_to?(:edit_issues, @project) - if User.current.admin? || User.current.id == @issue.author_id || User.current.id == @issue.assigned_to_id || ProjectInfo.manager?(User.current.id, @project) - @edit_allowed = true - # elsif User.current.id == @issue.author.id - else - @edit_allowed = false - end - # @edit_allowed = User.current.allowed_to?(:edit_issues, @project) + @edit_allowed = User.current.allowed_to?(:edit_issues, @project) @priorities = IssuePriority.active @time_entry = TimeEntry.new(:issue => @issue, :project => @issue.project) @project_base_tag = (params[:project_id] || @issue.project) ? 'base_projects':'base'#by young - #by huang - # @change_flag = (@issue.author == User.current) || (User.current.admin?) - #end respond_to do |format| format.html { retrieve_previous_and_next_issue_ids diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3f771bf77..730546aa6 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -128,7 +128,7 @@ class ProjectsController < ApplicationController def index #Modified by nie - @project_type = params[:project_type] + @project_type = params[:project_type].to_i per_page_option = 10 @projects_all = Project.active.visible. @@ -177,30 +177,166 @@ class ProjectsController < ApplicationController def course @project_type = params[:project_type] + @school_id = params[:school_id] per_page_option = 10 - - @projects_all = Project.active.visible. - joins("LEFT JOIN #{ProjectStatus.table_name} ON #{Project.table_name}.id = #{ProjectStatus.table_name}.project_id"). - where("#{Project.table_name}.project_type = ? ", Project::ProjectType_course) + if @school_id == "0" or @school.nil? + @projects_all = Project.active.visible. + joins("LEFT JOIN #{ProjectStatus.table_name} ON #{Project.table_name}.id = #{ProjectStatus.table_name}.project_id"). + where("#{Project.table_name}.project_type = ? ", Project::ProjectType_course) + else + @projects_all = Project.active.visible. + joins("LEFT JOIN #{ProjectStatus.table_name} ON #{Project.table_name}.id = #{ProjectStatus.table_name}.project_id"). + joins(:course_extra). + where("#{Project.table_name}.project_type = ? AND #{Course.table_name}.school_id = ?", Project::ProjectType_course, @school_id) + end @project_count = @projects_all.count @project_pages = Paginator.new @project_count, per_page_option, params['page'] + +#gcm activity count + + @project_activity_count=Hash.new + + @projects_all.each do |project| + @project_activity_count[project.id]=0 + end + @project_ids=@project_activity_count.keys() + + days = Setting.activity_days_default.to_i + date_to ||= Date.today + 1 + date_from = date_to - days-1.years + +#approach 1 +=begin + + @projects_all.each do |project| + #issue_count + issues=Issue.where("project_id=?",project.id) + issue_count=0 + issues.each do |issue| + issue_count+=issue.journals.count + end + + #repository_count + repositories=Repository.where("project_id=?",project.id) + repository_count=0 + repositories.each do |repository| + repository_count+=repository.changesets.count + end + + #news_count + news_count=News.where("project_id=?",project.id).count + #document_count + document_count=Document.where("project_id=?",project.id).count + #file_count + file_count=Attachment.where("container_type='Project' AND container_id=?",project.id).count + + #message_count + boards=Board.where("project_id=?",project.id) + message_count=0 + boards.each do |board| + message_count+=board.messages.count + end + + #time_entry_count + time_entry_count=TimeEntry.where("project_id=?",project.id).count + + #sum + @project_activity_count[project.id.to_s]=issue_count+repository_count+news_count+document_count+file_count+message_count+time_entry_count + + end +=end +#gcm + +#gcm approach 2 + + #issue_count + Issue.where(project_id: @project_ids).where("updated_on>?",date_from).each do |issue| +# @project_activity_count[issue.project_id.to_s]+=1 + @project_activity_count[issue.project_id]+=issue.journals.where("created_on>?",date_from).count + end + + #repository_count + Repository.where(project_id: @project_ids).each do |repository| +# @project_activity_count[repository.project_id.to_s]+=1 + @project_activity_count[repository.project_id]+=repository.changesets.where("committed_on>?",date_from).count + end + + + #news_count + News.where(project_id: @project_ids).where("created_on>?",date_from).each do |news| + @project_activity_count[news.project_id]+=1 + end + + #document_count + Document.where(project_id: @project_ids).where("created_on>?",date_from).each do |document| + @project_activity_count[document.project_id]+=1 + end + + #file_count + Attachment.where(container_id: @project_ids).where("container_type='Project' AND created_on>?",date_from).each do |attachment| + @project_activity_count[attachment.container_id]+=1 + end + + #message_count + Board.where(project_id: @project_ids).each do |board| +# @project_activity_count[board.project_id]+=1 + @project_activity_count[board.project_id]+=board.messages.where("updated_on>?",date_from).count + end + + #time_entry_count + TimeEntry.where(project_id: @project_ids).where("updated_on>?",date_from).each do |timeentry| + @project_activity_count[timeentry.project_id]+=1 + end + + #feedbackc_count + JournalsForMessage.where(jour_id: @project_ids).each do |jourformess| + @project_activity_count[jourformess.jour_id]+=1 + end + + #@project_activity_count!=0 + @project_all_array=[] + i=0; + @projects_all.each do |project| + id=project.id + @project_all_array[i]=project + if @project_activity_count[id]==0 + @project_activity_count[id]=1 + end + i=i+1 + end + + @project_activity_count_array=@project_activity_count.values() + +#gcm end + case params[:project_sort_type] when '0' @projects = @projects_all.order("created_on desc") @s_type = 0 + @projects = @projects.offset(@project_pages.offset).limit(@project_pages.per_page) when '1' @projects = @projects_all.order("course_ac_para desc") @s_type = 1 + @projects = @projects.offset(@project_pages.offset).limit(@project_pages.per_page) when '2' @projects = @projects_all.order("watchers_count desc") @s_type = 2 + @projects = @projects.offset(@project_pages.offset).limit(@project_pages.per_page) + + #gcm + when '3' + @projects=desc_sort_course_by_avtivity(@project_ids,@project_activity_count_array,@project_all_array) + @s_type = 3 + @projects = @projects[@project_pages.offset, @project_pages.per_page] + #gcmend + else @s_type = 0 @projects = @projects_all.order("created_on desc") + @projects = @projects.offset(@project_pages.offset).limit(@project_pages.per_page) end - @projects = @projects.offset(@project_pages.offset).limit(@project_pages.per_page) respond_to do |format| format.html { @@ -220,8 +356,8 @@ class ProjectsController < ApplicationController def search #modified by nie - project_type = params[:project_type] - projects_all = (project_type.eql? Project::ProjectType_project) ? Project.project_entities : Project.course_entities + project_type = params[:project_type].to_i + projects_all = (project_type.eql? Project::ProjectType_course) ? Project.course_entities : Project.project_entities @projects = projects_all.visible @projects = @projects.visible.like(params[:name]) if params[:name].present? @offset, @limit = api_offset_and_limit({:limit => 10}) @@ -392,7 +528,8 @@ class ProjectsController < ApplicationController # added by bai @course.term = params[:term] @course.time = params[:time] - @course.school_id = params[:occupation] + #@course.school_id = params[:occupation] + @course.school_id = User.current.user_extensions.school_id @course.setup_time = params[:setup_time] @course.endup_time = params[:endup_time] @course.class_period = params[:class_period] @@ -575,7 +712,7 @@ class ProjectsController < ApplicationController "show_journals_for_messages" => true } @date_to ||= Date.today + 1 - @date_from = @date_to - @days + @date_from = @date_to - @days-1.years @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id])) # 决定显示所用用户或单个用户活动 @@ -725,7 +862,7 @@ class ProjectsController < ApplicationController if params[:project][:is_public] == '0' project_status = ProjectStatus.find_by_project_id(@project.id) - project_status.destroy + project_status.destroy if project_status elsif params[:project][:is_public] == '1' project_status = ProjectStatus.create(:project_id => @project.id, :watchers_count => @project.watchers.count, :changesets_count => @project.changesets.count,:grade => 0, :project_type => @project.project_type) end @@ -880,4 +1017,32 @@ class ProjectsController < ApplicationController @users -= watched.watcher_users end end + + def desc_sort_course_by_avtivity(ids,activity_count,projects) + return projects if activity_count.size<2 + (activity_count.size-2).downto(0) do |i| + (0..i).each do |j| + if activity_count[j]activity_count[j+1] do + # count_temp=activity_count[j] + + # activity_count[j]=activity_count[j+1] + # activity_count[j+1]=count_temp + # end + # end + # end +#desc_sort_course_by_avtivity(@project_ids,@project_activity_count_array,@projects_all) + end end diff --git a/app/controllers/ratings_controller.rb b/app/controllers/ratings_controller.rb deleted file mode 100644 index 5ae478af8..000000000 --- a/app/controllers/ratings_controller.rb +++ /dev/null @@ -1,15 +0,0 @@ -require_dependency "seems_rateable/application_controller" - -class RatingsController < ::ApplicationController - def create - raise NoCurrentUserInstanceError unless current_user - - obj = params[:kls].classify.constantize.find(params[:idBox]) - begin - obj.rate(params[:rate].to_i, current_user.id, params[:dimension]) - render :json => true - rescue Errors::AlreadyRatedError - render :json => {:error => true} - end - end -end diff --git a/app/controllers/school_controller.rb b/app/controllers/school_controller.rb index 749491b69..9ef935cf7 100644 --- a/app/controllers/school_controller.rb +++ b/app/controllers/school_controller.rb @@ -1,4 +1,16 @@ class SchoolController < ApplicationController + + before_filter :require_admin, :only => :upload_logo + + def upload_logo + + end + + + def index + + end + def get_options @school = School.where("province = ?", params[:province]) p = params[:province] @@ -6,10 +18,34 @@ class SchoolController < ApplicationController options = "" @school.each do |s| - options << "" + #options << "" + options << "
  • #{s.name}
  • " end + render :text => options end + + def get_schoollist + @school = School.where("province = ?", params[:province]) + + options = "" + @school.each do |s| + options << "
  • #{s.name}
  • " + end + + render :text => options + end + + def search_school + @school = School.where("province = ? AND name LIKE '%"+params[:key_word]+"%'", params[:province]); + + options = "" + @school.each do |s| + options << "
  • #{s.name}
  • " + end + + render :text => options + end end diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb index 9f14aa118..9cc940bdd 100644 --- a/app/controllers/softapplications_controller.rb +++ b/app/controllers/softapplications_controller.rb @@ -1,4 +1,8 @@ class SoftapplicationsController < ApplicationController + before_filter :find_softapplication, only: [:edit, :update, :destroy] + before_filter :editable, only: [:edit, :update] + before_filter :destroyable, only: :destroy + # GET /softapplications # GET /softapplications.json def index @@ -71,8 +75,9 @@ class SoftapplicationsController < ApplicationController # PUT /softapplications/1 # PUT /softapplications/1.json def update - @softapplication = Softapplication.find(params[:id]) - + # @softapplication = Softapplication.find(params[:id]) + @softapplication.attachments.map{|attach| attach.destroy } + @softapplication.save_attachments(params[:attachments]) respond_to do |format| if @softapplication.update_attributes(params[:softapplication]) format.html { redirect_to @softapplication, notice: 'Softapplication was successfully updated.' } @@ -92,11 +97,11 @@ class SoftapplicationsController < ApplicationController # DELETE /softapplications/1 # DELETE /softapplications/1.json def destroy - @softapplication = Softapplication.find(params[:id]) + # @softapplication = Softapplication.find(params[:id]) @softapplication.destroy respond_to do |format| - format.html { redirect_to softapplications_url } + format.html { redirect_to home_path } format.json { head :no_content } end end @@ -192,4 +197,24 @@ class SoftapplicationsController < ApplicationController #format.api { render_api_ok } end end + + private + def find_softapplication + @softapplication = Softapplication.find_by_id(params[:id]) + end + + def editable + unless @softapplication.editable_by? User.current + render_403 + return false + end + end + + def destroyable + unless @softapplication.destroyable_by? User.current + render_403 + return false + end + end + end diff --git a/app/controllers/test_controller.rb b/app/controllers/test_controller.rb index cb28f4e66..0623dbee2 100644 --- a/app/controllers/test_controller.rb +++ b/app/controllers/test_controller.rb @@ -1,4 +1,6 @@ class TestController < ApplicationController + + helper :UserScore def zip homeworks_attach_path = [] diff --git a/app/controllers/user_score_controller.rb b/app/controllers/user_score_controller.rb new file mode 100644 index 000000000..0676155ad --- /dev/null +++ b/app/controllers/user_score_controller.rb @@ -0,0 +1,6 @@ +class UserScoreController < ApplicationController + helper :UserScore + + + +end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index d566c9b86..5e8eef074 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -17,7 +17,7 @@ class WelcomeController < ApplicationController caches_action :robots - before_filter :fake, :only => [:index, :course] + # before_filter :fake, :only => [:index, :course] before_filter :entry_select_course, :entry_select_contest, :entry_select_user, :only => [:index] def index diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index ad90f8942..859b19655 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -255,26 +255,17 @@ module ApplicationHelper end classes = (ancestors.empty? ? 'root' : 'child') s << "
  • " - if params[:project_type] == "0" + if project.try(:project_type) == Project::ProjectType_project s << h(block_given? ? yield(project) : project.name) else end - # if @project.project_type == 1 - # unless Course.find_by_extra(@project.identifier).nil? - # unless Course.find_by_extra(@project.identifier).tea_id == User.current.id - # s << "" - # s << join_in_course(@project, User.current)#, ['whiteButton']) - # s << "" - # end - # end - # end - if params[:project_type] == "0" + if project.try(:project_type) == Project::ProjectType_project unless User.current.member_of?(@project) s << "" s << watcher_link(@project, User.current)#, ['whiteButton']) s << "" - end + end s << (render :partial => 'projects/project', :locals => {:project => project}).to_s else s << (render :partial => 'projects/course', :locals => {:project => project}).to_s @@ -1579,9 +1570,14 @@ module ApplicationHelper forum_link = link_to l(:label_project_module_forums), {:controller => "forums", :action => "index"} stores_link = link_to l(:label_stores_index), {:controller => 'stores', :action=> 'index'} + + school_all_school_link = link_to l(:label_school_all), {:controller => 'school', :action => 'index'} + + #@nav_dispaly_project_label nav_list = Array.new nav_list.push(home_link) if !@nav_dispaly_home_path_label + nav_list.push(school_all_school_link) if @nav_dispaly_course_all_label nav_list.push(course_all_course_link) if @nav_dispaly_course_all_label nav_list.push(course_teacher_all_link) if @nav_dispaly_teacher_all_label diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 2d2934cc2..5bd677bdf 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -69,18 +69,29 @@ module ProjectsHelper content << content_tag('li', link_to(l(:label_sort_by_time), course_path(:project_sort_type => '0', :project_type => project_type), :class=>"selected"), :class=>"selected") content << content_tag('li', link_to(l(:label_sort_by_active), course_path(:project_sort_type => '1', :project_type => project_type))) # content << content_tag('li', link_to(l(:label_sort_by_influence), course_path(:project_sort_type => '2', :project_type => project_type))) + content << content_tag('li', link_to(l(:label_sort_by_activity), course_path(:project_sort_type => '3', :project_type => project_type))) when 1 content << content_tag('li', link_to(l(:label_sort_by_time), course_path(:project_sort_type => '0', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_active), course_path(:project_sort_type => '1', :project_type => project_type), :class=>"selected"), :class=>"selected") # content << content_tag('li', link_to(l(:label_sort_by_influence), course_path(:project_sort_type => '2', :project_type => project_type))) + content << content_tag('li', link_to(l(:label_sort_by_activity), course_path(:project_sort_type => '3', :project_type => project_type))) when 2 content << content_tag('li', link_to(l(:label_sort_by_time), course_path(:project_sort_type => '0', :project_type => project_type))) content << content_tag('li', link_to(l(:label_sort_by_active), course_path(:project_sort_type => '1', :project_type => project_type))) # content << content_tag('li', link_to(l(:label_sort_by_influence), course_path(:project_sort_type => '2', :project_type => project_type), :class=>"selected"), :class=>"selected") - + content << content_tag('li', link_to(l(:label_sort_by_activity), course_path(:project_sort_type => '3', :project_type => project_type))) + + #gcm + when 3 + content << content_tag('li', link_to(l(:label_sort_by_time), course_path(:project_sort_type => '0', :project_type => project_type))) + content << content_tag('li', link_to(l(:label_sort_by_active), course_path(:project_sort_type => '1', :project_type => project_type))) + # content << content_tag('li', link_to(l(:label_sort_by_influence), course_path(:project_sort_type => '2', :project_type => project_type))) + content << content_tag('li', link_to(l(:label_sort_by_activity), course_path(:project_sort_type => '3', :project_type => project_type), :class=>"selected"), :class=>"selected") end + #gcmend + content = content_tag('ul', content) content_tag('div', content, :class => "tabs") end @@ -164,7 +175,7 @@ module ProjectsHelper def render_project_hierarchy(projects) render_project_nested_lists(projects) do |project| #Modified by young - if (project.project_type==1) + if (project.try(:project_type) == Project::ProjectType_course ) s = link_to_project(project, {}, :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'my-project' : nil}").html_safe else s = link_to_project(project, {}, :class => "#{project.css_classes} #{User.current.member_of?(project) ? 'my-project' : nil}") diff --git a/app/helpers/user_score_helper.rb b/app/helpers/user_score_helper.rb index ff4a5adbd..5b455a01b 100644 --- a/app/helpers/user_score_helper.rb +++ b/app/helpers/user_score_helper.rb @@ -24,21 +24,171 @@ module UserScoreHelper issues.each do |issue| issue_c = issue_c + issue.journals.where("user_id <> ?", user.id).count end - issue_c = issue_c + Journal.where("user_id = ?", user.id) + issue_c = issue_c + Journal.where("user_id = ?", user.id).count + ############################ + memos = Memo.where('author_id = ? AND parent_id IS NOT NULL', user.id) + + memos.each do |m| + if Memo.find(m.parent_id).author.id != user.id + issue_c = issue_c + 1 + else + issue_c = issue_c - 1 + end + end + + + pmemos = Memo.where('author_id = ? AND parent_id IS NULL', user.id) + pmemos.each do |pm| + issue_c = issue_c + pm.replies_count + end + ############################ + + issue_c = issue_c + JournalsForMessage.where('user_id = ? AND reply_id IS NOT NULL AND reply_id <> ?', user.id, user.id).count + JournalsForMessage.where('reply_id = ? AND user_id <> ?', user.id, user.id).count + + return issue_c end def calculate_influence_count(user) - watcher_count = watcher_users(User.current.id).count + watcher_count = Watcher.where("watchable_type = 'principal' AND watchable_id = ?", user.id).count end def calculate_skill_count(user) - 0 + + praise_count = 0 + tread_count = 0 + issues = Issue.where('author_id = ?', user.id) + issues.each do |i| + ptcs = PraiseTreadCache.where('object_id = ?', i.id) + ptcs.each do |p| + praise_count = praise_count + p.praise_num + tread_count = tread_count + p.tread_num + end + end + + bids = Bid.where('author_id = ?', user.id) + bids.each do |b| + ptcs = PraiseTreadCache.where('object_id = ?', b.id) + ptcs.each do |p| + praise_count = praise_count + p.praise_num + tread_count = tread_count + p.tread_num + end + end + + contests = Contest.where('author_id = ?', user.id) + contests.each do |c| + ptcs = PraiseTreadCache.where('object_id = ?', c.id) + ptcs.each do |p| + praise_count = praise_count + p.praise_num + tread_count = tread_count + p.tread_num + end + end + + + level = calculate_level(user) + + skill_score = 0 + + if level == 0 + skill_score = praise_count - 0.5 * tread_count + end + if level == 1 + skill_score = 2 * praise_count - 1.5 * tread_count + end + if level == 2 + skill_socre = 3 * praise_count - 2.5 * tread_count + end + if level == 3 + skill_socre = 4 * praise_count - 3.5 * tread_count + end + if level == 4 + skill_socre = 5 * praise_count - 4.5 * tread_count + end + +# case level +# when 0 skill_score = praise_count - 0.5 * tread_count +# when 1 skill_score = 2 * praise_count - 1.5 * tread_count +# when 2 skill_socre = 3 * praise_count - 2.5 * tread_count +# when 3 skill_socre = 4 * praise_count - 3.5 * tread_count +# when 4 skill_socre = 5 * praise_count - 4.5 * tread_count +# end + + + + tread_user_count = PraiseTread.where('praise_or_tread = ? AND user_id = ?', 0, user.id).count + + skill_score = skill_score - 0.5 * tread_user_count + + return skill_score + + + end def calculate_level(user) - 1 + commit_count = user.changesets.count + max_praise_num = 0 + + + issues = Issue.where('author_id = ?', user.id) + issues.each do |i| + ptcs = PraiseTreadCache.where('object_id = ?', i.id) + ptcs.each do |p| + if p.praise_num > max_praise_num + max_praise_num = p.praise_num + end + end + end + + bids = Bid.where('author_id = ?', user.id) + bids.each do |b| + ptcs = PraiseTreadCache.where('object_id = ?', b.id) + ptcs.each do |p| + if p.praise_num > max_praise_num + max_praise_num = p.praise_num + end + end + end + + contests = Contest.where('author_id = ?', user.id) + contests.each do |c| + ptcs = PraiseTreadCache.where('object_id = ?', c.id) + ptcs.each do |p| + if p.praise_num > max_praise_num + max_praise_num = p.praise_num + end + end + end + + + best_answer_num = 0 + + isManager = 0 + members = Member.where('user_id = ?', user.id) + members.each do |m| + roles = m.member_roles + roles.each do |r| + if r.role_id == 3 + isManager = 1 + end + end + end + + level = 0 + + if max_praise_num > 4 + level = 1 + end + if commit_count > 0 and commit_count < 101 + level = 1 + end + if commit_count > 100 or isManager == 1 + level = 2 + end + + return level + end def calculate_activity_count(user) @@ -51,13 +201,13 @@ module UserScoreHelper # end # file_count = user.file_commit.count # issue_count = Issue.where('author_id = ?', user.id).count - f = user.user_score.file - i = user.user_score.issue - f_max = UserScore.find_max_file - f_min = UserScore.find_min_file - i_max = UserScore.find_max_issue - i_min = UserScore.find_min_issue - score = 100 * ((f - f_min)/(f_max - f_min) + (i - i_min)/(i_max - i_min)) + #f = user.user_score.file + #i = user.user_score.issue + #f_max = UserScore.find_max_file + #f_min = UserScore.find_min_file + #i_max = UserScore.find_max_issue + #i_min = UserScore.find_min_issue + #score = 100 * ((f - f_min)/(f_max - f_min) + (i - i_min)/(i_max - i_min)) end def calculate_file(user) @@ -72,8 +222,14 @@ module UserScoreHelper issue_details_count = 0 issues = Issue.where('assigned_to_id = ?', user.id) + change_count = 0 issues.each do |issue| - change_count = issue.journals.where("prop_key = ?", "done_ratio").count + js = issue.journals + js.each do |j| + change_count = change_count + j.details.where("prop_key = ?", "done_ratio").count + end + + issue_details_count = change_count + issue_details_count end @@ -89,7 +245,9 @@ module UserScoreHelper file = calculate_file(user) issue = calculate_issue(user) level = calculate_level(user) - user.user_score << UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill, + #user.user_score << UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill, + # :activity => activity, :file => file, :issue => issue, :level => level) + UserScore.new(:collaboration => collaboration, :influence => influence, :skill => skill, :activity => activity, :file => file, :issue => issue, :level => level) end @@ -97,12 +255,17 @@ module UserScoreHelper collaboration = calculate_collaboration_count(user) influence = calculate_influence_count(user) skill = calculate_skill_count(user) - activity = calculate_activity_count(user) file = calculate_file(user) issue = calculate_issue(user) + + ##activity = calculate_activity_count(user) + level = calculate_level(user) user.user_score.update_attributes(:collaboration => collaboration, :influence => influence, :skill => skill, :activity => activity, :file => file, :issue => issue, :level => level) end + + + end diff --git a/app/helpers/welcome_helper.rb b/app/helpers/welcome_helper.rb index 9970ee9c6..53869b9ed 100644 --- a/app/helpers/welcome_helper.rb +++ b/app/helpers/welcome_helper.rb @@ -56,12 +56,49 @@ module WelcomeHelper # # => 前7个项目为新课程,后面三个是参与人数最多的 # # Returns project&courses array - def find_miracle_course(sum=10, max_rate=7) - Project.active.visible.course_entities. - joins(:course_extra). - joins(:memberships). - group('members.project_id'). - reorder("courses.time DESC, COUNT(members.project_id) DESC").take sum + def find_miracle_course(sum=10, max_rate=7, school_id) + + if User.current.user_extensions.school.nil? and school_id.nil? + Project.active.visible.course_entities. + joins(:course_extra). + joins(:memberships). + group('members.project_id'). + reorder("courses.time DESC, COUNT(members.project_id) DESC").take sum +# elseif school_id.nil? + + else + if school_id.nil? + Project.active.visible.course_entities. + joins(:course_extra). + joins(:memberships). + where("#{Course.table_name}.school_id = ?", User.current.user_extensions.school.id). + group('members.project_id'). + reorder("courses.time DESC, COUNT(members.project_id) DESC").take sum + else + if school_id == "0" + Project.active.visible.course_entities. + joins(:course_extra). + joins(:memberships). + group('members.project_id'). + reorder("courses.time DESC, COUNT(members.project_id) DESC").take sum + else + Project.active.visible.course_entities. + joins(:course_extra). + joins(:memberships). + where("#{Course.table_name}.school_id = ?", school_id). + group('members.project_id'). + reorder("courses.time DESC, COUNT(members.project_id) DESC").take sum + end + end + end +# else +# Project.active.visible.course_entities. +# joins(:course_extra). +# joins(:memberships). +# where("#{Course.table_name}.school_id = ?", school_id). +# group('members.project_id'). +# reorder("courses.time DESC, COUNT(members.project_id) DESC").take sum +# end # max = sum*(max_rate.to_f/10) # c1 = find_new_course(sum).to_a.dup # c2 = find_all_hot_course(sum).to_a.dup @@ -98,14 +135,14 @@ module WelcomeHelper end def find_all_hot_contest limit=10 - # Contest.reorder("created_on DESC").all.take limit - mix_bid = [] - mix_bid += Contest.reorder("created_on DESC").take(limit).to_a - mix_bid += Bid.visible.where('reward_type = ?', 2).reorder('bids.created_on desc').take(limit).to_a - mix_bid.sort do |older, newer| - newer.created_on - older.created_on - end - mix_bid.take limit + Contest.reorder("created_on DESC").all.take limit + # mix_bid = [] + # mix_bid += Contest.reorder("created_on DESC").take(limit).to_a + # mix_bid += Bid.visible.where('reward_type = ?', 2).reorder('bids.created_on desc').take(limit).to_a + # mix_bid.sort do |older, newer| + # newer.created_on - older.created_on + # end + # mix_bid.take limit end def find_all_hot_softapplication limit=10 diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 919760ee3..73ae44b4d 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -181,7 +181,7 @@ class Attachment < ActiveRecord::Base end def pack? - !!(self.filename =~ /\.(zip|rar|tar|gz)$/i) + !!(self.filename =~ /\.(zip|rar|tar|gz|exe|jar|7z|iso)$/i) end def thumbnailable? diff --git a/app/models/bid.rb b/app/models/bid.rb index fd389c15f..e58e640a0 100644 --- a/app/models/bid.rb +++ b/app/models/bid.rb @@ -29,6 +29,7 @@ class Bid < ActiveRecord::Base has_many :courses, :through => :homework_for_courses, :source => :project has_many :homeworks, :class_name => 'HomeworkAttach', :dependent => :destroy has_many :join_in_contests, :dependent => :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy # has_many :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}" diff --git a/app/models/contest.rb b/app/models/contest.rb index edc252574..9a3268654 100644 --- a/app/models/contest.rb +++ b/app/models/contest.rb @@ -12,6 +12,7 @@ class Contest < ActiveRecord::Base has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy has_many :join_in_competitions, foreign_key: 'competition_id', :dependent => :destroy has_many :join_in_contests, class_name: 'JoinInCompetition', foreign_key: 'competition_id', :dependent => :destroy + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy @@ -24,7 +25,7 @@ class Contest < ActiveRecord::Base validates_length_of :description, :maximum => DESCRIPTION_LENGTH_LIMIT validates_presence_of :author_id, :name, :deadline validates_format_of :deadline, :with => /^[\d]{4}[-][\d]{1,2}[-][\d]{1,2}$/ - validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{2})|^(\d+).([0-9]{1})$/ + # validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{2})|^(\d+).([0-9]{1})$/ validate :validate_user after_create :act_as_activity diff --git a/app/models/issue.rb b/app/models/issue.rb index 43bc6537d..b69ac246c 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -45,7 +45,8 @@ class Issue < ActiveRecord::Base # added by fq has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy - # end + # end + has_many :praise_tread, as: :praise_tread_object, dependent: :destroy acts_as_nested_set :scope => 'root_id', :dependent => :destroy diff --git a/app/models/mailer.rb b/app/models/mailer.rb index aee837ac4..3db787525 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -446,7 +446,9 @@ class Mailer < ActionMailer::Base def self.deliver_mail(mail) return false if mail.to.blank? && mail.cc.blank? && mail.bcc.blank? - super + Thread.new do + super + end end def self.method_missing(method, *args, &block) diff --git a/app/models/praise_tread.rb b/app/models/praise_tread.rb index 901a31660..c27e1fc9f 100644 --- a/app/models/praise_tread.rb +++ b/app/models/praise_tread.rb @@ -1,4 +1,6 @@ class PraiseTread < ActiveRecord::Base attr_accessible :user_id,:praise_tread_object_id,:praise_tread_object_type,:praise_or_tread + belongs_to :user + belongs_to :praise_tread_object, polymorphic: true end diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 205ede48b..6782b2436 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -7,7 +7,7 @@ class Softapplication < ActiveRecord::Base has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy belongs_to :user - belongs_to :contest + has_many :contests, :through => :contesting_softapplications def add_jour(user, notes, reference_user_id = 0, options = {}) if options.count == 0 @@ -21,6 +21,13 @@ class Softapplication < ActiveRecord::Base def set_commit(commit) self.update_attribute(:commit, commit) end - + + def editable_by? usr + usr.admin? || self.user == usr + end + + def destroyable_by? usr + self.user == usr || usr.admin? + end end diff --git a/app/models/user.rb b/app/models/user.rb index 1809c3a98..20624888a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -96,7 +96,7 @@ class User < Principal has_many :students_for_courses 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_tpye = 'Project' or container_type = 'Version'" + 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 @@ -105,7 +105,7 @@ class User < Principal has_many :wiki_contents, :foreign_key => 'author_id' has_many :journals has_many :messages, :foreign_key => 'author_id' - has_one :user_socre, :dependent => :destroy + has_one :user_score, :dependent => :destroy # end ######added by nie diff --git a/app/views/contests/_list_softapplications.html.erb b/app/views/contests/_list_softapplications.html.erb index 29c985b7e..eb179718a 100644 --- a/app/views/contests/_list_softapplications.html.erb +++ b/app/views/contests/_list_softapplications.html.erb @@ -6,7 +6,7 @@ 应用软件: - <%= link_to(c_softapplication.softapplication.name, softapplication_path(c_softapplication.softapplication)) %> + <%= link_to(c_softapplication.softapplication.name, softapplication_path(c_softapplication.softapplication), :target => '_blank') %>
    diff --git a/app/views/contests/settings.html.erb b/app/views/contests/settings.html.erb index def1c7f5d..a2780f060 100644 --- a/app/views/contests/settings.html.erb +++ b/app/views/contests/settings.html.erb @@ -1,5 +1,9 @@ -

    <%=l(:label_settings)%>

    +

    + <%=l(:label_contest_settings)%>    + +

    + + diff --git a/app/views/layouts/_base_softapplication_top_content.html.erb b/app/views/layouts/_base_softapplication_top_content.html.erb new file mode 100644 index 000000000..064e84cf0 --- /dev/null +++ b/app/views/layouts/_base_softapplication_top_content.html.erb @@ -0,0 +1,20 @@ +
    + + + + + + + + + + + +
    创新竞赛社区<%= l(:label_user_location) %> :
    <%=link_to request.host()+"/contests", :controller=>'contests', :action=>'index' %><%=link_to l(:field_homepage), home_path %> > + <%=link_to l(:label_contest_innovate), :controller=>'contests', :action=>'index' %> > + + <% contest = @softapplication.contests.first %><%= contest ? link_to(contest.name, show_contest_contest_path(contest)) : '尚未加入竞赛'%> + + +
    +
    \ No newline at end of file diff --git a/app/views/layouts/base.html.erb b/app/views/layouts/base.html.erb index 17109b256..92bc93c3e 100644 --- a/app/views/layouts/base.html.erb +++ b/app/views/layouts/base.html.erb @@ -10,6 +10,7 @@ <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2', 'application', 'nyan', :media => 'all' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> <%= javascript_heads %> +<%= javascript_include_tag "jquery.leanModal.min" %> <%= javascript_include_tag 'seems_rateable/jRating', 'seems_rateable/rateable'%> <%= heads_for_theme %> <%= call_hook :view_layouts_base_html_head %> diff --git a/app/views/layouts/base_contest.html.erb b/app/views/layouts/base_contest.html.erb index b4ba3dd4b..2bda701fe 100644 --- a/app/views/layouts/base_contest.html.erb +++ b/app/views/layouts/base_contest.html.erb @@ -26,23 +26,23 @@
    - - - + + + - - + +
    创新竞赛社区<%= l(:label_user_location) %> : - - 创新竞赛社区<%= l(:label_user_location) %> : + +
    <%=link_to request.host()+"/contest", :controller => 'bids', :action => 'contest' %><%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'bids', :action => 'contest' %> > - <%= link_to @bid.name, bid_path %><%=link_to request.host()+"/contest", :controller => 'bids', :action => 'contest' %><%=link_to l(:field_homepage), home_path %> > <%=link_to l(:label_contest_innovate), :controller => 'bids', :action => 'contest' %> > + <%= link_to @bid.name, bid_path %>
    diff --git a/app/views/layouts/base_memos.html.erb b/app/views/layouts/base_memos.html.erb index 4b7f4b96d..b033a81cc 100644 --- a/app/views/layouts/base_memos.html.erb +++ b/app/views/layouts/base_memos.html.erb @@ -33,7 +33,7 @@ <%= l(:label_user_location) %> :