fixes import limit

This commit is contained in:
zmagod 2018-04-10 15:45:51 +02:00
parent b12f6f1b92
commit e4b49e62a3
7 changed files with 65 additions and 23 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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