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/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/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/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/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 %>
-
+
+ |
+
-
+
|
<% end -%>
diff --git a/app/views/files/_sort_by_attachtypel.html.erb b/app/views/files/_sort_by_attachtypel.html.erb
index 9df26d7ed..01c57c490 100644
--- a/app/views/files/_sort_by_attachtypel.html.erb
+++ b/app/views/files/_sort_by_attachtypel.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") %>
@@ -48,15 +47,17 @@
<%= link_to(image_tag('delete.png'), attachment_path(file),
:data => {:confirm => l(:text_are_you_sure)}, :method => :delete) if delete_allowed %>
-
-
-
- |
+
+
+
+
+
+ |
<% end -%>
<% end -%>
diff --git a/app/views/softapplications/show.html.erb b/app/views/softapplications/show.html.erb
index c077bc822..36167880c 100644
--- a/app/views/softapplications/show.html.erb
+++ b/app/views/softapplications/show.html.erb
@@ -1,146 +1,139 @@
-<%=render :partial => 'layouts/base_softapplication_top_content'%>
-
-
+<%= render :partial => 'layouts/base_softapplication_top_content' %>
<%= notice %>
-
-
- |
-
-
-
- <%= @softapplication.name %> |
-
- <%= link_to '删除', softapplication_path(@softapplication), method: :delete, data: { confirm: '您确定要删除吗?' } if @softapplication.destroyable_by? User.current %>
- <%= link_to '编辑', edit_softapplication_path(@softapplication), method: :get if @softapplication.destroyable_by? User.current %>
- |
-
-
- 所属类别:<%= @softapplication.app_type_name %> |
- <% contest = @softapplication.contests.first %>
- 所属竞赛:<%= contest ? link_to(contest.name, show_attendingcontest_contest_path(contest)) : '尚未加入竞赛'%> |
-
-
- 发布人员:<%= @softapplication.user.name %> |
- 系统支持:<%= @softapplication.android_min_version_available %> |
-
-
-
- 作品下载:
+ |
+
+ |
+
+
+
+ <%= @softapplication.name %> |
+
+ <%= link_to '删除', softapplication_path(@softapplication), method: :delete, data: {confirm: '您确定要删除吗?'} if @softapplication.destroyable_by? User.current %>
+ <%= link_to '编辑', edit_softapplication_path(@softapplication), method: :get if @softapplication.destroyable_by? User.current %>
+ |
+
+
+ 所属类别:<%= @softapplication.app_type_name %> |
+ <% contest = @softapplication.contests.first %>
+ 所属竞赛:<%= contest ? link_to(contest.name, show_attendingcontest_contest_path(contest)) : '尚未加入竞赛' %> |
+
+
+ 发布人员:<%= @softapplication.user.name %> |
+ 系统支持:<%= @softapplication.android_min_version_available %> |
+
+
+
+ 作品下载:
- <% options = {:author => true, :deletable => @softapplication.user.eql?(User.current) } %><%= render :partial => 'attachments/app_link', :locals => {:attachments => @app_items, :options => options} %>
+ <% options = {:author => true, :deletable => @softapplication.user.eql?(User.current)} %><%= render :partial => 'attachments/app_link', :locals => {:attachments => @app_items, :options => options} %>
- |
-
- 开发人员:<%= @softapplication.application_developers %> |
-
-
- 平均评分: <%= rating_for @softapplication, :static => true, dimension: :quality, class: 'rateable div_inline' %> |
- 发布时间:<%=format_time @softapplication.created_at %> |
-
-
-
- <% unless @softapplication.deposit_project_url.nil? %>
- <%= textilizable ("托管项目网址: " + @softapplication.deposit_project_url) %>
- <% end %>
- |
-
+
-
-
- |
-
+ 开发人员:<%= @softapplication.application_developers %> |
+
+
+ 平均评分: <%= rating_for @softapplication, :static => true, dimension: :quality, class: 'rateable div_inline' %> |
+ 发布时间:<%= format_time @softapplication.created_at %> |
+
+
+
+ <% unless @softapplication.deposit_project_url.nil? %>
+ <%= textilizable ("托管项目网址: " + @softapplication.deposit_project_url) %>
+ <% end %>
+ |
+
+
+ |
+
-
作品简介:
-
<%= @softapplication.description %>
+
+ 作品简介:
+
+
+
<%= @softapplication.description %>
-
作品得分:
-
-
-
-
得分比例
-
- <% 100.step(20,-20) do |star| %>
-
- <%= @stars_status_map["star#{(star/20).to_s}".to_sym] %>
-
- <% end %>
-
-
-
-
最终得分
-
<%=@softapplication.average(:quality).try(:avg).try(:round, 2).to_i.to_s%>分
-
<%= rating_for @softapplication, :static => true, dimension: :quality, class: 'rateable div_inline' %>
-
-
-
打分总人数
-
<%= @softapplication.raters(:quality).count%>
-
-
+
作品得分:
+
+
+
+
得分比例
+
+ <% 100.step(20, -20) do |star| %>
+
+ <%= @stars_status_map["star#{(star/20).to_s}".to_sym] %>
+
+ <% end %>
+
+
+
+
最终得分
+
<%= @softapplication.average(:quality).try(:avg).try(:round, 2).to_i.to_s %>
+ 分
+
+
<%= rating_for @softapplication, :static => true, dimension: :quality, class: 'rateable div_inline' %>
+
+
+
打分总人数
+
+ <%= @softapplication.raters(:quality).count %>
+
+
-
作品截图:
-
- <% @image_results.take(4).each do |attachment| %>
- <%= link_to_attachment_img attachment, :class => "soft-application", :download => "true" %>
- <% end %>
-
-
+
+ 作品截图:
+
+
+
+
+ <% @image_results.take(4).each do |attachment| %>
+ -
+
+ <%= link_to_attachment_img attachment, :class => "soft-application", :download => "true"%>
+
+ <% end %>
+
+
+
-
+
-
作品评论:
-
评分: <%= rating_for @softapplication, dimension: :quality, class: 'rateable div_inline' %>(您可以重新打分,打分结果以最后一次打分为主!)
-
+
作品评论:
+
评分: <%= rating_for @softapplication, dimension: :quality, class: 'rateable div_inline' %>
+ (您可以重新打分,打分结果以最后一次打分为主!)
+
- <%= render :partial => 'message_history', :locals => { :contest => @softapplication, :journals => @jour, :state => false} %>
+ <%= render :partial => 'message_history', :locals => {:contest => @softapplication, :journals => @jour, :state => false} %>
-<%#= link_to '返回竞赛页面', show_softapplication_contest_path(@softapplication.contest) %>
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 @@
+
+
+
+
+
+ <%= render :partial => 'course_form', :locals => {:memberships => @memberships_doing} %>
+
+
+
+
+
+ <%= render :partial => 'course_form', :locals => {:memberships => @memberships_done} %>
+
+
+
+
diff --git a/app/views/users/_my_course.html.erb b/app/views/users/_my_course.html.erb
index 8feb0ecca..26cfd48e0 100644
--- a/app/views/users/_my_course.html.erb
+++ b/app/views/users/_my_course.html.erb
@@ -1,38 +1,16 @@
-<% 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 %>
-
- <%=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) %>
-
<%= render :partial => 'course_form', :locals => {:memberships => @OwningCouses}%>
-
-
-
<%= l(:label_joined_course) %>
-
<%= render :partial => 'course_form', :locals => {:memberships => @JoinCouses}%>
-
-
-
-
-
- <%= 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? %>
-
-
-
- <%= render :partial => 'course_form', :locals => {:memberships => @memberships_done}%>
-
-
-<% 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 %>
diff --git a/app/views/users/_my_joinedcourse.html.erb b/app/views/users/_my_joinedcourse.html.erb
index dc759a809..31780e301 100644
--- a/app/views/users/_my_joinedcourse.html.erb
+++ b/app/views/users/_my_joinedcourse.html.erb
@@ -11,23 +11,27 @@
<% end %>
<% else %>
-
- <%=l(:label_course_doing)%>(<%=@memberships_doing.count%>)
- <%= link_to"#{l(:label_course_view_student)}",{:controller=>'projects',:action=>'course', :course => 1}, :class => 'icon icon-add' %>
-
-
- <%= render :partial => 'course_form', :locals => {:memberships => @memberships_doing}%>
-
+
+
-
+
+
+ <%= render :partial => 'course_form', :locals => {:memberships => @memberships_doing} %>
+
+
-
- <%= 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? %>
-
-
-
- <%= render :partial => 'course_form', :locals => {:memberships => @memberships_done}%>
-
+
+
+ <%= render :partial => 'course_form', :locals => {:memberships => @memberships_done} %>
+
+
+
<% end %>
diff --git a/app/views/users/user_courses.html.erb b/app/views/users/user_courses.html.erb
index aa4a366fc..6a4d7afdd 100644
--- a/app/views/users/user_courses.html.erb
+++ b/app/views/users/user_courses.html.erb
@@ -12,3 +12,22 @@
});
+
+
\ No newline at end of file
diff --git a/lib/redmine.rb b/lib/redmine.rb
index d22feb9fc..904be7c25 100644
--- a/lib/redmine.rb
+++ b/lib/redmine.rb
@@ -178,6 +178,11 @@ Redmine::AccessControl.map do |map|
map.permission :manage_related_issues, {:repositories => [:add_related_issue, :remove_related_issue]}
end
+ #作业模块权限
+ map.project_module :bids do |map|
+ map.permission :view_homework_attaches, {:bids => [:show, :show_project, :revision]}, :read => true
+ end
+
map.project_module :boards do |map|
map.permission :manage_boards, {:boards => [:new, :create, :edit, :update, :destroy]}, :require => :member
map.permission :view_messages, {:boards => [:index, :show], :messages => [:show]}, :public => true, :read => true
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index 8e0a81cf6..977aef8fe 100644
--- a/public/stylesheets/application.css
+++ b/public/stylesheets/application.css
@@ -493,7 +493,6 @@ a.bids_user {
}
.line{
- width: 905px;
height: 1px;
margin: 0px;
background-color: #cacaca;
diff --git a/public/stylesheets/nyan.css b/public/stylesheets/nyan.css
index e1088c8c0..7910c2a64 100644
--- a/public/stylesheets/nyan.css
+++ b/public/stylesheets/nyan.css
@@ -1,14 +1,17 @@
/* TODO: base/common/page 准备封装一些基本样式组合调用 参考YUI
*******************************************************************************/
-span[id^=valid_user]{
- padding-left: 10px;
+span[id^=valid_user] {
+ padding-left: 10px;
}
-.red{
- color: red;
+
+.red {
+ color: red;
}
-.green{
- color: green;
+
+.green {
+ color: green;
}
+
.border_box {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
@@ -218,7 +221,6 @@ body {
border-style: solid;
border-width: 1px;
color: #222222;
- font-family: "Helvetica Neue";
font-size: 1.2em;
outline: medium none;
padding: 8px;
@@ -1008,7 +1010,7 @@ div.issue {
}
#ver-zebra1 td {
- padding: 8px ;
+ padding: 8px;
border-right: 1px solid #fff;
border-left: 1px solid #fff;
color: #669;
@@ -1134,9 +1136,153 @@ div.pagination {
-o-transition: 1s width;
transition: 1s width;
}
-.all_browse_div table .description{
- border-bottom: 1px solid #efffff;
+
+.all_browse_div table .description {
+ border-bottom: 1px solid #efffff;
+}
+
+.all_browse_div table td {
+ vertical-align: middle;
+}
+
+/* softapplication show
+*******************************************************************************/
+.softapplication-img {
+ margin: 0;
+ padding: 0;
}
-.all_browse_div table td{
- vertical-align: middle;
+
+.softapplication-img {
+ margin: 5px auto;
+ width: 860px;
+ max-height: 640px;
+ overflow: hidden;
+ box-shadow: 5px 5px 20px 5px #ccc;
+ border-radius: 5px;
+}
+
+.soft-application {
+ width: 326px;
+ height: 580px;
+}
+
+.softapplication-img .title {
+ width: 326px;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+}
+
+.softapplication-img .title a {
+ display: block;
+ text-decoration: none;
+ color: #fff;
+ font-size: 20px;
+ padding: 20px;
+ background: rgba(0, 0, 0, 0.5);
+}
+
+.softapplication-img li {
+ list-style-type: none;
+ position: relative;
+ float: left;
+ width: 205px;
+ -webkit-transition: all 0.5s;
+ -moz-transition: all 0.5s;
+ -ms-transition: all 0.5s;
+ -o-transition: all 0.5s;
+ transition: all 0.5s;
+ box-shadow: -1px 0 3px 1px rgba(0, 0, 0, 0.3);
+}
+
+.softapplication-img ul:hover li {
+ width: 160px;
+}
+
+.softapplication-img ul li:hover {
+ width: 326px;
+}
+
+/* user_courses
+*******************************************************************************/
+.user_course_list {
+ margin: 0;
+ padding: 0;
+ position: relative;
+ margin-top: -15px;
}
+
+.user_course_list .menu{
+ display: block;
+ background-color: #f9f9f9;
+ border-radius: 2px 2px 0 0;
+ position: relative;
+ height: 40px;
+ line-height: 40px;
+ border-bottom: 1px solid #ddd;
+ text-align: left;
+ margin-left: -10px;
+ padding-left: 15px;
+}
+
+.user_course_list .menu:after {
+ content: ".";
+ visibility: hidden;
+ display: block;
+ height: 0;
+ clear: both;
+}
+
+.user_course_list .menu ul {
+ margin: 0;
+ padding: 0;
+ float: right;
+ margin-right: 30px;
+}
+.user_course_list .menu ul {
+}
+
+.user_course_list .menu li {
+ display: inline-block;
+ position: relative;
+ height: 40px;
+ line-height: 40px;
+ cursor: pointer;
+}
+
+.user_course_list .menu li:hover {
+ color: #00a1d6;
+}
+
+.user_course_list .menu li.on {
+ color: #00a1d6;
+ font-weight: bold;
+}
+
+
+.user_course_list .list_top {
+ margin: 20px auto 0px;
+}
+
+.user_course_list .created_course {
+ position: relative;
+ display: block;
+ padding-top: 20px;
+}
+
+.user_course_list .created_course:after {
+ content: ".";
+ visibility: hidden;
+ display: block;
+ height: 0;
+ clear: both;
+}
+
+.user_course_list .created_course .field {
+ position: absolute;
+ display: inline-block;
+ color: rgb(213, 213, 213);
+ top: 0;
+ right: 5%;
+}
+