apidae 1.0.4 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0603f295a6946a070d13d9a70813840de04bc155
4
- data.tar.gz: 9e15a59b156bad347b5d0cec0625fdb6ddca2c38
3
+ metadata.gz: 2ec3c909a4d3a0cf9b9312db0b7f94e5a58c42d2
4
+ data.tar.gz: 3c7ce15d9d02a27d97567f4da56e3634068fcb23
5
5
  SHA512:
6
- metadata.gz: 960c0cc9dcbbca0b5a290b4d44b60ca10b81271b55050d27ac6d279680d77233221720e117f5b2d7193824856e75d8cf842880625cda9d6b7a29fc94bde2b05b
7
- data.tar.gz: 4dacb5596fad4f0824c76e1a2f4fd9f124f12399fbd753401e5ff3deea084b12ca087e83985dea9e7c5e9e3ee0725a315af69417a205ae7d8f9a186734b1e871
6
+ metadata.gz: 2959dc04c3a7763578402a35a219a7bdb5888e114288343c654cba7d4a8e4d57b5cdceaf39a3de1ecf292c22d89a11186dfb05bc27f04108ac5cea5b2557c79a
7
+ data.tar.gz: 4b6dc11085319946637ac528feafdff08d66e4a1f80276734919f26960a51b5404787461bf22a461f8ff7abee2cc36df068a576b4eeec514164e2ea2655313f9
@@ -13,3 +13,12 @@
13
13
  *= require_tree .
14
14
  *= require_self
15
15
  */
16
+
17
+ #apidae_imports_panel > a:first-child {
18
+ float: right;
19
+ }
20
+
21
+ #apidae_form label {
22
+ font-size: 18px;
23
+ margin-right: 1rem;
24
+ }
@@ -16,7 +16,6 @@ module Apidae
16
16
  @objects = SelectionObject.where(apidae_selection_id: selections.map {|s| s.id}.uniq).map {|so| so.apidae_object_id}.uniq.count
17
17
  @last_imports = FileImport.where(apidae_id: apidae_user.apidae_projects_ids).order(id: :desc).take(100)
18
18
  end
19
- @references = Reference.count
20
19
  end
21
20
  end
22
21
  end
@@ -37,34 +37,67 @@ module Apidae
37
37
  def run
38
38
  success = true
39
39
  Export.pending.each do |e|
40
- begin
41
- open(e.file_url) do |f|
42
- begin
43
- FileImport.import(f, e.project_id)
40
+ success &&= import_data(e)
41
+ end
42
+ success ? head(:ok) : head(:internal_server_error)
43
+ end
44
+
45
+ def new
46
+ @export = Export.new(status: Export::PENDING)
47
+ end
48
+
49
+ def create
50
+ @export = Export.new(export_params)
51
+ if @export.save && import_data(@export)
52
+ redirect_to apidae.root_url, notice: 'Le fichier a bien été importé.'
53
+ else
54
+ flash.now[:alert] = "Une erreur s'est produite lors de l'import du fichier."
55
+ render :new
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def export_params
62
+ params.require(:export).permit(:project_id, :file_url, :status)
63
+ end
64
+
65
+ def import_data(e)
66
+ success = true
67
+ begin
68
+ open(e.file_url) do |f|
69
+ begin
70
+ FileImport.import(f, e.project_id)
71
+ unless e.confirm_url.blank?
44
72
  uri = URI(e.confirm_url)
45
73
  req = Net::HTTP::Post.new(uri)
46
74
  Net::HTTP.start(uri.hostname, uri.port) do |http|
47
75
  http.request(req)
48
76
  end
49
- e.update(status: Export::COMPLETE)
50
- if Rails.application.config.respond_to?(:apidae_import_callback)
51
- Rails.application.config.apidae_import_callback.call(e)
52
- end
53
- rescue Exception => ex
54
- logger.error("Failed to import export file : #{e.file_url}")
55
- logger.error("Error is : #{ex} \n#{ex.backtrace.join("\n") unless ex.backtrace.blank?}")
56
- success = false
57
- e.update(status: Export::CANCELLED)
58
77
  end
