项目动态重写,并去掉首页缓存

dev_repository_hjq
lizanle 10 years ago
parent d902d76ae2
commit 7ee58d1d44

@ -186,6 +186,10 @@ class AttachmentsController < ApplicationController
@attachment = Attachment.new(:file => request.raw_post)
@attachment.author = User.current
if !params[:project].nil?
@attachment.container_type = 'Project'
@attachment.container_id = params[:project].split("?")[0]
end
@attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16)
saved = @attachment.save

@ -153,6 +153,8 @@ class IssuesController < ApplicationController
def create
call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
@issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads]))
# 给该issue在它所在的项目中所有的issues中所在的位置给一个序号
@issue.project_issues_index = @issue.project.issues.last.project_issues_index + 1
if @issue.save
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
respond_to do |format|

@ -247,6 +247,7 @@ class ProjectsController < ApplicationController
# Author lizanle
# Description 项目动态展示方法,删除了不必要的代码
def show
=begin
# 试图跳转到请求的按钮
if params[:jump] && redirect_to_project_menu_item(@project, params[:jump])
return
@ -270,30 +271,37 @@ class ProjectsController < ApplicationController
# 时间跨度不能太大,不然很慢,所以删掉了-1.years
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
=end
@author = params[:user_id].blank? ? nil : User.active.find(params[:user_id])
# 决定显示所用用户或单个用户活动
=begin
@activity = Redmine::Activity::Fetcher.new(User.current,
:project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !has["show_#{t}"].nil?}
=end
# 根据私密性,取出符合条件的所有数据
if User.current.member_of?(@project) || User.current.admin?
events = @activity.events(@date_from, @date_to)
@events_pages = ForgeActivity.where("project_id = ?",@project).order("created_at desc").page(params['page'|| 1]).per(20);
#events = @activity.events(@date_from, @date_to)
else
events = @activity.events(@date_from, @date_to, :is_public => 1)
@events_pages = ForgeActivity.includes(:project).where("forge_activities.project_id = ? and projects.is_public
= ?",@project,1).order("created_at desc")
.page(params['page'|| 1]).per(10);
# @events = @activity.events(@date_from, @date_to, :is_public => 1)
end
@offset, @limit = api_offset_and_limit({:limit => 10})
@events_count = events.count
@events_pages = Paginator.new @events_count, @limit, params['page']
@offset ||= @events_pages.offset
=begin
@events_pages = Paginator.new events.count, 10, params['page']
# 总的数据中取出某一页
events = events.slice(@offset,@limit)
events = events.slice(@events_pages.offset,10)
# 按天分组
@events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)}
=end
# 根据对应的请求,返回对应的数据
respond_to do |format|

