diff --git a/Gemfile b/Gemfile index a04059bfa..3784e60d8 100644 --- a/Gemfile +++ b/Gemfile @@ -19,6 +19,22 @@ gem 'acts-as-taggable-on' group :development do gem 'better_errors', path: 'lib/better_errors' gem 'rack-mini-profiler', path: 'lib/rack-mini-profiler' + if ENV['PRY'] + gem 'pry' + gem 'pry-nav' + end +end + +# Gems used only for assets and not required +# in production environments by default. +group :assets do + gem 'sass-rails', '~> 3.2.3' + gem 'coffee-rails', '~> 3.2.1' + + # See https://github.com/sstephenson/execjs#readme for more supported runtimes + # gem 'therubyracer', :platforms => :ruby + + gem 'uglifier', '>= 1.0.3' end # Optional gem for LDAP authentication diff --git a/Gemfile.lock b/Gemfile.lock index 25cc9f48f..6680070a7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -53,7 +53,16 @@ GEM arel (3.0.2) builder (3.0.0) coderay (1.0.9) + coffee-rails (3.2.2) + coffee-script (>= 2.2.0) + railties (~> 3.2.0) + coffee-script (2.2.0) + coffee-script-source + execjs + coffee-script-source (1.6.1) erubis (2.7.0) + execjs (1.4.0) + multi_json (~> 1.0) fastercsv (1.5.0) hike (1.2.3) i18n (0.6.1) @@ -99,6 +108,11 @@ GEM rdoc (3.12.2) json (~> 1.4) ruby-openid (2.1.8) + sass (3.2.7) + sass-rails (3.2.6) + railties (~> 3.2.0) + sass (>= 3.1.10) + tilt (~> 1.3) sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) @@ -110,6 +124,9 @@ GEM polyglot polyglot (>= 0.3.1) tzinfo (0.3.37) + uglifier (1.0.3) + execjs (>= 0.3.0) + multi_json (>= 1.0.2) PLATFORMS x86-mingw32 @@ -121,6 +138,7 @@ DEPENDENCIES better_errors! builder (= 3.0.0) coderay (~> 1.0.6) + coffee-rails (~> 3.2.1) fastercsv (~> 1.5.0) i18n (~> 0.6.0) jquery-rails (~> 2.0.2) @@ -130,4 +148,6 @@ DEPENDENCIES rack-openid rails (= 3.2.13) ruby-openid (~> 2.1.4) + sass-rails (~> 3.2.3) seems_rateable! + uglifier (>= 1.0.3) diff --git a/ReadMe.txt b/ReadMe.txt index e7444a6c5..9d223259a 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,11 +1,18 @@ patch: -用户姓名的部分,根据issues#655。 -为了修改方便 -alias: -方法 之前显示 调整之后 +鐢ㄦ埛濮撳悕鐨勯儴鍒嗭紝鏍规嵁issues#655銆 +涓轰簡淇敼鏂逛究 +alias锛 +鏂规硶 涔嬪墠鏄剧ず 璋冩暣涔嬪悗 name firstname+lastname login nickname xxx login realname xxx firstname+lastname + +User model缁忚繃淇敼锛屽凡缁忓畬鍏ㄩ泦鎴愪簡user_extensions鐨勫姛鑳 +渚嬪 +user.gender=1 +user.save +user_extensions瀛楁浼氳嚜鍔ㄤ繚瀛 +涓嶅繀瑕佹瘡娆ser.user_extensions.xxx浠ュ強鍒ゆ柇鏄惁涓虹┖ ================================================================================ app/models/setting.rb :165 # fixed domain url in development. tantantan's bug @@ -14,22 +21,22 @@ app/models/setting.rb :165 define_singleton_method m do; nil; end if m.to_s =~ /([a-zA-Z]+_domain)$/ end end - 程序部分链接中制定了subdomain参数,使链接在二级域名中来回跳转。 - 为了开发方便,使之功能在development模式下失效。 + 绋嬪簭閮ㄥ垎閾炬帴涓埗瀹氫簡subdomain鍙傛暟锛屼娇閾炬帴鍦ㄤ簩绾у煙鍚嶄腑鏉ュ洖璺宠浆銆 + 涓轰簡寮鍙戞柟渚匡紝浣夸箣鍔熻兘鍦╠evelopment妯″紡涓嬪け鏁堛 # => nyan ================================================================================ app/controller/projects_controller.rb ===> projects#fake - fake filter: 修改了传到页面中的Count后缀的数量 - 改为正确的数量,删掉fake过滤器即可 + fake filter: 淇敼浜嗕紶鍒伴〉闈腑鐨凜ount鍚庣紑鐨勬暟閲 + 鏀逛负姝g‘鐨勬暟閲忥紝鍒犳帀fake杩囨护鍣ㄥ嵆鍙 ================================================================================ -#导航栏匹配域名显示和改变 +#瀵艰埅鏍忓尮閰嶅煙鍚嶆樉绀哄拰鏀瑰彉 app\helper\application_helper.rb # rewrite navigation app\views\layouts\_base_header.html.erb # reset navigation by domain name and url through regular match ================================================================================ -#首页根据域名匹配进入不同的页面 +#棣栭〉鏍规嵁鍩熷悕鍖归厤杩涘叆涓嶅悓鐨勯〉闈 app\controller\welcome_controller.rb def entry_select_user if request.original_url.match(/user\.trustie\.net/) diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb index d63f0cfbb..87b0d8dcf 100644 --- a/app/controllers/bids_controller.rb +++ b/app/controllers/bids_controller.rb @@ -881,6 +881,7 @@ class BidsController < ApplicationController def memberAccess # 鏄绋嬶紝鍒欏垽鏂綋鍓嶇敤鎴锋槸鍚﹀弬鍔犱簡璇剧▼ + return true if current_user.admin? return 0 if @bid.courses.first.project_type == Project::ProjectType_project currentUser = User.current render_403 unless currentUser.member_of?(@bid.courses.first) diff --git a/app/controllers/contests_controller.rb b/app/controllers/contests_controller.rb index e7490f5b0..b51a11436 100644 --- a/app/controllers/contests_controller.rb +++ b/app/controllers/contests_controller.rb @@ -5,7 +5,8 @@ class ContestsController < ApplicationController menu_item :project, :only => :show_project menu_item :application, :only => :show_softapplication menu_item :attendingcontest, :only => :show_attendingcontest - before_filter :find_contest, :only => [:show_contest, :show_project, :show_softapplication, :show_attendingcontest, :set_reward_project, :set_reward_softapplication, :create,:destroy,:more,:back,:add,:add_softapplication,:new,:show_results, :set_reward, + menu_item :contestnotification, :only => :show_notification + before_filter :find_contest, :only => [:show_contest, :show_project, :show_softapplication, :show_attendingcontest, :show_notification, :set_reward_project, :set_reward_softapplication, :create,:destroy,:more,:back,:add,:add_softapplication,:new,:show_results, :set_reward, :show_contest_project, :show_contest_user, :join_in_contest, :unjoin_in_contest, :new_join,:show_participator, :settings] # added by fq @@ -355,6 +356,17 @@ class ContestsController < ApplicationController end ###end + +def show_notification + @contest = Contest.find_by_id(params[:id]) + respond_to do |format| + format.html { + render :layout => 'base_newcontest' + } + format.api + end +end + def set_reward_project @c_p = nil diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 5b81b7291..ed6f9937d 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -70,7 +70,7 @@ class FilesController < ApplicationController Mailer.attachments_added(attachments[:files]).deliver end - # 涓存椂鐢 + # TODO: 涓存椂鐢 nyan sort_init 'created_on', 'desc' sort_update 'created_on' => "#{Attachment.table_name}.created_on", 'filename' => "#{Attachment.table_name}.filename", diff --git a/app/controllers/open_source_projects_controller.rb b/app/controllers/open_source_projects_controller.rb index 1ca7ddcef..ee3af10ce 100644 --- a/app/controllers/open_source_projects_controller.rb +++ b/app/controllers/open_source_projects_controller.rb @@ -1,8 +1,8 @@ class OpenSourceProjectsController < ApplicationController - + before_filter :find_osp, :only => [:master_apply, :accept_master_apply, :refuse_master_apply] before_filter :require_master, :only => [:master_apply, :accept_master_apply, :refuse_master_apply] - + helper :sort include SortHelper helper :apply_project_masters @@ -12,6 +12,7 @@ class OpenSourceProjectsController < ApplicationController # GET /open_source_projects # GET /open_source_projects.json def index + @app_dir = params[:app_dir] @language = params[:language] @created_at = params[:created_at] @@ -22,8 +23,10 @@ class OpenSourceProjectsController < ApplicationController @os_project_count = @open_source_projects.count @os_project_pages = Paginator.new @os_project_count, per_page_option, params['page'] - + @open_source_projects = @open_source_projects.offset(@os_project_pages.offset).limit(@os_project_pages.per_page) + + @bugs = BugToOsp.order('created_at desc').limit(8) # @open_source_projects = OpenSourceProject.all @@ -32,11 +35,11 @@ class OpenSourceProjectsController < ApplicationController format.json { render json: @open_source_projects } end end - + def master_apply @apply = @open_source_project.apply_tips @applicants = @open_source_project.applicants - + respond_to do |format| format.html { render :layout => "base_opensource_p" @@ -49,7 +52,7 @@ class OpenSourceProjectsController < ApplicationController # GET /open_source_projects/1.json def show @open_source_project = OpenSourceProject.find(params[:id]) - + sort_init 'updated_at', 'desc' sort_update 'created_at' => "#{RelativeMemo.table_name}.created_at", 'replies' => "#{RelativeMemo.table_name}.replies_count", @@ -63,9 +66,9 @@ class OpenSourceProjectsController < ApplicationController includes(:last_reply). limit(@topic_pages.per_page). offset(@topic_pages.offset). - order(sort_clause). + order(sort_clause). all - + @bugs = @open_source_project.bugs.limit(6) respond_to do |format| @@ -75,26 +78,36 @@ class OpenSourceProjectsController < ApplicationController format.json { render json: @open_source_project } end end - - -def search + + def allbug + @bugs = BugToOsp.visible + @bug_count = @bugs.count + @bug_pages = Paginator.new @bug_count, per_page_option, params['page'] + @bugs = @bugs.includes(:bug).reorder("#{RelativeMemo.table_name}.created_at DESC").limit(@bug_pages.per_page).offset(@bug_pages.offset).all + + respond_to do |format| + format.html + format.json { render json: @open_source_project } + end end + def search -# added by yiang 鏆村姏娣诲姞,璇风粫閬 -def showmemo - @open_source_project = OpenSourceProject.find(params[:id]) + end - sort_init 'updated_at', 'desc' - sort_update 'created_at' => "#{RelativeMemo.table_name}.created_at", + def showbug + @open_source_project = OpenSourceProject.find(params[:id]) + + sort_init 'updated_at', 'desc' + sort_update 'created_at' => "#{RelativeMemo.table_name}.created_at", 'replies' => "#{RelativeMemo.table_name}.replies_count", 'updated_at' => "COALESCE (last_replies_relative_memos.created_at, #{RelativeMemo.table_name}.created_at)" - @memo = RelativeMemo.new(:open_source_project => @open_source_project) - @topic_count = @open_source_project.topics.count - @topic_pages = Paginator.new @topic_count, per_page_option, params['page'] - @memos = @open_source_project.topics. + @memo = RelativeMemo.new(:open_source_project => @open_source_project) + @topic_count = @open_source_project.bugs.count + @topic_pages = Paginator.new @topic_count, per_page_option, params['page'] + @memos = @open_source_project.bugs. reorder("#{RelativeMemo.table_name}.sticky DESC"). includes(:last_reply). limit(@topic_pages.per_page). @@ -102,13 +115,42 @@ def showmemo order(sort_clause). all - respond_to do |format| - format.html { - render :layout => "base_opensource_p" - } - format.json { render json: @open_source_project } + respond_to do |format| + format.html { + render :layout => "base_opensource_p" + } + format.json { render json: @open_source_project } + end end -end + + # added by yiang 鏆村姏娣诲姞,璇风粫閬 + def showmemo + @open_source_project = OpenSourceProject.find(params[:id]) + + sort_init 'updated_at', 'desc' + sort_update 'created_at' => "#{RelativeMemo.table_name}.created_at", + 'replies' => "#{RelativeMemo.table_name}.replies_count", + 'updated_at' => "COALESCE (last_replies_relative_memos.created_at, #{RelativeMemo.table_name}.created_at)" + + @memo = RelativeMemo.new(:open_source_project => @open_source_project) + @topic_count = @open_source_project.topics.count + @topic_pages = Paginator.new @topic_count, per_page_option, params['page'] + @memos = @open_source_project.topics. + reorder("#{RelativeMemo.table_name}.sticky DESC"). + includes(:last_reply). + limit(@topic_pages.per_page). + offset(@topic_pages.offset). + order(sort_clause). + all + + respond_to do |format| + format.html { + render :layout => "base_opensource_p" + } + format.json { render json: @open_source_project } + end + end + # GET /open_source_projects/new # GET /open_source_projects/new.json def new @@ -168,52 +210,51 @@ end format.json { head :no_content } end end - + def remove_condition @app_dir = params[:app_dir] @language = params[:language] @created_at = params[:created_at] redirect_to open_source_projects_path(:app_dir => @app_dir, :language => @language, :created_at => @created_at, :name => params[:name]) end - + def search # per_page_option = 10 -# + # # @open_source_projects = OpenSourceProject.filter(@app_dir, @language, @created_at) # @open_source_projects = @open_source_projects.like(params[:name]) if params[:name].present? -# + # # @os_project_count = @open_source_projects.count # @os_project_pages = Paginator.new @os_project_count, per_page_option, params['page'] -# + # # @open_source_projects = @open_source_projects.offset(@os_project_pages.offset).limit(@os_project_pages.per_page) redirect_to open_source_projects_path(:name => params[:name]) end - + def refuse_master_apply @apply = ApplyProjectMaster.where("user_id = ? and apply_id = ? and apply_type = 'OpenSourceProject'", params[:user_id], @open_source_project.id) @apply.first.destory - + redirect_to master_apply_open_source_project_path end - + def accept_master_apply @apply = ApplyProjectMaster.where("user_id = ? and apply_id = ? and apply_type = 'OpenSourceProject'", params[:user_id], @open_source_project.id) if @apply.count == 1 - @apply.first.update_attributes(:status => 2) + @apply.first.update_attributes(:status => 2) end - + redirect_to master_apply_open_source_project_path end - - + private - + def require_master render_403 unless @open_source_project.admin?(User.current) end - + def find_osp @open_source_project = OpenSourceProject.find(params[:id]) render_404 unless @open_source_project.present? diff --git a/app/controllers/softapplications_controller.rb b/app/controllers/softapplications_controller.rb index 31675ca5d..b8d81b108 100644 --- a/app/controllers/softapplications_controller.rb +++ b/app/controllers/softapplications_controller.rb @@ -47,7 +47,7 @@ class SoftapplicationsController < ApplicationController def show @softapplication = Softapplication.find(params[:id]) - @project = Project.find_by_identifier(@softapplication.deposit_project) + @project = @softapplication.project # 鎵撳垎缁熻 stars_reates = @softapplication. rates(:quality) @@ -142,13 +142,16 @@ class SoftapplicationsController < ApplicationController def create @softapplication = Softapplication.new(params[:softapplication]) @softapplication.user = User.current - @softapplication.deposit_project = params[:project] + #@softapplication.deposit_project = params[:project] + @softapplication.project = Project.find_by_id(params[:project]) @softapplication.save_attachments(params[:attachments]) respond_to do |format| if @softapplication.save ContestingSoftapplication.create(:contest_id => params[:contest_id], :softapplication_id => @softapplication.id) + #ProjectingSoftapplication.create_softapplication_projecting(:project_id => params[:project_id], :softapplication_id => @softapplication.id) + #ProjectingSoftapplication.create_softapplication_projecting(@project.id, softapplication.id) format.html { redirect_to show_attendingcontest_contest_path(:id => params[:contest_id]), notice: l(:notice_attendingcontest_work_successfully_created) } # format.json { render json: @softapplication, status: :created, location: @softapplication } else @@ -170,7 +173,8 @@ class SoftapplicationsController < ApplicationController # @softapplication = Softapplication.find(params[:id]) @softapplication.attachments.map{|attach| attach.destroy } @softapplication.save_attachments(params[:attachments]) - @softapplication.deposit_project = params[:project] + #@softapplication.deposit_project = params[:project] + @softapplication.project = Project.find_by_id(params[:project]) respond_to do |format| if @softapplication.update_attributes(params[:softapplication]) format.html { redirect_to @softapplication, notice: l(:notice_softapplication_was_successfully_updated) } diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index c662c44f7..c92f39d34 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -21,13 +21,7 @@ class WelcomeController < ApplicationController before_filter :entry_select_course, :entry_select_contest, :entry_select_user, :only => [:index] def index - projectActive = Project.project_entities.active - @projectCount = projectActive.count - @projectPublicCount = projectActive.all_public.count - @projectHidenCount = @projectCount - @projectPublicCount - @developerCount = User.developer.count - @allUsercount = User.count end def robots @@ -36,10 +30,7 @@ class WelcomeController < ApplicationController end def course - @courseCount = Project.course_entities.count - @teacherCount = User.teacher.count - @studentCount = User.student.count - @logoLink = logolink() + @logoLink ||= logolink() end @@ -121,25 +112,25 @@ class WelcomeController < ApplicationController end end - def render(*args) - _fake if @fake_filter - super - end + # def render(*args) + # _fake if @fake_filter + # super + # end - private + # private - def fake - @fake_filter = true - end + # def fake + # @fake_filter = true + # end - # 楠楀瓙鏂规硶 - def _fake - instance_variables.map { |variable| - if variable.to_s =~ /Count$/ - self.instance_variable_set(variable.to_sym, - ("1" + (self.instance_variable_get(variable.to_sym).to_s)).to_i) - end - } - end + # # 楠楀瓙鏂规硶 + # def _fake + # instance_variables.map { |variable| + # if variable.to_s =~ /Count$/ + # self.instance_variable_set(variable.to_sym, + # ("1" + (self.instance_variable_get(variable.to_sym).to_s)).to_i) + # end + # } + # end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7dc4b5556..7bfe95123 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -750,7 +750,7 @@ module ApplicationHelper tmp = Hash.new tmp={"" => ""} option.each do |project| - tmp[project.name] = project.identifier + tmp[project.name] = project.id end tmp end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 23351d919..5e7f7c18c 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -59,12 +59,11 @@ module IssuesHelper def issue_heading(issue) #h("#{issue.tracker} ##{issue.id}") - #h("#{issue.tracker} #{issue.source_from}") + # h("#{issue.tracker} #{issue.source_from}") s = '' - s << ">>" - s << link_to(@issue.project.name+l(:issue_list), project_issues_path(@issue.project)) - s << " >" - s << @issue.source_from + s << link_to(@issue.project.name, project_issues_path(@issue.project)) + s << " > #" + s << @issue.project_index s.html_safe end diff --git a/app/helpers/journals_helper.rb b/app/helpers/journals_helper.rb index 480524457..26b4c13b9 100644 --- a/app/helpers/journals_helper.rb +++ b/app/helpers/journals_helper.rb @@ -18,7 +18,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. module JournalsHelper - def render_notes(issue, journal, options={}) + def render_links(issue, journal, options={}) content = '' editable = User.current.logged? && (User.current.allowed_to?(:edit_issue_notes, issue.project) || (journal.user == User.current && User.current.allowed_to?(:edit_own_issue_notes, issue.project))) destroyable = User.current.logged? && ((journal.user == User.current) || (issue.author_id == User.current.id) || (User.current.admin == 1)) @@ -38,7 +38,35 @@ module JournalsHelper :title => l(:button_delete)) end end - content << content_tag('div', links.join(' ').html_safe, :class => 'contextual', :style => 'margin-top:-25px;') unless links.empty? + content << content_tag('div', links.join(' ').html_safe, :class => 'contextual') unless links.empty? + #content << textilizable(journal, :notes) + #css_classes = "wiki" + #css_classes << " editable" if editable + #content_tag('div', content.html_safe, :id => "journal-#{journal.id}-notes", :class => css_classes) + content.html_safe + end + + def render_notes (issue, journal, options={}) + content = '' + editable = User.current.logged? && (User.current.allowed_to?(:edit_issue_notes, issue.project) || (journal.user == User.current && User.current.allowed_to?(:edit_own_issue_notes, issue.project))) + destroyable = User.current.logged? && ((journal.user == User.current) || (issue.author_id == User.current.id) || (User.current.admin == 1)) + links = [] + if !journal.notes.blank? + links << link_to(l(:button_quote), + {:controller => 'journals', :action => 'new', :id => issue.id, :journal_id => journal}, + :remote => true, + :method => 'post', + :title => l(:button_quote)) if options[:reply_links] + links << link_to_in_place_notes_editor(l(:button_edit), "journal-#{journal.id}-notes", + { :controller => 'journals', :action => 'edit', :id => journal, :format => 'js' }, + :title => l(:button_edit)) if editable + #Added by young + if destroyable + links << link_to(l(:button_delete), { :controller => 'journals', :action => 'destroy', :id => journal, :format => 'js' }, + :title => l(:button_delete)) + end + end + #content << content_tag('div', links.join(' ').html_safe, :class => 'contextual', :style => 'margin-top:-25px;') unless links.empty? content << textilizable(journal, :notes) css_classes = "wiki" css_classes << " editable" if editable diff --git a/app/helpers/open_source_projects_helper.rb b/app/helpers/open_source_projects_helper.rb index f1c1cd35e..dfc7cc8d0 100644 --- a/app/helpers/open_source_projects_helper.rb +++ b/app/helpers/open_source_projects_helper.rb @@ -46,4 +46,12 @@ module OpenSourceProjectsHelper end description end + + def show_description_of_bug(bug) + description = bug.description + if description.nil? || description == '' + description = bug.open_source_project.name + l(:label_bug) + end + description + end end diff --git a/app/models/bug_to_osp.rb b/app/models/bug_to_osp.rb index 5471bd3f9..9cd1d7359 100644 --- a/app/models/bug_to_osp.rb +++ b/app/models/bug_to_osp.rb @@ -5,4 +5,8 @@ class BugToOsp < ActiveRecord::Base validates_presence_of :osp_id, :relative_memo_id + scope :visible, lambda {|*args| + nil + } + end diff --git a/app/models/issue.rb b/app/models/issue.rb index d2332350a..7e899eafc 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -1156,7 +1156,11 @@ class Issue < ActiveRecord::Base # back string obj which is belong to project. def source_from "" << self.project.name.to_s << - "#" << (self.project.issues.index(self).to_i + 1).to_s + "#" << project_index + end + + def project_index + (self.project.issues.index(self).to_i + 1).to_s end private diff --git a/app/models/mailer.rb b/app/models/mailer.rb index e0ad54296..bb7a2424f 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -57,12 +57,16 @@ class Mailer < ActionMailer::Base #濡傛灉鏄洿鎺ョ暀瑷骞朵笖鐣欒█瀵硅薄鏄疨roject骞朵笖Project绫诲瀷鏄绋 if !journals_for_message.at_user && journals_for_message.jour.class.to_s.to_sym == :Project && journals_for_message.jour.project_type == 1 project = journals_for_message.jour + @author = journals_for_message.user #璇剧▼鐨勬暀甯 @teachers = searchTeacherAndAssistant journals_for_message.jour #鏀朵欢浜洪偖绠 @recipients ||= [] @teachers.each do |teacher| - @recipients << teacher.user.mail + if teacher.user.notify_about? journals_for_message + @recipients << teacher.user.mail + end + end mail :to => @recipients, :subject => "#{l(:label_your_course)}#{journals_for_message.jour.name}#{l(:label_have_message)} " @@ -440,10 +444,7 @@ class Mailer < ActionMailer::Base headers[:to].delete(@author.mail) if headers[:to].is_a?(Array) headers[:cc].delete(@author.mail) if headers[:cc].is_a?(Array) end - if !User.current.nil? - #涓嶇粰鏈汉鍙戦偖浠 - headers[:to].delete(User.current.mail) if headers[:to].is_a?(Array) - end + if @author && @author.logged? redmine_headers 'Sender' => @author.login end diff --git a/app/models/relative_memo.rb b/app/models/relative_memo.rb index 073d1ca12..f087fce2b 100644 --- a/app/models/relative_memo.rb +++ b/app/models/relative_memo.rb @@ -70,6 +70,11 @@ class RelativeMemo < ActiveRecord::Base def cannot_reply_to_locked_topic errors.add :base, l(:label_memo_locked) if root.locked? && self != root end + + def short_content(length = 25) + str = "^(.{,#{length}})[^\n\r]*.*$" + content.gsub(Regexp.new(str), '\1...').strip if content + end # def update_memos_forum # if forum_id_changed? diff --git a/app/models/softapplication.rb b/app/models/softapplication.rb index 5e1e1bd50..f7eed43fc 100644 --- a/app/models/softapplication.rb +++ b/app/models/softapplication.rb @@ -6,10 +6,11 @@ class Softapplication < ActiveRecord::Base has_many :journals_for_messages, :as => :jour, :dependent => :destroy has_many :contesting_softapplications, :dependent => :destroy - has_many :projecting_softapplications, :dependent => :destroy + #has_many :projecting_softapplications, :dependent => :destroy belongs_to :user belongs_to :project has_many :contests, :through => :contesting_softapplications + belongs_to :project def add_jour(user, notes, reference_user_id = 0, options = {}) if options.count == 0 diff --git a/app/models/user.rb b/app/models/user.rb index edf703873..ddf40a827 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -199,6 +199,53 @@ class User < Principal end } + + # ====================================================================== + # 闆嗕腑澶勭悊 User 鎵╁睍琛ㄤ负绌虹殑闂 + validate :valid_user_extensions + before_save :save_user_extensions + + def extensions + self.user_extensions ||= self.create_user_extensions + end + + def respond_to?(m, include_private = false) + flag = extensions.respond_to? m.to_sym + if flag + flag + else + super + end + end + + def method_missing m, *args, &block + if extensions.respond_to? m.to_sym + self.class.send :define_method, m.to_sym, *args do + self.extensions.__send__ m.to_sym, *args + end + __send__ m.to_sym, *args, &block + + else + super + end + end + + def valid_user_extensions + if !self.extensions.valid? + self.extensions.errors.messages.each do |key, values| + values.each do |value| + self.errors.add key, value + end + end + end + end + + def save_user_extensions + self.extensions.save + end + # 闆嗕腑澶勭悊 User 鎵╁睍琛ㄤ负绌虹殑闂 < end + # ====================================================================== + #閫夋嫨椤圭洰鎴愬憳鏃舵樉绀虹殑鐢ㄦ埛淇℃伅鏂囧瓧 def userInfo info=self.nickname + ' (' + self.realname + ')'; @@ -645,6 +692,7 @@ class User < Principal end end + # Return true if the user is allowed to do the specified action on a specific context # Action can be: # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') @@ -748,10 +796,39 @@ class User < Principal when News # always send to project members except when mail_notification is set to 'none' true + #鍒ゅ畾鐢ㄦ埛鏄惁鎺ュ彈鐣欒█鎻愰啋閭欢 + when JournalsForMessage + ##濡傛灉鏄洿鎺ョ暀瑷骞朵笖鐣欒█瀵硅薄鏄疨roject骞朵笖Project绫诲瀷鏄绋嬶紙璇剧▼鐣欒█锛 + if !object.at_user && object.jour.class.to_s.to_sym == :Project && object.jour.project_type == 1 + #鏍规嵁鐢ㄦ埛璁剧疆閭欢鎺ユ敹妯″紡鍒ゅ畾褰撳墠鐢ㄦ埛鏄惁鎺ュ彈閭欢鎻愰啋 + is_notified_project object.jour + end + end end end + #鐢ㄦ埛鏄惁鎺ユ敹project鐨勬秷鎭彁閱 + def is_notified_project arg + if arg.is_a?(Project) + case mail_notification + when 'selected' + notified_projects_ids.include?(arg.id) + when 'only_my_events' + projects.include?(arg) + when 'only_assigned' + false + when 'only_owner' + course = Course.find_by_extra(arg.identifier) + course.teacher == self + end + #鍕鹃夌殑椤圭洰鎴栫敤鎴风殑椤圭洰 TODO锛氶渶鏀 + #notified_projects_ids.include?(arg) || projects.include?(arg) + else + false + end + end + def self.current=(user) Thread.current[:current_user] = user end diff --git a/app/views/contests/_list_softapplications.html.erb b/app/views/contests/_list_softapplications.html.erb index 9b99b675c..89e8a3172 100644 --- a/app/views/contests/_list_softapplications.html.erb +++ b/app/views/contests/_list_softapplications.html.erb @@ -4,7 +4,7 @@
- <%= render :partial => 'attachments/form' %> -
- 1銆<%= l(:label_upload_softapplication_packets_mustpacketed)%> - - 2銆<%= l(:label_upload_softapplication_photo_condition)%> -
+ <%= render :partial => 'attachments/form' %> +
+ 1銆<%= l(:label_upload_softapplication_packets_mustpacketed) %> + + 2銆<%= l(:label_upload_softapplication_photo_condition) %> +
+ <%= l(:label_no_data) %> +
<%= f.text_field :subject, :required => true%>
<%= f.text_area :content, :required => true, :id => 'editor02' %>
+ <%#= l(:label_attachment_plural) %> + <%#= render :partial => 'attachments/form', :locals => {:container => @memo} %> +
<% r.each do |role| %> - <%= check_box_tag 'membership[role_ids][]', role.id, member.roles.include?(role), - :disabled => member.member_roles.detect {|mr| mr.role_id == role.id && !mr.inherited_from.nil?} %> <%=h role %> - <% end %>
<%= submit_tag l(:button_change), :class => "small" %> - <%= link_to_function l(:button_cancel), - "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;" - %>
+ <% roles.each do |role| %> + <%= check_box_tag 'membership[role_ids][]', role.id, member.roles.include?(role), + :disabled => member.member_roles.detect { |mr| mr.role_id == role.id && !mr.inherited_from.nil? } %> <%= h role %> + <% end %>
<%= submit_tag l(:button_change), :class => "small" %> + <%= link_to_function l(:button_cancel), + "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;" + %>
<%= l(:label_no_data) %>
<%= l(:label_role_plural) %>: - <% r.each do |role| %> + <% roles.each do |role| %> <%= check_box_tag 'membership[role_ids][]', role.id %> <%= h role %> <% end %>
<%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %>
<%= l(:label_role_plural) %>: - <% r.each do |role| %> - - <%= check_box_tag 'membership[role_ids][]', role.id %> <%=h role %> - <% end %>
<%= l(:label_role_plural) %>: + <% roles.each do |role| %> -
<%= submit_tag l(:button_add), :id => 'member-add-submit' %>
<%= render :partial => 'attachments/form' %> diff --git a/app/views/softapplications/index.html.erb b/app/views/softapplications/index.html.erb index 841a8a207..5b355f65c 100644 --- a/app/views/softapplications/index.html.erb +++ b/app/views/softapplications/index.html.erb @@ -16,13 +16,13 @@
鎵灞炵珵璧涳細<%= contest ? link_to(contest.name.truncate(14, omission: '...'), show_attendingcontest_contest_path(contest), title: contest.name.to_s ) : '灏氭湭鍔犲叆绔炶禌'%>
鎵灞炵被鍒細<%= softapplication.app_type_name.truncate(10, omission: '...') %>
绯荤粺鏀寔锛<%= softapplication.android_min_version_available %>
<%=l(:label_attendingcontestwork_belongs_contest)%>锛<%= contest ? link_to(contest.name.truncate(14, omission: '...'), show_attendingcontest_contest_path(contest), title: contest.name.to_s ) : '灏氭湭鍔犲叆绔炶禌'%>
<%=l(:label_attendingcontestwork_belongs_type)%>锛<%= softapplication.app_type_name.truncate(10, omission: '...') %>
<%=l(:label_attendingcontestwork_adaptive_system)%>锛<%= softapplication.android_min_version_available %>