diff --git a/Gemfile b/Gemfile index 58ccbc011..72bd03c7b 100644 --- a/Gemfile +++ b/Gemfile @@ -50,10 +50,10 @@ gem 'elasticsearch-model' gem 'elasticsearch-rails' #rails 3.2.22.2 bug - gem "test-unit", "~>3.0" + # gem "test-unit", "~>3.0" ### profile - gem 'oneapm_rpm' + # gem 'oneapm_rpm' group :development do gem 'grape-swagger' diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 0b6a73440..9dd6e6358 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -1,15 +1,19 @@ +# encoding: utf-8 # 如果你对改模块任何功能不清楚,请不要随便改 # @Hjqreturn class PullRequestsController < ApplicationController before_filter :authorize_logged before_filter :find_project_and_repository - before_filter :connect_gitlab, :only => [:index, :show, :create, :accept_pull_request, :pull_request_commits, :pull_request_changes, :new, - :update_pull_request, :pull_request_comments, :create_pull_request_comment, :compare_pull_request] + before_filter :connect_gitlab, :only => [:index, :show, :create, :accept_pull_request, :pull_request_commits, :pull_request_changes, :new, :update_pull_request, :pull_request_comments, :create_pull_request_comment, :compare_pull_request] + before_filter :member_allowed, :only => [:new, :create] + before_filter :manager_allowed, :only => [:accept_pull_request] layout "base_projects" include PullRequestsHelper include ApplicationHelper + require 'ostruct' + # 返回json格式 def index # project_menu_type 为了控制base顶部导航 @@ -92,7 +96,7 @@ class PullRequestsController < ApplicationController if compare_pull_request(source_branch, target_project_id, target_branch) # 如果传送了目标项目ID即向fork源项目发送请求 # if params[:forked_project_id] && params[:source_project] == "forked_project_name" - if !params[:target_project_id].blank? + if !params[:target_project_id].blank? && params[:target_project_id].to_i != @project.id target_project_id = params[:forked_project_id].to_i request = @g.create_merge_request(@project.gpid, title, User.current.gid, :description => description, :source_branch => source_branch, :target_branch => target_branch, :target_project_id => target_project_id) @fork_project_name = Project.find(params[:target_project_id]).try(:name) @@ -117,8 +121,14 @@ class PullRequestsController < ApplicationController format.js{redirect_to new_project_pull_request_path(:show_tip => tip)} end end + rescue Gitlab::Error::Forbidden => e + @message = l(:label_pull_request_forbidden) rescue Gitlab::Error::Conflict => e - @message = e.message + @message = l(:label_pull_request_conflic) + rescue Gitlab::Error::NotFound => e + @message = l(:label_pull_request_notfound) + rescue Exception => e + puts e end end @@ -278,23 +288,38 @@ class PullRequestsController < ApplicationController # id (required) - The ID of a project # merge_request_id (required) - The ID of MR def pull_request_changes - begin @type = params[:type] @changes = @g.merge_request_changes(@project.gpid, params[:id]).try(:changes) - @changes_count = @changes.count + + + + @changes_count = @changes.count @limit = 10 @is_remote = true @count = @changes_count @pages = Paginator.new @count, @limit, params['page'] || 1 @offset ||= @pages.offset @changes = paginateHelper @changes, 10 - rescue Exception => e - @message = e.message - end + end private + # post 相关操作权限控制 + # 项目管理员可操作 + def manager_allowed + unless is_project_manager?(User.current.id, @project.id) + return render_403 + end + end + + # 项目成员可操作 + def member_allowed + unless User.current.member_of?(@project) + return render_403 + end + end + def send_message user_id, project_id, title self.forge_acts << ForgeMessage.new(:user_id => user_id, :project_id => project_id, :title => title) end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 29176550a..f932748af 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -49,6 +49,7 @@ class RepositoriesController < ApplicationController helper :repositories include RepositoriesHelper helper :project_score + require 'ostruct' #@root_path = RepositoriesHelper::ROOT_PATH # require 'net/ssh' @@ -580,8 +581,12 @@ update def commit_diff # 顶部导航 @project_menu_type = 5 - @commit_diff = @g.commit_diff(@project.gpid, params[:changeset]) + diff = ActiveSupport::JSON.decode(@commit_diff.to_json).first + diff = OpenStruct.new(diff) + @diff_file = Trustie::Gitlab::Diff::File.new(diff) + + @commit_details = @g.commit(@project.gpid, params[:changeset]) render :layout => 'base_projects' end diff --git a/app/helpers/pull_requests_helper.rb b/app/helpers/pull_requests_helper.rb index 983ab848c..fd90e01d1 100644 --- a/app/helpers/pull_requests_helper.rb +++ b/app/helpers/pull_requests_helper.rb @@ -19,6 +19,11 @@ module PullRequestsHelper PullRequest.where(:pull_request_id => pull_request_id).first end + # 通过gitlab项目id获取Trustie项目的用户名 + def find_gitlab_project gitlab_project_id + Project.find_by_gpid(gitlab_project_id).owner.try(:show_name) + end + def get_state state case state when "open","reopened" diff --git a/app/models/comment.rb b/app/models/comment.rb index 27a917b93..9a87201dc 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -40,7 +40,7 @@ class Comment < ActiveRecord::Base belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' validates_presence_of :commented, :author, :comments safe_attributes 'comments','parent_id','reply_id','comments_count' - after_create :send_mail, :act_as_system_message, :act_as_student_score + after_create :act_as_system_message, :act_as_student_score #:send_mail, after_destroy :down_course_score def act_as_system_message @@ -55,11 +55,11 @@ class Comment < ActiveRecord::Base # end end else # 项目相关 - if self.author_id != self.commented.author_id - self.forge_messages << ForgeMessage.new(:user_id => self.commented.author_id, :project_id => self.commented.project.id, :viewed => false) - #content = strip_html self.comments.html_safe, 200 - #ws.comment_template self.commented.author_id, "blog_comment", self.id, "#{l(:label_news_comment_template)}", self.author.try(:realname), format_time(self.created_on), content - end + # if self.author_id != self.commented.author_id + # self.forge_messages << ForgeMessage.new(:user_id => self.commented.author_id, :project_id => self.commented.project.id, :viewed => false) + # #content = strip_html self.comments.html_safe, 200 + # #ws.comment_template self.commented.author_id, "blog_comment", self.id, "#{l(:label_news_comment_template)}", self.author.try(:realname), format_time(self.created_on), content + # end end end diff --git a/app/models/journals_for_message_observer.rb b/app/models/journals_for_message_observer.rb index 0db2e0043..a576e605f 100644 --- a/app/models/journals_for_message_observer.rb +++ b/app/models/journals_for_message_observer.rb @@ -1,7 +1,7 @@ # Added by young class JournalsForMessageObserver < ActiveRecord::Observer def after_create(journals_for_message) - Mailer.run.journals_for_message_add(User.current, journals_for_message) + # Mailer.run.journals_for_message_add(User.current, journals_for_message) end end diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 8d8fa7085..c37004066 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -109,40 +109,40 @@ class Mailer < ActionMailer::Base # 邀请未注册用户加入项目 # 功能: 在加入项目的同时自动注册用户 def send_invite_in_project(email, project, invitor, first_name, last_name, gender) - @email = email - @subject = "#{invitor.name} #{l(:label_invite_project)} #{project.name} " - @password = newpass(6) - - login = email - login = login.sub(/%40/,'@') - us = UsersService.new - # 自动激活用户 - user = us.register_auto(login, email, @password, first_name, last_name, gender) - InviteList.create(:user_id => user.id, :project_id => project.id, :mail =>email) - User.current = user unless User.current.nil? - @user = user - @token = Token.get_token_from_user(user, 'autologin') - @project_url = url_for(:controller => 'projects', :action => 'member', :id => project.id, :mail => true, :token => @token.value) - mail :to => email, :subject => @subject + # @email = email + # @subject = "#{invitor.name} #{l(:label_invite_project)} #{project.name} " + # @password = newpass(6) + # + # login = email + # login = login.sub(/%40/,'@') + # us = UsersService.new + # # 自动激活用户 + # user = us.register_auto(login, email, @password, first_name, last_name, gender) + # InviteList.create(:user_id => user.id, :project_id => project.id, :mail =>email) + # User.current = user unless User.current.nil? + # @user = user + # @token = Token.get_token_from_user(user, 'autologin') + # @project_url = url_for(:controller => 'projects', :action => 'member', :id => project.id, :mail => true, :token => @token.value) + # mail :to => email, :subject => @subject end # 邀请已注册的用户加入项目 def request_member_to_project(email, project, invitor) - @subject = "#{invitor.name} #{l(:label_invite_project)}: #{project.name} " - user = User.find_by_mail(email.to_s) - @invitor_name = "#{invitor.name}" - @project_name = "#{project.name}" - @user = user - @project = project - if InviteList.where("project_id= ? and user_id =? and mail =?", project.id, @user.id, email).first.nil? - InviteList.create(:user_id => user.id, :project_id => project.id, :mail => email) - end - @token = Token.get_token_from_user(user, 'autologin') - @project_url = url_for(:controller => 'projects', :action => 'member', :id => project.id, :user_id => user.id, :mail => true, :token => @token.value) - # 发送消息邀请 - send_message_request_member(user,project) + # @subject = "#{invitor.name} #{l(:label_invite_project)}: #{project.name} " + # user = User.find_by_mail(email.to_s) + # @invitor_name = "#{invitor.name}" + # @project_name = "#{project.name}" + # @user = user + # @project = project + # if InviteList.where("project_id= ? and user_id =? and mail =?", project.id, @user.id, email).first.nil? + # InviteList.create(:user_id => user.id, :project_id => project.id, :mail => email) # end - mail :to => email, :subject => @subject + # @token = Token.get_token_from_user(user, 'autologin') + # @project_url = url_for(:controller => 'projects', :action => 'member', :id => project.id, :user_id => user.id, :mail => true, :token => @token.value) + # # 发送消息邀请 + # send_message_request_member(user,project) + # # end + # mail :to => email, :subject => @subject end # 邀请信息消息 注:forge_message_id 为邀请人ID(特殊情况) @@ -293,23 +293,23 @@ class Mailer < ActionMailer::Base # 公共讨论区发帖、回帖添加邮件发送信息 def forum_message_added(memo) - @memo = memo - redmine_headers 'Memo' => memo.id - @forum = memo.forum - @author = memo.author - @forum_url = url_for(:controller => 'forums', :action => 'show', :id => @forum.id) - @issue_author_url = url_for(user_activities_url(@author)) - recipients ||= [] - #将帖子创建者邮箱地址加入数组 - recipients << @forum.creator.mail - #回复人邮箱地址加入数组 - recipients << @author.mail - # cc = wiki_content.page.wiki.watcher_recipients - recipients - - @memo_url = url_for(forum_memo_url(@forum, (@memo.parent_id.nil? ? @memo : @memo.parent_id))) - mail :to => recipients, - :subject => "[ #{l(:label_message_plural)} : #{memo.subject} #{l(:label_memo_create_succ)}]", - :filter => true + # @memo = memo + # redmine_headers 'Memo' => memo.id + # @forum = memo.forum + # @author = memo.author + # @forum_url = url_for(:controller => 'forums', :action => 'show', :id => @forum.id) + # @issue_author_url = url_for(user_activities_url(@author)) + # recipients ||= [] + # #将帖子创建者邮箱地址加入数组 + # recipients << @forum.creator.mail + # #回复人邮箱地址加入数组 + # recipients << @author.mail + # # cc = wiki_content.page.wiki.watcher_recipients - recipients + # + # @memo_url = url_for(forum_memo_url(@forum, (@memo.parent_id.nil? ? @memo : @memo.parent_id))) + # mail :to => recipients, + # :subject => "[ #{l(:label_message_plural)} : #{memo.subject} #{l(:label_memo_create_succ)}]", + # :filter => true end # Builds a Mail::Message object used to email recipients of the added journals for message. @@ -318,64 +318,64 @@ class Mailer < ActionMailer::Base # 直接留言后 reply_id,m_parent_id 为空,相对应的at_user取值为nil def journals_for_message_add(user, journals_for_message) - @user = journals_for_message.user # 留言人 - @mail = journals_for_message.jour if journals_for_message.at_user.nil? # 留言 - @mail = journals_for_message.at_user if journals_for_message.at_user - @message = journals_for_message.notes - @title = "#@user #{t(:label_leave_your_message, :locale => 'zh')}" - @issue_author_url = url_for(user_activities_url(@user)) - @url = case journals_for_message.jour.class.to_s.to_sym # 判断留言的对象所属类型 - # when :Bid - # course_for_bid_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") - when :Project - return -1 if journals_for_message.jour.project_type == Project::ProjectType_project - project_feedback_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") - when :Course - course_feedback_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") - when :Contest - show_contest_contest_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") - when :User - user_newfeedback_user_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") - else - Rails.logger.error "[Builds a Mail::Message ERROR] journalsForMessage's jour is unkown type, journalsForMessage.id = #{journals_for_message.id}" - return -1 - end - - # 验证用户的收取邮件的方式 - recipients ||= [] - recipients1 ||= [] - recipients1 = @mail.mail - recipients = journals_for_message.jour.author.mail - - # modify by nwb - #如果是直接留言并且留言对象是课程 - if !journals_for_message.at_user && journals_for_message.jour.class.to_s.to_sym == :Course - course = journals_for_message.jour - @author = journals_for_message.user - #课程的教师 - @members = course_all_member journals_for_message.jour - #收件人邮箱 - @recipients ||= [] - @members.each do |teacher| - @recipients << teacher.user.mail - end - mail :to => @recipients, - :subject => "#{l(:label_your_course)}#{journals_for_message.jour.name}#{l(:label_have_message)} ", - :filter => true - # elsif journals_for_message.jour.class.to_s.to_sym == :Bid + # @user = journals_for_message.user # 留言人 + # @mail = journals_for_message.jour if journals_for_message.at_user.nil? # 留言 + # @mail = journals_for_message.at_user if journals_for_message.at_user + # @message = journals_for_message.notes + # @title = "#@user #{t(:label_leave_your_message, :locale => 'zh')}" + # @issue_author_url = url_for(user_activities_url(@user)) + # @url = case journals_for_message.jour.class.to_s.to_sym # 判断留言的对象所属类型 + # # when :Bid + # # course_for_bid_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") + # when :Project + # return -1 if journals_for_message.jour.project_type == Project::ProjectType_project + # project_feedback_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") + # when :Course + # course_feedback_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") + # when :Contest + # show_contest_contest_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") + # when :User + # user_newfeedback_user_url(journals_for_message.jour, anchor: "word_li_#{journals_for_message.id}") + # else + # Rails.logger.error "[Builds a Mail::Message ERROR] journalsForMessage's jour is unkown type, journalsForMessage.id = #{journals_for_message.id}" + # return -1 + # end + # + # # 验证用户的收取邮件的方式 + # recipients ||= [] + # recipients1 ||= [] + # recipients1 = @mail.mail + # recipients = journals_for_message.jour.author.mail + # + # # modify by nwb + # #如果是直接留言并且留言对象是课程 + # if !journals_for_message.at_user && journals_for_message.jour.class.to_s.to_sym == :Course + # course = journals_for_message.jour + # @author = journals_for_message.user + # #课程的教师 + # @members = course_all_member journals_for_message.jour + # #收件人邮箱 + # @recipients ||= [] + # @members.each do |teacher| + # @recipients << teacher.user.mail + # end + # mail :to => @recipients, + # :subject => "#{l(:label_your_course)}#{journals_for_message.jour.name}#{l(:label_have_message)} ", + # :filter => true + # # elsif journals_for_message.jour.class.to_s.to_sym == :Bid + # # if !journals_for_message.jour.author.notify_about? journals_for_message + # # return -1 + # # end + # # + # # mail :to => recipients, :subject => @title,:filter => true + # elsif journals_for_message.jour.class.to_s.to_sym == :Contest # if !journals_for_message.jour.author.notify_about? journals_for_message # return -1 # end - # # mail :to => recipients, :subject => @title,:filter => true - elsif journals_for_message.jour.class.to_s.to_sym == :Contest - if !journals_for_message.jour.author.notify_about? journals_for_message - return -1 - end - mail :to => recipients, :subject => @title,:filter => true - else - mail :to => recipients1, :subject => @title,:filter => true - end + # else + # mail :to => recipients1, :subject => @title,:filter => true + # end end @@ -485,16 +485,16 @@ class Mailer < ActionMailer::Base # 用户申请加入项目邮件通知 def applied_project(applied) - @project =applied.project - redmine_headers 'Project' => @project, - 'User' => applied.user - @user = applied.user - recipients = @project.manager_recipients - s = l(:text_applied_project, :id => "##{@user.show_name}", :project => @project.name) - @token = Token.get_token_from_user(@user, 'autologin') - @applied_url = url_for(:controller => 'projects', :action => 'settings', :id => @project.id,:tab=>'members') - mail :to => recipients, - :subject => s + # @project =applied.project + # redmine_headers 'Project' => @project, + # 'User' => applied.user + # @user = applied.user + # recipients = @project.manager_recipients + # s = l(:text_applied_project, :id => "##{@user.show_name}", :project => @project.name) + # @token = Token.get_token_from_user(@user, 'autologin') + # @applied_url = url_for(:controller => 'projects', :action => 'settings', :id => @project.id,:tab=>'members') + # mail :to => recipients, + # :subject => s end def reminder(user, issues, days) @@ -555,14 +555,14 @@ class Mailer < ActionMailer::Base # document_added(document) => Mail::Message object # Mailer.document_added(document).deliver => sends an email to the document's project recipients def document_added(document) - redmine_headers 'Project' => document.project.identifier - @author = User.current - @document = document - @issue_author_url = url_for(user_activities_url(@author)) - @document_url = url_for(:controller => 'documents', :action => 'show', :id => document) - mail :to => document.recipients, - :subject => "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}", - :filter => true + # redmine_headers 'Project' => document.project.identifier + # @author = User.current + # @document = document + # @issue_author_url = url_for(user_activities_url(@author)) + # @document_url = url_for(:controller => 'documents', :action => 'show', :id => document) + # mail :to => document.recipients, + # :subject => "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}", + # :filter => true end # Builds a Mail::Message object used to email recipients of a project when an attachements are added. @@ -571,54 +571,54 @@ class Mailer < ActionMailer::Base # attachments_added(attachments) => Mail::Message object # Mailer.attachments_added(attachments).deliver => sends an email to the project's recipients def attachments_added(attachments) - container = attachments.first.container - added_to = '' - added_to_url = '' - @author = attachments.first.author - @issue_author_url = url_for(user_activities_url(@author)) - case container.class.name - when 'Project' - added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container) - added_to = "#{l(:label_project)}: #{container}" - recipients = container.notified_users.select { |user| user.allowed_to?(:view_files, container) }.collect { |u| u.mail } - when 'Course' - added_to_url = url_for(:controller => 'files', :action => 'index', :course_id => container) - added_to = "#{l(:label_course)}: #{container.name}" - recipients = container.notified_users.select { |user| user.allowed_to?(:view_files, container) }.collect { |u| u.mail } - when 'Version' - added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container.project) - added_to = "#{l(:label_version)}: #{container.name}" - recipients = container.project.notified_users.select { |user| user.allowed_to?(:view_files, container.project) }.collect { |u| u.mail } - when 'Document' - added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id) - added_to = "#{l(:label_document)}: #{container.title}" - recipients = container.recipients - end - if container.class.name == 'Course' - redmine_headers 'Course' => container.id - @attachments = attachments - @added_to = added_to - @added_to_url = added_to_url - mail :to => recipients, - :subject => "[#{container.name}] #{l(:label_attachment_new)}", - :filter => true - elsif container.class.name == 'Project' - redmine_headers 'Project' => container.id - @attachments = attachments - @added_to = added_to - @added_to_url = added_to_url - mail :to => recipients, - :subject => "[#{container.name}] #{l(:label_attachment_new)}", - :filter => true - else - redmine_headers 'Project' => container.project.identifier - @attachments = attachments - @added_to = added_to - @added_to_url = added_to_url - mail :to => recipients, - :subject => "[#{container.project.name}] #{l(:label_attachment_new)}", - :filter => true - end + # container = attachments.first.container + # added_to = '' + # added_to_url = '' + # @author = attachments.first.author + # @issue_author_url = url_for(user_activities_url(@author)) + # case container.class.name + # when 'Project' + # added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container) + # added_to = "#{l(:label_project)}: #{container}" + # recipients = container.notified_users.select { |user| user.allowed_to?(:view_files, container) }.collect { |u| u.mail } + # when 'Course' + # added_to_url = url_for(:controller => 'files', :action => 'index', :course_id => container) + # added_to = "#{l(:label_course)}: #{container.name}" + # recipients = container.notified_users.select { |user| user.allowed_to?(:view_files, container) }.collect { |u| u.mail } + # when 'Version' + # added_to_url = url_for(:controller => 'files', :action => 'index', :project_id => container.project) + # added_to = "#{l(:label_version)}: #{container.name}" + # recipients = container.project.notified_users.select { |user| user.allowed_to?(:view_files, container.project) }.collect { |u| u.mail } + # when 'Document' + # added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id) + # added_to = "#{l(:label_document)}: #{container.title}" + # recipients = container.recipients + # end + # if container.class.name == 'Course' + # redmine_headers 'Course' => container.id + # @attachments = attachments + # @added_to = added_to + # @added_to_url = added_to_url + # mail :to => recipients, + # :subject => "[#{container.name}] #{l(:label_attachment_new)}", + # :filter => true + # elsif container.class.name == 'Project' + # redmine_headers 'Project' => container.id + # @attachments = attachments + # @added_to = added_to + # @added_to_url = added_to_url + # mail :to => recipients, + # :subject => "[#{container.name}] #{l(:label_attachment_new)}", + # :filter => true + # else + # redmine_headers 'Project' => container.project.identifier + # @attachments = attachments + # @added_to = added_to + # @added_to_url = added_to_url + # mail :to => recipients, + # :subject => "[#{container.project.name}] #{l(:label_attachment_new)}", + # :filter => true + # end end # Builds a Mail::Message object used to email recipients of a course when an homework are posted. @@ -650,15 +650,15 @@ class Mailer < ActionMailer::Base def news_added(news) if news.project - redmine_headers 'Project' => news.project.identifier - @author = news.author - @issue_author_url = url_for(user_activities_url(@author)) - message_id news - @news = news - @news_url = url_for(:controller => 'news', :action => 'show', :id => news) - mail :to => news.recipients, - :subject => "[#{news.project.name}] #{l(:label_news)}: #{news.title}", - :filter => true + # redmine_headers 'Project' => news.project.identifier + # @author = news.author + # @issue_author_url = url_for(user_activities_url(@author)) + # message_id news + # @news = news + # @news_url = url_for(:controller => 'news', :action => 'show', :id => news) + # mail :to => news.recipients, + # :subject => "[#{news.project.name}] #{l(:label_news)}: #{news.title}", + # :filter => true elsif news.course redmine_headers 'Course' => news.course.id @author = news.author @@ -681,17 +681,17 @@ class Mailer < ActionMailer::Base def news_comment_added(comment) news = comment.commented if news.project - redmine_headers 'Project' => news.project.identifier - @author = comment.author - @issue_author_url = url_for(user_activities_url(@author)) - message_id comment - @news = news - @comment = comment - @news_url = url_for(:controller => 'news', :action => 'show', :id => news) - mail :to => news.recipients, - :cc => news.watcher_recipients, - :subject => "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}", - :filter => true + # redmine_headers 'Project' => news.project.identifier + # @author = comment.author + # @issue_author_url = url_for(user_activities_url(@author)) + # message_id comment + # @news = news + # @comment = comment + # @news_url = url_for(:controller => 'news', :action => 'show', :id => news) + # mail :to => news.recipients, + # :cc => news.watcher_recipients, + # :subject => "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}", + # :filter => true elsif news.course redmine_headers 'Course' => news.course.id @author = comment.author @@ -714,37 +714,37 @@ class Mailer < ActionMailer::Base # message_posted(message) => Mail::Message object # Mailer.message_posted(message).deliver => sends an email to the recipients def message_posted(message) - if message.project - redmine_headers 'Project' => message.project.identifier, - 'Topic-Id' => (message.parent_id || message.id) - @author = message.author - @issue_author_url = url_for(user_activities_url(@author)) - message_id message - references message.parent unless message.parent.nil? - recipients = message.recipients - cc = ((message.root.watcher_recipients + message.board.watcher_recipients).uniq - recipients) - @message = message - @message_url = url_for(message.event_url) - mail :to => recipients, - :cc => cc, - :subject => "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}", - :filter => true - elsif message.course - redmine_headers 'Course' => message.course.id, - 'Topic-Id' => (message.parent_id || message.id) - @author = message.author - @issue_author_url = url_for(user_activities_url(@author)) - message_id message - references message.parent unless message.parent.nil? - recipients = message.course.notified_users.select { |user| user.allowed_to?(:view_files, message.course) }.collect { |u| u.mail } - cc = ((message.root.watcher_recipients + message.board.watcher_recipients).uniq - recipients) - @message = message - @message_url = url_for(message.event_url) - mail :to => recipients, - :cc => cc, - :subject => "[#{message.board.course.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}", - :filter => true - end + # if message.project + # redmine_headers 'Project' => message.project.identifier, + # 'Topic-Id' => (message.parent_id || message.id) + # @author = message.author + # @issue_author_url = url_for(user_activities_url(@author)) + # message_id message + # references message.parent unless message.parent.nil? + # recipients = message.recipients + # cc = ((message.root.watcher_recipients + message.board.watcher_recipients).uniq - recipients) + # @message = message + # @message_url = url_for(message.event_url) + # mail :to => recipients, + # :cc => cc, + # :subject => "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}", + # :filter => true + # elsif message.course + # redmine_headers 'Course' => message.course.id, + # 'Topic-Id' => (message.parent_id || message.id) + # @author = message.author + # @issue_author_url = url_for(user_activities_url(@author)) + # message_id message + # references message.parent unless message.parent.nil? + # recipients = message.course.notified_users.select { |user| user.allowed_to?(:view_files, message.course) }.collect { |u| u.mail } + # cc = ((message.root.watcher_recipients + message.board.watcher_recipients).uniq - recipients) + # @message = message + # @message_url = url_for(message.event_url) + # mail :to => recipients, + # :cc => cc, + # :subject => "[#{message.board.course.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}", + # :filter => true + # end end # Builds a Mail::Message object used to email the recipients of a project of the specified wiki content was added. @@ -753,20 +753,20 @@ class Mailer < ActionMailer::Base # wiki_content_added(wiki_content) => Mail::Message object # Mailer.wiki_content_added(wiki_content).deliver => sends an email to the project's recipients def wiki_content_added(wiki_content) - redmine_headers 'Project' => wiki_content.project.identifier, - 'Wiki-Page-Id' => wiki_content.page.id - @author = wiki_content.author - message_id wiki_content - recipients = wiki_content.recipients - cc = wiki_content.page.wiki.watcher_recipients - recipients - @wiki_content = wiki_content - @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', - :project_id => wiki_content.project, - :id => wiki_content.page.title) - mail :to => recipients, - :cc => cc, - :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_added, :id => wiki_content.page.pretty_title)}", - :filter => true + # redmine_headers 'Project' => wiki_content.project.identifier, + # 'Wiki-Page-Id' => wiki_content.page.id + # @author = wiki_content.author + # message_id wiki_content + # recipients = wiki_content.recipients + # cc = wiki_content.page.wiki.watcher_recipients - recipients + # @wiki_content = wiki_content + # @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', + # :project_id => wiki_content.project, + # :id => wiki_content.page.title) + # mail :to => recipients, + # :cc => cc, + # :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_added, :id => wiki_content.page.pretty_title)}", + # :filter => true end # Builds a Mail::Message object used to email the recipients of a project of the specified wiki content was updated. @@ -775,23 +775,23 @@ class Mailer < ActionMailer::Base # wiki_content_updated(wiki_content) => Mail::Message object # Mailer.wiki_content_updated(wiki_content).deliver => sends an email to the project's recipients def wiki_content_updated(wiki_content) - redmine_headers 'Project' => wiki_content.project.identifier, - 'Wiki-Page-Id' => wiki_content.page.id - @author = wiki_content.author - message_id wiki_content - recipients = wiki_content.recipients - cc = wiki_content.page.wiki.watcher_recipients + wiki_content.page.watcher_recipients - recipients - @wiki_content = wiki_content - @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', - :project_id => wiki_content.project, - :id => wiki_content.page.title) - @wiki_diff_url = url_for(:controller => 'wiki', :action => 'diff', - :project_id => wiki_content.project, :id => wiki_content.page.title, - :version => wiki_content.version) - mail :to => recipients, - :cc => cc, - :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_updated, :id => wiki_content.page.pretty_title)}", - :filter => true + # redmine_headers 'Project' => wiki_content.project.identifier, + # 'Wiki-Page-Id' => wiki_content.page.id + # @author = wiki_content.author + # message_id wiki_content + # recipients = wiki_content.recipients + # cc = wiki_content.page.wiki.watcher_recipients + wiki_content.page.watcher_recipients - recipients + # @wiki_content = wiki_content + # @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', + # :project_id => wiki_content.project, + # :id => wiki_content.page.title) + # @wiki_diff_url = url_for(:controller => 'wiki', :action => 'diff', + # :project_id => wiki_content.project, :id => wiki_content.page.title, + # :version => wiki_content.version) + # mail :to => recipients, + # :cc => cc, + # :subject => "[#{wiki_content.project.name}] #{l(:mail_subject_wiki_content_updated, :id => wiki_content.page.pretty_title)}", + # :filter => true end # Builds a Mail::Message object used to email the specified user their account information. diff --git a/app/models/memo.rb b/app/models/memo.rb index 793d534d4..f08e9afb2 100644 --- a/app/models/memo.rb +++ b/app/models/memo.rb @@ -81,7 +81,7 @@ class Memo < ActiveRecord::Base "parent_id", "replies_count" - after_create :add_author_as_watcher, :reset_counters!, :send_mail, :send_message,:create_memo_ealasticsearch_index + after_create :add_author_as_watcher, :reset_counters!, :send_message,:create_memo_ealasticsearch_index after_update :update_memo_ealasticsearch_index after_destroy :reset_counters!,:delete_kindeditor_assets,:delete_memo_ealasticsearch_index#,:down_user_score -- 公共区发帖暂不计入得分, # after_create :send_notification diff --git a/app/models/news.rb b/app/models/news.rb index dc47f66ac..f39352c94 100644 --- a/app/models/news.rb +++ b/app/models/news.rb @@ -65,7 +65,7 @@ class News < ActiveRecord::Base :author_key => :author_id acts_as_watchable - after_create :act_as_forge_activity, :act_as_course_activity, :add_author_as_watcher, :send_mail, :add_news_count, :act_as_student_score, :act_as_system_message,:delay_news_wechat_send,:delay_news_send + after_create :act_as_course_activity, :add_author_as_watcher, :send_mail, :add_news_count, :act_as_student_score,:delay_news_wechat_send, :delay_news_send after_update :update_activity after_destroy :delete_kindeditor_assets, :decrease_news_count, :delete_org_activities, :down_course_score diff --git a/app/models/user.rb b/app/models/user.rb index d6e4eb715..66a2cc5aa 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -82,7 +82,7 @@ class User < Principal #每日一报、一事一报、不报 MAIL_NOTIFICATION_OPTIONS = [ #['week', :label_user_mail_option_week], - ['day', :label_user_mail_option_day], + # ['day', :label_user_mail_option_day], ['all', :label_user_mail_option_all], ['none', :label_user_mail_option_none] ] diff --git a/app/views/pull_requests/_pull_request_changes.html.erb b/app/views/pull_requests/_pull_request_changes.html.erb index 5b85c72a4..f12783146 100644 --- a/app/views/pull_requests/_pull_request_changes.html.erb +++ b/app/views/pull_requests/_pull_request_changes.html.erb @@ -1,51 +1,31 @@ -<% if !@changes.blank? && @type == "3" %> -
-
-