@ -408,6 +408,9 @@ class UsersController < ApplicationController
def show
pre_count = 10 #limit
# Time 2015-02-04 11:46:34
# Author lizanle
# Description type 1 :所有动态包括我关注的人 type 2:我的动态 type 3:关于我的回复
case params[:type]
when "1"
if @user == User.current
@ -428,26 +431,27 @@ class UsersController < ApplicationController
messages = message.sort {|x,y| y.created_on <=> x.created_on }
@message = messages[@info_pages.offset, @info_pages.per_page]
@state = 2
else
else
# Time 2015-02-04 10:50:49
# Author lizanle
# Description 所有动态
where_condition = nil;
# where_condition = "act_type <> 'JournalsForMessage'"
if @user == User.current
watcher = User.watched_by(@user)
watcher.push(User.current)
activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc')
activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc')
else
activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc')
end
@activity_count = activity.count
@activity_pages = Paginator.new @activity_count, pre_count, params['page']
activity_page = activity.slice(@activity_pages.offset,@activity_pages.per_page * 2)
activity_page = activity_page.reject { |e|
@activity = activity.slice(@activity_pages.offset,@activity_pages.per_page )
@activity = @activity.reject { |e|
((e.act_type=="Issue") && ( !e.act.visible?(User.current))) ||
((e.act_type == "Journal") && (!e.act.project.visible?(User.current))) ||
((e.act_type == "Bid") && ((!User.current.member_of_course?(e.act.courses.first) || !User.current.admin?)))
}
@activity = activity.slice(0,@activity_pages.per_page)
@state = 0
end

@ -1,16 +0,0 @@
module ExpireHelper
#index.html 中 “projects”塊 緩存過期
def expire_project_cache
ActionController::Base.new.expire_fragment('projects')
end
#index.html 中 “activities”塊 緩存過期
def expire_activitie_cache
ActionController::Base.new.expire_fragment('activities')
end
#welcome/index.html 中 “forums”塊 緩存過期
def expire_forum_cache
ActionController::Base.new.expire_fragment('forums')
end
end

@ -25,7 +25,9 @@ class Attachment < ActiveRecord::Base
belongs_to :softapplication, foreign_key: 'container_id', conditions: "attachments.container_type = 'Softapplication'"
belongs_to :author, :class_name => "User", :foreign_key => "author_id"
belongs_to :attachmentstype, :foreign_key => "attachtype",:primary_key => "id"
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
include UserScoreHelper
validates :filename, presence: true, length: {maximum: 254}
@ -70,7 +72,7 @@ class Attachment < ActiveRecord::Base
@@thumbnails_storage_path = File.join(Rails.root, "tmp", "thumbnails")
before_save :files_to_final_location
after_create :be_user_score # user_score
after_create :be_user_score ,:act_as_forge_activity# user_score
after_update :be_user_score
after_destroy :delete_from_disk,:down_user_score
@ -529,4 +531,14 @@ class Attachment < ActiveRecord::Base
end
end
# Time 2015-03-02 17:42:48
# Author lizanle
# Description 上传该项目的文档资料也要保存一份在公共表中
def act_as_forge_activity
if self.container_type == 'Project'
self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
:project_id => self.container_id)
end
end
end

@ -17,7 +17,6 @@ class Bid < ActiveRecord::Base
HomeworkProject = 2
attr_accessible :author_id, :budget, :deadline, :name, :description, :homework_type, :password
include Redmine::SafeAttributes
include ExpireHelper
belongs_to :author, :class_name => 'User', :foreign_key => :author_id
belongs_to :course
@ -33,12 +32,6 @@ class Bid < ActiveRecord::Base
has_many :join_in_contests, :dependent => :destroy
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
# has_many :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}"
after_create :expire_activitie_cache
after_update :expire_activitie_cache
before_destroy :expire_activitie_cache
acts_as_attachable
NAME_LENGTH_LIMIT = 60

@ -16,7 +16,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Changeset < ActiveRecord::Base
include ExpireHelper
belongs_to :repository
belongs_to :user
include UserScoreHelper
@ -65,9 +64,8 @@ class Changeset < ActiveRecord::Base
includes(:repository => :project).where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args))
}
after_create :scan_for_issues,:refresh_changests,:expire_activitie_cache#:be_user_score # user_score
after_update :be_user_score,:expire_activitie_cache
before_destroy :expire_activitie_cache
after_create :scan_for_issues,:refresh_changests#:be_user_score # user_score
after_update :be_user_score
after_destroy :down_user_score
before_create :before_create_cs

@ -1,10 +1,6 @@
class ContestNotification < ActiveRecord::Base
include ExpireHelper
attr_accessible :content, :title
validates :title, length: {maximum: 30}
after_create :expire_forum_cache
after_update :expire_forum_cache
before_destroy :expire_forum_cache
end

