lib/spontaneous/permissions/user_level.rb
# encoding: UTF-8
require 'yaml'
module Spontaneous::Permissions
class UserLevel
class Root
private(:initialize)
def self.>(level) ; level < Root ; end
def self.>=(level) ; true ; end
def self.<=>(level) ; 1 ; end
def self.to_s ; 'root'; end
def self.to_sym ; :root ; end
def self.can_publish? ; true ; end
def self.developer? ; true ; end
def self.admin? ; true ; end
end
class None
private(:initialize)
def self.>(level) ; false ; end
def self.>=(level) ; level.equal?(None); end
def self.<=>(level) ; -1 ; end
def self.to_s ; 'none'; end
def self.to_sym ; :none ; end
def self.can_publish? ; false ; end
def self.developer? ; false ; end
def self.admin? ; false ; end
end
class Level
@@instances = Hash.new
def self.[](value, description)
name = description.delete(:name)
if @@instances.key?(value.to_i)
@@instances[value.to_i]
else
@@instances[value.to_i] = self.new(name, value.to_i, description)
end
end
attr_reader :name, :value
alias_method :to_i, :value
def initialize(name, value, permissions)
@name, @value, @permissions = name.to_sym, value.to_i, permissions
end
def >(level)
return false if level.equal?(Root)
return true if level.equal?(None)
@value > level.to_i
end
def >=(level)
return false if level.equal?(Root)
return true if level.equal?(None)
@value >= level.to_i
end
def <(level)
return true if level.equal?(Root)
return false if level.equal?(None)
@value < level.to_i
end
def <=>(level)
return -1 if level.equal?(Root)
return 1 if level.equal?(None)
@value <=> level.to_i
end
def ==(level)
return false if level.equal?(Root)
return false if level.equal?(None)
return @value == level.to_i
end
def can_publish?
@permissions[:publish] || false
end
def developer?
@permissions[:developer] || false
end
# Users with admin level can access the user manager interface
def admin?
@permissions[:admin] || false
end
def to_s
@name.to_s
end
def to_sym
@name.to_sym
end
end
class << self
def minimum
get(all[1]) || None
end
def [](level)
get(level)
end
def get(level)
store[level.to_sym]
end
def all(base_level = nil)
list = store.values.sort { |a, b| a <=> b }
list.reject! { |l| l > get(base_level) } if base_level
list
end
def root
Root
end
def none
None
end
def level_file
Spontaneous.root / 'config/user_levels.yml'
end
# def level_file=(file)
# @level_file = file
# end
def reset!
@initialised = false
@store = nil
end
def init!
return if @initialised
store[:none] = None
store[:root] = Root
numeric = 1
if File.exists?(level_file)
levels = YAML.load_file(level_file)
levels.each_with_index do |description, index|
level = Level[(index+1), description]
store[level.name] = level
end
else
logger.warn {
"User level file '#{level_file}' missing, unable to load User Levels"
}
end
@initialised = true
end
def store
if !@store
@store = Hash.new
init!
end
@store
end
def method_missing(method, *args)
if level = get(method)
level
else
super
end
end
end
end
end