* 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:
parent
ef0c829965
commit
f5e5914736
@ -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
|
||||
@ -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
|
||||
|
||||
@ -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 %>
|
||||
|
||||
@ -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
|
||||
<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>
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
34
db/migrate/02_dmsf_normalization.rb
Normal file
34
db/migrate/02_dmsf_normalization.rb
Normal 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
|
||||
Loading…
x
Reference in New Issue
Block a user