OSDN Git Service

b5f12e0cbf9af65868d0ce0c149ab91000c60f13
[pettanr/pettanr.git] / app / models / speech_balloon_template.rb
1 class SpeechBalloonTemplate < ActiveRecord::Base
2   has_many :speech_balloons
3   
4   validates :name, :presence => true, :uniqueness => true, :length => {:maximum => 50}
5   validates :classname, :presence => true, :length => {:maximum => 50}
6   validates :caption, :presence => true, :length => {:maximum => 30}
7   validates :t, :presence => true, :numericality => {:greater_than_or_equal_to => 0}
8   validates :settings, :presence => true
9   
10   before_create :supply_t
11   
12   def supply_t
13     m = SpeechBalloonTemplate.maximum(:t)
14     t = m.blank? ? -1 : m.to_i
15     self.t = t + 1
16   end
17   
18   def pic_rehash hash
19     res = true
20     hash["templates"].each do |n, v|
21       d = (v["balloon"] || {})["system_picture"]
22       next nil if d.blank?
23       sp = SystemPicture.store Base64.decode64(d.to_s)
24       unless sp
25         res = false
26         break
27       end
28       v["balloon"]["system_picture_id"] = sp.id
29       v["balloon"].delete "system_picture"
30     end
31     res
32   end
33   
34   def store hash
35     res = nil
36     SpeechBalloonTemplate.transaction do
37       res = pic_rehash hash
38       if res
39         data = {:classname => hash["classname"], :caption => hash["caption"], :settings => hash.to_s}
40         self.attributes = data
41         res = self.save
42       end
43       raise ActiveRecord::Rollback unless res
44     end
45     res
46   end
47   
48   def self.store name, hash
49     st = SpeechBalloonTemplate.find_by_name name
50     st = SpeechBalloonTemplate.new(:name => name) unless st
51     st.store hash
52     st
53   end
54   
55   def self.parse(data)
56     res = data
57     begin
58       res = JSON.parse(data) if data.is_a?(String)
59     rescue 
60       return false
61     end
62     res
63   end
64   
65   def self.import(data)
66     d = SpeechBalloonTemplate.parse(data)
67     return false unless d
68     res = []
69     SpeechBalloonTemplate.transaction do
70       d.each do |name, hash|
71         st = SpeechBalloonTemplate.store name, hash
72         res.push(st) unless st.valid?
73       end
74       raise ActiveRecord::Rollback unless res.empty?
75     end
76     res
77   end
78   
79   def self.import_file(filename)
80     t = nil
81     begin
82       t = File.open(filename, 'r').read
83     rescue
84       return false
85     end
86     SpeechBalloonTemplate.import t
87   end
88   
89 end