78
+ e.update(status: Export::COMPLETE)
79
+ if Rails.application.config.respond_to?(:apidae_import_callback)
80
+ Rails.application.config.apidae_import_callback.call(e)
81
+ end
82
+ rescue Exception => ex
83
+ logger.error("Failed to import export file : #{e.file_url}")
84
+ logger.error("Error is : #{ex} \n#{ex.backtrace.join("\n") unless ex.backtrace.blank?}")
85
+ success = false
86
+ e.update(status: Export::CANCELLED)
59
87
  end
60
- rescue OpenURI::HTTPError => err
61
- logger.error("Failed to download export file : #{e.file_url}")
62
- logger.error("Error is : #{err}")
63
- success = false
64
- e.update(status: Export::CANCELLED)
65
88
  end
89
+ rescue OpenURI::HTTPError => err
90
+ logger.error("Failed to download export file : #{e.file_url}")
91
+ logger.error("Error is : #{err}")
92
+ success = false
93
+ e.update(status: Export::CANCELLED)
94
+ rescue Exception => e
95
+ logger.error "Failed to import file : #{e.file_url}"
96
+ logger.error("Error is : #{err}")
97
+ success = false
98
+ e.update(status: Export::CANCELLED)
66
99
  end
67
- success ? head(:ok) : head(:internal_server_error)
100
+ success
68
101
  end
69
102
  end
70
103
  end
@@ -62,9 +62,19 @@ module Apidae
62
62
 
63
63
  def refresh
64
64
  referrer = (session.delete(:referrer) || objects_url)
65
- if @obj && @obj.selections.first.add_or_refresh_obj(@obj.apidae_id)
66
- redirect_to referrer, notice: "L'objet touristique a bien été mis à jour."
67
- else
65
+ begin
66
+ if @obj && @obj.selections.first.add_or_refresh_obj(@obj.apidae_id)
67
+ redirect_to referrer, notice: "L'objet touristique a bien été mis à jour."
68
+ else
69
+ redirect_to referrer, alert: "Une erreur s'est produite lors de la mise à jour de l'objet."
70
+ end
71
+ rescue OpenURI::HTTPError => err
72
+ logger.error("Failed to refresh obj : #{@obj.apidae_id}")
73
+ logger.error("Error is : #{err}")
74
+ redirect_to referrer, alert: "Une erreur s'est produite lors de la mise à jour de l'objet. Veuillez vérifier que le projet Apidae comporte une clé API valide."
75
+ rescue Exception => ex
76
+ logger.error("Failed to refresh obj : #{@obj.apidae_id}")
77
+ logger.error("Error is : #{err}")
68
78
  redirect_to referrer, alert: "Une erreur s'est produite lors de la mise à jour de l'objet."
69
79
  end
70
80
  end
@@ -3,6 +3,7 @@ require_dependency "apidae/application_controller"
3
3
  module Apidae
4
4
  class ProjectsController < ApplicationController
5
5
  before_action :set_project, only: [:edit, :update, :destroy]
6
+ skip_before_action :check_user_data!, only: [:create]
6
7
 
7
8
  def index
8
9
  if user_is_admin?
@@ -24,7 +25,7 @@ module Apidae
24
25
  else
25
26
  @project = Project.new(project_params)
26
27
  if @project.save
27
- referrer = (session.delete(:referrer) || projects_url)
28
+ referrer = params[:redirect_to] || session.delete(:referrer) || projects_url
28
29
  redirect_to (referrer + "?apidae_project_id=#{@project.id}"), notice: 'Le projet a bien été créé'
29
30
  else
30
31
  flash.now[:alert] = "Une erreur s'est produite lors la création du projet"
@@ -54,7 +55,7 @@ module Apidae
54
55
 
55
56
  def update_project
56
57
  if @project.update(project_params)
57
- referrer = session.delete(:referrer)
58
+ referrer = params[:redirect_to] || session.delete(:referrer)
58
59
  redirect_to (referrer + "?apidae_project_id=#{@project.id}"), notice: 'Le projet a bien été mis à jour'
59
60
  else
60
61
  flash.now[:alert] = "Une erreur s'est produite lors la mise à jour du projet"
@@ -9,6 +9,23 @@ module Apidae
9
9
  TWITTER = 3755