改动了 <%= @changes_count %> 个文件

-
- -
- <% @changes.each do |change| %> -
- - <%= change['new_path'] %> - -
-
- - - <% line_num = diff_line_num(change['diff']) %> - <% diff_content = diff_content(change['diff']) %> - <% syntax_highlight_lines('new_path', Redmine::CodesetUtil.to_utf8_by_setting(diff_content)).each do |line| %> - - - <% if line[0,1] == "-" %> - - <% elsif line[0,1] == "+" %> - - <% else%> - - <% end %> - - <% line_num += 1 %> - <% end %> - -
- <%= line_num %> -
<%= line.html_safe %>
<%= line.html_safe %>
<%= line.html_safe %>
-
- <% end %> - -
-
- -
-
-
-<% end %> +<% if !@changes.blank? && @type == "3" %> +
+
+

改动了 <%= @changes_count %> 个文件

+
+ +
+ <% @changes.each do |change| %> +
+ + <%= change['new_path'] %> + +
+
+ <%= render :partial => 'repositories/change_diff', :locals => {:change => change} %> +
+ <% end %> + +
+
+ +
+
+
+<% end %> diff --git a/app/views/pull_requests/_pull_requests_list.html.erb b/app/views/pull_requests/_pull_requests_list.html.erb index 2258962a6..c594a2e56 100644 --- a/app/views/pull_requests/_pull_requests_list.html.erb +++ b/app/views/pull_requests/_pull_requests_list.html.erb @@ -14,10 +14,8 @@