@ -17,18 +17,16 @@
class Document < ActiveRecord::Base
include Redmine::SafeAttributes
include ExpireHelper
belongs_to :project
belongs_to :user
belongs_to :category, :class_name => "DocumentCategory", :foreign_key => "category_id"
include UserScoreHelper
after_save :be_user_score # user_score
after_destroy :down_user_score
after_create :expire_activitie_cache
after_update :expire_activitie_cache
before_destroy :expire_activitie_cache
acts_as_attachable :delete_permission => :delete_documents
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
acts_as_event :title => Proc.new {|o| "#{l(:label_document)}: #{o.title}"},
#:author => Proc.new {|o| o.attachments.reorder("#{Attachment.table_name}.created_on ASC").first.try(:author) },
@ -39,7 +37,7 @@ class Document < ActiveRecord::Base
validates_presence_of :project, :title, :category
validates_length_of :title, :maximum => 60
after_create :act_as_forge_activity
scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_documents, *args))
}
@ -81,5 +79,12 @@ class Document < ActiveRecord::Base
update_document(self.user,2,self.project)
end
# Time 2015-03-02 10:51:16
# Author lizanle
# Description 新创建的document要在公共表ForgeActivity中记录
def act_as_forge_activity
self.forge_acts << ForgeActivity.new(:user_id => self.user_id,
:project_id => self.project_id)
end
end

@ -0,0 +1,22 @@
# Time 2015-02-06 10:42:34
# Author lizanle
# Description 这是保存Project相关的动态的公共表
class ForgeActivity < ActiveRecord::Base
# 公共表中活动类型,命名规则:TYPE_OF_{类名}_ACT
TYPE_OF_ISSUE_ACT = "Issue"
TYPE_OF_MESSAGE_ACT = "Message"
TYPE_OF_ATTACHMENT_ACT = "Attachment"
TYPE_OF_DOCUMENT_ACT = "Document"
TYPE_OF_JOURNAL_ACT = "Journal"
TYPE_OF_WIKI_ACT = "Wiki"
TYPE_OF_NEWS_ACT = "News"
attr_accessible :forge_act_id, :forge_act_type,:project_id,:user_id,:org_id
# 虚拟关联
belongs_to :forge_act ,:polymorphic => true
belongs_to :project
belongs_to :user
validates :user_id,presence: true
validates :project_id,presence: true
validates :forge_act_id,presence: true
validates :forge_act_type, presence: true
end

@ -1,13 +1,8 @@
class Forum < ActiveRecord::Base
include Redmine::SafeAttributes
include ExpireHelper
has_many :topics, :class_name => 'Memo', :conditions => "#{Memo.table_name}.parent_id IS NULL", :order => "#{Memo.table_name}.created_at DESC", :dependent => :destroy
has_many :memos, :dependent => :destroy, conditions: "parent_id IS NULL"
belongs_to :creator, :class_name => "User", :foreign_key => 'creator_id'
after_create :expire_forum_cache
after_update :expire_forum_cache
before_destroy :expire_forum_cache
safe_attributes 'name',
'description',
'topic_count',

@ -19,7 +19,6 @@ class Issue < ActiveRecord::Base
include Redmine::SafeAttributes
include Redmine::Utils::DateCalculation
include UserScoreHelper
include ExpireHelper
belongs_to :project
belongs_to :tracker
belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
@ -46,6 +45,8 @@ class Issue < ActiveRecord::Base
# added by fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
@ -79,12 +80,9 @@ class Issue < ActiveRecord::Base
attr_reader :current_journal
# fq
after_create :act_as_activity,:be_user_score_new_issue
after_create :act_as_activity,:be_user_score_new_issue,:act_as_forge_activity
after_update :be_user_score
after_destroy :down_user_score
after_create :expire_activitie_cache
after_update :expire_activitie_cache
before_destroy :expire_activitie_cache
# after_create :be_user_score
# end
@ -131,7 +129,15 @@ class Issue < ActiveRecord::Base
self.acts << Activity.new(:user_id => self.author_id)
end
# end
# Time 2015-02-26 10:51:16
# Author lizanle
# Description 新创建的issue要在公共表ForgeActivity中记录
def act_as_forge_activity
self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
:project_id => self.project_id)
end
# end
# Returns a SQL conditions string used to find all issues visible by the specified user
@ -1170,13 +1176,13 @@ class Issue < ActiveRecord::Base
# back string obj which is belong to project.
def source_from
"" << self.project.name.to_s <<
"#" << project_index
"" << self.project.name.to_s
end
def project_index
if self.project.issues.include?(self)
(self.project.issues.index(self).to_i + 1).to_s
else
issue_index = 1
self.project.issues.each do |issue|
@ -1187,8 +1193,10 @@ class Issue < ActiveRecord::Base
issue_index = issue_index+1
end
end
issue_index.to_s
end
end
private

