gdpr_rails 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +270 -13
  3. data/app/assets/javascripts/policy_manager/application.js +4 -0
  4. data/app/assets/javascripts/policy_manager/portability_requests.js +2 -0
  5. data/app/assets/javascripts/policy_manager/user_portability_requests.js +2 -0
  6. data/app/assets/stylesheets/policy_manager/portability_requests.css +4 -0
  7. data/app/assets/stylesheets/policy_manager/user_portability_requests.css +4 -0
  8. data/app/controllers/policy_manager/application_controller.rb +22 -0
  9. data/app/controllers/policy_manager/categories_controller.rb +5 -47
  10. data/app/controllers/policy_manager/portability_requests_controller.rb +34 -0
  11. data/app/controllers/policy_manager/terms_controller.rb +16 -13
  12. data/app/controllers/policy_manager/user_portability_requests_controller.rb +41 -0
  13. data/app/controllers/policy_manager/user_terms_controller.rb +68 -28
  14. data/app/helpers/policy_manager/application_helper.rb +28 -0
  15. data/app/helpers/policy_manager/portability_requests_helper.rb +4 -0
  16. data/app/helpers/policy_manager/scripts_helper.rb +11 -0
  17. data/app/helpers/policy_manager/terms_helper.rb +1 -1
  18. data/app/helpers/policy_manager/user_portability_requests_helper.rb +4 -0
  19. data/app/jobs/policy_manager/exporter_job.rb +10 -0
  20. data/app/mailers/policy_manager/application_mailer.rb +20 -2
  21. data/app/mailers/policy_manager/portability_mailer.rb +34 -0
  22. data/app/models/policy_manager/concerns/user_behavior.rb +80 -22
  23. data/app/models/policy_manager/portability_request.rb +65 -0
  24. data/app/models/policy_manager/term.rb +18 -0
  25. data/app/models/policy_manager/user_term.rb +14 -7
  26. data/app/views/layouts/policy_manager/application.html.erb +41 -39
  27. data/app/views/layouts/policy_manager/mailer.html.erb +13 -0
  28. data/app/views/layouts/policy_manager/mailer.text.erb +1 -0
  29. data/app/views/policy_manager/categories/index.html.erb +6 -12
  30. data/app/views/policy_manager/categories/show.html.erb +13 -20
  31. data/app/views/policy_manager/portability_mailer/completed_notification.erb +7 -0
  32. data/app/views/policy_manager/portability_mailer/progress_notification.erb +3 -0
  33. data/app/views/policy_manager/portability_requests/index.html.erb +42 -0
  34. data/app/views/policy_manager/portability_requests/index.json.jbuilder +5 -0
  35. data/app/views/policy_manager/terms/_form.html.erb +12 -11
  36. data/app/views/policy_manager/terms/edit.html.erb +6 -4
  37. data/app/views/policy_manager/terms/index.html.erb +12 -13
  38. data/app/views/policy_manager/terms/new.html.erb +5 -3
  39. data/app/views/policy_manager/terms/show.html.erb +12 -10
  40. data/app/views/policy_manager/user_portability_requests/index.html.erb +42 -0
  41. data/app/views/policy_manager/user_portability_requests/index.json.jbuilder +5 -0
  42. data/app/views/policy_manager/user_terms/pending.html.erb +10 -6
  43. data/app/views/policy_manager/user_terms/show.html.erb +7 -8
  44. data/app/views/policy_manager/user_terms/show.json.jbuilder +15 -8
  45. data/config/locales/en.yml +122 -0
  46. data/config/locales/es.yml +122 -0
  47. data/config/routes.rb +15 -6
  48. data/db/migrate/20180326193825_create_policy_manager_terms.rb +1 -0
  49. data/db/migrate/20180410171354_create_policy_manager_portability_requests.rb +18 -0
  50. data/lib/policy_manager/anonimizer.rb +18 -0
  51. data/lib/policy_manager/config.rb +35 -1
  52. data/lib/policy_manager/exporter/handler.rb +110 -0
  53. data/lib/policy_manager/exporter/paginator_renderer.rb +74 -0
  54. data/lib/policy_manager/exporter/view.rb +108 -0
  55. data/lib/policy_manager/exporter/zip_generator.rb +60 -0
  56. data/lib/policy_manager/exporter.rb +75 -0
  57. data/lib/policy_manager/portability_rule.rb +15 -0
  58. data/lib/policy_manager/rule.rb +21 -4
  59. data/lib/policy_manager/script.rb +56 -0
  60. data/lib/policy_manager/templates/index.html.erb +1 -0
  61. data/lib/policy_manager/version.rb +1 -1
  62. data/lib/policy_manager.rb +10 -0
  63. metadata +160 -19
  64. data/app/controllers/policy_manager/dashboard_controller.rb +0 -6
  65. data/app/helpers/policy_manager/categories_helper.rb +0 -4
  66. data/app/helpers/policy_manager/dashboard_helper.rb +0 -4
  67. data/app/helpers/policy_manager/terms_categories_helper.rb +0 -4
  68. data/app/views/policy_manager/categories/_form.html.erb +0 -22
  69. data/app/views/policy_manager/categories/edit.html.erb +0 -6
  70. data/app/views/policy_manager/categories/new.html.erb +0 -5
  71. data/app/views/policy_manager/dashboard/index.erb +0 -33
  72. data/app/views/policy_manager/terms_categories/_form.html.erb +0 -17
  73. data/app/views/policy_manager/terms_categories/edit.html.erb +0 -6
  74. data/app/views/policy_manager/terms_categories/index.html.erb +0 -24
  75. data/app/views/policy_manager/terms_categories/new.html.erb +0 -5
  76. data/app/views/policy_manager/terms_categories/show.html.erb +0 -4
  77. data/app/views/policy_manager/user_terms/_form.html.erb +0 -17
  78. data/app/views/policy_manager/user_terms/edit.html.erb +0 -6
  79. data/app/views/policy_manager/user_terms/index.html.erb +0 -24
  80. data/app/views/policy_manager/user_terms/new.html.erb +0 -5
