mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-04 12:14:37 +08:00
fixes import limit
This commit is contained in:
parent
b12f6f1b92
commit
e4b49e62a3
7 changed files with 65 additions and 23 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
10
app/utilities/repository_import_parser/list_items_column.rb
Normal file
10
app/utilities/repository_import_parser/list_items_column.rb
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue