Add user filters scaffolding
This commit is contained in:
@@ -4,6 +4,11 @@ source 'https://rubygems.org'
|
||||
# Bundler will treat runtime dependencies like base dependencies, and
|
||||
# development dependencies will be added by default to the :development group.
|
||||
#
|
||||
git_source(:gitlab) do |repo_name|
|
||||
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
|
||||
"git@gitlab.com:#{repo_name}.git"
|
||||
end
|
||||
|
||||
gemspec
|
||||
|
||||
gem "rails", "~> 5.1"
|
||||
@@ -22,6 +27,8 @@ group :development, :test do
|
||||
gem "select2-rails"
|
||||
gem 'puma'
|
||||
gem 'paperclip', '~> 5.3'
|
||||
gem 'dunlop-ember', gitlab: 'benja-2/dunlop-ember', branch: 'master'
|
||||
|
||||
#gem 'carrierwave'
|
||||
#gem 'fog-aws'
|
||||
gem 'uuidtools'
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
class Dunlop::UserFiltersController < Dunlop::ApplicationController
|
||||
include Dunlop::Ember::ApiBaseController # Ugly to require a non dependency here, but for now only used in application explicitly including dunlop-ember
|
||||
before_action :check_current_user
|
||||
|
||||
private
|
||||
|
||||
def serialize_options
|
||||
{key_transform: :unaltered}
|
||||
end
|
||||
|
||||
def permitted_params
|
||||
[:scope_key, :is_default, filters: {}]
|
||||
end
|
||||
|
||||
def check_current_user
|
||||
head 404 unless current_user.present?
|
||||
end
|
||||
|
||||
def record_scope
|
||||
current_user.user_filters
|
||||
end
|
||||
|
||||
def index_pagination?
|
||||
false
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,14 @@
|
||||
module Dunlop
|
||||
class UserFilter < ApplicationRecord
|
||||
belongs_to :user
|
||||
if Rails.application.config.database_configuration[Rails.env]['adapter'] != 'postgesql' # postgesql uses jsonb
|
||||
serialize :filters, JSONColumnCoder.new(Hash)
|
||||
end
|
||||
|
||||
before_save do
|
||||
if changes['is_default'] == [false, true]
|
||||
self.class.where(scope_key: scope_key).update_all(is_default: false)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,4 +1,5 @@
|
||||
module Dunlop::UserModel
|
||||
module Dunlop
|
||||
module UserModel
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
@@ -6,6 +7,7 @@ module Dunlop::UserModel
|
||||
serialize :role_names_admin, JSONColumnCoder.new(Array)
|
||||
serialize :settings_storage, JSONColumnCoder.new(Hash)
|
||||
has_many :source_files, as: :creator
|
||||
has_many :user_filters, class_name: 'Dunlop::UserFilter'
|
||||
end
|
||||
|
||||
def settings
|
||||
@@ -30,4 +32,5 @@ module Dunlop::UserModel
|
||||
RequestStore.store[:current_user] = user
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
module Dunlop
|
||||
class UserFilterSerializer < ActiveModel::Serializer
|
||||
# manual key transform to preserve filters lowercases
|
||||
type 'dunlop/user-filter'
|
||||
attribute :scope_key, key: 'scope-key'
|
||||
attribute :filters
|
||||
attribute :is_default, key: 'is-default'
|
||||
end
|
||||
end
|
||||
@@ -31,6 +31,8 @@ Dunlop::Engine.routes.draw do
|
||||
get "/download_latest/:target_file_type", action: :download_latest, on: :collection
|
||||
end
|
||||
|
||||
resources :user_filters
|
||||
|
||||
resources :execution_batches
|
||||
|
||||
resources :workflow_instances do
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
class CreateDunlopUserFilters < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
create_table :dunlop_user_filters do |t|
|
||||
t.belongs_to :user
|
||||
t.string :scope_key
|
||||
t.text :description
|
||||
t.boolean :is_default, null: false, default: false
|
||||
if Rails.application.config.database_configuration[Rails.env]['adapter'] == 'postgesql'
|
||||
t.jsonb :filters, default: {}
|
||||
else
|
||||
t.text :filters
|
||||
end
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,46 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Dunlop::UserFiltersController do
|
||||
routes { Dunlop::Engine.routes }
|
||||
let(:model) { Dunlop::UserFilter }
|
||||
describe 'logged in' do
|
||||
let(:user) { create :user }
|
||||
before { sign_in user}
|
||||
describe '#index' do
|
||||
it "returns listed serialized" do
|
||||
model1 = create 'dunlop/user_filter', user: user, scope_key: 'panda/action-list', filters: {key_with_underscores: 17}
|
||||
model2 = create 'dunlop/user_filter', user: user, scope_key: 'other/action-list', filters: {key_with_underscores: 19}
|
||||
get :index, params: {q: {scope_key_matches: 'panda/%'}}
|
||||
|
||||
response.body.should start_with '{"data":['
|
||||
result = JSON.parse(response.body)['data']
|
||||
result.should eq [
|
||||
{"id"=>model1.id.to_s, "type"=>"dunlop/user-filter", "attributes"=>{"scope-key"=>"panda/action-list", "filters"=>{"key_with_underscores"=>17}, "is-default"=>false}}
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
it 'creates a new filter attached to the current user' do
|
||||
post :create, params: {'dunlop/user_filter' => {scope_key: 'panda/something', filters: {abc_def: 'g'}, is_default: true}}
|
||||
record = model.last
|
||||
record.user.should eq user
|
||||
record.scope_key.should eq 'panda/something'
|
||||
record.filters.should eq('abc_def' => 'g')
|
||||
record.should be_is_default
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe 'not logged in' do
|
||||
describe '#index' do
|
||||
it "302" do
|
||||
model = create 'dunlop/user_filter', scope_key: 'panda:action-list', filters: {key_with_underscores: 17}
|
||||
get :index
|
||||
response.body.should include 'redirected'
|
||||
response.body.should include 'users/sign_in'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
+12
-1
@@ -10,7 +10,7 @@
|
||||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 2018_06_07_212010) do
|
||||
ActiveRecord::Schema.define(version: 2018_11_14_140017) do
|
||||
|
||||
create_table "contractor_initializations", force: :cascade do |t|
|
||||
t.integer "workflow_instance_id"
|
||||
@@ -51,6 +51,17 @@ ActiveRecord::Schema.define(version: 2018_06_07_212010) do
|
||||
t.index ["loggable_id", "loggable_type"], name: "index_dunlop_log_entries_on_loggable_id_and_loggable_type"
|
||||
end
|
||||
|
||||
create_table "dunlop_user_filters", force: :cascade do |t|
|
||||
t.integer "user_id"
|
||||
t.string "scope_key"
|
||||
t.text "description"
|
||||
t.boolean "is_default", default: false, null: false
|
||||
t.text "filters"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["user_id"], name: "index_dunlop_user_filters_on_user_id"
|
||||
end
|
||||
|
||||
create_table "execution_batches", force: :cascade do |t|
|
||||
t.string "state"
|
||||
t.string "sti_type"
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
FactoryBot.define do
|
||||
factory 'dunlop/user_filter'
|
||||
end
|
||||
@@ -0,0 +1,22 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe Dunlop::UserFilter do
|
||||
let(:time) { '1981-03-09T13:33:04Z'.to_time }
|
||||
let(:model) { User }
|
||||
before { Timecop.freeze time }
|
||||
after { Timecop.return }
|
||||
subject { create :user }
|
||||
|
||||
describe 'is_default' do
|
||||
it "creates" do
|
||||
filter1 = create 'dunlop/user_filter', scope_key: 'dunlop:test1', filters: {a: 3, b: 8}, is_default: true
|
||||
filter2 = create 'dunlop/user_filter', scope_key: 'dunlop:test2', filters: {a: 3, b: 8}, is_default: true
|
||||
filter3 = create 'dunlop/user_filter', scope_key: 'dunlop:test1', filters: {a: 3, b: 8}, is_default: true
|
||||
|
||||
filter1.reload.is_default.should be false # there can be only one
|
||||
filter2.reload.is_default.should be true # different scope key
|
||||
filter3.reload.is_default.should be true # there can only be the last one
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,25 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe Dunlop::UserModel do
|
||||
let(:time) { '1981-03-09T13:33:04Z'.to_time }
|
||||
let(:model) { User }
|
||||
before { Timecop.freeze time }
|
||||
after { Timecop.return }
|
||||
subject { create :user }
|
||||
describe 'basics' do
|
||||
it 'exists' do
|
||||
subject.should be_present
|
||||
subject.id.should be_present
|
||||
end
|
||||
end
|
||||
|
||||
describe 'has_many user_filters' do
|
||||
it "creates" do
|
||||
expect { subject.user_filters.create(scope_key: 'dunlop:test1', filters: {a: 3, b: 8}) }.to change { Dunlop::UserFilter.count }.by 1
|
||||
filters = Dunlop::UserFilter.last
|
||||
filters.user.should eq subject
|
||||
filters.filters.should eq('a' => 3, 'b' => 8)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user