OSDN Git Service

fix: fetch fail
[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_picture pid, attr
57     pc = Picture.head attr['original_picture_id'].to_i
58     return false unless pc
59     attr['picture_id'] = pc.id
60   end
61   
62   def self.replace_original_picture pid, attr
63     pop = ProviderOriginalPicture.get_one pid, attr['original_picture_id'].to_i
64     if pop.original_picture
65       attr['original_picture_id'] = pop.original_picture.id
66       true
67     else
68       false
69     end
70   end
71   
72   def self.unpublish_resource_picture provider_original_picture, providers_original_picture_attr
73     res = true
74     resource_picture = if provider_original_picture.original_picture and provider_original_picture.original_picture.resource_picture
75       provider_original_picture.original_picture.resource_picture
76     else
77       nil
78     end
79     if providers_original_picture_attr['stopped_at'] and resource_picture
80       res = resource_picture.unpublish
81     end
82     res
83   end
84   
85   def self.import_original_picture pid, providers_original_picture_attr
86     return providers_original_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_original_picture_attr)
87     provider_original_picture = ProviderOriginalPicture.get_one(pid, providers_original_picture_attr['id'])
88     popid = providers_original_picture_attr['id']
89     providers_original_picture_attr.delete 'id'
90 #    resource_picture = providers_original_picture_attr['resource_picture']
91     providers_original_picture_attr.delete 'resource_picture'
92     return providers_original_picture_attr unless ProviderOriginalPicture.unpublish_resource_picture provider_original_picture, providers_original_picture_attr
93     demander_original_picture = provider_original_picture.modify_original_picture providers_original_picture_attr
94 #    providers_original_picture_attr['resource_picture'] = resource_picture
95     return providers_original_picture_attr unless demander_original_picture.valid?
96     provider_original_picture.attributes = {:provider_id => pid, :providers_original_picture_id => popid, :demanders_original_picture_id => demander_original_picture.id}
97     return providers_original_picture_attr unless provider_original_picture.save
98     nil
99   end
100   
101   def self.import_original_pictures pid, providers_original_pictures
102     res = []
103     providers_original_pictures.each do |providers_original_picture_attr|
104       tmp_attr = providers_original_picture_attr.dup
105       if r = ProviderOriginalPicture.import_original_picture(pid, tmp_attr)
106         res << providers_original_picture_attr
107       end
108     end
109     res
110   end
111   
112   def self.import_picture pid, providers_picture_attr
113     return providers_picture_attr unless ProviderOriginalPicture.replace_original_picture(pid, providers_picture_attr)
114     return providers_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_picture_attr)
115     return providers_picture_attr unless ProviderOriginalPicture.replace_license(pid, providers_picture_attr)
116     ppid = providers_picture_attr['id']
117     providers_picture_attr.delete 'id'
118     picture_data = Base64.decode64 providers_picture_attr['picture_data']
119     providers_picture_attr.delete 'picture_data'
120     imager = PettanImager.load(picture_data)
121     return providers_picture_attr unless imager
122     picture = ProviderOriginalPicture.modify_picture providers_picture_attr
123     return providers_picture_attr unless picture.store(imager)
124     nil
125   end
126   
127   def self.import_pictures pid, providers_pictures
128     res = []
129     providers_pictures.each do |providers_picture_attr|
130       tmp_attr = providers_picture_attr.dup
131       if r = ProviderOriginalPicture.import_picture(pid, tmp_attr)
132         res << providers_picture_attr
133       end
134     end
135     res
136   end
137   
138   def self.import_resource_picture pid, providers_resource_picture_attr
139     return providers_resource_picture_attr unless ProviderOriginalPicture.replace_original_picture(pid, providers_resource_picture_attr)
140     return providers_resource_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_resource_picture_attr)
141     return providers_resource_picture_attr unless ProviderOriginalPicture.replace_license(pid, providers_resource_picture_attr)
142     return providers_resource_picture_attr unless ProviderOriginalPicture.replace_picture(pid, providers_resource_picture_attr)
143     prpid = providers_resource_picture_attr['id']
144     providers_resource_picture_attr.delete 'id'
145     picture_data = Base64.decode64 providers_resource_picture_attr['picture_data']
146     providers_resource_picture_attr.delete 'picture_data'
147     imager = PettanImager.load(picture_data)
148     return providers_resource_picture_attr unless imager
149     resource_picture = ProviderOriginalPicture.modify_resource_picture providers_resource_picture_attr
150     return providers_resource_picture_attr unless resource_picture.save
151     return providers_resource_picture_attr unless resource_picture.store_picture_with_gif(imager)
152     nil
153   end
154   
155   def self.import_resource_pictures pid, providers_original_pictures
156     res = []
157     providers_original_pictures.each do |providers_original_picture_attr|
158       providers_resource_picture_attr = providers_original_picture_attr['resource_picture']
159       next nil unless providers_resource_picture_attr
160       tmp_attr = providers_resource_picture_attr.dup
161       if r = ProviderOriginalPicture.import_resource_picture(pid, tmp_attr)
162         res << providers_resource_picture_attr
163       end
164     end
165     res
166   end
167   
168   def self.import pid, original_pictures, pictures
169     res = nil
170     ProviderOriginalPicture.transaction do
171       r = ProviderOriginalPicture.import_original_pictures(pid, original_pictures)
172       if r.any?
173         res = OriginalPictureImportResult.new r
174         raise ActiveRecord::Rollback
175       end
176       r = ProviderOriginalPicture.import_pictures(pid, pictures)
177       if r.any?
178         res = PictureImportResult.new r
179         raise ActiveRecord::Rollback
180       end
181       r = ProviderOriginalPicture.import_resource_pictures(pid, original_pictures)
182       if r.any?
183         res = ResourcePictureImportResult.new r
184         raise ActiveRecord::Rollback
185       end
186       res = OriginalPictureImportResult.new []
187     end
188     res
189   end
190   
191 end