From 10147e8633d05122de43cae37ec9367e301cec77 Mon Sep 17 00:00:00 2001 From: Nathan Wilson Date: Sat, 14 Dec 2024 17:49:01 -0500 Subject: [PATCH 1/3] First pass --- app/classes/report/base_table.rb | 6 ++++-- app/classes/report/row.rb | 4 ++++ app/classes/report/row_extensions.rb | 7 +++++++ app/controllers/observations/downloads_controller.rb | 2 ++ .../controllers/observations/downloads/_form.html.erb | 3 +++ config/locales/en.txt | 1 + 6 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/classes/report/base_table.rb b/app/classes/report/base_table.rb index d4361ff2b7..024c94ab91 100644 --- a/app/classes/report/base_table.rb +++ b/app/classes/report/base_table.rb @@ -80,7 +80,8 @@ def without_location_selects '""', '""', '""', - '""' + '""', + "observations.inat_id" ] end @@ -111,7 +112,8 @@ def with_location_selects "locations.east", "locations.west", "locations.high", - "locations.low" + "locations.low", + "observations.inat_id" ] end diff --git a/app/classes/report/row.rb b/app/classes/report/row.rb index 4cd59b6ec0..10fe8f0625 100644 --- a/app/classes/report/row.rb +++ b/app/classes/report/row.rb @@ -169,5 +169,9 @@ def val(num) def add_val(val, num) @vals[25 + num] = val end + + def inat_id + @vals[26] + end end end diff --git a/app/classes/report/row_extensions.rb b/app/classes/report/row_extensions.rb index 901d4477e3..5a5c7bcdb7 100644 --- a/app/classes/report/row_extensions.rb +++ b/app/classes/report/row_extensions.rb @@ -113,6 +113,13 @@ def best_low obs_alt || loc_low end + def best_alt + return obs_alt if obs_alt + return (loc_high + loc_low)/2 if loc_high && loc_low + + loc_high || loc_low + end + # -------------------- def genus diff --git a/app/controllers/observations/downloads_controller.rb b/app/controllers/observations/downloads_controller.rb index 6664ae4de3..7f90bb69f0 100644 --- a/app/controllers/observations/downloads_controller.rb +++ b/app/controllers/observations/downloads_controller.rb @@ -72,6 +72,8 @@ def create_report(args) Report::Symbiota.new(args) when "fundis" Report::Fundis.new(args) + when "nama" + Report::Nama.new(args) else raise("Invalid download type: #{format.inspect}") end diff --git a/app/views/controllers/observations/downloads/_form.html.erb b/app/views/controllers/observations/downloads/_form.html.erb index 1913451758..9514ad145b 100644 --- a/app/views/controllers/observations/downloads/_form.html.erb +++ b/app/views/controllers/observations/downloads/_form.html.erb @@ -26,6 +26,9 @@ <%= radio_with_label(form: f, field: :format, value: :fundis, checked: (@format == "fundis") && "checked", label: :download_observations_fundis.t) %> + <%= radio_with_label(form: f, field: :format, value: :nama, + checked: (@format == "nama") && "checked", + label: :download_observations_nama.t) %>

<%= :download_observations_encoding.t %>:

