Browse Source

moved the json rendering onto jbuilder

pull/1/head
rodley82 2 weeks ago
parent
commit
7aa69808fb
  1. 121
      app/admin/users_admin.rb
  2. 129
      app/views/users/show.json.jbuilder

121
app/admin/users_admin.rb

@ -48,125 +48,8 @@ Trestle.resource(:users) do
end end
def generate_json_resume def generate_json_resume
user = admin.find_instance(params) @user = admin.find_instance(params)
render template: "users/show", formats: [:json], layout: false
split_list = lambda do |value|
value.to_s.split(/[;,]/).map { |item| item.strip }.reject(&:blank?)
end
parse_period = lambda do |period|
years = period.to_s.scan(/\b(19\d{2}|20\d{2})\b/).flatten
return [nil, nil] if years.empty?
[years[0], years[1]]
end
normalize_url = lambda do |value|
return nil if value.blank?
value.match?(/\Ahttps?:\/\//) ? value : "https://#{value}"
end
profile_from = lambda do |value, network, base_url|
return nil if value.blank?
if value.include?("/") || value.include?(".")
url = normalize_url.call(value)
username = url.to_s.split("/").last&.delete_prefix("@")
else
username = value.delete_prefix("@")
url = base_url.present? ? "#{base_url}/#{username}" : nil
end
profile = { "network" => network }
profile["username"] = username if username.present?
profile["url"] = url if url.present?
profile
end
basics = {
"name" => user.name,
"label" => user.title,
"email" => user.email,
"phone" => user.phone,
"summary" => user.objective
}.compact
if user.address.present?
basics["location"] = { "address" => user.address }
end
primary_url = user.other_page_url.presence || user.linkedin.presence || user.github.presence
basics["url"] = normalize_url.call(primary_url) if primary_url.present?
profiles = []
profiles << profile_from.call(user.linkedin, "LinkedIn", "https://www.linkedin.com/in")
profiles << profile_from.call(user.github, "GitHub", "https://github.com")
profiles << profile_from.call(user.other_page_url, "Website", nil)
profiles.compact!
basics["profiles"] = profiles if profiles.any?
work = user.work_experiences.active.map do |work_entry|
start_date, end_date = parse_period.call(work_entry.period)
highlights = split_list.call(work_entry.items_csv)
technologies = split_list.call(work_entry.technologies)
highlights << "Technologies: #{technologies.join(', ')}" if technologies.any?
summary = work_entry.achivements.presence
summary = work_entry.period.presence if summary.blank? && start_date.blank? && end_date.blank?
entry = {
"name" => work_entry.employer,
"position" => work_entry.title
}.compact
entry["summary"] = summary if summary.present?
entry["highlights"] = highlights if highlights.any?
entry["startDate"] = start_date if start_date.present?
entry["endDate"] = end_date if end_date.present?
if entry["startDate"].blank? && entry["endDate"].blank? && work_entry.reference_date.present?
entry["endDate"] = work_entry.reference_date.iso8601
end
entry
end
education = user.education_entries.active.map do |education_entry|
start_date, end_date = parse_period.call(education_entry.period)
study_type = education_entry.title
area = nil
if study_type.present? && study_type.match?(/\s+in\s+/i)
study_type, area = study_type.split(/\s+in\s+/i, 2)
end
courses = split_list.call(education_entry.items_csv)
entry = { "institution" => education_entry.institution }.compact
entry["studyType"] = study_type if study_type.present?
entry["area"] = area if area.present?
entry["courses"] = courses if courses.any?
entry["startDate"] = start_date if start_date.present?
entry["endDate"] = end_date if end_date.present?
if entry["startDate"].blank? && entry["endDate"].blank? && education_entry.reference_date.present?
entry["endDate"] = education_entry.reference_date.iso8601
end
entry
end
skills = user.skills.active.map do |skill|
keywords = split_list.call(skill.detail)
entry = { "name" => skill.title }.compact
if keywords.any?
entry["keywords"] = keywords
elsif skill.detail.present?
entry["level"] = skill.detail
end
entry
end
resume = { "basics" => basics }
resume["work"] = work if work.any?
resume["education"] = education if education.any?
resume["skills"] = skills if skills.any?
render json: resume, layout: false
end end
def generate_tex(template: "resume") def generate_tex(template: "resume")

129
app/views/users/show.json.jbuilder

@ -1,37 +1,118 @@
json.user do user = @user
json.id @user.id split_list = lambda do |value|
json.name @user.name value.to_s.split(/[;,]/).map { |item| item.strip }.reject(&:blank?)
json.title @user.title end
parse_period = lambda do |period|
years = period.to_s.scan(/\b(19\d{2}|20\d{2})\b/).flatten
return [nil, nil] if years.empty?
[years[0], years[1]]
end
json.work_experiences @user.work_experiences.active do |work| normalize_url = lambda do |value|
# json.id work.id return nil if value.blank?
json.title work.title value.match?(/\Ahttps?:\/\//) ? value : "https://#{value}"
end
json.organization work.employer profile_from = lambda do |value, network, base_url|
return nil if value.blank?
if work.technologies.present? if value.include?("/") || value.include?(".")
json.technologies work.technologies url = normalize_url.call(value)
username = url.to_s.split("/").last&.delete_prefix("@")
else
username = value.delete_prefix("@")
url = base_url.present? ? "#{base_url}/#{username}" : nil
end end
json.period work.period
json.responsibilities do profile = { "network" => network }
json.array! work.items_csv&.split(";") profile["username"] = username if username.present?
profile["url"] = url if url.present?
profile
end
json.basics do
json.name user.name if user.name.present?
json.label user.title if user.title.present?
json.email user.email if user.email.present?
json.phone user.phone if user.phone.present?
json.summary user.objective if user.objective.present?
if user.address.present?
json.location do
json.address user.address
end end
end end
json.skills @user.skills.active do |skill| primary_url = user.other_page_url.presence || user.linkedin.presence || user.github.presence
# json.id skill.id url = normalize_url.call(primary_url)
json.title skill.title json.url url if url.present?
json.detail skill.detail
profiles = []
profiles << profile_from.call(user.linkedin, "LinkedIn", "https://www.linkedin.com/in")
profiles << profile_from.call(user.github, "GitHub", "https://github.com")
profiles << profile_from.call(user.other_page_url, "Website", nil)
profiles.compact!
json.profiles profiles if profiles.any?
end
if user.work_experiences.active.any?
json.work user.work_experiences.active do |work_entry|
start_date, end_date = parse_period.call(work_entry.period)
highlights = split_list.call(work_entry.items_csv)
technologies = split_list.call(work_entry.technologies)
highlights << "Technologies: #{technologies.join(', ')}" if technologies.any?
summary = work_entry.achivements.presence
summary = work_entry.period.presence if summary.blank? && start_date.blank? && end_date.blank?
json.name work_entry.employer if work_entry.employer.present?
json.position work_entry.title if work_entry.title.present?
json.summary summary if summary.present?
json.highlights highlights if highlights.any?
json.startDate start_date if start_date.present?
json.endDate end_date if end_date.present?
if start_date.blank? && end_date.blank? && work_entry.reference_date.present?
json.endDate work_entry.reference_date.iso8601
end end
end
end
if user.education_entries.active.any?
json.education user.education_entries.active do |education_entry|
start_date, end_date = parse_period.call(education_entry.period)
study_type = education_entry.title
area = nil
if study_type.present? && study_type.match?(/\s+in\s+/i)
study_type, area = study_type.split(/\s+in\s+/i, 2)
end
courses = split_list.call(education_entry.items_csv)
json.institution education_entry.institution if education_entry.institution.present?
json.studyType study_type if study_type.present?
json.area area if area.present?
json.courses courses if courses.any?
json.startDate start_date if start_date.present?
json.endDate end_date if end_date.present?
if start_date.blank? && end_date.blank? && education_entry.reference_date.present?
json.endDate education_entry.reference_date.iso8601
end
end
end
if user.skills.active.any?
json.skills user.skills.active do |skill|
keywords = split_list.call(skill.detail)
json.education_entries @user.education_entries.active do |edu| json.name skill.title if skill.title.present?
json.institution edu.institution if keywords.any?
json.title edu.title json.keywords keywords
json.location edu.location elsif skill.detail.present?
json.period edu.period json.level skill.detail
json.items do
json.array! edu.items_csv&.split(";")
end end
end end
end end

Loading…
Cancel
Save