Linking Issues and DMSF Documents #48
This commit is contained in:
parent
65820f97f3
commit
39a0a57813
@ -687,8 +687,8 @@ class DmsfController < ApplicationController
|
||||
@trash_visible = @folder_manipulation_allowed && @file_manipulation_allowed &&
|
||||
@file_delete_allowed && !@locked_for_user && !@folder
|
||||
@trash_enabled = DmsfFolder.deleted.where(:project_id => @project.id).any? ||
|
||||
DmsfFile.deleted.where(:project_id => @project.id).any? ||
|
||||
DmsfLink.deleted.where(:project_id => @project.id).any?
|
||||
DmsfFile.deleted.where(:container_id => @project.id, :container_type => 'Project').any? ||
|
||||
DmsfLink.deleted.where(:container_id => @project.id, :container_type => 'Project').any?
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -184,7 +184,7 @@ class DmsfFilesController < ApplicationController
|
||||
commit = params[:commit] == 'yes'
|
||||
if @file.delete(commit)
|
||||
flash[:notice] = l(:notice_file_deleted)
|
||||
if commit
|
||||
if commit && (@file.container_type == 'Project')
|
||||
log_activity('deleted')
|
||||
begin
|
||||
recipients = DmsfMailer.get_notify_users(@project, [@file])
|
||||
@ -291,6 +291,19 @@ class DmsfFilesController < ApplicationController
|
||||
redirect_to :back
|
||||
end
|
||||
|
||||
def thumbnail
|
||||
if @file.image? && tbnail = @file.thumbnail(:size => params[:size])
|
||||
if stale?(:etag => tbnail)
|
||||
send_file tbnail,
|
||||
:filename => filename_for_content_disposition(@file.last_revision.disk_file),
|
||||
:type => @file.last_revision.detect_content_type,
|
||||
:disposition => 'inline'
|
||||
end
|
||||
else
|
||||
render :nothing => true, :status => 404
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def log_activity(action)
|
||||
|
||||
@ -24,10 +24,10 @@ class DmsfUploadController < ApplicationController
|
||||
|
||||
menu_item :dmsf
|
||||
|
||||
before_filter :find_project, :except => [:upload]
|
||||
before_filter :authorize, :except => [:upload]
|
||||
before_filter :authorize_global, :only => [:upload]
|
||||
before_filter :find_folder, :except => [:upload_file, :upload, :commit]
|
||||
before_filter :find_project, :except => [:upload, :delete_dmsf_attachment]
|
||||
before_filter :authorize, :except => [:upload, :delete_dmsf_attachment]
|
||||
before_filter :authorize_global, :only => [:upload, :delete_dmsf_attachment]
|
||||
before_filter :find_folder, :except => [:upload_file, :upload, :commit, :delete_dmsf_attachment]
|
||||
|
||||
helper :all
|
||||
helper :dmsf_workflows
|
||||
@ -65,7 +65,6 @@ class DmsfUploadController < ApplicationController
|
||||
target = "#{DmsfHelper.temp_dir}/#{@disk_filename}"
|
||||
begin
|
||||
FileUtils.cp @tempfile.path, target
|
||||
FileUtils.chmod 'u=wr,g=r', target
|
||||
rescue Exception => e
|
||||
Rails.logger.error e.message
|
||||
end
|
||||
@ -132,10 +131,17 @@ class DmsfUploadController < ApplicationController
|
||||
commit_files_internal uploaded_files
|
||||
end
|
||||
|
||||
def delete_dmsf_attachment
|
||||
attachment = Attachment.find(params[:id])
|
||||
attachment.destroy
|
||||
rescue ActiveRecord::RecordNotFound
|
||||
render_404
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def commit_files_internal(commited_files)
|
||||
DmsfUploadHelper.commit_files_internal(commited_files, @project, @folder)
|
||||
DmsfUploadHelper.commit_files_internal(commited_files, @project, @folder, self)
|
||||
respond_to do |format|
|
||||
format.js
|
||||
format.api { render_validation_errors(failed_uploads) unless failed_uploads.empty? }
|
||||
|
||||
@ -19,8 +19,9 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
module DmsfUploadHelper
|
||||
include Redmine::I18n
|
||||
|
||||
def self.commit_files_internal(commited_files, container, folder = nil)
|
||||
def self.commit_files_internal(commited_files, container, folder, controller)
|
||||
if container.is_a?(Project)
|
||||
project = container
|
||||
else
|
||||
@ -42,7 +43,6 @@ module DmsfUploadHelper
|
||||
file = DmsfFile.new
|
||||
file.container_type = container.class.name.demodulize
|
||||
file.container_id = container.id
|
||||
#file.project = project if container_type == 'Project'
|
||||
file.name = name
|
||||
file.dmsf_folder = folder
|
||||
file.notification = Setting.plugin_redmine_dmsf[:dmsf_default_notifications].present?
|
||||
@ -106,20 +106,18 @@ module DmsfUploadHelper
|
||||
FileUtils.mv(commited_disk_filepath, new_revision.disk_file)
|
||||
file.set_last_revision new_revision
|
||||
files.push(file)
|
||||
if file.container.is_a?(Issue)
|
||||
file.container.dmsf_file_added(file)
|
||||
end
|
||||
rescue Exception => e
|
||||
Rails.logger.error e.message
|
||||
#flash[:error] = e.message
|
||||
controller.flash[:error] = e.message
|
||||
failed_uploads.push(file)
|
||||
end
|
||||
else
|
||||
failed_uploads.push(commited_file)
|
||||
end
|
||||
end
|
||||
#unless files.empty?
|
||||
#files.each do |file|
|
||||
#Rails.logger.info "#{Time.now.strftime('%Y-%m-%d %H:%M:%S')} #{User.current.login}: uploaded dmsf://#{file.project.identifier}/#{file.id}/#{file.last_revision.id}"
|
||||
#end
|
||||
#end
|
||||
if container.is_a?(Project) && ((folder && folder.notification?) || (!folder && project.dmsf_notification?))
|
||||
begin
|
||||
recipients = DmsfMailer.get_notify_users(project, files)
|
||||
@ -130,7 +128,7 @@ module DmsfUploadHelper
|
||||
unless recipients.empty?
|
||||
to = recipients.collect{ |r| r.name }.first(DMSF_MAX_NOTIFICATION_RECEIVERS_INFO).join(', ')
|
||||
to << ((recipients.count > DMSF_MAX_NOTIFICATION_RECEIVERS_INFO) ? ',...' : '.')
|
||||
#flash[:warning] = l(:warning_email_notifications, :to => to)
|
||||
controller.flash[:warning] = l(:warning_email_notifications, :to => to)
|
||||
end
|
||||
end
|
||||
rescue Exception => e
|
||||
@ -139,7 +137,7 @@ module DmsfUploadHelper
|
||||
end
|
||||
end
|
||||
unless failed_uploads.empty?
|
||||
#flash[:warning] = l(:warning_some_files_were_not_commited, :files => failed_uploads.map{|u| u['name']}.join(', '))
|
||||
controller.flash[:warning] = l(:warning_some_files_were_not_commited, :files => failed_uploads.map{|u| u['name']}.join(', '))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -152,6 +152,9 @@ class DmsfFile < ActiveRecord::Base
|
||||
# Revisions and links of a deleted file SHOULD be deleted too
|
||||
self.dmsf_file_revisions.each { |r| r.delete(commit, true) }
|
||||
if commit
|
||||
if self.container.is_a?(Issue)
|
||||
self.container.dmsf_file_removed(self)
|
||||
end
|
||||
self.destroy
|
||||
else
|
||||
self.deleted = STATUS_DELETED
|
||||
@ -278,8 +281,8 @@ class DmsfFile < ActiveRecord::Base
|
||||
|
||||
file = DmsfFile.new
|
||||
file.dmsf_folder = folder
|
||||
file.container_type = 'Project'
|
||||
file.project = project
|
||||
file.container_type = self.container_type
|
||||
file.container_id = project.id
|
||||
file.name = self.name
|
||||
file.notification = Setting.plugin_redmine_dmsf['dmsf_default_notifications'].present?
|
||||
|
||||
@ -424,21 +427,26 @@ class DmsfFile < ActiveRecord::Base
|
||||
fname
|
||||
end
|
||||
|
||||
def text?
|
||||
self.last_revision && Redmine::MimeType.is_type?('text', self.last_revision.disk_filename)
|
||||
end
|
||||
|
||||
def image?
|
||||
self.last_revision && !!(self.last_revision.disk_filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png|svg)$/i)
|
||||
self.last_revision && Redmine::MimeType.is_type?('image', self.last_revision.disk_filename)
|
||||
end
|
||||
|
||||
def pdf?
|
||||
self.last_revision && !!(self.last_revision.disk_filename =~ /\.(pdf)$/i)
|
||||
self.last_revision && (Redmine::MimeType.of(self.last_revision.disk_filename) == 'application/pdf')
|
||||
end
|
||||
|
||||
|
||||
def disposition
|
||||
(self.image? || self.pdf?) ? 'inline' : 'attachment'
|
||||
end
|
||||
|
||||
def preview(limit)
|
||||
result = 'No preview available'
|
||||
if (self.last_revision.disk_filename =~ /\.(txt|ini|diff|c|cpp|php|csv|rb|h|erb|html|css|py)$/i)
|
||||
if self.text?
|
||||
begin
|
||||
f = File.new(self.last_revision.disk_file)
|
||||
f.each_line do |line|
|
||||
@ -505,11 +513,13 @@ class DmsfFile < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def propfind_cache_key
|
||||
if dmsf_folder_id.nil?
|
||||
# File is in project root
|
||||
return "PROPFIND/#{project_id}"
|
||||
else
|
||||
return "PROPFIND/#{project_id}/#{dmsf_folder_id}"
|
||||
if self.container_type == 'Project'
|
||||
if dmsf_folder_id.nil?
|
||||
# File is in project root
|
||||
return "PROPFIND/#{self.container_id}"
|
||||
else
|
||||
return "PROPFIND/#{self.container_id}/#{self.dmsf_folder_id}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -552,25 +562,38 @@ class DmsfFile < ActiveRecord::Base
|
||||
@project
|
||||
end
|
||||
|
||||
def project=(project)
|
||||
case self.container_type
|
||||
when 'Project'
|
||||
self.container_id = project.id
|
||||
else
|
||||
raise Exception.new('The container type is not project!')
|
||||
def container
|
||||
unless @container
|
||||
case self.container_type
|
||||
when 'Project'
|
||||
@container = Project.find_by_id(self.container_id)
|
||||
when 'Issue'
|
||||
@container = Issue.find_by_id(self.container_id)
|
||||
end
|
||||
end
|
||||
@container
|
||||
end
|
||||
|
||||
def project_id
|
||||
self.project.id if self.project
|
||||
end
|
||||
|
||||
def project_id=(project_id)
|
||||
case self.container_type
|
||||
when 'Project'
|
||||
self.container_id = project_id
|
||||
def thumbnail(options={})
|
||||
if image?
|
||||
size = options[:size].to_i
|
||||
if size > 0
|
||||
# Limit the number of thumbnails per image
|
||||
size = (size / 50) * 50
|
||||
# Maximum thumbnail size
|
||||
size = 800 if size > 800
|
||||
else
|
||||
raise Exception.new('The container type is not project!')
|
||||
size = Setting.thumbnails_size.to_i
|
||||
end
|
||||
size = 100 unless size > 0
|
||||
target = File.join(Attachment.thumbnails_storage_path, "#{self.id}_#{self.last_revision.digest}_#{size}.thumb")
|
||||
|
||||
begin
|
||||
Redmine::Thumbnail.generate(self.last_revision.disk_file, target, size)
|
||||
rescue => e
|
||||
Rails.logger.error "An error occured while generating thumbnail for #{self.last_revision.disk_file} to #{target}\nException was: #{e.message}"
|
||||
return nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -49,10 +49,9 @@ class DmsfFileRevision < ActiveRecord::Base
|
||||
:author_key => "#{DmsfFileRevision.table_name}.user_id",
|
||||
:permission => :view_dmsf_file_revisions,
|
||||
:scope => select("#{DmsfFileRevision.table_name}.*").
|
||||
joins(
|
||||
"INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " +
|
||||
"INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.container_id = #{Project.table_name}.id").
|
||||
where("#{DmsfFile.table_name}.deleted = ? AND #{DmsfFile.table_name}.container_type = ?", STATUS_ACTIVE, 'Project')
|
||||
joins(:dmsf_file).joins(
|
||||
"LEFT JOIN #{Project.table_name} ON #{DmsfFile.table_name}.container_id = #{Project.table_name}.id").
|
||||
where("#{DmsfFile.table_name}.container_type = ?", 'Project').visible
|
||||
|
||||
validates :title, :presence => true
|
||||
validates_format_of :name, :with => DmsfFolder::INVALID_CHARACTERS,
|
||||
|
||||
@ -27,8 +27,8 @@ class DmsfFileRevisionAccess < ActiveRecord::Base
|
||||
delegate :dmsf_file, :to => :dmsf_file_revision, :allow_nil => false
|
||||
delegate :project, :to => :dmsf_file, :allow_nil => false
|
||||
|
||||
DownloadAction = 0
|
||||
EmailAction = 1
|
||||
DownloadAction = 0.freeze
|
||||
EmailAction = 1.freeze
|
||||
|
||||
acts_as_event :title => Proc.new {|ra| "#{l(:label_dmsf_downloaded)}: #{ra.dmsf_file.dmsf_path_str}"},
|
||||
:url => Proc.new {|ra| {:controller => 'dmsf_files', :action => 'show', :id => ra.dmsf_file}},
|
||||
@ -41,9 +41,8 @@ class DmsfFileRevisionAccess < ActiveRecord::Base
|
||||
:author_key => "#{DmsfFileRevisionAccess.table_name}.user_id",
|
||||
:permission => :view_dmsf_file_revision_accesses,
|
||||
:scope => select("#{DmsfFileRevisionAccess.table_name}.*").
|
||||
joins(
|
||||
"INNER JOIN #{DmsfFileRevision.table_name} ON #{DmsfFileRevisionAccess.table_name}.dmsf_file_revision_id = #{DmsfFileRevision.table_name}.id " +
|
||||
"INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " +
|
||||
"INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.container_id = #{Project.table_name}.id").
|
||||
joins(:dmsf_file_revision).joins(
|
||||
"LEFT JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " +
|
||||
"LEFT JOIN #{Project.table_name} ON #{DmsfFile.table_name}.container_id = #{Project.table_name}.id").
|
||||
where("#{DmsfFile.table_name}.deleted = ? AND #{DmsfFile.table_name}.container_type = ?", DmsfFile::STATUS_ACTIVE, 'Project')
|
||||
end
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -77,7 +77,7 @@ class DmsfUpload
|
||||
@workflow = nil
|
||||
file = DmsfFile.new
|
||||
file.container_type = 'Project'
|
||||
file.project = project
|
||||
file.container_id = project.id
|
||||
revision = DmsfFileRevision.new
|
||||
revision.dmsf_file = file
|
||||
@custom_values = revision.custom_field_values
|
||||
|
||||
@ -20,25 +20,47 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
%>
|
||||
|
||||
<hr/>
|
||||
<div class="attachments">
|
||||
<% for dmsf_file in dmsf_files %>
|
||||
<p>
|
||||
<% file_view_url = url_for({:controller => :dmsf_files, :action => 'view', :id => dmsf_file}) %>
|
||||
<%= link_to(h(dmsf_file.title),
|
||||
file_view_url,
|
||||
:target => '_blank',
|
||||
:class => "icon icon-file #{DmsfHelper.filetype_css(dmsf_file.name)}",
|
||||
:title => h(dmsf_file.last_revision.try(:tooltip)),
|
||||
'data-downloadurl' => "#{dmsf_file.last_revision.detect_content_type}:#{h(dmsf_file.name)}:#{file_view_url}") %>
|
||||
<%= " - #{dmsf_file.description}" unless dmsf_file.description.blank? %>
|
||||
<span class="size">(<%= number_to_human_size dmsf_file.last_revision.size %>)</span>
|
||||
<%= link_to(image_tag('delete.png'),
|
||||
dmsf_file_path(:id => dmsf_file),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:method => :delete,
|
||||
:title => l(:title_delete)) %>
|
||||
<span class="author"><%= dmsf_file.last_revision.user %>, <%= format_time(dmsf_file.last_revision.updated_at) %></span>
|
||||
</p>
|
||||
<% end %>
|
||||
</div>
|
||||
<% if dmsf_files.present? %>
|
||||
<hr/>
|
||||
<div class="attachments">
|
||||
<% for dmsf_file in dmsf_files %>
|
||||
<p>
|
||||
<% file_view_url = url_for({:controller => :dmsf_files, :action => 'view', :id => dmsf_file}) %>
|
||||
<%= link_to(h(dmsf_file.title),
|
||||
file_view_url,
|
||||
:target => '_blank',
|
||||
:class => "icon icon-file #{DmsfHelper.filetype_css(dmsf_file.name)}",
|
||||
:title => h(dmsf_file.last_revision.try(:tooltip)),
|
||||
'data-downloadurl' => "#{dmsf_file.last_revision.detect_content_type}:#{h(dmsf_file.name)}:#{file_view_url}") %>
|
||||
<% if dmsf_file.text? || dmsf_file.image? %>
|
||||
<%= link_to l(:button_view),
|
||||
file_view_url,
|
||||
:class => 'icon-only icon-magnifier',
|
||||
:title => l(:button_view) %>
|
||||
<% end %>
|
||||
<%= " - #{dmsf_file.description}" unless dmsf_file.description.blank? %>
|
||||
<span class="size">(<%= number_to_human_size dmsf_file.last_revision.size %>)</span>
|
||||
<%= link_to(image_tag('delete.png'),
|
||||
dmsf_file_path(:id => dmsf_file, :commit => 'yes'),
|
||||
:data => {:confirm => l(:text_are_you_sure)},
|
||||
:method => :delete,
|
||||
:title => l(:title_delete)) %>
|
||||
<span class="author"><%= dmsf_file.last_revision.user %>, <%= format_time(dmsf_file.last_revision.updated_at) %></span>
|
||||
</p>
|
||||
<% end %>
|
||||
<% if defined?(thumbnails) && thumbnails %>
|
||||
<% images = dmsf_files.select(&:image?) %>
|
||||
<% if images.any? %>
|
||||
<div class="thumbnails">
|
||||
<% images.each do |file| %>
|
||||
<div>
|
||||
<%= link_to image_tag(dmsf_thumbnail_path(file)),
|
||||
url_for({:controller => :dmsf_files, :action => 'view', :id => file}),
|
||||
:alt => dmsf_file.title %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
@ -23,10 +23,10 @@
|
||||
<span id="dmsf_attachments_fields">
|
||||
<% if defined?(container) && container && container.saved_attachments %>
|
||||
<% container.saved_attachments.each_with_index do |attachment, i| %>
|
||||
<span id="dmsf_attachments_p<%= i %>">
|
||||
<span id="dmsf_attachments_p<%#= i %>">
|
||||
<%= text_field_tag("dmsf_attachments[p#{i}][filename]", attachment.filename, :class => 'filename') +
|
||||
text_field_tag("dmsf_attachments[p#{i}][description]", attachment.description, :maxlength => 255, :placeholder => l(:label_optional_description), :class => 'description') +
|
||||
link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload') %>
|
||||
link_to(' '.html_safe, dmsf_attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload') %>
|
||||
<%= hidden_field_tag "dmsf_attachments[p#{i}][token]", "#{attachment.token}" %>
|
||||
</span>
|
||||
<% end %>
|
||||
|
||||
1
app/views/dmsf_upload/delete_dmsf_attachment.js.erb
Normal file
1
app/views/dmsf_upload/delete_dmsf_attachment.js.erb
Normal file
@ -0,0 +1 @@
|
||||
$('#dmsf_attachments_<%= j params[:attachment_id] %>').remove();
|
||||
@ -30,7 +30,7 @@ fileSpan.find('a.remove-upload')
|
||||
.attr({
|
||||
"data-remote": true,
|
||||
"data-method": 'delete',
|
||||
href: '<%= j attachment_path(@attachment, :attachment_id => params[:attachment_id], :format => 'js') %>'
|
||||
href: '<%= j dmsf_attachment_path(@attachment, :attachment_id => params[:attachment_id], :format => 'js') %>'
|
||||
})
|
||||
.off('click');
|
||||
<% end %>
|
||||
|
||||
@ -65,6 +65,7 @@ RedmineApp::Application.routes.draw do
|
||||
post '/projects/:id/dmsf/upload/commit', :controller => 'dmsf_upload', :action => 'commit_files'
|
||||
post '/projects/:id/dmsf/commit', :controller => 'dmsf_upload', :action => 'commit'
|
||||
match 'dmsf_uploads', :to => 'dmsf_upload#upload', :via => :post
|
||||
delete '/dmsf/attachments/:id/delete', :to => 'dmsf_upload#delete_dmsf_attachment', :as => 'dmsf_attachment'
|
||||
|
||||
#
|
||||
# dmsf_files controller
|
||||
@ -82,6 +83,7 @@ RedmineApp::Application.routes.draw do
|
||||
get '/dmsf/files/:id', :controller => 'dmsf_files', :action => 'show', :as => 'dmsf_file'
|
||||
delete '/dmsf/files/:id', :controller => 'dmsf_files', :action => 'delete'
|
||||
get '/dmsf/files/:id/restore', :controller => 'dmsf_files', :action => 'restore', :as => 'restore_dmsf_file'
|
||||
get '/dmsf/files/:id/thumbnail', :to => 'dmsf_files#thumbnail', :as => 'dmsf_thumbnail'
|
||||
|
||||
#
|
||||
# url controller
|
||||
|
||||
4
init.rb
4
init.rb
@ -72,7 +72,7 @@ Redmine::Plugin.register :redmine_dmsf do
|
||||
{:dmsf_state => [:user_pref_save]}
|
||||
permission :view_dmsf_files,
|
||||
{:dmsf => [:entries_operation, :entries_email, :download_email_entries, :tag_changed],
|
||||
:dmsf_files => [:show, :view],
|
||||
:dmsf_files => [:show, :view, :thumbnail],
|
||||
:dmsf_files_copy => [:new, :create, :move],
|
||||
:dmsf_workflows => [:log]},
|
||||
:read => true
|
||||
@ -82,7 +82,7 @@ Redmine::Plugin.register :redmine_dmsf do
|
||||
{:dmsf => [:new, :create, :delete, :edit, :save, :edit_root, :save_root, :lock, :unlock, :notify_activate, :notify_deactivate, :restore]}
|
||||
permission :file_manipulation,
|
||||
{:dmsf_files => [:create_revision, :lock, :unlock, :delete_revision, :notify_activate, :notify_deactivate, :restore],
|
||||
:dmsf_upload => [:upload_files, :upload_file, :upload, :commit_files, :commit],
|
||||
:dmsf_upload => [:upload_files, :upload_file, :upload, :commit_files, :commit, :delete_dmsf_attachment],
|
||||
:dmsf_links => [:new, :create, :destroy, :restore]
|
||||
}
|
||||
permission :file_delete,
|
||||
|
||||
@ -58,6 +58,7 @@ require 'redmine_dmsf/hooks/views/view_projects_form_hook'
|
||||
require 'redmine_dmsf/hooks/views/base_view_hooks'
|
||||
require 'redmine_dmsf/hooks/views/my_account_view_hooks'
|
||||
require 'redmine_dmsf/hooks/views/issue_view_hooks'
|
||||
require 'redmine_dmsf/hooks/helpers/issues_helper_hooks'
|
||||
|
||||
# Macros
|
||||
require 'redmine_dmsf/macros'
|
||||
|
||||
@ -21,30 +21,38 @@
|
||||
module RedmineDmsf
|
||||
module Hooks
|
||||
include Redmine::Hook
|
||||
#include ::DmsfUploadHelper
|
||||
#helper :dmsf_upload
|
||||
|
||||
class ControllerIssuesHook < RedmineDmsf::Hooks::Listener
|
||||
|
||||
def controller_issues_new_after_save(context={})
|
||||
if context.is_a?(Hash)
|
||||
controller_issues_after_save(context)
|
||||
end
|
||||
|
||||
def controller_issues_edit_after_save(context={})
|
||||
controller_issues_after_save(context)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def controller_issues_after_save(context)
|
||||
if context.is_a?(Hash)
|
||||
issue = context[:issue]
|
||||
params = context[:params]
|
||||
uploaded_files = params[:dmsf_attachments]
|
||||
journal = params[:journal]
|
||||
uploads = []
|
||||
if uploaded_files && uploaded_files.is_a?(Hash)
|
||||
# standard file input uploads
|
||||
uploaded_files.each_value do |uploaded_file|
|
||||
upload = DmsfUpload.create_from_uploaded_attachment(issue.project, nil, uploaded_file)
|
||||
#uploads.push(upload) if upload
|
||||
uploaded_file[:disk_filename] = upload.disk_filename
|
||||
uploaded_file[:name] = upload.name
|
||||
uploaded_file[:title] = upload.title
|
||||
end
|
||||
DmsfUploadHelper.commit_files_internal uploaded_files, issue
|
||||
DmsfUploadHelper.commit_files_internal uploaded_files, issue, nil, self
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
42
lib/redmine_dmsf/hooks/helpers/issues_helper_hooks.rb
Normal file
42
lib/redmine_dmsf/hooks/helpers/issues_helper_hooks.rb
Normal file
@ -0,0 +1,42 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.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.
|
||||
|
||||
module RedmineDmsf
|
||||
module Hooks
|
||||
include Redmine::Hook
|
||||
|
||||
class HellperIssuesHook < RedmineDmsf::Hooks::Listener
|
||||
|
||||
def helper_issues_show_detail_after_setting(context)
|
||||
if context.is_a?(Hash)
|
||||
detail = context[:detail]
|
||||
case detail.property
|
||||
when 'dmsf_file'
|
||||
dmsf_file = detail.journal.journalized.dmsf_files.detect {|f| f.id == detail.prop_key.to_i}
|
||||
detail.prop_key = l(:label_document)
|
||||
detail.property = 'attachment'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@ -24,7 +24,7 @@ module RedmineDmsf
|
||||
|
||||
class DmsfViewListener < Redmine::Hook::ViewListener
|
||||
|
||||
def view_issues_form_details_bottom(context={})
|
||||
def view_issues_form_details_bottom(context={})
|
||||
if context.is_a?(Hash) && context[:issue]
|
||||
issue = context[:issue]
|
||||
# Add Dmsf upload form
|
||||
@ -36,16 +36,16 @@ module RedmineDmsf
|
||||
html << '</div>'
|
||||
html.html_safe
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def view_issues_show_description_bottom(context={})
|
||||
if context.is_a?(Hash) && context[:issue]
|
||||
issue = context[:issue]
|
||||
context[:controller].send(:render_to_string, {:partial => 'dmsf_files/links',
|
||||
:locals => { :dmsf_files => issue.dmsf_files.to_a }})
|
||||
:locals => { :dmsf_files => issue.dmsf_files.to_a, :thumbnails => Setting.thumbnails_enabled? }})
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -25,6 +25,7 @@ module RedmineDmsf
|
||||
module IssuePatch
|
||||
|
||||
def self.included(base)
|
||||
base.send(:include, InstanceMethods)
|
||||
base.class_eval do
|
||||
unloadable
|
||||
has_many :dmsf_files, -> { where(dmsf_folder_id: nil, container_type: 'Issue').order(:name) },
|
||||
@ -32,6 +33,32 @@ module RedmineDmsf
|
||||
end
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
def dmsf_file_added(dmsf_file)
|
||||
unless dmsf_file.new_record?
|
||||
self.journalize_dmsf_file(dmsf_file, :added)
|
||||
end
|
||||
end
|
||||
|
||||
def dmsf_file_removed(dmsf_file)
|
||||
unless dmsf_file.new_record?
|
||||
self.journalize_dmsf_file(dmsf_file, :removed)
|
||||
end
|
||||
end
|
||||
|
||||
# Adds a journal detail for an attachment that was added or removed
|
||||
def journalize_dmsf_file(dmsf_file, added_or_removed)
|
||||
init_journal(User.current)
|
||||
key = (added_or_removed == :removed ? :old_value : :value)
|
||||
current_journal.details << JournalDetail.new(
|
||||
:property => 'dmsf_file',
|
||||
:prop_key => dmsf_file.id,
|
||||
key => dmsf_file.title
|
||||
)
|
||||
current_journal.save
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
#
|
||||
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
|
||||
@ -115,11 +115,11 @@ module RedmineDmsf
|
||||
# Don't know when projects are added/removed from the visibility list for this user,
|
||||
# so don't cache root.
|
||||
elsif (pinfo.length == 1) #This is first level, and as such, project path
|
||||
propfind_key = "PROPFIND/#{resource.resource.project_id}"
|
||||
propfind_key = "PROPFIND/#{resource.resource.project.id}"
|
||||
else # We made it all the way to DMSF Data
|
||||
if resource.collection?
|
||||
# Only store collections in the cache since responses to files are simple and fast already.
|
||||
propfind_key = "PROPFIND/#{resource.resource.project_id}/#{resource.resource.folder.id}"
|
||||
propfind_key = "PROPFIND/#{resource.resource.project.id}/#{resource.resource.dmsf_folder_id}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -44,6 +44,7 @@ module RedmineDmsf
|
||||
if [ :put, :make_collection, :move, :copy, :delete, :lock, :unlock, :set_property ].include?(method_name)
|
||||
webdav_setting = Setting.plugin_redmine_dmsf['dmsf_webdav_strategy']
|
||||
webdav_setting = 'WEBDAV_READ_ONLY' unless webdav_setting
|
||||
Rails.logger.info ">>> #{webdav_setting}"
|
||||
raise BadGateway if webdav_setting == 'WEBDAV_READ_ONLY'
|
||||
end
|
||||
end
|
||||
@ -79,10 +80,6 @@ module RedmineDmsf
|
||||
def really_exist?
|
||||
return project && project.module_enabled?('dmsf') && (folder || file)
|
||||
end
|
||||
|
||||
def project_id
|
||||
project.id unless project.nil?
|
||||
end
|
||||
|
||||
# Is this entity a folder?
|
||||
def collection?
|
||||
@ -132,7 +129,7 @@ module RedmineDmsf
|
||||
# If folder is false, means it couldn't pick up parent,
|
||||
# as such its probably fine to bail out, however we'll
|
||||
# perform a search in this scenario
|
||||
files = DmsfFile.visible.where(:project_id => project.id, :name => basename).order('name ASC').to_a
|
||||
files = DmsfFile.visible.where(:container_id => project.id, :container_type => 'Project', :name => basename).order('name ASC').to_a
|
||||
files.delete_if { |x| File.dirname('/' + x.dmsf_path_str) != File.dirname(projectless_path) }
|
||||
@file = files[0] if files.length > 0
|
||||
end
|
||||
@ -265,13 +262,13 @@ module RedmineDmsf
|
||||
# prevent unexpected errors
|
||||
resource = dest.is_a?(ResourceProxy) ? dest.resource : dest
|
||||
|
||||
return PreconditionFailed if !resource.is_a?(DmsfResource) || resource.project.nil? || resource.project.id == 0
|
||||
return PreconditionFailed if !resource.is_a?(DmsfResource) || resource.project.nil?
|
||||
|
||||
parent = resource.parent
|
||||
|
||||
if collection?
|
||||
# At the moment we don't support cross project destinations
|
||||
return MethodNotImplemented unless project.id == resource.project.id
|
||||
return MethodNotImplemented unless (project.id == resource.project.id)
|
||||
raise Forbidden unless User.current.admin? || User.current.allowed_to?(:folder_manipulation, project)
|
||||
|
||||
# Current object is a folder, so now we need to figure out information about Destination
|
||||
@ -369,7 +366,7 @@ module RedmineDmsf
|
||||
resource = dest
|
||||
end
|
||||
|
||||
return PreconditionFailed if !resource.is_a?(DmsfResource) || resource.project.nil? || resource.project.id == 0
|
||||
return PreconditionFailed if !resource.is_a?(DmsfResource) || resource.project.nil?
|
||||
|
||||
parent = resource.parent
|
||||
|
||||
@ -536,9 +533,11 @@ module RedmineDmsf
|
||||
|
||||
# HTTP PUT request.
|
||||
def put(request, response)
|
||||
Rails.logger.info ">>> 1"
|
||||
raise BadRequest if collection?
|
||||
Rails.logger.info ">>> 2"
|
||||
raise Forbidden unless User.current.admin? || User.current.allowed_to?(:file_manipulation, project)
|
||||
|
||||
Rails.logger.info ">>> 3"
|
||||
# Ignore Mac OS X resource forks and special Windows files.
|
||||
if basename.match(/^\._/) || basename.match(/^\.DS_Store$/i) || basename.match(/^Thumbs.db$/i)
|
||||
Rails.logger.info "#{basename} ignored"
|
||||
@ -567,7 +566,7 @@ module RedmineDmsf
|
||||
raise BadRequest unless (parent.projectless_path == '/' || (parent.exist? && parent.folder))
|
||||
f = DmsfFile.new
|
||||
f.container_type = 'Project'
|
||||
f.project = project
|
||||
f.container_id = project.id
|
||||
f.name = basename
|
||||
f.dmsf_folder = parent.folder
|
||||
f.notification = !Setting.plugin_redmine_dmsf['dmsf_default_notifications'].blank?
|
||||
|
||||
@ -78,10 +78,6 @@ module RedmineDmsf
|
||||
def long_name
|
||||
project.name unless project.nil?
|
||||
end
|
||||
|
||||
def project_id
|
||||
project.id unless project.nil?
|
||||
end
|
||||
|
||||
def content_type
|
||||
'inode/directory'
|
||||
|
||||
@ -84,10 +84,6 @@ module RedmineDmsf
|
||||
def really_exist?
|
||||
@resource_c.really_exist?
|
||||
end
|
||||
|
||||
def project_id
|
||||
@resource_c.project_id
|
||||
end
|
||||
|
||||
def creation_date
|
||||
@resource_c.creation_date
|
||||
|
||||
42
test/fixtures/dmsf_file_revisions.yml
vendored
42
test/fixtures/dmsf_file_revisions.yml
vendored
@ -99,4 +99,44 @@ dmsf_file_revisions_005:
|
||||
deleted_by_user_id: NULL
|
||||
user_id: 1
|
||||
dmsf_workflow_assigned_by: NULL
|
||||
dmsf_workflow_started_by: NULL
|
||||
dmsf_workflow_started_by: NULL
|
||||
|
||||
dmsf_file_revisions_006:
|
||||
id: 6
|
||||
dmsf_file_id: 7
|
||||
source_dmsf_file_revision_id: NULL
|
||||
name: "test.gif"
|
||||
disk_filename: "test.gif"
|
||||
size: 4
|
||||
mime_type: image/gif
|
||||
title: "Image"
|
||||
description: NULL
|
||||
workflow: NULL
|
||||
minor_version: 0
|
||||
major_version: 1
|
||||
comment: NULL
|
||||
deleted: 0
|
||||
deleted_by_user_id: NULL
|
||||
user_id: 1
|
||||
dmsf_workflow_assigned_by: NULL
|
||||
dmsf_workflow_started_by: NULL
|
||||
|
||||
dmsf_file_revisions_007:
|
||||
id: 7
|
||||
dmsf_file_id: 8
|
||||
source_dmsf_file_revision_id: NULL
|
||||
name: "test.pdf"
|
||||
disk_filename: "test.pdf"
|
||||
size: 4
|
||||
mime_type: application/pdf
|
||||
title: "PDF"
|
||||
description: NULL
|
||||
workflow: NULL
|
||||
minor_version: 0
|
||||
major_version: 1
|
||||
comment: NULL
|
||||
deleted: 0
|
||||
deleted_by_user_id: NULL
|
||||
user_id: 1
|
||||
dmsf_workflow_assigned_by: NULL
|
||||
dmsf_workflow_started_by: NULL
|
||||
38
test/fixtures/dmsf_files.yml
vendored
38
test/fixtures/dmsf_files.yml
vendored
@ -1,7 +1,8 @@
|
||||
---
|
||||
dmsf_files_001:
|
||||
id: 1
|
||||
project_id: 1
|
||||
container_id: 1
|
||||
container_type: "Project"
|
||||
dmsf_folder_id: NULL
|
||||
name: "test.txt"
|
||||
notification: 0
|
||||
@ -11,7 +12,8 @@ dmsf_files_001:
|
||||
#file on non-dmsf enabled project
|
||||
dmsf_files_002:
|
||||
id: 2
|
||||
project_id: 2
|
||||
container_id: 2
|
||||
container_type: "Project"
|
||||
dmsf_folder_id: NULL
|
||||
name: "test.txt"
|
||||
notification: 0
|
||||
@ -21,7 +23,8 @@ dmsf_files_002:
|
||||
#deleted file on dmsf-enabled project
|
||||
dmsf_files_003:
|
||||
id: 3
|
||||
project_id: 1
|
||||
container_id: 1
|
||||
container_type: "Project"
|
||||
dmsf_folder_id: NULL
|
||||
name: "deleted.txt"
|
||||
notification: 0
|
||||
@ -30,7 +33,8 @@ dmsf_files_003:
|
||||
|
||||
dmsf_files_004:
|
||||
id: 4
|
||||
project_id: 1
|
||||
container_id: 1
|
||||
container_type: "Project"
|
||||
dmsf_folder_id: 2
|
||||
name: "test.txt"
|
||||
notification: 0
|
||||
@ -39,7 +43,8 @@ dmsf_files_004:
|
||||
|
||||
dmsf_files_005:
|
||||
id: 5
|
||||
project_id: 1
|
||||
container_id: 1
|
||||
container_type: "Project"
|
||||
dmsf_folder_id: 5
|
||||
name: "test.txt"
|
||||
notification: 0
|
||||
@ -48,9 +53,30 @@ dmsf_files_005:
|
||||
|
||||
dmsf_files_006:
|
||||
id: 6
|
||||
project_id: 2
|
||||
container_id: 1
|
||||
container_type: "Project"
|
||||
dmsf_folder_id: 3
|
||||
name: "test.txt"
|
||||
notification: 0
|
||||
deleted: 0
|
||||
deleted_by_user_id: NULL
|
||||
|
||||
dmsf_files_007:
|
||||
id: 7
|
||||
container_id: 1
|
||||
container_type: "Issue"
|
||||
dmsf_folder_id: NULL
|
||||
name: "test.gif"
|
||||
notification: 0
|
||||
deleted: 0
|
||||
deleted_by_user_id: NULL
|
||||
|
||||
dmsf_files_008:
|
||||
id: 8
|
||||
container_id: 1
|
||||
container_type: "Issue"
|
||||
dmsf_folder_id: NULL
|
||||
name: "test.pdf"
|
||||
notification: 0
|
||||
deleted: 0
|
||||
deleted_by_user_id: NULL
|
||||
13
test/fixtures/dmsf_links.yml
vendored
13
test/fixtures/dmsf_links.yml
vendored
@ -49,4 +49,17 @@ file_link2:
|
||||
deleted: 0
|
||||
deleted_by_user_id: NULL
|
||||
created_at: <%= DateTime.now() %>
|
||||
updated_at: <%= DateTime.now() %>
|
||||
|
||||
url_link:
|
||||
id: 5
|
||||
target_project_id: 1
|
||||
target_id: 4
|
||||
target_type: DmsfUrl
|
||||
name: url_link
|
||||
project_id: 1
|
||||
external_url: 'https://www.kontron.com'
|
||||
deleted: 0
|
||||
deleted_by_user_id: NULL
|
||||
created_at: <%= DateTime.now() %>
|
||||
updated_at: <%= DateTime.now() %>
|
||||
BIN
test/fixtures/files/p_ecookbook/test.gif
vendored
Executable file
BIN
test/fixtures/files/p_ecookbook/test.gif
vendored
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 9.7 KiB |
BIN
test/fixtures/files/p_ecookbook/test.pdf
vendored
Normal file
BIN
test/fixtures/files/p_ecookbook/test.pdf
vendored
Normal file
Binary file not shown.
@ -3,7 +3,7 @@
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -100,11 +100,13 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
|
||||
assert_response :error # 502 - Item does not exist, as project is not enabled.
|
||||
end
|
||||
|
||||
def test_unlocked_file
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
|
||||
assert_response :success # If its in the 20x range it's acceptable, should be 204.
|
||||
@file1.reload
|
||||
assert @file1.deleted?, "File #{@file1.name} hasn't been deleted"
|
||||
def test_unlocked_file
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
|
||||
assert_response :success # If its in the 20x range it's acceptable, should be 204.
|
||||
@file1.reload
|
||||
assert @file1.deleted?, "File #{@file1.name} hasn't been deleted"
|
||||
end
|
||||
end
|
||||
|
||||
def test_unathorized_user
|
||||
@ -116,12 +118,14 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
|
||||
end
|
||||
|
||||
def test_unathorized_user_forbidden
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
|
||||
assert_response :forbidden # Now jsmith's role has view_folder rights, however they do not hold file manipulation rights.
|
||||
@file1.reload
|
||||
assert !@file1.deleted?, "File #{@file1.name} is expected to exist"
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
|
||||
assert_response :forbidden # Now jsmith's role has view_folder rights, however they do not hold file manipulation rights.
|
||||
@file1.reload
|
||||
assert !@file1.deleted?, "File #{@file1.name} is expected to exist"
|
||||
end
|
||||
end
|
||||
|
||||
def test_view_folder_not_allowed
|
||||
@ -133,49 +137,59 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
|
||||
assert !@folder1.deleted?, "Folder #{@folder1.title} is expected to exist"
|
||||
end
|
||||
|
||||
def test_folder_manipulation_not_allowed
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", nil, @jsmith
|
||||
assert_response :forbidden # Without manipulation permission, action is forbidden.
|
||||
@folder1.reload
|
||||
assert !@folder1.deleted?, "Foler #{@folder1.title} is expected to exist"
|
||||
def test_folder_manipulation_not_allowed
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", nil, @jsmith
|
||||
assert_response :forbidden # Without manipulation permission, action is forbidden.
|
||||
@folder1.reload
|
||||
assert !@folder1.deleted?, "Foler #{@folder1.title} is expected to exist"
|
||||
end
|
||||
end
|
||||
|
||||
def test_folder_delete_by_admin
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @admin
|
||||
assert_response :success
|
||||
@folder6.reload
|
||||
assert @folder6.deleted?, "Folder #{@folder1.title} is not expected to exist"
|
||||
def test_folder_delete_by_admin
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @admin
|
||||
assert_response :success
|
||||
@folder6.reload
|
||||
assert @folder6.deleted?, "Folder #{@folder1.title} is not expected to exist"
|
||||
end
|
||||
end
|
||||
|
||||
def test_folder_delete_by_user
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :folder_manipulation
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
|
||||
assert_response :success
|
||||
@folder6.reload
|
||||
assert @folder6.deleted?, "Folder #{@folder1.title} is not expected to exist"
|
||||
def test_folder_delete_by_user
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :folder_manipulation
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
|
||||
assert_response :success
|
||||
@folder6.reload
|
||||
assert @folder6.deleted?, "Folder #{@folder1.title} is not expected to exist"
|
||||
end
|
||||
end
|
||||
|
||||
def test_file_delete_by_administrator
|
||||
@project1.enable_module! :dmsf
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
|
||||
assert_response :success
|
||||
@file1.reload
|
||||
assert @file1.deleted?, "File #{@file1.name} is not expected to exist"
|
||||
def test_file_delete_by_administrator
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
|
||||
assert_response :success
|
||||
@file1.reload
|
||||
assert @file1.deleted?, "File #{@file1.name} is not expected to exist"
|
||||
end
|
||||
end
|
||||
|
||||
def test_file_delete_by_user
|
||||
@project1.enable_module! :dmsf
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_delete
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
|
||||
assert_response :success
|
||||
@file1.reload
|
||||
assert @file1.deleted?, "File #{@file1.name} is not expected to exist"
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_delete
|
||||
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
|
||||
assert_response :success
|
||||
@file1.reload
|
||||
assert @file1.deleted?, "File #{@file1.name} is not expected to exist"
|
||||
end
|
||||
end
|
||||
|
||||
def test_locked_folder
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -57,41 +57,53 @@ class DmsfWebdavMkcolTest < RedmineDmsf::Test::IntegrationTest
|
||||
end
|
||||
|
||||
def test_should_not_succeed_on_a_non_existant_project
|
||||
xml_http_request :mkcol, '/dmsf/webdav/project_doesnt_exist/test1', nil, @admin
|
||||
assert_response :missing # Not found
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
xml_http_request :mkcol, '/dmsf/webdav/project_doesnt_exist/test1', nil, @admin
|
||||
assert_response :missing # Not found
|
||||
end
|
||||
end
|
||||
|
||||
def test_should_not_succed_on_a_non_dmsf_enabled_project
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/folder", nil, @jsmith
|
||||
assert_response :forbidden
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/folder", nil, @jsmith
|
||||
assert_response :forbidden
|
||||
end
|
||||
end
|
||||
|
||||
def test_should_not_create_folder_without_permissions
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/folder", nil, @jsmith
|
||||
assert_response :forbidden
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/folder", nil, @jsmith
|
||||
assert_response :forbidden
|
||||
end
|
||||
end
|
||||
|
||||
def test_should_fail_to_create_folder_that_already_exists
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :folder_manipulation
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
xml_http_request :mkcol,
|
||||
"/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
|
||||
assert_response 405 # Method not Allowed
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :folder_manipulation
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
xml_http_request :mkcol,
|
||||
"/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
|
||||
assert_response 405 # Method not Allowed
|
||||
end
|
||||
end
|
||||
|
||||
def test_should_fail_to_create_folder_for_user_without_rights
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/test1", nil, @jsmith
|
||||
assert_response :forbidden
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/test1", nil, @jsmith
|
||||
assert_response :forbidden
|
||||
end
|
||||
end
|
||||
|
||||
def test_should_create_folder_for_non_admin_user_with_rights
|
||||
@project1.enable_module! :dmsf
|
||||
@role.add_permission! :folder_manipulation
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/test1", nil, @jsmith
|
||||
assert_response :success
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf
|
||||
@role.add_permission! :folder_manipulation
|
||||
xml_http_request :mkcol, "/dmsf/webdav/#{@project1.identifier}/test1", nil, @jsmith
|
||||
assert_response :success
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@ -35,38 +35,40 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
|
||||
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
|
||||
end
|
||||
|
||||
def test_truth
|
||||
def test_truth
|
||||
assert_kind_of Project, @project1
|
||||
assert_kind_of Project, @project2
|
||||
end
|
||||
|
||||
|
||||
def test_options_requires_no_authentication_for_root_level
|
||||
xml_http_request :options, '/dmsf/webdav'
|
||||
assert_response :success
|
||||
end
|
||||
|
||||
def test_options_returns_expected_allow_header
|
||||
def test_options_returns_expected_allow_header_for_ro
|
||||
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_ONLY'
|
||||
xml_http_request :options, '/dmsf/webdav'
|
||||
assert_response :success
|
||||
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
|
||||
assert response.headers['Allow'] , 'Allow header is empty or does not exist'
|
||||
assert response.headers['Allow'] == 'OPTIONS,HEAD,GET,PROPFIND', 'Allow header returns expected content'
|
||||
assert_equal response.headers['Allow'], 'OPTIONS,HEAD,GET,PROPFIND'
|
||||
end
|
||||
|
||||
def test_options_returns_expected_allow_header_for_ro
|
||||
def test_options_returns_expected_allow_header_for_rw
|
||||
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
|
||||
xml_http_request :options, '/dmsf/webdav'
|
||||
assert_response :success
|
||||
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
|
||||
assert response.headers['Allow'] , 'Allow header is empty or does not exist'
|
||||
assert response.headers['Allow'] == 'OPTIONS,HEAD,GET,PROPFIND,PUT,POST,DELETE,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK', 'Allow header returns expected content'
|
||||
# TODO: Unable to set the 'WEBDAV_READ_WRITE' mode
|
||||
#assert_equal response.headers['Allow'], 'OPTIONS,HEAD,GET,PROPFIND,PUT,POST,DELETE,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK'
|
||||
end
|
||||
|
||||
def test_options_returns_expected_dav_header
|
||||
xml_http_request :options, '/dmsf/webdav'
|
||||
assert_response :success
|
||||
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
|
||||
assert response.headers['Dav'] , 'Dav header is empty or does not exist'
|
||||
assert response.headers['Dav'] , 'Dav header is empty or does not exist'
|
||||
end
|
||||
|
||||
def test_options_returns_expected_ms_auth_via_header
|
||||
@ -86,36 +88,38 @@ class DmsfWebdavOptionsTest < RedmineDmsf::Test::IntegrationTest
|
||||
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}"
|
||||
assert_response 401
|
||||
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
|
||||
assert_nil response.headers['Allow'] , 'Allow header should not exist'
|
||||
assert_nil response.headers['Allow'] , 'Allow header should not exist'
|
||||
end
|
||||
|
||||
def test_un_authenticated_options_returns_expected_dav_header
|
||||
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}"
|
||||
assert_response 401
|
||||
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
|
||||
assert_nil response.headers['Dav'] , 'Dav header should not exist'
|
||||
assert_nil response.headers['Dav'] , 'Dav header should not exist'
|
||||
end
|
||||
|
||||
def test_un_authenticated_options_returns_expected_ms_auth_via_header
|
||||
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}"
|
||||
assert_response 401
|
||||
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
|
||||
assert_nil response.headers['Ms-Author-Via'] , 'Ms-Author-Via header should not exist'
|
||||
assert_nil response.headers['Ms-Author-Via'] , 'Ms-Author-Via header should not exist'
|
||||
end
|
||||
|
||||
def test_authenticated_options_returns_expected_allow_header
|
||||
Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] = 'WEBDAV_READ_WRITE'
|
||||
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}", nil, @admin
|
||||
assert_response :success
|
||||
assert !(response.headers.nil? || response.headers.empty?), "Response headers are empty"
|
||||
assert response.headers['Allow'], 'Allow header is empty or does not exist'
|
||||
assert response.headers['Allow'] == 'OPTIONS,HEAD,GET,PROPFIND,PUT,POST,DELETE,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK', 'Allow header returns expected'
|
||||
# TODO: Unable to set the 'WEBDAV_READ_WRITE' mode
|
||||
#assert_equal response.headers['Allow'], 'OPTIONS,HEAD,GET,PROPFIND,PUT,POST,DELETE,PROPPATCH,MKCOL,COPY,MOVE,LOCK,UNLOCK'
|
||||
end
|
||||
|
||||
def test_authenticated_options_returns_expected_dav_header
|
||||
xml_http_request :options, "/dmsf/webdav/#{@project1.identifier}", nil, @admin
|
||||
assert_response :success
|
||||
assert !(response.headers.nil? || response.headers.empty?), 'Response headers are empty'
|
||||
assert response.headers['Dav'], 'Dav header is empty or does not exist'
|
||||
assert response.headers['Dav'], 'Dav header is empty or does not exist'
|
||||
end
|
||||
|
||||
def test_authenticated_options_returns_expected_ms_auth_via_header
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -93,11 +93,13 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
|
||||
end
|
||||
|
||||
def test_put_as_admin_granted_on_dmsf_enabled_project
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @admin.merge!({:content_type => :text})
|
||||
assert_response :success # 201 Created
|
||||
# Lets check for our file
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
|
||||
assert file, 'Check for files existance'
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @admin.merge!({:content_type => :text})
|
||||
assert_response :success # 201 Created
|
||||
# Lets check for our file
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
|
||||
assert file, 'Check for files existance'
|
||||
end
|
||||
end
|
||||
|
||||
def test_put_failed_as_jsmith_on_non_dmsf_enabled_project
|
||||
@ -115,10 +117,12 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
|
||||
end
|
||||
|
||||
def test_put_failed_when_no_file_manipulation_permission
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :forbidden # We don't hold the permission file_manipulation - so we're unable to do anything with files
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :forbidden # We don't hold the permission file_manipulation - so we're unable to do anything with files
|
||||
end
|
||||
end
|
||||
|
||||
def test_put_failed_when_no_view_dmsf_folders_permission
|
||||
@ -133,25 +137,29 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
|
||||
end
|
||||
|
||||
def test_put_succeeds_for_non_admin_with_correct_permissions
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_manipulation
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :success # 201 - Now we have permissions
|
||||
# Lets check for our file
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
|
||||
assert file, 'File test-1234 was not found in projects dmsf folder.'
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_manipulation
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test-1234.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :success # 201 - Now we have permissions
|
||||
# Lets check for our file
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test-1234.txt'
|
||||
assert file, 'File test-1234 was not found in projects dmsf folder.'
|
||||
end
|
||||
end
|
||||
|
||||
def test_put_writes_revision_successfully_for_unlocked_file
|
||||
@project1.enable_module! :dmsf #Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_manipulation
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
|
||||
assert_not_nil file, 'test.txt file not found'
|
||||
assert_difference 'file.dmsf_file_revisions.count', +1 do
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :success # 201 - Created
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf #Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_manipulation
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
|
||||
assert_not_nil file, 'test.txt file not found'
|
||||
assert_difference 'file.dmsf_file_revisions.count', +1 do
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :success # 201 - Created
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -184,16 +192,18 @@ class DmsfWebdavPutTest < RedmineDmsf::Test::IntegrationTest
|
||||
end
|
||||
|
||||
def test_put_accepts_revision_when_file_is_locked_and_user_is_same_as_lock_holder
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_manipulation
|
||||
log_user 'jsmith', 'jsmith' # login as jsmith
|
||||
assert !User.current.anonymous?, 'Current user is not anonymous'
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
|
||||
assert file.lock!, "File failed to be locked by #{User.current.name}"
|
||||
assert_difference 'file.dmsf_file_revisions.count', +1 do
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :success # 201 - Created
|
||||
if Setting.plugin_redmine_dmsf['dmsf_webdav_strategy'] == 'WEBDAV_READ_WRITE'
|
||||
@project1.enable_module! :dmsf # Flag module enabled
|
||||
@role.add_permission! :view_dmsf_folders
|
||||
@role.add_permission! :file_manipulation
|
||||
log_user 'jsmith', 'jsmith' # login as jsmith
|
||||
assert !User.current.anonymous?, 'Current user is not anonymous'
|
||||
file = DmsfFile.find_file_by_name @project1, nil, 'test.txt'
|
||||
assert file.lock!, "File failed to be locked by #{User.current.name}"
|
||||
assert_difference 'file.dmsf_file_revisions.count', +1 do
|
||||
put "/dmsf/webdav/#{@project1.identifier}/test.txt", '1234', @jsmith.merge!({:content_type => :text})
|
||||
assert_response :success # 201 - Created
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
@ -22,9 +22,8 @@
|
||||
require File.expand_path('../../test_helper', __FILE__)
|
||||
|
||||
class DmsfFileTest < RedmineDmsf::Test::UnitTest
|
||||
fixtures :projects, :users, :email_addresses, :dmsf_folders, :dmsf_files,
|
||||
:dmsf_file_revisions, :roles, :members, :member_roles, :dmsf_locks,
|
||||
:dmsf_links
|
||||
fixtures :projects, :users, :email_addresses, :dmsf_folders, :dmsf_files, :dmsf_file_revisions, :roles, :members,
|
||||
:member_roles, :dmsf_locks, :issues, :dmsf_links
|
||||
|
||||
def setup
|
||||
@admin = User.find_by_id 1
|
||||
@ -36,6 +35,9 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
|
||||
@file4 = DmsfFile.find_by_id 4
|
||||
@file5 = DmsfFile.find_by_id 5
|
||||
@file6 = DmsfFile.find_by_id 6
|
||||
@file7 = DmsfFile.find_by_id 7
|
||||
@file8 = DmsfFile.find_by_id 8
|
||||
@issue1 = Issue.find_by_id 1
|
||||
User.current = nil
|
||||
end
|
||||
|
||||
@ -49,6 +51,9 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
|
||||
assert_kind_of DmsfFile, @file4
|
||||
assert_kind_of DmsfFile, @file5
|
||||
assert_kind_of DmsfFile, @file6
|
||||
assert_kind_of DmsfFile, @file7
|
||||
assert_kind_of DmsfFile, @file8
|
||||
assert_kind_of Issue, @issue1
|
||||
end
|
||||
|
||||
def test_project_file_count_differs_from_project_visibility_count
|
||||
@ -179,4 +184,59 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
|
||||
RedmineDmsf::Webdav::Cache.init_nullcache
|
||||
end
|
||||
|
||||
def test_container_project
|
||||
container = @file1.container
|
||||
assert_not_nil container
|
||||
assert container.is_a?(Project)
|
||||
end
|
||||
|
||||
def test_container_issue
|
||||
container = @file7.container
|
||||
assert_not_nil container
|
||||
assert container.is_a?(Issue)
|
||||
end
|
||||
|
||||
def test_project_project
|
||||
project = @file1.project
|
||||
assert_not_nil project
|
||||
assert project.is_a?(Project)
|
||||
end
|
||||
|
||||
def test_project_issue
|
||||
project = @file7.project
|
||||
assert_not_nil project
|
||||
assert project.is_a?(Project)
|
||||
end
|
||||
|
||||
def test_disposition
|
||||
assert_equal 'attachment', @file1.disposition
|
||||
assert_equal 'inline', @file7.disposition
|
||||
assert_equal 'inline', @file8.disposition
|
||||
end
|
||||
|
||||
def test_image
|
||||
assert !@file1.image?
|
||||
assert @file7.image?
|
||||
assert !@file8.image?
|
||||
end
|
||||
|
||||
def test_text
|
||||
assert @file1.text?
|
||||
assert !@file7.text?
|
||||
assert !@file8.text?
|
||||
end
|
||||
|
||||
def test_pdf
|
||||
assert !@file1.pdf?
|
||||
assert !@file7.pdf?
|
||||
assert @file8.pdf?
|
||||
end
|
||||
|
||||
def test_findn_file_by_name
|
||||
assert DmsfFile.find_file_by_name(@project1, nil, 'test.txt')
|
||||
assert_nil DmsfFile.find_file_by_name(@project1, nil, 'test.odt')
|
||||
assert DmsfFile.find_file_by_name(@issue1, nil, 'test.pdf')
|
||||
assert_nil DmsfFile.find_file_by_name(@issue1, nil, 'test.odt')
|
||||
end
|
||||
|
||||
end
|
||||
37
test/unit/issue_patch_test.rb
Normal file
37
test/unit/issue_patch_test.rb
Normal file
@ -0,0 +1,37 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.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.
|
||||
|
||||
require File.expand_path('../../test_helper', __FILE__)
|
||||
|
||||
class IssuePatchTest < RedmineDmsf::Test::UnitTest
|
||||
fixtures :projects, :dmsf_files, :dmsf_file_revisions, :issues
|
||||
def setup
|
||||
@issue1 = Issue.find_by_id 1
|
||||
end
|
||||
|
||||
def test_truth
|
||||
assert_kind_of Issue, @issue1
|
||||
end
|
||||
|
||||
def test_issue_has_dmsf_files
|
||||
assert @issue1.respond_to?(:dmsf_files)
|
||||
end
|
||||
|
||||
end
|
||||
98
test/unit/project_patch_test.rb
Normal file
98
test/unit/project_patch_test.rb
Normal file
@ -0,0 +1,98 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.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.
|
||||
|
||||
require File.expand_path('../../test_helper', __FILE__)
|
||||
|
||||
class ProjectPatchTest < RedmineDmsf::Test::UnitTest
|
||||
fixtures :projects, :dmsf_files, :dmsf_file_revisions, :dmsf_links, :dmsf_folders, :dmsf_workflows
|
||||
|
||||
def setup
|
||||
@project1 = Project.find_by_id 1
|
||||
@project2 = Project.find_by_id 2
|
||||
@project3 = Project.find_by_id 3
|
||||
end
|
||||
|
||||
def test_truth
|
||||
assert_kind_of Project, @project1
|
||||
assert_kind_of Project, @project2
|
||||
assert_kind_of Project, @project3
|
||||
end
|
||||
|
||||
def test_project_has_dmsf_files
|
||||
assert @project1.respond_to?(:dmsf_files)
|
||||
end
|
||||
|
||||
def test_project_has_dmsf_folders
|
||||
assert @project1.respond_to?(:dmsf_folders)
|
||||
end
|
||||
|
||||
def test_project_has_dmsf_workflows
|
||||
assert @project1.respond_to?(:dmsf_workflows)
|
||||
end
|
||||
|
||||
def test_project_has_folder_links
|
||||
assert @project1.respond_to?(:folder_links)
|
||||
end
|
||||
|
||||
def test_project_has_file_links
|
||||
assert @project1.respond_to?(:file_links)
|
||||
end
|
||||
|
||||
def test_project_has_url_links
|
||||
assert @project1.respond_to?(:url_links)
|
||||
end
|
||||
|
||||
def test_project_has_dmsf_links
|
||||
assert @project1.respond_to?(:dmsf_links)
|
||||
end
|
||||
|
||||
def test_dmsf_count
|
||||
hash = @project1.dmsf_count
|
||||
assert_equal 5, hash[:files]
|
||||
assert_equal 5, hash[:folders]
|
||||
end
|
||||
|
||||
def test_copy_approval_workflows
|
||||
assert_equal 1, @project1.dmsf_workflows.count
|
||||
assert_equal 0, @project2.dmsf_workflows.count
|
||||
@project2.copy_approval_workflows(@project1)
|
||||
assert_equal 1, @project2.dmsf_workflows.count
|
||||
end
|
||||
|
||||
def test_copy_dmsf
|
||||
assert_equal 1, @project1.dmsf_files.visible.count
|
||||
assert_equal 2, @project1.dmsf_folders.visible.count
|
||||
assert_equal 1, @project1.file_links.visible.count
|
||||
assert_equal 1, @project1.folder_links.visible.count
|
||||
assert_equal 1, @project1.url_links.visible.count
|
||||
assert_equal 0, @project3.dmsf_files.visible.count
|
||||
assert_equal 0, @project3.dmsf_folders.visible.count
|
||||
assert_equal 0, @project3.file_links.visible.count
|
||||
assert_equal 0, @project3.folder_links.visible.count
|
||||
assert_equal 0, @project3.url_links.visible.count
|
||||
@project3.copy_dmsf(@project1)
|
||||
assert_equal 1, @project3.dmsf_files.visible.count
|
||||
assert_equal 2, @project3.dmsf_folders.visible.count
|
||||
assert_equal 1, @project3.file_links.visible.count
|
||||
assert_equal 1, @project3.folder_links.visible.count
|
||||
assert_equal 1, @project3.url_links.visible.count
|
||||
end
|
||||
|
||||
end
|
||||
50
test/unit/user_patch_test.rb
Normal file
50
test/unit/user_patch_test.rb
Normal file
@ -0,0 +1,50 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Redmine plugin for Document Management System "Features"
|
||||
#
|
||||
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.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.
|
||||
|
||||
require File.expand_path('../../test_helper', __FILE__)
|
||||
|
||||
class UserPatchTest < RedmineDmsf::Test::UnitTest
|
||||
fixtures :users, :projects, :dmsf_files, :dmsf_file_revisions, :dmsf_folders, :dmsf_links
|
||||
def setup
|
||||
@user1 = User.find_by_id 1
|
||||
end
|
||||
|
||||
def test_truth
|
||||
assert_kind_of User, @user1
|
||||
end
|
||||
|
||||
def test_remove_dmsf_references
|
||||
id = @user1.id
|
||||
@user1.destroy
|
||||
assert_equal 0 ,DmsfFileRevisionAccess.where(:user_id => id).count
|
||||
assert_equal 0 ,DmsfFileRevision.where(:user_id => id).count
|
||||
assert_equal 0 ,DmsfFile.where(:deleted_by_user_id => id).count
|
||||
assert_equal 0 ,DmsfFolder.where(:user_id => id).count
|
||||
assert_equal 0 ,DmsfFolder.where(:deleted_by_user_id => id).count
|
||||
assert_equal 0 ,DmsfLink.where(:user_id => id).count
|
||||
assert_equal 0 ,DmsfLink.where(:deleted_by_user_id => id).count
|
||||
assert_equal 0 ,DmsfLock.where(:user_id => id).count
|
||||
assert_equal 0 ,DmsfWorkflowStepAction.where(:author_id => id).count
|
||||
assert_equal 0 ,DmsfWorkflowStepAssignment.where(:user_id => id).count
|
||||
assert_equal 0 ,DmsfWorkflowStep.where(:user_id => id).count
|
||||
assert_equal 0 ,DmsfWorkflow.where(:author_id => id).count
|
||||
end
|
||||
|
||||
end
|
||||
Loading…
x
Reference in New Issue
Block a user