apidae 0.7.3 → 0.7.4

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.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +20 -20
  3. data/README.rdoc +2 -2
  4. data/Rakefile +38 -38
  5. data/app/assets/images/apidae/logo-apidae-grey.svg +84 -84
  6. data/app/assets/javascripts/apidae/application.js +13 -13
  7. data/app/assets/stylesheets/apidae/application.css +15 -15
  8. data/app/controllers/apidae/api_controller.rb +25 -25
  9. data/app/controllers/apidae/application_controller.rb +6 -6
  10. data/app/controllers/apidae/dashboard_controller.rb +13 -13
  11. data/app/controllers/apidae/import_controller.rb +68 -68
  12. data/app/controllers/apidae/objects_controller.rb +59 -59
  13. data/app/controllers/apidae/projects_controller.rb +35 -35
  14. data/app/controllers/apidae/references_controller.rb +9 -9
  15. data/app/controllers/apidae/selections_controller.rb +53 -53
  16. data/app/helpers/apidae/api_helper.rb +4 -4
  17. data/app/helpers/apidae/application_helper.rb +4 -4
  18. data/app/helpers/apidae/dashboard_helper.rb +4 -4
  19. data/app/helpers/apidae/import_helper.rb +4 -4
  20. data/app/helpers/apidae/objects_helper.rb +4 -4
  21. data/app/helpers/apidae/references_helper.rb +4 -4
  22. data/app/helpers/apidae/selections_helper.rb +4 -4
  23. data/app/models/apidae/application_record.rb +5 -5
  24. data/app/models/apidae/export.rb +13 -13
  25. data/app/models/apidae/file_import.rb +161 -161
  26. data/app/models/apidae/obj.rb +351 -351
  27. data/app/models/apidae/project.rb +4 -4
  28. data/app/models/apidae/reference.rb +45 -45
  29. data/app/models/apidae/selection.rb +160 -160
  30. data/app/models/apidae/selection_object.rb +6 -6
  31. data/app/models/apidae/town.rb +28 -27
  32. data/app/views/apidae/dashboard/index.html.erb +41 -41
  33. data/app/views/apidae/import/callback.html.erb +2 -2
  34. data/app/views/apidae/objects/_form.html.erb +73 -73
  35. data/app/views/apidae/objects/edit.html.erb +6 -6
  36. data/app/views/apidae/objects/index.html.erb +34 -34
  37. data/app/views/apidae/objects/index.json.jbuilder +6 -6
  38. data/app/views/apidae/objects/new.html.erb +5 -5
  39. data/app/views/apidae/objects/show.html.erb +74 -74
  40. data/app/views/apidae/projects/edit.html.erb +32 -32
  41. data/app/views/apidae/projects/index.html.erb +34 -34
  42. data/app/views/apidae/references/index.html.erb +34 -34
  43. data/app/views/apidae/selections/_form.html.erb +29 -29
  44. data/app/views/apidae/selections/edit.html.erb +6 -6
  45. data/app/views/apidae/selections/index.html.erb +34 -34
  46. data/app/views/apidae/selections/new.html.erb +5 -5
  47. data/app/views/apidae/selections/show.html.erb +19 -19
  48. data/app/views/layouts/apidae/application.html.erb +14 -14
  49. data/config/locales/apidae.fr.yml +6 -6
  50. data/config/routes.rb +14 -14
  51. data/db/migrate/20170512212941_create_apidae_selections.rb +11 -11
  52. data/db/migrate/20170512214641_create_apidae_objects.rb +22 -22
  53. data/db/migrate/20170512221525_create_apidae_objects_apidae_selections.rb +8 -8
  54. data/db/migrate/20170513114002_create_apidae_towns.rb +15 -15
  55. data/db/migrate/20170513114409_add_town_insee_code_to_objects.rb +5 -5
  56. data/db/migrate/20170513115401_add_pictures_data_to_objects.rb +5 -5
  57. data/db/migrate/20170513121215_create_apidae_attached_files.rb +13 -13
  58. data/db/migrate/20170513205932_rename_objects_selections_table.rb +5 -5
  59. data/db/migrate/20170720161134_add_entity_data_to_objects.rb +5 -5
  60. data/db/migrate/20170730102424_create_apidae_file_imports.rb +13 -13
  61. data/db/migrate/20171025075304_create_apidae_exports.rb +15 -15
  62. data/db/migrate/20180217222410_create_apidae_selection_objects.rb +10 -10
  63. data/db/migrate/20180218172704_change_text_columns_to_json.rb +10 -10
  64. data/db/migrate/20180218231319_add_service_data_to_apidae_objects.rb +5 -5
  65. data/db/migrate/20180222104915_add_rates_data_to_apidae_objects.rb +6 -6
  66. data/db/migrate/20180222105302_rename_openings_to_openings_data.rb +5 -5
  67. data/db/migrate/20180307164936_add_attachments_data_to_apidae_objects.rb +5 -5
  68. data/db/migrate/20180307170349_create_apidae_references.rb +12 -12
  69. data/db/migrate/20180314093512_add_tags_data_to_apidae_objects.rb +5 -5
  70. data/db/migrate/20180314132631_add_meta_data_to_apidae_objects.rb +5 -5
  71. data/db/migrate/20180319143954_remove_apidae_id_unicity.rb +6 -6
  72. data/db/migrate/20180417164604_add_location_data_to_apidae_objects.rb +5 -5
  73. data/db/migrate/20180417165744_remove_address_from_apidae_objects.rb +5 -5
  74. data/db/migrate/20180417171344_remove_lat_lng_from_apidae_objects.rb +6 -6
  75. data/db/migrate/20180418141248_add_description_data_to_apidae_objects.rb +5 -5
  76. data/db/migrate/20180418141305_remove_desc_columns_from_apidae_objects.rb +6 -6
  77. data/db/migrate/20180424141656_add_meta_data_to_apidae_references.rb +5 -5
  78. data/db/migrate/20180519170210_remove_insee_code_unicity.rb +7 -7
  79. data/db/migrate/20180521211735_destroy_attached_files.rb +5 -5
  80. data/db/migrate/20180625050400_rename_objects_to_obj.rb +5 -5
  81. data/db/migrate/20181024072424_add_project_id_to_selections.rb +5 -5
  82. data/db/migrate/20181024072843_create_apidae_projects.rb +10 -10
  83. data/db/migrate/20190328122424_add_description_to_apidae_towns.rb +5 -0
  84. data/lib/apidae.rb +4 -4
  85. data/lib/apidae/engine.rb +10 -10
  86. data/lib/apidae/version.rb +3 -3
  87. data/lib/tasks/apidae_tasks.rake +4 -4
  88. data/test/apidae_test.rb +7 -7
  89. data/test/controllers/apidae/api_controller_test.rb +23 -23
  90. data/test/controllers/apidae/dashboard_controller_test.rb +15 -15
  91. data/test/controllers/apidae/import_controller_test.rb +15 -15
  92. data/test/controllers/apidae/objects_controller_test.rb +52 -52
  93. data/test/controllers/apidae/references_controller_test.rb +13 -13
  94. data/test/controllers/apidae/selections_controller_test.rb +52 -52
  95. data/test/data/selections.json +14 -14
  96. data/test/data/structure.json +64 -64
  97. data/test/data/update_selections.json +18 -18
  98. data/test/dummy/README.rdoc +28 -28
  99. data/test/dummy/Rakefile +6 -6
  100. data/test/dummy/app/assets/javascripts/application.js +13 -13
  101. data/test/dummy/app/assets/stylesheets/application.css +15 -15
  102. data/test/dummy/app/controllers/application_controller.rb +5 -5
  103. data/test/dummy/app/helpers/application_helper.rb +2 -2
  104. data/test/dummy/app/views/layouts/application.html.erb +14 -14
  105. data/test/dummy/bin/bundle +3 -3
  106. data/test/dummy/bin/rails +4 -4
  107. data/test/dummy/bin/rake +4 -4
  108. data/test/dummy/bin/setup +29 -29
  109. data/test/dummy/config.ru +4 -4
  110. data/test/dummy/config/application.rb +24 -24
  111. data/test/dummy/config/boot.rb +5 -5
  112. data/test/dummy/config/database.yml +20 -20
  113. data/test/dummy/config/environment.rb +5 -5
  114. data/test/dummy/config/environments/development.rb +41 -41
  115. data/test/dummy/config/environments/production.rb +79 -79
  116. data/test/dummy/config/environments/test.rb +42 -42
  117. data/test/dummy/config/initializers/apidae.rb +18 -18
  118. data/test/dummy/config/initializers/assets.rb +11 -11
  119. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -7
  120. data/test/dummy/config/initializers/cookies_serializer.rb +3 -3
  121. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -4
  122. data/test/dummy/config/initializers/inflections.rb +16 -16
  123. data/test/dummy/config/initializers/mime_types.rb +4 -4
  124. data/test/dummy/config/initializers/session_store.rb +3 -3
  125. data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -10
  126. data/test/dummy/config/initializers/wrap_parameters.rb +14 -14
  127. data/test/dummy/config/locales/en.yml +23 -23
  128. data/test/dummy/config/routes.rb +4 -4
  129. data/test/dummy/config/secrets.yml +22 -22
  130. data/test/dummy/db/schema.rb +104 -104
  131. data/test/dummy/public/404.html +67 -67
  132. data/test/dummy/public/422.html +67 -67
  133. data/test/dummy/public/500.html +66 -66
  134. data/test/fixtures/apidae/exports.yml +15 -15
  135. data/test/fixtures/apidae/objects.yml +33 -33
  136. data/test/fixtures/apidae/references.yml +11 -11
  137. data/test/fixtures/apidae/selection_objects.yml +9 -9
  138. data/test/fixtures/apidae/selections.yml +11 -11
  139. data/test/fixtures/apidae/towns.yml +15 -15
  140. data/test/integration/navigation_test.rb +8 -8
  141. data/test/models/apidae/export_test.rb +9 -9
  142. data/test/models/apidae/file_import_test.rb +88 -88
  143. data/test/models/apidae/object_test.rb +9 -9
  144. data/test/models/apidae/reference_test.rb +9 -9
  145. data/test/models/apidae/selection_object_test.rb +9 -9
  146. data/test/models/apidae/selection_test.rb +9 -9
  147. data/test/models/apidae/town_test.rb +9 -9
  148. data/test/test_helper.rb +22 -22
  149. metadata +49 -50
  150. data/test/dummy/log/test.log +0 -2109
