apidae 0.5.3 → 0.6.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: 69c164ca2042d8c99b37976a7855695493868feb
4
- data.tar.gz: 3c087b2a39f933899226f6b0ea79ea5cb7c97204
3
+ metadata.gz: e10874c1cd302b232c929a0d3f8f1aadc07a442d
4
+ data.tar.gz: 46282a888ab5032291bc08ec7d8c5864801c9a52
5
5
  SHA512:
6
- metadata.gz: 447c7723739c9663d8044826f4532b49019f379b5bddae58f9694cac0a04cacc344990e38feed459873c932c0109222b0a6e5b26eeb069adf52fc2ba41786973
7
- data.tar.gz: 905db3f30f57dc87a62fc57cddd449a498de2421327d51cdc50908059b0057fad76d8521bf6cf1f07b3dd2ee03b218517eb5e4d7720e96399ac05eb1f34feb4e
6
+ metadata.gz: 826e57071ba3eebd560146fa243f9270f6354e1bbfb96680f668d7add65ffde05357edc2854f7d0ae3c2af2b647b287004e239faa3ef5e593542b087d3261512
7
+ data.tar.gz: 3a77efb3727a59029e018dbf4913683752c981c2fafafdaf2df9cbe5b37e0035557a0edd619d0db6f40fba83dda092b645fe20d407d52a6e9acb0a5f7637ad75
@@ -2,7 +2,6 @@ module Apidae
2
2
  class Obj < ActiveRecord::Base
3
3
 
4
4
  belongs_to :town, class_name: 'Apidae::Town', foreign_key: :town_insee_code, primary_key: :insee_code
5
- # has_many :attached_files, class_name: 'Apidae::AttachedFile'
6
5
  has_many :apidae_selection_objects, class_name: 'Apidae::SelectionObject', foreign_key: :apidae_object_id
7
6
  has_many :selections, class_name: 'Apidae::Selection', source: :apidae_selection, through: :apidae_selection_objects
8
7
 
@@ -10,14 +9,14 @@ module Apidae
10
9
  store_accessor :pictures_data, :pictures
11
10
  store_accessor :attachments_data, :attachments
12
11
  store_accessor :type_data, :categories, :themes, :capacity, :classification, :labels, :chains, :area, :track,
13
- :products, :audience, :animals, :extra, :duration
14
- store_accessor :entity_data, :entity_id, :entity_name
12
+ :products, :audience, :animals, :extra, :duration, :certifications
13
+ store_accessor :entity_data, :entity_id, :entity_name, :service_provider_id
15
14
  store_accessor :contact, :telephone, :email, :website
16
- store_accessor :location_data, :address, :place, :latitude, :longitude, :access
15
+ store_accessor :location_data, :address, :place, :latitude, :longitude, :access, :territories, :environments
17
16
  store_accessor :openings_data, :openings_desc, :openings, :time_periods
18
- store_accessor :rates_data, :rates_desc, :rates, :payment_methods
17
+ store_accessor :rates_data, :rates_desc, :rates, :payment_methods, :includes, :excludes
19
18
  store_accessor :service_data, :services, :equipments, :comfort, :activities, :challenged, :languages
20
- store_accessor :tags_data, :promo, :internal
19
+ store_accessor :tags_data, :promo, :internal, :linked
21
20
 
22
21
  ACT = 'ACTIVITE'
23
22
  COS = 'COMMERCE_ET_SERVICE'
@@ -65,25 +64,60 @@ module Apidae
65
64
  end
66
65
 
67
66
  def self.update_object(apidae_obj, object_data)
