diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb index b44c2ba51..a6fa6ed8c 100644 --- a/app/controllers/bids_controller.rb +++ b/app/controllers/bids_controller.rb @@ -8,7 +8,10 @@ class BidsController < ApplicationController menu_item :homework_statistics, :only => :homework_statistics #Ended by young before_filter :find_bid, :only => [:show, :show_project, :create,:destroy,:more,:back,:add,:new,:show_results,:set_reward, :add_homework, :fork, :create_fork, - :show_course, :show_bid_project, :show_bid_user] + :show_course, :show_bid_project, :show_bid_user, :join_in_contest, :unjoin_in_contest, :new_join,:show_participator] + # added by fq + before_filter :require_login, :only => [:join_in_contest, :unjoin_in_contest] + # end before_filter :require_login,:only => [:set_reward, :destroy, :add, :new, ] helper :watchers @@ -209,6 +212,48 @@ class BidsController < ApplicationController end end + + def join_in_contest + if @bid.reward_type == 2 && params[:course_password] == @bid.password + JoinInContest.create(:user_id => User.current.id, :bid_id => @bid.id) + @state = 0 + else + @state = 1 + end + + respond_to do |format| + # format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} + # TO_DO + format.js { render :partial => 'set_join', :locals => {:user => User.current, :object_id => params[:id]} } + end + end + + def unjoin_in_contest + + joined = JoinInContest.where('bid_id = ? and user_id = ?', @bid.id, User.current.id) + + joined.each do |join| + join.delete + end + + respond_to do |format| + # format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} + format.js { render :partial => 'set_join', :locals => {:user => User.current, :object_id => params[:id]} } + end + end + + def new_join + # added by fq + + + end + + # added by bai + def show_participator + render :layout => 'base_contest' + + end + #end def show_course bids = Bid.where('parent_id = ?', @bid.id) @@ -338,13 +383,13 @@ class BidsController < ApplicationController @homework = HomeworkAttach.new @homework_list = @bid.homeworks if params[:student_id].present? - @temp = [] - @homework_list.each do |pro| - if /#{params[:student_id]}/ =~ pro.user.user_extensions.student_id - @temp << pro - end - @temp - end + @temp = [] + @homework_list.each do |pro| + if /#{params[:student_id]}/ =~ pro.user.user_extensions.student_id + @temp << pro + end + @temp + end @homework_list = @temp end end @@ -536,6 +581,7 @@ class BidsController < ApplicationController @bid.reward_type = 2 @bid.budget = params[:bid][:budget] @bid.deadline = params[:bid][:deadline] + @bid.password = params[:bid][:password] #added by bai @bid.author_id = User.current.id @bid.commit = 0 if @bid.save diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb index 2d1d0bba7..dc4ccbc67 100644 --- a/app/controllers/boards_controller.rb +++ b/app/controllers/boards_controller.rb @@ -30,13 +30,15 @@ class BoardsController < ApplicationController def index @boards = @project.boards.includes(:last_message => :author).all # show the board if there is only one + unless @project.project_type == 1 if @boards.size == 1 @board = @boards.first show end + end if @project.project_type == 1 - render :layout => 'base_courses' - else + render :layout => 'base_courses' + else render :layout => false if request.xhr? end end @@ -85,12 +87,10 @@ class BoardsController < ApplicationController end end - def create + def create @board = @project.boards.build @board.safe_attributes = params[:board] - if @project.project_type == 1 - render :layout => 'base_courses' - end + if @board.save flash[:notice] = l(:notice_successful_create) #Modified by young diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8956a95cc..0d2b44b1b 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1393,7 +1393,7 @@ module ApplicationHelper html << (content_tag "span", l(:label_no_current_fans)) end for user in obj.watcher_users - html << (link_to image_tag(url_to_avatar(user), :class => "avatar"), user_path(user), :class => "avatar", :title => "#{user.name}") + html << (link_to image_tag(url_to_avatar(user), :class => "avatar"), user_path(user), :class => "avatar", :title => "#{user.show_name}") count = count + 1 if count >= 12 break @@ -1401,7 +1401,33 @@ module ApplicationHelper end html.html_safe end + + # added by bai + def show_more_participate?(obj) + if obj.join_in_contests.count > 12 + return true + else + return false + end + end + + def show_participate_picture(obj) + html = '' + count = 0 + if obj.join_in_contests.count == 0 + html << (content_tag "span", l(:label_no_current_participate)) + end + for temp in obj.join_in_contests + html << (link_to image_tag(url_to_avatar(temp.user), :class => "avatar"), user_path(temp.user), :class => "avatar", :title => "#{temp.user.show_name}") + count = count + 1 + if count >= 12 + break + end + end + html.html_safe + end #end + # add by huang def show_watcher_list(user) html = '' diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb index 2fdb4fd1c..e05ef6ebd 100644 --- a/app/helpers/watchers_helper.rb +++ b/app/helpers/watchers_helper.rb @@ -56,9 +56,9 @@ module WatchersHelper url_f = try_join_path(:object_id => course.id) method = joined ? 'delete' : 'post' if joined - link_to text, url_t, :remote => true, :method => method, :id => 'join', :confirm => l(:text_are_you_sure_out), :class => []+options + link_to text, url_t, :remote => true, :method => method, :id => "#{course.id}", :confirm => l(:text_are_you_sure_out), :class => []+options else - link_to text, url_f, :remote => true, :method => method, :id => 'join', :class => []+options + link_to text, url_f, :remote => true, :method => method, :id => "#{course.id}", :class => []+options end end @@ -76,6 +76,25 @@ module WatchersHelper end end + #added by bai + def join_in_contest(bid, user, options=[]) + if bid.reward_type == 2 + return '' unless user && user.logged? + joined = user.join_in_contest?(bid) + text = joined ? l(:label_exit_contest) : l(:label_join_contest) + url_t = join_in_contest_path(:id => bid.id) + url_f = try_join_in_contest_path(:id => bid.id) + # url = join_in_contest_path(:id => bid.id) + method = joined ? 'delete' : 'post' + if joined + link_to text, url_t, :remote => true, :method => method, :id => "#{bid.id}", :confirm => l(:text_are_you_sure_out), :class => []+options + else + link_to text, url_f, :remote => true, :method => method, :id => "#{bid.id}", :class => []+options + end + end + end + + # Returns the css class used to identify watch links for a given +object+ def watcher_css(objects) objects = Array.wrap(objects) diff --git a/app/models/bid.rb b/app/models/bid.rb index 3bad65f3c..bb7868ef8 100644 --- a/app/models/bid.rb +++ b/app/models/bid.rb @@ -1,6 +1,6 @@ ####by fq class Bid < ActiveRecord::Base - attr_accessible :author_id, :budget, :deadline, :name, :description, :homework_type + attr_accessible :author_id, :budget, :deadline, :name, :description, :homework_type, :password include Redmine::SafeAttributes belongs_to :author, :class_name => 'User', :foreign_key => :author_id @@ -13,6 +13,7 @@ class Bid < ActiveRecord::Base has_many :homework_for_courses, :dependent => :destroy 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 :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}" @@ -63,7 +64,8 @@ class Bid < ActiveRecord::Base 'budget', 'deadline', 'homework_type', - 'reward_type' + 'reward_type', + 'password' # safe_attributes 'name', diff --git a/app/models/join_in_contest.rb b/app/models/join_in_contest.rb new file mode 100644 index 000000000..d80a096a0 --- /dev/null +++ b/app/models/join_in_contest.rb @@ -0,0 +1,10 @@ +class JoinInContest < ActiveRecord::Base + attr_accessible :bid_id, :user_id + + belongs_to :user + belongs_to :bid + + validates_presence_of :user_id, :bid_id + + +end diff --git a/app/models/user.rb b/app/models/user.rb index 40e142e92..48bda02a6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -90,6 +90,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 :join_in_contests, :dependent => :destroy ##### ######added by nie @@ -167,6 +168,16 @@ class User < Principal self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id, :status => true) end + # 判断用户是否加入了竞赛中 fq + def join_in_contest?(bid) + joined = JoinInContest.where('user_id = ? and bid_id =?', self.id, bid.id) + if joined.size > 0 + true + else + false + end + end + ### fq def join_in?(course) joined = StudentsForCourse.where('student_id = ? and course_id = ?', self.id, course.id) diff --git a/app/views/bids/_form_contest.html.erb b/app/views/bids/_form_contest.html.erb index b7e4dc5c7..448af2e8e 100644 --- a/app/views/bids/_form_contest.html.erb +++ b/app/views/bids/_form_contest.html.erb @@ -24,6 +24,9 @@

