talho/openphin

View on GitHub
app/models/device.rb

Summary

Maintainability
A
35 mins
Test Coverage
# == Schema Information
#
# Table name: devices
#
#  id            :integer(4)      not null, primary key
#  user_id       :integer(4)
#  type          :string(255)
#  description   :string(255)
#  name          :string(255)
#  coverage      :string(255)
#  emergency_use :boolean(1)
#  home_use      :boolean(1)
#  options       :text
#

class Device < ActiveRecord::Base
  has_many :deliveries
  belongs_to :user
  has_paper_trail :meta => { :item_desc  => Proc.new { |x| x.to_s } }

  scope :email, :conditions => "type = 'Device::EmailDevice'"
  scope :phone, :conditions => "type = 'Device::PhoneDevice'"
  scope :sms, :conditions => "type = 'Device::SmsDevice'"
  scope :fax, :conditions => "type = 'Device::FaxDevice'"
  scope :blackberry, :conditions => "type = 'Device::BlackberryDevice'"
  scope :im, :conditions => "type = 'Device::ImDevice'"

  serialize :options, Hash

  Types = [Device::EmailDevice, Device::PhoneDevice, Device::SmsDevice, Device::FaxDevice, Device::BlackberryDevice] #, Device::ImDevice]

  validate :check_uniq_device

  def parent
    :user
  end

  def self.display_name
    'Device'
  end

  def to_dsml(builder=nil)
    builder=::Builder::XmlMarkup.new( :indent => 2) if builder.nil?
    builder.dsml(:entry, :dn => dn) do |entry|
      entry.dsml(:objectclass) do |oc|
        ocv="oc-value".to_sym
        oc.dsml ocv, "top"
        oc.dsml ocv, "organizationalUnit"
        oc.dsml ocv, "AlertCommunicationDevice"
      end
      entry.dsml(:attr, :name => :cn) {|a| a.dsml :value, cn}
      entry.dsml(:attr, :name => :description) {|a| a.dsml :value, description}
      entry.dsml(:attr, :name => :deviceName) {|a| a.dsml :value, deviceName}
      entry.dsml(:attr, :name => :deviceType) {|a| a.dsml :value, deviceType}
      entry.dsml(:attr, :name => :coverage) {|a| a.dsml :value, coverage}
      entry.dsml(:attr, :name => :emailAddress) {|a| a.dsml :value, mail}
      entry.dsml(:attr, :name => :areaCode) {|a| a.dsml :value, areaCode}
      entry.dsml(:attr, :name => :exchnage) {|a| a.dsml :value, exchange}
      entry.dsml(:attr, :name => :line) {|a| a.dsml :value, line}
      entry.dsml(:attr, :name => :rank) {|a| a.dsml :value, rank}
      entry.dsml(:attr, :name => :pin) {|a| a.dsml :value, pin}
      entry.dsml(:attr, :name => :countryPrefix) {|a| a.dsml :value, countryPrefix}
      entry.dsml(:attr, :name => :internationalNumber) {|a| a.dsml :value, internationalNumber}
      entry.dsml(:attr, :name => :emergencyUseInd) {|a| a.dsml :value, emergencyUseInd}
      entry.dsml(:attr, :name => :homeInd) {|a| a.dsml :value, homeInd}
    end
  end

  def to_s
    self.class.display_name
  end

  def URN
    self.options[self.key]
  end

  private

  def check_uniq_device
    if options.blank?
      errors.add(:base, "Device is blank")
    else
      devices = Device.find_all_by_user_id_and_type(user_id, type)
      devices = Device.find(:all, :conditions => ['id != ? AND user_id = ? AND type = ?', id, user_id, type]) if(!id.nil? && devices.map(&:id).include?(id))
      errors.add(:base, "Device already exists") if(devices.map(&:options).map{|item| item.values}.flatten.include?(options.values.first))
    end
  end
end