67
+ populate_fields(apidae_obj, object_data)
68
+
69
+ unless object_data[:aspects].blank?
70
+ groups_aspect = object_data[:aspects].find {|a| a[:aspect] == 'GROUPES'}
71
+ if groups_aspect
72
+ groups_aspect[:type] = apidae_obj.apidae_type
73
+ aspect_obj = Obj.new
74
+ populate_fields(aspect_obj, groups_aspect)
75
+ merge_fields(apidae_obj, aspect_obj)
76
+ end
77
+ end
78
+
79
+ apidae_obj.save!
80
+ end
81
+
82
+ def self.populate_fields(apidae_obj, object_data)
68
83
  type_fields = TYPES_DATA[object_data[:type]]
69
84
  apidae_obj.apidae_type = object_data[:type]
70
85
  apidae_obj.apidae_subtype = node_id(object_data[type_fields[:node]], type_fields[:subtype])
71
86
  apidae_obj.title = node_value(object_data, :nom)
72
87
  apidae_obj.description_data = parse_desc_data(object_data[:presentation])
73
88
  apidae_obj.contact = contact(object_data[:informations])
74
- apidae_obj.location_data = parse_location_data(object_data[:localisation], object_data[type_fields[:node]])
75
- apidae_obj.town = town(object_data[:localisation][:adresse])
89
+ apidae_obj.location_data = parse_location_data(object_data[:localisation], object_data[type_fields[:node]],
90
+ object_data[:territoires])
91
+ apidae_obj.town = town(object_data[:localisation])
76
92
  apidae_obj.openings_data = parse_openings(object_data[:ouverture])
77
93
  apidae_obj.rates_data = parse_rates(object_data[:descriptionTarif])
78
94
  apidae_obj.reservation = parse_reservation(object_data[:reservation])
79
95
  apidae_obj.type_data = parse_type_data(apidae_obj, object_data[type_fields[:node]], object_data[:prestations])
80
96
  apidae_obj.pictures_data = pictures_urls(object_data[:illustrations])
81
97
  apidae_obj.attachments_data = attachments_urls(object_data[:multimedias])
82
- apidae_obj.entity_data = entity_fields(object_data[:informations])
98
+ apidae_obj.entity_data = entity_fields(object_data[:informations], object_data[type_fields[:node]])
83
99
  apidae_obj.service_data = parse_service_data(object_data[:prestations], object_data[type_fields[:node]])
84
- apidae_obj.tags_data = parse_tags_data(object_data[:presentation], object_data[:criteresInternes])
100
+ apidae_obj.tags_data = parse_tags_data(object_data[:presentation], object_data[:criteresInternes], object_data[:liens])
85
101
  apidae_obj.meta_data = object_data[:metadonnees]
86
- apidae_obj.save!
102
+ end
103
+
104
+ def self.merge_fields(apidae_obj, aspect_obj)
105
+ apidae_obj.description_data.merge!(non_empty(aspect_obj.description_data)) if aspect_obj.description_data
106
+ apidae_obj.contact.merge!(non_empty(aspect_obj.contact)) if aspect_obj.contact
107
+ apidae_obj.location_data.merge!(non_empty(aspect_obj.location_data)) if aspect_obj.location_data
108
+ apidae_obj.openings_data.merge!(non_empty(aspect_obj.openings_data)) if aspect_obj.openings_data
109
+ apidae_obj.rates_data.merge!(non_empty(aspect_obj.rates_data)) if aspect_obj.rates_data
110
+ apidae_obj.reservation = aspect_obj.reservation unless aspect_obj.reservation.blank?
111
+ apidae_obj.type_data.merge!(non_empty(aspect_obj.type_data)) if aspect_obj.type_data
112
+ apidae_obj.pictures_data.merge!(non_empty(aspect_obj.pictures_data)) if aspect_obj.pictures_data
113
+ apidae_obj.attachments_data.merge!(non_empty(aspect_obj.attachments_data)) if aspect_obj.attachments_data
114
+ apidae_obj.service_data.merge!(non_empty(aspect_obj.service_data)) if aspect_obj.service_data
115
+ apidae_obj.tags_data.merge!(non_empty(aspect_obj.tags_data)) if aspect_obj.tags_data
116
+ apidae_obj.meta_data.merge!(non_empty(aspect_obj.meta_data)) if aspect_obj.meta_data
117
+ end
118
+
119
+ def self.non_empty(data_hash)
120
+ data_hash.keep_if {|k, v| !v.blank?}
87
121
  end
