mirror of
https://github.com/discourse/discourse.git
synced 2024-12-25 01:55:58 +08:00
6dd4bc7d57
Group owners are regular users that can add or remove users to a group The Admin UX allows admins to appoint group owners The public group UX will display group owners first and unlock UI to add and remove members Group owners can only be appointed on non automatic groups Group owners may not appoint another group owner
66 lines
2.3 KiB
Ruby
66 lines
2.3 KiB
Ruby
class UserProfileView < ActiveRecord::Base
|
|
validates_presence_of :user_profile_id, :ip_address, :viewed_at
|
|
|
|
belongs_to :user_profile
|
|
|
|
def self.add(user_profile_id, ip, user_id=nil, at=nil, skip_redis=false)
|
|
at ||= Time.zone.now
|
|
redis_key = "user-profile-view:#{user_profile_id}:#{at.to_date}"
|
|
if user_id
|
|
redis_key << ":user-#{user_id}"
|
|
else
|
|
redis_key << ":ip-#{ip}"
|
|
end
|
|
|
|
if skip_redis || $redis.setnx(redis_key, '1')
|
|
skip_redis || $redis.expire(redis_key, SiteSetting.user_profile_view_duration_hours.hours)
|
|
|
|
self.transaction do
|
|
sql = "INSERT INTO user_profile_views (user_profile_id, ip_address, viewed_at, user_id)
|
|
SELECT :user_profile_id, :ip_address, :viewed_at, :user_id
|
|
WHERE NOT EXISTS (
|
|
SELECT 1 FROM user_profile_views
|
|
/*where*/
|
|
)"
|
|
|
|
builder = SqlBuilder.new(sql)
|
|
|
|
if !user_id
|
|
builder.where("viewed_at = :viewed_at AND ip_address = :ip_address AND user_profile_id = :user_profile_id AND user_id IS NULL")
|
|
else
|
|
builder.where("viewed_at = :viewed_at AND user_id = :user_id AND user_profile_id = :user_profile_id")
|
|
end
|
|
|
|
result = builder.exec(user_profile_id: user_profile_id, ip_address: ip, viewed_at: at, user_id: user_id)
|
|
|
|
if result.cmd_tuples > 0
|
|
UserProfile.find(user_profile_id).increment!(:views)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.profile_views_by_day(start_date, end_date)
|
|
profile_views = self.where("viewed_at >= ? AND viewed_at < ?", start_date, end_date + 1.day)
|
|
profile_views.group("date(viewed_at)").order("date(viewed_at)").count
|
|
end
|
|
end
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: user_profile_views
|
|
#
|
|
# id :integer not null, primary key
|
|
# user_profile_id :integer not null
|
|
# viewed_at :datetime not null
|
|
# ip_address :inet not null
|
|
# user_id :integer
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_user_profile_views_on_user_id (user_id)
|
|
# index_user_profile_views_on_user_profile_id (user_profile_id)
|
|
# unique_profile_view_ip (viewed_at,ip_address,user_profile_id) UNIQUE
|
|
# unique_profile_view_user (viewed_at,user_id,user_profile_id) UNIQUE
|
|
#
|