<%= f.text_field :name, :required => true, :size => 60, :style => "width:490px;", :maxlength => Bid::NAME_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_name)}" %>

<%= f.text_area :description, :rows => 8, :class => 'wiki-edit', :style => "font-size:small;width:490px;margin-left:10px;", :maxlength => Bid::DESCRIPTION_LENGTH_LIMIT, :placeholder => "#{l(:label_contest_description)}" %>

+ +

<%= f.text_field :password, :size => 60, :style => "width:488px;margin-left: 10px;" %>

+

<%= f.text_field :budget, :required => true, :size => 60, :style => "width:350px;", :placeholder => l(:label_bids_reward_what) %> diff --git a/app/views/bids/_homework_list.html.erb b/app/views/bids/_homework_list.html.erb index 0a40e3d0e..ba6faa650 100644 --- a/app/views/bids/_homework_list.html.erb +++ b/app/views/bids/_homework_list.html.erb @@ -31,11 +31,13 @@ + <% unless User.current.logged? && (!Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.nil? && (Member.where('user_id = ? and project_id = ?', User.current.id, @bid.courses.first.id).first.roles&Role.where('id = ? or id = ? or id =?',5, 10, 7)).size >0) %>

<% options = {:author => true, :deletable => attach_delete(homework)} %> <%= render :partial => 'attachments/links', :locals => {:attachments => homework.attachments, :options => options} %>