88
122
 
89
123
  def self.parse_desc_data(data_hash)
@@ -126,9 +160,10 @@ module Apidae
126
160
 
127
161
  def self.contact(information_hash)
128
162
  contact_details = {}
129
- contact_entries = information_hash[:moyensCommunication].nil? ? [] : information_hash[:moyensCommunication]
130
- contact_entries.each do |c|
131
- case c[:type][:id]
163
+ unless information_hash.blank?
164
+ contact_entries = information_hash[:moyensCommunication] || []
165
+ contact_entries.each do |c|
166
+ case c[:type][:id]
132
167
  when PHONE
133
168
  contact_details[:telephone] ||= []
134
169
  contact_details[:telephone] << c[:coordonnees][:fr]
@@ -139,12 +174,14 @@ module Apidae
139
174
  contact_details[:website] ||= []
140
175
  contact_details[:website] << c[:coordonnees][:fr]
141
176
  else
177
+ end
142
178
  end
143
179
  end
144
180
  contact_details
145
181
  end
146
182
 
147
- def self.parse_location_data(location_hash, type_data_hash)
183
+ def self.parse_location_data(location_hash, type_data_hash, territories)
184
+ loc_data = {}
148
185
  unless location_hash.blank?
149
186
  address_hash = location_hash[:adresse]
150
187
  computed_address = []
@@ -153,19 +190,27 @@ module Apidae
153
190
  computed_address << address_hash[:adresse2] unless address_hash[:adresse2].blank?
154
191
  computed_address << address_hash[:adresse3] unless address_hash[:adresse3].blank?
155
192
  end
156
- loc_data = {address: computed_address, place: type_data_hash[:nomLieu]}
193
+ loc_data.merge!({address: computed_address})
194
+ loc_data.merge!({place: type_data_hash[:nomLieu]}) if type_data_hash
157
195
  geoloc_details = location_hash[:geolocalisation]
158
196
  if geoloc_details && geoloc_details[:valide] && geoloc_details[:geoJson]
159
197
  loc_data[:latitude] = geoloc_details[:geoJson][:coordinates][1]
160
198
  loc_data[:longitude] = geoloc_details[:geoJson][:coordinates][0]
161
199
  end
162
200
  loc_data[:access] = node_value(geoloc_details, :complement) if geoloc_details
163
- loc_data
201
+ loc_data[:environments] = location_hash[:environnements].map {|e| e[:id]} if location_hash[:environnements]
164
202
  end
203
+ loc_data[:territories] = territories.map {|t| t[:id]} unless territories.blank?
204
+ loc_data
165
205
  end
166
206
 
167
- def self.town(address_hash = {})
168
- (!address_hash.blank? && address_hash[:commune]) ? Town.find_by_apidae_id(address_hash[:commune][:id]) : nil
207
+ def self.town(location_hash)
208
+ if location_hash
209
+ address_hash = location_hash[:adresse]
210
+ (!address_hash.blank? && address_hash[:commune]) ? Town.find_by_apidae_id(address_hash[:commune][:id]) : nil
211
+ else
212
+ nil
213
+ end
169
214
  end
170
215
 
171
216
  def self.parse_openings(openings_hash)
@@ -183,33 +228,34 @@ module Apidae
183
228
  desc = rates_hash[:gratuit] ? 'gratuit' : node_value(rates_hash, :tarifsEnClair)
184
229
  values = rates_hash[:periodes].blank? ? [] : rates_hash[:periodes].map {|p| build_rate(p)}
185
230
  methods = rates_hash[:modesPaiement].blank? ? [] : rates_hash[:modesPaiement].map {|p| p[:id]}
