OSDN Git Service

speech balloon template changed
[pettanr/pettanr.git] / app / models / speech_balloon_template.rb
index de6d053..b5f12e0 100644 (file)
@@ -1,12 +1,89 @@
 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