apidae 0.11.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 :contact, :telephone, :email, :website
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.contact = contact(object_data[:informations])
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 = town(object_data[:localisation])
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 = entity_fields(object_data[:informations], object_data[type_fields[:node]])
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(contact).each_pair do |k, v|
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.short_desc_hash = {'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))
6
- o.long_desc_hash = {'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))
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.pictures_hash = {'fr' => o.pictures_data['pictures']} unless (o.pictures_data.blank? || !o.pictures_data.has_key?('pictures') || o.pictures_data['pictures'].is_a?(Hash))
10
- o.attachments_hash = {'fr' => o.attachments_data['attachments']} unless (o.attachments_data.blank? || !o.attachments_data.has_key?('attachments') || o.attachments_data['attachments'].is_a?(Hash))
11
- o.openings_desc_hash = {'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))
12
- o.rates_desc_hash = {'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))
13
- o.includes_hash = {'fr' => o.rates_data['includes']} unless (o.rates_data.blank? || !o.rates_data.has_key?('includes') || o.rates_data['includes'].is_a?(Hash))
14
- o.excludes_hash = {'fr' => o.rates_data['excludes']} unless (o.rates_data.blank? || !o.rates_data.has_key?('excludes') || o.rates_data['excludes'].is_a?(Hash))
15
- o.extra_hash = {'fr' => o.type_data['extra']} unless (o.type_data.blank? || !o.type_data.has_key?('extra') || o.type_data['extra'].is_a?(Hash))
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
@@ -0,0 +1,5 @@
1
+ class RenameObjsContactToContactData < ActiveRecord::Migration[5.2]
2
+ def change
3
+ rename_column :apidae_objs, :contact, :contact_data
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Apidae
2
- VERSION = "0.11.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -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: 2020_03_12_150904) do
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 "contact"
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