@@ -1,5 +1,5 @@
1
- module Apidae
2
- class Project < ActiveRecord::Base
3
- has_many :apidae_selections, class_name: 'Apidae::Selection', foreign_key: :apidae_project_id
4
- end
1
+ module Apidae
2
+ class Project < ActiveRecord::Base
3
+ has_many :apidae_selections, class_name: 'Apidae::Selection', foreign_key: :apidae_project_id
4
+ end
5
5
  end
@@ -1,45 +1,45 @@
1
- module Apidae
2
- class Reference < ApplicationRecord
3
-
4
- INTERNAL = 'internal'
5
-
6
- store_accessor :meta_data, :category, :parent
7
-
8
- def self.import(refs_json)
9
- refs_hashes = JSON.parse(refs_json, symbolize_names: true)
10
- if refs_hashes.length != where("apidae_type != ?", INTERNAL).count
11
- refs_hashes.each do |ref_data|
12
- ref = Reference.find_or_initialize_by(apidae_id: ref_data[:id], apidae_type: ref_data[:elementReferenceType])
13
- ref.label_data = ref_data.slice(:libelleFr, :libelleEn)
14
- ref.parent = ref_data[:parent][:id] if ref_data[:parent]
15
- ref.category = ref_data[:familleCritere] ? ref_data[:familleCritere][:id] : (ref_data[:typeLabel] ? ref_data[:typeLabel][:id] : nil)
16
- ref.save!
17
- end
18
- end
19
- end
20
-
21
- def self.import_file(json_file)
22
- refs_json = File.read(json_file)
23
- import(refs_json)
24
- end
25
-
26
- def self.import_internal(internal_json)
27
- refs_hashes = JSON.parse(internal_json, symbolize_names: true)
28
- if refs_hashes.length != where(apidae_type: INTERNAL).count
29
- refs_hashes.each do |ref_data|
30
- ref = Reference.find_or_initialize_by(apidae_id: ref_data[:id], apidae_type: INTERNAL)
31
- ref.label_data = {libelleFr: ref_data[:libelle]}
32
- ref.save!
33
- end
34
- end
35
- end
36
-
37
- def label(language)
38
- label_data["libelle#{language.to_s.upcase_first}"]
39
- end
40
-
41
- def detailed_label(language)
42
- category ? "#{Reference.find_by_apidae_id(category).label(language)} - #{label(language)}" : label(language)
43
- end
44
- end
45
- end
1
+ module Apidae
2
+ class Reference < ApplicationRecord
3
+
4
+ INTERNAL = 'internal'
5
+
6
+ store_accessor :meta_data, :category, :parent
7
+
8
+ def self.import(refs_json)
9
+ refs_hashes = JSON.parse(refs_json, symbolize_names: true)
10
+ if refs_hashes.length != where("apidae_type != ?", INTERNAL).count
11
+ refs_hashes.each do |ref_data|
12
+ ref = Reference.find_or_initialize_by(apidae_id: ref_data[:id], apidae_type: ref_data[:elementReferenceType])
13
+ ref.label_data = ref_data.slice(:libelleFr, :libelleEn)
14
+ ref.parent = ref_data[:parent][:id] if ref_data[:parent]
15
+ ref.category = ref_data[:familleCritere] ? ref_data[:familleCritere][:id] : (ref_data[:typeLabel] ? ref_data[:typeLabel][:id] : nil)
16
+ ref.save!
17
+ end
18
+ end
19
+ end
20
+
21
+ def self.import_file(json_file)
22
+ refs_json = File.read(json_file)
23
+ import(refs_json)
24
+ end
25
+
26
+ def self.import_internal(internal_json)
27
+ refs_hashes = JSON.parse(internal_json, symbolize_names: true)
28
+ if refs_hashes.length != where(apidae_type: INTERNAL).count
29
+ refs_hashes.each do |ref_data|
30
+ ref = Reference.find_or_initialize_by(apidae_id: ref_data[:id], apidae_type: INTERNAL)
31
+ ref.label_data = {libelleFr: ref_data[:libelle]}
32
+ ref.save!
33
+ end
34
+ end
35
+ end
36
+
37
+ def label(language)
38
+ label_data["libelle#{language.to_s.upcase_first}"]
39
+ end
40
+
41
+ def detailed_label(language)
42
+ category ? "#{Reference.find_by_apidae_id(category).label(language)} - #{label(language)}" : label(language)
43
+ end
44
+ end
45
+ end
@@ -1,160 +1,160 @@
1
- require 'open-uri'
2
-
3
- module Apidae
4
- class Selection < ActiveRecord::Base
5
- has_many :apidae_selection_objects, class_name: 'Apidae::SelectionObject', foreign_key: :apidae_selection_id
6
- has_many :objects, class_name: 'Apidae::Obj', source: :apidae_object, through: :apidae_selection_objects
7
- belongs_to :apidae_project, optional: true, class_name: 'Apidae::Project', foreign_key: :apidae_project_id
8
-
9
- AGENDA_ENDPOINT = 'agenda/detaille/list-identifiants'
10
- SELECTION_ENDPOINT = 'recherche/list-identifiants'
11
- MAX_COUNT = 100
12
- MAX_LOOPS = 10
13
-
14
- validates_presence_of :apidae_id, :reference
15
- before_validation :generate_reference, on: :create
16
-
17
- def self.add_or_update(selection_data, apidae_proj_id)
18
- apidae_sel = Selection.where(apidae_id: selection_data[:id]).first_or_initialize
19
- apidae_sel.label = selection_data[:nom]
20
- apidae_sel.apidae_project_id = apidae_proj_id
21
- apidae_sel.save!
22
-
23
- # Note : should be done with basic collection assignment, but can't make it work...
24
- current_objs = apidae_sel.objects.collect {|obj| obj.apidae_id}
25
- imported_objs = selection_data[:objetsTouristiques].blank? ? [] : selection_data[:objetsTouristiques].collect {|obj| obj[:id]}
26
-
27
- added = imported_objs - current_objs
28
- removed = current_objs - imported_objs
29
-
30
- added.each do |o|
31
- obj = Obj.find_by_apidae_id(o)
32
- SelectionObject.create(apidae_selection_id: apidae_sel.id, apidae_object_id: obj.id)
33
- end
34
-
35
- removed_ids = Obj.where(apidae_id: removed).map {|o| o.id}
36
- SelectionObject.where(apidae_selection_id: apidae_sel.id, apidae_object_id: removed_ids).delete_all
37
- end
38
-
39
- def results(where_clause, offset, size)
40
- objects.includes(:town).limit(size).offset(offset).where(where_clause)
41
- end
42
-
43
- def total(where_clause)
44
- objects.where(where_clause).count
45
- end
46
-
47
- def api_results(opts = {})
48
- key = cache_key(:results)
49
- res = $apidae_cache.read(key)
50
- unless res
51
- query_args = build_args(SELECTION_ENDPOINT, opts.merge({selection_ids: [apidae_id]}))
52
- res = query_api(query_args, true)
53
- $apidae_cache.write(key, res)
54
- end
55
- res
56
- end
57
-
58
- def api_agenda(from, to)
59
- key = cache_key(:agenda, from, to)
60
- res = $apidae_cache.read(key)
61
- unless res
62
- query_args = build_args(AGENDA_ENDPOINT, {selection_ids: [apidae_id], from: from, to: to})
63
- res = query_api(query_args, true)
64
- $apidae_cache.write(key, res)
65
- end
66
- res
67
- end
68
-
69
- def as_text
70
- "#{label} (#{apidae_id})"
71
- end
72
-
73
- private
74
-
75
- def query_api(query_args, all_results = false)
76
- query_result = {}
77
-
78
- if all_results
79
- loops = 0
80
- query_args[:first] = 0
81
- query_args[:count] = MAX_COUNT
82
- response = JSON.parse get_response(query_args), symbolize_names: false
83
- total = response['numFound']
84
- query_result[:results] = response['objetTouristiqueIds'] || {}
85
-
86
- while total > results_count(query_result) && loops < MAX_LOOPS
87
- loops += 1
88
- query_args[:first] += MAX_COUNT
89
- response = JSON.parse get_response(query_args), symbolize_names: false
90
- merge_results(response, query_result)
91
- end
92
- query_result[:count] = total
93
- else
94
- response = JSON.parse get_response(query_args), symbolize_names: false
95
- query_result[:results] = response['objetTouristiqueIds'] || {}
96
- query_result[:count] = response['numFound']
97
- end
98
- query_result
99
- end
100
-
101
- def results_count(result)
102
- if result[:results] && result[:results].is_a?(Hash)
103
- result[:results].values.flatten.length
104
- else
105
- result[:results].blank? ? 0 : result[:results].length
106
- end
107
- end
108
-
109
- def get_response(args)
110
- response = ''
111
- query = JSON.generate args.except(:url)
112
- logger.info "Apidae API query : #{args[:url]}?query=#{query}"
113
- open("#{args[:url]}?query=#{CGI.escape query}") { |f|
114
- f.each_line {|line| response += line if line}
115
- }
116
- response
117
- end
118
-
119
- def merge_results(response, result)
120
- ids = response['objetTouristiqueIds']
121
- unless ids.nil? || ids.empty?
122
- if result[:results] && result[:results].is_a?(Hash)
123
- first_day = ids.keys.first
124
- if result[:results].has_key?(first_day)
125
- result[:results][first_day] += ids[first_day]
126
- else
127
- result[:results][first_day] = ids[first_day]
128
- end
129
- result[:results].merge!(ids.except(first_day))
130
- else
131
- result[:results] += ids
132
- end
133
- end
134
- end
135
-
136
- def build_args(endpoint, opts = {})
137
- {
138
- url: "#{Rails.application.config.apidae_api_url}/#{endpoint}",
139
- apiKey: apidae_project ? apidae_project.api_key : '',
140
- projetId: apidae_project.apidae_id,
141
- first: opts[:first] || 0,
142
- count: opts[:count] || MAX_COUNT,
143
- selectionIds: opts[:selection_ids],
144
- dateDebut: opts[:from],
145
- dateFin: opts[:to],
146
- center: opts[:lat] && opts[:lng] ? {type: 'Point', coordinates: [opts[:lng], opts[:lat]]} : nil,
147
- radius: opts[:radius] ? opts[:radius].to_i : nil,
148
- responseFields: opts[:fields] || ['id']
149
- }
150
- end
151
-
152
- def generate_reference
153
- self.reference ||= (self.label.parameterize || self.apidae_id)
154
- end
155
-
156
- def cache_key(*args)
157
- "#{apidae_id}_#{args.map {|a| a.to_s.parameterize}.join('_')}"
158
- end
159
- end
160
- end
1
+ require 'open-uri'
2
+
3
+ module Apidae
4
+ class Selection < ActiveRecord::Base
5
+ has_many :apidae_selection_objects, class_name: 'Apidae::SelectionObject', foreign_key: :apidae_selection_id
6
+ has_many :objects, class_name: 'Apidae::Obj', source: :apidae_object, through: :apidae_selection_objects
7
+ belongs_to :apidae_project, optional: true, class_name: 'Apidae::Project', foreign_key: :apidae_project_id
8
+
9
+ AGENDA_ENDPOINT = 'agenda/detaille/list-identifiants'
10
+ SELECTION_ENDPOINT = 'recherche/list-identifiants'
11
+ MAX_COUNT = 100
12
+ MAX_LOOPS = 10
13
+
14
+ validates_presence_of :apidae_id, :reference
15
+ before_validation :generate_reference, on: :create
16
+
17
+ def self.add_or_update(selection_data, apidae_proj_id)
18
+ apidae_sel = Selection.where(apidae_id: selection_data[:id]).first_or_initialize
19
+ apidae_sel.label = selection_data[:nom]
20
+ apidae_sel.apidae_project_id = apidae_proj_id
21
+ apidae_sel.save!
22
+
23
+ # Note : should be done with basic collection assignment, but can't make it work...
24
+ current_objs = apidae_sel.objects.collect {|obj| obj.apidae_id}
25
+ imported_objs = selection_data[:objetsTouristiques].blank? ? [] : selection_data[:objetsTouristiques].collect {|obj| obj[:id]}
26
+
27
+ added = imported_objs - current_objs
28
+ removed = current_objs - imported_objs
29
+
30
+ added.each do |o|
31
+ obj = Obj.find_by_apidae_id(o)
32
+ SelectionObject.create(apidae_selection_id: apidae_sel.id, apidae_object_id: obj.id)
33
+ end
34
+
35
+ removed_ids = Obj.where(apidae_id: removed).map {|o| o.id}
36
+ SelectionObject.where(apidae_selection_id: apidae_sel.id, apidae_object_id: removed_ids).delete_all
37
+ end
38
+
39
+ def results(where_clause, offset, size)
40
+ objects.includes(:town).limit(size).offset(offset).where(where_clause)
41
+ end
42
+
43
+ def total(where_clause)
44
+ objects.where(where_clause).count
45
+ end
46
+
47
+ def api_results(opts = {})
48
+ key = cache_key(:results)
49
+ res = $apidae_cache.read(key)
50
+ unless res
51
+ query_args = build_args(SELECTION_ENDPOINT, opts.merge({selection_ids: [apidae_id]}))
52
+ res = query_api(query_args, true)
53
+ $apidae_cache.write(key, res)
54
+ end
55
+ res
56
+ end
57
+
58
+ def api_agenda(from, to)
59
+ key = cache_key(:agenda, from, to)
60
+ res = $apidae_cache.read(key)
61
+ unless res
62
+ query_args = build_args(AGENDA_ENDPOINT, {selection_ids: [apidae_id], from: from, to: to})
63
+ res = query_api(query_args, true)
64
+ $apidae_cache.write(key, res)
65
+ end
66
+ res
67
+ end
68
+
69
+ def as_text
70
+ "#{label} (#{apidae_id})"
71
+ end
72
+
73
+ private
74
+
75
+ def query_api(query_args, all_results = false)
76
+ query_result = {}
77
+
78
+ if all_results
79
+ loops = 0
80
+ query_args[:first] = 0
81
+ query_args[:count] = MAX_COUNT
82
+ response = JSON.parse get_response(query_args), symbolize_names: false
83
+ total = response['numFound']
84
+ query_result[:results] = response['objetTouristiqueIds'] || {}
85
+
86
+ while total > results_count(query_result) && loops < MAX_LOOPS
87
+ loops += 1
88
+ query_args[:first] += MAX_COUNT
89
+ response = JSON.parse get_response(query_args), symbolize_names: false
90
+ merge_results(response, query_result)
91
+ end
92
+ query_result[:count] = total
93
+ else
94
+ response = JSON.parse get_response(query_args), symbolize_names: false
95
+ query_result[:results] = response['objetTouristiqueIds'] || {}
96
+ query_result[:count] = response['numFound']
97
+ end
98
+ query_result
99
+ end
100
+
101
+ def results_count(result)
102
+ if result[:results] && result[:results].is_a?(Hash)
103
+ result[:results].values.flatten.length
104
+ else
105
+ result[:results].blank? ? 0 : result[:results].length
106
+ end
107
+ end
108
+
109
+ def get_response(args)
110
+ response = ''
111
+ query = JSON.generate args.except(:url)
112
+ logger.info "Apidae API query : #{args[:url]}?query=#{query}"
113
+ open("#{args[:url]}?query=#{CGI.escape query}") { |f|
114
+ f.each_line {|line| response += line if line}
115
+ }
116
+ response
117
+ end
118
+
119
+ def merge_results(response, result)
120
+ ids = response['objetTouristiqueIds']
121
+ unless ids.nil? || ids.empty?
122
+ if result[:results] && result[:results].is_a?(Hash)
123
+ first_day = ids.keys.first
124
+ if result[:results].has_key?(first_day)
125
+ result[:results][first_day] += ids[first_day]
126
+ else
127
+ result[:results][first_day] = ids[first_day]
128
+ end
129
+ result[:results].merge!(ids.except(first_day))
130
+ else
131
+ result[:results] += ids
132
+ end
133
+ end
134
+ end
135
+
136
+ def build_args(endpoint, opts = {})
137
+ {
138
+ url: "#{Rails.application.config.apidae_api_url}/#{endpoint}",
139
+ apiKey: apidae_project ? apidae_project.api_key : '',
140
+ projetId: apidae_project.apidae_id,
141
+ first: opts[:first] || 0,
142
+ count: opts[:count] || MAX_COUNT,
143
+ selectionIds: opts[:selection_ids],
144
+ dateDebut: opts[:from],
145
+ dateFin: opts[:to],
146
+ center: opts[:lat] && opts[:lng] ? {type: 'Point', coordinates: [opts[:lng], opts[:lat]]} : nil,
147
+ radius: opts[:radius] ? opts[:radius].to_i : nil,
148
+ responseFields: opts[:fields] || ['id']
149
+ }
150
+ end
151
+
152
+ def generate_reference
153
+ self.reference ||= (self.label.parameterize || self.apidae_id)
154
+ end
155
+
156
+ def cache_key(*args)
157
+ "#{apidae_id}_#{args.map {|a| a.to_s.parameterize}.join('_')}"
158
+ end
159
+ end
160
+ end
@@ -1,6 +1,6 @@
1
- module Apidae
2
- class SelectionObject < ApplicationRecord
3
- belongs_to :apidae_object, class_name: 'Apidae::Obj', foreign_key: :apidae_object_id
4
- belongs_to :apidae_selection, class_name: 'Apidae::Selection', foreign_key: :apidae_selection_id
5
- end
6
- end
1
+ module Apidae
2
+ class SelectionObject < ApplicationRecord
3
+ belongs_to :apidae_object, class_name: 'Apidae::Obj', foreign_key: :apidae_object_id
4
+ belongs_to :apidae_selection, class_name: 'Apidae::Selection', foreign_key: :apidae_selection_id
5
+ end
6
+ end
@@ -1,27 +1,28 @@
1
- module Apidae
2
- class Town < ActiveRecord::Base
3
- def self.import(towns_json)
4
- towns_hashes = JSON.parse(towns_json, symbolize_names: true)
5
- if towns_hashes.length != count
6
- countries = Hash[Reference.where(apidae_type: "Pays").map {|ref| [ref.apidae_id, ref.label(:fr)]}]
7
- towns_hashes.each do |town_data|
8
- town = Town.find_or_initialize_by(apidae_id: town_data[:id])
9
- town.name = town_data[:nom]
10
- town.postal_code = town_data[:codePostal]
11
- town.insee_code = town_data[:code]
12
- town.country = countries[town_data[:pays][:id]]
13
- town.save!
14
- end
15
- end
16
- end
17
-
18
- def self.import_file(json_file)
19
- towns_json = File.read(json_file)
20
- import(towns_json)
21
- end
22
-
23
- def label
24
- "#{name} (#{postal_code})"
25
- end
26
- end
27
- end
1
+ module Apidae
2
+ class Town < ActiveRecord::Base
3
+ def self.import(towns_json)
4
+ towns_hashes = JSON.parse(towns_json, symbolize_names: true)
5
+ if towns_hashes.length != count
6
+ countries = Hash[Reference.where(apidae_type: "Pays").map {|ref| [ref.apidae_id, ref.label(:fr)]}]
7
+ towns_hashes.each do |town_data|
8
+ town = Town.find_or_initialize_by(apidae_id: town_data[:id])
9
+ town.name = town_data[:nom]
10
+ town.postal_code = town_data[:codePostal]
11
+ town.insee_code = town_data[:code]
12
+ town.country = countries[town_data[:pays][:id]]
13
+ town.description = town_data[:complement]
14
+ town.save!
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.import_file(json_file)
20
+ towns_json = File.read(json_file)
21
+ import(towns_json)
22
+ end
23
+
24
+ def label
25
+ "#{name} (#{postal_code})"
26
+ end
27
+ end
28
+ end