tmpsets/set/mod007-05_standard/abstract/attachment.rb in card-1.16.3 vs tmpsets/set/mod007-05_standard/abstract/attachment.rb in card-1.16.4
- old
+ new
@@ -1,51 +1,169 @@
# -*- encoding : utf-8 -*-
class Card; module Set; module Abstract; module Attachment; extend Card::Set # ~~~~~~~~~~~ above autogenerated; below pulled from /Users/ethan/dev/wagn/gem/card/mod/05_standard/set/abstract/attachment.rb ~~~~~~~~~~~
require 'carrier_wave/cardmount'
+
def self.included host_class
host_class.extend CarrierWave::CardMount
end
+event :select_file_revision, :after=>:select_action do
+ attachment.retrieve_from_store!(attachment.identifier)
+end
-event :write_identifier, :after=>:assign_action do
- self.content = attachment.db_content
+event :determine_store_place, :before=>:prepare, :on=>:update do
+ @store_place = load_from_mod || :deck
end
-event :save_original_filename, :before=>:finalize_action do
- if @current_action
- @current_action.update_attributes! :comment=>original_filename
+event :upload_attachment, :before=>:validate_name, :on=>:save, :when=>proc { |c| c.preliminary_upload? } do
+ save_original_filename # save original filename as comment in action
+ write_identifier # set db_content (needs original filename to determine extension)
+ store_attachment!
+ finalize_action # create Card::Change entry for db_content
+ @current_action.update_attributes! :draft => true, :card_id => (new_card? ? upload_cache_card.id : id)
+
+ success << {
+ :target => (new_card? ? upload_cache_card : '_self'),
+ :type=> type_name,
+ :view => 'preview_editor',
+ :rev_id => current_action.id
+ }
+ abort :success
+end
+
+event :assign_attachment_on_create, :after=>:prepare, :on=>:create do
+ if save_preliminary_upload? && (action = Card::Action.fetch(Card::Env.params[:cached_upload]))
+ upload_cache_card.selected_action_id = action.id
+ upload_cache_card.select_file_revision
+ assign_attachment upload_cache_card.attachment.file, action.comment
+ action.delete # TODO: delete files too
end
end
-event :move_file_to_store_dir, :after=>:store, :on=>:create do
- if ::File.exist? tmp_store_dir
- if ::File.exist? store_dir
- FileUtils.rm_rf store_dir
- end
- FileUtils.mv tmp_store_dir, store_dir
+event :assign_attachment_on_update, :after=>:prepare, :on=>:update do
+ if save_preliminary_upload? && (action = Card::Action.fetch(Card::Env.params[:cached_upload]))
+ uploaded_file =
+ with_selected_action_id(action.id) do
+ attachment.file
+ end
+ assign_attachment uploaded_file, action.comment
+ action.delete
end
- if !(content =~ /^[:~]/)
- update_column(:db_content,attachment.db_content)
- expire
+end
+
+def assign_attachment file, original_filename
+ send "#{attachment_name}=", file
+ write_identifier
+ @current_action.update_attributes! :comment=>original_filename
+end
+
+# we need a card id for the path so we have to update db_content when we got an id
+event :correct_identifier, :after=>:store, :on=>:create do
+ update_column(:db_content,attachment.db_content(:mod=>load_from_mod))
+ expire
+end
+
+
+event :save_original_filename, :after=>:validate_name, :when => proc {|c| !c.preliminary_upload? && !c.save_preliminary_upload? && c.attachment_changed?} do
+ if @current_action
+ @current_action.update_attributes! :comment=>original_filename
end
end
+event :write_identifier, :after=>:save_original_filename do
+ self.content = attachment.db_content(:mod=>load_from_mod)
+end
+
+
+def upload_cache_card
+ @upload_cache_card ||= Card["new_#{attachment_name}".to_sym ]
+end
+
+def tmp_store_dir action_id=nil
+ "#{ Card.paths['files'].existent.first }/#{upload_cache_card.id}"
+end
+
def item_names(args={}) # needed for flexmail attachments. hacky.
[self.cardname]
end
def original_filename
attachment.original_filename
end
+def preliminary_upload?
+ Card::Env && Card::Env.params[:attachment_upload]
+end
+def save_preliminary_upload?
+ Card::Env.params[:cached_upload].present?
+end
+
+def attachment_changed?
+ send "#{attachment_name}_changed?"
+end
+
+def create_versions?
+ true
+end
+
+def store_place
+ @store_place ||= mod_file? || :deck
+end
+
+def load_from_mod= value
+ @mod = value
+end
+
+def load_from_mod
+ @mod
+end
+
+def store_dir
+ if (store_place == :deck)
+ if id
+ "#{ Card.paths['files'].existent.first }/#{id}"
+ else
+ tmp_store_dir
+ end
+ else
+ "#{ Cardio.gem_root}/mod/#{store_place}/file/#{codename}"
+ end
+end
+
+def mod_file?
+ # when db_content was changed assume that it's no longer a mod file
+ if @store_place != :deck && !db_content_changed? && content.present?
+ case content
+ when /^:[^\/]+\/([^.]+)/ ; $1 # current mod_file format
+ when /^\~/ ; false # current id file format
+ else
+ if lines = content.split("\n") and lines.size == 4 # old format, still used in card_changes.
+ lines.last
+ end
+ end
+ end
+end
+
+
def assign_set_specific_attributes
if @set_specific && @set_specific.present?
self.content = nil
end
super
end
+def clear_upload_tmp_dir
+ Dir.entries(tmp_store_dir).each do |filename|
+ if filename =~/^\d+/
+ path = File.join(tmp_store_dir, filename )
+ older_than_five_days = ( DateTime.now - File.ctime(path) > 432000)
+ if older_than_five_days
+ FileUtils.rm path
+ end
+ end
+ end
+end
def symlink_to(prior_action_id) # create filesystem links to files from prior action
if prior_action_id != last_action_id
save_action_id = selected_action_id
links = {}