@@ -0,0 +1,122 @@
1
+ es:
2
+ terms_app:
3
+ title: PolicyManager
4
+ sub_title: PolicyManager
5
+ sign_out: Salir
6
+ menu:
7
+ policies: Políticas
8
+ portability_requests: Solicitudes de portabilidad
9
+ user_portability_requests: Mis solicitudes de portabilidad
10
+ user_pending_policies: Mis políticas pendientes
11
+ misc:
12
+ back: Atras
13
+ edit: Editar
14
+ show: Ver
15
+ save: Guardar
16
+ download: Descargar
17
+ are_you_sure: ¿Estás seguro?
18
+ states:
19
+ draft: Borrador
20
+ published: Publicado
21
+ categories:
22
+ index:
23
+ title: Políticas
24
+ table:
25
+ name: Nombre
26
+ terms: Términos
27
+ show: Ver
28
+ show:
29
+ title: "Términos de política %{name}"
30
+ new: Nuevo término
31
+ table:
32
+ id: Id
33
+ content: Contenido
34
+ state: Estado
35
+ updated_at: Fecha de actualización
36
+ show: Ver
37
+ terms:
38
+ index:
39
+ title: Términos
40
+ button: Nuevo término
41
+ table:
42
+ description: Descripción
43
+ category: Politica
44
+ updated_at: Fecha de actualización
45
+ show: Ver
46
+ edit: Editar
47
+ destroy: Eliminar
48
+ new:
49
+ title: Nuevo término para %{name}
50
+ state: Estado
51
+ description: Descripción
52
+ button: Crear término
53
+ error: al guardar término
54
+ created: Término creado correctamente
55
+ updated: Término actualizado correctamente
56
+ destroyed: Término eliminado correctamente
57
+ edit:
58
+ title: Editar término %{name}
59
+ state: Estado
60
+ description: Descripción
61
+ error: al guardar término
62
+ show:
63
+ title: Término
64
+ last_update: Última actualización
65
+ table:
66
+ name: Nombre
67
+ terms: Términos
68
+ show: Ver
69
+ user_terms:
70
+ pending:
71
+ title: Mis politicas pendientes de aceptar
72
+ empty: No existen politicas por aceptar
73
+ show:
74
+ accepted:
75
+ message: Esta politica ya ha sido aceptada
76
+ question: ¿Deseas cambiar tu elección?
77
+ reject: Rechazar
78
+ not_now: No por ahora
79
+ pending:
80
+ message: por favor acepta esta politica
81
+ agree: Acepto
82
+ not_now: No por ahora
83
+ user_portability_requests:
84
+ index:
85
+ title: Mis solicitudes de portabilidad
86
+ empty: No existen solicitudes de portabilidad
87
+ table:
88
+ state: Estado
89
+ file: Archivo
90
+ created_at: Fecha de creación
91
+ destroy: Eliminar
92
+ button: Solicitar portabilidad
93
+ states:
94
+ pending: Pendiente
95
+ progress: En progreso
96
+ completed: Completado
97
+ has_pending: Tienes una solicitud de información pendiente, no puedes hacer otra aún
98
+ created: Petición de Datos Iniciada!
99
+ portability_requests:
100
+ index:
101
+ title: Solicitudes pendientes
102
+ destroyed: Solicitud eliminada exitosamente.
103
+ empty: No existen solicitudes por revisar
104
+ table:
105
+ user: Usuario
106
+ state: Estado
107
+ created_at: Fecha de creación
108
+ destroy: Eliminar
109
+ confirm: Confirmar
110
+ states:
111
+ pending: Pendiente
112
+ progress: En progreso
113
+ completed: Completado
114
+ mails:
115
+ progress:
116
+ subject: Tu información esta siendo descargada
117
+ completed:
118
+ subject: Tu información está disponible
119
+ will_paginate:
120
+ previous_label: "<"
121
+ next_label: ">"
122
+ page_gap: "…"
data/config/routes.rb CHANGED
@@ -1,12 +1,22 @@
1
1
  PolicyManager::Engine.routes.draw do
