class SpeechBalloonTemplate < ActiveRecord::Base
- has_many :balloon_templates, :dependent => :destroy
- has_many :speech_templates, :dependent => :destroy
- accepts_nested_attributes_for :balloon_templates
- accepts_nested_attributes_for :speech_templates
+ has_many :speech_balloons
+
+ validates :name, :presence => true, :uniqueness => true, :length => {:maximum => 50}
+ validates :classname, :presence => true, :length => {:maximum => 50}
+ validates :caption, :presence => true, :length => {:maximum => 30}
+ validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
+ validates :settings, :presence => true
+
before_create :supply_t
def supply_t
- self.t = SpeechBalloon.maximum(:t).to_i + 1
+ m = SpeechBalloonTemplate.maximum(:t)
+ t = m.blank? ? -1 : m.to_i
+ self.t = t + 1
+ end
+
+ def pic_rehash hash
+ res = true
+ hash["templates"].each do |n, v|
+ d = (v["balloon"] || {})["system_picture"]
+ next nil if d.blank?
+ sp = SystemPicture.store Base64.decode64(d.to_s)
+ unless sp
+ res = false
+ break
+ end
+ v["balloon"]["system_picture_id"] = sp.id
+ v["balloon"].delete "system_picture"
+ end
+ res
+ end
+
+ def store hash
+ res = nil
+ SpeechBalloonTemplate.transaction do
+ res = pic_rehash hash
+ if res
+ data = {:classname => hash["classname"], :caption => hash["caption"], :settings => hash.to_s}
+ self.attributes = data
+ res = self.save
+ end
+ raise ActiveRecord::Rollback unless res
+ end
+ res
+ end
+
+ def self.store name, hash
+ st = SpeechBalloonTemplate.find_by_name name
+ st = SpeechBalloonTemplate.new(:name => name) unless st
+ st.store hash
+ st
+ end
+
+ def self.parse(data)
+ res = data
+ begin
+ res = JSON.parse(data) if data.is_a?(String)
+ rescue
+ return false
+ end
+ res
+ end
+
+ def self.import(data)
+ d = SpeechBalloonTemplate.parse(data)
+ return false unless d
+ res = []
+ SpeechBalloonTemplate.transaction do
+ d.each do |name, hash|
+ st = SpeechBalloonTemplate.store name, hash
+ res.push(st) unless st.valid?
+ end
+ raise ActiveRecord::Rollback unless res.empty?
+ end
+ res
+ end
+
+ def self.import_file(filename)
+ t = nil
+ begin
+ t = File.open(filename, 'r').read
+ rescue
+ return false
+ end
+ SpeechBalloonTemplate.import t
end
end