186
- {rates_desc: desc, rates: values, payment_methods: methods}
231
+ {rates_desc: desc, rates: values, payment_methods: methods, includes: node_value(rates_hash, :leTarifComprend), excludes: node_value(rates_hash, :leTarifNeComprendPas)}
187
232
  end
188
233
  end
189
234
 
190
- def self.parse_type_data(apidae_obj, data_hash, presta_hash)
191
- if data_hash
192
- prestations_hash = presta_hash || {}
193
- apidae_obj.apidae_subtype = lists_ids(data_hash[:typesManifestation]).first if apidae_obj.apidae_type == FEM
194
- apidae_obj.apidae_subtype = node_id(data_hash, :rubrique) if apidae_obj.apidae_type == EQU
195
- {
196
- categories: lists_ids(data_hash[:categories], data_hash[:typesDetailles]),
197
- themes: lists_ids(data_hash[:themes]),
198
- capacity: data_hash[:capacite],
199
- classification: nodes_ids(data_hash[:classement], data_hash[:classementPrefectoral], data_hash[:classification]) +
200
- lists_ids(data_hash[:classementsGuides]) + lists_ids(data_hash[:classements]),
201
- labels: lists_ids(data_hash[:labels], prestations_hash[:labelsTourismeHandicap]) +
202
- (node_id(data_hash, :typeLabel) ? [node_id(data_hash, :typeLabel)] : []),
203
- chains: lists_ids(data_hash[:chaines]) + nodes_ids(data_hash[:chaineEtLabel]),
204
- area: apidae_obj.apidae_type == DOS ? data_hash.except(:classification) : nil,
205
- track: apidae_obj.apidae_type == EQU ? data_hash[:itineraire] : nil,
206
- products: lists_ids(data_hash[:typesProduit], data_hash[:aopAocIgps], data_hash[:specialites]),
207
- audience: lists_ids(prestations_hash[:typesClientele]),
208
- animals: prestations_hash[:animauxAcceptes] == 'ACCEPTES',
209
- extra: node_value(prestations_hash, :complementAccueil),
210
- duration: data_hash[:dureeSeance]
211
- }
212
- end
235
+ def self.parse_type_data(apidae_obj, type_hash, presta_hash)
236
+ data_hash = type_hash || {}
237
+ prestations_hash = presta_hash || {}
238
+ apidae_obj.apidae_subtype = lists_ids(data_hash[:typesManifestation]).first if apidae_obj.apidae_type == FEM
239
+ apidae_obj.apidae_subtype = node_id(data_hash, :rubrique) if apidae_obj.apidae_type == EQU
240
+ apidae_obj.apidae_subtype = lists_ids(data_hash[:typesHebergement]).first if apidae_obj.apidae_type == SPA
241
+ {
242
+ categories: lists_ids(data_hash[:categories], data_hash[:typesDetailles], data_hash[:activiteCategories]),
243
+ themes: lists_ids(data_hash[:themes]),
244
+ capacity: (data_hash[:capacite] || {}).merge(presta_hash ? {group_min: presta_hash[:tailleGroupeMin], group_max: presta_hash[:tailleGroupeMax]} : {}),
245
+ classification: nodes_ids(data_hash[:classement], data_hash[:classementPrefectoral], data_hash[:classification]) +
246
+ lists_ids(data_hash[:classementsGuides]) + lists_ids(data_hash[:classements]),
247
+ labels: lists_ids(data_hash[:labels], prestations_hash[:labelsTourismeHandicap]) +
248
+ (node_id(data_hash, :typeLabel) ? [node_id(data_hash, :typeLabel)] : []),
249
+ chains: lists_ids(data_hash[:chaines]) + nodes_ids(data_hash[:chaineEtLabel]),
250
+ area: apidae_obj.apidae_type == DOS ? data_hash.except(:classification) : node_value(data_hash, :lieuDePratique),
251
+ track: apidae_obj.apidae_type == EQU ? data_hash[:itineraire] : nil,
252
+ products: lists_ids(data_hash[:typesProduit], data_hash[:aopAocIgps], data_hash[:specialites]),
253
+ audience: lists_ids(prestations_hash[:typesClientele]),
254
+ animals: prestations_hash[:animauxAcceptes] == 'ACCEPTES',
255
+ extra: apidae_obj.apidae_type == SPA ? node_value(data_hash, :formuleHebergement) : node_value(prestations_hash, :complementAccueil),
256
+ duration: apidae_obj.apidae_type == SPA ? {days: data_hash[:nombreJours], nights: data_hash[:nombreNuits]} : data_hash[:dureeSeance],
257
+ certifications: data_hash[:agrements].blank? ? [] : data_hash[:agrements].map {|a| {id: a[:type][:id], identifier: a[:numero]}}
258
+ }
213
259
  end
