apidae-engine-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/javascripts/apidae/application.js +13 -0
  6. data/app/assets/stylesheets/apidae/application.css +15 -0
  7. data/app/controllers/apidae/application_controller.rb +5 -0
  8. data/app/controllers/apidae/objects_controller.rb +62 -0
  9. data/app/controllers/apidae/selections_controller.rb +62 -0
  10. data/app/helpers/apidae/application_helper.rb +4 -0
  11. data/app/helpers/apidae/objects_helper.rb +4 -0
  12. data/app/helpers/apidae/selections_helper.rb +4 -0
  13. data/app/models/apidae/attached_file.rb +31 -0
  14. data/app/models/apidae/object.rb +217 -0
  15. data/app/models/apidae/selection.rb +89 -0
  16. data/app/models/apidae/town.rb +18 -0
  17. data/app/views/apidae/objects/_form.html.erb +73 -0
  18. data/app/views/apidae/objects/edit.html.erb +6 -0
  19. data/app/views/apidae/objects/index.html.erb +53 -0
  20. data/app/views/apidae/objects/new.html.erb +5 -0
  21. data/app/views/apidae/objects/show.html.erb +74 -0
  22. data/app/views/apidae/selections/_form.html.erb +29 -0
  23. data/app/views/apidae/selections/edit.html.erb +6 -0
  24. data/app/views/apidae/selections/index.html.erb +31 -0
  25. data/app/views/apidae/selections/new.html.erb +5 -0
  26. data/app/views/apidae/selections/show.html.erb +19 -0
  27. data/app/views/layouts/apidae/application.html.erb +14 -0
  28. data/config/routes.rb +4 -0
  29. data/db/migrate/20170512212941_create_apidae_selections.rb +11 -0
  30. data/db/migrate/20170512214641_create_apidae_objects.rb +22 -0
  31. data/db/migrate/20170512221525_create_apidae_objects_apidae_selections.rb +8 -0
  32. data/db/migrate/20170513114002_create_apidae_towns.rb +15 -0
  33. data/db/migrate/20170513114409_add_town_insee_code_to_objects.rb +5 -0
  34. data/db/migrate/20170513115401_add_pictures_data_to_objects.rb +5 -0
  35. data/db/migrate/20170513121215_create_apidae_attached_files.rb +13 -0
  36. data/db/migrate/20170513205932_rename_objects_selections_table.rb +5 -0
  37. data/lib/apidae.rb +4 -0
  38. data/lib/apidae/engine.rb +5 -0
  39. data/lib/apidae/version.rb +3 -0
  40. data/lib/tasks/apidae_tasks.rake +4 -0
  41. data/test/apidae_test.rb +7 -0
  42. data/test/controllers/apidae/objects_controller_test.rb +52 -0
  43. data/test/controllers/apidae/selections_controller_test.rb +52 -0
  44. data/test/dummy/README.rdoc +28 -0
  45. data/test/dummy/Rakefile +6 -0
  46. data/test/dummy/app/assets/javascripts/application.js +13 -0
  47. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  48. data/test/dummy/app/controllers/application_controller.rb +5 -0
  49. data/test/dummy/app/helpers/application_helper.rb +2 -0
  50. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  51. data/test/dummy/bin/bundle +3 -0
  52. data/test/dummy/bin/rails +4 -0
  53. data/test/dummy/bin/rake +4 -0
  54. data/test/dummy/bin/setup +29 -0
  55. data/test/dummy/config.ru +4 -0
  56. data/test/dummy/config/application.rb +26 -0
  57. data/test/dummy/config/boot.rb +5 -0
  58. data/test/dummy/config/database.yml +20 -0
  59. data/test/dummy/config/environment.rb +5 -0
  60. data/test/dummy/config/environments/development.rb +41 -0
  61. data/test/dummy/config/environments/production.rb +79 -0
  62. data/test/dummy/config/environments/test.rb +42 -0
  63. data/test/dummy/config/initializers/assets.rb +11 -0
  64. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  65. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  66. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  67. data/test/dummy/config/initializers/inflections.rb +16 -0
  68. data/test/dummy/config/initializers/mime_types.rb +4 -0
  69. data/test/dummy/config/initializers/session_store.rb +3 -0
  70. data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
  71. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  72. data/test/dummy/config/locales/en.yml +23 -0
  73. data/test/dummy/config/routes.rb +4 -0
  74. data/test/dummy/config/secrets.yml +22 -0
  75. data/test/dummy/db/schema.rb +64 -0
  76. data/test/dummy/log/development.log +121 -0
  77. data/test/dummy/log/test.log +7 -0
  78. data/test/dummy/public/404.html +67 -0
  79. data/test/dummy/public/422.html +67 -0
  80. data/test/dummy/public/500.html +66 -0
  81. data/test/dummy/public/favicon.ico +0 -0
  82. data/test/fixtures/apidae/attached_files.yml +9 -0
  83. data/test/fixtures/apidae/objects.yml +33 -0
  84. data/test/fixtures/apidae/selections.yml +11 -0
  85. data/test/fixtures/apidae/towns.yml +15 -0
  86. data/test/integration/navigation_test.rb +8 -0
  87. data/test/models/apidae/attached_file_test.rb +9 -0
  88. data/test/models/apidae/object_test.rb +9 -0
  89. data/test/models/apidae/selection_test.rb +9 -0
  90. data/test/models/apidae/town_test.rb +9 -0
  91. data/test/test_helper.rb +21 -0
  92. metadata +227 -0
