usefull_attachment 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7c978fba260030fd1217e983f9a0065be5523d67
4
+ data.tar.gz: 60129f57bf831569c3ad02ac7bd63e3369ea1a33
5
+ SHA512:
6
+ metadata.gz: 70025cbb96e84d28658dbbe52f95091d85732a99c3974421ec93de26aeeae3816635477107fe5c1695fa248e909e8f0684a214dd32062c6df5b14cf050361ff7
7
+ data.tar.gz: fd8f65f26ae3e9b30a7f64417286a7c75ac7fd58e295c8d70983e10c6bfc684a9a14b9cecaef767e6fa152f21405af005106b34fe441c42499cc9aeb0ca20c08
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ ToDo
2
+ - Deploy a working copy
3
+
4
+ BugFix
5
+ - Not now
6
+
7
+ 1.0.1 (2013-11-24)
8
+ - first deploy
9
+
10
+ 0.0.1 (2012-07-13)
11
+ - Starting project
data/Gemfile ADDED
@@ -0,0 +1,23 @@
1
+ #You can add lacal gems with
2
+ # gem "my_gem", :path => "/home/www/gems/my_gem"
3
+ #you must remove the path in production or if you change server and replace with:
4
+ # git "git@10.2.252.240:my_gem.git"
5
+
6
+ source "http://rubygems.org"
7
+
8
+ gem "rails", "~>3.0.15"
9
+ gem "acts_as_monitor", :path => "/home/www/gems/acts_as_monitor"
10
+ gem "paperclip"
11
+ gem "usefull_filter", :path => "/home/www/gems/usefull_filter"
12
+ gem "usefull_table", :path => "/home/www/gems/usefull_table"
13
+ gem "will_paginate"
14
+
15
+ group :development, :test do
16
+ gem "ruby-debug"
17
+ gem "capybara", ">= 0.4.0"
18
+ gem "sqlite3"
19
+ gem "single_test"
20
+ end
21
+
22
+ gemspec
23
+
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ =UsefullAttachment
2
+
3
+ A very beta version for internal use only... try at your own risk!
4
+
5
+ ==Setup
6
+ Add this line to your application's Gemfile:
7
+ gem 'usefull_attachment'
8
+
9
+ then execute
10
+ $ bundle install
11
+
12
+ or install it yourself as:
13
+ $ sudo gem install usefull_attachment
14
+
15
+ install addons
16
+ $ rails g usefull_attachment:install
17
+
18
+ ==Usage
19
+ In your controller
20
+ #app/controllers/home_controller.rb
21
+ def index
22
+ ...
23
+ end
24
+
25
+ In your view
26
+ #app/views/home/index.html.erb
27
+ ...
28
+
29
+ ==Localization
30
+
31
+
32
+ ==Contributing
33
+
34
+ 1. Fork it
35
+ 2. Create your feature branch (git checkout -b my-new-feature)
36
+ 3. Commit your changes (git commit -am 'Added some feature')
37
+ 4. Push to the branch (git push origin my-new-feature)
38
+ 5. Create new Pull Request
39
+
40
+ ==Thanks
41
+
42
+ ...
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+ require 'rubygems'
3
+ begin
4
+ require 'bundler/setup'
5
+ require "bundler/gem_tasks"
6
+ rescue LoadError
7
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
8
+ end
9
+
10
+ require 'rake'
11
+ require 'rake/testtask'
12
+ require 'rdoc/task'
13
+
14
+
15
+
16
+ Rake::TestTask.new(:test) do |t|
17
+ t.libs << 'lib'
18
+ t.libs << 'test'
19
+ t.pattern = 'test/**/*_test.rb'
20
+ t.verbose = false
21
+ end
22
+
23
+ task :default => :test
24
+
25
+ Rake::RDocTask.new(:rdoc) do |rdoc|
26
+ rdoc.rdoc_dir = 'rdoc'
27
+ rdoc.title = 'usefull_attachment'
28
+ rdoc.options << '--line-numbers' << '--inline-source'
29
+ rdoc.rdoc_files.include('README.rdoc')
30
+ rdoc.rdoc_files.include('lib/**/*.rb')
31
+ end
32
+
@@ -0,0 +1,58 @@
1
+ module UsefullAttachment
2
+ class LinksController < ApplicationController
3
+ def index
4
+ @search = Link.search(params[:search])
5
+ @attachments = @search.paginate(:page => params[:page])
6
+ end
7
+
8
+ def new
9
+ @attachment = Link.new
10
+ #UserSession.log("Admin::AttachmentController#new params=#{params[:admin_attachment].inspect}, @attachment=#{@attachment.inspect}")
11
+ end
12
+
13
+ def create
14
+ ##UserSession.log("Admin::AttachmentController#create params=#{params[:admin_attachment].inspect}")
15
+ user = current_user ? {:created_by => current_user.id, :updated_by => current_user.id} : {}
16
+ Attachment.create(params[:usefull_attachment_attachment].deep_merge!(user)) if params[:usefull_attachment_attachment].present?
17
+ Avatar.create(params[:usefull_attachment_avatar].deep_merge!(user)) if params[:usefull_attachment_avatar].present?
18
+ Link.create(params[:usefull_attachment_link].deep_merge!(user)) if params[:usefull_attachment_link].present?
19
+ redirect_to :action => "index", :notice => t("created")
20
+ rescue => e
21
+ flash[:alert] = t("not_created", :message => e.message)
22
+ redirect_to :back
23
+ end
24
+
25
+ def download
26
+ @attachment = Link.find(params[:id])
27
+ respond_to do |format|
28
+ format.html do
29
+ raise FileMissing.new(:file => @attachment.link.path) unless File.exist?(@attachment.link.path)
30
+ send_file @attachment.link.path, :type => @attachment.link_content_type
31
+ end
32
+ end
33
+ rescue => e
34
+ flash[:alert] = t("not_downloaded", :message => e.message)
35
+ redirect_to :back
36
+ end
37
+
38
+ def destroy
39
+ @attachment = Link.find(params[:id])
40
+ @attachment.destroy
41
+
42
+ respond_to do |format|
43
+ format.html do
44
+ redirect_to :back, :notice => t("deleted")
45
+ end
46
+ format.xml { head :ok }
47
+ end
48
+
49
+ rescue => e
50
+ flash[:alert] = t("not_deleted", :message => e.message)
51
+ redirect_to :back
52
+ end
53
+
54
+ end
55
+
56
+
57
+
58
+ end
@@ -0,0 +1,80 @@
1
+ module UsefullAttachmentHelper
2
+
3
+ # Il builder per allegare un file all'interno di un form � definito in usefull_helpers/lib/UsefullHelpers::WgFormBuilder
4
+ # e si chiama #attachment_field. Non crea un ulteriore submit button, chiaramente.
5
+
6
+ # Creates a button to add new file to attachment system
7
+ # It can't be used inside a form.
8
+ def new_attachment_for(object, description = true)
9
+ #ToDo check the relation type and assure is UsefullAttachment::Link
10
+ if object.respond_to?(:attachments)
11
+ form_for object.attachments.new, :html => {:multipart => true}, :url => usefull_attachment_links_path do |f|
12
+ concat(f.hidden_field :attachmentable_type)
13
+ concat(f.hidden_field :attachmentable_id)
14
+ concat(f.file_field :link)
15
+ concat(f.text_field :description) if description
16
+ concat(f.submit)
17
+ end
18
+ end
19
+ end
20
+
21
+ def new_avatar_for(object)
22
+ if object.respond_to?(:avatar)
23
+ if object.avatar.blank?
24
+ form_for object.build_avatar, :html => {:multipart => true}, :url => usefull_attachment_links_path do |f|
25
+ concat(f.hidden_field :attachmentable_type)
26
+ concat(f.hidden_field :attachmentable_id)
27
+ concat(f.file_field :link)
28
+ concat(f.submit 'Avatar')
29
+ end
30
+ else
31
+ link_to 'Delete', usefull_attachment_link_path(object.avatar.id), :method => :delete, :confirm => " Are you sure you want to delete this avatar?"
32
+ end
33
+ end
34
+ end
35
+
36
+ #==Options
37
+ #
38
+ #- :full => true # visualizza tutte le opzioni (comprese link_file_size e link_file_updated_at)
39
+ #- :hide_delete => conditions # se conditions == true nasconde il delete button
40
+ def list_attachments_for(object, *args)
41
+ options = args.extract_options!
42
+ if object.respond_to?(:attachments) && object.attachments.present?
43
+ table_for object.attachments.where(:id.ne => nil), :export => {:visible => false} do |t|
44
+ t.monitor
45
+ t.download :url => Proc.new {|object| download_usefull_attachment_link_path(object.id)}
46
+ t.destroy(:url => Proc.new {|object| usefull_attachment_link_path(object.id)}) unless options[:hide_delete] == true
47
+ t.col :link_file_name
48
+ t.col :description
49
+ t.col :link_file_size if options[:full]
50
+ t.col :link_file_updated_at if options[:full]
51
+ end
52
+ end
53
+ end
54
+
55
+
56
+ #Create a table to show attachments
57
+ # def list_attachments_for_old(object, full = false)
58
+ # if object.respond_to?(:attachments) && object.attachments.present?
59
+ # table_for object.attachments.where(:id.ne => nil), :export => {:visible => false} do |t|
60
+ # t.monitor
61
+ # t.download :url => Proc.new {|object| download_usefull_attachment_link_path(object.id)}
62
+ # t.destroy :url => Proc.new {|object| usefull_attachment_link_path(object.id)}
63
+ # t.col :link_file_name
64
+ # t.col :description
65
+ # t.col :link_file_size if full
66
+ # t.col :link_file_updated_at if full
67
+ # end
68
+ # end
69
+ # end
70
+
71
+ #Draw images marked as :avatar
72
+ def show_avatar_for(object, *args)
73
+ if object.respond_to?(:avatar) && object.avatar.present?
74
+ image_tag(object.avatar.link.url, :size => "200x200")
75
+ end
76
+ end
77
+
78
+
79
+ end
80
+
@@ -0,0 +1,182 @@
1
+ #Gestisce gli allegati dei documenti
2
+ #
3
+ #Salva i documenti in /mnt/Webgatec/<namespace>/<class>/id/file_name
4
+ # Per implementare nuove tipologie di attachments occorre ereditare da questa
5
+ # classe e ridefinire all'occorrenza i metodi get_path e get_url (privati)
6
+ # se occorre modificare gli styles e i processors occorre ridefinire anche
7
+ # has_attached_file nella classe figlia
8
+ #==Descrizione Campi
9
+ #- type => Nome della sottoclasse di Link che ha generato l'allegato
10
+ #- attachmentable_type => classe a cui collegato l'allegato
11
+ #- attachmentable_id => id della classa a cui collegato l'allegato
12
+ #
13
+ #N.B. Vengono tutti popolati in automatico da Rails
14
+ #
15
+ module UsefullAttachment
16
+ class Link < ActiveRecord::Base
17
+
18
+ acts_as_monitor
19
+
20
+ #before_validation :check
21
+ before_save :fill
22
+
23
+ #ToDo aggiungere il cambio permessi al postprocessore di default, che fa il ridemsionamento immagine
24
+ has_attached_file :link,
25
+ #:path => "/mnt/WebGatec/:type/:type_id/:filename",
26
+ :path => :get_path,
27
+ :url => :get_url,
28
+ #Nota: le options di :styles devono essere String altrimenti si pianta tutto
29
+ # quando si eredita da Link occorre specificare nuovi styles e processori ad hoc
30
+ :styles => {:import => "true"},
31
+ :processors => [:file_processor]
32
+
33
+ #validates_attachment_presence :link
34
+ #validates :link, :attachment_presence => true
35
+ validates :link_file_name, :presence => true
36
+
37
+ belongs_to :attachmentable, :polymorphic => true
38
+
39
+ # ==CLASS Methods
40
+ class<<self
41
+ # importa allegati attraversando rami di directory
42
+ # ogni path fatto cos: /mnt/WebGatec/namespace/model/id/filename.ext
43
+ #
44
+ def folders_to_records
45
+ Dir["/mnt/WebGatec/**/*"].each do |file|
46
+ if File.file?(file)
47
+ file_path_name = file.split("/")
48
+ file_name = file_path_name.pop
49
+ id = file_path_name.pop
50
+ modello = file_path_name.pop
51
+ name_space = file_path_name.pop
52
+ end
53
+
54
+ if is_num?(id) && !id.blank?
55
+ # try to build new record
56
+ # puts name_space + '::' + modello
57
+ begin
58
+ full_class_name = name_space.camelize + '::' + modello.camelize if !name_space.blank?
59
+ if class_defined?(full_class_name)
60
+ self.find_or_create_by_type_and_attachmentable_id_and_attachmentable_type(:description => 'prova',
61
+ :link_file_size => file.size,
62
+ :link_content_type => MIME::Types.type_for(file).first.content_type,
63
+ :link_file_name => File.basename(file),
64
+ :type => get_attachment_type(full_class_name),
65
+ :attachmentable_id => id,
66
+ :attachmentable_type => full_class_name)
67
+ end
68
+ puts "OK => #{name_space} #{modello} #{id} #{file_name}"
69
+ puts get_attachment_type(full_class_name)
70
+ rescue
71
+ puts "KO => #{name_space} #{modello} #{id} #{file_name}"
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ #Start Private Class Methods
78
+ private
79
+
80
+ def class_defined?(s)
81
+ begin
82
+ eval s.to_s
83
+ true
84
+ rescue NameError
85
+ false
86
+ end
87
+ end
88
+
89
+ def is_num?(str)
90
+ begin
91
+ !!Integer(str)
92
+ rescue ArgumentError, TypeError
93
+ false
94
+ end
95
+ end
96
+
97
+ def get_attachment_type(attach_type)
98
+ case attach_type
99
+ when 'Magazzino::Document'
100
+ return 'Documenti::Attachment'
101
+ when 'Magazzino::Limbo'
102
+ return 'Documenti::Attachment'
103
+ when 'Utility::PhoneQueue'
104
+ return 'Utility::PhoneQueueAttach'
105
+ when 'Interventi::Activity'
106
+ return 'Interventi::Attachment'
107
+ when 'Interventi::Import'
108
+ return 'Interventi::Attachment'
109
+ when 'Consuntivazioni::BillingCheck'
110
+ return 'Admin::Attachment'
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ #Importa il file nel modello dichiarato vedi Spreadsheet::Workbook#to_record
117
+ #* :model => passa la parent class della tabella per ha sempre la precedenza il nome del foglio di lavoro se un modello valido
118
+ #
119
+ #Nel caso il modello (attachmentable_type) sia anche una relazione procede ad inserire i record direttamente. (Vedi PhoneQueueAttach)
120
+ #==Note
121
+ #Passa a to_xls solo i mime-type compatibili
122
+ def to_record(*args)
123
+ if !link.blank? && self.link_content_type == "application/vnd.ms-excel"
124
+ options = args.extract_options!
125
+ options[:model] ||= self.attachmentable_type unless self.attachmentable_type == self.class.name
126
+ out = self.link.to_record(*(args << options))
127
+ #Verifico se il modello una collection, in caso affermativo lo inserisco automaticamente
128
+ association = find_association(options[:model])
129
+ return self.send(association.to_s + "=", out[options[:model]]) if association
130
+ return out
131
+ else
132
+ {}
133
+ end
134
+ end
135
+
136
+ def rename(new)
137
+ puts("rename new=#{new}")
138
+ unless self.link_file_name.nil?
139
+ path = self.link.path.split("/")
140
+ path.pop
141
+ File.rename(self.link.path, path.push(new).join("/")) if File.exist?(self.link.path)
142
+ self.link_file_name = new
143
+ end
144
+ end
145
+
146
+ def url
147
+ link.url
148
+ end
149
+
150
+ #Rename file after save if attachmentable provide an attachment_name method
151
+ def fill
152
+ to_call_name = "#{self.class.name.underscore.split("/").pop}_name"
153
+ #mylog("fill respond_to? = #{attachmentable.respond_to?(to_call_name, true)}")
154
+ rename(self.attachmentable.send(to_call_name, self.link_file_name, self.description)) if self.attachmentable.respond_to?(to_call_name, true)
155
+ end
156
+
157
+ # Controllo che il file che sto caricando non sia gi� stato caricato.
158
+ def check
159
+ raise UsefullAttachment::Links::FileDuplicate.new(:file => self.link_file_name) if File.exists?(self.link.path)
160
+ end
161
+
162
+ def get_path
163
+ "/mnt/WebGatec/:type/:type_id/:base_name.:extension"
164
+ end
165
+
166
+ def get_url
167
+ get_path
168
+ end
169
+
170
+ def error_missing?
171
+ !File.exists?(self.link.path)
172
+ end
173
+
174
+ #Gli viene passato un modello e restituisce il nome dell'association relativa se esiste
175
+ def find_association(model)
176
+ association = nil
177
+ self.class.reflections.each {|k,v| association = k if v.class_name == model}
178
+ association
179
+ end
180
+
181
+ end
182
+ end
@@ -0,0 +1,30 @@
1
+ <%= filter_for @search, :html => {:class => 'usefull_filter_container span-24'}, :url => usefull_attachment_links_path do |f| %>
2
+ <%= f.text_field :attachmentable_type %>
3
+ <%= f.text_field :attachmentable_id %>
4
+ <%= f.text_field :type %>
5
+ <%#= f.text_field :typology %>
6
+ <%= f.text_field :link_content_type %>
7
+ <%= f.text_field :link_file_name %>
8
+ <div class="span-22">
9
+ <%= f.submit %>
10
+ <% end %>
11
+
12
+ <%=table_for(@attachments,@search) do |t| %>
13
+ <% t.monitor %>
14
+ <% t.download :url => Proc.new {|object| download_usefull_attachment_link_path(object)} %>
15
+ <% t.destroy :url => Proc.new {|object| usefull_attachment_link_path(object)}, :link_options => {:confirm => 'Are you sure?', :method => :delete} %>
16
+ <% t.col :id %>
17
+ <% t.col :attachmentable_type %>
18
+ <% t.col :attachmentable_id %>
19
+ <% t.col :type %>
20
+ <% t.col :typology %>
21
+ <% t.col :description %>
22
+ <% t.col :link_file_name %>
23
+ <% t.col :link_file_size %>
24
+ <% t.col :updated_at, :data_type => :DateTime %>
25
+ <% t.col :link_content_type %>
26
+ <% t.col "createdby_displayname" %>
27
+ <% t.col "updatedby_displayname" %>
28
+ <% end %>
29
+
30
+ <%= link_to "New", new_usefull_attachment_link_path %>
@@ -0,0 +1,8 @@
1
+ <%= form_for @attachment, :url => usefull_attachment_links_path, :html => { :multipart => true } do |form| %>
2
+ Parent Class<%= form.text_field :attachmentable_type %>
3
+ Type<%= form.text_field :type %>
4
+ Description <%= form.text_field :description %>
5
+ file <%= form.file_field :link %>
6
+ Typology <%= form.text_field :typology %>
7
+ <%= form.submit %>
8
+ <% end %>
data/bin/permission.rb ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/ruby
2
+ #
3
+ #Cambia i permessi alle cartelle utilizzate da paperclip per evitare che file creati da console
4
+ #abbiano le permission root e non siano gestibili quindi dal web
5
+ enviroment = ARGV[0]
6
+ puts( `sudo chown git:git /mnt/WebGatec/ -R` ) if enviroment == "development" && `whoami`.strip == "root"
@@ -0,0 +1,89 @@
1
+ #require 'lib/paperclip_processors/excel_processor.rb'
2
+
3
+ #Paperclip Initializer
4
+
5
+ #Percorso di Convert
6
+ Paperclip.options[:command_path] = "/usr/bin/convert"
7
+ Paperclip.options[:whiny] = true
8
+
9
+ #Definisco dei simboli da utilizzare nel percorso del file
10
+ Paperclip.interpolates :type do |attachment, style|
11
+ #attachment.instance.attachmentable_type.blank? ? "default" : attachment.instance.attachmentable_type.underscore
12
+ attachment.instance.attachmentable_type.blank? ? attachment.instance.class.name.underscore : attachment.instance.attachmentable_type.underscore
13
+ end
14
+
15
+ Paperclip.interpolates :type_id do |attachment, style|
16
+ attachment.instance.attachmentable_id.blank? ? attachment.instance.id : attachment.instance.attachmentable_id
17
+ end
18
+
19
+ Paperclip.interpolates :base_name do |attachment, style|
20
+ fn = attachment.instance.link_file_name.split(".")
21
+ fn.pop
22
+ fn.join(".")
23
+ end
24
+
25
+ Paperclip.interpolates :extension do |attachment, style|
26
+ attachment.instance.link_file_name.split(".").pop
27
+ end
28
+
29
+ # Paperclip.configure do |c|
30
+ # c.register_processor :excel, Paperclip::ExcelProcessor
31
+ # end
32
+
33
+ module Paperclip
34
+ class Attachment
35
+ #Se uploaded_file � valorizzato (attachemtn non salvato) usa quello,
36
+ #altrimenti carica il file dal disco
37
+ def to_record(*args)
38
+ self.uploaded_file.blank? ? File.open(self.path).to_record(*args) : self.uploaded_file.to_record(*args)
39
+ end
40
+ end
41
+
42
+ class FileProcessor < Processor
43
+
44
+ def initialize file, options = {}, attachment = nil
45
+ @file = file
46
+ @options = options
47
+ @instance = attachment.instance
48
+ @styles = attachment.options[:styles]
49
+ @whiny = options[:whiny].nil? ? true : options[:whiny]
50
+ #Rails::logger.info("Paperclip::ExcelProcessor#initialize options=#{options.inspect}, attachment=#{attachment.inspect}")
51
+ #Rails::logger.info("Paperclip::ExcelProcessor#initialize STYLES=#{@styles.inspect}, INSTANCE=#{@instance.inspect}")
52
+ #UserSession.log("Paperclip#make @attachment=#{attachment.inspect}")
53
+ end
54
+
55
+ def make
56
+ begin
57
+ #UserSession.log("Paperclip#make @options=#{@options.inspect}")
58
+ #UserSession.log("Paperclip#make @file=#{@file.inspect}")
59
+ #UserSession.log("Paperclip#make @instance=#{@instance.inspect}")
60
+ Rails::logger.info("Paperclip user: #{`whoami`}")
61
+ Rails::logger.info("Paperclip file: #{file.inspect}")
62
+ file = File.join(UsefullAttachment::Engine.root, "bin/permission.rb")
63
+ status = `#{file}`
64
+ #Rails::logger.info("Paperclip::ExcelProcessor#make user=#{`whoami`.strip}")
65
+ #UserSession.log("Paperclip#make status=#{status.inspect}")
66
+ # # new record, set contents attribute by reading the attachment file
67
+ # if(@instance.new_record?)
68
+ # @file.rewind # move pointer back to start of file in case handled by other processors
69
+ # file_content = File.read(@file.path)
70
+ # @instance.send("#{@options[:contents]}=", file_content)
71
+ # else
72
+ # # existing record, set contents by reading contents attribute
73
+ # file_content = @instance.send(@options[:contents])
74
+ # # create new file with contents from model
75
+ # tmp = Tempfile.new([@basename, @current_format].compact.join("."))
76
+ # tmp << file_content
77
+ # tmp.flush
78
+ # @file = tmp
79
+ #end
80
+
81
+ @file
82
+ rescue StandardError => e
83
+ raise PaperclipError, "There was an error processing the file contents for #{@basename} - #{e}" if @whiny
84
+ end
85
+ end
86
+ end
87
+
88
+ end
89
+
@@ -0,0 +1,4 @@
1
+ it:
2
+ UsefullAttachment:
3
+ Links:
4
+ FileDuplicate: "Il file '%{file}' è già stato caricato!"
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ Rails.application.routes.draw do
2
+ namespace :usefull_attachment do
3
+ resources :links do
4
+ get "download", :on => :member
5
+ end
6
+ end
7
+ end
8
+
9
+
@@ -0,0 +1,17 @@
1
+ require 'rails/generators'
2
+ module UsefullAttachment
3
+ class InstallGenerator < Rails::Generators::Base
4
+ desc "Install generator for UsefullAttachment gem"
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ def copy_config
8
+ directory "."
9
+ end
10
+
11
+ #def copy_public
12
+ # directory "public"
13
+ #end
14
+
15
+ end
16
+ end
17
+
@@ -0,0 +1,40 @@
1
+ #Will Paginate gem Locales
2
+
3
+ it:
4
+ will_paginate:
5
+ previous_label: Precedente
6
+ next_label: Successiva
7
+ page_gap: "..."
8
+ page_entries_info:
9
+ single_page:
10
+ zero: "Nessun %{model} trovato"
11
+ one: "Visualizza 1 %{model}"
12
+ other: "Visualizza tutti e %{count} gli %{model}"
13
+ single_page_html:
14
+ zero: "Nessun %{model} trovato"
15
+ one: "Visualizza 1 %{model}"
16
+ other: "Visualizza tutti e %{count} gli %{model}"
17
+ #multi_page: "Displaying %{plural} %{from} - %{to} of %{total} in total"
18
+ multi_page: "Visualizza %{model} dal %{from} al %{to} di %{count} "
19
+ #multi_page_html: "Displaying %{plural} <b class='range'>%{from}&nbsp;-&nbsp;%{to}</b> of <b class='total'>%{total}</b> in total"
20
+ multi_page_html: "Visualizza %{model} dal %{from} al %{to} di %{count} "
21
+
22
+ activerecord:
23
+ models:
24
+ usefull_attachment:
25
+ link:
26
+ one: Allegato
27
+ other: Allegati
28
+ attributes:
29
+ usefull_attachment:
30
+ link:
31
+ attachmentable_type: "Classe Proprietaria"
32
+ attachmentable_id: "Id Proprietario"
33
+ type: "Tipo"
34
+ description: "Descrizione"
35
+ file_file_name: "File"
36
+ file_file_size: "Kb"
37
+ updated_at: "Modificato"
38
+ file_content_type: "Mime-Type"
39
+ file_updated_at: "Modificato"
40
+
@@ -0,0 +1,29 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+
4
+ module UsefullAttachment
5
+ class MigrationGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+ desc "Migration generator for UsefullAttachment gem"
8
+ source_root File.expand_path("../templates", __FILE__)
9
+
10
+ def self.next_migration_number(path)
11
+ unless @prev_migration_nr
12
+ @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
13
+ else
14
+ @prev_migration_nr += 1
15
+ end
16
+ @prev_migration_nr.to_s
17
+ end
18
+
19
+
20
+ def copy_migration
21
+ migration_template "create_migration_template.rb", "db/migrate/usefull_attachment_create_links.rb"
22
+ end
23
+
24
+ #def copy_public
25
+ # directory "public"
26
+ #end
27
+
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ class UsefullAttachmentCreateLinks < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :usefull_attachment_links do |t|
4
+
5
+ t.string :description
6
+ t.string :typology
7
+
8
+ t.has_attached_file :link
9
+
10
+ t.integer :created_by
11
+ t.integer :updated_by
12
+ t.timestamps
13
+ t.string :type
14
+ t.integer :attachmentable_id
15
+ t.string :attachmentable_type, :limit => 100, :null => false
16
+
17
+ end
18
+ end
19
+
20
+ def self.down
21
+ drop_table :usefull_attachment_links
22
+ end
23
+
24
+ end
@@ -0,0 +1,9 @@
1
+ module UsefullAttachment
2
+ def self.table_name_prefix
3
+ 'usefull_attachment_'
4
+ end
5
+ end
6
+
7
+ require "usefull_attachment/engine"
8
+ require "usefull_attachment/exceptions"
9
+ require "usefull_attachment/paperclip"
@@ -0,0 +1,19 @@
1
+ module UsefullAttachment
2
+ class Engine < Rails::Engine
3
+
4
+ config.autoload_paths += Dir["#{config.root}/lib/**/"]
5
+
6
+ initializer 'usefull_attachment.helper' do |app|
7
+ ActiveSupport.on_load(:action_controller) do
8
+ include UsefullAttachmentHelper
9
+ end
10
+ ActiveSupport.on_load(:action_view) do
11
+ include UsefullAttachmentHelper
12
+ end
13
+
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ #Add ere require to specific file or gem used
@@ -0,0 +1,21 @@
1
+ #Localize messages in it.CustomError.MyError
2
+ module UsefullAttachment
3
+
4
+ class CustomError < StandardError
5
+ def initialize(*args)
6
+ @options = args.extract_options!
7
+ super
8
+ end
9
+
10
+ def message
11
+ @options.merge!({:default => "Error : #{@options.inspect}"})
12
+ I18n.t("#{self.class.name.gsub(/::/,'.')}", @options )
13
+ end
14
+ end
15
+
16
+ module Links
17
+ class FileDuplicate < CustomError ; end
18
+ #class MyError < CustomError; end
19
+ end
20
+
21
+ end
@@ -0,0 +1,41 @@
1
+ require "paperclip"
2
+ module Paperclip
3
+ module Storage
4
+ module Filesystem
5
+
6
+ # Patch alla cancellazione di Paperclip che tenta di cancellare tutto quello che pu� finch� non fallisce la cancellazione
7
+ # a livello di sistema operativo, tale modalit� di cancellazione per� crea problemi con le share su Alfresco montate
8
+ # tramite CIFS.
9
+ def flush_deletes #:nodoc:
10
+ @queued_for_delete.each do |path|
11
+ begin
12
+ log("deleting #{path}")
13
+ FileUtils.rm(path) if File.exist?(path)
14
+ rescue Errno::ENOENT => e
15
+ # ignore file-not-found, let everything else pass
16
+ end
17
+ begin
18
+ # Per controllare se la cartella � vuota verifico il numero di elementi al suo interno e gli tolgo i 2 file "di
19
+ # servizio" di Alfresco, ossia "__Forza-Versione.exe" e "__Mostra-Dettagli.exe" presenti in ogni cartella esposta
20
+ # da Alfresco tramite CIFS. Gli tolgo inoltre le/i cartelle/riferimenti del sistema operativo "." e "..". Se il
21
+ # numero che cos� ottengo � minore o uguale a 0 significa che la cartella era vuota: il numero potrebbe essere
22
+ # negativo perch� WebGATeC non � sempre montato su Alfresco, per cui a volte mi trovo a togliere anche 2 elementi
23
+ # che in realt� non c'erano e che quindi non serviva togliere.
24
+ tmp_dir = File.dirname(path)
25
+ while( Dir.entries(tmp_dir).size - 2 - 2 <= 0 )
26
+ FileUtils.rmdir(tmp_dir)
27
+ tmp_dir = File.dirname(tmp_dir)
28
+ end
29
+ rescue Errno::EEXIST, Errno::ENOTEMPTY, Errno::ENOENT, Errno::EINVAL, Errno::ENOTDIR, Errno::EACCES
30
+ # Stop trying to remove parent directories
31
+ rescue SystemCallError => e
32
+ log("There was an unexpected error while deleting directories: #{e.class}")
33
+ # Ignore it
34
+ end
35
+ end
36
+ @queued_for_delete = []
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+ module UsefullAttachment
2
+ VERSION = "1.0.0"
3
+ end
4
+
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: usefull_attachment
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrea Bignozzi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2013-10-24 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ type: :runtime
16
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: 3.0.15
21
+ name: rails
22
+ prerelease: false
23
+ requirement: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ type: :runtime
26
+ version_requirements: &id002 !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - &id003
29
+ - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: "0"
32
+ name: acts_as_monitor
33
+ prerelease: false
34
+ requirement: *id002
35
+ - !ruby/object:Gem::Dependency
36
+ type: :runtime
37
+ version_requirements: &id004 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - *id003
40
+ name: paperclip
41
+ prerelease: false
42
+ requirement: *id004
43
+ - !ruby/object:Gem::Dependency
44
+ type: :runtime
45
+ version_requirements: &id005 !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - *id003
48
+ name: usefull_filter
49
+ prerelease: false
50
+ requirement: *id005
51
+ - !ruby/object:Gem::Dependency
52
+ type: :runtime
53
+ version_requirements: &id006 !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - *id003
56
+ name: usefull_table
57
+ prerelease: false
58
+ requirement: *id006
59
+ - !ruby/object:Gem::Dependency
60
+ type: :runtime
61
+ version_requirements: &id007 !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - *id003
64
+ name: will_paginate
65
+ prerelease: false
66
+ requirement: *id007
67
+ description: Describe Gem Here
68
+ email:
69
+ - skylord73@gmail.com
70
+ executables:
71
+ - permission.rb
72
+ extensions: []
73
+
74
+ extra_rdoc_files: []
75
+
76
+ files:
77
+ - app/controllers/usefull_attachment/links_controller.rb
78
+ - app/helpers/usefull_attachment_helper.rb
79
+ - app/models/usefull_attachment/link.rb
80
+ - app/views/usefull_attachment/links/index.html.erb
81
+ - app/views/usefull_attachment/links/new.html.erb
82
+ - lib/generators/usefull_attachment/install/install_generator.rb
83
+ - lib/generators/usefull_attachment/install/templates/config/locales/usefull_attachment.it.yml
84
+ - lib/generators/usefull_attachment/migration/migration_generator.rb
85
+ - lib/generators/usefull_attachment/migration/templates/create_migration_template.rb
86
+ - lib/usefull_attachment/engine.rb
87
+ - lib/usefull_attachment/exceptions.rb
88
+ - lib/usefull_attachment/paperclip.rb
89
+ - lib/usefull_attachment/version.rb
90
+ - lib/usefull_attachment.rb
91
+ - config/initializers/paperclip.rb
92
+ - config/locales/custom_errors.it.yml
93
+ - config/routes.rb
94
+ - bin/permission.rb
95
+ - MIT-LICENSE
96
+ - Rakefile
97
+ - Gemfile
98
+ - README.md
99
+ - CHANGELOG.md
100
+ homepage:
101
+ licenses: []
102
+
103
+ metadata: {}
104
+
105
+ post_install_message:
106
+ rdoc_options: []
107
+
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - *id003
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - *id003
116
+ requirements: []
117
+
118
+ rubyforge_project:
119
+ rubygems_version: 2.0.10
120
+ signing_key:
121
+ specification_version: 4
122
+ summary: Describe Gem Here
123
+ test_files: []
124
+