1
0
مراية لـ https://github.com/postalserver/postal.git تم المزامنة 2025-12-01 05:43:04 +00:00
الملفات
postal/app/models/organization.rb
2017-04-19 13:07:25 +01:00

119 أسطر
3.0 KiB
Ruby

# == Schema Information
#
# Table name: organizations
#
# id :integer not null, primary key
# uuid :string(255)
# name :string(255)
# permalink :string(255)
# time_zone :string(255)
# created_at :datetime
# updated_at :datetime
# ip_pool_id :integer
# owner_id :integer
# deleted_at :datetime
# suspended_at :datetime
# suspension_reason :string(255)
#
# Indexes
#
# index_organizations_on_permalink (permalink)
# index_organizations_on_uuid (uuid)
#
class Organization < ApplicationRecord
RESERVED_PERMALINKS = ['new', 'edit', 'remove', 'delete', 'destroy', 'admin', 'mail', 'org', 'server']
INITIAL_QUOTA = 10
INITIAL_SUPER_QUOTA = 10000
include HasUUID
include HasSoftDestroy
validates :name, :presence => true
validates :permalink, :presence => true, :format => {:with => /\A[a-z0-9\-]*\z/}, :uniqueness => true, :exclusion => {:in => RESERVED_PERMALINKS}
validates :time_zone, :presence => true
default_value :time_zone, -> { 'UTC' }
default_value :permalink, -> { Organization.find_unique_permalink(self.name) if self.name }
belongs_to :owner, :class_name => 'User'
has_many :organization_users, :dependent => :destroy
has_many :users, :through => :organization_users, :source_type => 'User'
has_many :user_invites, :through => :organization_users, :source_type => 'UserInvite', :source => :user
has_many :servers, :dependent => :destroy
has_many :domains, :as => :owner, :dependent => :destroy
has_many :organization_ip_pools, :dependent => :destroy
has_many :ip_pools, :through => :organization_ip_pools
has_many :ip_pool_rules, :dependent => :destroy, :as => :owner
after_create do
self.ip_pools << IPPool.transactional.default
end
def status
if self.suspended?
'Suspended'
else
'Active'
end
end
def to_param
permalink
end
def suspended?
suspended_at.present?
end
def admin?(user)
user.admin? ||
!!(owner?(user) || user_assignment(user)&.admin?)
end
def owner?(user)
self.owner == user
end
def accessible_by?(user)
user.admin? ||
!!(user_assignment(user))
end
def user_assignment(user)
@user_assignments ||= {}
@user_assignments[user.id] ||= organization_users.where(:user => user).first
end
def make_owner(new_owner)
user_assignment(new_owner).update(:admin => true, :all_servers => true)
update(:owner => new_owner)
end
# This is an array of addresses that should receive notifications for this organization
def notification_addresses
self.users.map(&:email_tag)
end
def self.find_unique_permalink(name)
loop.each_with_index do |_, i|
i = i + 1
proposal = name.parameterize
proposal += "-#{i}" if i > 1
unless self.where(:permalink => proposal).exists?
return proposal
end
end
end
def self.[](id)
if id.is_a?(String)
where(:permalink => id).first
else
where(:id => id.to_i).first
end
end
end