diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index f1758c7a..870e7a10 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -52,6 +52,7 @@ class DmsfFile < ActiveRecord::Base :datetime => Proc.new {|o| o.updated_at }, :author => Proc.new {|o| o.last_revision.user } + #TODO: place into better place def self.storage_path storage_dir = Setting.plugin_redmine_dmsf["dmsf_storage_directory"].strip if !File.exists?(storage_dir) @@ -59,7 +60,131 @@ class DmsfFile < ActiveRecord::Base end storage_dir end - + + def self.project_root_files(project) + find(:all, :conditions => + ["dmsf_folder_id is NULL and project_id = :project_id and deleted = :deleted", + {:project_id => project.id, :deleted => false}], :order => "name ASC") + end + + def self.find_file_by_name(project, folder, name) + if folder.nil? + find(:first, :conditions => + ["dmsf_folder_id is NULL and project_id = :project_id and name = :name and deleted = :deleted", + {:project_id => project.id, :name => name, :deleted => false}]) + else + find(:first, :conditions => + ["dmsf_folder_id = :folder_id and project_id = :project_id and name = :name and deleted = :deleted", + {:project_id => project.id, :folder_id => folder.id, :name => name, :deleted => false}]) + end + end + + def self.from_commited_file(project, folder, commited_file) + file = find_file_by_name(project, folder, commited_file["name"]) + + if file.nil? + file = DmsfFile.new + file.project = project + file.folder = folder + file.name = commited_file["name"] + file.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? + file.save + end + + return file + end + + def new_storage_filename + filename = DmsfHelper.sanitize_filename(self.name) + timestamp = DateTime.now.strftime("%y%m%d%H%M%S") + while File.exist?(File.join(DmsfFile.storage_path, "#{timestamp}_#{self.id}_#{filename}")) + timestamp.succ! + end + "#{timestamp}_#{id}_#{filename}" + end + + def locked? + self.locks.empty? ? false : self.locks[0].locked + end + + def locked_for_user? + self.locked? && self.locks[0].user != User.current + end + + def lock + lock = DmsfFileLock.new + lock.file = self + lock.user = User.current + lock.locked = true + lock.save + self.reload + return lock + end + + def unlock + lock = DmsfFileLock.new + lock.file = self + lock.user = User.current + lock.locked = false + lock.save + self.reload + return lock + end + + def last_revision + self.revisions.empty? ? nil : self.revisions[0] + end + + def title + self.last_revision.title + end + + def version + self.last_revision.version + end + + def workflow + self.last_revision.workflow + end + + def dmsf_path + path = self.folder.nil? ? [] : self.folder.dmsf_path + path.push(self) + path + end + + def dmsf_path_str + path = self.dmsf_path + string_path = path.map { |element| element.title } + string_path.join("/") + end + + def notify? + return true if self.notification + return true if folder && folder.notify? + return false + end + + def notify_deactivate + self.notification = false + self.save! + end + + def notify_activate + self.notification = true + self.save! + end + + def display_name + #if self.name.length > 33 + # extension = File.extname(self.name) + # return self.name[0, self.name.length - extension.length][0, 25] + "..." + extension + #else + return self.name + #end + end + + # to fullfill searchable module expectations def self.search(tokens, projects=nil, options={}) tokens = [] << tokens unless tokens.is_a?(Array) projects = [] << projects unless projects.nil? || projects.is_a?(Array) @@ -165,115 +290,4 @@ class DmsfFile < ActiveRecord::Base [results, results_count] end - def self.project_root_files(project) - find(:all, :conditions => - ["dmsf_folder_id is NULL and project_id = :project_id and deleted = :deleted", - {:project_id => project.id, :deleted => false}], :order => "name ASC") - end - - def self.find_file_by_name(project, folder, name) - if folder.nil? - find(:first, :conditions => - ["dmsf_folder_id is NULL and project_id = :project_id and name = :name and deleted = :deleted", - {:project_id => project.id, :name => name, :deleted => false}]) - else - find(:first, :conditions => - ["dmsf_folder_id = :folder_id and project_id = :project_id and name = :name and deleted = :deleted", - {:project_id => project.id, :folder_id => folder.id, :name => name, :deleted => false}]) - end - end - - def self.from_commited_file(project, folder, commited_file) - file = find_file_by_name(project, folder, commited_file["name"]) - - if file.nil? - file = DmsfFile.new - file.project = project - file.folder = folder - file.name = commited_file["name"] - file.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? - file.save - end - - return file - end - - def new_storage_filename - filename = DmsfHelper.sanitize_filename(self.name) - timestamp = DateTime.now.strftime("%y%m%d%H%M%S") - while File.exist?(File.join(DmsfFile.storage_path, "#{timestamp}_#{self.id}_#{filename}")) - timestamp.succ! - end - "#{timestamp}_#{id}_#{filename}" - end - - def locked? - self.locks.empty? ? false : self.locks[0].locked - end - - def locked_for_user? - self.locked? && self.locks[0].user != User.current - end - - def lock - lock = DmsfFileLock.new - lock.file = self - lock.user = User.current - lock.locked = true - lock.save - self.reload - return lock - end - - def unlock - lock = DmsfFileLock.new - lock.file = self - lock.user = User.current - lock.locked = false - lock.save - self.reload - return lock - end - - def last_revision - self.revisions.empty? ? nil : self.revisions[0] - end - - def dmsf_path - path = self.folder.nil? ? [] : self.folder.dmsf_path - path.push(self) - path - end - - def dmsf_path_str - path = self.dmsf_path - string_path = path.map { |element| element.name } - string_path.join("/") - end - - def notify? - return true if self.notification - return true if folder && folder.notify? - return false - end - - def notify_deactivate - self.notification = false - self.save! - end - - def notify_activate - self.notification = true - self.save! - end - - def display_name - #if self.name.length > 33 - # extension = File.extname(self.name) - # return self.name[0, self.name.length - extension.length][0, 25] + "..." + extension - #else - return self.name - #end - end - end \ No newline at end of file diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index 0cbaca10..18b4eb1f 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -24,15 +24,15 @@ class DmsfFolder < ActiveRecord::Base belongs_to :project belongs_to :folder, :class_name => "DmsfFolder", :foreign_key => "dmsf_folder_id" - has_many :subfolders, :class_name => "DmsfFolder", :foreign_key => "dmsf_folder_id", :order => "name ASC" - has_many :files, :class_name => "DmsfFile", :foreign_key => "dmsf_folder_id", :order => "name ASC", + has_many :subfolders, :class_name => "DmsfFolder", :foreign_key => "dmsf_folder_id", :order => "title ASC" + has_many :files, :class_name => "DmsfFile", :foreign_key => "dmsf_folder_id", :conditions => { :deleted => false } belongs_to :user - validates_presence_of :name - validates_uniqueness_of :name, :scope => [:dmsf_folder_id, :project_id] + validates_presence_of :title + validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id] - validates_format_of :name, :with => @@invalid_characters, + validates_format_of :title, :with => @@invalid_characters, :message => l(:error_contains_invalid_character) validate :check_cycle @@ -52,10 +52,10 @@ class DmsfFolder < ActiveRecord::Base def self.project_root_folders(project) find(:all, :conditions => - ["dmsf_folder_id is NULL and project_id = :project_id", {:project_id => project.id}], :order => "name ASC") + ["dmsf_folder_id is NULL and project_id = :project_id", {:project_id => project.id}], :order => "title ASC") end - def dmsf_path + def dmsf_path folder = self path = [] while !folder.nil? @@ -67,7 +67,7 @@ class DmsfFolder < ActiveRecord::Base def dmsf_path_str path = self.dmsf_path - string_path = path.map { |element| element.name } + string_path = path.map { |element| element.title } string_path.join("/") end @@ -91,7 +91,7 @@ class DmsfFolder < ActiveRecord::Base tree = [["Documents", nil]] DmsfFolder.project_root_folders(project).each do |folder| unless folder == current_folder - tree.push(["...#{folder.name}", folder.id]) + tree.push(["...#{folder.title}", folder.id]) directory_subtree(tree, folder, 2, current_folder) end end @@ -103,7 +103,7 @@ class DmsfFolder < ActiveRecord::Base def self.directory_subtree(tree, folder, level, current_folder) folder.subfolders.each do |subfolder| unless subfolder == current_folder - tree.push(["#{"..." * level}#{subfolder.name}", subfolder.id]) + tree.push(["#{"..." * level}#{subfolder.title}", subfolder.id]) directory_subtree(tree, subfolder, level + 1, current_folder) end end diff --git a/app/views/dmsf/_path.html.erb b/app/views/dmsf/_path.html.erb index 62efa554..d1d8138d 100644 --- a/app/views/dmsf/_path.html.erb +++ b/app/views/dmsf/_path.html.erb @@ -1,7 +1,7 @@ <%= link_to(l(:link_documents), {:controller => "dmsf", :action => "index", :id=> @project }) %> <% path.each do |path_element| %> / - <%= link_to(h(path_element.name), {:controller => "dmsf", :action => "index", :id=> @project, :folder_id => path_element}) %> + <%= link_to(h(path_element.title), {:controller => "dmsf", :action => "index", :id=> @project, :folder_id => path_element}) %> <% if path_element.notification %> <%= image_tag("notify.png", :plugin => "redmine_dmsf", :title => l(:title_notifications_active)) %> <% end %> diff --git a/app/views/dmsf/index.html.erb b/app/views/dmsf/index.html.erb index 458abb89..ea69e961 100644 --- a/app/views/dmsf/index.html.erb +++ b/app/views/dmsf/index.html.erb @@ -5,7 +5,7 @@ <% unless @folder.nil? %> <%= link_to(image_tag("edit.png", :style => "vertical-align: text-top;"), {:controller => "dmsf_detail", :action => "folder_detail", :id => @project, :folder_id => @folder }, - :title => l(:link_edit, :title => h(@folder.name))) %>   + :title => l(:link_edit, :title => h(@folder.title))) %>   <% end %> <%= link_to(image_tag("add.png", :style => "vertical-align: text-top;"), {:controller => "dmsf_detail", :action => "folder_new", :id => @project, :parent_id => @folder }, @@ -46,7 +46,7 @@ form_tag({:action => "entries_operation", :id => @project, :folder_id => @folder <%= check_box_tag("subfolders[]", subfolder.id, false, :title => l(:title_check_for_zip_download_or_email)) %> - <%= link_to(h(subfolder.name), + <%= link_to(h(subfolder.title), {:action => "index", :folder_id => subfolder}, :class => "icon icon-folder") %> @@ -73,7 +73,7 @@ form_tag({:action => "entries_operation", :id => @project, :folder_id => @folder
<%= link_to(image_tag("edit.png", :class =>"detail_icon"), {:controller => "dmsf_detail", :action => "folder_detail", :id => @project, :folder_id => subfolder }, - :title => l(:link_edit, :title => h(subfolder.name))) %> + :title => l(:link_edit, :title => h(subfolder.title))) %>
<% end %>
@@ -94,7 +94,7 @@ form_tag({:action => "entries_operation", :id => @project, :folder_id => @folder <%= link_to(h(file.last_revision.display_title), {:action => "download_file", :id => @project, :file_id => file}, :class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}", - :title => l(:title_title_version_version_download, :title => h(file.last_revision.title), :version => file.last_revision.version)) %> + :title => l(:title_title_version_version_download, :title => h(file.title), :version => file.version)) %>
<%= h(file.display_name) %>
<%= number_to_human_size(file.last_revision.size) unless file.last_revision.nil? %> diff --git a/app/views/dmsf_detail/folder_detail.html.erb b/app/views/dmsf_detail/folder_detail.html.erb index d46d6271..d41bfc4d 100644 --- a/app/views/dmsf_detail/folder_detail.html.erb +++ b/app/views/dmsf_detail/folder_detail.html.erb @@ -15,8 +15,8 @@

- <%= label_tag("dmsf_folder_name", l(:label_title) + ":") %> - <%= f.text_field(:name, :size => "32", :required => true) %> + <%= label_tag("dmsf_folder_title", l(:label_title) + ":") %> + <%= f.text_field(:title, :size => "32", :required => true) %>

diff --git a/db/migrate/01_create_hierarchy.rb b/db/migrate/01_create_hierarchy.rb index 38a6977e..ccdb8eb2 100644 --- a/db/migrate/01_create_hierarchy.rb +++ b/db/migrate/01_create_hierarchy.rb @@ -33,8 +33,9 @@ class CreateHierarchy < ActiveRecord::Migration create_table :dmsf_files do |t| t.references :project, :null => false - t.references :dmsf_folder + # This two fileds are copy from last revision due to simpler search + t.references :dmsf_folder t.string :name, :null => false t.boolean :notification, :default => false, :null => false @@ -47,28 +48,26 @@ class CreateHierarchy < ActiveRecord::Migration create_table :dmsf_file_revisions do |t| t.references :dmsf_file, :null => false - t.string :disk_filename, :null => false + t.integer :source_dmsf_file_revision_id t.string :name, :null => false t.references :dmsf_folder + t.string :disk_filename, :null => false t.integer :size t.string :mime_type + t.string :title t.text :description - t.references :user, :null => false - t.integer :workflow - - t.text :comment t.integer :major_version, :null => false t.integer :minor_version, :null => false - - t.integer :source_dmsf_file_revision_id + t.text :comment t.boolean :deleted, :default => false, :null => false t.integer :deleted_by_user_id + t.references :user, :null => false t.timestamps end diff --git a/db/migrate/02_dmsf_normalization.rb b/db/migrate/02_dmsf_normalization.rb new file mode 100644 index 00000000..41a66d64 --- /dev/null +++ b/db/migrate/02_dmsf_normalization.rb @@ -0,0 +1,34 @@ +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011 Vít Jonáš +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +class DmsfNormalization < ActiveRecord::Migration + def self.up + rename_column :dmsf_folders, :name, :title + + create_table :dmsf_file_revision_audit do |t| + t.references :dmsf_file_revision, :null => false + t.integer :action, :default => 0, :null => false # 0 ... download, 1 ... email + t.references :user, :null => false + t.timestamps + end + end + + def self.down + end + +end