diff --git a/app/controllers/plans_controller.rb b/app/controllers/plans_controller.rb index 77c5256..0026bcf 100644 --- a/app/controllers/plans_controller.rb +++ b/app/controllers/plans_controller.rb @@ -115,7 +115,7 @@ @plan = Plan.eager_load(params[:id]) authorize @plan - @visibility = @plan.visibility.blank? ? @plan.visibility.to_s : Rails.application.config.default_plan_visibility + @visibility = @plan.visibility.present? ? @plan.visibility.to_s : Rails.application.config.default_plan_visibility @editing = (!params[:editing].nil? && @plan.administerable_by?(current_user.id)) @@ -156,7 +156,7 @@ @plan = Plan.find(params[:id]) authorize @plan - @visibility = @plan.visibility.blank? ? @plan.visibility.to_s : Rails.application.config.default_plan_visibility + @visibility = @plan.visibility.present? ? @plan.visibility.to_s : Rails.application.config.default_plan_visibility # If there was no phase specified use the template's 1st phase @phase = (params[:phase].nil? ? @plan.template.phases.first : Phase.find(params[:phase])) @@ -195,9 +195,7 @@ def update @plan = Plan.find(params[:id]) authorize @plan - attrs = plan_params - attrs['visibility'] = Rails.application.config.default_plan_visibility if plan_params['visibility'].blank? respond_to do |format| if @plan.update_attributes(attrs) diff --git a/app/models/plan.rb b/app/models/plan.rb index 3abf98e..ab84aca 100644 --- a/app/models/plan.rb +++ b/app/models/plan.rb @@ -32,7 +32,8 @@ :exported_plans, :project, :title, :template, :grant_number, :identifier, :principal_investigator, :principal_investigator_identifier, :description, :data_contact, :funder_name, :visibility, :exported_plans, - :roles, :users, :org, :as => [:default, :admin] + :roles, :users, :org, :data_contact_email, :data_contact_phone, + :as => [:default, :admin] accepts_nested_attributes_for :roles # public is a Ruby keyword so using publicly diff --git a/lib/tasks/migrate.rake b/lib/tasks/migrate.rake index f436586..0625b3c 100644 --- a/lib/tasks/migrate.rake +++ b/lib/tasks/migrate.rake @@ -1,4 +1,17 @@ namespace :migrate do + + desc "migrate to 0.4" + task to_04: :environment do + # Default all plans.visibility to the value specified in application.rb + Rake::Task['migrate:init_plan_visibility'].execute + # Move old plans.data_contact to plans.data_contact_email if value is an email + Rake::Task['migrate:plan_data_contacts'].execute + # Move users.orcid_id to the user_identifiers table + Rake::Task['migrate:move_orcids'].execute + # Move users.shibboleth_id to the user_identifiers table + Rake::Task['migrate:move_shibs'].execute + end + desc "TODO" task permissions: :environment do User.update_user_permissions @@ -214,29 +227,6 @@ end - desc "move old ORCID from user table to user_identifiers" - task move_orcids: :environment do - if IdentifierScheme.find_by(name: 'orcid').nil? - IdentifierScheme.create!(name: 'orcid', description: 'ORCID', active: true) - end - - scheme = IdentifierScheme.find_by(name: 'orcid') - - unless scheme.nil? - User.all.each do |u| - if u.respond_to?(:orcid_id) - if u.orcid_id.present? - if u.orcid_id.gsub('orcid.org/', '').match(/^[\d-]+/) - u.user_identifiers << UserIdentifier.new(identifier_scheme: scheme, - identifier: u.orcid_id.gsub('orcid.org/', '')) - u.save! - end - end - end - end - end - end - desc "enforce single published version for templates" task single_published_template: :environment do # for each group of versions of a template @@ -253,5 +243,97 @@ end end end + +# Tasks required to migrate to 0.4.x +# ----------------------------------------------- + desc "Initialize plans.visibility to the default specified in application.rb" + task init_plan_visibility: :environment do + default = Rails.configuration.default_plan_visibility.to_sym + Plan.all.each{ |p| p.update_attributes(visibility: default) unless p.visibility == default } + end + + desc "Move old plans.data_contact to data_contact_email and data_contact_phone" + task plan_data_contacts: :environment do + email_regex = /([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})/i + phone_regex = /\+?[0-9\-\(\)]{7,}/i + Plan.where('data_contact IS NOT NULL').each do |p| + email = p.data_contact[email_regex] + phone = p.data_contact[phone_regex] + + # Remove the email, phone and any prefixes from the oriignal contact + contact = p.data_contact + contact = contact.gsub(email, '') unless email.nil? + contact = contact.gsub(phone, '') unless phone.nil? + contact = contact.gsub(/([Ee]mail|[Pp]hone|[Mm]obile|[Cc]ell|[Oo]ffice|[Hh]ome|[Ww]ork|[Tt]|[Ee]):?/, '') + contact = contact.gsub(' , ', '').strip + contact = contact[0..(contact.length - 2)] if contact.ends_with?(',') + contact = nil if contact == ',' + + p.update_attributes(data_contact_email: email, data_contact_phone: phone, + data_contact: contact) + end + end + + desc "Move old ORCID from users table to user_identifiers" + task move_orcids: :environment do + users = User.includes(:user_identifiers).where('users.orcid_id IS NOT NULL') + + # If we have users with orcid ids + if users.length > 0 + # If orcid isn't defined in the identifier_schemes table add it + if IdentifierScheme.find_by(name: 'orcid').nil? + IdentifierScheme.create!(name: 'orcid', + description: 'ORCID', + active: true, + logo_url: 'http://orcid.org/sites/default/files/images/orcid_16x16.png', + user_landing_url: 'https://orcid.org') + end + + scheme = IdentifierScheme.find_by(name: 'orcid') + + unless scheme.nil? + users.each do |u| + if u.orcid_id.gsub('orcid.org/', '').match(/^[\d-]+/) + schemes = u.user_identifiers.collect{|i| i.identifier_scheme_id} + + unless schemes.include?(scheme.id) + UserIdentifier.create(user: u, identifier_scheme: scheme, + identifier: u.orcid_id.gsub('orcid.org/', '')) + end + end + end + end + end + end + desc "Move old Shibboleth Ids from users table to user_identifiers" + task move_shibs: :environment do + if Rails.configuration.shibboleth_enabled + users = User.includes(:user_identifiers).where('users.shibboleth_id IS NOT NULL') + + # If we have users with orcid ids + if users.length > 0 + # If orcid isn't defined in the identifier_schemes table add it + if IdentifierScheme.find_by(name: 'shibboleth').nil? + IdentifierScheme.create!(name: 'shibboleth', + description: "Your institution credentials", + active: true) + end + + scheme = IdentifierScheme.find_by(name: 'shibboleth') + + unless scheme.nil? + users.each do |u| + schemes = u.user_identifiers.collect{|i| i.identifier_scheme_id} + + unless schemes.include?(scheme.id) +# TODO: Add logic to move shib identifiers over +# UserIdentifier.create(user: u, identifier_scheme: scheme, +# identifier: u.orcid_id.gsub('orcid.org/', '')) + end + end + end + end + end + end end