由 <%= link_to get_user_by_login_and(request.author.try(:username)).try(:show_name), user_path(get_user_by_login_and(request.author.try(:username))), :class => "linkBlue2" %> 创建于<%= time_tag(request.created_at) %>前

<%= time_tag(request.updated_at) %>前更新 -

<%= @project.name+"/"+request.source_branch %>合并到<%= request.target_branch %>

+

<%= find_gitlab_project(request.source_project_id)+"/"+request.source_branch %>合并到<%= find_gitlab_project(request.target_project_id)+"/"+request.target_branch %>

<% end %> - - <% end %> \ No newline at end of file diff --git a/app/views/pull_requests/pull_request_changes.js.erb b/app/views/pull_requests/pull_request_changes.js.erb index 461cd3d06..19d03f06d 100644 --- a/app/views/pull_requests/pull_request_changes.js.erb +++ b/app/views/pull_requests/pull_request_changes.js.erb @@ -1 +1,2 @@ + $("#merge_record_3").html('<%= escape_javascript( render :partial => "pull_requests/pull_request_changes") %>'); \ No newline at end of file diff --git a/app/views/repositories/_change_diff.html.erb b/app/views/repositories/_change_diff.html.erb new file mode 100644 index 000000000..95126cd98 --- /dev/null +++ b/app/views/repositories/_change_diff.html.erb @@ -0,0 +1,50 @@ + + + + <% diff = ActiveSupport::JSON.decode(change.to_json) %> + <% diff = OpenStruct.new(diff) %> + <% @diff_file = Trustie::Gitlab::Diff::File.new(diff) %> + <% @diff_file.diff_lines.each_with_index do |line, index| %> + <% type = line.type %> + <% last_line = line.new_pos.to_s %> + <% line_old = line.old_pos.to_s %> + + <% if type.nil? || type == "match" %> + + + + + + <% else %> + <% old_line = type == 'new' ? ' '*4: line_old %> + <% new_line = type == 'old' ? ' '*4: last_line %> + + + + + + <% end %> + <% end %> + + + + + + +
+ <%= type == "match" ? "..." : line_old.center(4) %> + + <%= type == "match" ? "..." : last_line.center(4) %> + " > +
<%= Redmine::CodesetUtil.replace_invalid_utf8(line.text).html_safe %>
+
+ <%= old_line.to_s.center(4) %> + + <%= new_line.to_s.center(4) %> + +
<%= Redmine::CodesetUtil.replace_invalid_utf8(line.text).html_safe %>
+
+ ... + + ... +
\ No newline at end of file diff --git a/app/views/repositories/commit_diff.html.erb b/app/views/repositories/commit_diff.html.erb index 417158c7e..7693b385c 100644 --- a/app/views/repositories/commit_diff.html.erb +++ b/app/views/repositories/commit_diff.html.erb @@ -9,42 +9,14 @@
<%= @commit_details.message %>
- - - - - - - - - <% @commit_diff.each do |cd| %> + <% @commit_diff.each do |commit_diff| %>
- <%= cd.new_path %> + <%= commit_diff.new_path %>
- - - <% line_num = diff_line_num(cd.diff) %> - <% diff_content = diff_content(cd.diff) %> - <% syntax_highlight_lines(cd.new_path, Redmine::CodesetUtil.to_utf8_by_setting(diff_content)).each do |line| %> - - - <% if line[0,1] == "-" %> - - <% elsif line[0,1] == "+" %> - - <% else%> - - <% end %> - - <% line_num += 1 %> - <% end %> - -
- <%= line_num %> -
<%= line.html_safe %>
<%= line.html_safe %>
<%= line.html_safe %>
+ <%= render :partial => 'repositories/change_diff', :locals => {:change => commit_diff} %>
<% end %> diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 77e17a8b7..3eeb912f5 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -507,3 +507,7 @@ zh: label_done_ratio_endding: 已完成 label_done_ratio_doing: 未完成 + + label_pull_request_conflic: 您创建的Pull Request尚未被管理员接受或者关闭,不能重新创建 + label_pull_request_forbidden: 您没有权限进行该操作 + label_pull_request_notfound: 您操作的页面不存在或者已被删除 \ No newline at end of file diff --git a/config/wechat.yml.template b/config/wechat.yml.template deleted file mode 100644 index 734ed0e51..000000000 --- a/config/wechat.yml.template +++ /dev/null @@ -1,41 +0,0 @@ -default: &default -# corpid: "corpid" -# corpsecret: "corpsecret" -# agentid: 1 - - #production - appid: "wx8e1ab05163a28e37" - secret: "beb4d3bc4b32b3557811680835357841" - - token: "123456" - access_token: "1234567" - encrypt_mode: false # if true must fill encoding_aes_key - - #production - encoding_aes_key: "QGfP13YP4BbQGkkrlYuxpn4ZIDXpBJww4fxl8CObvNw" - jsapi_ticket: "C:/Users/[user_name]/wechat_jsapi_ticket" - - #template - binding_succ_notice: "jjpDrgFErnmkrE9tf2M3o0t31ZrJ7mr0YtuE_wyLaMc" - journal_notice: "uC1zAw4F2q6HTA3Pcj8VUO6wKKKiYFwnPJB4iXxpdoM" - homework_message_notice: "tCf7teCVqc2vl2LZ_hppIdWmpg8yLcrI8XifxYePjps" - class_notice: "MQ_mFupbXP-9jWbeHT3C5xqNBvPo8EIlNv4ULakSpJA" - create_class_notice: "2GtJJGzzNlNy2i0UrsjEDlvfSVIUXQfSo47stpcQAVw" - create_project_notice: "jYu0iimbDpgWYZaTLXioZe2lvqoWTdKnUPyphTJ1mxs" - project_review_notice: "kdb-8UlMjTc3z51Qcf8g2vY4i_nE4OGKZAucdQma_2E" - join_project_notice: "TtXvy0XMIQyCgpnXHhoB8t-x0QIfy-78gAJXsGf9afg" - project_issue_notice: "HP8JejOnkzmvFopTarc0l1Tp4bU9qnxzdH27x3186lI" - at_notice: "U3kqzgriCaqkPI9qX0NDQOInJ5hiwHCz6wgTsPysSx4" - rebind_notice: "OYsiECfqUlHKlzF_X-pz_xsGh_vAAUunX0jYRdHlyFU" - - auto_openid_url_1: "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8e1ab05163a28e37&redirect_uri=https://www.trustie.net/wechat/user_activities" - auto_openid_url_2: "&response_type=code&scope=snsapi_base&state=" - auto_openid_url_3: "&connect_redirect=1#wechat_redirect" -production: - <<: *default - -development: - <<: *default - -test: - <<: *default diff --git a/lib/tasks/email.rake b/lib/tasks/email.rake index 5126d7a69..cdd0f8347 100644 --- a/lib/tasks/email.rake +++ b/lib/tasks/email.rake @@ -197,10 +197,10 @@ END_DESC desc "send a email for day" task :day => :environment do - users = User.where(mail_notification: 'day') - users.each do |user| - Mailer.run.send_for_user_activities(user, Date.today, 1) - end + # users = User.where(mail_notification: 'day') + # users.each do |user| + # Mailer.run.send_for_user_activities(user, Date.today, 1) + # end end end end diff --git a/lib/trustie/gitlab/inline_diff.rb b/lib/trustie/gitlab/inline_diff.rb index 942f08fcb..902167776 100644 --- a/lib/trustie/gitlab/inline_diff.rb +++ b/lib/trustie/gitlab/inline_diff.rb @@ -7,21 +7,21 @@ module Trustie FINISH = "#!idiff-finish!#" def processing(diff_arr) - indexes = _indexes_of_changed_lines diff_arr - - indexes.each do |index| - first_line = diff_arr[index+1] - second_line = diff_arr[index+2] - - # Skip inline diff if empty line was replaced with content - next if first_line == "-\n" - - first_token = find_first_token(first_line, second_line) - apply_first_token(diff_arr, index, first_token) - - last_token = find_last_token(first_line, second_line, first_token) - apply_last_token(diff_arr, index, last_token) - end + # indexes = _indexes_of_changed_lines diff_arr + # + # indexes.each do |index| + # first_line = diff_arr[index+1] + # second_line = diff_arr[index+2] + # + # # Skip inline diff if empty line was replaced with content + # next if first_line == "-\n" + # + # first_token = find_first_token(first_line, second_line) + # apply_first_token(diff_arr, index, first_token) + # + # last_token = find_last_token(first_line, second_line, first_token) + # apply_last_token(diff_arr, index, last_token) + # end diff_arr end diff --git a/public/stylesheets/css/project.css b/public/stylesheets/css/project.css index 530287ed4..cc0ded22a 100644 --- a/public/stylesheets/css/project.css +++ b/public/stylesheets/css/project.css @@ -1043,3 +1043,14 @@ table.quality_list tbody td, table.quality_list tbody tr td { font-size: 11px; padding: 4px 10px 4px 3px; } +/* 文本变更样式 */ +.autoscroll {overflow-x: auto; margin-bottom: 0.2em;} +table.filecontent { border: 1px solid #e2e2e2; border-collapse: collapse; width: 100%;background-color: #fafafa;} +table.text-file{} +.old_line,.new_line,.diff_line {margin: 0px; padding: 0px;border: none; background: #f7f8fa;color: rgba(0,0,0,0.3); padding: 0px 5px; border-right: 1px solid #dce0e6;text-align: right; min-width: 35px; max-width: 50px; width: 35px; -webkit-user-select: none;} +.old_line a,.new_line a,.diff_line a { float: left;width: 35px; font-weight: normal; color: rgba(0,0,0,0.3);} +.line_content{padding: 0px 5px;} +.old{ background:#ffecec; } +.old:hover{ background:#fffaf1; } +.new{ background: #eaffea;} +.new:hover{ background:#fffaf1; } \ No newline at end of file