add file custom column type to db

This commit is contained in:
mlorb 2018-03-09 17:04:54 +01:00
parent f8fb5cca75
commit 64e26e1c60
10 changed files with 134 additions and 17 deletions

View file

@ -103,13 +103,17 @@ class AssetsController < ApplicationController
step_assoc = @asset.step
result_assoc = @asset.result
repository_cell_assoc = @asset.repository_cell
@assoc = step_assoc unless step_assoc.nil?
@assoc = result_assoc unless result_assoc.nil?
@assoc = repository_cell_assoc unless repository_cell_assoc.nil?
if @assoc.class == Step
@protocol = @asset.step.protocol
else
elsif @assoc.class == Result
@my_module = @assoc.my_module
else
# TBD
end
end
@ -121,6 +125,8 @@ class AssetsController < ApplicationController
unless can_view_or_download_result_assets(@my_module)
render_403 and return
end
elsif @assoc.class == RepositoryCell
# TBD
end
end
@ -132,6 +138,8 @@ class AssetsController < ApplicationController
unless can_edit_result_asset_in_module(@my_module)
render_403 and return
end
elsif @assoc.class == RepositoryCell
# TBD
end
end

View file

@ -44,7 +44,7 @@ class Asset < ApplicationRecord
# Asset validation
# This could cause some problems if you create empty asset and want to
# assign it to result
validate :step_or_result
validate :step_or_result_or_repository_cell
belongs_to :created_by,
foreign_key: 'created_by_id',
@ -55,16 +55,12 @@ class Asset < ApplicationRecord
class_name: 'User',
optional: true
belongs_to :team, optional: true
has_one :step_asset,
inverse_of: :asset,
dependent: :destroy
has_one :step, through: :step_asset,
dependent: :nullify
has_one :result_asset,
inverse_of: :asset,
dependent: :destroy
has_one :result, through: :result_asset,
has_one :step_asset, inverse_of: :asset, dependent: :destroy
has_one :step, through: :step_asset, dependent: :nullify
has_one :result_asset, inverse_of: :asset, dependent: :destroy
has_one :result, through: :result_asset, dependent: :nullify
has_one :repository_asset_value, inverse_of: :asset, dependent: :destroy
has_one :repository_cell, through: :repository_asset_value,
dependent: :nullify
has_many :report_elements, inverse_of: :asset, dependent: :destroy
has_one :asset_text_datum, inverse_of: :asset, dependent: :destroy
@ -500,11 +496,13 @@ class Asset < ApplicationRecord
)
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
# (even though it's not really a "valid" asset)
if step.present? && result.present?
errors.add(:base, "Asset can only be result or step, not both.")
if step.present? && result.present? ||
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

View 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

View file

@ -17,6 +17,11 @@ class RepositoryCell < ActiveRecord::Base
where(repository_cells: { value_type: 'RepositoryListValue' })
end),
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
validate :repository_column_data_type

View file

@ -42,7 +42,8 @@ class Extends
# Data type name should match corresponding model's name
REPOSITORY_DATA_TYPES = { RepositoryTextValue: 0,
RepositoryDateValue: 1,
RepositoryListValue: 2 }
RepositoryListValue: 2,
RepositoryAssetValue: 3 }
# Extra attributes used for search in repositories, text columns
# are only supported
REPOSITORY_EXTRA_SEARCH_ATTR = ['repository_text_values.data',

View 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

View file

@ -10,7 +10,7 @@
#
# 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
enable_extension "plpgsql"
@ -364,6 +364,17 @@ ActiveRecord::Schema.define(version: 20180207095200) do
t.index ["team_id"], name: "index_repositories_on_team_id"
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|
t.integer "repository_row_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", column: "last_modified_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_date_values", "users", column: "created_by_id"
add_foreign_key "repository_date_values", "users", column: "last_modified_by_id"

View 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

View file

@ -34,6 +34,8 @@ describe Asset, type: :model do
it { should have_one :result_asset }
it { should have_one :result }
it { should have_one :asset_text_datum }
it { should have_one :repository_asset_value }
it { should have_one :repository_cell }
end
describe 'Should be a valid object' do

View 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