2
2
 
3
- resources :categories do
3
+ resources :user_portability_requests, only: [:index, :create, :destroy]
4
+
5
+ resources :portability_requests, only: [:index, :destroy] do
6
+ member do
7
+ get :confirm
8
+ end
9
+ end
10
+
11
+ resources :categories, only: [:show, :index] do
4
12
  resources :terms
5
13
  end
6
- resources :terms_categories
7
- resources :user_terms do
14
+
15
+ resources :user_terms, only: [:show] do
8
16
  collection do
9
17
  get :pending
18
+ put :accept_multiples
19
+ get :blocking_terms
10
20
  end
11
21
 
12
22
  member do
@@ -14,7 +24,6 @@ PolicyManager::Engine.routes.draw do
14
24
  put :reject
15
25
  end
16
26
  end
17
- #resources :terms
18
- root 'dashboard#index'
19
-
27
+
28
+ root 'categories#index'
20
29
  end
@@ -3,6 +3,7 @@ class CreatePolicyManagerTerms < ActiveRecord::Migration[5.1]
3
3
  create_table :policy_manager_terms do |t|
4
4
  t.text :description
5
5
  t.string :rule
6
+ t.string :state
6
7
  t.datetime :accepted_at
7
8
  t.datetime :rejected_at
8
9
  t.timestamps
@@ -0,0 +1,18 @@
1
+ class CreatePolicyManagerPortabilityRequests < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :policy_manager_portability_requests do |t|
4
+ #t.references :user, foreign_key: true
5
+ t.integer :user_id, index: true
6
+ t.string :state
7
+ t.string :attachment
8
+ t.string :attachment_file_name
9
+ t.string :attachment_file_size
10
+ t.datetime :attachment_content_type
11
+ t.string :attachment_file_content_type
12
+
13
+ t.datetime :expire_at
14
+
15
+ t.timestamps
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+
2
+ #c.anonimizer do |a|
3
+ # c.secret_key = "oeoeo123eoeo"
4
+ # c.encryptor = :sha512
5
+ # c.rule(on: User, fields: [:email])
6
+ #end
7
+
8
+
9
+ module PolicyManager
10
+ class Anonimizer
11
+ attr_accessor :secret_key, :encryptor, :rules
12
+
13
+ def initialize(opts={})
14
+ self.path = opts[:path]
15
+ end
16
+
17
+ end
18
+ end
@@ -1,19 +1,53 @@
1
1
  module PolicyManager
