首页用户动态加入讨论区内容,点击之后定位到帖子。

This commit is contained in:
yanxd 2013-12-04 15:31:18 +08:00
parent 6a2a82d30e
commit 28978b88b2
12 changed files with 156 additions and 151 deletions

View File

@ -63,7 +63,7 @@ class ForumsController < ApplicationController
respond_to do |format|
if @forum.save
format.html { redirect_to @forum, notice: 'Forum was successfully created.' }
format.html { redirect_to @forum, notice: l(:label_forum_create_succ) }
format.json { render json: @forum, status: :created, location: @forum }
else
format.html { render action: "new" }

View File

@ -125,7 +125,7 @@ module WelcomeHelper
# user_objs = User.find_by_sql("SELECT * FROM users WHERE (users.id IN #{"(" << users.join(',') << ")"} )")
activity = Redmine::Activity::Fetcher.new(nil)
activity.events_welcome(nil, nil, {:limit => limit})
activity.events_welcome(nil, nil, {:limit => limit, :types => 'welcome'})
end
#取得论坛数据

View File

@ -1,131 +1,131 @@
####by fq
class Bid < ActiveRecord::Base
attr_accessible :author_id, :budget, :deadline, :name, :description, :homework_type, :password
include Redmine::SafeAttributes
belongs_to :author, :class_name => 'User', :foreign_key => :author_id
belongs_to :course
has_many :biding_projects, :dependent => :destroy
has_many :projects, :through => :biding_projects
has_many :projects_member, :class_name => 'User', :through => :projects
has_many :journals_for_messages, :as => :jour, :dependent => :destroy
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
has_many :homework_for_courses, :dependent => :destroy
has_many :courses, :through => :homework_for_courses, :source => :project
has_many :homeworks, :class_name => 'HomeworkAttach', :dependent => :destroy
has_many :join_in_contests, :dependent => :destroy
# has_many :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}"
acts_as_attachable
NAME_LENGTH_LIMIT = 60
DESCRIPTION_LENGTH_LIMIT = 250
validates_length_of :name, :maximum => NAME_LENGTH_LIMIT
validates_length_of :description, :maximum => DESCRIPTION_LENGTH_LIMIT
validates_presence_of :author_id, :name, :deadline
# validates_presence_of :deadline, :message => 'test'
# validates_format_of :deadline, :with =>
validates_format_of :deadline, :with => /^[\d]{4}[-][\d]{1,2}[-][\d]{1,2}$/
validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{2})|^(\d+).([0-9]{1})$/,
:if => Proc.new { |p| p.reward_type == 1 }
validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{1})$/, :if => Proc.new { |p| p.reward_type == 3 }
validate :validate_user
validate :validate_reward_type
after_create :act_as_activity
scope :visible, lambda {|*args|
nil
}
scope :like, lambda {|arg|
if arg.blank?
where(nil)
else
pattern = "%#{arg.to_s.strip.downcase}%"
where("LOWER(id) LIKE :p OR LOWER(name) LIKE :p OR LOWER(description) LIKE :p", :p => pattern)
end
}
acts_as_watchable
acts_as_taggable
acts_as_event :title => Proc.new {|o| "#{l(:label_requirement)} ##{o.id}: #{o.name}" },
:description => :description,
:author => :author,
:url => Proc.new {|o| {:controller => 'bids', :action => 'show', :id => o.id}}
acts_as_activity_provider :find_options => {:include => [:projects, :author]},
:author_key => :author_id
safe_attributes 'name',
'description',
'budget',
'deadline',
'homework_type',
'reward_type',
'password'
# safe_attributes 'name',
# 'description',
# 'deadline'
def add_jour(user, notes, reference_user_id = 0)
self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id)
end
def self.creat_bids(budget, deadline, name, description=nil, reward_type)
self.create(:author_id => User.current.id, :budget => budget,
:deadline => deadline, :name => name, :description => description, :commit => 0, :reward_type => reward_type)
# self.acts << Activity.new(:user_id => self.author_id)
end
def update_bids(budget, deadline, name, description=nil)
if(User.current.id == self.author_id)
self.name = name
self.budget = budget
self.deadline = deadline
self.description = description
self.save
end
end
def delete_bids
unless self.nil?
if User.current.id == self.author_id
self.destroy
end
end
end
def set_commit(commit)
self.update_attribute(:commit, commit)
end
private
def validate_user
errors.add :author_id, :invalid if author.nil? || !author.active?
end
def validate_reward_type
errors.add :reward_type, :invalid if self.reward_type == 0
end
def act_as_activity
self.acts << Activity.new(:user_id => self.author_id)
end
# used to validate weather the user is the creater of the bid
# added by william
def validate_bid_manager(user_id)
unless user_id.nil?
if self.author_id == user_id
return true
else
return false
end
end
end
end
####by fq
class Bid < ActiveRecord::Base
attr_accessible :author_id, :budget, :deadline, :name, :description, :homework_type, :password
include Redmine::SafeAttributes
belongs_to :author, :class_name => 'User', :foreign_key => :author_id
belongs_to :course
has_many :biding_projects, :dependent => :destroy
has_many :projects, :through => :biding_projects
has_many :projects_member, :class_name => 'User', :through => :projects
has_many :journals_for_messages, :as => :jour, :dependent => :destroy
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
has_many :homework_for_courses, :dependent => :destroy
has_many :courses, :through => :homework_for_courses, :source => :project
has_many :homeworks, :class_name => 'HomeworkAttach', :dependent => :destroy
has_many :join_in_contests, :dependent => :destroy
# has_many :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}"
acts_as_attachable
NAME_LENGTH_LIMIT = 60
DESCRIPTION_LENGTH_LIMIT = 250
validates_length_of :name, :maximum => NAME_LENGTH_LIMIT
validates_length_of :description, :maximum => DESCRIPTION_LENGTH_LIMIT
validates_presence_of :author_id, :name, :deadline
# validates_presence_of :deadline, :message => 'test'
# validates_format_of :deadline, :with =>
validates_format_of :deadline, :with => /^[\d]{4}[-][\d]{1,2}[-][\d]{1,2}$/
validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{2})|^(\d+).([0-9]{1})$/,
:if => Proc.new { |p| p.reward_type == 1 }
validates_format_of :budget, :with => /^(\d+)$|^(\d+).([0-9]{1})$/, :if => Proc.new { |p| p.reward_type == 3 }
validate :validate_user
validate :validate_reward_type
after_create :act_as_activity
scope :visible, lambda {|*args|
nil
}
scope :like, lambda {|arg|
if arg.blank?
where(nil)
else
pattern = "%#{arg.to_s.strip.downcase}%"
where("LOWER(id) LIKE :p OR LOWER(name) LIKE :p OR LOWER(description) LIKE :p", :p => pattern)
end
}
acts_as_watchable
acts_as_taggable
acts_as_event :title => Proc.new {|o| "#{l(:label_requirement)} ##{o.id}: #{o.name}" },
:description => :description,
:author => :author,
:url => Proc.new {|o| {:controller => 'bids', :action => 'show', :id => o.id}}
acts_as_activity_provider :find_options => {:include => [:projects, :author]},
:author_key => :author_id
safe_attributes 'name',
'description',
'budget',
'deadline',
'homework_type',
'reward_type',
'password'
# safe_attributes 'name',
# 'description',
# 'deadline'
def add_jour(user, notes, reference_user_id = 0)
self.journals_for_messages << JournalsForMessage.new(:user_id => user.id, :notes => notes, :reply_id => reference_user_id)
end
def self.creat_bids(budget, deadline, name, description=nil, reward_type)
self.create(:author_id => User.current.id, :budget => budget,
:deadline => deadline, :name => name, :description => description, :commit => 0, :reward_type => reward_type)
# self.acts << Activity.new(:user_id => self.author_id)
end
def update_bids(budget, deadline, name, description=nil)
if(User.current.id == self.author_id)
self.name = name
self.budget = budget
self.deadline = deadline
self.description = description
self.save
end
end
def delete_bids
unless self.nil?
if User.current.id == self.author_id
self.destroy
end
end
end
def set_commit(commit)
self.update_attribute(:commit, commit)
end
private
def validate_user
errors.add :author_id, :invalid if author.nil? || !author.active?
end
def validate_reward_type
errors.add :reward_type, :invalid if self.reward_type == 0
end
def act_as_activity
self.acts << Activity.new(:user_id => self.author_id)
end
# used to validate weather the user is the creater of the bid
# added by william
def validate_bid_manager(user_id)
unless user_id.nil?
if self.author_id == user_id
return true
else
return false
end
end
end
end

