OSDN Git Service

t#30328:create op import ...and pull
[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     p = Picture.find_by_original_picture_id_and_revision(attr['original_picture_id'], attr['revision']) || Picture.new
26     p.attributes = attr
27     p
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_pictures
67     res = []
68     providers_original_pictures.each do |providers_original_picture_attr|
69       provider_original_picture = ProviderOriginalPicture.get_one(pid, providers_original_picture_attr['id'])
70       demander_original_picture = provider_original_picture.modify_original_picture providers_original_picture_attr
71       if demander_original_picture.valid?
72         provider_original_picture.attributes = {:provider_id => pid, :providers_original_picture_id => providers_original_picture_attr['id'], :demanders_original_picture_id => demander_original_picture.id}
73         unless provider_original_picture.save
74           res << providers_original_picture_attr
75         end
76       else
77         res << providers_original_picture_attr
78       end
79     end
80     res
81   end
82   
83   def self.import_picture pid, providers_pictures
84     res = []
85     providers_pictures.each do |providers_picture_attr|
86       if ProviderOriginalPicture.replace_original_picture(pid, providers_picture_attr) and
87         ProviderOriginalPicture.replace_artist(pid, providers_picture_attr) and
88         ProviderOriginalPicture.replace_license(pid, providers_picture_attr)
89         picture_data = Base64.decode64 providers_picture_attr['picture_data']
90         providers_picture_attr.delete 'picture_data'
91         if imager = PettanImager.load(picture_data)
92           picture = ProviderOriginalPicture.modify_picture providers_picture_attr
93           if picture.store(imager)
94           else
95             res << providers_picture_attr
96           end
97         else
98           res << providers_picture_attr
99         end
100       else
101         res << providers_picture_attr
102       end
103     end
104     res
105   end
106   
107   def self.import_resource_picture pid, providers_original_pictures
108     res = []
109     providers_original_pictures.each do |providers_original_picture_attr|
110       providers_resource_picture_attr = providers_original_picture_attr['resource_picture']
111       if ProviderOriginalPicture.replace_original_picture(pid, providers_resource_picture_attr) and
112         ProviderOriginalPicture.replace_artist(pid, providers_resource_picture_attr) and
113         ProviderOriginalPicture.replace_license(pid, providers_resource_picture_attr)
114         picture_data = Base64.decode64 providers_resource_picture_attr['picture_data']
115         providers_resource_picture_attr.delete 'picture_data'
116         if imager = PettanImager.load(picture_data)
117           resource_picture = ProviderOriginalPicture.modify_resource_picture providers_resource_picture_attr
118           if resource_picture.store(imager)
119           else
120             res << providers_resource_picture_attr
121           end
122         else
123           res << providers_resource_picture_attr
124         end
125       else
126         res << providers_resource_picture_attr
127       end
128     end
129     res
130   end
131   
132   def self.import pid, original_pictures, pictures
133     res = {:original_pictures => [], :pictures => [], :resource_pictures => []}
134     ProviderOriginalPicture.transaction do
135       r = ProviderOriginalPicture.import_original_picture(pid, original_pictures)
136       res[:original_pictures] = r
137       raise ActiveRecord::Rollback if r.any?
138       r = ProviderOriginalPicture.import_picture(pid, pictures)
139       res[:pictures] = r
140       raise ActiveRecord::Rollback if r.any?
141       r = ProviderOriginalPicture.import_resource_picture(pid, original_pictures)
142       res[:resource_pictures] = r
143       raise ActiveRecord::Rollback if r.any?
144     end
145     res
146   end
147   
148 end