-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeoloc_import.rake
69 lines (60 loc) · 2.33 KB
/
geoloc_import.rake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# frozen_string_literal: true
# Run this script without parameter to show some help
#
# bin/rails proposals:batch:import
#
# bin/rails "proposals:batch:geoloc[admin@example.org,../geolocs.csv]"
#
# In heroku you must copy first the script and the files, you can use the command nc to do that (see README.md)
#
# heroku run rake "proposals:batch:geoloc[admin@example.org,../geolocs.csv]"
#
require_relative 'script_helpers'
namespace :proposals do
namespace :batch do
include ScriptHelpers
desc 'Geolocate proposals from a CSV'
task :geoloc, %i[admin csv] => :environment do |_task, args|
process_csv(args) do |admin, line|
processor = ProposalGeolocProcessor.new(admin, normalize(line))
processor.process!
end
end
class ProposalGeolocProcessor
def initialize(admin, values)
raise_if_field_not_found(:address, values)
@admin = admin
@values = values
@proposal = proposal_from_id(values[:id])
raise AlreadyProcessedError, "Proposal [#{@proposal.id}] has no address!" if values[:address].blank?
unless @proposal.component.settings.geocoding_enabled?
raise AlreadyProcessedError, "Proposal [#{@proposal.id}] has gelocating deactivated for component [#{@proposal.component.id}]!"
end
if @proposal.latitude.present? && @proposal.longitude.present?
raise AlreadyProcessedError, "Proposal [#{@proposal.id}] already geolocated to [#{@proposal.latitude},#{@proposal.longitude}] [#{@proposal.address}]!"
end
end
attr_reader :admin, :values, :proposal, :latitude, :longitude
def process!
print "Geolocating proposal #{proposal.id} with address [#{values[:address]}]"
geolocate
return show_error("ERROR! This couldn't be geolocated.") unless latitude.present? && longitude.present?
Decidim.traceability.update!(
proposal,
admin,
address: values[:address],
latitude: latitude,
longitude: longitude
)
show_success("GEOLOCATED ad [#{latitude}, #{longitude}]!")
end
def geolocate
results = Geocoder.search(values[:address])
@latitude = results.first.latitude
@longitude = results.first.longitude
rescue StandardError => e
print " -#{e.message}- "
end
end
end
end