From b12f6f1b92c36b145366dc6aff43d4c9a535406c Mon Sep 17 00:00:00 2001 From: zmagod Date: Mon, 9 Apr 2018 12:50:25 +0200 Subject: [PATCH] set limit on maximum number of dropdown list items [fixes SCI-2259] --- app/models/repository_list_item.rb | 2 ++ app/validators/repository_list_item_validator.rb | 9 +++++++++ app/views/repositories/_parse_records_modal.html.erb | 4 ++-- config/initializers/constants.rb | 2 ++ config/locales/en.yml | 2 +- spec/models/repository_list_item_spec.rb | 4 ++-- 6 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 app/validators/repository_list_item_validator.rb diff --git a/app/models/repository_list_item.rb b/app/models/repository_list_item.rb index e3dbeeb5f..99f66c597 100644 --- a/app/models/repository_list_item.rb +++ b/app/models/repository_list_item.rb @@ -1,4 +1,5 @@ class RepositoryListItem < ApplicationRecord + include ActiveModel::Validations has_many :repository_list_values, inverse_of: :repository_list_item belongs_to :repository, inverse_of: :repository_list_items belongs_to :repository_column, inverse_of: :repository_list_items @@ -12,4 +13,5 @@ class RepositoryListItem < ApplicationRecord presence: true, uniqueness: { scope: :repository_column, case_sensitive: false }, length: { maximum: Constants::TEXT_MAX_LENGTH } + validates_with RepositoryListItemValidator end diff --git a/app/validators/repository_list_item_validator.rb b/app/validators/repository_list_item_validator.rb new file mode 100644 index 000000000..740bb9afc --- /dev/null +++ b/app/validators/repository_list_item_validator.rb @@ -0,0 +1,9 @@ +class RepositoryListItemValidator < ActiveModel::Validator + def validate(record) + return unless record.repository_column + items_length = record.repository_column.repository_list_items.size + if items_length >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN + record.errors[:items_limit] << 'Maximum number of list items reached!' + end + end +end diff --git a/app/views/repositories/_parse_records_modal.html.erb b/app/views/repositories/_parse_records_modal.html.erb index 44c398a16..14536ce18 100644 --- a/app/views/repositories/_parse_records_modal.html.erb +++ b/app/views/repositories/_parse_records_modal.html.erb @@ -64,8 +64,8 @@ diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index 54a793cc1..bface4e3e 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -868,6 +868,8 @@ class Constants EXPORTABLE_ZIP_EXPIRATION_DAYS = 7 + REPOSITORY_LIST_ITEMS_PER_COLUMN = 500 + # Very basic regex to check for validity of emails BASIC_EMAIL_REGEX = URI::MailTo::EMAIL_REGEXP diff --git a/config/locales/en.yml b/config/locales/en.yml index 31847fa5c..e5410189b 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -966,7 +966,7 @@ en: delete: "Delete column" modal_parse: title: 'Import items' - warning_1: 'Be careful when importing into Dropdown column/s! Each new unique cell value from the file will create a new Dropdown option. This could result in large amounts of Dropdown options.' + warning_1: 'Be careful when importing into Dropdown column/s! Each new unique cell value from the file will create a new Dropdown option. Maximum nr. of Dropdown options is %{limit}.' warning_2: 'Importing into file columns is not supported.' modal_import: title: 'Import items' diff --git a/spec/models/repository_list_item_spec.rb b/spec/models/repository_list_item_spec.rb index dde1ae856..40f9937e8 100644 --- a/spec/models/repository_list_item_spec.rb +++ b/spec/models/repository_list_item_spec.rb @@ -22,14 +22,14 @@ RSpec.describe RepositoryListItem, type: :model do end describe 'Validations' do + let!(:user) { create :user } + let!(:repository_one) { create :repository } it { should validate_presence_of(:data) } it do should validate_length_of(:data).is_at_most(Constants::TEXT_MAX_LENGTH) end context 'has a uniq data scoped on repository column' do - let!(:user) { create :user } - let!(:repository_one) { create :repository } let!(:repository_column) do create :repository_column, name: 'My column', repository: repository_one end