apidae 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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