2
2
  class Config
3
3
 
4
+ mattr_accessor :exporter,
5
+ :from_email,
6
+ :is_admin_method,
7
+ :logout_url,
8
+ :user_language_method,
9
+ :scripts
10
+
4
11
  def self.setup
5
12
  @@rules = []
13
+ @@portability_rules = []
14
+ @@portability_templates = []
15
+ @@scripts = []
6
16
  yield self
7
17
  self
8
18
  end
9
19
 
20
+ def self.exporter=(opts)
21
+ @@exporter = Exporter.new(opts)
22
+ end
23
+
24
+ def self.is_admin?(user)
25
+ @@is_admin_method.call(user)
26
+ end
27
+
28
+ def self.user_language(user)
29
+ @@user_language_method.call(user) rescue :en
30
+ end
31
+
10
32
  def self.rules
11
- @@rules
33
+ @@rules ||= []
34
+ end
35
+
36
+ def self.portability_rules
37
+ @@portability_rules ||= []
12
38
  end
13
39
 
14
40
  def self.add_rule(opts={}, &block)
15
41
  @@rules << PolicyManager::Rule.new(opts, &block)
16
42
  end
17
43
 
44
+ def self.add_portability_rule(opts={}, &block)
45
+ @@portability_rules << PolicyManager::PortabilityRule.new(opts, &block)
46
+ end
47
+
48
+ def self.add_script(opts={}, &block)
49
+ @@scripts << PolicyManager::Script.new(opts, &block)
50
+ end
51
+
18
52
  end
19
53
  end
