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 %> - + + +
<%# @preTags = %w|预设A 预设B 预设C 预设D 预设E 预设Z | %> <%= render :partial => 'tags/tag', :locals => {:obj => file, :object_flag => "6"} %>
- + <% 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 %> - -
- <%# @preTags = %w|预设A 预设B 预设C 预设D 预设E 预设Z | %> - <%= render :partial => 'tags/tag', :locals => {:obj => file, :object_flag => "6"} %> -
-
- - + + + +
+ <%# @preTags = %w|预设A 预设B 预设C 预设D 预设E 预设Z | %> + <%= render :partial => 'tags/tag', :locals => {:obj => file, :object_flag => "6"} %> +
+
+ + <% 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 %>

- - - - - - - - - - - - <% contest = @softapplication.contests.first %> - - - - - - - - + + - + + + + + + + + + +
<%= @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 ? link_to(contest.name, show_attendingcontest_contest_path(contest)) : '尚未加入竞赛'%>
发布人员:<%= @softapplication.user.name %>系统支持:<%= @softapplication.android_min_version_available %>
- 作品下载: +
+ + + + + + + + + <% contest = @softapplication.contests.first %> + + + + + + + + - - - - - - - - - - + - -
<%= @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 ? 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 %> -
-
+ +
作品截图:
+
+ +
+ +
+
- +
-
作品评论:
-
评分: <%= 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} %> +
+
+ + +
+ 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? %> -

- - - -<% 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? %> -

- - + +
<% 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%; +} +