10
10
  YELP = 4007
11
11
  TRIP_ADVISOR = 4000
12
+ FAX = 202
13
+ MOBILE_WEBSITE = 3769
14
+ SHORTY_URL = 4923
15
+
16
+ CONTACTS_MAP = {
17
+ 'telephone' => PHONE,
18
+ 'email' => EMAIL,
19
+ 'website' => WEBSITE,
20
+ 'facebook' => FACEBOOK,
21
+ 'google' => GOOGLE,
22
+ 'trip_advisor' => TRIP_ADVISOR,
23
+ 'twitter' => TWITTER,
24
+ 'yelp' => YELP,
25
+ 'fax' => FAX,
26
+ 'mobile_website' => MOBILE_WEBSITE,
27
+ 'shorty_url' => SHORTY_URL
28
+ }
12
29
 
13
30
  MODE_AUTO = 'auto'
14
31
  MODE_MANUAL = 'manual'
@@ -114,7 +131,7 @@ module Apidae
114
131
  url: pic[:traductionFichiers][0][:url].gsub('http:', 'https:'),
115
132
  description: localized_value(pic, :legende, locale),
116
133
  credits: localized_value(pic, :copyright, locale),
117
- expiration_date: pic[:dateLimiteDePublication]
134
+ expiration_date: pic[:dateLimiteDePublication] || ''
118
135
  }
119
136
  end
120
137
  end
@@ -149,29 +166,38 @@ module Apidae
149
166
  contact_entries.each do |c|
150
167
  case c[:type][:id]
151
168
  when PHONE, ALT_PHONE