diff --git a/config/locales/en.txt b/config/locales/en.txt index 2dfa559084..febb934c92 100644 --- a/config/locales/en.txt +++ b/config/locales/en.txt @@ -1523,6 +1523,7 @@ download_observations_darwin: Darwin Core download_observations_symbiota: Symbiota download_observations_fundis: FunDiS + download_observations_nama: North American Mycological Association (NAMA) download_observations_what_is_this: what is this? download_observations_encoding: Choose character encoding download_observations_ascii: ASCII (no accents) From 1bb54217ad0df9e3a3c00fe509a9e6ef60271fac Mon Sep 17 00:00:00 2001 From: Nathan Wilson Date: Sun, 15 Dec 2024 10:19:45 -0500 Subject: [PATCH 2/3] Rubocop --- app/classes/report/row_extensions.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/classes/report/row_extensions.rb b/app/classes/report/row_extensions.rb index 5a5c7bcdb7..07016fbcd5 100644 --- a/app/classes/report/row_extensions.rb +++ b/app/classes/report/row_extensions.rb @@ -115,7 +115,7 @@ def best_low def best_alt return obs_alt if obs_alt - return (loc_high + loc_low)/2 if loc_high && loc_low + return (loc_high + loc_low) / 2 if loc_high && loc_low loc_high || loc_low end From 0e031d3a01828309087a4422b12cae92e92cbed4 Mon Sep 17 00:00:00 2001 From: Nathan Wilson Date: Sun, 15 Dec 2024 10:49:10 -0500 Subject: [PATCH 3/3] Add NAMA report calls --- app/classes/report/nama.rb | 193 +++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 app/classes/report/nama.rb diff --git a/app/classes/report/nama.rb b/app/classes/report/nama.rb new file mode 100644 index 0000000000..a95e2be0a2 --- /dev/null +++ b/app/classes/report/nama.rb @@ -0,0 +1,193 @@ +# frozen_string_literal: true + +module Report + # Format for export to NAMA. + class Nama < CSV + NAMA_PROJECT_NAME = "North American Mycological Association" + + NAMA_LABELS = [ + "Record Number", + "Field Photo", + "iNat number", + "MO number", + "MycoFlora Number", + "Genus", + "Det", + "Species_Epithet", + "Subspecies_Epithet", + "Variety_Epithet", + "Forma_Epithet", + "Sensu", + "Synonym", + "DetBy", + "Collector", + "CollDate", + "Country", + "StateProv", + "County", + "Town", + "Site Name", + "Precise Location", + "LatDeg", + "LongDeg", + "Elevation in M", + "Substrate", + "Tree Associates", + "Habit", + "CollNote", + "Disposition", + "DNA Status", + "CollNumber", + "Specimen status", + "Walk Number" + ].freeze + + def labels + NAMA_LABELS + end + + def format_row(row) + ["N/A", field_photo(row)] + + id_fields(row) + + name_fields(row) + + people_fields(row) + + [row.obs_when] + + location_fields(row) + + notes_fields(row) + end + + private + + def field_photo(row) + return "Yes" if /\+ *photo/i.match?(row.notes_export_formatted) + + "" + end + + def id_fields(row) + [ + row.inat_id, + row.obs_id, + field_slip_code(row) + ] + end + + def field_slip_code(row) + field_slip = FieldSlip.find_by(observation_id: row.obs_id) + field_slip&.code + end + + def name_fields(row) + [ + row.genus, + det(row), + row.species, + row.subspecies, + row.variety, + row.form, + sensu(row.name_author), + synonym(row) + ] + end + + def det(row) + obs_name = row.notes_to_hash[:Field_Slip_ID] + return "aff." if obs_name&.include?("aff.") + + "" + end + + def sensu(author) + return author if /sensu/.match?(author) + + "" + end + + def synonym(row) + fs_name = row.notes_to_hash[:Field_Slip_ID] + obs_name = row.name_text_name + return "" if fs_name&.include?(obs_name) + + fs_name&.delete("_") + end + + def people_fields(row) + [ + identifier(row), + collector(row) + ] + end + + def identifier(row) + user_name(row.notes_to_hash[:Field_Slip_ID_By]) + end + + def collector(row) + user_name(row.notes_to_hash[:Collector]) + end + + def user_name(name_str) + return name_str unless name_str + + @user_names ||= {} + return @user_names[name_str] if @user_names.include?(name_str) + + result = find_user_name(name_str) + @user_names[name_str] = result + end + + def find_user_name(name_str) + login = name_str[/\A_user (.*?)_/, 1] + return name_str unless login + + user = User.find_by(login:) + return user.unique_text_name if user + + name_str + end + + def location_fields(row) + [ + row.country, + row.state, + row.county, + town(row.locality), + site(row.locality), + "", + row.best_lat(4), + row.best_lng(4), + row.best_alt + ] + end + + def town(locality) + return locality.split(",", 2).first if locality&.include?(",") + + "" + end + + def site(locality) + return locality.split(",", 2).second if locality&.include?(",") + + locality + end + + def notes_fields(row) + [ + row.notes_to_hash[:Substrate], + row.notes_to_hash[:"Trees/Shrubs"], + row.notes_to_hash[:Habit], + row.notes_to_hash[:Other], + "", + sequence_code(row.notes_to_hash[:Other_Codes]), + "", + "", + "" + ] + end + + def sequence_code(codes) + codes && (codes[/NEF24-\d+/] || "") + end + end +end