View File

@ -16,14 +16,16 @@ class Memo < ActiveRecord::Base
# #:include => { :forum => :p}
# #:project_key => "#{Forum.table_name}.project_id"
# :date_column => "#{table_name}.created_at"
# acts_as_event :title => Proc.new {|o| "#{o.forum.name}: #{o.subject}"},
# :description => :content,
# :group => :parent,
# :type => Proc.new {|o| o.parent_id.nil? ? 'message' : 'reply'},
# :url => Proc.new {|o| {:controller => 'memos', :action => 'show', :forum_id => o.forum_id}.merge(o.parent_id.nil? ? {:id => o.id} : {:id => o.parent_id, :r => o.id, :anchor => "memo-#{o.id}"})}
acts_as_activity_provider :find_options => {:include => [{:board => :project}, :author]},
:author_key => :author_id
acts_as_watchable
acts_as_event :title => Proc.new {|o| "#{o.forum.name}: #{o.subject}"},
:datetime => :created_at,
:description => :content,
:author => :author,
:type => Proc.new {|o| o.parent_id.nil? ? 'Forum' : 'Memo'},
:url => Proc.new {|o| {:controller => 'memos', :action => 'show', :forum_id => o.forum_id}.merge(o.parent_id.nil? ? {:id => o.id} : {:id => o.parent_id, :anchor => "reply-#{o.id}"})}
acts_as_activity_provider :author_key => :author_id,
:func => 'memos'
# :find_options => {:type => 'memos'}
# acts_as_watchable
safe_attributes "author_id",
"subject",