152
- contact_details[:telephone] ||= []
153
- contact_details[:telephone] << c[:coordonnees][:fr]
169
+ contact_details[:telephone] ||= {}
170
+ contact_details[:telephone][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
154
171
  when EMAIL
155
- contact_details[:email] ||= []
156
- contact_details[:email] << c[:coordonnees][:fr]
172
+ contact_details[:email] ||= {}
173
+ contact_details[:email][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
157
174
  when WEBSITE
158
- contact_details[:website] ||= []
159
- contact_details[:website] << c[:coordonnees][:fr]
175
+ contact_details[:website] ||= {}
176
+ contact_details[:website][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
160
177
  when GOOGLE
161
- contact_details[:google] ||= []
162
- contact_details[:google] << c[:coordonnees][:fr]
178
+ contact_details[:google] ||= {}
179
+ contact_details[:google][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
163
180
  when FACEBOOK
164
- contact_details[:facebook] ||= []
165
- contact_details[:facebook] << c[:coordonnees][:fr]
181
+ contact_details[:facebook] ||= {}
182
+ contact_details[:facebook][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
166
183
  when TWITTER
167
- contact_details[:twitter] ||= []
168
- contact_details[:twitter] << c[:coordonnees][:fr]
184
+ contact_details[:twitter] ||= {}
185
+ contact_details[:twitter][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
169
186
  when YELP
170
- contact_details[:yelp] ||= []
171
- contact_details[:yelp] << c[:coordonnees][:fr]
187
+ contact_details[:yelp] ||= {}
188
+ contact_details[:yelp][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
172
189
  when TRIP_ADVISOR
173
- contact_details[:trip_advisor] ||= []
174
- contact_details[:trip_advisor] << c[:coordonnees][:fr]
190
+ contact_details[:trip_advisor] ||= {}
191
+ contact_details[:trip_advisor][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
192
+ when FAX
193
+ contact_details[:fax] ||= {}
194
+ contact_details[:fax][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
195
+ when MOBILE_WEBSITE
196
+ contact_details[:mobile_website] ||= {}
197
+ contact_details[:mobile_website][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
198
+ when SHORTY_URL
199
+ contact_details[:shorty_url] ||= {}
200
+ contact_details[:shorty_url][c[:identifiant]] = {value: c[:coordonnees][:fr], description: c.dig(:observation, :libelleFr)}
175
201
  else
176
202
  end
177
203
  end
@@ -339,6 +365,7 @@ module Apidae
339
365
  external_id: o[:identifiantTechnique],
340
366
  start_date: o[:dateDebut],
341
367
  end_date: o[:dateFin],
368
+ each_year: o[:tousLesAns],
342
369
  closing_days: closing_days.blank? ? [] : closing_days.map {|d| d[:dateSpeciale]},
343
370
  details: node_value(o, :complementHoraire, *locales),
344
371
  time_periods: [
@@ -5,6 +5,17 @@ module Apidae
5
5
  COMPLETE = 'complete'
6
6
  CANCELLED = 'cancelled'
7
7
 
8
+ validates_presence_of :file_url, :project_id
9
+
10
+ before_save :normalize_url
11
+
12
+ def normalize_url
13
+ self.file_url = file_url.strip
14
+ unless file_url.include?('/')
15
+ self.file_url = "http://export.apidae-tourisme.com/exports/#{file_url}"
16
+ end
17
+ end
18
+
8
19
  # Note : handle reset case
9
20
  def self.pending
10
21
  where(remote_status: 'SUCCESS', status: PENDING).order(:id)
@@ -16,7 +16,8 @@ module Apidae
16
16
  store_accessor :type_data, :categories, :themes, :capacity, :classification, :labels, :chains, :area, :track,
17
17
  :products, :audience, :animals, :animals_desc, :extra, :duration, :certifications, :business
18
18
  store_accessor :entity_data, :entity_id, :entity_name, :service_provider_id
19
- store_accessor :contact_data, :telephone, :email, :website, :google, :facebook, :twitter, :yelp, :trip_advisor, :contacts
19
+ store_accessor :contact_data, :telephone, :email, :website, :google, :facebook, :twitter, :yelp, :trip_advisor, :fax,
20
+ :mobile_website, :shorty_url, :contacts
20
21
  store_accessor :location_data, :address, :place, :latitude, :longitude, :access, :territories, :environments
21
22
  store_accessor :openings_data, :openings_desc, :openings_desc_mode, :openings, :time_periods, :openings_extra
22
23
  store_accessor :rates_data, :rates_desc, :rates_desc_mode, :rates, :payment_methods, :includes, :excludes
@@ -3,13 +3,20 @@
3
3
  <%= link_to pluralize(@projects, 'projet', 'projets'), apidae.projects_path, class: styles[:projects] %>
4
4
  <%= link_to pluralize(@selections, 'sélection', 'sélections'), apidae.selections_path, class: styles[:selections] %>
5
5
  <%= link_to pluralize(@objects, 'objet touristique', 'objets touristiques'), apidae.objects_path, class: styles[:objects] %>
6
- <%= link_to (pluralize(@references, 'élément', 'éléments') + ' de référence'), apidae.references_path, class: styles[:references] %>
7
6
  <%= link_to 'Retour', :back, class: styles[:back] %>
8
7
  <h1 class="<%= styles[:h1] %>">Apidae</h1>
9
8
  </div>
10
9
  <div id="apidae_dashboard" class="<%= styles[:wrapper] %>">
11
10
  <div id="apidae_imports_panel" class="<%= styles[:body] %>">
11
+ <%= link_to 'Importer un fichier', apidae.import_new_path, class: styles[:projects] %>
12
12
  <h2 class="<%= styles[:h2] %>">Derniers imports</h2>
13
+ <p>
14
+ Les imports provenant de vos projets Apidae apparaîtront ci-dessous. Pour que les données soient importées correctement,
15
+ vos projets doivent être configurés pour exporter les données au format <strong>JSON V2</strong>, en
16
+ <strong>groupant les objets exportés</strong>.<br/>
17
+ Si vous souhaitez que chaque export soit récupéré automatiquement, veillez à renseigner le paramètre
18
+ <strong>Url de notification</strong> avec la valeur <strong><%= apidae.import_callback_url %></strong>.
19
+ </p>
13
20
  <table id="apidae_imports" class="<%= styles[:table] %>">
14
21
  <thead class="<%= styles[:table_head] %>">
15
22
  <tr>
@@ -0,0 +1,30 @@
1
+ <%= form_for(@export, url: apidae.import_create_path, method: :post, html: {class: styles[:form]}) do |f| %>
2
+ <% if @export.errors.any? %>
3
+ <div id="apidae_form_errors">
4
+ <ul>
5
+ <% @export.errors.full_messages.each do |message| %>
6
+ <li><%= message %></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
10
+ <% end %>
11
+ <p>
12
+ Pour que les données soient importées correctement, vos projets doivent être configurés pour exporter les données
13
+ au format <strong>JSON V2</strong>, en <strong>groupant les objets exportés</strong>. L'adresse du fichier d'export
14
+ est à récupérer dans :<br/>
15
+ <em>Page du projet Apidae > Onglet "Calcul des sélections et Exports " > Accéder à la ficher de l'export > Champ "Fichier d'export"</em>
16
+ </p>
17
+
18
+ <div class="<%= styles[:form_field] %>">
19
+ <div><%= f.label :project_id %></div>
20
+ <div><%= f.text_field :project_id, placeholder: "Ex: 1234" %></div>
21
+ </div>
22
+ <div class="<%= styles[:form_field] %>">
23
+ <div><%= f.label :file_url %></div>
24
+ <div><%= f.text_field :file_url, placeholder: "Ex: http://export.apidae-tourisme.com/exports/1234_20200101-5678_ABCdef.zip" %></div>
25
+ </div>
26
+ <%= f.hidden_field :status %>
27
+ <div class="<%= styles[:form_actions] %>">
28
+ <%= f.submit 'Valider' %> | <%= link_to 'Retour', :back, class: styles[:back] %>
29
+ </div>
30
+ <% end %>
@@ -0,0 +1,11 @@
1
+ <%= render layout: "/layouts/#{Rails.application.config.apidae_layout}" do |styles| %>
2
+ <div id="apidae_header" class="<%= styles[:header] %>">
3
+ <%= link_to 'Retour', :back, class: styles[:back] %>
4
+ <h1 class="<%= styles[:h1] %>">Apidae - Importer un fichier de données</h1>
5
+ </div>
6
+ <div id="apidae_import" class="<%= styles[:wrapper] %>">
7
+ <div id="apidae_form" class="<%= styles[:body] %>">
8
+ <%= render 'form', styles: styles %>
9
+ </div>
10
+ </div>
11
+ <% end %>
@@ -10,12 +10,21 @@ fr:
10
10
  apidae/obj:
11
11
  apidae_id: Identifiant Apidae
12
12
  selection_apidae_id: Sélection Apidae
13
+ apidae/export:
14
+ project_id: Identifiant du projet
15
+ file_url: URL du fichier d'export
13
16
  errors:
14
17
  models:
15
18
  apidae/project:
16
19
  attributes:
17
20
  apidae_id:
18
21
  taken: Un projet avec cet identifiant Apidae existe déjà.
22
+ apidae/export:
23
+ attributes:
24
+ file_url:
25
+ blank: est requise
26
+ project_id:
27
+ blank: est requis
19
28
  apidae:
20
29
  file_import:
21
30
  status:
@@ -15,6 +15,8 @@ Apidae::Engine.routes.draw do
15
15
 
16
16
  match 'import/callback', via: :post, to: 'import#callback'
17
17
  match 'import/run', via: :post, to: 'import#run'
18
+ match 'import/new', via: :get, to: 'import#new'
19
+ match 'import/create', via: :post, to: 'import#create'
18
20
 
19
21
  root to: 'dashboard#index'
20
22
  end
@@ -1,3 +1,3 @@
1
1
  module Apidae
2
- VERSION = "1.0.4"
2
+ VERSION = "1.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apidae
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Baptiste Vilain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-28 00:00:00.000000000 Z
11
+ date: 2020-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -106,7 +106,9 @@ files:
106
106
  - app/models/apidae/selection_object.rb
107
107
  - app/models/apidae/town.rb
108
108
  - app/views/apidae/dashboard/index.html.erb
109
+ - app/views/apidae/import/_form.html.erb
109
110
  - app/views/apidae/import/callback.html.erb
111
+ - app/views/apidae/import/new.html.erb
110
112
  - app/views/apidae/objects/_form.html.erb
111
113
  - app/views/apidae/objects/edit.html.erb
112
114
  - app/views/apidae/objects/index.html.erb