#
# Table name: users
#
-# email :string not null
-# id :bigint(8) not null, primary key
-# pass_crypt :string not null
-# creation_time :datetime not null
-# display_name :string default(""), not null
-# data_public :boolean default(FALSE), not null
-# description :text default(""), not null
-# home_lat :float
-# home_lon :float
-# home_zoom :integer default(3)
-# pass_salt :string
-# email_valid :boolean default(FALSE), not null
-# new_email :string
-# creation_ip :string
-# languages :string
-# status :enum default("pending"), not null
-# terms_agreed :datetime
-# consider_pd :boolean default(FALSE), not null
-# auth_uid :string
-# preferred_editor :string
-# terms_seen :boolean default(FALSE), not null
-# description_format :enum default("markdown"), not null
-# changesets_count :integer default(0), not null
-# traces_count :integer default(0), not null
-# diary_entries_count :integer default(0), not null
-# image_use_gravatar :boolean default(FALSE), not null
-# auth_provider :string
-# home_tile :bigint(8)
-# tou_agreed :datetime
+# email :string not null
+# id :bigint(8) not null, primary key
+# pass_crypt :string not null
+# creation_time :datetime not null
+# display_name :string default(""), not null
+# data_public :boolean default(FALSE), not null
+# description :text default(""), not null
+# home_lat :float
+# home_lon :float
+# home_zoom :integer default(3)
+# pass_salt :string
+# email_valid :boolean default(FALSE), not null
+# new_email :string
+# languages :string
+# status :enum default("pending"), not null
+# terms_agreed :datetime
+# consider_pd :boolean default(FALSE), not null
+# auth_uid :string
+# preferred_editor :string
+# terms_seen :boolean default(FALSE), not null
+# description_format :enum default("markdown"), not null
+# changesets_count :integer default(0), not null
+# traces_count :integer default(0), not null
+# diary_entries_count :integer default(0), not null
+# image_use_gravatar :boolean default(FALSE), not null
+# auth_provider :string
+# home_tile :bigint(8)
+# tou_agreed :datetime
+# diary_comments_count :integer default(0)
+# note_comments_count :integer default(0)
+# creation_address :inet
#
# Indexes
#
+# index_users_on_creation_address (creation_address) USING gist
# users_auth_idx (auth_provider,auth_uid) UNIQUE
# users_display_name_canonical_idx (lower(NORMALIZE(display_name, NFKC)))
# users_display_name_idx (display_name) UNIQUE
has_and_belongs_to_many :changeset_subscriptions, :class_name => "Changeset", :join_table => "changesets_subscribers", :foreign_key => "subscriber_id"
has_many :note_comments, :foreign_key => :author_id, :inverse_of => :author
has_many :notes, :through => :note_comments
-
- has_many :client_applications
- has_many :oauth_tokens, -> { order(:authorized_at => :desc).preload(:client_application) }, :class_name => "OauthToken", :inverse_of => :user
+ has_many :note_subscriptions, :class_name => "NoteSubscription"
+ has_many :subscribed_notes, :through => :note_subscriptions, :source => :note
has_many :oauth2_applications, :class_name => Doorkeeper.config.application_model.name, :as => :owner
has_many :access_grants, :class_name => Doorkeeper.config.access_grant_model.name, :foreign_key => :resource_owner_id
:whitespace => { :leading => false, :trailing => false },
:width => { :minimum => 3 }
validate :display_name_cannot_be_user_id_with_other_id, :if => proc { |u| u.display_name_changed? }
- validates :email, :presence => true, :confirmation => true, :characters => true
+ validates :email, :presence => true, :characters => true
validates :email, :if => proc { |u| u.email_changed? },
:uniqueness => { :case_sensitive => false }
validates :email, :if => proc { |u| u.email_changed? },
##
# revoke any authentication tokens
def revoke_authentication_tokens
- oauth_tokens.authorized.each(&:invalidate!)
access_tokens.not_expired.each(&:revoke)
end
suspend! if may_suspend? && spam_score > Settings.spam_threshold
end
- ##
- # return an oauth 1 access token for a specified application
- def access_token(application_key)
- ClientApplication.find_by(:key => application_key).access_token_for_user(self)
- end
-
##
# return an oauth 2 access token for a specified application
def oauth_token(application_id)
def max_messages_per_hour
account_age_in_seconds = Time.now.utc - created_at
account_age_in_hours = account_age_in_seconds / 3600
- recent_messages = messages.where("sent_on >= ?", Time.now.utc - 3600).count
+ recent_messages = messages.where(:sent_on => Time.now.utc - 3600..).count
max_messages = account_age_in_hours.ceil + recent_messages - (active_reports * 10)
max_messages.clamp(0, Settings.max_messages_per_hour)
end
def max_friends_per_hour
account_age_in_seconds = Time.now.utc - created_at
account_age_in_hours = account_age_in_seconds / 3600
- recent_friends = Friendship.where(:befriendee => self).where("created_at >= ?", Time.now.utc - 3600).count
+ recent_friends = Friendship.where(:befriendee => self).where(:created_at => Time.now.utc - 3600..).count
max_friends = account_age_in_hours.ceil + recent_friends - (active_reports * 10)
max_friends.clamp(0, Settings.max_friends_per_hour)
end
if moderator?
Settings.moderator_changeset_comments_per_hour
else
- previous_comments = changeset_comments.limit(200).count
- max_comments = previous_comments / 200.0 * Settings.max_changeset_comments_per_hour
+ previous_comments = changeset_comments.limit(Settings.comments_to_max_changeset_comments).count
+ max_comments = previous_comments / Settings.comments_to_max_changeset_comments.to_f * Settings.max_changeset_comments_per_hour
max_comments = max_comments.floor.clamp(Settings.initial_changeset_comments_per_hour, Settings.max_changeset_comments_per_hour)
max_comments /= 2**active_reports
max_comments.floor.clamp(Settings.min_changeset_comments_per_hour, Settings.max_changeset_comments_per_hour)