* renamed folder's name to title

* created table for revision access auditing

git-svn-id: http://redmine-dmsf.googlecode.com/svn/trunk/redmine_dmsf@69 5e329b0b-a2ee-ea63-e329-299493fc886d
This commit is contained in:
vit.jonas@gmail.com 2011-05-21 17:39:34 +00:00
parent ef0c829965
commit f5e5914736
7 changed files with 184 additions and 137 deletions

View File

@ -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)
@ -60,6 +61,130 @@ class DmsfFile < ActiveRecord::Base
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

View File

@ -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,7 +52,7 @@ 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
@ -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

View File

@ -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 %>

View File

@ -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))) %> &nbsp;
:title => l(:link_edit, :title => h(@folder.title))) %> &nbsp;
<% 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
<tr class="dir">
<td class="check"><%= check_box_tag("subfolders[]", subfolder.id, false, :title => l(:title_check_for_zip_download_or_email)) %></td>
<td class="title">
<%= link_to(h(subfolder.name),
<%= link_to(h(subfolder.title),
{:action => "index", :folder_id => subfolder},
:class => "icon icon-folder") %>
</td>
@ -73,7 +73,7 @@ form_tag({:action => "entries_operation", :id => @project, :folder_id => @folder
<div style="float: left">
<%= 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))) %>
</div>
<% end %>
<div style="float: right">
@ -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)) %>
<div class="filename"><%= h(file.display_name) %></div>
</td>
<td class="size"><%= number_to_human_size(file.last_revision.size) unless file.last_revision.nil? %></td>

View File

@ -15,8 +15,8 @@
<div class="clear">
<div class="splitcontentleft">
<p>
<%= 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) %>
</p>
</div>
<div class="splitcontentright">

View File

@ -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

View File

@ -0,0 +1,34 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
#
# 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