Make contacts in dedications into usable json

This commit is contained in:
Eric Schultz 2018-10-04 15:29:30 -05:00 committed by Eric Schultz
parent 10b6a8ba18
commit 6bbdfc4ebc
8 changed files with 139 additions and 31 deletions

View file

@ -21,7 +21,7 @@ function view(state) {
, type: 'radio'
, id: radioId1
, value: 'honor'
, selected: data.dedication_type === 'honor'
, selected: !data.dedication_type || data.dedication_type === 'honor'
}})
, h('label', {props: {htmlFor: radioId1}}, I18n.t('nonprofits.donate.dedication.in_honor_label'))
])

View file

@ -127,7 +127,9 @@ const setDonationDedication = (don, dedication) => {
, JSON.stringify({
supporter_id: dedication.supporter.id
, name: dedication.supporter.name
, contact: R.join(" - ", [dedication.supporter.email, dedication.supporter.phone, dedication.supporter.address])
, contact: {email: dedication.supporter.email,
phone: dedication.supporter.phone,
address: dedication.supporter.address}
, note: dedication.note
, type: dedication.type
})

View file

@ -148,14 +148,17 @@ appl.def('format_dedication', function(dedic, node) {
var json
try { json = JSON.parse(dedic) } catch(e) {}
if(json) {
let supporter_link = (json.supporter_id && json.supporter_id != '') ?
`<a href='/nonprofits/${app.nonprofit_id}/supporters?sid=${json.supporter_id}'>${json.name}</a>` :
json.name
inner = `
Donation made in ${dedic.type || 'honor'} of
<a href='/nonprofits/${app.nonprofit_id}/supporters?sid=${json.supporter_id}'>${json.name}</a>.
Donation made in ${json.type || 'honor'} of
${supporter_link}.
${json.note ? `<br>Note: <em>${json.note}</em>.` : ''}
`
} else {
// Print plaintext dedication
inner = dedic
inner = ''
}
}
td.innerHTML = inner

View file

@ -16,33 +16,12 @@ language plpgsql
immutable;
SQL
result = Qx.select('id', 'dedication').from(:donations)
.where("dedication IS NOT NULL AND dedication != ''")
.and_where("NOT is_valid_json(dedication)").ex
result.map do |i|
output = {id: i['id']}
if i['dedication'] =~ /(((in (loving )?)?memory of|in memorium)\:? )(.+)/i
output[:dedication] = JSON.generate({type: 'memory', note: $+ })
elsif i['dedication'] =~ /((in honor of|honor of)\:? )(.+)/i
output[:dedication] = JSON.generate({type: 'honor', note: $+ })
else
output[:dedication] = JSON.generate({type: 'honor', note: i['dedication'] })
end
output
end.each do |i|
Qx.update(:donations).where('id = $id', {id: i[:id]}).set({dedication: i[:dedication]}).ex
end
dedications = MaintainDedications.retrieve_non_json_dedications
#
# result = Qx.select('id', 'dedication').from(:donations)
# .where("id IN ($ids)", ids: result.map{|i| i['id']}).ex
#
# puts result
MaintainDedications.create_json_dedications_from_plain_text(dedications)
execute <<-SQL
drop function is_valid_json(text);
SQL
dedications = MaintainDedications.retrieve_json_dedications
MaintainDedications.add_honor_to_any_json_dedications_without_type(dedications)
end
def down

View file

@ -0,0 +1,52 @@
class CorrectDedicationContacts < ActiveRecord::Migration
def up
json_dedications = Qx.select('id', 'dedication').from(:donations)
.where("dedication IS NOT NULL AND dedication != ''")
.and_where("is_valid_json(dedication)").ex
parsed_dedications = json_dedications.map{|i| {id: i['id'], dedication: JSON.parse(i['dedication'])}}
with_contact_to_correct = parsed_dedications.select {|i| !i[:dedication]['contact'].blank? && i[:dedication]['contact'].is_a?(String)}
really_icky_dedications, easy_to_split_strings = with_contact_to_correct.partition{|i| i[:dedication]['contact'].split(" - ").count > 3}
easy_to_split_strings.map do |i|
split_contact = i[:dedication]['contact'].split(' - ')
i[:dedication]['contact'] = {
email: split_contact[0],
phone:split_contact[1],
address: split_contact[2],
}
puts i
i
end.each_with_index do |i, index|
unless (i[:id])
raise Error("Item at index #{index} is invalid. Object:#{i}")
end
Qx.update(:donations).where("id = $id", id:i[:id]).set(dedication: JSON.generate(i[:dedication])).ex
end
puts "Corrected #{easy_to_split_strings.count} records."
puts ""
puts ""
puts "You must manually fix the following dedications: "
really_icky_dedications.each do |i|
puts i
end
end
def down
json_dedications = Qx.select('id', 'dedication').from(:donations)
.where("dedication IS NOT NULL AND dedication != ''")
.and_where("is_valid_json(dedication)").ex
parsed_dedications = json_dedications.map{|i| {'id' => i['id'], 'dedication' => JSON.parse(i['dedication'])}}
with_contact_to_correct = parsed_dedications.select {|i| i['dedication']['contact'].is_a?(Hash)}
puts "#{with_contact_to_correct.count} to revert"
with_contact_to_correct.each do |i|
contact_string = "#{i['dedication']['contact']['email']} - #{i['dedication']['contact']['phone']} - #{i['dedication']['contact']['address']}"
i['dedication']['contact'] = contact_string
Qx.update(:donations).where("id = $id", id:i['id']).set(dedication: JSON.generate(i['dedication'])).ex
end
end
end

View file

@ -3,7 +3,7 @@
--
-- Dumped from database version 9.6.5
-- Dumped by pg_dump version 9.6.9
-- Dumped by pg_dump version 9.6.10
SET statement_timeout = 0;
SET lock_timeout = 0;
@ -57,6 +57,22 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;
COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';
--
-- Name: is_valid_json(text); Type: FUNCTION; Schema: public; Owner: -
--
CREATE FUNCTION public.is_valid_json(p_json text) RETURNS boolean
LANGUAGE plpgsql IMMUTABLE
AS $$
begin
return (p_json::json is not null);
exception
when others then
return false;
end;
$$;
--
-- Name: update_supporter_assoc_search_vectors(); Type: FUNCTION; Schema: public; Owner: -
--
@ -4327,3 +4343,7 @@ INSERT INTO schema_migrations (version) VALUES ('20180713215825');
INSERT INTO schema_migrations (version) VALUES ('20180713220028');
INSERT INTO schema_migrations (version) VALUES ('20181002160627');
INSERT INTO schema_migrations (version) VALUES ('20181003212559');

View file

@ -0,0 +1,44 @@
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
module MaintainDedications
def self.retrieve_json_dedications
return Qx.select('id', 'dedication').from(:donations)
.where("is_valid_json(dedication)").ex
end
def self.retrieve_non_json_dedications(include_blank=false)
temp = Qx.select('id', 'dedication').from(:donations)
temp = temp.where("dedication IS NOT NULL AND dedication != ''") unless include_blank
temp = temp.and_where("NOT is_valid_json(dedication)")
return temp.ex
end
def self.create_json_dedications_from_plain_text(dedications)
dedications.map do |i|
output = {id: i['id']}
if i['dedication'] =~ /(((in (loving )?)?memory of|in memorium)\:? )(.+)/i
output[:dedication] = JSON.generate({type: 'memory', note: $+ })
elsif i['dedication'] =~ /((in honor of|honor of)\:? )(.+)/i
output[:dedication] = JSON.generate({type: 'honor', note: $+ })
else
output[:dedication] = JSON.generate({type: 'honor', note: i['dedication'] })
end
output
end.each do |i|
Qx.update(:donations).where('id = $id', {id: i[:id]}).set({dedication: i[:dedication]}).ex
end
end
def self.add_honor_to_any_json_dedications_without_type(json_dedications)
json_dedications.map{|i| {'id' => i['id'], 'dedication' => JSON::parse(i['dedication']) }}
.select{|i| !%w(honor memory).include?(i['dedication']['type'])}
.map{|i| i['dedication']['type'] = 'honor'; i }
.each do |i|
Qx.update(:donations).where('id = $id', id: i['id'])
.set(dedication: JSON.generate(i['dedication'])).ex
end
end
end

View file

@ -0,0 +1,8 @@
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
require 'rails_helper'
describe maintaindedications do
it 'is untested' do
pending 'add tests here'
end
end