214
260
 
215
261
  def self.parse_service_data(data_hash, type_data_hash)
@@ -218,15 +264,16 @@ module Apidae
218
264
  services: lists_ids(data_hash[:services]),
219
265
  equipments: lists_ids(data_hash[:equipements]),
220
266
  comfort: lists_ids(data_hash[:conforts]),
221
- activities: lists_ids(data_hash[:activites], type_data_hash[:activites],
222
- type_data_hash[:activitesSportives], type_data_hash[:activitesCulturelles]),
267
+ activities: lists_ids(data_hash[:activites], type_data_hash ? type_data_hash[:activites] : [],
268
+ type_data_hash ? type_data_hash[:activitesSportives] : [],
269
+ type_data_hash ? type_data_hash[:activitesCulturelles] : []),
223
270
  challenged: lists_ids(data_hash[:tourismesAdaptes]),
224
271
  languages: lists_ids(data_hash[:languesParlees])
225
272
  }
226
273
  end
227
274
  end
228
275
 
229
- def self.parse_tags_data(pres_data_hash, crit_data_hash)
276
+ def self.parse_tags_data(pres_data_hash, crit_data_hash, linked_data_hash)
230
277
  tags = {}
231
278
  if pres_data_hash
232
279
  tags[:promo] = lists_ids(pres_data_hash[:typologiesPromoSitra])
@@ -234,6 +281,10 @@ module Apidae
234
281
  unless crit_data_hash.blank?
235
282
  tags[:internal] = crit_data_hash.map {|c| c[:id]}
236
283
  end
284
+ unless linked_data_hash.blank? || linked_data_hash[:liensObjetsTouristiquesTypes].blank?
285
+ tags[:linked] = linked_data_hash[:liensObjetsTouristiquesTypes]
286
+ .map {|l| {apidae_id: l[:objetTouristique][:id], apidae_type: l[:objetTouristique][:type], category: l[:type]}}
287
+ end
237
288
  tags
238
289
  end
239
290
 
@@ -247,9 +298,9 @@ module Apidae
247
298
  end
248
299
  end
249
300
 
250
- def self.entity_fields(information_hash)
301
+ def self.entity_fields(information_hash, type_data_hash)
251
302
  if information_hash && information_hash[:structureGestion]
252
- {entity_id: information_hash[:structureGestion][:id]}
303
+ {entity_id: information_hash[:structureGestion][:id], service_provider_id: node_id(type_data_hash, :prestataireActivites)}
253
304
  end
254
305
  end
255
306
 
@@ -1,3 +1,3 @@
1
1
  module Apidae
2
- VERSION = "0.5.3"
2
+ VERSION = "0.6.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: 0.5.3
4
+ version: 0.6.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: 2018-07-27 00:00:00.000000000 Z
11
+ date: 2018-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '0.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '0.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rubyzip
43
43
  requirement: !ruby/object:Gem::Requirement