View File

@ -1,7 +1,4 @@
<!-- added by fq -->
<p id="notice">
<%= notice %>
</p>
<div id="add-memo" style="display:none;">
<h3><%=l(:label_memo_new)%></h3>
<% if User.current.logged? %>

View File

@ -39,7 +39,7 @@
</td>
</tr>
<tr>
<td style="padding-left: 8px"><a><%= link_to "forge.trustie.net/projects", :controller => 'projects', :action => 'index', :project_type => 0 %></a></td>
<td style="padding-left: 8px"><a><%= link_to "forge.trustie.net/forums", forums_path %></a></td>
<td><p
class="top-content-list"><%=link_to l(:label_home),home_path %> > <%=link_to '讨论区', :controller => 'forums', :action => 'index' %> > <%=link_to @forum.name, forum_path(@forum) %></p></td>
</tr>

View File

@ -41,7 +41,7 @@
</td>
</tr>
<tr>
<td style="padding-left: 8px"><a><%= link_to "forge.trustie.net/projects", :controller => 'projects', :action => 'index', :project_type => 0 %></a></td>
<td style="padding-left: 8px"><a><%= link_to "forge.trustie.net/forums", forums_path %></a></td>
<td><p class="top-content-list"><%=link_to l(:label_home),home_path %> > <%=link_to '讨论区', :controller => 'forums', :action => 'index' %> > <%=link_to @forum.name, forum_path(@forum) %> > <%=link_to @memo.subject, forum_memo_path(@forum, @memo) %></p></td>
</tr>
</table>

View File

@ -115,8 +115,8 @@
<h3 class="comments"><%= l(:label_reply_plural) %> (<%= @replies.nil? ? 0 : @replies.size %>)</h3>
<% reply_count = @current_count.to_i %>
<% @replies.each do |reply| %>
<p class="font_lighter"><%= reply_count += 1 %>楼 :</p>
<div class="reply" id="<%= "reply-#{reply.id}" %>">
<p class="font_lighter"><%= reply_count += 1 %>楼 :</p>
<div class="contextual-borad">
<%= link_to(
image_tag('comment.png'),

View File

@ -1567,6 +1567,8 @@ en:
label_hot_project: 'HOT Projects'
label_memo_create_succ: Memo was successfully created.
label_memo_create_fail: Memo was failures created.
label_forum_create_succ: Forum was successfully created.
label_forum_create_fail: Forum was failures created.
label_memo_create: publish
label_memo_new: new memo
label_memo_edit: edit memo

View File

@ -1729,6 +1729,8 @@ zh:
label_hot_project: '热门项目'
label_memo_create_succ: 发布成功
label_memo_create_fail: 发布失败
label_forum_create_succ: 讨论吧新建成功
label_forum_create_fail: 讨论吧新建失败
label_memo_create: 发布
label_memo_new: 新建主题
label_memo_edit: 修改主题

View File

@ -29,7 +29,7 @@ module Redmine
send :include, Redmine::Acts::ActivityProvider::InstanceMethods
end
options.assert_valid_keys(:type, :permission, :timestamp, :author_key, :find_options)
options.assert_valid_keys(:type, :permission, :timestamp, :author_key, :find_options, :func)
self.activity_provider_options ||= {}
# One model can provide different event types
@ -87,7 +87,6 @@ module Redmine
raise "#{self.name} can not provide #{event_type} events." if provider_options.nil?
scope = self
if from && to
scope = scope.scoped(:conditions => ["#{provider_options[:timestamp]} BETWEEN ? AND ?", from, to])
end
@ -102,16 +101,18 @@ module Redmine
scope = scope.scoped(:order => "#{table_name}.id DESC", :limit => options[:limit])
end
user1 = User.find_by_admin(true)
if provider_options.has_key?(:permission)
user1 = User.find_by_admin(true)
scope = scope.scoped(:conditions => Project.allowed_to_condition(user1, provider_options[:permission] || :view_project, options))
elsif respond_to?(:visible)
scope = scope.visible(user1, options)
elsif provider_options.has_key?(:func) && provider_options[:func].eql?('memos')
scope = scope
else
ActiveSupport::Deprecation.warn "acts_as_activity_provider with implicit :permission option is deprecated. Add a visible scope to the #{self.name} model or use explicit :permission option."
# scope = scope
scope = scope.scoped(:conditions => Project.allowed_to_condition(user1, "view_#{self.name.underscore.pluralize}".to_sym, options))
end
scope.all(provider_options[:find_options].dup)
end

View File

@ -371,6 +371,7 @@ Redmine::Activity.map do |activity|
activity.register :time_entries, :default => false
# added by fq
activity.register :bids, :class_name => 'Bid'
activity.register :memos, :class_name => 'Memo'
# end
end