@@ -0,0 +1,110 @@
1
+ require "fileutils"
2
+ require 'zip'
3
+
4
+ module PolicyManager
5
+ class ExporterHandler
6
+ attr_accessor :resource, :path, :after_zip
7
+
8
+ def initialize(opts={})
9
+ self.path = opts[:path]
10
+ self.resource = opts[:resource]
11
+ self.after_zip = opts[:after_zip] if opts[:after_zip]
12
+ end
13
+
14
+ def base_path
15
+ self.path.join resource.id.to_s
16
+ end
17
+
18
+ def zip_path
19
+ "#{base_path}-out.zip"
20
+ end
21
+
22
+ def perform
23
+ FileUtils.mkdir_p(base_path)
24
+ create_sections
25
+ generate_zip
26
+ handle_zip_upload
27
+ after_zip.call(zip_path, resource)
28
+ clear!
29
+ end
30
+
31
+ def handle_zip_upload
32
+ resource
33
+ .portability_requests
34
+ .find_by(state: "progress")
35
+ .update_attributes(file_remote_url: zip_path)
36
+ end
37
+
38
+ def clear!
39
+ FileUtils.rm_rf(base_path)
40
+ FileUtils.rm_rf(zip_path)
41
+ end
42
+
43
+ def create_sections
44
+ PolicyManager::Config.portability_rules.each do |rule|
45
+ handle_render_for(rule)
46
+ end
47
+
48
+ render_index
49
+ puts "FOLDER CREATED AT #{base_path}"
50
+ end
51
+
52
+ def handle_render_for(rule)
53
+ if rule.member
54
+ render_member(rule)
55
+ end
56
+
57
+ if rule.collection
58
+ render_collection(rule)
59
+ end
60
+ end
61
+
62
+ def base_dir
63
+ end
64
+
65
+ def render_member(rule)
66
+ return unless resource.respond_to?(:portability_member_for)
67
+ o = resource.portability_member_for(rule)
68
+ base_dir = self.base_path.join(rule.name)
69
+ resource_path = base_dir.join("index.html")
70
+ FileUtils.mkdir_p(base_dir)
71
+ view = ExporterView.new({member: o}, {build_path: self.base_path, base_path: resource_path, template: rule.template, rule: rule})
72
+ puts "saving at #{self.path.join rule.name}"
73
+ view.save(resource_path )
74
+ end
75
+
76
+ def render_collection(rule)
77
+ return unless resource.respond_to?(:portability_collection_for)
78
+ o = resource.portability_collection_for(rule ,1)
79
+
80
+ (1..o.total_pages).to_a.each do |i|
81
+ o = resource.portability_collection_for(rule,i)
82
+ page_name = i #== 1 ? "index" : i
83
+ base_dir = self.base_path.join(rule.name)
84
+ base_dir = base_dir.join(page_name.to_s) unless page_name == 1
85
+ FileUtils.mkdir_p(base_dir)
86
+ resource_path = base_dir.join("index.html")
87
+ view = ExporterView.new({collection: o}, {build_path: self.base_path, base_path: resource_path, template: rule.template, rule: rule})
88
+ puts "saving at #{self.path.join rule.name}"
89
+ view.save( resource_path )
90
+ end
91
+ end
92
+
93
+ def render_index
94
+ resource_path = self.base_path.join("index.html")
95
+ template = PolicyManager::Config.exporter.index_template
96
+ view = ExporterView.new({collection: PolicyManager::Config.portability_rules},
97
+ {build_path: self.base_path, base_path: resource_path, template: template})
98
+ puts "saving at #{resource_path}"
99
+ view.save( resource_path )
100
+ end
101
+
102
+ def generate_zip
103
+ directory_to_zip = base_path.to_s
104
+ output_file = zip_path.to_s
105
+ zf = ZipGenerator.new(directory_to_zip, output_file)
106
+ zf.write()
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,74 @@
1
+ require "will_paginate"
2
+ require 'will_paginate/view_helpers/action_view'
3
+
4
+ module PolicyManager
5
+ class PaginatorRenderer < WillPaginate::ActionView::LinkRenderer
6
+ ELLIPSIS = '&hellip;'
7
+
8
+ def to_html
9
+ list_items = pagination.map do |item|
10
+ case item
11
+ when (1.class == Integer ? Integer : Fixnum)
12
+ page_number(item)
13
+ else
14
+ send(item)
15
+ end
16
+ end.join(@options[:link_separator])
17
+
18
+ list_wrapper = tag :nav, list_items, class: "pagination button-group"
19
+ tag :nav, list_wrapper
20
+ end
21
+
22
+ def container_attributes
23
+ super.except(*[:link_options])
24
+ end
25
+
26
+ protected
27
+
28
+ def page_number(page)
29
+ link_options = @options[:link_options] || {}
30
+
31
+ if page == current_page
32
+ tag(:a, page, class: 'btn page-item active', href: '')
33
+ else
34
+ tag(:a, page, href: page_path(page), class: 'page-link btn', rel: rel_value(page))
35
+ end
36
+ end
37
+
38
+ def page_path(page)
39
+ return "../index.html" if page == 1
40
+ if @collection.current_page == 1
41
+ return "./#{page}/index.html" if @collection.current_page < page
42
+ return "../#{page}/index.html" if @collection.current_page > page
43
+ else
44
+ return "../#{page}/index.html"
45
+ end
46
+ end
47
+
48
+ def previous_or_next_page(page, text, classname)
49
+ link_options = @options[:link_options] || {}
50
+ if page
51
+ link_wrapper = tag(:a, text || page, href: page_path(page), class: "page-link btn" + classname.to_s)
52
+ # link_wrapper, class: 'page-item '
53
+ else
54
+ tag(:a, text, href:'', class: 'page-link btn')
55
+ # span_wrapper, class: 'page-item disabled'
56
+ end
57
+ end
58
+
59
+ def gap
60
+ tag :p, tag(:i, ELLIPSIS, class: 'page-link'), class: 'page-item disabled btn'
61
+ end
62
+
63
+ def previous_page
64
+ num = @collection.current_page > 1 && @collection.current_page - 1
65
+ previous_or_next_page num, @options[:previous_label], 'previous btn'
66
+ end
67
+
68
+ def next_page
69
+ num = @collection.current_page < @collection.total_pages && @collection.current_page + 1
70
+ previous_or_next_page num, @options[:next_label], 'next btn'
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,108 @@
1
+ require "erb"
2
+ require 'open-uri'
3
+ require "tilt"
4
+ require "will_paginate"
5
+ require 'will_paginate/view_helpers'
6
+ require 'will_paginate/view_helpers/action_view'
7
+
8
+
9
+ module PolicyManager
10
+ class ExporterView
11
+
12
+ include ERB::Util
13
+ include ActionView::Helpers
14
+ include WillPaginate::ViewHelpers #if defined?(WillPaginate)
15
+ include WillPaginate::ActionView #if defined?(WillPaginate)
16
+
17
+ attr_accessor :template, :base_path
18
+
19
+ def self.template
20
+ "Welcome, <%= @name %>"
21
+ end
22
+
23
+ def initialize(vars={}, options={}, date=Time.now)
24
+ # collection or member, or wathever!?
25
+ vars.each{|k, v| self.instance_variable_set("@#{k}", v)}
26
+ @base_path = options[:base_path]
27
+ @build_path = options[:build_path]
28
+
29
+ index_path
30
+
31
+ @template = options.fetch(:template, self.class.template)
32
+
33
+ end
34
+
35
+ def index_path
36
+ path = @base_path.to_s.gsub(@build_path.to_s, "")
37
+ len = path.split("/").size
38
+ case len
39
+ when 2
40
+ @index_path = "./"
41
+ when 3
42
+ @index_path = "../"
43
+ when 4
44
+ @index_path = "../../"
45
+ else
46
+ @index_path = "../../"
47
+ end
48
+ end
49
+
50
+ def image_tag(remote_image, opts={})
51
+ begin
52
+ basename = File.basename(remote_image)
53
+ id = opts[:id] || SecureRandom.hex(10)
54
+ composed_name = [id, basename].compact.join("-")
55
+ path = "#{File.dirname(base_path)}/#{composed_name}"
56
+ self.save_image(remote_image, path)
57
+ tag(:img, {src: "./#{id}-#{File.basename(URI(remote_image).path)}" }.merge(opts))
58
+ rescue => e
59
+ Bugsnag.notify(e)
60
+ content_tag(:p, "broken image")
61
+ end
62
+ end
63
+
64
+ def save_image(remote_image, path)
65
+ open(URI(path).path, 'wb') do |file|
66
+ file << open(remote_image).read
67
+ end
68
+ end
69
+
70
+ def render()
71
+ #template_layout = Tilt::ERBTemplate.new {PolicyManager::Config.exporter.layout}
72
+ context = self
73
+ #template_layout.render {
74
+ # view = Tilt::ERBTemplate.new{handled_template}
75
+ # view.render(context)
76
+ #}
77
+
78
+ render_with_layout()
79
+ end
80
+
81
+ def render_with_layout(context = self)
82
+ render_layout do
83
+ ERB.new(handled_template).result(binding)
84
+ end
85
+ end
86
+
87
+ def render_layout
88
+ layout = PolicyManager::Config.exporter.layout #File.read('views/layouts/app.html.erb')
89
+ ERB.new(layout).result(binding)
90
+ end
91
+
92
+
93
+ def save(file)
94
+ File.open(file, "w+") do |f|
95
+ f.write(render)
96
+ end
97
+ end
98
+
99
+ def handled_template
100
+ if @template.is_a?(String)
101
+ @template
102
+ elsif @template.is_a?(Pathname)
103
+ File.open(@template).read
104
+ end
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,60 @@
1
+ require 'zip'
2
+
3
+ # This is a simple example which uses rubyzip to
4
+ # recursively generate a zip file from the contents of
5
+ # a specified directory. The directory itself is not
6
+ # included in the archive, rather just its contents.
7
+ #
8
+ # Usage:
9
+ # directory_to_zip = "/tmp/input"
10
+ # output_file = "/tmp/out.zip"
11
+ # zf = ZipFileGenerator.new(directory_to_zip, output_file)
12
+ # zf.write()
13
+
14
+ module PolicyManager
15
+ class ZipGenerator
16
+ # Initialize with the directory to zip and the location of the output archive.
17
+ def initialize(input_dir, output_file)
18
+ @input_dir = input_dir
19
+ @output_file = output_file
20
+ end
21
+
22
+ # Zip the input directory.
23
+ def write
24
+ entries = Dir.entries(@input_dir) - %w(. ..)
25
+
26
+ ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile|
27
+ write_entries entries, '', zipfile
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ # A helper method to make the recursion work.
34
+ def write_entries(entries, path, zipfile)
35
+ entries.each do |e|
36
+ zipfile_path = path == '' ? e : File.join(path, e)
37
+ disk_file_path = File.join(@input_dir, zipfile_path)
38
+ puts "Deflating #{disk_file_path}"
39
+
40
+ if File.directory? disk_file_path
41
+ recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
42
+ else
43
+ put_into_archive(disk_file_path, zipfile, zipfile_path)
44
+ end
45
+ end
46
+ end
47
+
48
+ def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
49
+ zipfile.mkdir zipfile_path
50
+ subdir = Dir.entries(disk_file_path) - %w(. ..)
51
+ write_entries subdir, zipfile_path, zipfile
52
+ end
53
+
54
+ def put_into_archive(disk_file_path, zipfile, zipfile_path)
55
+ zipfile.get_output_stream(zipfile_path) do |f|
56
+ f.write(File.open(disk_file_path, 'rb').read)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,75 @@
1
+ require "fileutils"
2
+
3
+ module PolicyManager
4
+ class Exporter
5
+ attr_accessor :path,
6
+ :resource,
7
+ :index_template,
8
+ :layout,
9
+ :after_zip,
10
+ :mail_helpers,
11
+ :attachment_path,
12
+ :attachment_storage,
13
+ :expiration_link,
14
+ :mailer_templates,
15
+ :mailer
16
+
17
+ def initialize(opts={})
18
+ self.path = opts[:path]
19
+ self.resource = opts[:resource] #.call if opts[:resource].is_a?(Proc)
20
+ self.index_template = opts[:index_template]
21
+ self.layout = opts[:layout]
22
+ self.after_zip = opts[:after_zip]
23
+ self.mail_helpers = opts[:mail_helpers]
24
+ self.attachment_path = opts[:attachment_path]
25
+ self.attachment_storage = opts[:attachment_storage]
26
+ self.expiration_link = opts[:expiration_link]
27
+ self.mailer_templates = opts[:mailer_templates]
28
+ end
29
+
30
+ def perform(resource)
31
+ e = ExporterHandler.new(resource: resource, path: path, after_zip: after_zip)
32
+ e.perform
33
+ end
34
+
35
+ def clear!(resource)
36
+ e = ExporterHandler.new(resource: resource, path: path)
37
+ e.clear!
38
+ end
39
+
40
+ def index_template
41
+ handled_template(@index_template) || default_index_template
42
+ end
43
+
44
+ def layout
45
+ handled_template(@layout) || '<body> eeeee <%= yield %> eeee</body>'
46
+ end
47
+
48
+ def mail_helpers
49
+ @mail_helpers ||= []
50
+ end
51
+
52
+ def expiration_link
53
+ @expiration_link ||= 60
54
+ end
55
+
56
+ def handled_template(template)
57
+ return if template.blank?
58
+ if template.is_a?(String)
59
+ template
60
+ elsif template.is_a?(Pathname)
61
+ File.open(template).read
62
+ end
63
+ end
64
+
65
+ def default_index_template
66
+ '<h1>links</h1>
67
+ <ul>
68
+ <% @collection.each do |rule| %>
69
+ <li><%= link_to rule.name, "./#{rule.name}" %></li>
70
+ <% end %>
71
+ </ul>'
72
+ end
73
+
74
+ end
75
+ end
@@ -0,0 +1,15 @@
1
+ module PolicyManager
2
+ class PortabilityRule
3
+ attr_accessor :name, :methods, :formats, :per, :collection, :member, :template
4
+
5
+ def initialize(opts={})
6
+ self.collection = opts[:collection]
7
+ self.member = opts[:member]
8
+ self.per = opts[:per]
9
+ self.name = opts[:name]
10
+ self.formats = opts[:formats]
11
+ self.template = opts[:template]
12
+ end
13
+
14
+ end
15
+ end