OSDN Git Service

t#30328:create op import ...and pull
[pettanr/pettanr.git] / app / models / provider_original_picture.rb
diff --git a/app/models/provider_original_picture.rb b/app/models/provider_original_picture.rb
new file mode 100644 (file)
index 0000000..3178a45
--- /dev/null
@@ -0,0 +1,148 @@
+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
+    p = Picture.find_by_original_picture_id_and_revision(attr['original_picture_id'], attr['revision']) || Picture.new
+    p.attributes = attr
+    p
+  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_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.import_original_picture pid, providers_original_pictures
+    res = []
+    providers_original_pictures.each do |providers_original_picture_attr|
+      provider_original_picture = ProviderOriginalPicture.get_one(pid, providers_original_picture_attr['id'])
+      demander_original_picture = provider_original_picture.modify_original_picture providers_original_picture_attr
+      if demander_original_picture.valid?
+        provider_original_picture.attributes = {:provider_id => pid, :providers_original_picture_id => providers_original_picture_attr['id'], :demanders_original_picture_id => demander_original_picture.id}
+        unless provider_original_picture.save
+          res << providers_original_picture_attr
+        end
+      else
+        res << providers_original_picture_attr
+      end
+    end
+    res
+  end
+  
+  def self.import_picture pid, providers_pictures
+    res = []
+    providers_pictures.each do |providers_picture_attr|
+      if ProviderOriginalPicture.replace_original_picture(pid, providers_picture_attr) and
+        ProviderOriginalPicture.replace_artist(pid, providers_picture_attr) and
+        ProviderOriginalPicture.replace_license(pid, providers_picture_attr)
+        picture_data = Base64.decode64 providers_picture_attr['picture_data']
+        providers_picture_attr.delete 'picture_data'
+        if imager = PettanImager.load(picture_data)
+          picture = ProviderOriginalPicture.modify_picture providers_picture_attr
+          if picture.store(imager)
+          else
+            res << providers_picture_attr
+          end
+        else
+          res << providers_picture_attr
+        end
+      else
+        res << providers_picture_attr
+      end
+    end
+    res
+  end
+  
+  def self.import_resource_picture pid, providers_original_pictures
+    res = []
+    providers_original_pictures.each do |providers_original_picture_attr|
+      providers_resource_picture_attr = providers_original_picture_attr['resource_picture']
+      if ProviderOriginalPicture.replace_original_picture(pid, providers_resource_picture_attr) and
+        ProviderOriginalPicture.replace_artist(pid, providers_resource_picture_attr) and
+        ProviderOriginalPicture.replace_license(pid, providers_resource_picture_attr)
+        picture_data = Base64.decode64 providers_resource_picture_attr['picture_data']
+        providers_resource_picture_attr.delete 'picture_data'
+        if imager = PettanImager.load(picture_data)
+          resource_picture = ProviderOriginalPicture.modify_resource_picture providers_resource_picture_attr
+          if resource_picture.store(imager)
+          else
+            res << providers_resource_picture_attr
+          end
+        else
+          res << providers_resource_picture_attr
+        end
+      else
+        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_picture(pid, original_pictures)
+      res[:original_pictures] = r
+      raise ActiveRecord::Rollback if r.any?
+      r = ProviderOriginalPicture.import_picture(pid, pictures)
+      res[:pictures] = r
+      raise ActiveRecord::Rollback if r.any?
+      r = ProviderOriginalPicture.import_resource_picture(pid, original_pictures)
+      res[:resource_pictures] = r
+      raise ActiveRecord::Rollback if r.any?
+    end
+    res
+  end
+  
+end