mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-06 05:04:35 +08:00
add file custom column type to db
This commit is contained in:
parent
f8fb5cca75
commit
64e26e1c60
10 changed files with 134 additions and 17 deletions
|
@ -103,13 +103,17 @@ class AssetsController < ApplicationController
|
||||||
|
|
||||||
step_assoc = @asset.step
|
step_assoc = @asset.step
|
||||||
result_assoc = @asset.result
|
result_assoc = @asset.result
|
||||||
|
repository_cell_assoc = @asset.repository_cell
|
||||||
@assoc = step_assoc unless step_assoc.nil?
|
@assoc = step_assoc unless step_assoc.nil?
|
||||||
@assoc = result_assoc unless result_assoc.nil?
|
@assoc = result_assoc unless result_assoc.nil?
|
||||||
|
@assoc = repository_cell_assoc unless repository_cell_assoc.nil?
|
||||||
|
|
||||||
if @assoc.class == Step
|
if @assoc.class == Step
|
||||||
@protocol = @asset.step.protocol
|
@protocol = @asset.step.protocol
|
||||||
else
|
elsif @assoc.class == Result
|
||||||
@my_module = @assoc.my_module
|
@my_module = @assoc.my_module
|
||||||
|
else
|
||||||
|
# TBD
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -121,6 +125,8 @@ class AssetsController < ApplicationController
|
||||||
unless can_view_or_download_result_assets(@my_module)
|
unless can_view_or_download_result_assets(@my_module)
|
||||||
render_403 and return
|
render_403 and return
|
||||||
end
|
end
|
||||||
|
elsif @assoc.class == RepositoryCell
|
||||||
|
# TBD
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -132,6 +138,8 @@ class AssetsController < ApplicationController
|
||||||
unless can_edit_result_asset_in_module(@my_module)
|
unless can_edit_result_asset_in_module(@my_module)
|
||||||
render_403 and return
|
render_403 and return
|
||||||
end
|
end
|
||||||
|
elsif @assoc.class == RepositoryCell
|
||||||
|
# TBD
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ class Asset < ApplicationRecord
|
||||||
# Asset validation
|
# Asset validation
|
||||||
# This could cause some problems if you create empty asset and want to
|
# This could cause some problems if you create empty asset and want to
|
||||||
# assign it to result
|
# assign it to result
|
||||||
validate :step_or_result
|
validate :step_or_result_or_repository_cell
|
||||||
|
|
||||||
belongs_to :created_by,
|
belongs_to :created_by,
|
||||||
foreign_key: 'created_by_id',
|
foreign_key: 'created_by_id',
|
||||||
|
@ -55,16 +55,12 @@ class Asset < ApplicationRecord
|
||||||
class_name: 'User',
|
class_name: 'User',
|
||||||
optional: true
|
optional: true
|
||||||
belongs_to :team, optional: true
|
belongs_to :team, optional: true
|
||||||
has_one :step_asset,
|
has_one :step_asset, inverse_of: :asset, dependent: :destroy
|
||||||
inverse_of: :asset,
|
has_one :step, through: :step_asset, dependent: :nullify
|
||||||
dependent: :destroy
|
has_one :result_asset, inverse_of: :asset, dependent: :destroy
|
||||||
has_one :step, through: :step_asset,
|
has_one :result, through: :result_asset, dependent: :nullify
|
||||||
dependent: :nullify
|
has_one :repository_asset_value, inverse_of: :asset, dependent: :destroy
|
||||||
|
has_one :repository_cell, through: :repository_asset_value,
|
||||||
has_one :result_asset,
|
|
||||||
inverse_of: :asset,
|
|
||||||
dependent: :destroy
|
|
||||||
has_one :result, through: :result_asset,
|
|
||||||
dependent: :nullify
|
dependent: :nullify
|
||||||
has_many :report_elements, inverse_of: :asset, dependent: :destroy
|
has_many :report_elements, inverse_of: :asset, dependent: :destroy
|
||||||
has_one :asset_text_datum, inverse_of: :asset, dependent: :destroy
|
has_one :asset_text_datum, inverse_of: :asset, dependent: :destroy
|
||||||
|
@ -500,11 +496,13 @@ class Asset < ApplicationRecord
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def step_or_result
|
def step_or_result_or_repository_cell
|
||||||
# We must allow both step and result to be blank because of GUI
|
# We must allow both step and result to be blank because of GUI
|
||||||
# (even though it's not really a "valid" asset)
|
# (even though it's not really a "valid" asset)
|
||||||
if step.present? && result.present?
|
if step.present? && result.present? ||
|
||||||
errors.add(:base, "Asset can only be result or step, not both.")
|
step.present? && repository_cell.present? ||
|
||||||
|
result.present? && repository_cell.present?
|
||||||
|
errors.add(:base, "Asset can only be result or step or repository cell, not ever.")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
21
app/models/repository_asset_value.rb
Normal file
21
app/models/repository_asset_value.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
class RepositoryAssetValue < ApplicationRecord
|
||||||
|
belongs_to :created_by,
|
||||||
|
foreign_key: :created_by_id,
|
||||||
|
class_name: 'User',
|
||||||
|
optional: true
|
||||||
|
belongs_to :last_modified_by,
|
||||||
|
foreign_key: :last_modified_by_id,
|
||||||
|
class_name: 'User',
|
||||||
|
optional: true
|
||||||
|
belongs_to :asset,
|
||||||
|
inverse_of: :repository_asset_value,
|
||||||
|
dependent: :destroy
|
||||||
|
has_one :repository_cell, as: :value, dependent: :destroy, inverse_of: :value
|
||||||
|
accepts_nested_attributes_for :repository_cell
|
||||||
|
|
||||||
|
validates :asset, :repository_cell, presence: true
|
||||||
|
|
||||||
|
def formatted
|
||||||
|
asset.file
|
||||||
|
end
|
||||||
|
end
|
|
@ -17,6 +17,11 @@ class RepositoryCell < ActiveRecord::Base
|
||||||
where(repository_cells: { value_type: 'RepositoryListValue' })
|
where(repository_cells: { value_type: 'RepositoryListValue' })
|
||||||
end),
|
end),
|
||||||
optional: true, foreign_key: :value_id
|
optional: true, foreign_key: :value_id
|
||||||
|
belongs_to :repository_asset_value,
|
||||||
|
(lambda do
|
||||||
|
where(repository_cells: { value_type: 'RepositoryAssetValue' })
|
||||||
|
end),
|
||||||
|
optional: true, foreign_key: :value_id
|
||||||
|
|
||||||
validates :repository_column, presence: true
|
validates :repository_column, presence: true
|
||||||
validate :repository_column_data_type
|
validate :repository_column_data_type
|
||||||
|
|
|
@ -42,7 +42,8 @@ class Extends
|
||||||
# Data type name should match corresponding model's name
|
# Data type name should match corresponding model's name
|
||||||
REPOSITORY_DATA_TYPES = { RepositoryTextValue: 0,
|
REPOSITORY_DATA_TYPES = { RepositoryTextValue: 0,
|
||||||
RepositoryDateValue: 1,
|
RepositoryDateValue: 1,
|
||||||
RepositoryListValue: 2 }
|
RepositoryListValue: 2,
|
||||||
|
RepositoryAssetValue: 3 }
|
||||||
# Extra attributes used for search in repositories, text columns
|
# Extra attributes used for search in repositories, text columns
|
||||||
# are only supported
|
# are only supported
|
||||||
REPOSITORY_EXTRA_SEARCH_ATTR = ['repository_text_values.data',
|
REPOSITORY_EXTRA_SEARCH_ATTR = ['repository_text_values.data',
|
||||||
|
|
14
db/migrate/20180308094354_create_repository_asset_values.rb
Normal file
14
db/migrate/20180308094354_create_repository_asset_values.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
class CreateRepositoryAssetValues < ActiveRecord::Migration[5.1]
|
||||||
|
def change
|
||||||
|
create_table :repository_asset_values do |t|
|
||||||
|
t.references :asset, index: true
|
||||||
|
t.references :created_by,
|
||||||
|
index: true,
|
||||||
|
foreign_key: { to_table: :users }
|
||||||
|
t.references :last_modified_by,
|
||||||
|
index: true,
|
||||||
|
foreign_key: { to_table: :users }
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
15
db/schema.rb
15
db/schema.rb
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20180207095200) do
|
ActiveRecord::Schema.define(version: 20180308094354) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -364,6 +364,17 @@ ActiveRecord::Schema.define(version: 20180207095200) do
|
||||||
t.index ["team_id"], name: "index_repositories_on_team_id"
|
t.index ["team_id"], name: "index_repositories_on_team_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "repository_asset_values", force: :cascade do |t|
|
||||||
|
t.bigint "asset_id"
|
||||||
|
t.bigint "created_by_id"
|
||||||
|
t.bigint "last_modified_by_id"
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
t.index ["asset_id"], name: "index_repository_asset_values_on_asset_id"
|
||||||
|
t.index ["created_by_id"], name: "index_repository_asset_values_on_created_by_id"
|
||||||
|
t.index ["last_modified_by_id"], name: "index_repository_asset_values_on_last_modified_by_id"
|
||||||
|
end
|
||||||
|
|
||||||
create_table "repository_cells", id: :serial, force: :cascade do |t|
|
create_table "repository_cells", id: :serial, force: :cascade do |t|
|
||||||
t.integer "repository_row_id"
|
t.integer "repository_row_id"
|
||||||
t.integer "repository_column_id"
|
t.integer "repository_column_id"
|
||||||
|
@ -877,6 +888,8 @@ ActiveRecord::Schema.define(version: 20180207095200) do
|
||||||
add_foreign_key "reports", "users"
|
add_foreign_key "reports", "users"
|
||||||
add_foreign_key "reports", "users", column: "last_modified_by_id"
|
add_foreign_key "reports", "users", column: "last_modified_by_id"
|
||||||
add_foreign_key "repositories", "users", column: "created_by_id"
|
add_foreign_key "repositories", "users", column: "created_by_id"
|
||||||
|
add_foreign_key "repository_asset_values", "users", column: "created_by_id"
|
||||||
|
add_foreign_key "repository_asset_values", "users", column: "last_modified_by_id"
|
||||||
add_foreign_key "repository_columns", "users", column: "created_by_id"
|
add_foreign_key "repository_columns", "users", column: "created_by_id"
|
||||||
add_foreign_key "repository_date_values", "users", column: "created_by_id"
|
add_foreign_key "repository_date_values", "users", column: "created_by_id"
|
||||||
add_foreign_key "repository_date_values", "users", column: "last_modified_by_id"
|
add_foreign_key "repository_date_values", "users", column: "last_modified_by_id"
|
||||||
|
|
6
spec/factories/repository_asset_values.rb
Normal file
6
spec/factories/repository_asset_values.rb
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
FactoryBot.define do
|
||||||
|
factory :repository_asset_value do
|
||||||
|
created_by { User.first || create(:user) }
|
||||||
|
last_modified_by { User.first || create(:user) }
|
||||||
|
end
|
||||||
|
end
|
|
@ -34,6 +34,8 @@ describe Asset, type: :model do
|
||||||
it { should have_one :result_asset }
|
it { should have_one :result_asset }
|
||||||
it { should have_one :result }
|
it { should have_one :result }
|
||||||
it { should have_one :asset_text_datum }
|
it { should have_one :asset_text_datum }
|
||||||
|
it { should have_one :repository_asset_value }
|
||||||
|
it { should have_one :repository_cell }
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Should be a valid object' do
|
describe 'Should be a valid object' do
|
||||||
|
|
49
spec/models/repository_asset_value_spec.rb
Normal file
49
spec/models/repository_asset_value_spec.rb
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe RepositoryAssetValue, type: :model do
|
||||||
|
it 'should be of class RepositoryAssetValue' do
|
||||||
|
expect(subject.class).to eq RepositoryAssetValue
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'Database table' do
|
||||||
|
it { should have_db_column :asset_id }
|
||||||
|
it { should have_db_column :created_at }
|
||||||
|
it { should have_db_column :updated_at }
|
||||||
|
it { should have_db_column :created_by_id }
|
||||||
|
it { should have_db_column :last_modified_by_id }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'Relations' do
|
||||||
|
it { should belong_to(:created_by).class_name('User') }
|
||||||
|
it { should belong_to(:last_modified_by).class_name('User') }
|
||||||
|
it { should belong_to(:asset).dependent(:destroy) }
|
||||||
|
it { should have_one :repository_cell }
|
||||||
|
it { should accept_nested_attributes_for(:repository_cell) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'Should be a valid object' do
|
||||||
|
it { should validate_presence_of :repository_cell }
|
||||||
|
it { should validate_presence_of :asset }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#data' do
|
||||||
|
let!(:repository) { create :repository }
|
||||||
|
let!(:repository_column) do
|
||||||
|
create :repository_column,
|
||||||
|
name: 'My column',
|
||||||
|
data_type: :RepositoryAssetValue
|
||||||
|
end
|
||||||
|
let!(:repository_row) { create :repository_row, name: 'My row' }
|
||||||
|
|
||||||
|
it 'returns the asset' do
|
||||||
|
asset = create :asset, file_file_name: 'my file'
|
||||||
|
repository_asset_value = create :repository_asset_value,
|
||||||
|
asset: asset,
|
||||||
|
repository_cell_attributes: {
|
||||||
|
repository_column: repository_column,
|
||||||
|
repository_row: repository_row
|
||||||
|
}
|
||||||
|
expect(repository_asset_value.reload.formatted.instance).to eq asset
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Add table
Reference in a new issue