OSDN Git Service

a9a20ec599e83b77ef70b7a0ad5a5fd4e51100d3
[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.list
56     SpeechBalloonTemplate.find(:all)
57   end
58   
59   def self.show rid
60     r = SpeechBalloonTemplate.find(rid)
61     r
62   end
63   
64   def self.parse(data)
65     res = data
66     begin
67       res = JSON.parse(data) if data.is_a?(String)
68     rescue 
69       return false
70     end
71     res
72   end
73   
74   def self.import(data)
75     d = SpeechBalloonTemplate.parse(data)
76     return false unless d
77     res = []
78     SpeechBalloonTemplate.transaction do
79       d.each do |name, hash|
80         st = SpeechBalloonTemplate.store name, hash
81         res.push(st) unless st.valid?
82       end
83       raise ActiveRecord::Rollback unless res.empty?
84     end
85     res
86   end
87   
88   def self.import_file(filename)
89     t = nil
90     begin
91       t = File.open(filename, 'r').read
92     rescue
93       return false
94     end
95     SpeechBalloonTemplate.import t
96   end
97   
98 end