/lib/sunrise/models/user.rb

https://github.com/galetahub/sunrise-core · Ruby · 158 lines · 128 code · 27 blank · 3 comment · 12 complexity · 52c73b73dc7f2207c7eb2f2c87a0054b MD5 · raw file

  1. # encoding: utf-8
  2. require 'fastercsv'
  3. module Sunrise
  4. module Models
  5. module User
  6. def self.included(base)
  7. base.send :include, InstanceMethods
  8. base.send :extend, ClassMethods
  9. end
  10. module ClassMethods
  11. def self.extended(base)
  12. base.class_eval do
  13. has_many :roles, :dependent => :delete_all, :autosave => true
  14. has_one :avatar, :as => :assetable, :dependent => :destroy, :autosave => true
  15. before_validation :generate_login, :if => :has_login?
  16. before_create :set_default_role, :if => :roles_empty?
  17. validates_presence_of :name
  18. scope :with_email, lambda {|email| where(["email LIKE ?", "#{email}%"]) }
  19. scope :with_name, lambda {|name| where(["name LIKE ?", "#{name}%"]) }
  20. scope :with_role, lambda {|role_id| joins(:roles).merge(::Role.with_type(role_id)) }
  21. scope :defaults, with_role(::RoleType.default.id)
  22. scope :moderators, with_role(::RoleType.moderator.id)
  23. scope :admins, with_role(::RoleType.admin.id)
  24. end
  25. end
  26. def to_csv(options = {})
  27. options = { :columns => [:id, :email, :name, :current_sign_in_ip] }.merge(options)
  28. query = unscoped.order("#{quoted_table_name}.id ASC").select(options[:columns])
  29. FasterCSV.generate do |csv|
  30. csv << options[:columns]
  31. query.find_in_batches do |group|
  32. group.each do |user|
  33. csv << options[:columns].inject([]) do |items, attr_name|
  34. items << user.send(attr_name)
  35. end
  36. end
  37. end
  38. end
  39. end
  40. end
  41. module InstanceMethods
  42. def default?
  43. has_role?(:default)
  44. end
  45. def moderator?
  46. has_role?(:moderator)
  47. end
  48. def admin?
  49. has_role?(:admin)
  50. end
  51. def has_role?(role_name)
  52. role_symbols.include?(role_name.to_sym)
  53. end
  54. def roles_empty?
  55. self.roles.empty?
  56. end
  57. def has_login?
  58. respond_to?(:login)
  59. end
  60. def roles_attributes=(value)
  61. options = value || {}
  62. options.each do |k, v|
  63. create_or_destroy_role(k.to_i, v.to_i == 1)
  64. end
  65. end
  66. def role_symbols
  67. (roles || []).map {|r| r.to_sym}
  68. end
  69. def current_role
  70. self.roles.first
  71. end
  72. def role_type_id
  73. if current_role
  74. current_role.role_type.id
  75. end
  76. end
  77. def role_type_id=(value)
  78. role_id = value.blank? ? nil : value.to_i
  79. if ::RoleType.legal?(role_id)
  80. ::RoleType.all.each do |role_type|
  81. create_or_destroy_role(role_type.id, role_type.id == role_id)
  82. end
  83. end
  84. end
  85. def state
  86. return 'active' if active_for_authentication?
  87. return 'register' unless confirmed?
  88. return 'suspend' if access_locked?
  89. return 'pending'
  90. end
  91. def events_for_current_state
  92. events = []
  93. events << 'activate' unless confirmed?
  94. events << 'unlock' if access_locked?
  95. # TODO: ban access for active users
  96. # events << 'suspend' if active_for_authentication?
  97. events
  98. end
  99. def avatar_small_url
  100. if self.avatar
  101. self.avatar.data.small.url
  102. else
  103. "/images/manage/user_pic_small.gif"
  104. end
  105. end
  106. protected
  107. def set_default_role
  108. unless has_role?(:default)
  109. self.roles.build(:role_type => ::RoleType.default)
  110. end
  111. end
  112. def create_or_destroy_role(role_id, need_create = true)
  113. role = self.roles.detect { |r| r.role_type.id == role_id }
  114. if need_create
  115. role ||= self.roles.build(:role_type => ::RoleType.find(role_id))
  116. elsif !role.nil?
  117. self.roles.delete(role)
  118. end
  119. end
  120. def generate_login
  121. self.login ||= begin
  122. unless email.blank?
  123. tmp_login = email.split('@').first
  124. tmp_login.parameterize.downcase.gsub(/[^A-Za-z0-9-]+/, '-').gsub(/-+/, '-')
  125. end
  126. end
  127. end
  128. end
  129. end
  130. end
  131. end