kono_utils 0.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +442 -0
- data/Rakefile +23 -0
- data/app/assets/javascripts/kono_utils/utilities.coffee +456 -0
- data/app/assets/stylesheets/kono_utils/utils.css.scss +43 -0
- data/app/controllers/kono_utils/change_log_controller.rb +6 -0
- data/app/input/bs_aceeditor_input.rb +53 -0
- data/app/input/bs_autocomplete_input.rb +60 -0
- data/app/input/bs_datepicker_input.rb +16 -0
- data/app/input/bs_datetimepicker_input.rb +80 -0
- data/app/input/bs_file_download_input.rb +35 -0
- data/app/input/bs_image_input.rb +35 -0
- data/app/input/bs_label_with_container_input.rb +22 -0
- data/app/input/bs_location_picker_input.rb +95 -0
- data/app/input/bs_readonly_input.rb +52 -0
- data/app/input/bs_timepicker_input.rb +14 -0
- data/app/policies/kono_utils/base_editing_policy_concern.rb +27 -0
- data/app/views/kono_utils/base_editing/_edit.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_edit_page_side_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_edit_page_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_form.html.erb +15 -0
- data/app/views/kono_utils/base_editing/_index_buttons.html.erb +2 -0
- data/app/views/kono_utils/base_editing/_index_page_side_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_index_page_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_index_tfoot.html.erb +0 -0
- data/app/views/kono_utils/base_editing/_new.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_new_page_side_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_new_page_title_header.html.erb +3 -0
- data/app/views/kono_utils/base_editing/_search_form.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_edit_page_side_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_edit_page_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_index_page_side_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_index_page_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_new_page_side_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/_new_page_title_header.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/edit.html.erb +1 -0
- data/app/views/kono_utils/base_editing/application/new.html.erb +1 -0
- data/app/views/kono_utils/base_editing/edit.html.erb +1 -0
- data/app/views/kono_utils/base_editing/index.html.erb +36 -0
- data/app/views/kono_utils/base_editing/new.html.erb +1 -0
- data/app/views/kono_utils/change_log/index.html.erb +3 -0
- data/config/initializers/mysql.rb +12 -0
- data/config/initializers/time.rb +12 -0
- data/config/locales/it.yml +18 -0
- data/lib/generators/kono_utils/install/install_generator.rb +24 -0
- data/lib/generators/templates/initializer.rb +3 -0
- data/lib/kono_utils.rb +41 -0
- data/lib/kono_utils/application_helper.rb +625 -0
- data/lib/kono_utils/base_editing_helper.rb +194 -0
- data/lib/kono_utils/base_search.rb +173 -0
- data/lib/kono_utils/concerns.rb +10 -0
- data/lib/kono_utils/concerns/active_record_translation.rb +47 -0
- data/lib/kono_utils/concerns/base_editing.rb +195 -0
- data/lib/kono_utils/concerns/base_modals.rb +97 -0
- data/lib/kono_utils/concerns/success_message.rb +25 -0
- data/lib/kono_utils/encoder.rb +55 -0
- data/lib/kono_utils/engine.rb +13 -0
- data/lib/kono_utils/fiscal_code.rb +47 -0
- data/lib/kono_utils/params_hash_array.rb +37 -0
- data/lib/kono_utils/percentage.rb +60 -0
- data/lib/kono_utils/search_attribute.rb +57 -0
- data/lib/kono_utils/tmp_file.rb +81 -0
- data/lib/kono_utils/version.rb +3 -0
- data/lib/kono_utils/virtual_model.rb +22 -0
- data/lib/tasks/kono_utils_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +32 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/lib/kono_utils/fiscal_code_spec.rb +56 -0
- data/spec/rails_helper.rb +53 -0
- data/spec/spec_helper.rb +92 -0
- data/vendor/assets/javascripts/EventEmitter.js +473 -0
- metadata +425 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
module KonoUtils::Concerns
|
|
3
|
+
module BaseModals
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
def create
|
|
7
|
+
authorize @obj if defined? Pundit
|
|
8
|
+
save_response
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def destroy
|
|
12
|
+
authorize @obj if defined? Pundit
|
|
13
|
+
@obj.destroy
|
|
14
|
+
respond_to do |f|
|
|
15
|
+
f.json { render json: {success: true} }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def update
|
|
21
|
+
authorize @obj if defined? Pundit
|
|
22
|
+
@obj.assign_attributes(update_params)
|
|
23
|
+
save_response
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
included do
|
|
27
|
+
before_action :load_parent_assoc
|
|
28
|
+
before_action :load_obj, :only => [:destroy, :update]
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
##
|
|
32
|
+
# Metodo promemoria per caricare il modello padre
|
|
33
|
+
def load_parent_assoc
|
|
34
|
+
@parent_model = nil
|
|
35
|
+
raise 'Sovrascrivi funzione "load_parent_assoc" nei figli la definizione di questa variabile: @parent_model'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
##
|
|
39
|
+
# Metodo promemoria per caricare l'oggetto dell'aggiornamento
|
|
40
|
+
# ES:
|
|
41
|
+
# @obj = @person.person_contacts.find(params[:id])
|
|
42
|
+
def load_obj
|
|
43
|
+
@obj=nil
|
|
44
|
+
raise 'Sovrascrivi funzione "load_obj" in figli la definizione di questa variabile: @obj'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
# Metodo promemoria per pulire i parametri
|
|
49
|
+
# ES:
|
|
50
|
+
# params.require(:person_contact).permit(:contacttype_id, :contact)
|
|
51
|
+
def update_params
|
|
52
|
+
raise 'Sovrascrivi in figli'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def render_part_to_json(partial, locals, status=200)
|
|
57
|
+
render json: {
|
|
58
|
+
partial: (
|
|
59
|
+
render_to_string(
|
|
60
|
+
:partial => partial,
|
|
61
|
+
:layout => false, :locals => locals)
|
|
62
|
+
)
|
|
63
|
+
}, status: status
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def save_response
|
|
67
|
+
raise "Sovrascrivere:
|
|
68
|
+
def save_response
|
|
69
|
+
respond_to do |f|
|
|
70
|
+
if @obj.valid?
|
|
71
|
+
@obj.save
|
|
72
|
+
f.json do
|
|
73
|
+
render_part_to_json('tikal_core/people/person_contacts/panel.html', {:contact => @obj})
|
|
74
|
+
end
|
|
75
|
+
else
|
|
76
|
+
f.json do
|
|
77
|
+
render_part_to_json('tikal_core/people/person_contacts/modal_form.html', {:contact => @obj, :id => ''}, 400)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
ed aggiungere se non già fatto:
|
|
84
|
+
def create
|
|
85
|
+
@obj = @person.person_contacts.build(update_params)
|
|
86
|
+
super
|
|
87
|
+
end
|
|
88
|
+
def update_params
|
|
89
|
+
params.require(:person_contact).permit(:contacttype_id, :contact)
|
|
90
|
+
end
|
|
91
|
+
"
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
module KonoUtils::Concerns
|
|
3
|
+
module SuccessMessage
|
|
4
|
+
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
private
|
|
9
|
+
def success_create_message(model)
|
|
10
|
+
t('activerecord.successful.messages.created', :model => model.mn)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def success_update_message(model)
|
|
14
|
+
t('activerecord.successful.messages.updated', :model => model.mn)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def success_destroy_message(model)
|
|
18
|
+
t('activerecord.successful.messages.destroyed', :model => model.mn)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module KonoUtils
|
|
2
|
+
##
|
|
3
|
+
# Classe che si occupa di decodificare una qualsiasi stringa in formato utf8,
|
|
4
|
+
# cercando di trovare l'encoding iniziale a tentativi.
|
|
5
|
+
class Encoder
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
attr_accessor :string
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# * *Attributes* :
|
|
13
|
+
# - string -> Stringa da elaborare
|
|
14
|
+
def initialize(string)
|
|
15
|
+
self.string = string
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# Funcione di rimozione del carattere BOM http://en.wikipedia.org/wiki/Byte_order_mark
|
|
21
|
+
# e encoding normale
|
|
22
|
+
def remove_bom
|
|
23
|
+
string_encoder.gsub("\xEF\xBB\xBF".force_encoding("UTF-8"), '')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Funzione di encoding semplice
|
|
28
|
+
def string_encoder
|
|
29
|
+
return self.string if self.string.valid_encoding?
|
|
30
|
+
str = self.string
|
|
31
|
+
Encoding.list.each do |e|
|
|
32
|
+
begin
|
|
33
|
+
str.force_encoding(e.name)
|
|
34
|
+
tmp_string = str.encode("UTF-8")
|
|
35
|
+
return tmp_string if tmp_string.valid_encoding?
|
|
36
|
+
rescue
|
|
37
|
+
logger.debug { "Rescue -> #{e.name}" }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
impossible_encoding
|
|
42
|
+
|
|
43
|
+
self.string
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Metodo placeholder, volendo si può estendere la funzione e sovrascrivere questa funzione
|
|
48
|
+
# per essere notificati in caso di mancata decodifica
|
|
49
|
+
def impossible_encoding
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module KonoUtils
|
|
2
|
+
class Engine < ::Rails::Engine
|
|
3
|
+
|
|
4
|
+
require 'bootstrap3-datetimepicker-rails'
|
|
5
|
+
require 'momentjs-rails'
|
|
6
|
+
require 'font-awesome-rails'
|
|
7
|
+
require 'rails-assets-bootstrap-treeview'
|
|
8
|
+
require 'will_paginate'
|
|
9
|
+
require 'will_paginate-bootstrap'
|
|
10
|
+
require 'rdiscount'
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module KonoUtils
|
|
2
|
+
module FiscalCode
|
|
3
|
+
class ControllaCF
|
|
4
|
+
LT = [[1, '0'], [0, '1'], [5, '2'], [7, '3'], [9, '4'], [13, '5'], [15, '6'], [17, '7'], [19, '8'], [21, '9'], [1, 'A'], [0, 'B'], [5, 'C'], [7, 'D'], [9, 'E'], [13, 'F'], [15, 'G'], [17, 'H'], [19, 'I'], [21, 'J'], [2, 'K'], [4, 'L'], [18, 'M'], [20, 'N'], [11, 'O'], [3, 'P'], [6, 'Q'], [8, 'R'], [12, 'S'], [14, 'T'], [16, 'U'], [10, 'V'], [22, 'W'], [25, 'X'], [24, 'Y'], [23, 'Z']]
|
|
5
|
+
Z9 = ('0'..'9').to_a
|
|
6
|
+
AZ = ('A'..'Z').to_a
|
|
7
|
+
class EmptyString < Exception;
|
|
8
|
+
end
|
|
9
|
+
class InvalidLength < Exception;
|
|
10
|
+
end
|
|
11
|
+
class CaseError < Exception;
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.valid?(cf, strict = false)
|
|
15
|
+
cf = cf.to_s
|
|
16
|
+
raise EmptyString.new("codice fiscale non può essere lasciato in bianco") if cf.empty?
|
|
17
|
+
raise InvalidLength.new("codice fiscale dev'essere composto da 16 caratteri alfanumerici") if cf.size != 16
|
|
18
|
+
if strict==true && cf != cf.upcase;
|
|
19
|
+
raise CaseError.new("i caratteri del codice fiscale devono essere maiuscoli");
|
|
20
|
+
else
|
|
21
|
+
cf.upcase!
|
|
22
|
+
end;
|
|
23
|
+
s = (0..14).collect { |i| (i&1)!=0 ? ([Z9.include?(cf[i, 1]) ? cf[i, 1].to_i : AZ.index(cf[i, 1]), cf[i, 1]]) : LT.rassoc(cf[i, 1]) }
|
|
24
|
+
s.include?(nil) ? false : AZ.at((s.transpose[0].inject(0) { |t, n| t+n })%26) == cf[-1, 1]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class ControllaPI
|
|
31
|
+
NU = ('0'..'9').to_a
|
|
32
|
+
class EmptyString < Exception;
|
|
33
|
+
end
|
|
34
|
+
class InvalidLength < Exception;
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.valid?(pi)
|
|
38
|
+
pi = pi.to_s
|
|
39
|
+
raise EmptyString.new("partita iva non può essere lasciata in bianco") if pi.empty?
|
|
40
|
+
raise InvalidLength.new("partita iva dev'essere composta da 11 cifre") if pi.size != 11
|
|
41
|
+
s = (0..9).collect { |i| NU.include?(pi[i, 1]) ? ((i&1)!=0 ? (pi[i, 1].to_i > 4 ? ((pi[i, 1].to_i*2) - 9) : pi[i, 1].to_i * 2) : pi[i, 1].to_i) : nil }
|
|
42
|
+
r = s.include?(nil) ? false : ((s.inject(0) { |t, n| t+n }) % 10)
|
|
43
|
+
r != false && (r==0 ? r : 10-r) == pi[-1, 1].to_i
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module KonoUtils
|
|
2
|
+
module ParamsHashArray
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
##
|
|
7
|
+
# Si occupa di trasformare un hash con elementi che sono chiramente array in un hash con elementi array:
|
|
8
|
+
#
|
|
9
|
+
# {"DatiOrdineAcquisto"=>{"0"=>{"RiferimentoNumeroLinea"=>{"0"=>""}, "IdDocumento"=>"", "Data"=>"", "NumItem"=>"", "CodiceCommessaConvenzione"=>"", "CodiceCUP"=>"", "CodiceCIG"=>""}}}
|
|
10
|
+
# {"DatiOrdineAcquisto"=>[{"RiferimentoNumeroLinea"=>[""], "IdDocumento"=>"", "Data"=>"", "NumItem"=>"", "CodiceCommessaConvenzione"=>"", "CodiceCUP"=>"", "CodiceCIG"=>""}]}
|
|
11
|
+
#
|
|
12
|
+
def elaborate_params_to_hash_array(params)
|
|
13
|
+
|
|
14
|
+
out = params
|
|
15
|
+
##Controllo se abbiamo solamente chiavi che rappresentano numeri
|
|
16
|
+
if params.is_a?(Hash)
|
|
17
|
+
|
|
18
|
+
if params.keys.select { |k| !(k.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true) }.length==0
|
|
19
|
+
out = []
|
|
20
|
+
params.each_value do |v|
|
|
21
|
+
out << elaborate_params_to_hash_array(v)
|
|
22
|
+
end
|
|
23
|
+
else
|
|
24
|
+
out={}
|
|
25
|
+
params.keys.each do |k|
|
|
26
|
+
out[k.to_sym] = elaborate_params_to_hash_array(params[k])
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Rails.logger.debug "DEBUG #{out.inspect}"
|
|
32
|
+
out
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'action_view'
|
|
2
|
+
module KonoUtils
|
|
3
|
+
##
|
|
4
|
+
# Classe che si occupa di rappresentare un numero percentuale
|
|
5
|
+
# ES:
|
|
6
|
+
# p = Percentage.new(100,20)
|
|
7
|
+
# p.percentage -> ritorna il valore percentuale float
|
|
8
|
+
# p.to_i -> ritorna percentuale intera con relativi arrotondamenti
|
|
9
|
+
# p.to_percentage -> si comporta come l'helper number_to_percentage
|
|
10
|
+
class Percentage
|
|
11
|
+
|
|
12
|
+
include ActionView::Helpers::NumberHelper
|
|
13
|
+
|
|
14
|
+
attr_accessor :total, :partial
|
|
15
|
+
|
|
16
|
+
def initialize(total=0, partial=0)
|
|
17
|
+
@total = total
|
|
18
|
+
@partial = partial
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
#
|
|
23
|
+
# * *Args* :
|
|
24
|
+
# - options -> Hash :
|
|
25
|
+
# :locale - Sets the locale to be used for formatting (defaults to current locale).
|
|
26
|
+
#
|
|
27
|
+
# :precision - Sets the precision of the number (defaults to 3).
|
|
28
|
+
#
|
|
29
|
+
# :significant - If true, precision will be the # of significant_digits. If false, the # of fractional digits (defaults to false).
|
|
30
|
+
#
|
|
31
|
+
# :separator - Sets the separator between the fractional and integer digits (defaults to “.”).
|
|
32
|
+
#
|
|
33
|
+
# :delimiter - Sets the thousands delimiter (defaults to “”).
|
|
34
|
+
#
|
|
35
|
+
# :strip_insignificant_zeros - If true removes insignificant zeros after the decimal separator (defaults to false).
|
|
36
|
+
#
|
|
37
|
+
# :format - Specifies the format of the percentage string The number field is %n (defaults to “%n%”).
|
|
38
|
+
#
|
|
39
|
+
# :raise - If true, raises InvalidNumberError when the argument is invalid.
|
|
40
|
+
# * *Returns* :
|
|
41
|
+
# - String
|
|
42
|
+
#
|
|
43
|
+
def to_percentage(options = {})
|
|
44
|
+
number_to_percentage(percentage, options)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def percentage
|
|
48
|
+
return 0 if @partial==0
|
|
49
|
+
return 0 if @total<@partial
|
|
50
|
+
@partial.to_f/@total.to_f*100.0
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def to_i
|
|
54
|
+
return 100 if @total.to_s == @partial.to_s
|
|
55
|
+
percentage.to_i
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module KonoUtils
|
|
2
|
+
##
|
|
3
|
+
# Classe che mi rappresenta un attributo di ricerca
|
|
4
|
+
# Di default utilizza il tipo string come renderizzazione
|
|
5
|
+
#
|
|
6
|
+
# * *Args* :
|
|
7
|
+
# - form_options -> Hash con opzioni da passare a formtastic
|
|
8
|
+
# - field_options -> Hash con opzioni:
|
|
9
|
+
# cast -> Proc per eseguire il cast del valore
|
|
10
|
+
class SearchAttribute
|
|
11
|
+
|
|
12
|
+
attr_accessor :field, :form_options, :field_options
|
|
13
|
+
|
|
14
|
+
def initialize(field, options = {})
|
|
15
|
+
self.field = field
|
|
16
|
+
|
|
17
|
+
self.field_options = {}
|
|
18
|
+
unless options.is_a? Proc
|
|
19
|
+
if options[:field_options]
|
|
20
|
+
self.field_options = options[:field_options]
|
|
21
|
+
options.delete(:field_options)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
self.form_options = options
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
##
|
|
29
|
+
# Esegue un casting dei valori rispetto al tipo di campo da utilizzare per formtastic
|
|
30
|
+
def cast_value(value)
|
|
31
|
+
return value if value.blank?
|
|
32
|
+
return value if form_options.is_a? Proc
|
|
33
|
+
return field_options[:cast].call(value) if field_options[:cast].is_a? Proc
|
|
34
|
+
case form_options[:as]
|
|
35
|
+
when :bs_datetimepicker
|
|
36
|
+
if value.is_a? String
|
|
37
|
+
DateTime.parse(value)
|
|
38
|
+
elsif value.is_a? Date
|
|
39
|
+
value.to_time
|
|
40
|
+
else
|
|
41
|
+
value
|
|
42
|
+
end
|
|
43
|
+
when :bs_datepicker
|
|
44
|
+
if value.is_a? String
|
|
45
|
+
DateTime.parse(value).to_date
|
|
46
|
+
elsif value.is_a? DateTime
|
|
47
|
+
value.to_date
|
|
48
|
+
else
|
|
49
|
+
value
|
|
50
|
+
end
|
|
51
|
+
else
|
|
52
|
+
value
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
module KonoUtils
|
|
3
|
+
##
|
|
4
|
+
# Classe Funzionante prettamente con RAILS
|
|
5
|
+
# la classe si occupa dei files temporanei creando una cartella dentro a tmp del progetto
|
|
6
|
+
# crea una cartella random per ogni file per ovviare al problema di duplicazioni dei nomi
|
|
7
|
+
# Estende Tempfile,
|
|
8
|
+
# la root della struttura è quella di Rails.root
|
|
9
|
+
# e di default la classe scrive dentro a tmp
|
|
10
|
+
# non ha bisogno di essere cancellata, ci penserà in automatico la classe una
|
|
11
|
+
# la prossima volta che viene chiamata cancellando tutti i files con un TTL
|
|
12
|
+
# maggiore di 1.day di default
|
|
13
|
+
## Utilizzo:
|
|
14
|
+
# tmp = Ptmpfile.new('nomefile.ext')
|
|
15
|
+
# tmp.path -> path completa
|
|
16
|
+
# tmp.write.....
|
|
17
|
+
# tmp.original_filename.......
|
|
18
|
+
# tmp.unique_filename.......
|
|
19
|
+
#
|
|
20
|
+
#
|
|
21
|
+
class TmpFile < Tempfile
|
|
22
|
+
|
|
23
|
+
PATH = 'tmp/ptmpfile'
|
|
24
|
+
TIME_LIMIT = 1.day
|
|
25
|
+
attr_accessor :root_dir
|
|
26
|
+
attr_accessor :tmp_dir
|
|
27
|
+
attr_accessor :original_filename, :unique_filename
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
##
|
|
31
|
+
# Generate a new file with a given name
|
|
32
|
+
#
|
|
33
|
+
# * *Args* :
|
|
34
|
+
# - name -> String of the name file
|
|
35
|
+
# * *Returns* :
|
|
36
|
+
# - Tempfile
|
|
37
|
+
#
|
|
38
|
+
def initialize(name)
|
|
39
|
+
self.original_filename=name
|
|
40
|
+
self.root_dir = controll_root
|
|
41
|
+
clean_tmpdir
|
|
42
|
+
#creo una nuova cartella per il file attuale
|
|
43
|
+
self.tmp_dir= "#{self.root_dir.path}/#{Time.now.to_f}"
|
|
44
|
+
Dir.mkdir(self.tmp_dir)
|
|
45
|
+
ext =File.extname(name)
|
|
46
|
+
name = [File.basename(name), ext] unless ext.blank?
|
|
47
|
+
super(name, self.tmp_dir)
|
|
48
|
+
self.unique_filename= File.basename(self.path)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
##
|
|
55
|
+
# controll presence of root dir
|
|
56
|
+
# if not exists create it
|
|
57
|
+
# * *Returns* :
|
|
58
|
+
# - Dir
|
|
59
|
+
#
|
|
60
|
+
def controll_root
|
|
61
|
+
unless File.exist?(::Rails.root.join(PATH))
|
|
62
|
+
Dir.mkdir(::Rails.root.join(PATH))
|
|
63
|
+
end
|
|
64
|
+
Dir.open(::Rails.root.join(PATH))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
##
|
|
68
|
+
# Clean the directory
|
|
69
|
+
#
|
|
70
|
+
def clean_tmpdir
|
|
71
|
+
self.root_dir.each do |d|
|
|
72
|
+
if d != '..' and d!='.'
|
|
73
|
+
if d.to_i < Time.now.to_i-TIME_LIMIT
|
|
74
|
+
FileUtils.rm_rf(File.join(self.root_dir.path, d))
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
end
|