apidae 0.11.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/apidae/application_controller.rb +19 -0
- data/app/controllers/apidae/dashboard_controller.rb +13 -4
- 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 +376 -0
- data/app/models/apidae/obj.rb +19 -337
- 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/lib/apidae/version.rb +1 -1
- data/test/dummy/db/schema.rb +2 -2
- data/test/dummy/log/test.log +1864 -0
- metadata +6 -4
data/app/models/apidae/obj.rb
CHANGED
@@ -16,7 +16,7 @@ module Apidae
|
|
16
16
|
store_accessor :type_data, :categories, :themes, :capacity, :classification, :labels, :chains, :area, :track,
|
17
17
|
:products, :audience, :animals, :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, :contacts
|
20
20
|
store_accessor :location_data, :address, :place, :latitude, :longitude, :access, :territories, :environments
|
21
21
|
store_accessor :openings_data, :openings_desc, :openings_desc_mode, :openings, :time_periods
|
22
22
|
store_accessor :rates_data, :rates_desc, :rates_desc_mode, :rates, :payment_methods, :includes, :excludes
|
@@ -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
|
@@ -149,7 +142,7 @@ module Apidae
|
|
149
142
|
version_data[:type] = apidae_obj.apidae_type
|
150
143
|
version_obj = apidae_obj.in_version(version) || Obj.new(apidae_id: apidae_obj.apidae_id,
|
151
144
|
root_obj_id: apidae_obj.id, version: version)
|
152
|
-
version_obj.versioned_fields = parse_versioned_fields(version_data)
|
145
|
+
version_obj.versioned_fields = ApidaeDataParser.parse_versioned_fields(version_data)
|
153
146
|
populate_fields(version_obj, version_data, locales)
|
154
147
|
version_obj.save!
|
155
148
|
end
|
@@ -161,299 +154,31 @@ module Apidae
|
|
161
154
|
def self.populate_fields(apidae_obj, object_data, locales)
|
162
155
|
type_fields = TYPES_DATA[object_data[:type]]
|
163
156
|
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?
|
157
|
+
apidae_obj.owner_data = ApidaeDataParser.parse_owner_data(object_data[:gestion][:membreProprietaire]) unless object_data[:gestion].blank?
|
165
158
|
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]],
|
159
|
+
apidae_obj.apidae_subtype = ApidaeDataParser.node_id(object_data[type_fields[:node]], type_fields[:subtype])
|
160
|
+
apidae_obj.title_data = ApidaeDataParser.parse_title(object_data, *locales)
|
161
|
+
apidae_obj.description_data = ApidaeDataParser.parse_desc_data(object_data[:presentation], object_data[:donneesPrivees], *locales)
|
162
|
+
apidae_obj.contact_data = ApidaeDataParser.parse_contact_data(object_data[:informations], object_data[:contacts])
|
163
|
+
apidae_obj.location_data = ApidaeDataParser.parse_location_data(object_data[:localisation], object_data[type_fields[:node]],
|
171
164
|
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],
|
165
|
+
apidae_obj.town = ApidaeDataParser.parse_town(object_data[:localisation])
|
166
|
+
apidae_obj.openings_data = ApidaeDataParser.parse_openings(object_data[:ouverture], *locales)
|
167
|
+
apidae_obj.rates_data = ApidaeDataParser.parse_rates(object_data[:descriptionTarif], *locales)
|
168
|
+
apidae_obj.booking_data = ApidaeDataParser.parse_booking(object_data[:reservation], *locales)
|
169
|
+
apidae_obj.type_data = ApidaeDataParser.parse_type_data(apidae_obj, object_data[type_fields[:node]], object_data[:prestations],
|
177
170
|
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])
|
171
|
+
apidae_obj.pictures_data = ApidaeDataParser.parse_pictures_data(object_data[:illustrations], *locales)
|
172
|
+
apidae_obj.attachments_data = ApidaeDataParser.parse_attachments_data(object_data[:multimedias], *locales)
|
173
|
+
apidae_obj.entity_data = ApidaeDataParser.parse_entity_fields(object_data[:informations], object_data[type_fields[:node]])
|
174
|
+
apidae_obj.service_data = ApidaeDataParser.parse_service_data(object_data[:prestations], object_data[type_fields[:node]])
|
175
|
+
apidae_obj.tags_data = ApidaeDataParser.parse_tags_data(object_data[:presentation], object_data[:criteresInternes], object_data[:liens])
|
183
176
|
apidae_obj.meta_data = object_data[:metadonnees]
|
184
177
|
end
|
185
178
|
|
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
179
|
def contact_text
|
455
180
|
entries = []
|
456
|
-
JSON.parse(
|
181
|
+
JSON.parse(contact_data).each_pair do |k, v|
|
457
182
|
entries << "#{k}: #{v}"
|
458
183
|
end
|
459
184
|
entries.join("\n")
|
@@ -462,48 +187,5 @@ module Apidae
|
|
462
187
|
def main_picture
|
463
188
|
pictures.blank? ? "/#{Rails.application.config.apidae_pictures_path}/default/logo.png" : pictures[0]["url"].gsub('http:', 'https:')
|
464
189
|
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
190
|
end
|
509
191
|
end
|
@@ -1,18 +1,17 @@
|
|
1
1
|
class MigrateLocalizedApidaeObjFields < ActiveRecord::Migration[5.2]
|
2
2
|
def change
|
3
|
-
# Todo
|
4
3
|
Apidae::Obj.all.each do |o|
|
5
|
-
o.
|
6
|
-
o.
|
4
|
+
o.set_short_desc({'fr' => o.description_data['short_desc']}) unless (o.description_data.blank? || !o.description_data.has_key?('short_desc') || o.description_data['short_desc'].is_a?(Hash))
|
5
|
+
o.set_long_desc({'fr' => o.description_data['long_desc']}) unless (o.description_data.blank? || !o.description_data.has_key?('long_desc') || o.description_data['long_desc'].is_a?(Hash))
|
7
6
|
o.theme_desc = {'fr' => o.description_data['theme_desc']} unless (o.description_data.blank? || !o.description_data.has_key?('theme_desc') || o.description_data['theme_desc'].is_a?(Hash))
|
8
7
|
o.private_desc = {'fr' => o.description_data['private_desc']} unless (o.description_data.blank? || !o.description_data.has_key?('private_desc') || o.description_data['private_desc'].is_a?(Hash))
|
9
|
-
o.
|
10
|
-
o.
|
11
|
-
o.
|
12
|
-
o.
|
13
|
-
o.
|
14
|
-
o.
|
15
|
-
o.
|
8
|
+
o.set_pictures({'fr' => o.pictures_data['pictures']}) unless (o.pictures_data.blank? || !o.pictures_data.has_key?('pictures') || o.pictures_data['pictures'].is_a?(Hash))
|
9
|
+
o.set_attachments({'fr' => o.attachments_data['attachments']}) unless (o.attachments_data.blank? || !o.attachments_data.has_key?('attachments') || o.attachments_data['attachments'].is_a?(Hash))
|
10
|
+
o.set_openings_desc({'fr' => o.openings_data['openings_desc']}) unless (o.openings_data.blank? || !o.openings_data.has_key?('openings_desc') || o.openings_data['openings_desc'].is_a?(Hash))
|
11
|
+
o.set_rates_desc({'fr' => o.rates_data['rates_desc']}) unless (o.rates_data.blank? || !o.rates_data.has_key?('rates_desc') || o.rates_data['rates_desc'].is_a?(Hash))
|
12
|
+
o.set_includes({'fr' => o.rates_data['includes']}) unless (o.rates_data.blank? || !o.rates_data.has_key?('includes') || o.rates_data['includes'].is_a?(Hash))
|
13
|
+
o.set_excludes({'fr' => o.rates_data['excludes']}) unless (o.rates_data.blank? || !o.rates_data.has_key?('excludes') || o.rates_data['excludes'].is_a?(Hash))
|
14
|
+
o.set_extra({'fr' => o.type_data['extra']}) unless (o.type_data.blank? || !o.type_data.has_key?('extra') || o.type_data['extra'].is_a?(Hash))
|
16
15
|
o.save!
|
17
16
|
end
|
18
17
|
end
|
data/lib/apidae/version.rb
CHANGED
data/test/dummy/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 2020_05_22_124205) do
|
14
14
|
|
15
15
|
# These are extensions that must be enabled in order to support this database
|
16
16
|
enable_extension "plpgsql"
|
@@ -47,7 +47,7 @@ ActiveRecord::Schema.define(version: 2020_03_12_150904) do
|
|
47
47
|
t.integer "apidae_id"
|
48
48
|
t.string "apidae_type"
|
49
49
|
t.string "apidae_subtype"
|
50
|
-
t.jsonb "
|
50
|
+
t.jsonb "contact_data"
|
51
51
|
t.jsonb "type_data"
|
52
52
|
t.jsonb "openings_data"
|
53
53
|
t.datetime "created_at", null: false
|