diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb
index 008a08f2f..73d1e357c 100644
--- a/app/api/mobile/apis/courses.rb
+++ b/app/api/mobile/apis/courses.rb
@@ -258,7 +258,7 @@ module Mobile
requires :course_id,type: Integer,desc: '课程id'
optional :name,type:String,desc:'课件名称可能包含的字符'
end
- get ":course_id/attachments" do
+ post ":course_id/attachments" do
cs = CoursesService.new
count = cs.course_attachments params
present :data, count, with: Mobile::Entities::Attachment
diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb
index 147cbfda5..675ad33c5 100644
--- a/app/api/mobile/apis/users.rb
+++ b/app/api/mobile/apis/users.rb
@@ -94,6 +94,31 @@ module Mobile
present :status, 0
end
+ desc "用户留言"
+ params do
+ requires :token, type: String
+ requires :user_id, type: Integer,desc: '被留言的用户id'
+ end
+ get ':user_id/messages' do
+ us = UsersService.new
+ jours = us.get_all_messages params
+ present :data,jours,with:Mobile::Entities::Jours
+ present :status,0
+ end
+
+ desc "给用户留言或回复用户留言"
+ params do
+ requires :token, type: String
+ requires :user_id, type: Integer,desc: '被留言的用户id'
+ requires :content,type:String,desc:'留言内容'
+ optional :refer_user_id,type:Integer,desc:'被回复的用户id'
+ end
+ post ':user_id/leave_message' do
+ us = UsersService.new
+ jours = us.leave_messages params,current_user
+ present :status,0
+ end
+
end
end
end
diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb
index 7ccfb0e10..4a27f02ff 100644
--- a/app/controllers/boards_controller.rb
+++ b/app/controllers/boards_controller.rb
@@ -32,13 +32,17 @@ class BoardsController < ApplicationController
#modify by nwb
@flag = params[:flag] || false
if @project
- @boards = @project.boards.includes(:last_message => :author).all
- @boards = [] << @boards[0] if @boards.any?
- if @boards.size == 1
- @board = @boards.first
- show and return
+ if !@project.is_public? && !User.current.member_of?(@project) && !User.current.admin?
+ render_403
+ else
+ @boards = @project.boards.includes(:last_message => :author).all
+ @boards = [] << @boards[0] if @boards.any?
+ if @boards.size == 1
+ @board = @boards.first
+ show and return
+ end
+ render :layout => false if request.xhr?
end
- render :layout => false if request.xhr?
elsif @course
if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course)))
@boards = @course.boards.includes(:last_message => :author).all
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index d616daadc..be69b1777 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -342,10 +342,15 @@ class CoursesController < ApplicationController
def export_course_member_excel
@all_members = student_homework_score(0,0,0,"desc")
+ filename="#{@course.teacher.lastname.to_s + @course.teacher.firstname.to_s }_#{@course.name}_#{@course.time.to_s + @course.term}#{l(:excel_member_list)}";
+ # 如果是ie11 需要转码
+ if(/rv\:11\.0/.match(request.env["HTTP_USER_AGENT"]) != nil)
+ filename= URI::encode(filename)
+ end
respond_to do |format|
format.xls {
send_data(member_to_xls(@all_members,@course.course_groups), :type => "text/excel;charset=utf-8; header=present",
- :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname.to_s }_#{@course.name}_#{@course.time.to_s + @course.term}#{l(:excel_member_list)}.xls")
+ :filename => "#{filename}.xls")
}
end
end
diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb
index 69e7105aa..aa2c9574b 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -23,7 +23,7 @@ class FilesController < ApplicationController
before_filter :auth_login1, :only => [:index]
before_filter :logged_user_by_apptoken,:only => [:index]
before_filter :find_project_by_project_id#, :except => [:getattachtype]
- before_filter :authorize, :except => [:getattachtype,:quote_resource_show,:search,:search_project,:quote_resource_show_project,:search_tag_attachment]
+ before_filter :authorize, :except => [:getattachtype,:quote_resource_show,:search,:searchone4reload,:search_project,:quote_resource_show_project,:search_tag_attachment]
helper :sort
include SortHelper
@@ -46,6 +46,13 @@ class FilesController < ApplicationController
@obj_attachments = paginateHelper @all_attachments,10
end
+ def searchone4reload
+ attachment = Attachment.find_by_id(params[:fileid]);
+ respond_to do |format|
+ format.html{render :layout => nil,:locals=>{:file=>attachment,:course=>@course}}
+ end
+ end
+
def search
sort = ""
@sort = ""
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index b6035ca51..8acca7f81 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -84,15 +84,10 @@ class IssuesController < ApplicationController
@issue_pages = Paginator.new @issue_count, @limit, params['page']
@offset ||= @issue_pages.offset
@issues = @query.issues(:include => [:assigned_to, :tracker, :priority, :category, :fixed_version],
- :order => sort_clause,
- :offset => @offset,
- :limit => @limit)
+ :order => sort_clause,
+ :offset => @offset,
+ :limit => @limit)
@issue_count_by_group = @query.issue_count_by_group
-
-
-
-
-
respond_to do |format|
format.js
format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 96807d2dc..c79d0862f 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -31,7 +31,7 @@ class ProjectsController < ApplicationController
before_filter :authorize, :only => [:show, :settings, :edit, :sort_project_members, :update, :modules, :close, :reopen,:view_homework_attaches,:course]
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
+ before_filter :file, :statistics #:watcherlist
# 除非项目内人员,不可查看成员, TODO: 完了写报表里去
before_filter :memberAccess, only: :member
@@ -417,10 +417,14 @@ class ProjectsController < ApplicationController
@members = @project.member_principals.includes(:roles, :principal).all.sort
end
else
- roles = Role.find_all_givable
- @subPage_title = l :label_member_list
- @members = @project.member_principals.includes(:roles, :principal).joins("LEFT JOIN #{OptionNumber.table_name} ON #{OptionNumber.table_name}.user_id = #{Member.table_name}.user_id and #{OptionNumber.table_name}.score_type = 2 AND #{Member.table_name}.project_id = #{OptionNumber.table_name}.project_id").order("#{OptionNumber.table_name}.total_score DESC").all
- @applied_members = appied_project_members(@project, @members)
+ if !@project.is_public? && !User.current.member_of?(@project) && !User.current.admin?
+ render_403
+ else
+ roles = Role.find_all_givable
+ @subPage_title = l :label_member_list
+ @members = @project.member_principals.includes(:roles, :principal).joins("LEFT JOIN #{OptionNumber.table_name} ON #{OptionNumber.table_name}.user_id = #{Member.table_name}.user_id and #{OptionNumber.table_name}.score_type = 2 AND #{Member.table_name}.project_id = #{OptionNumber.table_name}.project_id").order("#{OptionNumber.table_name}.total_score DESC").all
+ @applied_members = appied_project_members(@project, @members)
+ end
end
@members = paginateHelper @members
render :layout => 'base_courses' if @project.project_type == 1
@@ -676,11 +680,13 @@ class ProjectsController < ApplicationController
true
end
- # added by huang
-
def watcherlist
- if @watched
- @users -= watched.watcher_users
+ unless @project.nil?
+ if !@project.is_public? && !User.current.member_of?(@project) && !User.current.admin?
+ render_403
+ else
+ @users -= watched.watcher_users if @watched
+ end
end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 2a10af260..ace4ae903 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -383,6 +383,8 @@ class UsersController < ApplicationController
# scope = User.logged.status(@status)
# @search_by = params[:search_by] ? params[:search_by][:id] : 0
# scope = scope.like(params[:name],@search_by) if params[:name].present?
+ @search_by = params[:search_by] ? params[:search_by] : 0
+
us = UsersService.new
scope = us.search_user params
@user_count = scope.count
diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb
index 3d6772ea8..cc6c4f47e 100644
--- a/app/controllers/words_controller.rb
+++ b/app/controllers/words_controller.rb
@@ -85,6 +85,9 @@ class WordsController < ApplicationController
elsif @journal_destroyed.jour_type == "Course"
@course = Course.find @journal_destroyed.jour_id
@jours_count = @course.journals_for_messages.where('m_parent_id IS NULL').count
+ elsif @journal_destroyed.jour_type == "Principal"
+ @user = User.find(@journal_destroyed.jour_id)
+ @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count
end
respond_to do |format|
format.js
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index c5be54ee2..0836bf307 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -593,13 +593,38 @@ module ApplicationHelper
Project.project_tree(projects, &block)
end
+ # 项目版本库可见权限判断
+ # 条件:1、modules中设置不可见或项目没有版本库;2、如果项目是私有或者项目版本库隐藏则必须是项目成员才可见
+ def visible_repository?(project)
+ @result = false
+ unless project.enabled_modules.where("name = 'repository'").empty? || project.repositories.count == 0
+ if (project.hidden_repo || !project.is_public?)
+ if User.current.member_of?(project)
+ @result = true
+ end
+ else
+ @result = true
+ end
+ end
+ return @result
+ end
+
# 判断当前用户是否为项目管理员
- def is_project_manager?(user_id,project_id)
+ def is_project_manager?(user_id, project_id)
@result = false
mem = Member.where("user_id = ? and project_id = ?",user_id, project_id)
unless mem.blank?
- mem.first.roles.to_s.include?("Manager")
- @result = false
+ @result = mem.first.roles.to_s.include?("Manager") ? true : false
+ end
+ return @result
+ end
+
+ # 公开项目资源可以引用,admin和管理员和资源上传者拥有设置公开私有权限
+ def authority_pubilic_for_files(project, file)
+ @result = false
+ if (is_project_manager?(User.current.id, @project.id) || file.author_id == User.current.id || User.current.admin) &&
+ project_contains_attachment?(project,file) && file.container_id == project.id && file.container_type == "Project"
+ @result = true
end
return @result
end
diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb
index b72a191db..aae150728 100644
--- a/app/helpers/issues_helper.rb
+++ b/app/helpers/issues_helper.rb
@@ -67,29 +67,33 @@ module IssuesHelper
s.html_safe
end
- #获取跟踪类型
- #REDO:时间紧需要优化,两个方法可以综合成一个
+ #获取跟踪类型及样式
+ #REDO:时间紧可以优化.
def get_issue_type(value)
+ issuetype = []
if value == "缺陷" || value == 1
- class_type = "red_btn_cir ml10"
+ issuetype << "red_btn_cir ml10"
+ issuetype << "缺陷"
elsif value == "功能" || value == 2
- class_type = "blue_btn_cir ml10"
+ issuetype << "blue_btn_cir ml10"
+ issuetype << "功能"
elsif value == "支持" || value == 3
- class_type = "green_btn_cir ml10"
+ issuetype << "green_btn_cir ml10"
+ issuetype << "支持"
+ elsif value == "任务" || value == 4
+ issuetype << "orange_btn_cir ml10"
+ issuetype << "任务"
else
- class_type = "orange_btn_cir ml10"
+ issuetype << "bgreen_btn_cir ml10"
+ issuetype << "周报"
end
end
- def get_issue_typevalue(value)
- if value == "缺陷" || value == 1
- assign = "缺陷"
- elsif value == "功能" || value == 2
- assign = "功能"
- elsif value == "支持" || value == 3
- assign = "支持"
+ def principals_options_for_isuue_list(project)
+ if User.current.member_of?(project)
+ project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["<< #{l(:label_me)} >>", User.current.id]).unshift(["指派给", 0])
else
- assign = "任务"
+ project.members.order("lower(users.login)").map{|c| [c.name, c.user_id]}.unshift(["指派给", 0])
end
end
diff --git a/app/services/users_service.rb b/app/services/users_service.rb
index 071820ba3..6e566b519 100644
--- a/app/services/users_service.rb
+++ b/app/services/users_service.rb
@@ -4,6 +4,7 @@ class UsersService
include AvatarHelper
include CoursesHelper
include ApiHelper
+ include WordsHelper
#将用户注册的功能函数写这里
#参数约定
#成功返回注册后的User实例,失败直接抛异常
@@ -154,6 +155,25 @@ class UsersService
@user
end
+ # 获取某个用户的所有留言信息
+ def get_all_messages params
+ user = User.find(params[:user_id])
+ jours = user.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
+ jours.update_all(:is_readed => true, :status => false)
+ jours.each do |journal|
+ fetch_user_leaveWord_reply(journal).update_all(:is_readed => true, :status => false)
+ end
+ jours
+ end
+
+ # 给某个用户留言
+ def leave_messages params,current_user
+ user = User.find(params[:user_id])
+ user.add_jour(current_user, params[:content], params[:refer_user_id] ||= 0)
+ unless params[:refer_user_id].nil? || params[:refer_user_id] == 0 || params[:refer_user_id] == User.current.id
+ User.find(params[:refer_user_id]).add_jour(current_user, params[:content], params[:refer_user_id])
+ end
+ end
@@ -206,10 +226,18 @@ class UsersService
}
scope = User.logged.status(status)
if params[:is_search_assitant].nil?
- watcher = User.watched_by(params[:user_id])
- watcher.push(params[:user_id])
+ #modify by yutao 2015/5/18 没有params[:user_id]参数时去掉"id not in (?)"条件(bug:#2270) start
+ #say by yutao: params[:user_id]这个是指谁发起的搜索么? 如果是 这个值貌似应该从session获取 怪怪的赶脚-_-!
search_by = params[:search_by] ? params[:search_by] : "0"
- scope = scope.where("id not in (?)",watcher).like(params[:name],search_by) if params[:name].present?
+ if params[:name].present?
+ if !params[:user_id].nil?
+ watcher = User.watched_by(params[:user_id])
+ watcher.push(params[:user_id])
+ scope = scope.where("id not in (?)",watcher)
+ end
+ scope = scope.like(params[:name],search_by)
+ end
+ #modify by yutao 2015/5/18 没有params[:user_id]参数时去掉"id not in (?)"条件 end
else
teachers = searchTeacherAndAssistant(Course.find(params[:course_id]))
scope = scope.where("id not in (?)",teachers.map{|t| t.user_id}).like(params[:name],search_by) if params[:name].present?
diff --git a/app/views/attachments/_project_file_links.html.erb b/app/views/attachments/_project_file_links.html.erb
index a18d819da..fe0e9ab97 100644
--- a/app/views/attachments/_project_file_links.html.erb
+++ b/app/views/attachments/_project_file_links.html.erb
@@ -28,7 +28,8 @@
<% is_float ||= false %>
<% for attachment in attachments %>
-
+
+
<%if is_float%>
<% end%>
@@ -50,9 +51,10 @@
:id => attachment,
:filename => attachment.filename%>
<% end %>
-
- <%= h(truncate(" - #{attachment.description}", length: options[:length] ? options[:length]:15, omission: '...')) unless attachment.description.blank? %>
-
+
+
+ <%= h(" - #{attachment.description}") unless attachment.description.blank? %>
+
(
<%= number_to_human_size attachment.filesize %>)
diff --git a/app/views/attachments/add_exist_file_to_courses.js.erb b/app/views/attachments/add_exist_file_to_courses.js.erb
index eec1e255a..c84a89184 100644
--- a/app/views/attachments/add_exist_file_to_courses.js.erb
+++ b/app/views/attachments/add_exist_file_to_courses.js.erb
@@ -4,4 +4,5 @@
$("#error_show").html("<%= @message.html_safe %>");
<% else %>
closeModal();
+ searchone4reload('<%=params[:file_id]%>');
<% end %>
diff --git a/app/views/files/_course_file.html.erb b/app/views/files/_course_file.html.erb
index 1769b1a45..ebccfcaf4 100644
--- a/app/views/files/_course_file.html.erb
+++ b/app/views/files/_course_file.html.erb
@@ -1,4 +1,15 @@
- <%= form_tag(projects_search_path, :method => :get, :id => "project_search_form") do %>
- <%= text_field_tag 'name', params[:name], :size => 20, :onkeyup => "regexName();", :style => "float:left" %>
- <%= hidden_field_tag 'project_type', params[:project_type] %>
- <%#= submit_tag l(:label_search), :class => "enterprise", :name => nil %>
-
- <%= l(:label_search)%>
-
-
-
- <% end %>
-
-
<%= link_to request.host()+"/forums", forums_path %> |
diff --git a/app/views/layouts/base_projects.html.erb b/app/views/layouts/base_projects.html.erb
index 51f8b9a80..beade0a7a 100644
--- a/app/views/layouts/base_projects.html.erb
+++ b/app/views/layouts/base_projects.html.erb
@@ -1,247 +1,245 @@
<% @nav_dispaly_project_label = 1
-@nav_dispaly_forum_label = 1 %>
+ @nav_dispaly_forum_label = 1 %>
<%#@nav_dispaly_project_label = 1 %>
-
-
- <%= h html_title %>
-
-
- <%= csrf_meta_tag %>
- <%= favicon %>
- <%= javascript_heads %>
- <%= heads_for_theme %>
- <%= stylesheet_link_tag 'public', 'pleft', 'project','jquery/jquery-ui-1.9.2' %>
- <%= javascript_include_tag 'cookie','project', 'header','select_list_move' %>
- <%= call_hook :view_layouts_base_html_head %>
-
- <%= yield :header_tags -%>
+
+
+ <%= h html_title %>
+
+
+ <%= csrf_meta_tag %>
+ <%= favicon %>
+ <%= javascript_heads %>
+ <%= heads_for_theme %>
+ <%= stylesheet_link_tag 'public', 'pleft', 'project','jquery/jquery-ui-1.9.2' %>
+ <%= javascript_include_tag 'cookie','project', 'header','select_list_move' %>
+ <%= call_hook :view_layouts_base_html_head %>
+
+ <%= yield :header_tags -%>
-
-
-
-
-
-
- <%= render :partial => 'layouts/new_header'%>
+ else if($("#friend_organization").attr("checked") == "checked"){
+ project_type = 3;
+ }
+ $.get(
+ url,
+ { project_type: project_type},
+ function (data) {
+ if(data == 1)
+ {
+ $("#setting_project_type").replaceWith("<%= escape_javascript(project_type_link(l(:label_development_team), 1))%>");
+ $("#project_memu_list").html('<%= escape_javascript(render(:partial => 'projects/development_group')) %>');
+ $("#close_light").attr("onClick","close_window('development_group');");
+ }
+ else if(data == 2)
+ {
+ $("#setting_project_type").replaceWith("<%= escape_javascript(project_type_link(l(:label_research_group), 2))%>");
+ $("#project_memu_list").html('<%= escape_javascript(render(:partial => 'projects/research_team')) %>');
+ $("#close_light").attr("onClick","close_window('research_group');");
+ }
+ else if(data == 3)
+ {
+ $("#setting_project_type").replaceWith("<%= escape_javascript(project_type_link(l(:label_friend_organization), 3))%>");
+ $("#project_memu_list").html('<%= escape_javascript(render(:partial => 'projects/friend_group')) %>');
+ $("#close_light").attr("onClick","close_window('friend_organization');");
+ }
+ else
+ {
+ alert("服务器异常,请与管理员联系");
+ }
+ }
+ );
+ }
+
+
+
+
+
+ <%= render :partial => 'layouts/new_header'%>
+
+
+
+
+
+
+ <%= form_tag(projects_search_path, :method => :get, :id => "project_search_form", :class => "search_form") do %>
+ <%= text_field_tag 'name', params[:name], :placeholder => "项目名称", :class => "search_text fl", :onkeyup => "regexName('#{l(:label_search_conditions_not_null)}');" %>
+
+ <%= l(:label_search)%>
+
+
+
+ <% end %>
+
+
+
+
+
+
+ <%= image_tag(url_to_avatar(@project), :width => "60", :height => "60") %>
+
+
+ <%= l(:label_project_id)%><%= @project.id %>
+
+
+
+ <% text = @project.project_new_type == 1 ? l(:label_development_team) : (@project.project_new_type == 2 ? l(:label_research_group) : l(:label_friend_organization))%>
+ <% typeclass = @project.project_new_type == 1 ? "pr_kafa" : (@project.project_new_type == 2 ? "pr_keyan" : "pr_friend")%>
+ <%= render 'layouts/join_exit_project',{:text => text, :typeclass => typeclass} %>
+
+
+
+
+ <%= link_to l(:label_project_name)+"#{@project.name}", project_path(@project.id), :class=>"pr_info_name fl c_dark fb break_word" %>
+ <% if @project.is_public? %>
+ <%= l(:label_public)%>
+ <% else %>
+ <%= l(:label_private)%>
+ <% end %>
+
+
+ <% if @project.project_type == 0 %>
+ <%= l(:label_project_score)%> :
+ <%= link_to(format("%.2f" ,project_scores(@project) ).to_i, {:controller => 'projects',
+ :action => 'show_projects_score',
+ :remote => true,
+ :id => @project.id}, :class => "c_orange f14" ) %>
+ <% end %>
+
-
-
-
-
- <%= form_tag(projects_search_path, :method => :get, :id => "project_search_form", :class => "search_form") do %>
- <%= text_field_tag 'name', params[:name], :placeholder => "项目名称", :class => "search_text fl", :onkeyup => "regexName('#{l(:label_search_conditions_not_null)}');" %>
-
- <%= l(:label_search)%>
-
-
-
+
+
+ <% if User.current.member_of?(@project) %>
+
<%= l(:label_invite)%>
+
+ - <%= link_to l(:label_invite_new_user), :controller=>"projects", :action=>"invite_members_by_mail", :id => @project %>
+ <% if User.current.allowed_to?(:manage_members, @project) %>
+ - <%= link_to l(:label_invite_trustie_user), :controller=>"projects", :action=>"invite_members", :id => @project %>
<% end %>
-
-
-
-
-
-
- <%= image_tag(url_to_avatar(@project), :width => "60", :height => "60") %>
-
-
- <%= l(:label_project_id)%><%= @project.id %>
-
-
-
- <% text = @project.project_new_type == 1 ? l(:label_development_team) : (@project.project_new_type == 2 ? l(:label_research_group) : l(:label_friend_organization))%>
- <% typeclass = @project.project_new_type == 1 ? "pr_kafa" : (@project.project_new_type == 2 ? "pr_keyan" : "pr_friend")%>
- <%= render 'layouts/join_exit_project',{:text => text, :typeclass => typeclass} %>
-
-
-
-
- <%= link_to l(:label_project_name)+"#{@project.name}", project_path(@project.id), :class=>"pr_info_name fl c_dark fb break_word" %>
- <% if @project.is_public? %>
- <%= l(:label_public)%>
- <% else %>
- <%= l(:label_private)%>
- <% end %>
-
-
-
- <% if @project.project_type == 0 %>
- <%= l(:label_project_score)%> :
- <%= link_to(format("%.2f" ,project_scores(@project) ).to_i, {:controller => 'projects',
- :action => 'show_projects_score',
- :remote => true,
- :id => @project.id
- }, :class => "c_orange f14" ) %>
- <% end %>
-
-
-
-
-
-
-
-
-
- <% if User.current.member_of?(@project) %>
-
<%= l(:label_invite)%>
-
- - <%= link_to l(:label_invite_new_user), :controller=>"projects", :action=>"invite_members_by_mail", :id => @project %>
- <% if User.current.allowed_to?(:manage_members, @project) %>
- - <%= link_to l(:label_invite_trustie_user), :controller=>"projects", :action=>"invite_members", :id => @project %>
- <% end %>
-
- <% end %>
-
-
-
- <% if @project.project_new_type == 1 || @project.project_new_type.nil? %>
- <%= render :partial => 'layouts/base_development_group', :locals => {:project => @project}%>
- <% elsif @project.project_new_type == 2 %>
- <%= render :partial => 'layouts/base_research_team', :locals => {:project => @project}%>
- <% else %>
- <%= render :partial => 'layouts/base_friend_group', :locals => {:project => @project}%>
- <% end %>
-
-
-
-
-
-
-
-
-
<%= l(:label_project_overview)%>:
-
- <%= textilizable(@project.description) if @project.description && !@project.description.blank? %>
-
-
-
-
+
+ <% end %>
+
+
+
+ <% if @project.project_new_type == 1 || @project.project_new_type.nil? %>
+ <%= render :partial => 'projects/development_group', :locals => {:project => @project}%>
+ <% elsif @project.project_new_type == 2 %>
+ <%= render :partial => 'projects/research_team', :locals => {:project => @project}%>
+ <% else %>
+ <%= render :partial => 'projects/friend_group', :locals => {:project => @project}%>
+ <% end %>
+
+
+
+
-
-
-
<%= l(:label_tag)%>:
-
-
- <%= render :partial => 'tags/project_tag', :locals => {:obj => @project,:object_flag => "2"}%>
-
-
-
-
-
-
+
+
+
+
<%= l(:label_project_overview)%>:
+
+ <%= textilizable(@project.description) if @project.description && !@project.description.blank? %>
+
+
+
+
-
- <%= render_flash_messages %>
- <%= yield %>
- <%= call_hook :view_layouts_base_content %>
-
-
-
-
- <%= render :partial => 'layouts/new_footer'%>
+
+
+
<%= l(:label_tag)%>:
+
+
+ <%= render :partial => 'tags/project_tag', :locals => {:obj => @project,:object_flag => "2"}%>
+
+
-
-
-
- <% text = @project.project_new_type == 1 ? "development_group" : (@project.project_new_type == 2 ? "research_group" : "friend_organization")%>
-
-
+
-
123
- <%= render :partial => 'layouts/new_feedback' %>
-
- <%= l(:label_loading) %>
-
-
- <%= call_hook :view_layouts_base_body_bottom %>
-
+
+
+
+ <%= render_flash_messages %>
+ <%= yield %>
+ <%= call_hook :view_layouts_base_content %>
+
+
+
+
+ <%= render :partial => 'layouts/new_footer'%>
+
+
+
+
+ <% text = @project.project_new_type == 1 ? "development_group" : (@project.project_new_type == 2 ? "research_group" : "friend_organization")%>
+
+
+
+
123
+<%= render :partial => 'layouts/new_feedback' %>
+
+ <%= l(:label_loading) %>
+
+
+<%= call_hook :view_layouts_base_body_bottom %>
+
diff --git a/app/views/projects/_development_group.html.erb b/app/views/projects/_development_group.html.erb
new file mode 100644
index 000000000..676761831
--- /dev/null
+++ b/app/views/projects/_development_group.html.erb
@@ -0,0 +1,52 @@
+<% attaments_num = @project.attachments.count+Attachment.where(["`container_type` = 'Version' and `container_id` in (?)",@project.versions.map{ |v| v.id}]).all.count %>
+
+<% unless @project.enabled_modules.where("name = 'issue_tracking'").empty? %>
+
+ <%= link_to l(:label_issue_tracking), project_issues_path(@project), :class => "f14 c_blue02" %>
+ <% unless @project.issues.visible.all.count == 0 %>
+
(<%= @project.issues.visible.all.count %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:label_release_issue), new_project_issue_path(@project) , :class => "subnav_green" %>
+ <% end %>
+
+<% end %>
+<% unless @project.enabled_modules.where("name = 'boards'").empty? %>
+
+ <%= link_to l(:project_module_boards), project_boards_path(@project), :class => "f14 c_blue02" %>
+ <% unless @project.boards.first.topics.count == 0 %>
+
(<%= @project.boards.first.topics.count %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:project_module_boards_post), project_boards_path(@project, :flag => true), :layout => 'base_projects', :class => "subnav_green ml105" %>
+ <% end %>
+
+<% end%>
+<% unless @project.enabled_modules.where("name = 'files'").empty? %>
+
+ <%= link_to l(:project_module_files), project_files_path(@project), :class => "f14 c_blue02" %>
+ <% unless attaments_num == 0 %>
+
(<%= attaments_num %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:label_upload_source), project_files_path(@project,:flag => true), :class => "subnav_green ml95" %>
+ <% end %>
+
+<% end %>
+<%# --版本库被设置成私有、module中设置不显示、没有创建版本库 三种情况不显示-- %>
+<% if visible_repository?(@project) %>
+
+ <%= link_to l(:project_module_repository), {:controller => 'repositories', :action => 'show', :id => @project.id}, :class => "f14 c_blue02" %>
+
(<%= @project.repositories.count %>)
+
+<% end %>
+
+
<%= l(:label_project_more) %>
+
+ <%= render 'projects/tools_expand' %>
+
\ No newline at end of file
diff --git a/app/views/projects/_friend_group.html.erb b/app/views/projects/_friend_group.html.erb
new file mode 100644
index 000000000..dca5473f7
--- /dev/null
+++ b/app/views/projects/_friend_group.html.erb
@@ -0,0 +1,29 @@
+<% attaments_num = @project.attachments.count+Attachment.where(["`container_type` = 'Version' and `container_id` in (?)",@project.versions.map{ |v| v.id}]).all.count %>
+
+<% unless @project.enabled_modules.where("name = 'boards'").empty? %>
+
+ <%= link_to l(:project_module_boards), project_boards_path(@project), :class => "f14 c_blue02" %>
+ <% unless @project.boards.first.topics.count == 0 %>
+
(<%= @project.boards.first.topics.count %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:project_module_boards_post), project_boards_path(@project, :flag => true), :layout => 'base_projects', :class => "subnav_green ml105" %>
+ <% end %>
+
+<% end%>
+<% unless @project.enabled_modules.where("name = 'files'").empty? %>
+
+ <%= link_to l(:project_module_files), project_files_path(@project), :class => "f14 c_blue02" %>
+ <% unless attaments_num == 0 %>
+
(<%= attaments_num %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:label_upload_source), project_files_path(@project,:flag => true), :class => "subnav_green ml95" %>
+ <% end %>
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/projects/_research_team.html.erb b/app/views/projects/_research_team.html.erb
new file mode 100644
index 000000000..b2b0e3c33
--- /dev/null
+++ b/app/views/projects/_research_team.html.erb
@@ -0,0 +1,40 @@
+<% attaments_num = @project.attachments.count+Attachment.where(["`container_type` = 'Version' and `container_id` in (?)",@project.versions.map{ |v| v.id}]).all.count %>
+
+<% unless @project.enabled_modules.where("name = 'issue_tracking'").empty? %>
+
+ <%= link_to l(:label_issue_tracking), project_issues_path(@project), :class => "f14 c_blue02" %>
+ <% unless @project.issues.count == 0 %>
+
(<%= @project.issues.visible.all.count %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:label_release_issue), new_project_issue_path(@project) , :class => "subnav_green" %>
+ <% end %>
+
+<% end %>
+<% unless @project.enabled_modules.where("name = 'boards'").empty? %>
+
+ <%= link_to l(:project_module_boards), project_boards_path(@project), :class => "f14 c_blue02" %>
+ <% unless @project.boards.first.topics.count == 0 %>
+
(<%= @project.boards.first.topics.count %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:project_module_boards_post), project_boards_path(@project, :flag => true), :layout => 'base_projects', :class => "subnav_green ml105" %>
+ <% end %>
+
+<% end%>
+<% unless @project.enabled_modules.where("name = 'files'").empty? %>
+
+ <%= link_to l(:project_module_files), project_files_path(@project), :class => "f14 c_blue02" %>
+ <% unless attaments_num == 0 %>
+
(<%= attaments_num %>)
+ <% end %>
+ <% if User.current.member_of?(@project) %>
+ <%= link_to "+"+l(:label_upload_source), project_files_path(@project,:flag => true), :class => "subnav_green ml95" %>
+ <% end %>
+
+<% end%>
\ No newline at end of file
diff --git a/app/views/projects/settings.html.erb b/app/views/projects/settings.html.erb
index 25ec1c4d5..e70e20cef 100644
--- a/app/views/projects/settings.html.erb
+++ b/app/views/projects/settings.html.erb
@@ -1,6 +1,6 @@
@@ -21,7 +21,7 @@
-
+
<% show_memu = show_project_memu User.current%>
diff --git a/app/views/school/index.html.erb b/app/views/school/index.html.erb
index 00f419aab..cdd87e723 100644
--- a/app/views/school/index.html.erb
+++ b/app/views/school/index.html.erb
@@ -53,7 +53,7 @@
}
$.ajax({
type :"POST",
- url :prefix + '/school/search_school/?key_word='+encodeURIComponent(value)+'&province='+province,
+ url :prefix + '/school/search_school/?key_word='+encodeURIComponent(value)+'&province='+encodeURIComponent(province),
data :'text',
success: function(data){
$("#schoollist").html(data);
diff --git a/app/views/welcome/_course_list.html.erb b/app/views/welcome/_course_list.html.erb
index 0d979c769..111c0abb1 100644
--- a/app/views/welcome/_course_list.html.erb
+++ b/app/views/welcome/_course_list.html.erb
@@ -5,13 +5,13 @@
-
+
<% unless course.is_public == 1 %>
<%= l(:label_private) %>
<% end %>
- <%= link_to(course.name.truncate(25, omission: '...')+":", course_path(course.id), :class => "d-g-blue d-p-project-name", :title => "#{course.name}") %>
+ <%= link_to(course.name+":", course_path(course.id), :class => "d-g-blue d-p-project-name", :title => "#{course.name}") %>
-
+
<%= link_to(course.try(:teacher).try(:realname).truncate(6, omission: '...'), user_path(course.teacher)) %>
<%#=course.try(:teacher).try(:name)%>
diff --git a/app/views/words/destroy.js.erb b/app/views/words/destroy.js.erb
index 43da9a7d8..dabd3a8c7 100644
--- a/app/views/words/destroy.js.erb
+++ b/app/views/words/destroy.js.erb
@@ -5,6 +5,8 @@
$('#jours_count').html("<%= @jours_count %>");
<% elsif @course && @jours_count%>
$('#course_jour_count').html("(<%= @jours_count %>)");
+ <% elsif @user && @jours_count%>
+ $('#jour_count').html("<%= @jours_count %>");
<% end %>
var destroyedItem = $('#word_li_<%=@journal_destroyed.id%>')
destroyedItem.fadeOut(600,function(){
diff --git a/config/locales/zh.yml b/config/locales/zh.yml
index a91faac0f..24702ad46 100644
--- a/config/locales/zh.yml
+++ b/config/locales/zh.yml
@@ -393,6 +393,7 @@ zh:
label_document_added: 文档已添加
label_forum_message_added: 贴吧发帖成功
label_forum_add: 贴吧创建成功
+ label_forum_reply: 贴吧回复成功
label_message_reply: 回帖人
label_document_public_info: (打钩为公开,不打钩则不公开,若不公开,仅项目成员可见该文档。)
label_role: 角色
diff --git a/config/routes.rb b/config/routes.rb
index ae87c6a65..411386afc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -715,6 +715,7 @@ RedmineApp::Application.routes.draw do
collection do
match "getattachtype", :via => [:get, :post]
match "search",:via => [:post,:get]
+ match "searchone4reload",:via => [:post,:get]
match "search_tag_attachment", :via => [:post,:get]
end
member do
diff --git a/db/schema.rb b/db/schema.rb
index 601963956..e3828b0be 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -541,7 +541,6 @@ ActiveRecord::Schema.define(:version => 20150514133640) do
t.integer "is_teacher_score", :default => 0
end
- add_index "homework_attaches", ["bid_id"], :name => "bid_id"
add_index "homework_attaches", ["bid_id"], :name => "index_homework_attaches_on_bid_id"
create_table "homework_evaluations", :force => true do |t|
@@ -556,9 +555,7 @@ ActiveRecord::Schema.define(:version => 20150514133640) do
t.integer "bid_id"
end
- add_index "homework_for_courses", ["bid_id"], :name => "bid_id"
add_index "homework_for_courses", ["bid_id"], :name => "index_homework_for_courses_on_bid_id"
- add_index "homework_for_courses", ["course_id"], :name => "course_id"
add_index "homework_for_courses", ["course_id"], :name => "index_homework_for_courses_on_course_id"
create_table "homework_users", :force => true do |t|
@@ -1163,14 +1160,12 @@ ActiveRecord::Schema.define(:version => 20150514133640) do
create_table "students_for_courses", :force => true do |t|
t.integer "student_id"
t.integer "course_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "student_idCopy"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
end
add_index "students_for_courses", ["course_id"], :name => "index_students_for_courses_on_course_id"
add_index "students_for_courses", ["student_id"], :name => "index_students_for_courses_on_student_id"
- add_index "students_for_courses", ["student_id"], :name => "student_id"
create_table "taggings", :force => true do |t|
t.integer "tag_id"
diff --git a/lib/redmine/notifiable.rb b/lib/redmine/notifiable.rb
index 42a81980f..57cc86225 100644
--- a/lib/redmine/notifiable.rb
+++ b/lib/redmine/notifiable.rb
@@ -20,8 +20,8 @@ module Redmine
notifications << Notifiable.new('message_posted')
notifications << Notifiable.new('wiki_content_added')
notifications << Notifiable.new('wiki_content_updated')
- notifications << Notifiable.new('forum_add')
- notifications << Notifiable.new('forum_message_added', 'forum_add')
+ notifications << Notifiable.new('forum_reply')
+ notifications << Notifiable.new('forum_message_added', 'forum_reply')
notifications
end
end
diff --git a/public/javascripts/project.js b/public/javascripts/project.js
index 70888e5d0..0a04b2a7b 100644
--- a/public/javascripts/project.js
+++ b/public/javascripts/project.js
@@ -384,4 +384,45 @@ function submitProjectBoard()
{
$("#message-form").submit();
}
-}
\ No newline at end of file
+}
+
+//cookie记忆html区块 显示/隐藏 的代码 start
+$(function(){
+ var personalized_expand_key = "personalized_expand";
+ function personalized_init(){
+ var personalized_map = cookieget(personalized_expand_key);
+ if(personalized_map!=false){
+ personalized_map = JSON.parse(personalized_map);
+ $("*[nhtype='toggle4cookie']").each(function(){
+ var personalized_id=$(this).data('id');
+ var val = personalized_map[personalized_id];
+ if(val!=undefined && val!=$(this).data('val')){
+ personalized_click($(this),0);
+ }
+ });
+ }
+ }
+ function personalized_click(obj,timeout){
+ var target = $(obj.data('target'));
+ var oldval = obj.data('val');
+ var val='';
+ if(oldval=='expand'){val='retract';}else{val='expand';}
+ obj.data('val',val);
+ var personalized_map = cookieget(personalized_expand_key);
+ if(personalized_map == false){
+ personalized_map={};
+ }else{
+ personalized_map = JSON.parse(personalized_map);
+ }
+ var personalized_id=obj.data('id');
+ personalized_map[personalized_id]=val;
+ cookiesave(personalized_expand_key,JSON.stringify(personalized_map));
+ target.toggle(timeout);
+ }
+ $("*[nhtype='toggle4cookie']").click(function(){
+ personalized_click($(this),500);
+ });
+
+ personalized_init();
+});
+//cookie记忆html区块 显示/隐藏 的代码 end
\ No newline at end of file
diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css
index c0ad5f93c..5c586b757 100644
--- a/public/stylesheets/application.css
+++ b/public/stylesheets/application.css
@@ -1904,6 +1904,18 @@ input.autocomplete.ajax-loading {
background-image: url(../images/loading.gif);
}
+.private_project {
+ position: relative;
+ bottom: 2px;
+ text-transform: uppercase;
+ background: #d22;
+ color: #fff;
+ font-weight: bold;
+ padding: 0px 2px 0px 2px;
+ font-size: 60%;
+ margin-right: 2px;
+ border-radius: 2px;
+}
/***** Flash & error messages ****/
#errorExplanation, div.flash, .nodata, .warning, .conflict {
padding: 4px 4px 4px 30px;
diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css
index 4624b26c9..586704d16 100644
--- a/public/stylesheets/public.css
+++ b/public/stylesheets/public.css
@@ -177,6 +177,7 @@ a:hover.blue_u_btn{background:#64bdd9; color:#fff;}
.green_btn_cir{ background:#28be6c; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal;font-size:12px;white-space:nowrap;}
.blue_btn_cir{ background:#3498db; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal;font-size:12px;white-space:nowrap;}
.orange_btn_cir{ background:#e67e22; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal; font-size:12px;white-space:nowrap;}
+.bgreen_btn_cir{ background:#1abc9c; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal; font-size:12px;white-space:nowrap;}
/* commonpic */
.pic_date{ display:block; background:url(../images/new_project/public_icon.png) -31px 0 no-repeat; width:16px; height:15px; float:left;}
.pic_add{ display:block; background:url(../images/new_project/public_icon.png) -31px -273px no-repeat; width:16px; height:15px; float:left;}