OSDN Git Service

t#30516:fix import rp
[pettanr/pettanr.git] / app / models / provider_original_picture.rb
1 class ProviderOriginalPicture < ActiveRecord::Base
2   belongs_to :provider
3   belongs_to :original_picture, :foreign_key => :demanders_original_picture_id
4   
5   validates :provider_id, :presence => true, :numericality => true, :existence => true
6   validates :providers_original_picture_id, :presence => true, :numericality => true
7   validates :demanders_original_picture_id, :presence => true, :numericality => true
8   
9   def self.get_one pid, popid
10     ProviderOriginalPicture.find_by_provider_id_and_providers_original_picture_id(pid, popid) || ProviderOriginalPicture.new
11   end
12   
13   def modify_original_picture attr
14     op = if self.original_picture
15       self.original_picture
16     else
17       OriginalPicture.new
18     end
19     op.attributes = attr
20     op.save!
21     op
22   end
23   
24   def self.modify_picture attr
25     pc = Picture.find_by_original_picture_id_and_revision(attr['original_picture_id'], attr['revision']) || Picture.new
26     pc.attributes = attr
27     pc
28   end
29   
30   def self.modify_resource_picture attr
31     rp = ResourcePicture.find_by_original_picture_id(attr['original_picture_id']) || ResourcePicture.new
32     rp.attributes = attr
33     rp
34   end
35   
36   def self.replace_artist pid, attr
37     pa = ProviderArtist.get_one pid, attr['artist_id'].to_i
38     if pa.artist
39       attr['artist_id'] = pa.artist.id
40       true
41     else
42       false
43     end
44   end
45   
46   def self.replace_license pid, attr
47     pl = ProviderLicense.get_one pid, attr['license_id'].to_i
48     if pl.license
49       attr['license_id'] = pl.license.id
50       true
51     else
52       false
53     end
54   end
55   
56   def self.replace_original_picture pid, attr
57     pop = ProviderOriginalPicture.get_one pid, attr['original_picture_id'].to_i
58     if pop.original_picture
59       attr['original_picture_id'] = pop.original_picture.id
60       true
61     else
62       false
63     end
64   end
65   
66   def self.import_original_picture pid, providers_original_picture_attr
67     return providers_original_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_original_picture_attr)
68     provider_original_picture = ProviderOriginalPicture.get_one(pid, providers_original_picture_attr['id'])
69     popid = providers_original_picture_attr['id']
70     providers_original_picture_attr.delete 'id'
71     resource_picture = providers_original_picture_attr['resource_picture']
72     providers_original_picture_attr.delete 'resource_picture'
73     demander_original_picture = provider_original_picture.modify_original_picture providers_original_picture_attr
74     providers_original_picture_attr['resource_picture'] = resource_picture
75     return providers_original_picture_attr unless demander_original_picture.valid?
76     provider_original_picture.attributes = {:provider_id => pid, :providers_original_picture_id => popid, :demanders_original_picture_id => demander_original_picture.id}
77     return providers_original_picture_attr unless provider_original_picture.save
78     nil
79   end
80   
81   def self.import_original_pictures pid, providers_original_pictures
82     res = []
83     providers_original_pictures.each do |providers_original_picture_attr|
84       org_attr = providers_original_picture_attr.dup
85       if r = ProviderOriginalPicture.import_original_picture(pid, providers_original_picture_attr)
86         res << org_attr
87       end
88     end
89     res
90   end
91   
92   def self.import_picture pid, providers_picture_attr
93     return providers_picture_attr unless ProviderOriginalPicture.replace_original_picture(pid, providers_picture_attr)
94     return providers_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_picture_attr)
95     return providers_picture_attr unless ProviderOriginalPicture.replace_license(pid, providers_picture_attr)
96     ppid = providers_picture_attr['id']
97     providers_picture_attr.delete 'id'
98     picture_data = Base64.decode64 providers_picture_attr['picture_data']
99     providers_picture_attr.delete 'picture_data'
100     imager = PettanImager.load(picture_data)
101     return providers_picture_attr unless imager
102     picture = ProviderOriginalPicture.modify_picture providers_picture_attr
103     return providers_picture_attr unless picture.store(imager)
104     nil
105   end
106   
107   def self.import_pictures pid, providers_pictures
108     res = []
109     providers_pictures.each do |providers_picture_attr|
110       org_attr = providers_picture_attr.dup
111       if r = ProviderOriginalPicture.import_picture(pid, providers_picture_attr)
112         res << org_attr
113       end
114     end
115     res
116   end
117   
118   def self.import_resource_picture pid, providers_resource_picture_attr
119     return providers_resource_picture_attr unless ProviderOriginalPicture.replace_original_picture(pid, providers_resource_picture_attr)
120     return providers_resource_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_resource_picture_attr)
121     return providers_resource_picture_attr unless ProviderOriginalPicture.replace_license(pid, providers_resource_picture_attr)
122     prpid = providers_resource_picture_attr['id']
123     providers_resource_picture_attr.delete 'id'
124     picture_data = Base64.decode64 providers_resource_picture_attr['picture_data']
125     providers_resource_picture_attr.delete 'picture_data'
126     imager = PettanImager.load(picture_data)
127     return providers_resource_picture_attr unless imager
128     resource_picture = ProviderOriginalPicture.modify_resource_picture providers_resource_picture_attr
129     return providers_resource_picture_attr unless resource_picture.store_picture_with_gif(imager)
130     return providers_resource_picture_attr unless resource_picture.save
131     nil
132   end
133   
134   def self.import_resource_pictures pid, providers_original_pictures
135     res = []
136     providers_original_pictures.each do |providers_original_picture_attr|
137       providers_resource_picture_attr = providers_original_picture_attr['resource_picture']
138       org_attr = providers_resource_picture_attr.dup
139       if r = ProviderOriginalPicture.import_resource_picture(pid, providers_resource_picture_attr)
140         res << org_attr
141       end
142     end
143     res
144   end
145   
146   def self.import pid, original_pictures, pictures
147     res = {:original_pictures => [], :pictures => [], :resource_pictures => []}
148     ProviderOriginalPicture.transaction do
149       r = ProviderOriginalPicture.import_original_pictures(pid, original_pictures)
150       res[:original_pictures] = r
151       raise ActiveRecord::Rollback if r.any?
152       r = ProviderOriginalPicture.import_pictures(pid, pictures)
153       res[:pictures] = r
154       raise ActiveRecord::Rollback if r.any?
155       r = ProviderOriginalPicture.import_resource_pictures(pid, original_pictures)
156       res[:resource_pictures] = r
157       raise ActiveRecord::Rollback if r.any?
158     end
159     res
160   end
161   
162 end