OSDN Git Service

Merge branch 'v05' of git.sourceforge.jp:/gitroot/pettanr/pettanr into v05client
[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..78e8f1c
--- /dev/null
@@ -0,0 +1,184 @@
+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