diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index c377ae7..0a2c03b 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -2,7 +2,8 @@ class RegistrationsController < Devise::RegistrationsController def edit - @user.create_default_preferences if @user.prefs == {} + @user = current_user + @prefs = @user.get_preferences(:email) @languages = Language.sorted_by_abbreviation @orgs = Org.where(parent_id: nil).order("name") @other_organisations = Org.where(parent_id: nil, is_other: true).pluck(:id) @@ -72,6 +73,7 @@ def update if user_signed_in? then + @prefs = @user.get_preferences(:email) @orgs = Org.where(parent_id: nil).order("name") @default_org = current_user.org @other_organisations = Org.where(parent_id: nil, is_other: true).pluck(:id) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 6adb808..1915dc5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -58,28 +58,36 @@ end end - def update_preferences - @user = User.find(params[:user_id]) + def update_email_preferences prefs = params[:prefs] - authorize @user, :update? - # Set all preferences to false - @user.prefs.each do |key, value| - value.each_key do |k| - @user.prefs[key][k] = false - end + authorize current_user, :update? + pref = current_user.pref + # does user not have prefs? + if pref.blank? + pref = Pref.new + pref.settings = {} + pref.user = current_user end + pref.settings[:email] = booleanize_hash(prefs) + pref.save - # Sets the preferences the user wants to true - if prefs - prefs.each_key do |key| - prefs[key].each_key do |k| - @user.prefs[key.to_sym][k.to_sym] = true - end - end - end @tab = params[:tab] - @user.save redirect_to edit_user_registration_path(tab: @tab), notice: success_message(_('preferences'), _('saved')) end + private + + ## + # html forms return our boolean values as strings, this converts them to true/false + def booleanize_hash(node) + #leaf: convert to boolean and return + #hash: iterate over leaves + unless node.is_a?(Hash) + return node == "true" + end + node.each do |key, value| + node[key] = booleanize_hash(value) + end + end + end diff --git a/app/models/pref.rb b/app/models/pref.rb new file mode 100644 index 0000000..02e1a59 --- /dev/null +++ b/app/models/pref.rb @@ -0,0 +1,19 @@ +class Pref < ActiveRecord::Base + ## + # Serialize prefs to JSON + # The settings object only stores deviations from the default + serialize :settings, JSON + + ## + # Associations + belongs_to :user + + ## + # Returns the hash generated from default preferences + # + # @return [JSON] preferences hash + def self.default_settings + return Rails.configuration.branding[:preferences] + end + +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 08f6317..678c8dd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,5 +1,4 @@ class User < ActiveRecord::Base - include GlobalHelpers ## # Devise @@ -20,6 +19,7 @@ has_and_belongs_to_many :perms, join_table: :users_perms belongs_to :language belongs_to :org + has_one :pref has_many :answers has_many :notes has_many :exported_plans @@ -42,24 +42,8 @@ has_many :user_identifiers has_many :identifier_schemes, through: :user_identifiers - ## - # Possibly needed for active_admin - # -relies on protected_attributes gem as syntax depricated in rails 4.2 - #accepts_nested_attributes_for :roles - #attr_accessible :password_confirmation, :encrypted_password, :remember_me, - # :id, :email, :firstname, :last_login,:login_count, :orcid_id, - # :password, :shibboleth_id, :user_status_id, :surname, - # :user_type_id, :org_id, :skip_invitation, :other_organisation, - # :accept_terms, :role_ids, :dmponline3, :api_token, - # :organisation, :language, :language_id, :org, :perms, - # :confirmed_at, :org_id - validates :email, email: true, allow_nil: true, uniqueness: {message: _("must be unique")} - - validates :prefs, presence: true - before_validation :create_default_preferences - ## # Scopes default_scope { includes(:org, :perms, :plans) } @@ -223,17 +207,6 @@ end ## - # checks what type the user's organisation is - # - # @return [String] the organisation type -=begin - def org_type - org_type = org.organisation_type - return org_type - end -=end - - ## # removes the api_token from the user # modifies the user model def remove_token! @@ -273,53 +246,22 @@ end ## + # Return the user's preferences for a given base key + # + # @return [JSON] with symbols as keys + def get_preferences(key) + if self.pref.present? && self.pref.settings[key.to_s].present? + return self.pref.settings[key.to_s].deep_symbolize_keys + else + return Pref.default_settings[key] + end + end + + ## # Override devise_invitable email title # -------------------------------------------------------------- def deliver_invitation(options = {}) super(options.merge(subject: _('A Data Management Plan in %{application_name} has been shared with you') % {application_name: Rails.configuration.branding[:application][:name]})) end - - ## - # User Notification Preferences - def create_default_preferences - # Set the default preferences for a new user or if existing user if null - if self.id.nil? || self.prefs == {} - self.prefs = self.class.create_default_preferences - end - end - - def self.create_default_preferences - default_prefs = { - users: { - new_comment: true, - admin_privileges: true, - added_as_coowner: true - }, - owners_and_coowners: { - visibility_changed: true - }, - admins: { - template_published: true, - template_unpublished: true, - feedback_requested: true - } - } - end - -# TODO: Remove this, its never called. - # this generates a reset password link for a given user - # which can then be sent to them with the appropriate host - # prepended. -=begin - def reset_password_link - raw, enc = Devise.token_generator.generate(self.class, :reset_password_token) - self.reset_password_token = enc - self.reset_password_sent_at = Time.now.utc - save(validate: false) - - edit_user_password_path + '?reset_password_token=' + raw - end -=end - end diff --git a/app/views/users/_notification_preferences.html.erb b/app/views/users/_notification_preferences.html.erb index 819240d..ef6e11a 100644 --- a/app/views/users/_notification_preferences.html.erb +++ b/app/views/users/_notification_preferences.html.erb @@ -5,43 +5,49 @@
- <%= form_tag( url_for(controller: 'users', action: 'update_preferences', tab: 'notification-preferences-tab', escape: false), html: {method: :put, class: "roadmap-form"}) do |f| %> + <%= form_tag( update_email_preferences_user_path(@user), method: :put, html: {class: "roadmap-form"}) do |f| %> - <%= hidden_field_tag :user_id, @user.id %> - + <%= hidden_field_tag :tab, 'notification-preferences-tab' %>

