applied my changes - initial import
[boxroom-stian.git] / app / models / folder.rb
blob2cee915b5d31ad94e8a21acc0b468c001d8a5f4a
1 # A folder is a place where files can be stored.
2 # Folders can also have sub-folders.
3 # Via groups it is determined which actions the logged-in User can perform.
4 class Folder < ActiveRecord::Base
5   acts_as_ferret :store_class_name => true, :fields => { :name => { :store => :no } }
6   acts_as_tree :order => :name
8   belongs_to :user
9   has_many :myfiles, :dependent => :destroy
10   has_many :group_permissions, :dependent => :destroy
11   has_many :clipboards, :dependent => :destroy
12   has_many :usages
14   validates_uniqueness_of :name, :scope => 'parent_id'
15   validates_presence_of :name
17   cattr_accessor :clipboard
18   attr_accessible :name
20   def after_create
21     # create the physical folder on disk
22     Dir.mkdir(self.path_on_disk) unless File.exists?(self.path_on_disk)
23   end
24   
25   # have to call destroy through this, otherwise the moving doesn't work properly
26   def delete
27     trash_name = "#{TRASH_PATH}/#{name}.#{Time.now.to_f.to_s}"
28     File.mv(path_on_disk, trash_name)
29     p "Moving from #{path_on_disk} to #{trash_name}"
30     destroy
31   end
33   # gets called after delete, so folder has already been moved
34   def before_destroy 
35     trash_name = "#{TRASH_PATH}/#{@name}.#{Time.now.to_f.to_s}"
36     log_usage("deleted","moved from01 #{self.path_on_disk} moved to #{trash_name}")
37   end
39   def path_on_disk
40     folder = self
41     path = folder.name
42     unless folder.parent_id == 0
43       until folder.parent_id == 1 
44         folder = folder.parent
45         path = folder.name + "/" + path
46       end
47     else
48       path = ""
49     end
50     return (UPLOAD_PATH + "/" + path)
51   end  
52   
53   def rename(name)
54     old_name = self.name
55     parent_path = self.parent.path_on_disk
56     if self.update_attributes(:name => Myfile.base_part_of(name), :date_modified => Time.now) && File.rename( parent_path + "/" + old_name, self.path_on_disk)
57       log_usage("renamed","from #{old_name} to #{self.name}")
58     else
59       return false
60     end
61   end
62   
63   def note_inherited
64     return self.note unless self.note.nil? || self.note.empty?
65     current, result = self, ''
66     until !result.empty? || current == nil
67       if !current.note.nil? && !current.note.empty? && current.note_inheritable
68         result = current.note
69       else
70         current = current.parent
71       end
72     end
73     return (result.empty? ? nil : result)
74   end
75   
76   def note_upload_inherited
77     return self.note_upload unless self.note_upload.nil? || self.note_upload.empty?
78     current, result = self, ''
79     until !result.empty? || current == nil
80       if !current.note_upload.nil? && !current.note_upload.empty? && current.note_upload_inheritable
81         result = current.note_upload
82       else
83         current = current.parent
84       end
85     end
86     return (result.empty? ? nil : result)
87   end
89   # List subfolders
90   # for the given user in the given order.
91   def list_subfolders(logged_in_user, order)
92     folders = []
93     if logged_in_user.can_read(self.id)
94       self.children.each do |sub_folder|
95         folders << sub_folder if logged_in_user.can_read(sub_folder.id)
96       end
97     end
99     # return the folders:
100     return folders
101   end
103   # List the files
104   # for the given user in the given order.
105   def list_files(logged_in_user, order)
106     files = []
107     if logged_in_user.can_read(self.id)
108       files = self.myfiles.find(:all, :order => order)
109     end
111     # return the files:
112     return files
113   end
115   # Returns whether or not the root folder exists
116   def self.root_folder_exists?
117     folder = Folder.find_by_is_root(true)
118     return (not folder.blank?)
119   end
121   # Create the Root folder
122   def self.create_root_folder
123     if User.admin_exists? #and Folder.root_folder_exists?
124       folder = self.new
125       folder.name = 'Root folder'
126       folder.date_modified = Time.now
127       folder.is_root = true
128       folder.lft, folder.rgt = 1, 2 # must be initialized, otherwise quota check on upload
129                                     # won't work until another folder has been added
131       # This folder is created by the admin
132       if user = User.find_by_is_the_administrator(true)
133         folder.user = user
134       end
136       folder.save # this hopefully returns true
137     end
138   end
140   def log_usage(action, comment = nil)
141     usage = Usage.new(
142       :download_date_time => Time.now,
143       :user => User.logged_in_user,
144       :folder => self,
145       :filename => self.name,
146       :action => action,
147       :comment => comment 
148       ).save
149   end
150                  
151   def all_with_children
152     folders = [self] 
153     self.children.each do |child_folder|
154       folders += child_folder.all_with_children if child_folder.children
155     end          
156     return folders
157   end
159   def all_children
160     self.all_with_children - [self]
161   end
164   private
165   def validate
166     if Myfile.find_by_filename_and_folder_id(self.name, self.parent_id)
167       errors.add_to_base "You cannot create a folder with the same name as a file."
168     end
169   end
170