@ -27,6 +27,8 @@ class Journal < ActiveRecord::Base
# added by fq
has_one :journal_reply
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
attr_accessor :indice
@ -46,7 +48,7 @@ class Journal < ActiveRecord::Base
before_create :split_private_notes
# fq
after_save :act_as_activity,:be_user_score
after_save :act_as_activity,:be_user_score,:act_as_forge_activity
# end
#after_destroy :down_user_score
#before_save :be_user_score
@ -156,6 +158,15 @@ class Journal < ActiveRecord::Base
end
# end
# Time 2015-02-27 13:30:19
# Author lizanle
# Description 公共表中需要保存一份该记录
def act_as_forge_activity
self.forge_acts << ForgeActivity.new(:user_id => self.user_id,
:project_id => self.issue.project.id)
end
# 更新用户分数 -by zjc
def be_user_score
#新建了缺陷留言且留言不为空,不为空白

@ -4,7 +4,6 @@
class JournalsForMessage < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
include ExpireHelper
safe_attributes "jour_type", # 留言所属类型
"jour_id", # 留言所属类型的id
"notes", # 留言内容
@ -55,9 +54,7 @@ class JournalsForMessage < ActiveRecord::Base
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
validates :notes, presence: true
after_create :act_as_activity ,:expire_activitie_cache#huang
after_update :expire_activitie_cache
before_destroy :expire_activitie_cache
after_create :act_as_activity #huang
after_create :reset_counters!
after_destroy :reset_counters!
after_save :be_user_score

@ -1,13 +1,8 @@
class Memo < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
include ExpireHelper
belongs_to :forum
belongs_to :author, :class_name => "User", :foreign_key => 'author_id'
after_create :expire_cache
after_update :expire_cache
before_destroy :expire_cache
validates_presence_of :author_id, :forum_id, :subject,:content
# 若是主题帖,则内容可以是空
#validates :content, presence: true, if: Proc.new{|o| !o.parent_id.nil? }
@ -174,8 +169,5 @@ class Memo < ActiveRecord::Base
update_memo_number(User.current,1)
update_replay_for_memo(User.current,1)
end
def expire_cache
expire_forum_cache
expire_activitie_cache
end
end

@ -18,7 +18,6 @@
class Message < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
include ExpireHelper
belongs_to :board
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
@ -29,6 +28,8 @@ class Message < ActiveRecord::Base
# added by fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
acts_as_searchable :columns => ['subject', 'content'],
@ -59,13 +60,12 @@ class Message < ActiveRecord::Base
validates_length_of :subject, :maximum => 255
validate :cannot_reply_to_locked_topic, :on => :create
after_create :add_author_as_watcher, :reset_counters!,:expire_activitie_cache
after_update :update_messages_board,:expire_activitie_cache
before_destroy :expire_activitie_cache
after_create :add_author_as_watcher, :reset_counters!
after_update :update_messages_board
after_destroy :reset_counters!,:down_user_score
# fq
after_create :act_as_activity,:be_user_score
after_create :act_as_activity,:be_user_score,:act_as_forge_activity
#before_save :be_user_score
# end
@ -160,6 +160,14 @@ class Message < ActiveRecord::Base
end
# end
# Time 2015-02-27 14:32:25
# Author lizanle
# Description
def act_as_forge_activity
self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
:project_id => self.board.project.id)
end
#更新用户分数 -by zjc
def be_user_score
#新建message且无parent的为发帖