All Users

- <%= check_box_tag 'prefs[users][new_comment]', true, @user.prefs[:users][:new_comment] %> + <%= hidden_field_tag 'prefs[users][new_comment]', false %> + <%= check_box_tag 'prefs[users][new_comment]', true, @prefs[:users][:new_comment] %> <%= label_tag 'prefs[users][new_comment]', 'A new comment has been added to my DMP', :class => 'checkbox-label' %>
- <%= check_box_tag 'prefs[users][added_as_coowner]', true, @user.prefs[:users][:added_as_coowner] %> + <%= hidden_field_tag 'prefs[users][added_as_coowner]', false %> + <%= check_box_tag 'prefs[users][added_as_coowner]', true, @prefs[:users][:added_as_coowner] %> <%= label_tag 'prefs[users][added_as_coowner]', 'A plan has been shared with me', :class => 'checkbox-label' %>
- <%= check_box_tag 'prefs[users][admin_privileges]', true, @user.prefs[:users][:admin_privileges] %> + <%= hidden_field_tag 'prefs[users][admin_privileges]', false %> + <%= check_box_tag 'prefs[users][admin_privileges]', true, @prefs[:users][:admin_privileges] %> <%= label_tag 'prefs[users][admin_privileges]', 'Admin privileges granted to me', :class => 'checkbox-label' %>

DMP owners and co-owners

- <%= check_box_tag 'prefs[owners_and_coowners][visibility_changed]', true, @user.prefs[:owners_and_coowners][:visibility_changed] %> + <%= hidden_field_tag 'prefs[owners_and_coowners][visibility_changed]', false %> + <%= check_box_tag 'prefs[owners_and_coowners][visibility_changed]', true, @prefs[:owners_and_coowners][:visibility_changed] %> <%= label_tag 'prefs[owners_and_coowners][visibility_changed]', "My DMP's visibility has changed", :class => 'checkbox-label' %>

DMP administrators

