apidae 0.11.0 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/apidae/application.css +9 -0
- data/app/controllers/apidae/application_controller.rb +19 -0
- data/app/controllers/apidae/dashboard_controller.rb +13 -5
- data/app/controllers/apidae/import_controller.rb +48 -19
- data/app/controllers/apidae/objects_controller.rb +6 -1
- data/app/controllers/apidae/projects_controller.rb +5 -1
- data/app/controllers/apidae/selections_controller.rb +6 -1
- data/app/helpers/apidae/application_helper.rb +4 -0
- data/app/models/apidae/apidae_data_parser.rb +399 -0
- data/app/models/apidae/export.rb +2 -0
- data/app/models/apidae/obj.rb +33 -339
- data/app/models/apidae/reference.rb +5 -0
- data/app/views/apidae/dashboard/index.html.erb +8 -1
- data/app/views/apidae/import/_form.html.erb +29 -0
- data/app/views/apidae/import/new.html.erb +11 -0
- data/config/locales/apidae.fr.yml +27 -1
- data/config/routes.rb +2 -0
- data/db/migrate/20190127210921_migrate_localized_apidae_obj_fields.rb +9 -10
- data/db/migrate/20200522124205_rename_objs_contact_to_contact_data.rb +5 -0
- data/db/migrate/20200528101957_add_is_active_to_apidae_references.rb +6 -0
- data/lib/apidae/version.rb +1 -1
- data/test/dummy/db/schema.rb +2 -2
- data/test/dummy/log/test.log +1864 -0
- metadata +11 -6
data/app/models/apidae/export.rb
CHANGED
data/app/models/apidae/obj.rb
CHANGED
@@ -14,11 +14,11 @@ module Apidae
|
|
14
14
|
store_accessor :pictures_data, :pictures
|
15
15
|
store_accessor :attachments_data, :attachments
|
16
16
|
store_accessor :type_data, :categories, :themes, :capacity, :classification, :labels, :chains, :area, :track,
|
17
|
-
:products, :audience, :animals, :extra, :duration, :certifications, :business
|
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 :
|
19
|
+
store_accessor :contact_data, :telephone, :email, :website, :google, :facebook, :twitter, :yelp, :trip_advisor, :contacts
|
20
20
|
store_accessor :location_data, :address, :place, :latitude, :longitude, :access, :territories, :environments
|
21
|
-
store_accessor :openings_data, :openings_desc, :openings_desc_mode, :openings, :time_periods
|
21
|
+
store_accessor :openings_data, :openings_desc, :openings_desc_mode, :openings, :time_periods, :openings_extra
|
22
22
|
store_accessor :rates_data, :rates_desc, :rates_desc_mode, :rates, :payment_methods, :includes, :excludes
|
23
23
|
store_accessor :service_data, :services, :equipments, :comfort, :activities, :challenged, :languages
|
24
24
|
store_accessor :booking_data, :booking_desc, :booking_entities
|
@@ -96,13 +96,6 @@ module Apidae
|
|
96
96
|
TER => {node: :informationsTerritoire, subtype: :territoireType}
|
97
97
|
}
|
98
98
|
|
99
|
-
PHONE = 201
|
100
|
-
EMAIL = 204
|
101
|
-
WEBSITE = 205
|
102
|
-
|
103
|
-
MODE_AUTO = 'auto'
|
104
|
-
MODE_MANUAL = 'manual'
|
105
|
-
|
106
99
|
after_initialize do
|
107
100
|
@locale = DEFAULT_LOCALE
|
108
101
|
@obj_version = DEFAULT_VERSION
|
@@ -129,6 +122,18 @@ module Apidae
|
|
129
122
|
self
|
130
123
|
end
|
131
124
|
|
125
|
+
def dig(*keys)
|
126
|
+
root_key, *nested_keys = keys
|
127
|
+
root_val = self.send(root_key)
|
128
|
+
if root_val.blank?
|
129
|
+
nested_keys.blank? ? root_val : nil
|
130
|
+
elsif root_val.respond_to?(:dig)
|
131
|
+
root_val.dig(*nested_keys)
|
132
|
+
else
|
133
|
+
raise ArgumentError.new('Cannot call dig with these args')
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
132
137
|
def self.default_scope
|
133
138
|
where(root_obj_id: nil)
|
134
139
|
end
|
@@ -149,7 +154,7 @@ module Apidae
|
|
149
154
|
version_data[:type] = apidae_obj.apidae_type
|
150
155
|
version_obj = apidae_obj.in_version(version) || Obj.new(apidae_id: apidae_obj.apidae_id,
|
151
156
|
root_obj_id: apidae_obj.id, version: version)
|
152
|
-
version_obj.versioned_fields = parse_versioned_fields(version_data)
|
157
|
+
version_obj.versioned_fields = ApidaeDataParser.parse_versioned_fields(version_data)
|
153
158
|
populate_fields(version_obj, version_data, locales)
|
154
159
|
version_obj.save!
|
155
160
|
end
|
@@ -161,299 +166,31 @@ module Apidae
|
|
161
166
|
def self.populate_fields(apidae_obj, object_data, locales)
|
162
167
|
type_fields = TYPES_DATA[object_data[:type]]
|
163
168
|
apidae_obj.last_update = DateTime.parse(object_data[:gestion][:dateModification]) unless object_data[:gestion].blank?
|
164
|
-
apidae_obj.owner_data = parse_owner_data(object_data[:gestion][:membreProprietaire]) unless object_data[:gestion].blank?
|
169
|
+
apidae_obj.owner_data = ApidaeDataParser.parse_owner_data(object_data[:gestion][:membreProprietaire]) unless object_data[:gestion].blank?
|
165
170
|
apidae_obj.apidae_type = object_data[:type]
|
166
|
-
apidae_obj.apidae_subtype = node_id(object_data[type_fields[:node]], type_fields[:subtype])
|
167
|
-
apidae_obj.title_data = parse_title(object_data, *locales)
|
168
|
-
apidae_obj.description_data = parse_desc_data(object_data[:presentation], object_data[:donneesPrivees], *locales)
|
169
|
-
apidae_obj.
|
170
|
-
apidae_obj.location_data = parse_location_data(object_data[:localisation], object_data[type_fields[:node]],
|
171
|
+
apidae_obj.apidae_subtype = ApidaeDataParser.node_id(object_data[type_fields[:node]], type_fields[:subtype])
|
172
|
+
apidae_obj.title_data = ApidaeDataParser.parse_title(object_data, *locales)
|
173
|
+
apidae_obj.description_data = ApidaeDataParser.parse_desc_data(object_data[:presentation], object_data[:donneesPrivees], *locales)
|
174
|
+
apidae_obj.contact_data = ApidaeDataParser.parse_contact_data(object_data[:informations], object_data[:contacts])
|
175
|
+
apidae_obj.location_data = ApidaeDataParser.parse_location_data(object_data[:localisation], object_data[type_fields[:node]],
|
171
176
|
object_data[:territoires])
|
172
|
-
apidae_obj.town =
|
173
|
-
apidae_obj.openings_data = parse_openings(object_data[:ouverture], *locales)
|
174
|
-
apidae_obj.rates_data = parse_rates(object_data[:descriptionTarif], *locales)
|
175
|
-
apidae_obj.booking_data = parse_booking(object_data[:reservation], *locales)
|
176
|
-
apidae_obj.type_data = parse_type_data(apidae_obj, object_data[type_fields[:node]], object_data[:prestations],
|
177
|
+
apidae_obj.town = ApidaeDataParser.parse_town(object_data[:localisation])
|
178
|
+
apidae_obj.openings_data = ApidaeDataParser.parse_openings(object_data[:ouverture], *locales)
|
179
|
+
apidae_obj.rates_data = ApidaeDataParser.parse_rates(object_data[:descriptionTarif], *locales)
|
180
|
+
apidae_obj.booking_data = ApidaeDataParser.parse_booking(object_data[:reservation], *locales)
|
181
|
+
apidae_obj.type_data = ApidaeDataParser.parse_type_data(apidae_obj, object_data[type_fields[:node]], object_data[:prestations],
|
177
182
|
object_data[:tourismeAffaires], *locales)
|
178
|
-
apidae_obj.pictures_data = parse_pictures_data(object_data[:illustrations], *locales)
|
179
|
-
apidae_obj.attachments_data = parse_attachments_data(object_data[:multimedias], *locales)
|
180
|
-
apidae_obj.entity_data =
|
181
|
-
apidae_obj.service_data = parse_service_data(object_data[:prestations], object_data[type_fields[:node]])
|
182
|
-
apidae_obj.tags_data = parse_tags_data(object_data[:presentation], object_data[:criteresInternes], object_data[:liens])
|
183
|
+
apidae_obj.pictures_data = ApidaeDataParser.parse_pictures_data(object_data[:illustrations], *locales)
|
184
|
+
apidae_obj.attachments_data = ApidaeDataParser.parse_attachments_data(object_data[:multimedias], *locales)
|
185
|
+
apidae_obj.entity_data = ApidaeDataParser.parse_entity_fields(object_data[:informations], object_data[type_fields[:node]])
|
186
|
+
apidae_obj.service_data = ApidaeDataParser.parse_service_data(object_data[:prestations], object_data[type_fields[:node]])
|
187
|
+
apidae_obj.tags_data = ApidaeDataParser.parse_tags_data(object_data[:presentation], object_data[:criteresInternes], object_data[:liens])
|
183
188
|
apidae_obj.meta_data = object_data[:metadonnees]
|
184
189
|
end
|
185
190
|
|
186
|
-
def self.non_empty(data_hash)
|
187
|
-
data_hash.keep_if {|k, v| !v.blank?}
|
188
|
-
end
|
189
|
-
|
190
|
-
def self.parse_versioned_fields(data_hash)
|
191
|
-
version_fields = data_hash[:champsAspect] || []
|
192
|
-
matched_fields = []
|
193
|
-
version_fields.each do |f|
|
194
|
-
case f
|
195
|
-
when 'nom'
|
196
|
-
matched_fields << 'title'
|
197
|
-
when 'presentation.descriptifCourt'
|
198
|
-
matched_fields << 'short_desc'
|
199
|
-
when 'presentation.descriptifDetaille'
|
200
|
-
matched_fields << 'long_desc'
|
201
|
-
when 'illustrations'
|
202
|
-
matched_fields << 'pictures'
|
203
|
-
when 'multimedias'
|
204
|
-
matched_fields << 'attachments'
|
205
|
-
when 'informations.moyensCommunication'
|
206
|
-
matched_fields << 'contact'
|
207
|
-
when 'descriptifsThematises'
|
208
|
-
matched_fields << 'theme_desc'
|
209
|
-
when 'ouverture.periodesOuvertures', 'ouverture.periodeEnClair'
|
210
|
-
matched_fields << 'openings_desc'
|
211
|
-
matched_fields << 'openings'
|
212
|
-
when 'ouverture.periodeEnClairAutomatique'
|
213
|
-
matched_fields << 'openings_desc_mode'
|
214
|
-
when 'descriptionTarif.tarifsEnClair', 'descriptionTarif.periodes'
|
215
|
-
matched_fields << 'rates_desc'
|
216
|
-
matched_fields << 'rates'
|
217
|
-
when 'descriptionTarif.tarifsEnClairAutomatique'
|
218
|
-
matched_fields << 'rates_desc_mode'
|
219
|
-
when 'prestations.equipements'
|
220
|
-
matched_fields << 'equipments'
|
221
|
-
when 'prestations.activites'
|
222
|
-
matched_fields << 'activities'
|
223
|
-
when 'prestations.services'
|
224
|
-
matched_fields << 'services'
|
225
|
-
when 'localisation.environnements'
|
226
|
-
matched_fields << 'environments'
|
227
|
-
when 'prestations.complementAccueil'
|
228
|
-
matched_fields << 'extra'
|
229
|
-
when 'localisation.geolocalisation.complement'
|
230
|
-
matched_fields << 'access'
|
231
|
-
else
|
232
|
-
end
|
233
|
-
end
|
234
|
-
matched_fields.uniq
|
235
|
-
end
|
236
|
-
|
237
|
-
def self.parse_title(data_hash, *locales)
|
238
|
-
{title: node_value(data_hash, :nom, *locales)}
|
239
|
-
end
|
240
|
-
|
241
|
-
def self.parse_owner_data(data_hash)
|
242
|
-
unless data_hash.blank?
|
243
|
-
{owner_name: data_hash[:nom], owner_id: data_hash[:id]}
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
def self.parse_desc_data(data_hash, private_data, *locales)
|
248
|
-
unless data_hash.blank?
|
249
|
-
{
|
250
|
-
short_desc: node_value(data_hash, :descriptifCourt, *locales),
|
251
|
-
long_desc: node_value(data_hash, :descriptifDetaille, *locales),
|
252
|
-
theme_desc: data_hash[:descriptifsThematises].blank? ? {} : Hash[data_hash[:descriptifsThematises].map {|th| [node_id(th, :theme), node_value(th, :description, *locales)]}],
|
253
|
-
private_desc: private_data.blank? ? {} : Hash[private_data.map {|d| [d[:nomTechnique], node_value(d, :descriptif, *locales)]}]
|
254
|
-
}
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
def self.parse_pictures_data(pictures_array, *locales)
|
259
|
-
pics_data = {}
|
260
|
-
unless pictures_array.blank?
|
261
|
-
l = locales.blank? ? [DEFAULT_LOCALE] : locales
|
262
|
-
l.each do |locale|
|
263
|
-
pics_data[locale] = []
|
264
|
-
pictures_array.select { |p| p.is_a?(Hash) && !p[:traductionFichiers].blank? }.each do |pic|
|
265
|
-
pics_data[locale] << {
|
266
|
-
id: pic[:identifiant],
|
267
|
-
name: localized_value(pic, :nom, locale),
|
268
|
-
url: pic[:traductionFichiers][0][:url].gsub('http:', 'https:'),
|
269
|
-
description: localized_value(pic, :legende, locale),
|
270
|
-
credits: localized_value(pic, :copyright, locale),
|
271
|
-
expiration_date: pic[:dateLimiteDePublication]
|
272
|
-
}
|
273
|
-
end
|
274
|
-
end
|
275
|
-
end
|
276
|
-
{pictures: pics_data}
|
277
|
-
end
|
278
|
-
|
279
|
-
def self.parse_attachments_data(attachments_array, *locales)
|
280
|
-
atts_data = {}
|
281
|
-
unless attachments_array.blank?
|
282
|
-
l = locales.blank? ? [DEFAULT_LOCALE] : locales
|
283
|
-
l.each do |locale|
|
284
|
-
atts_data[locale] = []
|
285
|
-
attachments_array.select { |att| att.is_a?(Hash) && !att[:traductionFichiers].blank? }.each do |att|
|
286
|
-
atts_data[locale] << {
|
287
|
-
id: att[:identifiant],
|
288
|
-
name: localized_value(att, :nom, locale),
|
289
|
-
url: att[:traductionFichiers][0][:url].gsub('http:', 'https:'),
|
290
|
-
type: att[:type],
|
291
|
-
description: localized_value(att, :legende, locale)
|
292
|
-
}
|
293
|
-
end
|
294
|
-
end
|
295
|
-
end
|
296
|
-
{attachments: atts_data}
|
297
|
-
end
|
298
|
-
|
299
|
-
def self.contact(information_hash)
|
300
|
-
contact_details = {}
|
301
|
-
unless information_hash.blank?
|
302
|
-
contact_entries = information_hash[:moyensCommunication] || []
|
303
|
-
contact_entries.each do |c|
|
304
|
-
case c[:type][:id]
|
305
|
-
when PHONE
|
306
|
-
contact_details[:telephone] ||= []
|
307
|
-
contact_details[:telephone] << c[:coordonnees][:fr]
|
308
|
-
when EMAIL
|
309
|
-
contact_details[:email] ||= []
|
310
|
-
contact_details[:email] << c[:coordonnees][:fr]
|
311
|
-
when WEBSITE
|
312
|
-
contact_details[:website] ||= []
|
313
|
-
contact_details[:website] << c[:coordonnees][:fr]
|
314
|
-
else
|
315
|
-
end
|
316
|
-
end
|
317
|
-
end
|
318
|
-
contact_details
|
319
|
-
end
|
320
|
-
|
321
|
-
def self.parse_location_data(location_hash, type_data_hash, territories)
|
322
|
-
loc_data = {}
|
323
|
-
unless location_hash.blank?
|
324
|
-
address_hash = location_hash[:adresse]
|
325
|
-
computed_address = []
|
326
|
-
unless address_hash.blank?
|
327
|
-
computed_address << address_hash[:adresse1] unless address_hash[:adresse1].blank?
|
328
|
-
computed_address << address_hash[:adresse2] unless address_hash[:adresse2].blank?
|
329
|
-
computed_address << address_hash[:adresse3] unless address_hash[:adresse3].blank?
|
330
|
-
end
|
331
|
-
loc_data.merge!({address: computed_address})
|
332
|
-
loc_data.merge!({place: type_data_hash[:nomLieu]}) if type_data_hash
|
333
|
-
geoloc_details = location_hash[:geolocalisation]
|
334
|
-
if geoloc_details && geoloc_details[:valide] && geoloc_details[:geoJson]
|
335
|
-
loc_data[:latitude] = geoloc_details[:geoJson][:coordinates][1]
|
336
|
-
loc_data[:longitude] = geoloc_details[:geoJson][:coordinates][0]
|
337
|
-
end
|
338
|
-
loc_data[:access] = node_value(geoloc_details, :complement) if geoloc_details
|
339
|
-
loc_data[:environments] = location_hash[:environnements].map {|e| e[:id]} if location_hash[:environnements]
|
340
|
-
end
|
341
|
-
loc_data[:territories] = territories.map {|t| t[:id]} unless territories.blank?
|
342
|
-
loc_data
|
343
|
-
end
|
344
|
-
|
345
|
-
def self.town(location_hash)
|
346
|
-
if location_hash
|
347
|
-
address_hash = location_hash[:adresse]
|
348
|
-
(!address_hash.blank? && address_hash[:commune]) ? Town.find_by_apidae_id(address_hash[:commune][:id]) : nil
|
349
|
-
else
|
350
|
-
nil
|
351
|
-
end
|
352
|
-
end
|
353
|
-
|
354
|
-
# Note : use internal format for openings storage (ideally Apihours one, to merge data from both sources)
|
355
|
-
def self.parse_openings(openings_hash, *locales)
|
356
|
-
if openings_hash && openings_hash[:periodeEnClair]
|
357
|
-
{
|
358
|
-
openings_desc: node_value(openings_hash, :periodeEnClair, *locales),
|
359
|
-
openings_desc_mode: openings_hash[:periodeEnClairGenerationMode] == 'AUTOMATIQUE' ? MODE_AUTO : MODE_MANUAL,
|
360
|
-
openings: openings_hash[:periodesOuvertures],
|
361
|
-
time_periods: lists_ids(openings_hash[:indicationsPeriode])
|
362
|
-
}
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
def self.parse_rates(rates_hash, *locales)
|
367
|
-
if rates_hash
|
368
|
-
desc = rates_hash[:gratuit] ? {DEFAULT_LOCALE => 'gratuit'} : node_value(rates_hash, :tarifsEnClair, *locales)
|
369
|
-
values = rates_hash[:periodes].blank? ? [] : rates_hash[:periodes].map {|p| build_rate(p)}
|
370
|
-
methods = rates_hash[:modesPaiement].blank? ? [] : rates_hash[:modesPaiement].map {|p| p[:id]}
|
371
|
-
{
|
372
|
-
rates_desc: desc, rates: values, payment_methods: methods,
|
373
|
-
rates_desc_mode: rates_hash[:tarifsEnClairGenerationMode] == 'AUTOMATIQUE' ? MODE_AUTO : MODE_MANUAL,
|
374
|
-
includes: node_value(rates_hash, :leTarifComprend, *locales),
|
375
|
-
excludes: node_value(rates_hash, :leTarifNeComprendPas, *locales)
|
376
|
-
}
|
377
|
-
end
|
378
|
-
end
|
379
|
-
|
380
|
-
def self.parse_type_data(apidae_obj, type_hash, presta_hash, business_hash, *locales)
|
381
|
-
data_hash = type_hash || {}
|
382
|
-
prestations_hash = presta_hash || {}
|
383
|
-
apidae_obj.apidae_subtype = lists_ids(data_hash[:typesManifestation]).first if apidae_obj.apidae_type == FEM
|
384
|
-
apidae_obj.apidae_subtype = node_id(data_hash, :rubrique) if apidae_obj.apidae_type == EQU
|
385
|
-
apidae_obj.apidae_subtype = lists_ids(data_hash[:typesHebergement]).first if apidae_obj.apidae_type == SPA
|
386
|
-
{
|
387
|
-
categories: lists_ids(data_hash[:categories], data_hash[:typesDetailles], data_hash[:activiteCategories]),
|
388
|
-
themes: lists_ids(data_hash[:themes]),
|
389
|
-
capacity: (data_hash[:capacite] || {})
|
390
|
-
.merge(presta_hash ? {group_min: presta_hash[:tailleGroupeMin], group_max: presta_hash[:tailleGroupeMax],
|
391
|
-
age_min: presta_hash[:ageMin], age_max: presta_hash[:ageMax]} : {}),
|
392
|
-
classification: nodes_ids(data_hash[:classement], data_hash[:classementPrefectoral], data_hash[:classification]) +
|
393
|
-
lists_ids(data_hash[:classementsGuides]) + lists_ids(data_hash[:classements]),
|
394
|
-
labels: lists_ids(data_hash[:labels], data_hash[:labelsChartesQualite], prestations_hash[:labelsTourismeHandicap]) +
|
395
|
-
(node_id(data_hash, :typeLabel) ? [node_id(data_hash, :typeLabel)] : []),
|
396
|
-
chains: lists_ids(data_hash[:chaines]) + nodes_ids(data_hash[:chaineEtLabel]),
|
397
|
-
area: apidae_obj.apidae_type == DOS ? data_hash.except(:classification) : node_value(data_hash, :lieuDePratique),
|
398
|
-
track: apidae_obj.apidae_type == EQU ? data_hash[:itineraire] : nil,
|
399
|
-
products: lists_ids(data_hash[:typesProduit], data_hash[:aopAocIgps], data_hash[:specialites]),
|
400
|
-
audience: lists_ids(prestations_hash[:typesClientele]),
|
401
|
-
animals: prestations_hash[:animauxAcceptes] == 'ACCEPTES',
|
402
|
-
extra: apidae_obj.apidae_type == SPA ? node_value(data_hash, :formuleHebergement, *locales) : node_value(prestations_hash, :complementAccueil, *locales),
|
403
|
-
duration: apidae_obj.apidae_type == SPA ? {days: data_hash[:nombreJours], nights: data_hash[:nombreNuits]} : data_hash[:dureeSeance],
|
404
|
-
certifications: data_hash[:agrements].blank? ? [] : data_hash[:agrements].map {|a| {id: a[:type][:id], identifier: a[:numero]}},
|
405
|
-
business: business_hash
|
406
|
-
}
|
407
|
-
end
|
408
|
-
|
409
|
-
def self.parse_service_data(data_hash, type_data_hash)
|
410
|
-
if data_hash
|
411
|
-
{
|
412
|
-
services: lists_ids(data_hash[:services]),
|
413
|
-
equipments: lists_ids(data_hash[:equipements]),
|
414
|
-
comfort: lists_ids(data_hash[:conforts]),
|
415
|
-
activities: lists_ids(data_hash[:activites], type_data_hash ? type_data_hash[:activites] : [],
|
416
|
-
type_data_hash ? type_data_hash[:activitesSportives] : [],
|
417
|
-
type_data_hash ? type_data_hash[:activitesCulturelles] : []),
|
418
|
-
challenged: lists_ids(data_hash[:tourismesAdaptes]),
|
419
|
-
languages: lists_ids(data_hash[:languesParlees])
|
420
|
-
}
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
def self.parse_tags_data(pres_data_hash, crit_data_hash, linked_data_hash)
|
425
|
-
tags = {}
|
426
|
-
if pres_data_hash
|
427
|
-
tags[:promo] = lists_ids(pres_data_hash[:typologiesPromoSitra])
|
428
|
-
end
|
429
|
-
unless crit_data_hash.blank?
|
430
|
-
tags[:internal] = crit_data_hash.map {|c| c[:id]}
|
431
|
-
end
|
432
|
-
unless linked_data_hash.blank? || linked_data_hash[:liensObjetsTouristiquesTypes].blank?
|
433
|
-
tags[:linked] = linked_data_hash[:liensObjetsTouristiquesTypes]
|
434
|
-
.map {|l| {apidae_id: l[:objetTouristique][:id], apidae_type: l[:objetTouristique][:type], category: l[:type]}}
|
435
|
-
end
|
436
|
-
tags
|
437
|
-
end
|
438
|
-
|
439
|
-
def self.parse_booking(reservation_hash, *locales)
|
440
|
-
if reservation_hash
|
441
|
-
{
|
442
|
-
booking_desc: node_value(reservation_hash, :complement, *locales),
|
443
|
-
booking_entities: reservation_hash[:organismes]
|
444
|
-
}
|
445
|
-
end
|
446
|
-
end
|
447
|
-
|
448
|
-
def self.entity_fields(information_hash, type_data_hash)
|
449
|
-
if information_hash && information_hash[:structureGestion]
|
450
|
-
{entity_id: information_hash[:structureGestion][:id], service_provider_id: node_id(type_data_hash, :prestataireActivites)}
|
451
|
-
end
|
452
|
-
end
|
453
|
-
|
454
191
|
def contact_text
|
455
192
|
entries = []
|
456
|
-
JSON.parse(
|
193
|
+
JSON.parse(contact_data).each_pair do |k, v|
|
457
194
|
entries << "#{k}: #{v}"
|
458
195
|
end
|
459
196
|
entries.join("\n")
|
@@ -462,48 +199,5 @@ module Apidae
|
|
462
199
|
def main_picture
|
463
200
|
pictures.blank? ? "/#{Rails.application.config.apidae_pictures_path}/default/logo.png" : pictures[0]["url"].gsub('http:', 'https:')
|
464
201
|
end
|
465
|
-
|
466
|
-
def self.build_rate(rate_period)
|
467
|
-
{
|
468
|
-
id: rate_period[:identifiant], start_date: rate_period[:dateDebut], end_date: rate_period[:dateFin],
|
469
|
-
values: rate_period[:tarifs].blank? ? [] : rate_period[:tarifs].map {|t| {min: t[:minimum], max: t[:maximum], type: t[:type][:id], details: node_value(t, :precisionTarif)}}
|
470
|
-
}
|
471
|
-
end
|
472
|
-
|
473
|
-
private
|
474
|
-
|
475
|
-
def self.node_value(node, key, *locales)
|
476
|
-
l = locales.blank? ? [DEFAULT_LOCALE] : locales
|
477
|
-
locales_map = Hash[l.map {|loc| [localized_key(loc), loc]}]
|
478
|
-
if node && node[key]
|
479
|
-
node[key].slice(*locales_map.keys).transform_keys {|k| locales_map[k]}
|
480
|
-
else
|
481
|
-
{}
|
482
|
-
end
|
483
|
-
end
|
484
|
-
|
485
|
-
def self.localized_value(node, key, loc)
|
486
|
-
if node && node[key]
|
487
|
-
node[key][localized_key(loc)]
|
488
|
-
else
|
489
|
-
''
|
490
|
-
end
|
491
|
-
end
|
492
|
-
|
493
|
-
def self.node_id(node, key)
|
494
|
-
node[key][:id] if node && node[key]
|
495
|
-
end
|
496
|
-
|
497
|
-
def self.lists_ids(*lists)
|
498
|
-
lists.blank? ? [] : lists.map {|l| l.blank? ? [] : l.map {|elt| elt[:id]}}.flatten.uniq
|
499
|
-
end
|
500
|
-
|
501
|
-
def self.nodes_ids(*nodes)
|
502
|
-
nodes.blank? ? [] : nodes.select {|n| !n.blank?}.map {|n| n[:id]}
|
503
|
-
end
|
504
|
-
|
505
|
-
def self.localized_key(loc = DEFAULT_LOCALE)
|
506
|
-
"libelle#{loc.camelize.gsub('-', '')}".to_sym
|
507
|
-
end
|
508
202
|
end
|
509
203
|
end
|
@@ -5,6 +5,10 @@ module Apidae
|
|
5
5
|
|
6
6
|
store_accessor :meta_data, :category, :parent
|
7
7
|
|
8
|
+
def self.default_scope
|
9
|
+
where(is_active: true)
|
10
|
+
end
|
11
|
+
|
8
12
|
def self.import(refs_json)
|
9
13
|
locales = Rails.application.config.respond_to?(:apidae_locales) ? Rails.application.config.apidae_locales : [DEFAULT_LOCALE]
|
10
14
|
locales_map = Hash[locales.map {|loc| ["libelle#{loc.camelize.gsub('-', '')}".to_sym, loc]}]
|
@@ -15,6 +19,7 @@ module Apidae
|
|
15
19
|
ref.label_data = ref_data.slice(*locales_map.keys).transform_keys {|k| locales_map[k]}
|
16
20
|
ref.parent = ref_data[:parent][:id] if ref_data[:parent]
|
17
21
|
ref.category = ref_data[:familleCritere] ? ref_data[:familleCritere][:id] : (ref_data[:typeLabel] ? ref_data[:typeLabel][:id] : nil)
|
22
|
+
ref.is_active = ref_data[:actif]
|
18
23
|
ref.save!
|
19
24
|
end
|
20
25
|
end
|
@@ -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>
|