Class: RepositoryManager::RepoFile

Inherits:
RepoItem
  • Object
show all
Defined in:
app/models/repository_manager/repo_file.rb

Instance Method Summary collapse

Methods inherited from RepoItem

#can_be_shared_without_nesting?, #is_file?, #is_folder?, #move, #move!, #name_exist_in_siblings?, #rename, #rename!

Instance Method Details

#copy(options = {}) ⇒ Object



71
72
73
74
75
76
77
# File 'app/models/repository_manager/repo_file.rb', line 71

def copy(options = {})
  begin
    copy!(options)
  rescue RepositoryManager::ItemExistException, ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved
    false
  end
end

#copy!(options = {}) ⇒ Object

Copy itself into the source_folder options

:source_folder = the folder in witch you copy this item
:owner = the owner of the item
:sender = the sender of the item (if you don't specify sender.. The sender is still the same)
:overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')


33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'app/models/repository_manager/repo_file.rb', line 33

def copy!(options = {})
  !!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item

  new_item = RepositoryManager::RepoFile.new
  new_item.file = File.open(self.file.current_path)
  new_item.name = self.name

  options[:owner] ? new_item.owner = options[:owner] : new_item.owner = self.owner
  options[:sender] ? new_item.sender = options[:sender] : new_item.sender = self.sender

  if options[:source_folder]
    new_item = options[:source_folder].add!(new_item, do_not_save: true, overwrite: overwrite )
  elsif options[:owner]
    repo_item_with_same_name = options[:owner].get_item_in_root_by_name(new_item.name)
    if repo_item_with_same_name and !overwrite
      self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
      raise RepositoryManager::ItemExistException.new("copy failed. The repo_file '#{new_item.name}' already exist in root.")
    elsif repo_item_with_same_name and overwrite
      repo_item_with_same_name.file = new_item.file
      repo_item_with_same_name.sender = new_item.sender
      new_item = repo_item_with_same_name
    end
  else
    repo_item_with_same_name = self.owner.get_item_in_root_by_name(new_item.name)
    if repo_item_with_same_name and !overwrite
      self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
      raise RepositoryManager::ItemExistException.new("copy failed. The repo_file '#{new_item.name}' already exist in root.")
    elsif repo_item_with_same_name and overwrite
      repo_item_with_same_name.file = new_item.file
      repo_item_with_same_name.sender = new_item.sender
      new_item = repo_item_with_same_name
    end
  end

  new_item.save!
  new_item
end

#download(options = {}) ⇒ Object

Return the name of the file with his extension def name

if self.name.blank?
  file.url.split('/').last
else
  self.name
end

end



18
19
20
# File 'app/models/repository_manager/repo_file.rb', line 18

def download(options = {})
  self.download!(options)
end

#download!(options = {}) ⇒ Object

Downloading this file



23
24
25
# File 'app/models/repository_manager/repo_file.rb', line 23

def download!(options = {})
  file.path
end

#unzip!(options = {}) ⇒ Object

Unzip the compressed file and create the repo_items options

:source_folder = the folder in witch you unzip this archive
:owner = the owner of the item
:sender = the sender of the item (if you don't specify sender.. The sender is still the same)
:overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')


85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'app/models/repository_manager/repo_file.rb', line 85

def unzip!(options = {})
  !!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
  options[:owner] ? owner = options[:owner] : owner = self.owner
  options[:sender] ? sender = options[:sender] : sender = self.sender

  Zip::File.open(self.file.path) do |zip_file|
    # This hash make the link between the path and the item (if it exist)
    #link_path_item = {}

    # Handle entries one by one
    zip_file.each do |entry|
      array_name = entry.name.split('/')
      name = array_name[-1]
      path_array = array_name.first(array_name.size - 1)
      #name.parameterize.underscore

      #it is a folder
      if entry.ftype == :directory

        new_item = RepositoryManager::RepoFolder.new(name: name)
        new_item.owner = owner
        new_item.sender = sender
        if path_array.empty?
          new_item.move!(source_folder: options[:source_folder], owner: owner, sender: sender, overwrite: overwrite)
        else
          # He specified a source_folder
          if options[:source_folder]
            source_folder = options[:source_folder].get_or_create_by_path_array(path_array, owner: owner, sender: sender)
          else # No source folder specified
            # We have to check if we are in a folder
            parent = self.parent
            if parent
              # we unzip on this folder
              source_folder = parent.get_or_create_by_path_array(path_array, owner: owner, sender: sender)
            else
              # We are in root
              source_folder = owner.get_or_create_by_path_array(path_array, sender: sender)
            end
          end
          new_item.move!(source_folder: source_folder, owner: owner, sender: sender, overwrite: overwrite)
        end
      else # it is a :file
        new_item = RepositoryManager::RepoFile.new
        new_item.name = name
        new_item.sender = sender
        new_item.owner = owner

        tmp_file_path = File.join(Rails.root, 'tmp', 'unzip', name)
        # Delete the path
        FileUtils.rm_rf(tmp_file_path)
        entry.extract(tmp_file_path)
        new_item.file = File.open(tmp_file_path)


        if path_array.empty?
          new_item.move!(source_folder: options[:source_folder], owner: owner, sender: sender, overwrite: overwrite)
        else
          # He specified a source_folder
          if options[:source_folder]
            source_folder = options[:source_folder].get_or_create_by_path_array(path_array, owner: owner, sender: sender)
          else # No source folder specified
            # We have to check if we are in a folder
            parent = self.parent
            if parent
              # we unzip on this folder
              source_folder = parent.get_or_create_by_path_array(path_array, owner: owner, sender: sender)
            else
              # We are in root
              source_folder = owner.get_or_create_by_path_array(path_array, owner: owner, sender: sender)
            end
          end
          new_item.move!(source_folder: source_folder, owner: owner, sender: sender, overwrite: overwrite)
        end
      end
    end

  end
  self
end