diff --git a/app/controllers/repository_columns_controller.rb b/app/controllers/repository_columns_controller.rb index 6c02dc3cf..216d7312f 100644 --- a/app/controllers/repository_columns_controller.rb +++ b/app/controllers/repository_columns_controller.rb @@ -162,7 +162,9 @@ class RepositoryColumnsController < ApplicationController def generate_repository_list_items(item_names) return unless @repository_column.data_type == 'RepositoryListValue' + column_items = @repository_column.repository_list_items.size item_names.split(',').uniq.each do |name| + next if column_items >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN RepositoryListItem.create( repository: @repository, repository_column: @repository_column, @@ -170,11 +172,13 @@ class RepositoryColumnsController < ApplicationController created_by: current_user, last_modified_by: current_user ) + column_items += 1 end end def update_repository_list_items(item_names) return unless @repository_column.data_type == 'RepositoryListValue' + column_items = @repository_column.repository_list_items.size items_list = item_names.split(',').uniq existing = @repository_column.repository_list_items.pluck(:data) existing.each do |name| @@ -191,6 +195,7 @@ class RepositoryColumnsController < ApplicationController end items_list.each do |name| next if @repository_column.repository_list_items.find_by_data(name) + next if column_items >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN RepositoryListItem.create( repository: @repository, repository_column: @repository_column, @@ -198,6 +203,7 @@ class RepositoryColumnsController < ApplicationController created_by: current_user, last_modified_by: current_user ) + column_items += 1 end end end diff --git a/app/models/repository_list_item.rb b/app/models/repository_list_item.rb index 99f66c597..e3dbeeb5f 100644 --- a/app/models/repository_list_item.rb +++ b/app/models/repository_list_item.rb @@ -1,5 +1,4 @@ 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 @@ -13,5 +12,4 @@ 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/utilities/repository_import_parser/importer.rb b/app/utilities/repository_import_parser/importer.rb index c3123f9a5..e244fc80f 100644 --- a/app/utilities/repository_import_parser/importer.rb +++ b/app/utilities/repository_import_parser/importer.rb @@ -53,6 +53,7 @@ module RepositoryImportParser def import_rows! errors = false + column_items = [] @rows.each do |row| # Skip empty rows next if row.empty? @@ -71,16 +72,28 @@ module RepositoryImportParser end row_cell_values = [] - row.each.with_index do |value, index| column = @columns[index] + size = 0 if column && value.present? + if column.data_type == 'RepositoryListValue' + current_items_column = get_items_column(column_items, column) + size = current_items_column.list_items_number + end # uses RepositoryCellValueResolver to retrieve the correct value cell_value_resolver = RepositoryImportParser::RepositoryCellValueResolver.new( - column, @user, @repository + column, + @user, + @repository, + size ) cell_value = cell_value_resolver.get_value(value, record_row) + if column.data_type == 'RepositoryListValue' + current_items_column.list_items_number = + cell_value_resolver.column_list_items_size + end + next if cell_value.nil? # checks the case if we reach items limit unless cell_value.valid? errors = true raise ActiveRecord::Rollback @@ -125,5 +138,21 @@ module RepositoryImportParser ).failed_instances.any? true end + + def get_items_column(list, column) + current_column = nil + list.each do |element| + current_column = element if element.column == column + end + unless current_column + new_column = RepositoryImportParser::ListItemsColumn.new( + column, + column.repository_list_items.size + ) + list << new_column + return new_column + end + current_column + end end end diff --git a/app/utilities/repository_import_parser/list_items_column.rb b/app/utilities/repository_import_parser/list_items_column.rb new file mode 100644 index 000000000..dc9a0a76b --- /dev/null +++ b/app/utilities/repository_import_parser/list_items_column.rb @@ -0,0 +1,10 @@ +module RepositoryImportParser + class ListItemsColumn + attr_accessor :column, :list_items_number + + def initialize(column, list_items_number) + @column = column + @list_items_number = list_items_number + end + end +end diff --git a/app/utilities/repository_import_parser/repository_cell_value_resolver.rb b/app/utilities/repository_import_parser/repository_cell_value_resolver.rb index 2ae63e988..6cb6c9530 100644 --- a/app/utilities/repository_import_parser/repository_cell_value_resolver.rb +++ b/app/utilities/repository_import_parser/repository_cell_value_resolver.rb @@ -4,10 +4,12 @@ # it to the repository_row module RepositoryImportParser class RepositoryCellValueResolver - def initialize(column, user, repository) + attr_reader :column_list_items_size + def initialize(column, user, repository, size) @column = column @user = user @repository = repository + @column_list_items_size = size end def get_value(value, record_row) @@ -30,6 +32,7 @@ module RepositoryImportParser def new_repository_list_value(value, record_row) list_item = @column.repository_list_items.find_by_data(value) list_item ||= create_repository_list_item(value) + return unless list_item RepositoryListValue.new( created_by: @user, last_modified_by: @user, @@ -42,13 +45,18 @@ module RepositoryImportParser end def create_repository_list_item(value) - RepositoryListItem.create( - data: value, - created_by: @user, - last_modified_by: @user, - repository_column: @column, - repository: @repository - ) + if @column_list_items_size >= Constants::REPOSITORY_LIST_ITEMS_PER_COLUMN + return + end + item = RepositoryListItem.new(data: value, + created_by: @user, + last_modified_by: @user, + repository_column: @column, + repository: @repository) + if item.save + @column_list_items_size += 1 + return item + end end end end diff --git a/app/validators/repository_list_item_validator.rb b/app/validators/repository_list_item_validator.rb deleted file mode 100644 index 740bb9afc..000000000 --- a/app/validators/repository_list_item_validator.rb +++ /dev/null @@ -1,9 +0,0 @@ -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/spec/utilities/repository_import_parser/repository_cell_value_resolver_spec.rb b/spec/utilities/repository_import_parser/repository_cell_value_resolver_spec.rb index e213002f2..85abfa928 100644 --- a/spec/utilities/repository_import_parser/repository_cell_value_resolver_spec.rb +++ b/spec/utilities/repository_import_parser/repository_cell_value_resolver_spec.rb @@ -28,7 +28,7 @@ describe RepositoryImportParser::RepositoryCellValueResolver do context 'RepositoryListValue' do let(:subject) do RepositoryImportParser::RepositoryCellValueResolver.new( - sample_group_column, user, repository + sample_group_column, user, repository, 0 ) end @@ -51,7 +51,7 @@ describe RepositoryImportParser::RepositoryCellValueResolver do context 'RepositoryTextValue' do let(:subject) do RepositoryImportParser::RepositoryCellValueResolver.new( - custom_column, user, repository + custom_column, user, repository, 0 ) it 'returns a valid RepositoryTextValue object' do