@@ -0,0 +1,89 @@
1
+ module Apidae
2
+ class Selection < ActiveRecord::Base
3
+ has_and_belongs_to_many :objects, :class_name => 'Apidae::Object'
4
+
5
+ MAX_COUNT = 100
6
+ MAX_LOOPS = 10
7
+
8
+ def self.import(json_file)
9
+ selections_json = File.read(json_file)
10
+ selections_hashes = JSON.parse(selections_json, symbolize_names: true)
11
+ selections_hashes.each do |selection_data|
12
+ existing_sel = Apidae::Selection.find_by_apidae_id(selection_data[:id])
13
+ unless existing_sel
14
+ selection = Apidae::Selection.create!(
15
+ label: selection_data[:nom],
16
+ apidae_id: selection_data[:id]
17
+ )
18
+ if selection_data[:objetsTouristiques]
19
+ selection_data[:objetsTouristiques].each do |o|
20
+ apidae_object = Apidae::Object.find_by_apidae_id(o[:id])
21
+ selection.objects << apidae_object
22
+ selection.save!
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def agenda(from, to)
30
+ agenda_entries = Rails.cache.read("#{apidae_id}_#{from}_#{to}")
31
+ if agenda_entries.nil?
32
+ query_result = {}
33
+ config = {
34
+ url: "#{Rails.application.config.apidae_api_url}/agenda/detaille/list-identifiants",
35
+ apiKey: Rails.application.config.apidae_api_key,
36
+ projetId: Rails.application.config.apidae_project_id,
37
+ first: 0,
38
+ count: MAX_COUNT,
39
+ selectionIds: [apidae_id],
40
+ dateDebut: from,
41
+ dateFin: to
42
+ }
43
+
44
+ loops = 0
45
+
46
+ response = JSON.parse get_response(config), symbolize_names: false
47
+ total = response['numFound']
48
+
49
+ query_result[:results] = response['objetTouristiqueIds'] || {}
50
+
51
+ while total > query_result[:results].values.flatten.length && loops < MAX_LOOPS
52
+ loops += 1
53
+ config[:first] += MAX_COUNT
54
+ response = JSON.parse get_response(config), symbolize_names: false
55
+ merge_results(response, query_result)
56
+ end
57
+ query_result[:count] = total
58
+ agenda_entries = query_result
59
+ Rails.cache.write("#{apidae_id}_#{from}_#{to}", query_result)
60
+ end
61
+ agenda_entries
62
+ end
63
+
64
+ private
65
+
66
+ def get_response(config)
67
+ response = ''
68
+ query = JSON.generate config.except(:url)
69
+ logger.info "Agenda query : #{config[:url]}?query=#{query}"
70
+ open("#{config[:url]}?query=#{CGI.escape query}") { |f|
71
+ f.each_line {|line| response += line if line}
72
+ }
73
+ response
74
+ end
75
+
76
+ def merge_results(response, query_results)
77
+ unless response['objetTouristiqueIds'].nil? || response['objetTouristiqueIds'].empty?
78
+ first_day = response['objetTouristiqueIds'].keys.first
79
+ if query_results[:results].has_key?(first_day)
80
+ query_results[:results][first_day] += response['objetTouristiqueIds'][first_day]
81
+ else
82
+ query_results[:results][first_day] = response['objetTouristiqueIds'][first_day]
83
+ end
84
+ query_results[:results].merge!(response['objetTouristiqueIds'].except(first_day))
85
+ end
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,18 @@
1
+ module Apidae
2
+ class Town < ActiveRecord::Base
3
+ def self.import(json_file)
4
+ result = true
5
+ towns_json = File.read(json_file)
6
+ towns_hashes = JSON.parse(towns_json, symbolize_names: true)
7
+ towns_hashes.each do |town_data|
8
+ Town.create!(name: town_data[:nom], postal_code: town_data[:codePostal], insee_code: town_data[:code],
9
+ country: 'fr', apidae_id: town_data[:id])
10
+ end
11
+ result
12
+ end
13
+
14
+ def label
15
+ "#{name} (#{postal_code})"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,73 @@
1
+ <%= form_for(@object) do |f| %>
2
+ <% if @object.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2><%= pluralize(@object.errors.count, "error") %> prohibited this object from being saved:</h2>
5
+
6
+ <ul>
7
+ <% @object.errors.full_messages.each do |message| %>
8
+ <li><%= message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div class="field">
15
+ <%= f.label :address %><br>
16
+ <%= f.text_field :address %>
17
+ </div>
18
+ <div class="field">
19
+ <%= f.label :apidae_id %><br>
20
+ <%= f.number_field :apidae_id %>
21
+ </div>
22
+ <div class="field">
23
+ <%= f.label :apidae_type %><br>
24
+ <%= f.text_field :apidae_type %>
25
+ </div>
26
+ <div class="field">
27
+ <%= f.label :apidae_subtype %><br>
28
+ <%= f.text_field :apidae_subtype %>
29
+ </div>
30
+ <div class="field">
31
+ <%= f.label :title %><br>
32
+ <%= f.text_field :title %>
33
+ </div>
34
+ <div class="field">
35
+ <%= f.label :short_desc %><br>
36
+ <%= f.text_area :short_desc %>
37
+ </div>
38
+ <div class="field">
39
+ <%= f.label :contact %><br>
40
+ <%= f.text_area :contact %>
41
+ </div>
42
+ <div class="field">
43
+ <%= f.label :long_desc %><br>
44
+ <%= f.text_area :long_desc %>
45
+ </div>
46
+ <div class="field">
47
+ <%= f.label :type_data %><br>
48
+ <%= f.text_area :type_data %>
49
+ </div>
50
+ <div class="field">
51
+ <%= f.label :latitude %><br>
52
+ <%= f.text_field :latitude %>
53
+ </div>
54
+ <div class="field">
55
+ <%= f.label :longitude %><br>
56
+ <%= f.text_field :longitude %>
57
+ </div>
58
+ <div class="field">
59
+ <%= f.label :openings %><br>
60
+ <%= f.text_area :openings %>
61
+ </div>
62
+ <div class="field">
63
+ <%= f.label :rates %><br>
64
+ <%= f.text_area :rates %>
65
+ </div>
66
+ <div class="field">
67
+ <%= f.label :reservation %><br>
68
+ <%= f.text_area :reservation %>
69
+ </div>
70
+ <div class="actions">
71
+ <%= f.submit %>
72
+ </div>
73
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing Object</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', @object %> |
6
+ <%= link_to 'Back', objects_path %>
@@ -0,0 +1,53 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <h1>Listing Objects</h1>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <th>Address</th>
9
+ <th>Apidae</th>
10
+ <th>Apidae type</th>
11
+ <th>Apidae subtype</th>
12
+ <th>Title</th>
13
+ <th>Short desc</th>
14
+ <th>Contact</th>
15
+ <th>Long desc</th>
16
+ <th>Type data</th>
17
+ <th>Latitude</th>
18
+ <th>Longitude</th>
19
+ <th>Openings</th>
20
+ <th>Rates</th>
21
+ <th>Reservation</th>
22
+ <th colspan="3"></th>
23
+ </tr>
24
+ </thead>
25
+
26
+ <tbody>
27
+ <% @objects.each do |object| %>
28
+ <tr>
29
+ <td><%= object.address %></td>
30
+ <td><%= object.apidae_id %></td>
31
+ <td><%= object.apidae_type %></td>
32
+ <td><%= object.apidae_subtype %></td>
33
+ <td><%= object.title %></td>
34
+ <td><%= object.short_desc %></td>
35
+ <td><%= object.contact %></td>
36
+ <td><%= object.long_desc %></td>
37
+ <td><%= object.type_data %></td>
38
+ <td><%= object.latitude %></td>
39
+ <td><%= object.longitude %></td>
40
+ <td><%= object.openings %></td>
41
+ <td><%= object.rates %></td>
42
+ <td><%= object.reservation %></td>
43
+ <td><%= link_to 'Show', object %></td>
44
+ <td><%= link_to 'Edit', edit_object_path(object) %></td>
45
+ <td><%= link_to 'Destroy', object, method: :delete, data: { confirm: 'Are you sure?' } %></td>
46
+ </tr>
47
+ <% end %>
48
+ </tbody>
49
+ </table>
50
+
51
+ <br>
52
+
53
+ <%= link_to 'New Object', new_object_path %>
@@ -0,0 +1,5 @@
1
+ <h1>New Object</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Back', objects_path %>
@@ -0,0 +1,74 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <p>
4
+ <strong>Address:</strong>
5
+ <%= @object.address %>
6
+ </p>
7
+
8
+ <p>
9
+ <strong>Apidae:</strong>
10
+ <%= @object.apidae_id %>
11
+ </p>
12
+
13
+ <p>
14
+ <strong>Apidae type:</strong>
15
+ <%= @object.apidae_type %>
16
+ </p>
17
+
18
+ <p>
19
+ <strong>Apidae subtype:</strong>
20
+ <%= @object.apidae_subtype %>
21
+ </p>
22
+
23
+ <p>
24
+ <strong>Title:</strong>
25
+ <%= @object.title %>
26
+ </p>
27
+
28
+ <p>
29
+ <strong>Short desc:</strong>
30
+ <%= @object.short_desc %>
31
+ </p>
32
+
33
+ <p>
34
+ <strong>Contact:</strong>
35
+ <%= @object.contact %>
36
+ </p>
37
+
38
+ <p>
39
+ <strong>Long desc:</strong>
40
+ <%= @object.long_desc %>
41
+ </p>
42
+
43
+ <p>
44
+ <strong>Type data:</strong>
45
+ <%= @object.type_data %>
46
+ </p>
47
+
48
+ <p>
49
+ <strong>Latitude:</strong>
50
+ <%= @object.latitude %>
51
+ </p>
52
+
53
+ <p>
54
+ <strong>Longitude:</strong>
55
+ <%= @object.longitude %>
56
+ </p>
57
+
58
+ <p>
59
+ <strong>Openings:</strong>
60
+ <%= @object.openings %>
61
+ </p>
62
+
63
+ <p>
64
+ <strong>Rates:</strong>
65
+ <%= @object.rates %>
66
+ </p>
67
+
68
+ <p>
69
+ <strong>Reservation:</strong>
70
+ <%= @object.reservation %>
71
+ </p>
72
+
73
+ <%= link_to 'Edit', edit_object_path(@object) %> |
74
+ <%= link_to 'Back', objects_path %>
@@ -0,0 +1,29 @@
1
+ <%= form_for(@selection) do |f| %>
2
+ <% if @selection.errors.any? %>
3
+ <div id="error_explanation">
4
+ <h2><%= pluralize(@selection.errors.count, "error") %> prohibited this selection from being saved:</h2>
5
+
6
+ <ul>
7
+ <% @selection.errors.full_messages.each do |message| %>
8
+ <li><%= message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div class="field">
15
+ <%= f.label :label %><br>
16
+ <%= f.text_field :label %>
17
+ </div>
18
+ <div class="field">
19
+ <%= f.label :reference %><br>
20
+ <%= f.text_field :reference %>
21
+ </div>
22
+ <div class="field">
23
+ <%= f.label :apidae_id %><br>
24
+ <%= f.number_field :apidae_id %>
25
+ </div>
26
+ <div class="actions">
27
+ <%= f.submit %>
28
+ </div>
29
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h1>Editing Selection</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Show', @selection %> |
6
+ <%= link_to 'Back', selections_path %>
@@ -0,0 +1,31 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <h1>Listing Selections</h1>
4
+
5
+ <table>
6
+ <thead>
7
+ <tr>
8
+ <th>Label</th>
9
+ <th>Reference</th>
10
+ <th>Apidae</th>
11
+ <th colspan="3"></th>
12
+ </tr>
13
+ </thead>
14
+
15
+ <tbody>
16
+ <% @selections.each do |selection| %>
17
+ <tr>
18
+ <td><%= selection.label %></td>
19
+ <td><%= selection.reference %></td>
20
+ <td><%= selection.apidae_id %></td>
21
+ <td><%= link_to 'Show', selection %></td>
22
+ <td><%= link_to 'Edit', edit_selection_path(selection) %></td>
23
+ <td><%= link_to 'Destroy', selection, method: :delete, data: { confirm: 'Are you sure?' } %></td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+
29
+ <br>
30
+
31
+ <%= link_to 'New Selection', new_selection_path %>
@@ -0,0 +1,5 @@
1
+ <h1>New Selection</h1>
2
+
3
+ <%= render 'form' %>
4
+
5
+ <%= link_to 'Back', selections_path %>
@@ -0,0 +1,19 @@
1
+ <p id="notice"><%= notice %></p>
2
+
3
+ <p>
4
+ <strong>Label:</strong>
5
+ <%= @selection.label %>
6
+ </p>
7
+
8
+ <p>
9
+ <strong>Reference:</strong>
10
+ <%= @selection.reference %>
11
+ </p>
12
+
13
+ <p>
14
+ <strong>Apidae:</strong>
15
+ <%= @selection.apidae_id %>
16
+ </p>
17
+
18
+ <%= link_to 'Edit', edit_selection_path(@selection) %> |
19
+ <%= link_to 'Back', selections_path %>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Apidae</title>
5
+ <%= stylesheet_link_tag "apidae/application", media: "all" %>
6
+ <%= javascript_include_tag "apidae/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,4 @@
1
+ Apidae::Engine.routes.draw do
2
+ resources :objects
3
+ resources :selections
4
+ end