- <%= check_box_tag 'prefs[admins][template_published]', true, @user.prefs[:admins][:template_published] %> + <%= hidden_field_tag 'prefs[admins][template_published]', false %> + <%= check_box_tag 'prefs[admins][template_published]', true, @prefs[:admins][:template_published] %> <%= label_tag 'prefs[admins][template_published]', 'An organisational template is published', :class => 'checkbox-label' %>
- <%= check_box_tag 'prefs[admins][template_unpublished]', true, @user.prefs[:admins][:template_unpublished] %> + <%= hidden_field_tag 'prefs[admins][template_unpublished]', false %> + <%= check_box_tag 'prefs[admins][template_unpublished]', true, @prefs[:admins][:template_unpublished] %> <%= label_tag 'prefs[admins][template_unpublished]', 'An organisational template is unpublished', :class => 'checkbox-label' %>
- <%= check_box_tag 'prefs[admins][feedback_requested]', true, @user.prefs[:admins][:feedback_requested] %> + <%= hidden_field_tag 'prefs[admins][feedback_requested]', false %> + <%= check_box_tag 'prefs[admins][feedback_requested]', true, @prefs[:admins][:feedback_requested] %> <%= label_tag 'prefs[admins][feedback_requested]', 'A user has requested feedback on a DMP', :class => 'checkbox-label' %>
diff --git a/config/branding_example.yml b/config/branding_example.yml index 329fa1d..47d0b2c 100644 --- a/config/branding_example.yml +++ b/config/branding_example.yml @@ -17,6 +17,19 @@ issue_list_url: 'https://github.com/DMPRoadmap/roadmap/issues' user_group_subscription_url: 'http://listserv.ucop.edu/cgi-bin/wa.exe?SUBED1=ROADMAP-L&A=1' + preferences: + email: + users: + new_comment: true + admin_privileges: true + added_as_coowner: true + owners_and_coowners: + visibility_changed: true + admins: + template_published: true + template_unpublished: true + feedback_requested: true + development: <<: *defaults diff --git a/config/routes.rb b/config/routes.rb index 65b9185..9d0e26f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -39,7 +39,6 @@ get "/users/sign_out", :to => "devise/sessions#destroy" end - match '/users/update_preferences/' => 'users#update_preferences', as: 'user_update_preferences', via: [:put, :post] # WAYFless access point - use query param idp #get 'auth/shibboleth' => 'users/omniauth_shibboleth_request#redirect', :as => 'user_omniauth_shibboleth' @@ -57,7 +56,11 @@ get '/orgs/shibboleth/:org_name', to: 'orgs#shibboleth_ds_passthru' post '/orgs/shibboleth', to: 'orgs#shibboleth_ds_passthru' - #ActiveAdmin.routes(self) + resources :users, path: 'users', only: [] do + member do + put 'update_email_preferences' + end + end #organisation admin area resources :users, :path => 'org/admin/users', only: [] do @@ -220,34 +223,6 @@ end end -# resources :projects do -# resources :plans , only: [:edit, :update] do -# member do -# get 'status' -# get 'locked' -# get 'answer' -# #get 'edit' -# post 'delete_recent_locks' -# post 'lock_section', constraints: {format: [:html, :json]} -# post 'unlock_section', constraints: {format: [:html, :json]} -# post 'unlock_all_sections' -# get 'export' -# get 'warning' -# get 'section_answers' -# end -# end -# -# member do -# get 'share' -# get 'export' -# post 'invite' -# end -# collection do -# get 'possible_templates' -# get 'possible_guidance' -# end -# end - resources :roles, only: [:create, :update, :destroy] namespace :settings do @@ -272,57 +247,4 @@ end end - # The priority is based upon order of creation: - # first created -> highest priority. - - # Sample of regular route: - # match 'products/:id' => 'catalog#view' - # Keep in mind you can assign values other than :controller and :action - - # Sample of named route: - # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase - # This route can be invoked with purchase_url(:id => product.id) - - # Sample resource route (maps HTTP verbs to controller actions automatically): - # resources :products - - # Sample resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Sample resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Sample resource route with more complex sub-resources - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', :on => :collection - # end - # end - - # Sample resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end - - - # See how all your routes lay out with "rake routes" - - # This is a legacy wild controller route that's not recommended for RESTful applications. - # Note: This route will make all actions in every controller accessible via GET requests. - # match ':controller(/:action(/:id))(.:format)' end diff --git a/db/migrate/20170712084314_move_prefs_to_table.rb b/db/migrate/20170712084314_move_prefs_to_table.rb new file mode 100644 index 0000000..1f3514b --- /dev/null +++ b/db/migrate/20170712084314_move_prefs_to_table.rb @@ -0,0 +1,12 @@ +class MovePrefsToTable < ActiveRecord::Migration + def change + remove_column :users, :prefs + + create_table :prefs do |t| + t.string :settings + t.integer :user_id + end + end +end + + diff --git a/db/schema.rb b/db/schema.rb index 229bfd9..791d0d7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,423 +11,443 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170619173045) do +ActiveRecord::Schema.define(version: 20170712084314) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" create_table "annotations", force: :cascade do |t| - t.integer "question_id", limit: 4 - t.integer "org_id", limit: 4 - t.text "text", limit: 65535 - t.integer "type", limit: 4, default: 0, null: false + t.integer "question_id" + t.integer "org_id" + t.text "text" + t.integer "type", default: 0, null: false t.datetime "created_at" t.datetime "updated_at" end - add_index "annotations", ["org_id"], name: "fk_rails_aca7521f72" - add_index "annotations", ["question_id"], name: "fk_rails_0e08e753b6" + add_index "annotations", ["question_id"], name: "index_annotations_on_question_id", using: :btree create_table "answers", force: :cascade do |t| - t.text "text", limit: 65535 - t.integer "plan_id", limit: 4 - t.integer "user_id", limit: 4 - t.integer "question_id", limit: 4 + t.text "text" + t.integer "plan_id" + t.integer "user_id" + t.integer "question_id" t.datetime "created_at" t.datetime "updated_at" - t.integer "lock_version", limit: 4, default: 0 + t.integer "lock_version", default: 0 end - add_index "answers", ["plan_id"], name: "fk_rails_84a6005a3e" - add_index "answers", ["question_id"], name: "fk_rails_3d5ed4418f" - add_index "answers", ["user_id"], name: "fk_rails_584be190c2" - create_table "answers_question_options", id: false, force: :cascade do |t| - t.integer "answer_id", limit: 4, null: false - t.integer "question_option_id", limit: 4, null: false + t.integer "answer_id", null: false + t.integer "question_option_id", null: false end - add_index "answers_question_options", ["answer_id", "question_option_id"], name: "answer_question_option_index" - add_index "answers_question_options", ["question_option_id", "answer_id"], name: "question_option_answer_index" + add_index "answers_question_options", ["answer_id"], name: "index_answers_question_options_on_answer_id", using: :btree create_table "exported_plans", force: :cascade do |t| - t.integer "plan_id", limit: 4 - t.integer "user_id", limit: 4 - t.string "format", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "phase_id", limit: 4 + t.integer "plan_id" + t.integer "user_id" + t.string "format" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "phase_id" end create_table "file_types", force: :cascade do |t| - t.string "name", limit: 255 - t.string "icon_name", limit: 255 - t.integer "icon_size", limit: 4 - t.string "icon_location", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.string "name" + t.string "icon_name" + t.integer "icon_size" + t.string "icon_location" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "file_uploads", force: :cascade do |t| - t.string "name", limit: 255 - t.string "title", limit: 255 - t.text "description", limit: 65535 - t.integer "size", limit: 4 + t.string "name" + t.string "title" + t.text "description" + t.integer "size" t.boolean "published" - t.string "location", limit: 255 - t.integer "file_type_id", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.string "location" + t.integer "file_type_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "friendly_id_slugs", force: :cascade do |t| - t.string "slug", limit: 255, null: false - t.integer "sluggable_id", limit: 4, null: false + t.string "slug", null: false + t.integer "sluggable_id", null: false t.string "sluggable_type", limit: 40 t.datetime "created_at" end - add_index "friendly_id_slugs", ["slug", "sluggable_type"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type", unique: true - add_index "friendly_id_slugs", ["sluggable_id"], name: "index_friendly_id_slugs_on_sluggable_id" - add_index "friendly_id_slugs", ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type" + add_index "friendly_id_slugs", ["slug", "sluggable_type"], name: "index_friendly_id_slugs_on_slug_and_sluggable_type", unique: true, using: :btree + add_index "friendly_id_slugs", ["sluggable_id"], name: "index_friendly_id_slugs_on_sluggable_id", using: :btree + add_index "friendly_id_slugs", ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type", using: :btree create_table "guidance_groups", force: :cascade do |t| - t.string "name", limit: 255 - t.integer "org_id", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.string "name" + t.integer "org_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.boolean "optional_subset" t.boolean "published" end - add_index "guidance_groups", ["org_id"], name: "fk_rails_819c1dbbc7" + add_index "guidance_groups", ["org_id"], name: "index_guidance_groups_on_org_id", using: :btree create_table "guidances", force: :cascade do |t| - t.text "text", limit: 65535 - t.integer "guidance_group_id", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "question_id", limit: 4 + t.text "text" + t.integer "guidance_group_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "question_id" t.boolean "published" end - add_index "guidances", ["guidance_group_id"], name: "fk_rails_20d29da787" + add_index "guidances", ["guidance_group_id"], name: "index_guidances_on_guidance_group_id", using: :btree create_table "identifier_schemes", force: :cascade do |t| - t.string "name", limit: 255 - t.string "description", limit: 255 + t.string "name" + t.string "description" t.boolean "active" t.datetime "created_at" t.datetime "updated_at" - t.string "logo_url", limit: 255 - t.string "user_landing_url", limit: 255 + t.string "logo_url" + t.string "user_landing_url" end create_table "languages", force: :cascade do |t| - t.string "abbreviation", limit: 255 - t.string "description", limit: 255 - t.string "name", limit: 255 + t.string "abbreviation" + t.string "description" + t.string "name" t.boolean "default_language" end create_table "notes", force: :cascade do |t| - t.integer "user_id", limit: 4 - t.text "text", limit: 65535 + t.integer "user_id" + t.text "text" t.boolean "archived" - t.integer "answer_id", limit: 4 - t.integer "archived_by", limit: 4 + t.integer "answer_id" + t.integer "archived_by" t.datetime "created_at" t.datetime "updated_at" end - add_index "notes", ["answer_id"], name: "fk_rails_907f8d48bf" - add_index "notes", ["user_id"], name: "fk_rails_7f2323ad43" + add_index "notes", ["answer_id"], name: "index_notes_on_answer_id", using: :btree create_table "org_identifiers", force: :cascade do |t| - t.string "identifier", limit: 255 - t.string "attrs", limit: 255 + t.string "identifier" + t.string "attrs" t.datetime "created_at" t.datetime "updated_at" - t.integer "org_id", limit: 4 - t.integer "identifier_scheme_id", limit: 4 + t.integer "org_id" + t.integer "identifier_scheme_id" end - add_index "org_identifiers", ["identifier_scheme_id"], name: "fk_rails_189ad2e573" - add_index "org_identifiers", ["org_id"], name: "fk_rails_36323c0674" - create_table "org_token_permissions", force: :cascade do |t| - t.integer "org_id", limit: 4 - t.integer "token_permission_type_id", limit: 4 + t.integer "org_id" + t.integer "token_permission_type_id" t.datetime "created_at" t.datetime "updated_at" end - add_index "org_token_permissions", ["org_id"], name: "fk_rails_e1db1b22c5" - add_index "org_token_permissions", ["token_permission_type_id"], name: "fk_rails_2aa265f538" + add_index "org_token_permissions", ["org_id"], name: "index_org_token_permissions_on_org_id", using: :btree create_table "orgs", force: :cascade do |t| - t.string "name", limit: 255 - t.string "abbreviation", limit: 255 - t.string "target_url", limit: 255 - t.string "wayfless_entity", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "parent_id", limit: 4 + t.string "name" + t.string "abbreviation" + t.string "target_url" + t.string "wayfless_entity" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "parent_id" t.boolean "is_other" - t.string "sort_name", limit: 255 - t.text "banner_text", limit: 65535 - t.string "logo_file_name", limit: 255 - t.integer "region_id", limit: 4 - t.integer "language_id", limit: 4 - t.string "logo_uid", limit: 255 - t.string "logo_name", limit: 255 - t.string "contact_email", limit: 255 - t.integer "org_type", limit: 4, default: 0, null: false + t.string "sort_name" + t.text "banner_text" + t.string "logo_file_name" + t.integer "region_id" + t.integer "language_id" + t.string "logo_uid" + t.string "logo_name" + t.string "contact_email" + t.integer "org_type", default: 0, null: false end - add_index "orgs", ["language_id"], name: "fk_rails_5640112cab" - add_index "orgs", ["region_id"], name: "fk_rails_5a6adf6bab" - create_table "perms", force: :cascade do |t| - t.string "name", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - add_index "perms", ["name"], name: "index_perms_on_name" - add_index "perms", ["name"], name: "index_roles_on_name_and_resource_type_and_resource_id" + add_index "perms", ["name"], name: "index_perms_on_name", using: :btree + add_index "perms", ["name"], name: "index_roles_on_name_and_resource_type_and_resource_id", using: :btree create_table "phases", force: :cascade do |t| - t.string "title", limit: 255 - t.text "description", limit: 65535 - t.integer "number", limit: 4 - t.integer "template_id", limit: 4 + t.string "title" + t.text "description" + t.integer "number" + t.integer "template_id" t.datetime "created_at" t.datetime "updated_at" - t.string "slug", limit: 255 + t.string "slug" t.boolean "modifiable" end - add_index "phases", ["template_id"], name: "index_phases_on_template_id" + add_index "phases", ["template_id"], name: "index_phases_on_template_id", using: :btree create_table "plans", force: :cascade do |t| - t.string "title", limit: 255 - t.integer "template_id", limit: 4 + t.string "title" + t.integer "template_id" t.datetime "created_at" t.datetime "updated_at" - t.string "slug", limit: 255 - t.string "grant_number", limit: 255 - t.string "identifier", limit: 255 - t.text "description", limit: 65535 - t.string "principal_investigator", limit: 255 - t.string "principal_investigator_identifier", limit: 255 - t.string "data_contact", limit: 255 - t.string "funder_name", limit: 255 - t.integer "visibility", limit: 4, default: 0, null: false - t.string "data_contact_email", limit: 255 - t.string "data_contact_phone", limit: 255 + t.string "slug" + t.string "grant_number" + t.string "identifier" + t.text "description" + t.string "principal_investigator" + t.string "principal_investigator_identifier" + t.string "data_contact" + t.string "funder_name" + t.integer "visibility", default: 0, null: false + t.string "data_contact_email" + t.string "data_contact_phone" end - add_index "plans", ["template_id"], name: "index_plans_on_template_id" + add_index "plans", ["template_id"], name: "index_plans_on_template_id", using: :btree create_table "plans_guidance_groups", force: :cascade do |t| - t.integer "guidance_group_id", limit: 4 - t.integer "plan_id", limit: 4 + t.integer "guidance_group_id" + t.integer "plan_id" end - add_index "plans_guidance_groups", ["guidance_group_id"], name: "fk_rails_ec1c5524d7" - add_index "plans_guidance_groups", ["plan_id"], name: "fk_rails_13d0671430" + create_table "prefs", force: :cascade do |t| + t.string "settings" + t.integer "user_id" + end create_table "question_formats", force: :cascade do |t| - t.string "title", limit: 255 - t.text "description", limit: 65535 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "option_based", default: false - t.integer "formattype", limit: 4, default: 0 + t.string "title" + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "option_based", default: false + t.integer "formattype", default: 0 end create_table "question_options", force: :cascade do |t| - t.integer "question_id", limit: 4 - t.string "text", limit: 255 - t.integer "number", limit: 4 + t.integer "question_id" + t.string "text" + t.integer "number" t.boolean "is_default" t.datetime "created_at" t.datetime "updated_at" end - add_index "question_options", ["question_id"], name: "fk_rails_b9c5f61cf9" + add_index "question_options", ["question_id"], name: "index_question_options_on_question_id", using: :btree create_table "questions", force: :cascade do |t| - t.text "text", limit: 65535 - t.text "default_value", limit: 65535 - t.integer "number", limit: 4 - t.integer "section_id", limit: 4 + t.text "text" + t.text "default_value" + t.integer "number" + t.integer "section_id" t.datetime "created_at" t.datetime "updated_at" - t.integer "question_format_id", limit: 4 - t.boolean "option_comment_display", default: true + t.integer "question_format_id" + t.boolean "option_comment_display", default: true t.boolean "modifiable" end - add_index "questions", ["question_format_id"], name: "fk_rails_4fbc38c8c7" - add_index "questions", ["section_id"], name: "index_questions_on_section_id" + add_index "questions", ["section_id"], name: "index_questions_on_section_id", using: :btree create_table "questions_themes", id: false, force: :cascade do |t| - t.integer "question_id", limit: 4, null: false - t.integer "theme_id", limit: 4, null: false + t.integer "question_id", null: false + t.integer "theme_id", null: false end - add_index "questions_themes", ["question_id", "theme_id"], name: "question_theme_index" - add_index "questions_themes", ["theme_id", "question_id"], name: "theme_question_index" + add_index "questions_themes", ["question_id"], name: "index_questions_themes_on_question_id", using: :btree create_table "regions", force: :cascade do |t| - t.string "abbreviation", limit: 255 - t.string "description", limit: 255 - t.string "name", limit: 255 - t.integer "super_region_id", limit: 4 + t.string "abbreviation" + t.string "description" + t.string "name" + t.integer "super_region_id" end create_table "roles", force: :cascade do |t| - t.integer "user_id", limit: 4 - t.integer "plan_id", limit: 4 + t.integer "user_id" + t.integer "plan_id" t.datetime "created_at" t.datetime "updated_at" - t.integer "access", limit: 4, default: 0, null: false + t.integer "access", default: 0, null: false end - add_index "roles", ["plan_id"], name: "fk_rails_a1ce6c2772" - add_index "roles", ["user_id"], name: "fk_rails_ab35d699f0" + add_index "roles", ["plan_id"], name: "index_roles_on_plan_id", using: :btree + add_index "roles", ["user_id"], name: "index_roles_on_user_id", using: :btree create_table "sections", force: :cascade do |t| - t.string "title", limit: 255 - t.text "description", limit: 65535 - t.integer "number", limit: 4 + t.string "title" + t.text "description" + t.integer "number" t.datetime "created_at" t.datetime "updated_at" t.boolean "published" - t.integer "phase_id", limit: 4 + t.integer "phase_id" t.boolean "modifiable" end - add_index "sections", ["phase_id"], name: "index_sections_on_phase_id" + add_index "sections", ["phase_id"], name: "index_sections_on_phase_id", using: :btree create_table "settings", force: :cascade do |t| - t.string "var", limit: 255, null: false - t.text "value", limit: 65535 - t.integer "target_id", limit: 4, null: false - t.string "target_type", limit: 255, null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.string "var", null: false + t.text "value" + t.integer "target_id", null: false + t.string "target_type", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - add_index "settings", ["target_type", "target_id", "var"], name: "index_settings_on_target_type_and_target_id_and_var", unique: true + add_index "settings", ["target_type", "target_id", "var"], name: "index_settings_on_target_type_and_target_id_and_var", unique: true, using: :btree create_table "splash_logs", force: :cascade do |t| - t.string "destination", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.string "destination" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "templates", force: :cascade do |t| - t.string "title", limit: 255 - t.text "description", limit: 65535 + t.string "title" + t.text "description" t.boolean "published" - t.integer "org_id", limit: 4 - t.string "locale", limit: 255 + t.integer "org_id" + t.string "locale" t.boolean "is_default" t.datetime "created_at" t.datetime "updated_at" - t.integer "version", limit: 4 - t.integer "visibility", limit: 4 - t.integer "customization_of", limit: 4 - t.integer "dmptemplate_id", limit: 4 + t.integer "version" + t.integer "visibility" + t.integer "customization_of" + t.integer "dmptemplate_id" t.boolean "migrated" - t.boolean "dirty", default: false + t.boolean "dirty", default: false end - add_index "templates", ["org_id", "dmptemplate_id"], name: "template_organisation_dmptemplate_index" - add_index "templates", ["org_id"], name: "index_templates_on_org_id" + add_index "templates", ["org_id", "dmptemplate_id"], name: "template_organisation_dmptemplate_index", using: :btree + add_index "templates", ["org_id"], name: "index_templates_on_org_id", using: :btree create_table "themes", force: :cascade do |t| - t.string "title", limit: 255 - t.text "description", limit: 65535 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "locale", limit: 255 + t.string "title" + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "locale" end create_table "themes_in_guidance", id: false, force: :cascade do |t| - t.integer "theme_id", limit: 4 - t.integer "guidance_id", limit: 4 + t.integer "theme_id" + t.integer "guidance_id" end - add_index "themes_in_guidance", ["guidance_id"], name: "fk_rails_a5ab9402df" - add_index "themes_in_guidance", ["theme_id"], name: "fk_rails_7d708f6f1e" + add_index "themes_in_guidance", ["guidance_id"], name: "index_themes_in_guidance_on_guidance_id", using: :btree + add_index "themes_in_guidance", ["theme_id"], name: "index_themes_in_guidance_on_theme_id", using: :btree create_table "token_permission_types", force: :cascade do |t| - t.string "token_type", limit: 255 - t.text "text_description", limit: 65535 + t.string "token_type" + t.text "text_description" t.datetime "created_at" t.datetime "updated_at" end create_table "user_identifiers", force: :cascade do |t| - t.string "identifier", limit: 255 + t.string "identifier" t.datetime "created_at" t.datetime "updated_at" - t.integer "user_id", limit: 4 - t.integer "identifier_scheme_id", limit: 4 + t.integer "user_id" + t.integer "identifier_scheme_id" end - add_index "user_identifiers", ["identifier_scheme_id"], name: "fk_rails_fe95df7db0" - add_index "user_identifiers", ["user_id"], name: "fk_rails_65c9a98cdb" + add_index "user_identifiers", ["user_id"], name: "index_user_identifiers_on_user_id", using: :btree create_table "users", force: :cascade do |t| - t.string "firstname", limit: 255 - t.string "surname", limit: 255 - t.string "email", limit: 255, default: "", null: false - t.string "orcid_id", limit: 255 - t.string "shibboleth_id", limit: 255 - t.datetime "created_at" - t.datetime "updated_at" - t.string "encrypted_password", limit: 255, default: "" - t.string "reset_password_token", limit: 255 + t.string "firstname" + t.string "surname" + t.string "email", default: "", null: false + t.string "orcid_id" + t.string "shibboleth_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "encrypted_password", default: "" + t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", limit: 4, default: 0 + t.integer "sign_in_count", default: 0 t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip", limit: 255 - t.string "last_sign_in_ip", limit: 255 - t.string "confirmation_token", limit: 255 + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" + t.string "confirmation_token" t.datetime "confirmed_at" t.datetime "confirmation_sent_at" - t.string "invitation_token", limit: 255 + t.string "invitation_token" t.datetime "invitation_created_at" t.datetime "invitation_sent_at" t.datetime "invitation_accepted_at" - t.string "other_organisation", limit: 255 + t.string "other_organisation" t.boolean "accept_terms" - t.integer "org_id", limit: 4 - t.string "api_token", limit: 255 - t.integer "invited_by_id", limit: 4 - t.string "invited_by_type", limit: 255 - t.integer "language_id", limit: 4 - t.string "recovery_email", limit: 255 - t.binary "prefs" + t.integer "org_id" + t.string "api_token" + t.integer "invited_by_id" + t.string "invited_by_type" + t.integer "language_id" + t.string "recovery_email" end - add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true - add_index "users", ["email"], name: "index_users_on_email", unique: true - add_index "users", ["invitation_token"], name: "index_users_on_invitation_token", unique: true - add_index "users", ["language_id"], name: "fk_rails_45f4f12508" - add_index "users", ["org_id"], name: "fk_rails_e73753bccb" - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true + add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree + add_index "users", ["org_id"], name: "index_users_on_org_id", using: :btree create_table "users_perms", id: false, force: :cascade do |t| - t.integer "user_id", limit: 4 - t.integer "perm_id", limit: 4 + t.integer "user_id" + t.integer "perm_id" end - add_index "users_perms", ["perm_id"], name: "fk_rails_457217c31c" - add_index "users_perms", ["user_id", "perm_id"], name: "index_users_perms_on_user_id_and_perm_id" + add_index "users_perms", ["user_id"], name: "index_users_perms_on_user_id", using: :btree + add_foreign_key "annotations", "orgs" + add_foreign_key "annotations", "questions" + add_foreign_key "answers", "plans" + add_foreign_key "answers", "questions" + add_foreign_key "answers", "users" + add_foreign_key "answers_question_options", "answers" + add_foreign_key "answers_question_options", "question_options" + add_foreign_key "guidance_groups", "orgs" + add_foreign_key "guidances", "guidance_groups" + add_foreign_key "notes", "answers" + add_foreign_key "notes", "users" + add_foreign_key "org_identifiers", "identifier_schemes" + add_foreign_key "org_identifiers", "orgs" + add_foreign_key "org_token_permissions", "orgs" + add_foreign_key "org_token_permissions", "token_permission_types" + add_foreign_key "orgs", "languages" + add_foreign_key "orgs", "regions" + add_foreign_key "phases", "templates" + add_foreign_key "plans", "templates" + add_foreign_key "plans_guidance_groups", "guidance_groups" + add_foreign_key "plans_guidance_groups", "plans" + add_foreign_key "question_options", "questions" + add_foreign_key "questions", "question_formats" + add_foreign_key "questions", "sections" + add_foreign_key "questions_themes", "questions" + add_foreign_key "questions_themes", "themes" + add_foreign_key "roles", "plans" + add_foreign_key "roles", "users" + add_foreign_key "sections", "phases" + add_foreign_key "templates", "orgs" + add_foreign_key "themes_in_guidance", "guidances" + add_foreign_key "themes_in_guidance", "themes" + add_foreign_key "user_identifiers", "identifier_schemes" + add_foreign_key "user_identifiers", "users" + add_foreign_key "users", "languages" + add_foreign_key "users", "orgs" + add_foreign_key "users_perms", "perms" + add_foreign_key "users_perms", "users" end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index a0718b3..2383f61 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -327,10 +327,4 @@ verify_belongs_to_relationship(@user, language) end - # --------------------------------------------------- - test "can create default notification preferences when user is created" do - user = User.create(email: 'test@testing.org', password: 'testing1234') - user.save - assert_not_nil(user.prefs) - end end