diff --git a/app/controllers/applied_project_controller.rb b/app/controllers/applied_project_controller.rb new file mode 100644 index 000000000..0bf9394aa --- /dev/null +++ b/app/controllers/applied_project_controller.rb @@ -0,0 +1,29 @@ +class AppliedProjectController < ApplicationController + + #申请加入项目 + def applied_join_project + @user_id = params[:user_id] + @project = Project.find(params[:project_id]) + AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id]) + #redirect_to project_path(params[:project_id]) + #redirect_to_referer_or {render :text => ( 'applied success.'), :layout => true} + respond_to do |format| + format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} + format.js { render :partial => 'set_applied'} + end + end + + #取消申请 + def unapplied_join_project + @project = Project.find(params[:project_id]) + @applied = AppliedProject.find(params[:id]) + @applied.destroy + #redirect_to project_path(params[:project_id]) + #redirect_to_referer_or {render :text => ( 'unsubscribe success.'), :layout => true} + respond_to do |format| + format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} + format.js { render :partial => 'set_applied' } + end + end + +end diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index d848b3c37..ed27d9388 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -209,7 +209,12 @@ private end def read_authorize - @attachment.visible? ? true : deny_access + if @attachment.container_type == "HomeworkAttach" + true + #User.current.allowed_to?(:view_homework_attaches, @attachment.project) ? true : deny_access + else + @attachment.visible? ? true : deny_access + end end def delete_authorize diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb index 2273de4e4..d63f0cfbb 100644 --- a/app/controllers/bids_controller.rb +++ b/app/controllers/bids_controller.rb @@ -14,6 +14,8 @@ class BidsController < ApplicationController # end before_filter :require_login,:only => [:set_reward, :destroy, :add, :new, ] + before_filter :memberAccess, only: :show_project + helper :watchers helper :attachments include AttachmentsHelper @@ -875,7 +877,14 @@ class BidsController < ApplicationController end rescue render_404 - end + end + + def memberAccess + # 是课程,则判断当前用户是否参加了课程 + return 0 if @bid.courses.first.project_type == Project::ProjectType_project + currentUser = User.current + render_403 unless currentUser.member_of?(@bid.courses.first) + end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index d9996e739..32fc3dd57 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -33,12 +33,12 @@ class ProjectsController < ApplicationController menu_item l(:label_course_news), :only => :index - before_filter :find_project, :except => [ :index, :search,:list, :new, :create, :copy, :statistics, :new_join, :course, :enterprise_course, :course_enterprise] + before_filter :find_project, :except => [ :index, :search,:list, :new, :create, :copy, :statistics, :new_join, :course, :enterprise_course, :course_enterprise,:view_homework_attaches] # before_filter :authorize, :except => [:new_join, :new_homework, :homework, :statistics, :search, :watcherlist, :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy, :member, :focus, :file, # :statistics, :feedback, :course, :enterprise_course, :course_enterprise, :project_respond, :share, # :show_projects_score, :issue_score_index, :news_score_index, :file_score_index, :code_submit_score_index, :projects_topic_score_index] - before_filter :authorize, :only => [:show, :settings, :edit, :sort_project_members, :update, :modules, :close, :reopen] - before_filter :authorize_global, :only => [:new, :create] + before_filter :authorize, :only => [:show, :settings, :edit, :sort_project_members, :update, :modules, :close, :reopen,:view_homework_attaches] + before_filter :authorize_global, :only => [:new, :create,:view_homework_attaches] before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy, :calendar] before_filter :file, :statistics, :watcherlist diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 7365e4048..6174e2124 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -209,8 +209,6 @@ class UsersController < ApplicationController ## 判断课程是否过期 [需封装] @memberships_doing = [] @memberships_done = [] - @OwningCouses =[] - @JoinCouses=[] now_time = Time.now.year @memberships.map { |e| end_time = e.project.course_extra.get_time.year @@ -220,12 +218,6 @@ class UsersController < ApplicationController else @memberships_doing.push e end - - if e.project.course_extra.tea_id == User.current.id - @OwningCouses.push e - else - @JoinCouses.push e - end } # respond_to do |format| # format.html diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index b06b8cbb3..b1fbfb8ea 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -158,6 +158,6 @@ class WatchersController < ApplicationController respond_to do |format| format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} format.js { render :partial => 'set_watcher', :locals => {:user => user, :watched => watchables} } - end + end end end diff --git a/app/helpers/applied_project_helper.rb b/app/helpers/applied_project_helper.rb new file mode 100644 index 000000000..eef4c9ccf --- /dev/null +++ b/app/helpers/applied_project_helper.rb @@ -0,0 +1,28 @@ +module AppliedProjectHelper + + def applied_css(project) + id = project.id + "#{project.class.to_s.underscore}-#{id}-applied" + end + + def applied_link(project, user, options=[]) + return '' unless user && user.logged? + applied = project.applied_projects.find_by_user_id(user.id) + text = applied ? l(:label_unapply_project) : l(:label_apply_project) + + @applied_flag = project.instance_of?(Project) + css = @applied_flag ? ([applied_css(project), applied ? 'icon ' : 'icon '].join(' ') << options[0].to_s) : + ([applied_css(project), applied ? 'icon icon-applied ' : 'icon icon-applied-off '].join(' ') << options[0].to_s) + if applied + appliedid = applied.id + end + url = appliedproject_path( + :id=>appliedid, + :user_id => user.id, + :project_id => project.id + ) + method = applied ? 'delete' : 'post' + + link_to text, url, :remote => true, :method => method ,:class=>css + end +end diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb index fcaf63604..50170ee9e 100644 --- a/app/helpers/watchers_helper.rb +++ b/app/helpers/watchers_helper.rb @@ -30,7 +30,7 @@ module WatchersHelper objects = Array.wrap(objects) watched = objects.any? {|object| object.watched_by?(user)} - @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or objects.first.instance_of?(Contest) or (objects.first.instance_of?(Bid))) + @watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or objects.first.instance_of?(Contest) or (objects.first.instance_of?(Bid))) css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) : ([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s) @@ -187,4 +187,31 @@ module WatchersHelper :class => "floating" end.join.html_safe end -end + + def applied_css(project) + id = project.id + "#{project.class.to_s.underscore}-#{id}-applied" + end + + def applied_link(project, user, options=[]) + return '' unless user && user.logged? + applied = project.applied_projects.find_by_user_id(user.id) + text = applied ? l(:label_unapply_project) : l(:label_apply_project) + + @applied_flag = project.instance_of?(Project) + css = @applied_flag ? ([applied_css(project), applied ? 'icon ' : 'icon '].join(' ') << options[0].to_s) : + ([applied_css(project), applied ? 'icon icon-applied ' : 'icon icon-applied-off '].join(' ') << options[0].to_s) + if applied + appliedid = applied.id + end + url = appliedproject_path( + :id=>appliedid, + :user_id => user.id, + :project_id => project.id + ) + method = applied ? 'delete' : 'post' + + link_to text, url, :remote => true, :method => method ,:class=>css + end + + end diff --git a/app/models/applied_project.rb b/app/models/applied_project.rb new file mode 100644 index 000000000..04056cadc --- /dev/null +++ b/app/models/applied_project.rb @@ -0,0 +1,6 @@ +class AppliedProject < ActiveRecord::Base + attr_accessible :project_id, :user_id + + belongs_to :user + belongs_to :project +end diff --git a/app/models/course.rb b/app/models/course.rb index 0420b1744..de383a1f5 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -2,7 +2,7 @@ class Course < ActiveRecord::Base include Redmine::SafeAttributes attr_accessible :code, :extra, :name, :state, :tea_id, :time , :location, :state, :term, :password - belongs_to :project, :class_name => 'Project', :foreign_key => :extra # 定义一个project方法, 该方法通过extra来调用project表 + belongs_to :project, :class_name => 'Project', :foreign_key => :extra, primary_key: :identifier belongs_to :teacher, :class_name => 'User', :foreign_key => :tea_id # 定义一个方法teacher,该方法通过tea_id来调用User表 belongs_to :school, :class_name => 'School', :foreign_key => :school_id #定义一个方法school,该方法通过school_id来调用School表 has_many :bid diff --git a/app/models/homework_attach.rb b/app/models/homework_attach.rb index e395e65e5..ac285e606 100644 --- a/app/models/homework_attach.rb +++ b/app/models/homework_attach.rb @@ -29,6 +29,13 @@ class HomeworkAttach < ActiveRecord::Base result end + def project + work = HomeworkForCourse.find_by_bid_id(self.bid_id) + if work + work.project + end + end + def add_jours options jfm = self.journals_for_messages.build(options) jfm.save diff --git a/app/models/project.rb b/app/models/project.rb index 3c2956a94..5da9f674e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -64,7 +64,8 @@ class Project < ActiveRecord::Base # has_many :students_for_courses, :dependent => :destroy has_many :student, :through => :students_for_courses, :source => :user has_one :course_extra, :class_name => 'Course', :foreign_key => :extra,:primary_key => :identifier, :dependent => :destroy - + has_many :applied_projects + # end #ADDED BY NIE has_many :project_infos, :dependent => :destroy diff --git a/app/models/user.rb b/app/models/user.rb index 840275794..8017ed5f8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -18,6 +18,11 @@ require "digest/sha1" class User < Principal + TEACHER = 0 + STUDENT = 1 + ENTERPRISE = 2 + DEVELOPER = 3 + include Redmine::SafeAttributes # Different ways of displaying/sorting users diff --git a/app/views/applied_project/_set_applied.js.erb b/app/views/applied_project/_set_applied.js.erb new file mode 100644 index 000000000..e77592060 --- /dev/null +++ b/app/views/applied_project/_set_applied.js.erb @@ -0,0 +1,4 @@ +<% selector = ".#{applied_css(@project)}" %> +$("<%= selector %>").each(function(){$(this).replaceWith("<%= escape_javascript applied_link(@project, User.current) %>")}); + + diff --git a/app/views/files/_show_all_attachment.html.erb b/app/views/files/_show_all_attachment.html.erb index d34f95f78..07dc6a27f 100644 --- a/app/views/files/_show_all_attachment.html.erb +++ b/app/views/files/_show_all_attachment.html.erb @@ -20,7 +20,6 @@ <%= sort_header_tag('content_type', :caption => l(:attachment_sufix_browse), :default_order => 'desc', :scope => "col", :id => "vzebra-contenttype") %> <%= sort_header_tag('downloads', :caption => l(:field_downloads), :default_order => 'desc', :scope => "col", :id => "vzebra-action") %> <%= sort_header_tag('operation', :caption => "", :scope => "col", :id => "vzebra-children") %> - <%= sort_header_tag('tags', :caption => l(:label_tag), :id => "vzebra-tag") %> @@ -52,14 +51,15 @@ <%= link_to(image_tag('delete.png'), attachment_path(file), :data => {:confirm => l(:text_are_you_sure)}, :method => :delete) if delete_allowed %> -
<%= link_to h(forum.name), forum_path(forum) %>
<%= forum.description%>
-<%= authoring forum.created_at, forum.creator %>
<%= authoring forum.created_at, forum.creator %>
<%= link_to (forum.memo_count), forum_path(forum) %> | <%= link_to (forum.topic_count), forum_path(forum) %> |
回答 | 帖子 |
- <%= content_tag('span', "#{@project.members.count}", :class => "info") %> + <%= content_tag('span', "#{garble @project.members.count}", :class => "info") %> <%= content_tag('span', l(:label_x_member, :count => @project.members.count)) %>
diff --git a/app/views/users/_course_list_have_entity.html.erb b/app/views/users/_course_list_have_entity.html.erb new file mode 100644 index 000000000..87dd52635 --- /dev/null +++ b/app/views/users/_course_list_have_entity.html.erb @@ -0,0 +1,22 @@ +- <%= l(:label_project_course_un) %> -
- <% else %> -- - <%= l(:label_project_course_unadd) %><%= link_to"#{l(:label_course_new)}",{:controller=>'projects',:action=>'new', :course => 1, :project_type => 1}, :class => 'icon icon-add' %> -
- <% end %> -<% else %> -- <%=l(:label_course_doing)%>(<%=@memberships_doing.count%>) - <%= link_to"#{l(:label_course_new)}",{:controller=>'projects',:action=>'new', :course => 1, :project_type => 1}, :class => 'icon icon-add' if @user == User.current %> -
-- <%= l(:label_created_course) %> -
<%= l(:label_joined_course) %> -
- <%= link_to l(:label_course_done)+"("+@memberships_done.count.to_s+")", 'javascript:void(0);', :onclick => '$("#courses_history_block").slideToggle(400);' , style:"color:#666666" if User.current.logged? %> -
- - - -<% end %> + <% if @memberships.empty? %> + <% if @user != User.current %> ++ <%= l(:label_project_course_un) %> +
+ <% else %> ++ + <%= l(:label_project_course_unadd) %><%= link_to "#{l(:label_course_new)}", {:controller => 'projects', :action => 'new', :course => 1, :project_type => 1}, :class => 'icon icon-add' %> +
+ <% end %> + <% else %> + <%= render partial: 'course_list_have_entity' %> + <% end %>- <%=l(:label_course_doing)%>(<%=@memberships_doing.count%>) - <%= link_to"#{l(:label_course_view_student)}",{:controller=>'projects',:action=>'course', :course => 1}, :class => 'icon icon-add' %> -
-- <%= link_to l(:label_course_done)+"("+@memberships_done.count.to_s+")", 'javascript:void(0);', :onclick => '$("#courses_history_block").slideToggle(400); ', style:"color:#666666" if User.current.logged? %> -
- - + +