@ -17,7 +17,6 @@
class News < ActiveRecord::Base
include Redmine::SafeAttributes
include ExpireHelper
belongs_to :project
#added by nwb
belongs_to :course
@ -25,7 +24,9 @@ class News < ActiveRecord::Base
has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
# fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
#end
# 被ForgeActivity虚拟关联
has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
validates_presence_of :title, :description
validates_length_of :title, :maximum => 60
@ -46,11 +47,8 @@ class News < ActiveRecord::Base
after_create :add_author_as_watcher
# fq
after_create :act_as_activity
after_create :act_as_activity,:act_as_forge_activity
# end
after_create :expire_activitie_cache
after_update :expire_activitie_cache
before_destroy :expire_activitie_cache
scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_news, *args))
@ -96,5 +94,12 @@ class News < ActiveRecord::Base
self.acts << Activity.new(:user_id => self.author_id)
end
# Time 2015-02-27 15:48:17
# Author lizanle
# Description 公用表中也要记录
def act_as_forge_activity
self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
:project_id => self.project.id)
end
end

@ -17,7 +17,6 @@
class Project < ActiveRecord::Base
include Redmine::SafeAttributes
include ExpireHelper
ProjectType_project = 0
ProjectType_course = 1
@ -130,9 +129,8 @@ class Project < ActiveRecord::Base
#ActiveModel::Dirty 这里有一个changed方法。对任何对象都可以用
after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?}
# 创建project之后默认创建一个board之后的board去掉了board的概念
after_create :create_board_sync,:expire_project_cache
after_update :expire_project_cache
before_destroy :delete_all_members,:expire_project_cache
after_create :create_board_sync
before_destroy :delete_all_members
def remove_references_before_destroy
return if self.id.nil?
Watcher.delete_all ['watchable_id = ?', id]

@ -16,7 +16,9 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Tracker < ActiveRecord::Base
# Time 2015-02-6 09:34:44
# Author lizanle
# Description freeze方法让字符串不可变
CORE_FIELDS_UNDISABLABLE = %w(project_id tracker_id subject description priority_id is_private).freeze
# Fields that can be disabled
# Other (future) fields should be appended, not inserted!

@ -27,6 +27,7 @@
// file.click();
// }
</script>
<% project = project %>
<span class="add_attachment" style="font-weight:normal;">
<%#= button_tag "浏览", :type=>"button", :onclick=>"CompatibleSend();" %>
<!--%= link_to image_tag(),"javascript:void(0)", :onclick => "_file.click()"%-->
@ -41,7 +42,7 @@
:max_file_size => Setting.attachment_max_size.to_i.kilobytes,
:max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)),
:max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i,
:upload_path => uploads_path(:format => 'js'),
:upload_path => uploads_path(:format => 'js',:project =>project),
:description_placeholder => l(:label_optional_description)
} %>
<span id="upload_file_count">

@ -38,7 +38,7 @@
</p>
<p><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
<p><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form', locals: {project: project} %></p>
</div>
<%= submit_tag l(:button_add) %>
<% end %>

@ -1,6 +1,5 @@
<%# html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
<% html_title "#{@issue.tracker.name} #{@issue.source_from}: #{@issue.subject}" %>
<% html_title "#{@issue.tracker.name} #{@issue.source_from}'#'#{@issue.project_index}: #{@issue.subject}" %>
<%= render :partial => 'action_menu' %>
@ -87,7 +86,7 @@ end %>
<%= render_custom_fields_rows(@issue) %>
<%= call_hook(:view_issues_show_details_bottom, :issue => @issue) %>
</table>
woca
<% if @issue.description? || @issue.attachments.any? -%>
<hr />
<% if @issue.description? %>

@ -7,7 +7,7 @@
paginator: the paginator that renders the pagination tags inside
-%>
<%= paginator.render do -%>
<div class="pagination">
<div id="paginator" class="pagination">
<%= first_page_tag unless current_page.first? %>
<%= prev_page_tag unless current_page.first? %>
<% each_page do |page| -%>

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save