--- /dev/null
+class ProviderOriginalPicture < ActiveRecord::Base
+ belongs_to :provider
+ belongs_to :original_picture, :foreign_key => :demanders_original_picture_id
+
+ validates :provider_id, :presence => true, :numericality => true, :existence => true
+ validates :providers_original_picture_id, :presence => true, :numericality => true
+ validates :demanders_original_picture_id, :presence => true, :numericality => true
+
+ def self.get_one pid, popid
+ ProviderOriginalPicture.find_by_provider_id_and_providers_original_picture_id(pid, popid) || ProviderOriginalPicture.new
+ end
+
+ def modify_original_picture attr
+ op = if self.original_picture
+ self.original_picture
+ else
+ OriginalPicture.new
+ end
+ op.attributes = attr
+ op.save!
+ op
+ end
+
+ def self.modify_picture attr
+ pc = Picture.find_by_original_picture_id_and_revision(attr['original_picture_id'], attr['revision']) || Picture.new
+ pc.attributes = attr
+ pc
+ end
+
+ def self.modify_resource_picture attr
+ rp = ResourcePicture.find_by_original_picture_id(attr['original_picture_id']) || ResourcePicture.new
+ rp.attributes = attr
+ rp
+ end
+
+ def self.replace_artist pid, attr
+ pa = ProviderArtist.get_one pid, attr['artist_id'].to_i
+ if pa.artist
+ attr['artist_id'] = pa.artist.id
+ true
+ else
+ false
+ end
+ end
+
+ def self.replace_license pid, attr
+ pl = ProviderLicense.get_one pid, attr['license_id'].to_i
+ if pl.license
+ attr['license_id'] = pl.license.id
+ true
+ else
+ false
+ end
+ end
+
+ def self.replace_picture pid, attr
+ pc = Picture.head attr['original_picture_id'].to_i
+ return false unless pc
+ attr['picture_id'] = pc.id
+ end
+
+ def self.replace_original_picture pid, attr
+ pop = ProviderOriginalPicture.get_one pid, attr['original_picture_id'].to_i
+ if pop.original_picture
+ attr['original_picture_id'] = pop.original_picture.id
+ true
+ else
+ false
+ end
+ end
+
+ def self.unpublish_resource_picture provider_original_picture, providers_original_picture_attr
+ res = true
+ resource_picture = if provider_original_picture.original_picture and provider_original_picture.original_picture.resource_picture
+ provider_original_picture.original_picture.resource_picture
+ else
+ nil
+ end
+ if providers_original_picture_attr['stopped_at'] and resource_picture
+ res = resource_picture.unpublish
+ end
+ res
+ end
+
+ def self.import_original_picture pid, providers_original_picture_attr
+ return providers_original_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_original_picture_attr)
+ provider_original_picture = ProviderOriginalPicture.get_one(pid, providers_original_picture_attr['id'])
+ popid = providers_original_picture_attr['id']
+ providers_original_picture_attr.delete 'id'
+# resource_picture = providers_original_picture_attr['resource_picture']
+ providers_original_picture_attr.delete 'resource_picture'
+ return providers_original_picture_attr unless ProviderOriginalPicture.unpublish_resource_picture provider_original_picture, providers_original_picture_attr
+ demander_original_picture = provider_original_picture.modify_original_picture providers_original_picture_attr
+# providers_original_picture_attr['resource_picture'] = resource_picture
+ return providers_original_picture_attr unless demander_original_picture.valid?
+ provider_original_picture.attributes = {:provider_id => pid, :providers_original_picture_id => popid, :demanders_original_picture_id => demander_original_picture.id}
+ return providers_original_picture_attr unless provider_original_picture.save
+ nil
+ end
+
+ def self.import_original_pictures pid, providers_original_pictures
+ res = []
+ providers_original_pictures.each do |providers_original_picture_attr|
+ tmp_attr = providers_original_picture_attr.dup
+ if r = ProviderOriginalPicture.import_original_picture(pid, tmp_attr)
+ res << providers_original_picture_attr
+ end
+ end
+ res
+ end
+
+ def self.import_picture pid, providers_picture_attr
+ return providers_picture_attr unless ProviderOriginalPicture.replace_original_picture(pid, providers_picture_attr)
+ return providers_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_picture_attr)
+ return providers_picture_attr unless ProviderOriginalPicture.replace_license(pid, providers_picture_attr)
+ ppid = providers_picture_attr['id']
+ providers_picture_attr.delete 'id'
+ picture_data = Base64.decode64 providers_picture_attr['picture_data']
+ providers_picture_attr.delete 'picture_data'
+ imager = PettanImager.load(picture_data)
+ return providers_picture_attr unless imager
+ picture = ProviderOriginalPicture.modify_picture providers_picture_attr
+ return providers_picture_attr unless picture.store(imager)
+ nil
+ end
+
+ def self.import_pictures pid, providers_pictures
+ res = []
+ providers_pictures.each do |providers_picture_attr|
+ tmp_attr = providers_picture_attr.dup
+ if r = ProviderOriginalPicture.import_picture(pid, tmp_attr)
+ res << providers_picture_attr
+ end
+ end
+ res
+ end
+
+ def self.import_resource_picture pid, providers_resource_picture_attr
+ return providers_resource_picture_attr unless ProviderOriginalPicture.replace_original_picture(pid, providers_resource_picture_attr)
+ return providers_resource_picture_attr unless ProviderOriginalPicture.replace_artist(pid, providers_resource_picture_attr)
+ return providers_resource_picture_attr unless ProviderOriginalPicture.replace_license(pid, providers_resource_picture_attr)
+ return providers_resource_picture_attr unless ProviderOriginalPicture.replace_picture(pid, providers_resource_picture_attr)
+ prpid = providers_resource_picture_attr['id']
+ providers_resource_picture_attr.delete 'id'
+ picture_data = Base64.decode64 providers_resource_picture_attr['picture_data']
+ providers_resource_picture_attr.delete 'picture_data'
+ imager = PettanImager.load(picture_data)
+ return providers_resource_picture_attr unless imager
+ resource_picture = ProviderOriginalPicture.modify_resource_picture providers_resource_picture_attr
+ return providers_resource_picture_attr unless resource_picture.save
+ return providers_resource_picture_attr unless resource_picture.store_picture_with_gif(imager)
+ nil
+ end
+
+ def self.import_resource_pictures pid, providers_original_pictures
+ res = []
+ providers_original_pictures.each do |providers_original_picture_attr|
+ providers_resource_picture_attr = providers_original_picture_attr['resource_picture']
+ next nil unless providers_resource_picture_attr
+ tmp_attr = providers_resource_picture_attr.dup
+ if r = ProviderOriginalPicture.import_resource_picture(pid, tmp_attr)
+ res << providers_resource_picture_attr
+ end
+ end
+ res
+ end
+
+ def self.import pid, original_pictures, pictures
+ res = {:original_pictures => [], :pictures => [], :resource_pictures => []}
+ ProviderOriginalPicture.transaction do
+ r = ProviderOriginalPicture.import_original_pictures(pid, original_pictures)
+ res[:original_pictures] = r
+ raise ActiveRecord::Rollback if r.any?
+ r = ProviderOriginalPicture.import_pictures(pid, pictures)
+ res[:pictures] = r
+ raise ActiveRecord::Rollback if r.any?
+ r = ProviderOriginalPicture.import_resource_pictures(pid, original_pictures)
+ res[:resource_pictures] = r
+ raise ActiveRecord::Rollback if r.any?
+ end
+ res
+ end
+
+end