+ <% end %> diff --git a/app/views/bids/_new_join.html.erb b/app/views/bids/_new_join.html.erb new file mode 100644 index 000000000..bbe09133d --- /dev/null +++ b/app/views/bids/_new_join.html.erb @@ -0,0 +1,59 @@ + + + +

请输入竞赛密码

+ +<%= form_tag({:controller => 'bids', + :action => 'join_in_contest', + :id => course.id}, + :remote => true, + :method => :post, + :id => 'new-watcher-form') do %> + + + + + <%= text_field_tag 'course_password', nil, :size => 45 %> + +

+ <%= submit_tag l(:label_new_join), :name => nil, :class => "bid_btn", :onclick => "hideModal(this);" %> + <%= submit_tag l(:button_cancel), :name => nil, :class => "bid_btn", :onclick => "hideModal(this);", :type => 'button' %> + +

+
+<% end %> diff --git a/app/views/bids/_set_join.js.erb b/app/views/bids/_set_join.js.erb new file mode 100644 index 000000000..361cf85ae --- /dev/null +++ b/app/views/bids/_set_join.js.erb @@ -0,0 +1,8 @@ +$("#<%=object_id%>").replaceWith('<%= escape_javascript join_in_contest(@bid, user) %>'); +<% if @state %> + <% if @state == 0 %> + alert("加入成功") + <% else %> + alert("密码错误") + <% end %> +<% end %> \ No newline at end of file diff --git a/app/views/bids/new_join.js.erb b/app/views/bids/new_join.js.erb new file mode 100644 index 000000000..bf80473a2 --- /dev/null +++ b/app/views/bids/new_join.js.erb @@ -0,0 +1,3 @@ +$('#ajax-modal').html('<%= escape_javascript(render :partial => 'bids/new_join', :locals => {:course => @bid}) %>'); +showModal('ajax-modal', '400px'); +$('#ajax-modal').addClass('new-watcher'); diff --git a/app/views/bids/show_participator.html.erb b/app/views/bids/show_participator.html.erb new file mode 100644 index 000000000..6ac248192 --- /dev/null +++ b/app/views/bids/show_participator.html.erb @@ -0,0 +1,33 @@ + +

<%= l(:label_x_join_in_contest, :count => @bid.join_in_contests.count)%>

+
+ <% for temp in @bid.join_in_contests %> + <% user = temp.user %> + +<% end %> +
\ No newline at end of file diff --git a/app/views/boards/index.html.erb b/app/views/boards/index.html.erb index c7e4f5b54..614066613 100644 --- a/app/views/boards/index.html.erb +++ b/app/views/boards/index.html.erb @@ -1,5 +1,5 @@
- <% if User.current.logged? %> + <% if User.current.logged? && User.current.member_of?(@project) %> <%= link_to l(:label_board_new), new_project_board_path(@project), :class => 'icon icon-add' %> <% end %>
diff --git a/app/views/layouts/base_contest.html.erb b/app/views/layouts/base_contest.html.erb index 244e6a36c..2af659def 100644 --- a/app/views/layouts/base_contest.html.erb +++ b/app/views/layouts/base_contest.html.erb @@ -64,14 +64,16 @@ <%= h @bid.name %> - <%= watcher_link(@bid, User.current) %> + + <%= join_in_contest(@bid, User.current)%> + <%= watcher_link(@bid, User.current) %> - + @@ -145,7 +147,7 @@
<%= l(:lable_contest_user) %><%= link_to(@user, user_path(@user))%><%= l(:lable_contest_user) %><%= link_to(@user.show_name, user_path(@user))%>
<%= l(:label_bids_reward_method) %><%= @bid.budget%>
- +
<%= l(:label_bidding_project) %> @@ -176,6 +178,27 @@
+ +
+ +
+
+ <%= l(:label_x_join_in_contest, :count => @bid.join_in_contests.count) %> + <% if show_more_participate?(@bid) %> +
+ <%= link_to l(:label_more), :controller => "bids", :action => "show_participator"%> +
+ <% end %> +
+
+ + + + +
<%= show_participate_picture(@bid) %>
+
+
+
<% if display_main_menu?(@bid) %> diff --git a/app/views/layouts/base_courses.html.erb b/app/views/layouts/base_courses.html.erb index e7598af63..7bcb78ad5 100644 --- a/app/views/layouts/base_courses.html.erb +++ b/app/views/layouts/base_courses.html.erb @@ -70,13 +70,14 @@ <%= @project.name %> +
<%if User.current.logged? %> <% if @course.teacher.id == User.current.id %> <%= link_to l(:label_course_modify_settings), {:controller => 'projects', :action => 'settings', :id => @project} %> <% else %> <%= join_in_course(@project, User.current) %>
- <% end %> + <% end %>
<% unless User.current.member_of?(@project) %>
@@ -209,20 +210,23 @@