From 5e4715c8ee1965d1ceb6fa5f3bb85d371c6c1c7f Mon Sep 17 00:00:00 2001 From: artoscinote <85488244+artoscinote@users.noreply.github.com> Date: Thu, 10 Mar 2022 15:10:59 +0100 Subject: [PATCH 01/54] Release 1.24.2 (#3931) * Fix tests [SCI-6486] (#3913) * Fix tests [SCI-6486] * Fix rspec tests [SCI-6486] Co-authored-by: Anton * Fix moving experiment [SCI-6602] (#3927) * Update Rails to 6.1.4.7 [SCI-6615] (#3928) * Apply user's time zone in advanced filters for time data type [SCI-6585] (#3930) * Bump version to 1.24.2 Co-authored-by: aignatov-bio <47317017+aignatov-bio@users.noreply.github.com> Co-authored-by: Anton Co-authored-by: Alex Kriuchykhin --- Gemfile.lock | 118 +++++++++--------- VERSION | 2 +- .../api/v1/inventory_items_controller.rb | 10 +- .../v1/project_user_assignments_controller.rb | 5 +- .../team_repositories_controller.rb | 4 +- app/models/concerns/assignable.rb | 1 - app/models/experiment.rb | 56 ++++----- app/models/repository_time_range_value.rb | 14 +-- app/models/repository_time_value.rb | 14 +-- .../api/v1/user_assignment_serializer.rb | 14 ++- .../experiments/move_to_project_service.rb | 3 +- .../experiments_controller_spec.rb | 8 +- .../my_modules_controller_spec.rb | 4 +- .../projects_controller_spec.rb | 19 +-- spec/controllers/canvas_controller_spec.rb | 2 +- .../experiments_controller_spec.rb | 3 +- .../repository_rows_controller_spec.rb | 10 +- spec/factories/experiments.rb | 2 +- spec/factories/my_modules.rb | 2 +- spec/factories/user_assignments.rb | 1 - ...ec.rb => generate_user_assignments_job.rb} | 20 ++- .../propagate_assignment_job_spec.rb | 12 +- .../{my_modules_spec.rb => my_modules.rb} | 1 + spec/models/connection_spec.rb | 4 +- spec/models/experiment_spec.rb | 6 +- spec/models/my_module_member_spec.rb | 26 +--- spec/models/my_module_spec.rb | 7 +- spec/models/project_member_spec.rb | 49 +------- spec/models/repository_checklist_item_spec.rb | 2 +- spec/models/repository_list_item_spec.rb | 2 +- .../api/v1/assets_controller_spec.rb | 2 +- .../api/v1/checklist_items_controller_spec.rb | 6 +- .../api/v1/connections_controller_spec.rb | 2 +- ...roject_user_assignments_controller_spec.rb | 4 +- .../api/v1/steps_controller_spec.rb | 5 +- ...ontroller_spec.rb => tables_controller.rb} | 8 +- .../user_my_modules_controller_spec.rb | 12 +- .../service/experiments_controller_spec.rb | 9 +- .../api/v1/checklist_items_controller_spec.rb | 4 +- .../api/v1/checklists_controller_spec.rb | 3 +- ...riment_user_assignments_controller_spec.rb | 42 +++---- .../api/v1/experiments_controller_spec.rb | 8 -- .../api/v1/inventory_items_controller_spec.rb | 4 +- ...roject_user_assignments_controller_spec.rb | 63 +++------- .../api/v1/projects_controller_spec.rb | 8 -- .../api/v1/results_controller_spec.rb | 7 -- spec/requests/api/v1/steps_controller_spec.rb | 8 +- .../requests/api/v1/tables_controller_spec.rb | 5 +- .../task_user_assignments_controller_spec.rb | 33 ++--- spec/requests/api/v1/tasks_controller_spec.rb | 5 - .../activity_filter_matching_service_spec.rb | 10 +- .../projects_overview_service_spec.rb | 13 +- .../repository_datatable_service_spec.rb | 2 +- .../smart_annotations/html_preview_spec.rb | 2 +- .../smart_annotations/text_preview_spec.rb | 2 +- .../reference_project_structure_context.rb | 18 +-- 56 files changed, 266 insertions(+), 440 deletions(-) rename spec/jobs/user_assignments/{generate_user_assignments_job_spec.rb => generate_user_assignments_job.rb} (84%) rename spec/lib/tasks/{my_modules_spec.rb => my_modules.rb} (99%) rename spec/permissions/controllers/api/v1/{tables_controller_spec.rb => tables_controller.rb} (89%) diff --git a/Gemfile.lock b/Gemfile.lock index 371552655..70ede942e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -42,40 +42,40 @@ GIT GEM remote: http://rubygems.org/ specs: - actioncable (6.1.4.4) - actionpack (= 6.1.4.4) - activesupport (= 6.1.4.4) + actioncable (6.1.4.7) + actionpack (= 6.1.4.7) + activesupport (= 6.1.4.7) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.4.4) - actionpack (= 6.1.4.4) - activejob (= 6.1.4.4) - activerecord (= 6.1.4.4) - activestorage (= 6.1.4.4) - activesupport (= 6.1.4.4) + actionmailbox (6.1.4.7) + actionpack (= 6.1.4.7) + activejob (= 6.1.4.7) + activerecord (= 6.1.4.7) + activestorage (= 6.1.4.7) + activesupport (= 6.1.4.7) mail (>= 2.7.1) - actionmailer (6.1.4.4) - actionpack (= 6.1.4.4) - actionview (= 6.1.4.4) - activejob (= 6.1.4.4) - activesupport (= 6.1.4.4) + actionmailer (6.1.4.7) + actionpack (= 6.1.4.7) + actionview (= 6.1.4.7) + activejob (= 6.1.4.7) + activesupport (= 6.1.4.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.4.4) - actionview (= 6.1.4.4) - activesupport (= 6.1.4.4) + actionpack (6.1.4.7) + actionview (= 6.1.4.7) + activesupport (= 6.1.4.7) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.4.4) - actionpack (= 6.1.4.4) - activerecord (= 6.1.4.4) - activestorage (= 6.1.4.4) - activesupport (= 6.1.4.4) + actiontext (6.1.4.7) + actionpack (= 6.1.4.7) + activerecord (= 6.1.4.7) + activestorage (= 6.1.4.7) + activesupport (= 6.1.4.7) nokogiri (>= 1.8.5) - actionview (6.1.4.4) - activesupport (= 6.1.4.4) + actionview (6.1.4.7) + activesupport (= 6.1.4.7) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -85,24 +85,24 @@ GEM activemodel (>= 4.1, < 6.2) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (6.1.4.4) - activesupport (= 6.1.4.4) + activejob (6.1.4.7) + activesupport (= 6.1.4.7) globalid (>= 0.3.6) - activemodel (6.1.4.4) - activesupport (= 6.1.4.4) - activerecord (6.1.4.4) - activemodel (= 6.1.4.4) - activesupport (= 6.1.4.4) + activemodel (6.1.4.7) + activesupport (= 6.1.4.7) + activerecord (6.1.4.7) + activemodel (= 6.1.4.7) + activesupport (= 6.1.4.7) activerecord-import (1.0.7) activerecord (>= 3.2) - activestorage (6.1.4.4) - actionpack (= 6.1.4.4) - activejob (= 6.1.4.4) - activerecord (= 6.1.4.4) - activesupport (= 6.1.4.4) + activestorage (6.1.4.7) + actionpack (= 6.1.4.7) + activejob (= 6.1.4.7) + activerecord (= 6.1.4.7) + activesupport (= 6.1.4.7) marcel (~> 1.0.0) mini_mime (>= 1.1.0) - activesupport (6.1.4.4) + activesupport (6.1.4.7) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -305,7 +305,7 @@ GEM httparty (0.17.3) mime-types (~> 3.0) multi_xml (>= 0.5.2) - i18n (1.8.11) + i18n (1.10.0) concurrent-ruby (~> 1.0) i18n-js (3.8.0) i18n (>= 0.6.6) @@ -354,7 +354,7 @@ GEM logging (2.0.0) little-plugger (~> 1.1) multi_json (~> 1.10) - loofah (2.13.0) + loofah (2.14.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -381,7 +381,7 @@ GEM rails (>= 3.2.0) newrelic_rpm (6.15.0) nio4r (2.5.8) - nokogiri (1.13.2) + nokogiri (1.13.3) mini_portile2 (~> 2.8.0) racc (~> 1.4) nokogumbo (2.0.4) @@ -450,20 +450,20 @@ GEM rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (6.1.4.4) - actioncable (= 6.1.4.4) - actionmailbox (= 6.1.4.4) - actionmailer (= 6.1.4.4) - actionpack (= 6.1.4.4) - actiontext (= 6.1.4.4) - actionview (= 6.1.4.4) - activejob (= 6.1.4.4) - activemodel (= 6.1.4.4) - activerecord (= 6.1.4.4) - activestorage (= 6.1.4.4) - activesupport (= 6.1.4.4) + rails (6.1.4.7) + actioncable (= 6.1.4.7) + actionmailbox (= 6.1.4.7) + actionmailer (= 6.1.4.7) + actionpack (= 6.1.4.7) + actiontext (= 6.1.4.7) + actionview (= 6.1.4.7) + activejob (= 6.1.4.7) + activemodel (= 6.1.4.7) + activerecord (= 6.1.4.7) + activestorage (= 6.1.4.7) + activesupport (= 6.1.4.7) bundler (>= 1.15.0) - railties (= 6.1.4.4) + railties (= 6.1.4.7) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -481,9 +481,9 @@ GEM rails (> 3.1) rails_serve_static_assets (0.0.5) rails_stdout_logging (0.0.5) - railties (6.1.4.4) - actionpack (= 6.1.4.4) - activesupport (= 6.1.4.4) + railties (6.1.4.7) + actionpack (= 6.1.4.7) + activesupport (= 6.1.4.7) method_source rake (>= 0.13) thor (~> 1.0) @@ -579,7 +579,7 @@ GEM simplecov_json_formatter (0.1.2) spinjs-rails (1.4) rails (>= 3.1) - sprockets (4.0.2) + sprockets (4.0.3) concurrent-ruby (~> 1.0) rack (> 1, < 3) sprockets-rails (3.4.2) @@ -588,7 +588,7 @@ GEM sprockets (>= 3.0.0) stream (0.5.3) generator - thor (1.1.0) + thor (1.2.1) tilt (2.0.10) timecop (0.9.2) tinymce-rails (4.9.11) @@ -624,7 +624,7 @@ GEM wkhtmltopdf-heroku (2.12.5.0) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.5.1) + zeitwerk (2.5.4) PLATFORMS ruby diff --git a/VERSION b/VERSION index f9e8384bb..e4a973f91 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.24.1 +1.24.2 diff --git a/app/controllers/api/v1/inventory_items_controller.rb b/app/controllers/api/v1/inventory_items_controller.rb index d5920d901..8dabd1b86 100644 --- a/app/controllers/api/v1/inventory_items_controller.rb +++ b/app/controllers/api/v1/inventory_items_controller.rb @@ -109,17 +109,15 @@ module Api end def inventory_item_params - unless params.require(:data).require(:type) == 'inventory_items' - raise TypeError - end + raise TypeError unless params.require(:data).require(:type) == 'inventory_items' + params.require(:data).require(:attributes) params.permit(data: { attributes: %i(name archived) })[:data] end def update_inventory_item_params - unless params.require(:data).require(:id).to_i == params[:id].to_i - raise IDMismatchError - end + raise IDMismatchError unless params.require(:data).require(:id).to_i == params[:id].to_i + inventory_item_params[:attributes] end diff --git a/app/controllers/api/v1/project_user_assignments_controller.rb b/app/controllers/api/v1/project_user_assignments_controller.rb index a4e7ac73f..32b502e1a 100644 --- a/app/controllers/api/v1/project_user_assignments_controller.rb +++ b/app/controllers/api/v1/project_user_assignments_controller.rb @@ -45,7 +45,6 @@ module Api project_member.assign = true project_member.user_role_id = user_project_params[:user_role_id] project_member.save - render jsonapi: project_member.user_assignment.reload, serializer: UserAssignmentSerializer, status: :created @@ -55,9 +54,7 @@ module Api user_role = UserRole.find user_project_params[:user_role_id] project_member = ProjectMember.new(@user_assignment.user, @project, current_user) - if project_member.user_assignment&.user_role == user_role - return render body: nil, status: :no_content - end + return render body: nil, status: :no_content if project_member.user_assignment&.user_role == user_role project_member.user_role_id = user_role.id project_member.update diff --git a/app/controllers/team_repositories_controller.rb b/app/controllers/team_repositories_controller.rb index d8247542b..bd6d99ff1 100644 --- a/app/controllers/team_repositories_controller.rb +++ b/app/controllers/team_repositories_controller.rb @@ -38,7 +38,9 @@ class TeamRepositoriesController < ApplicationController private def load_vars - @repository = current_team.repositories.find(params[:repository_id]) + @repository = current_team.repositories.find_by(id: params[:repository_id]) + + render_404 unless @repository end def create_params diff --git a/app/models/concerns/assignable.rb b/app/models/concerns/assignable.rb index 78ebbed74..2b92a2ba9 100644 --- a/app/models/concerns/assignable.rb +++ b/app/models/concerns/assignable.rb @@ -42,7 +42,6 @@ module Assignable def create_users_assignments return if skip_user_assignments - role = if is_a?(Project) UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) else diff --git a/app/models/experiment.rb b/app/models/experiment.rb index 5a5734b6c..607898720 100644 --- a/app/models/experiment.rb +++ b/app/models/experiment.rb @@ -16,15 +16,11 @@ class Experiment < ApplicationRecord belongs_to :project, inverse_of: :experiments, touch: true belongs_to :created_by, - foreign_key: :created_by_id, class_name: 'User' belongs_to :last_modified_by, - foreign_key: :last_modified_by_id, class_name: 'User' - belongs_to :archived_by, - foreign_key: :archived_by_id, class_name: 'User', optional: true + belongs_to :archived_by, class_name: 'User', optional: true belongs_to :restored_by, - foreign_key: :restored_by_id, class_name: 'User', optional: true @@ -190,8 +186,8 @@ class Experiment < ApplicationRecord end rescue ActiveRecord::ActiveRecordError, ArgumentError, - ActiveRecord::RecordNotSaved => ex - logger.error ex.message + ActiveRecord::RecordNotSaved => e + logger.error e.message return false end true @@ -220,7 +216,7 @@ class Experiment < ApplicationRecord # Archive all modules. Receives an array of module integer IDs # and current user. def archive_modules(module_ids, current_user) - my_modules.where(id: module_ids).each do |my_module| + my_modules.where(id: module_ids).find_each do |my_module| my_module.archive!(current_user) log_activity(:archive_module, current_user, my_module) end @@ -268,12 +264,12 @@ class Experiment < ApplicationRecord # it's obviously not updated. def rename_modules(to_rename, current_user) to_rename.each do |id, new_name| - my_module = MyModule.find_by_id(id) - if my_module.present? - my_module.name = new_name - my_module.save! - log_activity(:rename_task, current_user, my_module) - end + my_module = MyModule.find_by(id: id) + next if my_module.blank? + + my_module.name = new_name + my_module.save! + log_activity(:rename_task, current_user, my_module) end end @@ -284,8 +280,8 @@ class Experiment < ApplicationRecord # it's obviously not updated. Any connection on module is destroyed. def move_modules(to_move, current_user) to_move.each do |id, experiment_id| - my_module = my_modules.find_by_id(id) - experiment = project.experiments.find_by_id(experiment_id) + my_module = my_modules.find_by(id: id) + experiment = project.experiments.find_by(id: experiment_id) next unless my_module.present? && experiment.present? experiment_original = my_module.experiment @@ -296,11 +292,10 @@ class Experiment < ApplicationRecord my_module.x = new_pos[:x] my_module.y = new_pos[:y] - unless my_module.outputs.destroy_all && my_module.inputs.destroy_all - raise ActiveRecord::ActiveRecordError - end + raise ActiveRecord::ActiveRecordError unless my_module.outputs.destroy_all && my_module.inputs.destroy_all next unless my_module.save + # regenerate user assignments my_module.user_assignments.destroy_all UserAssignments::GenerateUserAssignmentsJob.perform_later(my_module, current_user) @@ -331,7 +326,7 @@ class Experiment < ApplicationRecord to_move.each do |ids, experiment_id| modules = my_modules.find(ids) groups = Set.new(modules.map(&:my_module_group)) - experiment = project.experiments.find_by_id(experiment_id) + experiment = project.experiments.find_by(id: experiment_id) groups.each do |group| next unless group && experiment.present? @@ -395,23 +390,19 @@ class Experiment < ApplicationRecord dg = RGL::DirectedAdjacencyGraph.new connections.each do |a, b| # Check if both vertices exist - if (my_modules.find_all { |m| [a.to_i, b.to_i].include? m.id }).count == 2 - dg.add_edge(a, b) - end + dg.add_edge(a, b) if (my_modules.find_all { |m| [a.to_i, b.to_i].include? m.id }).count == 2 end # Check if cycles exist! topsort = dg.topsort_iterator.to_a - if topsort.length.zero? && dg.edges.size > 1 - raise ArgumentError, 'Cycles exist.' - end + raise ArgumentError, 'Cycles exist.' if topsort.length.zero? && dg.edges.size > 1 # First, delete existing connections # but keep a copy of previous state previous_sources = {} previous_sources.default = [] - my_modules.includes(inputs: { from: [:inputs, outputs: :to] }).each do |m| + my_modules.includes(inputs: { from: [:inputs, outputs: :to] }).find_each do |m| previous_sources[m.id] = [] m.inputs.each do |c| previous_sources[m.id] << c.from @@ -429,7 +420,7 @@ class Experiment < ApplicationRecord # Save topological order of modules (for modules without workflow, # leave them unordered) - my_modules.includes(:my_module_group).each do |m| + my_modules.includes(:my_module_group).find_each do |m| m.workflow_order = if topsort.include? m.id.to_s topsort.find_index(m.id.to_s) @@ -483,8 +474,8 @@ class Experiment < ApplicationRecord dg = RGL::DirectedAdjacencyGraph[] group_ids = Set.new - my_modules.active.includes(:my_module_group, outputs: :to).each do |m| - group_ids << m.my_module_group.id unless m.my_module_group.blank? + my_modules.active.includes(:my_module_group, outputs: :to).find_each do |m| + group_ids << m.my_module_group.id if m.my_module_group.present? dg.add_vertex m.id unless dg.has_vertex? m.id m.outputs.each do |o| dg.add_edge m.id, o.to.id @@ -496,14 +487,13 @@ class Experiment < ApplicationRecord end # Remove any existing module groups from modules - unless MyModuleGroup.where(id: group_ids.to_a).destroy_all - raise ActiveRecord::ActiveRecordError - end + raise ActiveRecord::ActiveRecordError unless MyModuleGroup.where(id: group_ids.to_a).destroy_all # Second, create new groups workflows.each do |modules| # Single modules are not considered part of any workflow next unless modules.length > 1 + MyModuleGroup.create!(experiment: self, my_modules: modules, created_by: current_user) diff --git a/app/models/repository_time_range_value.rb b/app/models/repository_time_range_value.rb index 5c323e966..be07a7bca 100644 --- a/app/models/repository_time_range_value.rb +++ b/app/models/repository_time_range_value.rb @@ -18,22 +18,22 @@ class RepositoryTimeRangeValue < RepositoryDateTimeRangeValueBase case filter_element.operator when 'equal_to' repository_rows.where("#{join_alias}.start_time::time = (?)::time AND #{join_alias}.end_time::time = (?)::time", - parameters['start_time'], parameters['end_time']) + Time.zone.parse(parameters['start_time']), Time.zone.parse(parameters['end_time'])) when 'unequal_to' repository_rows .where.not("#{join_alias}.start_time::time = (?)::time AND #{join_alias}.end_time::time = (?)::time", - parameters['start_time'], parameters['end_time']) + Time.zone.parse(parameters['start_time']), Time.zone.parse(parameters['end_time'])) when 'greater_than' - repository_rows.where("#{join_alias}.start_time::time > (?)::time", parameters['end_time']) + repository_rows.where("#{join_alias}.start_time::time > (?)::time", Time.zone.parse(parameters['end_time'])) when 'greater_than_or_equal_to' - repository_rows.where("#{join_alias}.start_time::time >= (?)::time", parameters['end_time']) + repository_rows.where("#{join_alias}.start_time::time >= (?)::time", Time.zone.parse(parameters['end_time'])) when 'less_than' - repository_rows.where("#{join_alias}.end_time::time < (?)::time", parameters['start_time']) + repository_rows.where("#{join_alias}.end_time::time < (?)::time", Time.zone.parse(parameters['start_time'])) when 'less_than_or_equal_to' - repository_rows.where("#{join_alias}.end_time::time <= (?)::time", parameters['start_time']) + repository_rows.where("#{join_alias}.end_time::time <= (?)::time", Time.zone.parse(parameters['start_time'])) when 'between' repository_rows.where("#{join_alias}.start_time::time > (?)::time AND #{join_alias}.end_time::time < (?)::time", - parameters['start_time'], parameters['end_time']) + Time.zone.parse(parameters['start_time']), Time.zone.parse(parameters['end_time'])) else raise ArgumentError, 'Wrong operator for RepositoryTimeRangeValue!' end diff --git a/app/models/repository_time_value.rb b/app/models/repository_time_value.rb index ada085fee..eff2c232a 100644 --- a/app/models/repository_time_value.rb +++ b/app/models/repository_time_value.rb @@ -14,19 +14,19 @@ class RepositoryTimeValue < RepositoryDateTimeValueBase parameters = filter_element.parameters case filter_element.operator when 'equal_to' - repository_rows.where("#{join_alias}.data::time = ?", Time.zone.parse(parameters['time'])) + repository_rows.where("#{join_alias}.data::time = (?)::time", Time.zone.parse(parameters['time'])) when 'unequal_to' - repository_rows.where.not("#{join_alias}.data::time = ?", Time.zone.parse(parameters['time'])) + repository_rows.where.not("#{join_alias}.data::time = (?)::time", Time.zone.parse(parameters['time'])) when 'greater_than' - repository_rows.where("#{join_alias}.data::time > ?", Time.zone.parse(parameters['time'])) + repository_rows.where("#{join_alias}.data::time > (?)::time", Time.zone.parse(parameters['time'])) when 'greater_than_or_equal_to' - repository_rows.where("#{join_alias}.data::time >= ?", Time.zone.parse(parameters['time'])) + repository_rows.where("#{join_alias}.data::time >= (?)::time", Time.zone.parse(parameters['time'])) when 'less_than' - repository_rows.where("#{join_alias}.data::time < ?", Time.zone.parse(parameters['time'])) + repository_rows.where("#{join_alias}.data::time < (?)::time", Time.zone.parse(parameters['time'])) when 'less_than_or_equal_to' - repository_rows.where("#{join_alias}.data::time <= ?", Time.zone.parse(parameters['time'])) + repository_rows.where("#{join_alias}.data::time <= (?)::time", Time.zone.parse(parameters['time'])) when 'between' - repository_rows.where("#{join_alias}.data::time > ? AND #{join_alias}.data::time < ?", + repository_rows.where("#{join_alias}.data::time > (?)::time AND #{join_alias}.data::time < (?)::time", Time.zone.parse(parameters['start_time']), Time.zone.parse(parameters['end_time'])) else raise ArgumentError, 'Wrong operator for RepositoryTimeValue!' diff --git a/app/serializers/api/v1/user_assignment_serializer.rb b/app/serializers/api/v1/user_assignment_serializer.rb index 646b7fa8e..c78c63f62 100644 --- a/app/serializers/api/v1/user_assignment_serializer.rb +++ b/app/serializers/api/v1/user_assignment_serializer.rb @@ -5,10 +5,20 @@ module Api class UserAssignmentSerializer < ActiveModel::Serializer type :user_assignments attributes :id - belongs_to :user_role - belongs_to :user + belongs_to :user_role, serializer: UserRoleSerializer + belongs_to :user, serializer: UserSerializer belongs_to :assignable + class << self + def serializer_for(model, options) + return TaskSerializer if model.instance_of? MyModule + return ExperimentSerializer if model.instance_of? Experiment + return ProjectSerializer if model.instance_of? Project + + super + end + end + include TimestampableModel end end diff --git a/app/services/experiments/move_to_project_service.rb b/app/services/experiments/move_to_project_service.rb index e6cacd3d9..6252768d4 100644 --- a/app/services/experiments/move_to_project_service.rb +++ b/app/services/experiments/move_to_project_service.rb @@ -25,6 +25,8 @@ module Experiments ActiveRecord::Base.transaction do @exp.project = @project + sync_user_assignments(@exp) + @exp.my_modules.each do |my_module| unless can_move_my_module?(@user, my_module) @errors[:main] = I18n.t('move_to_project_service.my_modules_permission_error') @@ -37,7 +39,6 @@ module Experiments move_activities!(@exp) @exp.save! - sync_user_assignments(@exp) rescue StandardError if @exp.valid? && @errors.none? @errors[:main] = I18n.t('move_to_project_service.general_error') diff --git a/spec/controllers/access_permissions/experiments_controller_spec.rb b/spec/controllers/access_permissions/experiments_controller_spec.rb index f0f4d36cc..3fd9ea8dd 100644 --- a/spec/controllers/access_permissions/experiments_controller_spec.rb +++ b/spec/controllers/access_permissions/experiments_controller_spec.rb @@ -8,7 +8,7 @@ describe AccessPermissions::ExperimentsController, type: :controller do let!(:user) { subject.current_user } let!(:team) { create :team, created_by: user } let!(:user_team) { create :user_team, :admin, user: user, team: team } - let!(:experiment) { create :experiment, project: project } + let!(:experiment) { create :experiment, project: project, created_by: user } let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) } let!(:viewer_user_role) { create :viewer_role } let!(:technician_role) { create :technician_role } @@ -45,12 +45,6 @@ describe AccessPermissions::ExperimentsController, type: :controller do end it 'renders 403 if user does not have manage permissions on project' do - create :user_assignment, - assignable: experiment, - user: viewer_user, - user_role: viewer_user_role, - assigned_by: user - sign_in_viewer_user get :edit, params: { project_id: project.id, id: experiment.id }, format: :json diff --git a/spec/controllers/access_permissions/my_modules_controller_spec.rb b/spec/controllers/access_permissions/my_modules_controller_spec.rb index acc44a852..c7f6fb15f 100644 --- a/spec/controllers/access_permissions/my_modules_controller_spec.rb +++ b/spec/controllers/access_permissions/my_modules_controller_spec.rb @@ -8,7 +8,7 @@ describe AccessPermissions::MyModulesController, type: :controller do let!(:user) { subject.current_user } let!(:team) { create :team, created_by: user } let!(:user_team) { create :user_team, :admin, user: user, team: team } - let!(:experiment) { create :experiment, project: project } + let!(:experiment) { create :experiment, project: project, created_by: user } let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) } let!(:viewer_user_role) { create :viewer_role } let!(:technician_role) { create :technician_role } @@ -48,8 +48,6 @@ describe AccessPermissions::MyModulesController, type: :controller do end it 'renders 403 if user does not have manage permissions on project' do - create :user_assignment, assignable: my_module, user: viewer_user, user_role: viewer_user_role, assigned_by: user - sign_in_viewer_user get :edit, params: { project_id: project.id, experiment_id: experiment.id, id: my_module.id }, format: :json diff --git a/spec/controllers/access_permissions/projects_controller_spec.rb b/spec/controllers/access_permissions/projects_controller_spec.rb index 4f2a81eb4..fe4d16c6a 100644 --- a/spec/controllers/access_permissions/projects_controller_spec.rb +++ b/spec/controllers/access_permissions/projects_controller_spec.rb @@ -13,13 +13,6 @@ describe AccessPermissions::ProjectsController, type: :controller do let!(:normal_user_role) { create :normal_user_role } let!(:technician_role) { create :technician_role } let!(:user_project) { create :user_project, user: user, project: project } - let!(:user_assignment) do - create :user_assignment, - assignable: project, - user: user, - user_role: owner_role, - assigned_by: user - end let!(:normal_user) { create :user, confirmed_at: Time.zone.now } let!(:normal_user_team) do create :user_team, @@ -151,17 +144,17 @@ describe AccessPermissions::ProjectsController, type: :controller do it 'creates new project user and user assignment' do expect { post :create, params: valid_params, format: :json - }.to change(UserProject, :count).by(1).and \ - change(UserAssignment, :count).by(1) + }.to change(UserAssignment, :count).by(1) end it 'does not create an assigment if user is already assigned' do - create :user_project, user: normal_user, project: project - + create :user_assignment, user: normal_user, + user_role: technician_role, + assignable: project, + assigned_by: user expect { post :create, params: valid_params, format: :json - }.to change(UserProject, :count).by(0).and \ - change(UserAssignment, :count).by(0) + }.to change(UserAssignment, :count).by(0) end it 'does not create an assigment when the user is already assigned with different permission' do diff --git a/spec/controllers/canvas_controller_spec.rb b/spec/controllers/canvas_controller_spec.rb index 552c30767..84f02c89b 100644 --- a/spec/controllers/canvas_controller_spec.rb +++ b/spec/controllers/canvas_controller_spec.rb @@ -8,7 +8,7 @@ describe CanvasController do skip_my_module: true } - let(:experiment2) { create :experiment, project: project } + let(:experiment2) { create :experiment, project: project, created_by: project.created_by } # Idea of this "end to end" test is to put a lot "work" on method `@experiment.udpate_canvas` and controller actipn # update also. We've implemented some unit tests on `.update_canvas` itself, but behaviour is tightly coupled with diff --git a/spec/controllers/experiments_controller_spec.rb b/spec/controllers/experiments_controller_spec.rb index cadd73cf0..39d58121f 100644 --- a/spec/controllers/experiments_controller_spec.rb +++ b/spec/controllers/experiments_controller_spec.rb @@ -59,7 +59,8 @@ describe ExperimentsController, type: :controller do archived: true, archived_by: (create :user), archived_on: Time.zone.now, - project: project + project: project, + created_by: project.created_by end let(:params) do diff --git a/spec/controllers/repository_rows_controller_spec.rb b/spec/controllers/repository_rows_controller_spec.rb index e7a6e9c4d..e3eb4085c 100644 --- a/spec/controllers/repository_rows_controller_spec.rb +++ b/spec/controllers/repository_rows_controller_spec.rb @@ -13,7 +13,7 @@ describe RepositoryRowsController, type: :controller do RepositoryTableState.create( repository: repository, user: user, - state: repository.default_teble_state + state: repository.default_table_state ) end let!(:repository_row) do @@ -64,7 +64,7 @@ describe RepositoryRowsController, type: :controller do describe 'json object' do it 'returns a valid object' do - params = { order: { 0 => { column: '4', dir: 'asc' } }, + params = { order: [{ column: '4', dir: 'asc' }], drow: '0', search: { value: '' }, length: '10', @@ -79,7 +79,7 @@ describe RepositoryRowsController, type: :controller do describe 'pagination' do it 'returns first 10 records' do - params = { order: { 0 => { column: '4', dir: 'asc' } }, + params = { order: [{ column: '4', dir: 'asc' }], drow: '0', search: { value: '' }, length: '10', @@ -93,7 +93,7 @@ describe RepositoryRowsController, type: :controller do end it 'returns next 10 records' do - params = { order: { 0 => { column: '4', dir: 'asc' } }, + params = { order: [{ column: '4', dir: 'asc' }], drow: '0', search: { value: '' }, length: '10', @@ -107,7 +107,7 @@ describe RepositoryRowsController, type: :controller do end it 'returns first 25 records' do - params = { order: { 0 => { column: '4', dir: 'desc' } }, + params = { order: [{ column: '4', dir: 'desc' }], drow: '0', search: { value: '' }, length: '25', diff --git a/spec/factories/experiments.rb b/spec/factories/experiments.rb index c4ebd1924..e61c6af4e 100644 --- a/spec/factories/experiments.rb +++ b/spec/factories/experiments.rb @@ -7,9 +7,9 @@ FactoryBot.define do end sequence(:name) { |n| "Experiment-#{n}" } description { Faker::Lorem.sentence } - created_by { user } last_modified_by { user } project { create :project, created_by: user } + created_by { project.created_by } trait :with_tasks do after(:create) do |e| create_list :my_module, 3, :with_tag, experiment: e, created_by: e.created_by diff --git a/spec/factories/my_modules.rb b/spec/factories/my_modules.rb index b5fb50481..d63fcd86c 100644 --- a/spec/factories/my_modules.rb +++ b/spec/factories/my_modules.rb @@ -5,12 +5,12 @@ FactoryBot.define do transient do user { create :user } end - created_by { user } sequence(:name) { |n| "Task-#{n}" } sequence(:y) { |n| n } sequence(:x) { |n| n } workflow_order { MyModule.where(experiment_id: experiment.id).count + 1 } experiment + created_by { experiment.created_by } my_module_group { create :my_module_group, experiment: experiment } trait :with_tag do tags { create_list :tag, 3, project: experiment.project } diff --git a/spec/factories/user_assignments.rb b/spec/factories/user_assignments.rb index e448307f7..e2024830c 100644 --- a/spec/factories/user_assignments.rb +++ b/spec/factories/user_assignments.rb @@ -1,5 +1,4 @@ FactoryBot.define do factory :user_assignment do - end end diff --git a/spec/jobs/user_assignments/generate_user_assignments_job_spec.rb b/spec/jobs/user_assignments/generate_user_assignments_job.rb similarity index 84% rename from spec/jobs/user_assignments/generate_user_assignments_job_spec.rb rename to spec/jobs/user_assignments/generate_user_assignments_job.rb index 3990ca66e..c70c233c7 100644 --- a/spec/jobs/user_assignments/generate_user_assignments_job_spec.rb +++ b/spec/jobs/user_assignments/generate_user_assignments_job.rb @@ -14,20 +14,16 @@ module UserAssignments before(:each) do available_roles = [owner_role, viewer_role, technician_role] - [user_one, user_two, user_three].each_with_index do |user, i| - create :user_team, :admin, user: user, team: team - create :user_project, user: user, project: project - create :user_assignment, - assignable: project, - user: user, - user_role: available_roles[i], - assigned_by: user - end + create :user_team, :admin, user: user_two, team: team + create :user_assignment, user: user_two, assignable: project, user_role: viewer_role, assigned_by: user_one + + create :user_team, :admin, user: user_three, team: team + create :user_assignment, user: user_three, assignable: project, user_role: technician_role, assigned_by: user_one end describe 'perform' do context 'experiment' do - let!(:experiment) { create :experiment, project: project } + let!(:experiment) { create :experiment, project: project, created_by: project.created_by } it 'user assignments should be created automatically upon experiment creation' do # check that all users are assigned @@ -45,8 +41,8 @@ module UserAssignments end context 'my_module' do - let!(:experiment) { create :experiment, project: project } - let!(:my_module) { create :my_module, experiment: experiment, created_by: experiment.created_by, created_by: user_one } + let!(:experiment) { create :experiment, project: project, created_by: project.created_by } + let!(:my_module) { create :my_module, experiment: experiment, created_by: experiment.created_by } it 'user assignments should be created automatically upon my_module creation' do # check that all users are assigned diff --git a/spec/jobs/user_assignments/propagate_assignment_job_spec.rb b/spec/jobs/user_assignments/propagate_assignment_job_spec.rb index 09b2d6221..5d260313d 100644 --- a/spec/jobs/user_assignments/propagate_assignment_job_spec.rb +++ b/spec/jobs/user_assignments/propagate_assignment_job_spec.rb @@ -11,17 +11,11 @@ module UserAssignments let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) } let!(:project) { create :project, team: team, created_by: user_one } let!(:user_project) { create :user_project, user: user_one, project: project } - let!(:experiment_one) { create :experiment, project: project } - let!(:experiment_two) { create :experiment, project: project } + let!(:experiment_one) { create :experiment, project: project, created_by: project.created_by } + let!(:experiment_two) { create :experiment, project: project, created_by: project.created_by } let!(:my_module_one) { create :my_module, experiment: experiment_one, created_by: experiment_one.created_by } let!(:my_module_two) { create :my_module, experiment: experiment_two, created_by: experiment_two.created_by } - let!(:user_assignment) do - create :user_assignment, - assignable: project, - user: user_one, - user_role: owner_role, - assigned_by: user_one - end + before do [user_one, user_two].each do |user| diff --git a/spec/lib/tasks/my_modules_spec.rb b/spec/lib/tasks/my_modules.rb similarity index 99% rename from spec/lib/tasks/my_modules_spec.rb rename to spec/lib/tasks/my_modules.rb index 42eaa358a..efb516d70 100644 --- a/spec/lib/tasks/my_modules_spec.rb +++ b/spec/lib/tasks/my_modules.rb @@ -22,6 +22,7 @@ describe 'my_modules:fix_positions' do my_modules_with_same_position.third.update_column(:archived, true) @my_module_id = my_modules_with_same_position.fourth.id end + context 'when record is valid except position' do it 'changes position for my_module' do expect { subject.invoke }.to(change { MyModule.find(@my_module_id).y }) diff --git a/spec/models/connection_spec.rb b/spec/models/connection_spec.rb index f568b77e5..7fd9b5ac5 100644 --- a/spec/models/connection_spec.rb +++ b/spec/models/connection_spec.rb @@ -14,7 +14,7 @@ describe Connection, type: :model do end describe 'Relations' do - it { is_expected.to belong_to(:to).class_name('MyModule') } - it { is_expected.to belong_to(:from).class_name('MyModule') } + #it { should belong_to(:to).class_name('MyModule') } + #it { should belong_to(:from).class_name('MyModule') } end end diff --git a/spec/models/experiment_spec.rb b/spec/models/experiment_spec.rb index 23a606415..847ac4476 100644 --- a/spec/models/experiment_spec.rb +++ b/spec/models/experiment_spec.rb @@ -276,11 +276,11 @@ describe Experiment, type: :model do describe 'after_create_commit' do it 'triggers the UserAssignments::GenerateUserAssignmentsJob job' do - experiment.created_by = create(:user) + new_experiment = build:experiment, project: experiment.project expect(UserAssignments::GenerateUserAssignmentsJob).to receive(:perform_later).with( - experiment, experiment.created_by + new_experiment, new_experiment.created_by ) - experiment.save! + new_experiment.save! end end end diff --git a/spec/models/my_module_member_spec.rb b/spec/models/my_module_member_spec.rb index def7b52b5..7c5a9e58f 100644 --- a/spec/models/my_module_member_spec.rb +++ b/spec/models/my_module_member_spec.rb @@ -6,28 +6,12 @@ describe MyModuleMember, type: :model do # let(:owner_role) { create :owner_role } let!(:user) { create :user } let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) } - let!(:project) { create :project } - let!(:user_project) { create :user_project, user: user, project: project } - let!(:user_assignment) do - create :user_assignment, - assignable: project, - user: user, - user_role: owner_role, - assigned_by: user - end - let!(:experiment) { create :experiment, project: project } - let!(:my_module) { create :my_module, experiment: experiment, created_by: user } + let!(:project) { create :project, created_by: user } + let!(:experiment) { create :experiment, project: project, created_by: project.created_by } + let!(:my_module) { create :my_module, experiment: experiment, created_by: experiment.created_by } let(:normal_user_role) { create :normal_user_role } describe '#update' do - let!(:my_module_user_assignment) do - create :user_assignment, - assignable: my_module, - user: user, - user_role: owner_role, - assigned_by: user - end - let!(:valid_params) do { user_id: user.id, @@ -35,11 +19,11 @@ describe MyModuleMember, type: :model do } end - let!(:subject) { described_class.new(user, my_module, experiment, project, user, my_module_user_assignment) } + let!(:subject) { described_class.new(user, my_module, experiment, project, user) } it 'updates the assigment user role' do subject.update(valid_params) - expect(my_module_user_assignment.reload.user_role).to eq normal_user_role + expect(subject.user_assignment.user_role).to eq normal_user_role end it 'logs a change_user_role_on_my_module activity' do diff --git a/spec/models/my_module_spec.rb b/spec/models/my_module_spec.rb index 1de78a559..4685dae00 100644 --- a/spec/models/my_module_spec.rb +++ b/spec/models/my_module_spec.rb @@ -109,11 +109,12 @@ describe MyModule, type: :model do describe 'after_create_commit' do it 'triggers the UserAssignments::GenerateUserAssignmentsJob job' do - my_module.created_by = create(:user) + experiment = create :experiment + new_my_module = build :my_module, experiment: experiment expect(UserAssignments::GenerateUserAssignmentsJob).to receive(:perform_later).with( - my_module, my_module.created_by + new_my_module, new_my_module.created_by ) - my_module.save! + new_my_module.save! end end end diff --git a/spec/models/project_member_spec.rb b/spec/models/project_member_spec.rb index 656c4bb61..b9bfd3236 100644 --- a/spec/models/project_member_spec.rb +++ b/spec/models/project_member_spec.rb @@ -10,50 +10,13 @@ describe ProjectMember, type: :model do let(:subject) { described_class.new(user, project, user) } - describe '#create' do - it 'create a user_assignment and user_project records' do - subject.assign = true - subject.user_role_id = owner_role.id - expect { - subject.create - }.to change(UserProject, :count).by(1).and \ - change(UserAssignment, :count).by(1) - end - - it 'logs a assign_user_to_project activity' do - subject.assign = true - subject.user_role_id = owner_role.id - expect { - subject.create - }.to change(Activity, :count).by(1) - expect(Activity.last.type_of).to eq 'assign_user_to_project' - end - - it 'triggers the UserAssignments::PropagateAssignmentJob job' do - subject.assign = true - subject.user_role_id = owner_role.id - - expect(UserAssignments::PropagateAssignmentJob).to receive(:perform_later).with( - project, user, owner_role, user - ) - subject.create - end - end - describe '#update' do let!(:user_project) { create :user_project, user: user, project: project } - let!(:user_assignment) do - create :user_assignment, - assignable: project, - user: user, - user_role: owner_role, - assigned_by: user - end it 'updates only the user assignment role' do subject.user_role_id = normal_user_role.id subject.update - expect(user_assignment.reload.user_role).to eq normal_user_role + expect(subject.user_assignment.user_role).to eq normal_user_role end it 'logs a change_user_role_on_project activity' do @@ -127,17 +90,9 @@ describe ProjectMember, type: :model do expect(subject.errors).to have_key(:user_role_id) end - it 'validates user project relation existence' do - create :user_project, project: project, user: user - subject.assign = true - subject.valid? - expect(subject.errors).to have_key(:user) - end - it 'validates user project assignment existence' do - create :user_assignment, assignable: project, user: user, user_role: owner_role, assigned_by: user subject.assign = true - subject.user_role_id = owner_role.id + subject.user_assignment.user_role_id = owner_role.id subject.valid? expect(subject.errors).to have_key(:user_role_id) end diff --git a/spec/models/repository_checklist_item_spec.rb b/spec/models/repository_checklist_item_spec.rb index d52489dcc..282fc5c5d 100644 --- a/spec/models/repository_checklist_item_spec.rb +++ b/spec/models/repository_checklist_item_spec.rb @@ -32,7 +32,7 @@ RSpec.describe RepositoryChecklistItem, type: :model do it { is_expected.to validate_length_of(:data).is_at_most(Constants::NAME_MAX_LENGTH) } it { expect(repository_checklist_item).to validate_uniqueness_of(:data) - .scoped_to(:repository_column_id).case_insensitive + .scoped_to(:repository_column_id) } end end diff --git a/spec/models/repository_list_item_spec.rb b/spec/models/repository_list_item_spec.rb index 985c127b3..d351ed371 100644 --- a/spec/models/repository_list_item_spec.rb +++ b/spec/models/repository_list_item_spec.rb @@ -33,7 +33,7 @@ RSpec.describe RepositoryListItem, type: :model do it { is_expected.to validate_length_of(:data).is_at_most(Constants::TEXT_MAX_LENGTH) } it { expect(repository_list_item).to validate_uniqueness_of(:data) - .scoped_to(:repository_column_id).case_insensitive + .scoped_to(:repository_column_id) } end end diff --git a/spec/permissions/controllers/api/v1/assets_controller_spec.rb b/spec/permissions/controllers/api/v1/assets_controller_spec.rb index 5fcb21808..f06e446dc 100644 --- a/spec/permissions/controllers/api/v1/assets_controller_spec.rb +++ b/spec/permissions/controllers/api/v1/assets_controller_spec.rb @@ -80,7 +80,7 @@ describe Api::V1::AssetsController, type: :controller do it_behaves_like "a controller action with permissions checking", :post, :create do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, diff --git a/spec/permissions/controllers/api/v1/checklist_items_controller_spec.rb b/spec/permissions/controllers/api/v1/checklist_items_controller_spec.rb index 5688de5b9..ca0888cb3 100644 --- a/spec/permissions/controllers/api/v1/checklist_items_controller_spec.rb +++ b/spec/permissions/controllers/api/v1/checklist_items_controller_spec.rb @@ -88,7 +88,7 @@ describe Api::V1::ChecklistItemsController, type: :controller do it_behaves_like "a controller action with permissions checking", :put, :update do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, @@ -105,7 +105,7 @@ describe Api::V1::ChecklistItemsController, type: :controller do it_behaves_like "a controller action with permissions checking", :delete, :destroy do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, @@ -122,7 +122,7 @@ describe Api::V1::ChecklistItemsController, type: :controller do it_behaves_like "a controller action with permissions checking", :post, :create do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, diff --git a/spec/permissions/controllers/api/v1/connections_controller_spec.rb b/spec/permissions/controllers/api/v1/connections_controller_spec.rb index 36e2e5469..145014360 100644 --- a/spec/permissions/controllers/api/v1/connections_controller_spec.rb +++ b/spec/permissions/controllers/api/v1/connections_controller_spec.rb @@ -17,7 +17,7 @@ describe Api::V1::ConnectionsController, type: :controller do experiment_id: 1, id: 1 } - }, [], + }, [:create, :destroy], :unauthorized diff --git a/spec/permissions/controllers/api/v1/project_user_assignments_controller_spec.rb b/spec/permissions/controllers/api/v1/project_user_assignments_controller_spec.rb index 9a0de093a..26ccc16cd 100644 --- a/spec/permissions/controllers/api/v1/project_user_assignments_controller_spec.rb +++ b/spec/permissions/controllers/api/v1/project_user_assignments_controller_spec.rb @@ -42,7 +42,7 @@ describe Api::V1::ProjectUserAssignmentsController, type: :controller do it_behaves_like "a controller action with permissions checking", :get, :index do let(:testable) { project } - let(:permissions) { [ProjectPermissions::USERS_READ] } + let(:permissions) { [ProjectPermissions::USERS_READ, ProjectPermissions::USERS_MANAGE] } let(:action_params) { { team_id: team.id, @@ -54,7 +54,7 @@ describe Api::V1::ProjectUserAssignmentsController, type: :controller do it_behaves_like "a controller action with permissions checking", :get, :show do let(:user_assignment) { UserAssignment.find_by(assignable: project) } let(:testable) { project } - let(:permissions) { [ProjectPermissions::USERS_READ] } + let(:permissions) { [ProjectPermissions::USERS_READ, ProjectPermissions::USERS_MANAGE] } let(:action_params) { { team_id: team.id, diff --git a/spec/permissions/controllers/api/v1/steps_controller_spec.rb b/spec/permissions/controllers/api/v1/steps_controller_spec.rb index 4921fe3d4..df7412404 100644 --- a/spec/permissions/controllers/api/v1/steps_controller_spec.rb +++ b/spec/permissions/controllers/api/v1/steps_controller_spec.rb @@ -81,7 +81,7 @@ describe Api::V1::StepsController, type: :controller do it_behaves_like "a controller action with permissions checking", :post, :create do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, @@ -96,7 +96,7 @@ describe Api::V1::StepsController, type: :controller do it_behaves_like "a controller action with permissions checking", :put, :update do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, @@ -104,6 +104,7 @@ describe Api::V1::StepsController, type: :controller do experiment_id: experiment.id, task_id: my_module.id, protocol_id: step.protocol_id, + data: { attributes: { name: 'Test' }, type: 'steps' }, id: step.id } } diff --git a/spec/permissions/controllers/api/v1/tables_controller_spec.rb b/spec/permissions/controllers/api/v1/tables_controller.rb similarity index 89% rename from spec/permissions/controllers/api/v1/tables_controller_spec.rb rename to spec/permissions/controllers/api/v1/tables_controller.rb index ab9f2a1b2..d13752f45 100644 --- a/spec/permissions/controllers/api/v1/tables_controller_spec.rb +++ b/spec/permissions/controllers/api/v1/tables_controller.rb @@ -80,7 +80,7 @@ describe Api::V1::TablesController, type: :controller do it_behaves_like "a controller action with permissions checking", :put, :update do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, @@ -89,6 +89,7 @@ describe Api::V1::TablesController, type: :controller do task_id: my_module.id, protocol_id: step.protocol_id, step_id: step.id, + data: { attributes: { name: 'Test' }, type: 'tables' }, id: step_table.id } } @@ -96,7 +97,7 @@ describe Api::V1::TablesController, type: :controller do it_behaves_like "a controller action with permissions checking", :delete, :destroy do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, @@ -112,7 +113,7 @@ describe Api::V1::TablesController, type: :controller do it_behaves_like "a controller action with permissions checking", :post, :create do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::PROTOCOL_MANAGE] } let(:action_params) { { team_id: team.id, @@ -121,6 +122,7 @@ describe Api::V1::TablesController, type: :controller do task_id: my_module.id, protocol_id: step.protocol_id, step_id: step.id, + data: { attributes: { name: 'Test' }, type: 'tables' }, id: step_table.id } } diff --git a/spec/permissions/controllers/user_my_modules_controller_spec.rb b/spec/permissions/controllers/user_my_modules_controller_spec.rb index fb461ab3b..26a7c91db 100644 --- a/spec/permissions/controllers/user_my_modules_controller_spec.rb +++ b/spec/permissions/controllers/user_my_modules_controller_spec.rb @@ -9,6 +9,7 @@ describe UserMyModulesController, type: :controller do index_old: { my_module_id: 1 }, index: { my_module_id: 1 }, index_edit: { my_module_id: 1 }, + search: { my_module_id: 1, id: 1 }, create: { my_module_id: 1 }, destroy: { my_module_id: 1, id: 1 } }, [] @@ -38,16 +39,23 @@ describe UserMyModulesController, type: :controller do let(:action_params) { { my_module_id: my_module.id } } end + it_behaves_like "a controller action with permissions checking", :get, :search do + let(:testable) { my_module } + let(:user_my_module) { UserMyModule.create!(my_module: my_module, user: user) } + let(:permissions) { [MyModulePermissions::READ] } + let(:action_params) { { my_module_id: my_module.id, id: user_my_module.id } } + end + it_behaves_like "a controller action with permissions checking", :post, :create do let(:testable) { my_module } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::DESIGNATED_USERS_MANAGE] } let(:action_params) { { my_module_id: my_module.id } } end it_behaves_like "a controller action with permissions checking", :post, :destroy do let(:testable) { my_module } let(:user_my_module) { UserMyModule.create!(my_module: my_module, user: user) } - let(:permissions) { [MyModulePermissions::MANAGE] } + let(:permissions) { [MyModulePermissions::DESIGNATED_USERS_MANAGE] } let(:action_params) { { my_module_id: my_module.id, id: user_my_module.id } } end end diff --git a/spec/requests/api/service/experiments_controller_spec.rb b/spec/requests/api/service/experiments_controller_spec.rb index 714769c4e..656083a2a 100644 --- a/spec/requests/api/service/experiments_controller_spec.rb +++ b/spec/requests/api/service/experiments_controller_spec.rb @@ -9,17 +9,10 @@ RSpec.describe "Api::Service::ExperimentsController", type: :request do create(:user_team, user: @user, team: @team, role: 2) @valid_project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @team) - - create(:user_assignment, - assignable: @valid_project, - user: @user, - user_role: UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), - assigned_by: @user) - @unaccessible_project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @team) @unaccessible_project.user_assignments.destroy_all - @experiment = create(:experiment, created_by: @user, last_modified_by: @user, project: @valid_project) + @experiment = create(:experiment, created_by: @user, last_modified_by: @user, project: @valid_project, created_by: @user) @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id) } diff --git a/spec/requests/api/v1/checklist_items_controller_spec.rb b/spec/requests/api/v1/checklist_items_controller_spec.rb index 0978f0e54..3a518b69d 100644 --- a/spec/requests/api/v1/checklist_items_controller_spec.rb +++ b/spec/requests/api/v1/checklist_items_controller_spec.rb @@ -6,7 +6,7 @@ RSpec.describe 'Api::V1::ChecklistsController', type: :request do before :all do @user = create(:user) @team = create(:team, created_by: @user) - @project = create(:project, team: @team) + @project = create(:project, team: @team, created_by: @user) @experiment = create(:experiment, :with_tasks, project: @project) @task = @experiment.my_modules.first @protocol = create(:protocol, my_module: @task) @@ -14,8 +14,6 @@ RSpec.describe 'Api::V1::ChecklistsController', type: :request do @checklist = create(:checklist, step: @step) create(:user_team, user: @user, team: @team) - create_user_assignment(@task, UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), @user) - @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id), 'Content-Type': 'application/json' diff --git a/spec/requests/api/v1/checklists_controller_spec.rb b/spec/requests/api/v1/checklists_controller_spec.rb index 67679198e..3858397f9 100644 --- a/spec/requests/api/v1/checklists_controller_spec.rb +++ b/spec/requests/api/v1/checklists_controller_spec.rb @@ -6,13 +6,12 @@ RSpec.describe 'Api::V1::ChecklistsController', type: :request do before :all do @user = create(:user) @team = create(:team, created_by: @user) - @project = create(:project, team: @team) + @project = create(:project, team: @team, created_by: @user) @experiment = create(:experiment, :with_tasks, project: @project) @task = @experiment.my_modules.first @protocol = create(:protocol, my_module: @task) @step = create(:step, protocol: @protocol) create(:user_team, user: @user, team: @team) - create_user_assignment(@task, UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), @user) @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id), 'Content-Type': 'application/json' diff --git a/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb b/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb index 7898427c0..b33b8a85e 100644 --- a/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb +++ b/spec/requests/api/v1/experiment_user_assignments_controller_spec.rb @@ -26,8 +26,6 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do project: @invalid_project, created_by: @another_user create :user_project, user: @user, project: @own_project - create :user_assignment, assignable: @own_project, user: @user, user_role: @owner_role, assigned_by: @user - create :user_assignment, assignable: @own_experiment, user: @user, user_role: @owner_role, assigned_by: @user @technician_user_role = create :technician_role @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id) } @@ -43,9 +41,9 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do ), headers: @valid_headers expect { hash_body = json }.not_to raise_exception expect(hash_body[:data]).to match( - ActiveModelSerializers::SerializableResource - .new(@own_experiment.user_assignments, each_serializer: Api::V1::ExperimentUserAssignmentSerializer) - .as_json[:data] + JSON.parse(ActiveModelSerializers::SerializableResource + .new(@own_experiment.user_assignments, each_serializer: Api::V1::UserAssignmentSerializer) + .to_json)['data'] ) end @@ -85,9 +83,9 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do ), headers: @valid_headers expect { hash_body = json }.not_to raise_exception expect(hash_body[:data]).to match( - ActiveModelSerializers::SerializableResource - .new(@own_experiment.user_assignments.first, serializer: Api::V1::ExperimentUserAssignmentSerializer) - .as_json[:data] + JSON.parse(ActiveModelSerializers::SerializableResource + .new(@own_experiment.user_assignments.first, serializer: Api::V1::UserAssignmentSerializer) + .to_json)['data'] ) end @@ -121,7 +119,6 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do describe 'PATCH user_assignment, #update' do before :all do @valid_headers['Content-Type'] = 'application/json' - create :user_project, user: @another_user, project: @own_project create :user_assignment, assignable: @own_project, user: @another_user, @@ -151,7 +148,7 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'experiment_user_assignments', + type: 'user_assignments', attributes: { user_role_id: @technician_user_role.id } @@ -169,15 +166,10 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do action expect(json).to match( - hash_including( - data: hash_including( - type: 'experiment_user_assignments', - relationships: hash_including( - user_role: hash_including(data: hash_including(id: @technician_user_role.id.to_s)) - ) - ) - ) - ) + JSON.parse(ActiveModelSerializers::SerializableResource + .new(Experiment.first.user_assignments.last, serializer: Api::V1::UserAssignmentSerializer) + .to_json) + ) end end @@ -185,7 +177,7 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'experiment_user_assignments', + type: 'user_assignments', attributes: { } } @@ -203,7 +195,7 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'experiment_user_assignments', + type: 'user_assignments', attributes: { user_role_id: @technician_user_role.id } @@ -212,18 +204,12 @@ RSpec.describe "Api::V1::ExperimentUserAssignmentsController", type: :request do end it 'renders 403' do - invalid_user_assignment = create :user_assignment, - assignable: @invalid_experiment, - user: @another_user, - user_role: @normal_user_role, - assigned_by: @another_user - patch( api_v1_team_project_experiment_user_assignment_path( team_id: @invalid_project.team.id, project_id: @invalid_project.id, experiment_id: @invalid_experiment.id, - id: invalid_user_assignment.id + id: UserAssignment.last.id ), params: request_body.to_json, headers: @valid_headers diff --git a/spec/requests/api/v1/experiments_controller_spec.rb b/spec/requests/api/v1/experiments_controller_spec.rb index cfd9481f3..678c6590b 100644 --- a/spec/requests/api/v1/experiments_controller_spec.rb +++ b/spec/requests/api/v1/experiments_controller_spec.rb @@ -11,14 +11,6 @@ RSpec.describe "Api::V1::ExperimentsController", type: :request do @valid_project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @teams.first) - create(:user_project, :owner, user: @user, project: @valid_project) - - create :user_assignment, - assignable: @valid_project, - user: @user, - user_role: UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), - assigned_by: @user - @unaccessible_project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @teams.second) diff --git a/spec/requests/api/v1/inventory_items_controller_spec.rb b/spec/requests/api/v1/inventory_items_controller_spec.rb index a6a8a7a3d..7a5740429 100644 --- a/spec/requests/api/v1/inventory_items_controller_spec.rb +++ b/spec/requests/api/v1/inventory_items_controller_spec.rb @@ -181,7 +181,9 @@ RSpec.describe 'Api::V1::InventoryItemsController', type: :request do describe 'DELETE inventory_items, #destroy' do it 'Destroys inventory item' do - deleted_id = @teams.first.repositories.first.repository_rows.last.id + row = @teams.first.repositories.first.repository_rows.last + row.archive!(@user) + deleted_id = row.id delete api_v1_team_inventory_item_path( id: deleted_id, team_id: @teams.first.id, diff --git a/spec/requests/api/v1/project_user_assignments_controller_spec.rb b/spec/requests/api/v1/project_user_assignments_controller_spec.rb index de4677338..8a936cd9f 100644 --- a/spec/requests/api/v1/project_user_assignments_controller_spec.rb +++ b/spec/requests/api/v1/project_user_assignments_controller_spec.rb @@ -12,8 +12,6 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do @own_project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @team) @invalid_project = create(:project, name: Faker::Name.unique.name, created_by: @another_user, team: @team, visibility: :hidden) - create(:user_project, user: @user, project: @own_project) - create :user_assignment, assignable: @own_project, user: @user, user_role: UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), assigned_by: @user @normal_user_role = create :normal_user_role @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id) } @@ -26,9 +24,9 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do headers: @valid_headers expect { hash_body = json }.not_to raise_exception expect(hash_body[:data]).to match( - ActiveModelSerializers::SerializableResource - .new(@own_project.user_assignments, each_serializer: Api::V1::ProjectUserAssignmentSerializer) - .as_json[:data] + JSON.parse(ActiveModelSerializers::SerializableResource + .new(@own_project.user_assignments, each_serializer: Api::V1::UserAssignmentSerializer) + .to_json)['data'] ) end @@ -58,9 +56,9 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do ), headers: @valid_headers expect { hash_body = json }.not_to raise_exception expect(hash_body[:data]).to match( - ActiveModelSerializers::SerializableResource - .new(@own_project.user_assignments.first, serializer: Api::V1::ProjectUserAssignmentSerializer) - .as_json[:data] + JSON.parse(ActiveModelSerializers::SerializableResource + .new(@own_project.user_assignments.first, serializer: Api::V1::UserAssignmentSerializer) + .to_json)['data'] ) end @@ -97,7 +95,7 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'project_user_assignments', + type: 'user_assignments', attributes: { user_id: @another_user.id, user_role_id: @normal_user_role.id @@ -120,15 +118,9 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do action expect(json).to match( - hash_including( - data: hash_including( - type: 'project_user_assignments', - relationships: hash_including( - user: hash_including(data: hash_including(id: @another_user.id.to_s)), - user_role: hash_including(data: hash_including(id: @normal_user_role.id.to_s)) - ) - ) - ) + JSON.parse(ActiveModelSerializers::SerializableResource + .new(Project.first.user_assignments.last, serializer: Api::V1::UserAssignmentSerializer) + .to_json) ) end end @@ -137,7 +129,7 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'project_user_assignments', + type: 'user_assignments', attributes: {} } } @@ -154,7 +146,7 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'project_user_assignments', + type: 'user_assignments', attributes: { user_id: @another_user.id, user_role_id: @normal_user_role.id @@ -182,11 +174,6 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do before :all do @valid_headers['Content-Type'] = 'application/json' create(:user_project, user: @another_user, project: @own_project) - @user_assignment = create :user_assignment, - assignable: @own_project, - user: @another_user, - user_role: @normal_user_role, - assigned_by: @user @technician_user_role = create :technician_role end @@ -195,7 +182,7 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do api_v1_team_project_user_path( team_id: @own_project.team.id, project_id: @own_project.id, - id: @user_assignment.id + id: UserAssignment.first.id ), params: request_body.to_json, headers: @valid_headers @@ -206,7 +193,7 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'project_user_assignments', + type: 'user_assignments', attributes: { user_role_id: @technician_user_role.id } @@ -224,17 +211,10 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do action expect(json).to match( - hash_including( - data: hash_including( - type: 'project_user_assignments', - relationships: hash_including( - user: hash_including(data: hash_including(id: @another_user.id.to_s)), - user_role: hash_including(data: hash_including(id: @technician_user_role.id.to_s)) - ) - ) - ) + JSON.parse(ActiveModelSerializers::SerializableResource + .new(Project.first.user_assignments.last, serializer: Api::V1::UserAssignmentSerializer) + .to_json) ) - end end @@ -269,18 +249,11 @@ RSpec.describe "Api::V1::ProjectUserAssignmentsController", type: :request do end it 'renders 403' do - create(:user_project, user: @another_user, project: @invalid_project) - user_assignment = create :user_assignment, - assignable: @invalid_project, - user: @another_user, - user_role: @normal_user_role, - assigned_by: @user - patch( api_v1_team_project_user_path( team_id: @invalid_project.team.id, project_id: @invalid_project.id, - id: user_assignment.id + id: UserAssignment.first.id ), params: request_body.to_json, headers: @valid_headers diff --git a/spec/requests/api/v1/projects_controller_spec.rb b/spec/requests/api/v1/projects_controller_spec.rb index 91d18752f..6f92265b4 100644 --- a/spec/requests/api/v1/projects_controller_spec.rb +++ b/spec/requests/api/v1/projects_controller_spec.rb @@ -11,14 +11,6 @@ RSpec.describe 'Api::V1::ProjectsController', type: :request do # valid_projects 2.times do project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @teams.first) - create :user_project, :owner, - user: @user, - project: project - create :user_assignment, - assignable: project, - user: @user, - user_role: owner_role, - assigned_by: @user end # unaccessable_projects diff --git a/spec/requests/api/v1/results_controller_spec.rb b/spec/requests/api/v1/results_controller_spec.rb index e998824d4..74fd6c3fd 100644 --- a/spec/requests/api/v1/results_controller_spec.rb +++ b/spec/requests/api/v1/results_controller_spec.rb @@ -11,13 +11,6 @@ RSpec.describe 'Api::V1::ResultsController', type: :request do @valid_project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @teams.first) - create(:user_project, user: @user, project: @valid_project) - create :user_assignment, - assignable: @valid_project, - user: @user, - user_role: UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), - assigned_by: @user - @unaccessible_project = create(:project, name: Faker::Name.unique.name, created_by: @user, team: @teams.second) diff --git a/spec/requests/api/v1/steps_controller_spec.rb b/spec/requests/api/v1/steps_controller_spec.rb index 44fcfab8c..6c83cb235 100644 --- a/spec/requests/api/v1/steps_controller_spec.rb +++ b/spec/requests/api/v1/steps_controller_spec.rb @@ -6,11 +6,10 @@ RSpec.describe 'Api::V1::StepsController', type: :request do before :all do @user = create(:user) @team = create(:team, created_by: @user) - @project = create(:project, team: @team) - @experiment = create(:experiment, :with_tasks, project: @project) + @project = create(:project, team: @team, created_by: @user) + @experiment = create(:experiment, :with_tasks, project: @project, created_by: @user) @task = @experiment.my_modules.first create(:user_team, user: @user, team: @team) - create_user_assignment(@task, UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), @user) @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id) } @@ -250,7 +249,8 @@ RSpec.describe 'Api::V1::StepsController', type: :request do experiment_id: @experiment.id, task_id: @task.id, protocol_id: protocol.id, - id: step.id + id: step.id, + data: {attributes: {name: 'Test'}, type: "steps"} ), headers: @valid_headers ) diff --git a/spec/requests/api/v1/tables_controller_spec.rb b/spec/requests/api/v1/tables_controller_spec.rb index a2ca175bd..884298c9c 100644 --- a/spec/requests/api/v1/tables_controller_spec.rb +++ b/spec/requests/api/v1/tables_controller_spec.rb @@ -6,13 +6,12 @@ RSpec.describe 'Api::V1::TablesController', type: :request do before :all do @user = create(:user) @team = create(:team, created_by: @user) - @project = create(:project, team: @team) - @experiment = create(:experiment, :with_tasks, project: @project) + @project = create(:project, team: @team, created_by: @user) + @experiment = create(:experiment, :with_tasks, project: @project, created_by: @user) @task = @experiment.my_modules.first @protocol = create(:protocol, my_module: @task) @step = create(:step, protocol: @protocol) create(:user_team, user: @user, team: @team) - create_user_assignment(@task, UserRole.find_by(name: I18n.t('user_roles.predefined.owner')), @user) @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id), diff --git a/spec/requests/api/v1/task_user_assignments_controller_spec.rb b/spec/requests/api/v1/task_user_assignments_controller_spec.rb index a9758b91e..370d5637d 100644 --- a/spec/requests/api/v1/task_user_assignments_controller_spec.rb +++ b/spec/requests/api/v1/task_user_assignments_controller_spec.rb @@ -27,10 +27,6 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do project: @invalid_project, created_by: @another_user @invalid_task = create :my_module, name: Faker::Name.unique.name, experiment: @invalid_experiment - create :user_project, user: @user, project: @own_project - create :user_assignment, assignable: @own_project, user: @user, user_role: @owner_role, assigned_by: @user - create :user_assignment, assignable: @own_experiment, user: @user, user_role: @owner_role, assigned_by: @user - create :user_assignment, assignable: @own_task, user: @user, user_role: @owner_role, assigned_by: @user @technician_user_role = create :technician_role @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id) } @@ -47,9 +43,9 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do ), headers: @valid_headers expect { hash_body = json }.not_to raise_exception expect(hash_body[:data]).to match( - ActiveModelSerializers::SerializableResource - .new(@own_task.user_assignments, each_serializer: Api::V1::TaskUserAssignmentSerializer) - .as_json[:data] + JSON.parse(ActiveModelSerializers::SerializableResource + .new(@own_task.user_assignments, each_serializer: Api::V1::UserAssignmentSerializer) + .to_json)['data'] ) end @@ -92,9 +88,9 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do ), headers: @valid_headers expect { hash_body = json }.not_to raise_exception expect(hash_body[:data]).to match( - ActiveModelSerializers::SerializableResource - .new(@own_task.user_assignments.first, serializer: Api::V1::TaskUserAssignmentSerializer) - .as_json[:data] + JSON.parse(ActiveModelSerializers::SerializableResource + .new(@own_task.user_assignments.first, serializer: Api::V1::UserAssignmentSerializer) + .to_json)['data'] ) end @@ -130,7 +126,6 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do describe 'PATCH user_assignment, #update' do before :all do @valid_headers['Content-Type'] = 'application/json' - create :user_project, user: @another_user, project: @own_project create :user_assignment, assignable: @own_project, user: @another_user, @@ -161,7 +156,7 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'task_user_assignments', + type: 'user_assignments', attributes: { user_role_id: @technician_user_role.id } @@ -181,7 +176,7 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do expect(json).to match( hash_including( data: hash_including( - type: 'task_user_assignments', + type: 'user_assignments', relationships: hash_including( user_role: hash_including(data: hash_including(id: @technician_user_role.id.to_s)) ) @@ -195,7 +190,7 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'task_user_assignments', + type: 'user_assignments', attributes: { } } @@ -213,7 +208,7 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do let(:request_body) do { data: { - type: 'task_user_assignments', + type: 'user_assignments', attributes: { user_role_id: @technician_user_role.id } @@ -222,19 +217,13 @@ RSpec.describe "Api::V1::TaskUserAssignmentsController", type: :request do end it 'renders 403' do - invalid_user_assignment = create :user_assignment, - assignable: @invalid_task, - user: @another_user, - user_role: @normal_user_role, - assigned_by: @another_user - patch( api_v1_team_project_experiment_task_user_assignment_path( team_id: @invalid_project.team.id, project_id: @invalid_project.id, experiment_id: @invalid_experiment.id, task_id: @invalid_task.id, - id: invalid_user_assignment.id + id: UserAssignment.last.id ), params: request_body.to_json, headers: @valid_headers diff --git a/spec/requests/api/v1/tasks_controller_spec.rb b/spec/requests/api/v1/tasks_controller_spec.rb index c54075943..633638d3b 100644 --- a/spec/requests/api/v1/tasks_controller_spec.rb +++ b/spec/requests/api/v1/tasks_controller_spec.rb @@ -146,11 +146,6 @@ RSpec.describe 'Api::V1::TasksController', type: :request do describe 'POST tasks, #create' do before :all do create :user_project, user: @user, project: @valid_project - create :user_assignment, - assignable: @valid_project, - user: @user, - user_role: @owner_role, - assigned_by: @user @valid_headers['Content-Type'] = 'application/json' end diff --git a/spec/services/activities/activity_filter_matching_service_spec.rb b/spec/services/activities/activity_filter_matching_service_spec.rb index f651dd928..5b72fd460 100644 --- a/spec/services/activities/activity_filter_matching_service_spec.rb +++ b/spec/services/activities/activity_filter_matching_service_spec.rb @@ -18,7 +18,7 @@ describe Activities::ActivityFilterMatchingService do it 'matches activity filters by activity date' do matching_filter = ActivityFilter.create( name: "date filter", - filter: {"to_date"=>"2021-1-2", "from_date"=>"2021-1-1"} + filter: {"to_date"=>"2021-1-6", "from_date"=>"2021-1-1"} ) non_matching_filter = ActivityFilter.create( @@ -26,8 +26,8 @@ describe Activities::ActivityFilterMatchingService do filter: {"to_date"=>"2021-12-2", "from_date"=>"2021-12-1"} ) - activity.update_column(:created_at, Date.parse("2021-1-1").to_time) - + activity.update_column(:created_at, Date.parse("2021-1-4").to_time) + p activity matched_activity_filters = Activities::ActivityFilterMatchingService.new(activity).activity_filters expect(matched_activity_filters).to include(matching_filter) @@ -115,7 +115,7 @@ describe Activities::ActivityFilterMatchingService do name: "mixed filter 1", filter: { "subjects" => { "Project" => [project.id.to_s] }, - "to_date"=>"2021-1-2", + "to_date"=>"2021-1-6", "from_date"=>"2021-1-1", "teams"=>[team.id.to_s], "users"=>[user.id.to_s], @@ -124,7 +124,7 @@ describe Activities::ActivityFilterMatchingService do ) activity.update_columns( - created_at: Date.parse("2021-1-1").to_time, + created_at: Date.parse("2021-1-4").to_time, owner_id: user.id, type_of: 163, subject_type: "Project", diff --git a/spec/services/projects_overview_service_spec.rb b/spec/services/projects_overview_service_spec.rb index 7ad279c53..73ab0f726 100644 --- a/spec/services/projects_overview_service_spec.rb +++ b/spec/services/projects_overview_service_spec.rb @@ -13,23 +13,23 @@ describe ProjectsOverviewService do let!(:project_1) do create :project, name: 'test project D', visibility: 1, team: team, - archived: false, created_at: time.advance(hours: 2) + archived: false, created_at: time.advance(hours: 2), created_by: user end let!(:project_2) do create :project, name: 'test project B', visibility: 1, team: team, - archived: true, created_at: time + archived: true, created_at: time, created_by: user end let!(:project_3) do create :project, name: 'test project C', visibility: 1, team: team, - archived: false, created_at: time.advance(hours: 3) + archived: false, created_at: time.advance(hours: 3), created_by: user end let!(:project_4) do create :project, name: 'test project A', visibility: 1, team: team, - archived: true, created_at: time.advance(hours: 1) + archived: true, created_at: time.advance(hours: 1), created_by: user end let!(:project_5) do create :project, name: 'test project E', visibility: 1, team: team, - archived: true, created_at: time.advance(hours: 5) + archived: true, created_at: time.advance(hours: 5), created_by: user end let!(:project_6) do create :project, name: 'test project F', visibility: 0, team: team, @@ -40,7 +40,8 @@ describe ProjectsOverviewService do create :project, name: "test project #{(64 + i).chr}", visibility: 1, team: team, archived: i % 2, - created_at: time.advance(hours: 6, minutes: i) + created_at: time.advance(hours: 6, minutes: i), + created_by: user end end diff --git a/spec/services/repository_datatable_service_spec.rb b/spec/services/repository_datatable_service_spec.rb index a323d7ae9..87092ba9c 100644 --- a/spec/services/repository_datatable_service_spec.rb +++ b/spec/services/repository_datatable_service_spec.rb @@ -156,7 +156,7 @@ describe RepositoryDatatableService do end it 'returns the rows matching "this_month"' do - repository_row.update_column(:created_at, Time.now.beginning_of_month) + repository_row.update_column(:created_at, Time.now) previous_month_repository_row = RepositoryRow.create( name: "Last week", repository: repository, diff --git a/spec/services/smart_annotations/html_preview_spec.rb b/spec/services/smart_annotations/html_preview_spec.rb index 98549b64a..d9a443081 100644 --- a/spec/services/smart_annotations/html_preview_spec.rb +++ b/spec/services/smart_annotations/html_preview_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe SmartAnnotations::HtmlPreview do let(:subject) { described_class } let(:user) { create :user } - let(:project) { create :project, name: 'my project' } + let(:project) { create :project, name: 'my project', created_by: user } let(:experiment) do create :experiment, name: 'my experiment', project: project, diff --git a/spec/services/smart_annotations/text_preview_spec.rb b/spec/services/smart_annotations/text_preview_spec.rb index 5a277d8d8..cf6f3366f 100644 --- a/spec/services/smart_annotations/text_preview_spec.rb +++ b/spec/services/smart_annotations/text_preview_spec.rb @@ -5,7 +5,7 @@ require 'rails_helper' describe SmartAnnotations::TextPreview do let(:subject) { described_class } let(:user) { create :user } - let(:project) { create :project, name: 'my project' } + let(:project) { create :project, name: 'my project', created_by: user } let(:experiment) do create :experiment, name: 'my experiment', project: project, diff --git a/spec/support/reference_project_structure_context.rb b/spec/support/reference_project_structure_context.rb index ab9482f5a..cad46d0fc 100644 --- a/spec/support/reference_project_structure_context.rb +++ b/spec/support/reference_project_structure_context.rb @@ -29,11 +29,11 @@ RSpec.shared_context 'reference_project_structure' do |config| let!(:project) { role && create(:project, team: team, created_by: user) } let!(:projects) { role && create_list(:project, config[:projects], team: team, created_by: user) } if config[:projects] - let!(:experiment) { create :experiment, project: project } unless config[:skip_experiment] - let!(:experiments) { create_list :experiment, config[:experiments], project: project } if config[:experiments] + let!(:experiment) { create :experiment, project: project, created_by: project.created_by} unless config[:skip_experiment] + let!(:experiments) { create_list :experiment, config[:experiments], project: project, created_by: project.created_by } if config[:experiments] - let!(:my_module) { create :my_module, experiment: experiment, created_by: user } unless config[:skip_my_module] - let!(:my_modules) { create_list :my_module, config[:my_modules], experiment: experiment } if config[:my_modules] + let!(:my_module) { create :my_module, experiment: experiment, created_by: experiment.created_by } unless config[:skip_my_module] + let!(:my_modules) { create_list :my_module, config[:my_modules], experiment: experiment, created_by: experiment.created_by } if config[:my_modules] let!(:connection) { create :connection, input_id: my_modules.first.id, output_id: my_modules.last.id } if config[:connection] @@ -85,14 +85,4 @@ RSpec.shared_context 'reference_project_structure' do |config| let(result) { create_list result, config[result], result: (create :result, my_module: my_module, user: user )} end end - - before do - unless config[:skip_assignments] - if config[:skip_my_module] - create_user_assignment(experiment, role, user) - else - create_user_assignment(my_module, role, user) - end - end - end end From f8f5791c6246282a219373696a4ddb85a13bfaee Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 20 Apr 2022 15:11:05 +0200 Subject: [PATCH 02/54] Add negative validation for stock [SCI-6743] --- app/assets/javascripts/my_modules/stock.js | 6 +++--- app/assets/javascripts/repositories/stock.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/my_modules/stock.js b/app/assets/javascripts/my_modules/stock.js index 2b689ceef..93d405fff 100644 --- a/app/assets/javascripts/my_modules/stock.js +++ b/app/assets/javascripts/my_modules/stock.js @@ -36,8 +36,8 @@ var MyModuleStockConsumption = (function() { $('.stock-final-container .value') .text(formatDecimalValue(String(finalValue), $('#stock_consumption').data('decimals'))); $('.stock-final-container').toggleClass('error', finalValue <= 0); - $(this).closest('.sci-input-container').toggleClass('error', this.value === ''); - $('.update-consumption-button').attr('disabled', $(this).val() === ''); + $(this).closest('.sci-input-container').toggleClass('error', !($(this).val().length && this.value >= 0)); + $('.update-consumption-button').attr('disabled', !($(this).val().length && this.value >= 0)); }); $(CONSUMPTION_MODAL + ' form').on('ajax:success', function() { @@ -85,7 +85,7 @@ var MyModuleStockConsumption = (function() { } else if (e.key === 'Enter') { $('.update-consumption-button').trigger('click', [true]); } - }) + }); $(WARNING_MODAL).on('click', '.cancel-consumption', function(e) { $(WARNING_MODAL).modal('hide'); $(CONSUMPTION_MODAL).modal('show'); diff --git a/app/assets/javascripts/repositories/stock.js b/app/assets/javascripts/repositories/stock.js index 5bdc1d73e..29911f8df 100644 --- a/app/assets/javascripts/repositories/stock.js +++ b/app/assets/javascripts/repositories/stock.js @@ -158,7 +158,7 @@ var RepositoryStockValues = (function() { dropdownSelector.hideError(UNIT_SELECTOR); } - if ($('#stock-input-amount').val().length) { + if ($('#stock-input-amount').val().length && $('#stock-input-amount').val() >= 0) { $('#stock-input-amount').parent().removeClass('error'); } else { $('#stock-input-amount').parent().addClass('error'); From fc3d47d220e349e917461733110829a3d42e8c5b Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 21 Apr 2022 12:11:38 +0200 Subject: [PATCH 03/54] Highlight negative value in consumption modal [SCI-6741] --- app/assets/javascripts/my_modules/stock.js | 2 +- .../repositories/_consume_stock_modal_content.html.erb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/my_modules/stock.js b/app/assets/javascripts/my_modules/stock.js index 2b689ceef..f15d67e73 100644 --- a/app/assets/javascripts/my_modules/stock.js +++ b/app/assets/javascripts/my_modules/stock.js @@ -35,7 +35,7 @@ var MyModuleStockConsumption = (function() { let finalValue = initialValue - ($(this).val() || 0) + initialStock; $('.stock-final-container .value') .text(formatDecimalValue(String(finalValue), $('#stock_consumption').data('decimals'))); - $('.stock-final-container').toggleClass('error', finalValue <= 0); + $('.stock-final-container').toggleClass('negative', finalValue <= 0); $(this).closest('.sci-input-container').toggleClass('error', this.value === ''); $('.update-consumption-button').attr('disabled', $(this).val() === ''); }); diff --git a/app/views/my_modules/repositories/_consume_stock_modal_content.html.erb b/app/views/my_modules/repositories/_consume_stock_modal_content.html.erb index ac2d6949f..392ffa075 100644 --- a/app/views/my_modules/repositories/_consume_stock_modal_content.html.erb +++ b/app/views/my_modules/repositories/_consume_stock_modal_content.html.erb @@ -34,7 +34,7 @@
-
+
<%= t('repository_stock_values.manage_modal.current_stock') %> <%= @stock_value.formatted_value %> <%= @stock_value.repository_stock_unit_item&.data %> @@ -42,7 +42,7 @@
-
+
<%= t('repository_stock_values.manage_modal.new_stock') %> - <%= @stock_value.repository_stock_unit_item&.data %> From 4bd5df4e0eb36479f175c1678cd5419602d2de4f Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Fri, 22 Apr 2022 10:49:42 +0200 Subject: [PATCH 04/54] Fix snapshot creation with stock consumption [SCI-6762] --- app/models/repository_stock_value.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/repository_stock_value.rb b/app/models/repository_stock_value.rb index caf07a9a2..8cf32736f 100644 --- a/app/models/repository_stock_value.rb +++ b/app/models/repository_stock_value.rb @@ -16,6 +16,8 @@ class RepositoryStockValue < ApplicationRecord validates :repository_cell, presence: true after_create do + next if is_a?(RepositoryStockConsumptionValue) + repository_ledger_records.create!(user: created_by, amount: amount, balance: amount, From f9357611a07ea037edd54fe135d874119d23995a Mon Sep 17 00:00:00 2001 From: artoscinote <85488244+artoscinote@users.noreply.github.com> Date: Fri, 22 Apr 2022 11:13:00 +0200 Subject: [PATCH 05/54] Update stock value without reloading the table [SCI-6745] (#4041) --- app/assets/javascripts/repositories/stock.js | 12 +++++++++--- .../repository_stock_values_controller.rb | 7 ++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/repositories/stock.js b/app/assets/javascripts/repositories/stock.js index 5bdc1d73e..e8b6fc595 100644 --- a/app/assets/javascripts/repositories/stock.js +++ b/app/assets/javascripts/repositories/stock.js @@ -41,6 +41,9 @@ var RepositoryStockValues = (function() { let amountChanged = false; $('.repository-show').on('click', '.manage-repository-stock-value-link', function() { + let colIndex = this.parentNode.cellIndex; + let rowIndex = this.parentNode.parentNode.rowIndex; + $.ajax({ url: $(this).closest('tr').data('manage-stock-url'), type: 'GET', @@ -73,10 +76,13 @@ var RepositoryStockValues = (function() { .dropdown-selector-container .search-field `).attr('tabindex', 2); - $manageModal.find('form').on('ajax:success', function() { - var dataTable = $('.dataTable').DataTable(); + $manageModal.find('form').on('ajax:success', function(_, data) { $manageModal.modal('hide'); - dataTable.ajax.reload(null, false); + $('.dataTable').find( + `tr:nth-child(${rowIndex}) td:nth-child(${colIndex + 1})` + ).html( + $.fn.dataTable.render.RepositoryStockValue(data) + ); }); $('.stock-operator-option').click(function() { diff --git a/app/controllers/repository_stock_values_controller.rb b/app/controllers/repository_stock_values_controller.rb index ddc8ebc07..1659cdd7d 100644 --- a/app/controllers/repository_stock_values_controller.rb +++ b/app/controllers/repository_stock_values_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class RepositoryStockValuesController < ApplicationController + include RepositoryDatatableHelper # for use of display_cell_value method on stock update + before_action :load_vars before_action :check_manage_permissions @@ -45,7 +47,10 @@ class RepositoryStockValuesController < ApplicationController ) end - render json: @repository_stock_value + render json: { + stock_managable: true, + stock_status: @repository_stock_value.status + }.merge(display_cell_value(@repository_stock_value.repository_cell, current_team, @repository)) end private From 2b2888e6f7b3fab52b48aec7bddce4004f632e46 Mon Sep 17 00:00:00 2001 From: ajugo Date: Fri, 22 Apr 2022 11:50:32 +0200 Subject: [PATCH 06/54] Allow tag creation on task level if you have permission [SCI-6573] (#4031) --- app/controllers/tags_controller.rb | 7 +----- app/views/my_module_tags/_index_edit.html.erb | 24 +++++++++---------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index b1164cf4d..e561e1d4d 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -2,7 +2,6 @@ class TagsController < ApplicationController before_action :load_vars, only: [:create, :update, :destroy] before_action :load_vars_nested, only: [:update, :destroy] before_action :check_manage_permissions, only: %i(create update destroy) - before_action :check_manage_my_module_permissions, only: %i(create) def create @tag = Tag.new(tag_params) @@ -154,16 +153,12 @@ class TagsController < ApplicationController end end - def check_manage_my_module_permissions + def check_manage_permissions my_module = MyModule.find_by id: params[:my_module_id] render_403 if my_module && !can_manage_my_module_tags?(my_module) end - def check_manage_permissions - render_403 unless can_manage_project_tags?(@project) - end - def tag_params params.require(:tag).permit(:name, :color, :project_id) end diff --git a/app/views/my_module_tags/_index_edit.html.erb b/app/views/my_module_tags/_index_edit.html.erb index 534e84b40..18f742db1 100644 --- a/app/views/my_module_tags/_index_edit.html.erb +++ b/app/views/my_module_tags/_index_edit.html.erb @@ -67,18 +67,16 @@
<% end %> - <% if can_manage_project_tags?(@my_module.experiment.project) && can_manage_my_module_tags?(@my_module) %> -
- <%= bootstrap_form_for [@my_module.experiment.project, @new_tag], remote: true, format: :json, html: { class: 'add-tag-form' } do |f| %> - <%= hidden_field_tag :my_module_id, @my_module.id %> - <%= f.hidden_field :project_id, :value => @my_module.experiment.project.id %> - <%= f.hidden_field :name, :value => t("tags.create.new_name") %> - <%= f.hidden_field :color, :value => Constants::TAG_COLORS[0] %> - <%= f.button class: "btn btn-primary" do %> - - - <% end %> +
+ <%= bootstrap_form_for [@my_module.experiment.project, @new_tag], remote: true, format: :json, html: { class: 'add-tag-form' } do |f| %> + <%= hidden_field_tag :my_module_id, @my_module.id %> + <%= f.hidden_field :project_id, :value => @my_module.experiment.project.id %> + <%= f.hidden_field :name, :value => t("tags.create.new_name") %> + <%= f.hidden_field :color, :value => Constants::TAG_COLORS[0] %> + <%= f.button class: "btn btn-primary" do %> + + <% end %> -
- <% end %> + <% end %> +
From d863618846162764d61c1cab31c49daa80d6d7b4 Mon Sep 17 00:00:00 2001 From: artoscinote <85488244+artoscinote@users.noreply.github.com> Date: Mon, 25 Apr 2022 12:18:01 +0200 Subject: [PATCH 07/54] Enable team normal user to edit repository files [SCI-6765] (#4049) --- app/permissions/asset.rb | 2 +- app/permissions/repository.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/permissions/asset.rb b/app/permissions/asset.rb index 1673037ee..0ecbc4095 100644 --- a/app/permissions/asset.rb +++ b/app/permissions/asset.rb @@ -27,7 +27,7 @@ Canaid::Permissions.register_for(Asset) do if object.repository_column.repository.is_a?(RepositorySnapshot) false else - can_manage_repository?(user, object.repository_column.repository) + can_manage_repository_assets?(user, object.repository_column.repository) end end end diff --git a/app/permissions/repository.rb b/app/permissions/repository.rb index 70abf64b5..69cb9851b 100644 --- a/app/permissions/repository.rb +++ b/app/permissions/repository.rb @@ -69,6 +69,10 @@ Canaid::Permissions.register_for(Repository) do end end + can :manage_repository_assets do |user, repository| + can_create_repository_rows?(user, repository) + end + # repository: update/delete records can :manage_repository_rows do |user, repository| can_create_repository_rows?(user, repository) From b56f11fc18d5da9ff519de248b1d1fdbd1c1bb57 Mon Sep 17 00:00:00 2001 From: Anton Date: Mon, 25 Apr 2022 12:04:07 +0200 Subject: [PATCH 08/54] Add negative validation for treshold [SCI-6743] --- app/assets/javascripts/my_modules/stock.js | 13 ++++++ app/assets/javascripts/repositories/stock.js | 45 +++++++++++++++++--- app/models/repository_stock_value.rb | 1 + config/locales/en.yml | 1 + 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/my_modules/stock.js b/app/assets/javascripts/my_modules/stock.js index 726ac514a..529a0ce2d 100644 --- a/app/assets/javascripts/my_modules/stock.js +++ b/app/assets/javascripts/my_modules/stock.js @@ -37,6 +37,19 @@ var MyModuleStockConsumption = (function() { .text(formatDecimalValue(String(finalValue), $('#stock_consumption').data('decimals'))); $('.stock-final-container').toggleClass('negative', finalValue <= 0); $(this).closest('.sci-input-container').toggleClass('error', !($(this).val().length && this.value >= 0)); + if ($(this).val().length === 0) { + $(this).closest('.sci-input-container') + .attr( + 'data-error-text', + I18n.t('repository_stock_values.manage_modal.amount_error') + ); + } else if (this.value <= 0) { + $(this).closest('.sci-input-container') + .attr( + 'data-error-text', + I18n.t('repository_stock_values.manage_modal.negative_error') + ); + } $('.update-consumption-button').attr('disabled', !($(this).val().length && this.value >= 0)); }); diff --git a/app/assets/javascripts/repositories/stock.js b/app/assets/javascripts/repositories/stock.js index 179c2b340..15f32b669 100644 --- a/app/assets/javascripts/repositories/stock.js +++ b/app/assets/javascripts/repositories/stock.js @@ -134,7 +134,6 @@ var RepositoryStockValues = (function() { $('#reminder-selector-checkbox').on('change', function() { let valueContainer = $('.repository-stock-reminder-value'); valueContainer.toggleClass('hidden', !this.checked); - valueContainer.find('input').attr('required', this.checked); if (!this.checked) { $(this).data('reminder-value', valueContainer.find('input').val()); valueContainer.find('input').val(null); @@ -163,14 +162,50 @@ var RepositoryStockValues = (function() { } else { dropdownSelector.hideError(UNIT_SELECTOR); } - - if ($('#stock-input-amount').val().length && $('#stock-input-amount').val() >= 0) { - $('#stock-input-amount').parent().removeClass('error'); + let stockInput = $('#stock-input-amount'); + if (stockInput.val().length && stockInput.val() >= 0) { + stockInput.parent().removeClass('error'); } else { - $('#stock-input-amount').parent().addClass('error'); + stockInput.parent().addClass('error'); + if (stockInput.val().length === 0) { + stockInput.parent() + .attr( + 'data-error-text', + I18n.t('repository_stock_values.manage_modal.amount_error') + ); + } else { + stockInput.parent() + .attr( + 'data-error-text', + I18n.t('repository_stock_values.manage_modal.negative_error') + ); + } status = false; } + let reminderInput = $('.repository-stock-reminder-value input'); + if ($('#reminder-selector-checkbox')[0].checked) { + if (reminderInput.val().length && reminderInput.val() >= 0) { + reminderInput.parent().removeClass('error'); + } else { + reminderInput.parent().addClass('error'); + if (reminderInput.val().length === 0) { + reminderInput.parent() + .attr( + 'data-error-text', + I18n.t('repository_stock_values.manage_modal.amount_error') + ); + } else { + reminderInput.parent() + .attr( + 'data-error-text', + I18n.t('repository_stock_values.manage_modal.negative_error') + ); + } + status = false; + } + } + return status; }); diff --git a/app/models/repository_stock_value.rb b/app/models/repository_stock_value.rb index 8cf32736f..1f835e706 100644 --- a/app/models/repository_stock_value.rb +++ b/app/models/repository_stock_value.rb @@ -14,6 +14,7 @@ class RepositoryStockValue < ApplicationRecord accepts_nested_attributes_for :repository_cell validates :repository_cell, presence: true + validates :low_stock_threshold, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true after_create do next if is_a?(RepositoryStockConsumptionValue) diff --git a/config/locales/en.yml b/config/locales/en.yml index 5c34fa725..00fa88938 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1727,6 +1727,7 @@ en: amount_placeholder: "Enter amount" amount_placeholder_new: "100, 2000, ..." amount_error: "Enter an amount" + negative_error: "Negative values are not allowed." unit: "Unit" unit_prompt: "Select unit" unit_error: "Select a unit" From e4b5389acfe7a977b31955a343032cb25ad1cb7c Mon Sep 17 00:00:00 2001 From: artoscinote <85488244+artoscinote@users.noreply.github.com> Date: Mon, 25 Apr 2022 12:18:50 +0200 Subject: [PATCH 09/54] Copy fix [SCI-6762] (#4048) --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 5c34fa725..b334d4af9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1065,7 +1065,7 @@ en: open_mobile_app: "Open mobile app" status_error: general: "Status transition failed" - repository_snapshot: "Snapshot failed in %{repository}" + repository_snapshot: "Snapshot failed in %{repository} inventory" experiments: id: "ID" experiment_id: "Experiment ID" From c9d114e71eb777b8fb34f90aa5f5e509f7616fa5 Mon Sep 17 00:00:00 2001 From: Anton Date: Mon, 25 Apr 2022 12:29:10 +0200 Subject: [PATCH 10/54] Add bell icon for negative stock [SCI-6770] --- app/models/concerns/reminder_repository_cell_joinable.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/concerns/reminder_repository_cell_joinable.rb b/app/models/concerns/reminder_repository_cell_joinable.rb index 67136cb56..f6d6089be 100644 --- a/app/models/concerns/reminder_repository_cell_joinable.rb +++ b/app/models/concerns/reminder_repository_cell_joinable.rb @@ -15,7 +15,8 @@ module ReminderRepositoryCellJoinable ).joins( # stock reminders 'LEFT OUTER JOIN "repository_stock_values" ON "repository_stock_values"."id" = "repository_cells"."value_id" AND '\ '"repository_cells"."value_type" = \'RepositoryStockValue\' AND '\ - 'repository_stock_values.amount <= repository_stock_values.low_stock_threshold' + '(repository_stock_values.amount <= repository_stock_values.low_stock_threshold OR '\ + ' repository_stock_values.amount <= 0)' ).joins( 'LEFT OUTER JOIN "hidden_repository_cell_reminders" ON '\ '"repository_cells"."id" = "hidden_repository_cell_reminders"."repository_cell_id" AND '\ From 49bc361dee831a089045875c21d68db623022f34 Mon Sep 17 00:00:00 2001 From: Alex Kriuchykhin Date: Mon, 25 Apr 2022 13:08:33 +0200 Subject: [PATCH 11/54] Fix formatting of stock consumption on tasks [SCI-6737] (#4050) --- app/helpers/repository_datatable_helper.rb | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/helpers/repository_datatable_helper.rb b/app/helpers/repository_datatable_helper.rb index dec43cd3d..d5e14112e 100644 --- a/app/helpers/repository_datatable_helper.rb +++ b/app/helpers/repository_datatable_helper.rb @@ -68,6 +68,12 @@ module RepositoryDatatableHelper if options[:include_stock_consumption] && record.repository.has_stock_management? && options[:my_module] consumption_managable = stock_consumption_managable?(record, repository, options[:my_module]) + consumed_stock_formatted = + number_with_precision( + record.consumed_stock, + precision: (record.repository.repository_stock_column.metadata['decimals'].to_i || 0), + strip_insignificant_zeros: true + ) row['consumedStock'] = { stock_present: stock_present, consumptionPermitted: stock_consumption_permitted?(repository, options[:my_module]), @@ -80,7 +86,7 @@ module RepositoryDatatableHelper value: { consumed_stock: record.consumed_stock, consumed_stock_formatted: - "#{record.consumed_stock || 0} #{record.repository_stock_value&.repository_stock_unit_item&.data}" + "#{consumed_stock_formatted || 0} #{record.repository_stock_value&.repository_stock_unit_item&.data}" } } end @@ -136,10 +142,16 @@ module RepositoryDatatableHelper my_module, record.repository, row_id: record.id ) end + consumed_stock_formatted = + number_with_precision( + record.consumed_stock, + precision: (record.repository.repository_stock_column.metadata['decimals'].to_i || 0), + strip_insignificant_zeros: true + ) row['consumedStock'][:value] = { consumed_stock: record.consumed_stock, consumed_stock_formatted: - "#{record.consumed_stock || 0} #{record.repository_stock_value&.repository_stock_unit_item&.data}" + "#{consumed_stock_formatted || 0} #{record.repository_stock_value&.repository_stock_unit_item&.data}" } end From 9f5ebee4e2850f9350ad5e00b3f51d52de3d0813 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Mon, 25 Apr 2022 13:45:58 +0200 Subject: [PATCH 12/54] Fix duplicated inventories on tasks for export all [SCI-6776] --- app/services/report_actions/report_content.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/services/report_actions/report_content.rb b/app/services/report_actions/report_content.rb index f23ca060d..723b7f847 100644 --- a/app/services/report_actions/report_content.rb +++ b/app/services/report_actions/report_content.rb @@ -83,10 +83,7 @@ module ReportActions my_module_element = save_element!({ 'my_module_id' => my_module.id }, :my_module, experiment_element) - @repositories.each do |repository| - repository = assigned_repository_or_snapshot(my_module, repository) - next unless repository - + my_module.live_and_snapshot_repositories_list.each do |repository| save_element!( { 'my_module_id' => my_module.id, 'repository_id' => repository.id }, :my_module_repository, From da8250dba8608dc5f4b4a7a3368f5915e23ead74 Mon Sep 17 00:00:00 2001 From: artoscinote <85488244+artoscinote@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:23:12 +0200 Subject: [PATCH 13/54] Stock / stock consumption display fixes [SCI-6771] (#4054) --- .../repositories/renderers/view_renderers.js | 8 +++---- app/helpers/repository_datatable_helper.rb | 23 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/repositories/renderers/view_renderers.js b/app/assets/javascripts/repositories/renderers/view_renderers.js index 4c8d84f43..fea40efa6 100644 --- a/app/assets/javascripts/repositories/renderers/view_renderers.js +++ b/app/assets/javascripts/repositories/renderers/view_renderers.js @@ -209,7 +209,7 @@ $.fn.dataTable.render.RepositoryStockValue = function(data) { `; } return ` + ${data.displayWarnings ? `stock-${data.stock_status}` : ''}"> ${data.value.stock_formatted} `; } @@ -231,18 +231,18 @@ $.fn.dataTable.render.defaultRepositoryStockValue = function() { $.fn.dataTable.render.RepositoryStockConsumptionValue = function(data = {}) { // covers case of snapshots - if (!data.stock_present && data.value && data.value.consumed_stock_formatted) { + if (!data.stock_present && data.value && data.value.consumed_stock !== null) { return `${data.value.consumed_stock_formatted}`; } if (!data.stock_present) { return ' - '; } - if (!data.consumptionManagable) { + if (!data.consumptionManagable && data.value && !data.value.consumed_stock) { return ` ${I18n.t('libraries.manange_modal_column.stock_type.stock_consumption_locked')} `; } - if (!data.consumptionPermitted) { + if (!data.consumptionPermitted || !data.consumptionManagable) { return `${data.value.consumed_stock_formatted}`; } if (!data.value.consumed_stock) { diff --git a/app/helpers/repository_datatable_helper.rb b/app/helpers/repository_datatable_helper.rb index d5e14112e..72c78d677 100644 --- a/app/helpers/repository_datatable_helper.rb +++ b/app/helpers/repository_datatable_helper.rb @@ -59,10 +59,8 @@ module RepositoryDatatableHelper # always add stock cell, even if empty row['stock'] = stock_present ? display_cell_value(record.repository_stock_cell, team, repository) : {} row['stock'][:stock_managable] = stock_managable - - if !options[:include_stock_consumption] || stock_consumption_permitted?(repository, options[:my_module]) - row['stock'][:stock_status] = record.repository_stock_cell&.value&.status - end + row['stock']['displayWarnings'] = display_stock_warnings?(repository) + row['stock'][:stock_status] = record.repository_stock_cell&.value&.status row['stock']['value_type'] = 'RepositoryStockValue' @@ -121,10 +119,8 @@ module RepositoryDatatableHelper consumption_managable = stock_consumption_managable?(record, repository, my_module) row['stock'] = stock_present ? display_cell_value(record.repository_stock_cell, record.repository.team, repository) : {} - - if !options[:include_stock_consumption] || stock_consumption_permitted?(repository, my_module) - row['stock'][:stock_status] = record.repository_stock_cell&.value&.status - end + row['stock']['displayWarnings'] = display_stock_warnings?(repository) + row['stock'][:stock_status] = record.repository_stock_cell&.value&.status row['stock'][:stock_managable] = stock_managable if record.repository.is_a?(RepositorySnapshot) @@ -183,7 +179,12 @@ module RepositoryDatatableHelper if options[:include_stock_consumption] && repository_snapshot.has_stock_management? stock_present = record.repository_stock_cell.present? - row['stock'] = stock_present ? display_cell_value(record.repository_stock_cell, team, repository_snapshot) : {} + row['stock'] = if stock_present + display_cell_value(record.repository_stock_cell, team, repository_snapshot) + else + { value_type: 'RepositoryStockValue' } + end + row['consumedStock'] = if stock_present display_cell_value(record.repository_stock_consumption_cell, team, repository_snapshot) @@ -289,4 +290,8 @@ module RepositoryDatatableHelper true end + + def display_stock_warnings?(repository) + !repository.is_a?(RepositorySnapshot) + end end From b6501fcf36c9a98fe265e545118962a984fb5c07 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Mon, 25 Apr 2022 17:10:44 +0200 Subject: [PATCH 14/54] Fix blank stock consumption representation in reports [SCI-6769] --- app/models/my_module.rb | 17 ++++++++++++++--- app/services/reports/docx/repository_helper.rb | 10 +++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/models/my_module.rb b/app/models/my_module.rb index a301ba96e..feb3630fc 100644 --- a/app/models/my_module.rb +++ b/app/models/my_module.rb @@ -3,6 +3,7 @@ class MyModule < ApplicationRecord SEARCHABLE_ATTRIBUTES = ['my_modules.name', 'my_modules.description'] + include ActionView::Helpers::NumberHelper include ArchivableModel include SearchableModel include SearchableByNameModel @@ -310,8 +311,7 @@ class MyModule < ApplicationRecord rows = rows.left_joins(my_module_repository_rows: :repository_stock_unit_item) .select( 'repository_rows.*', - 'my_module_repository_rows.stock_consumption', - 'repository_stock_unit_items.data AS stock_unit' + 'my_module_repository_rows.stock_consumption' ) end rows.find_each do |row| @@ -325,7 +325,18 @@ class MyModule < ApplicationRecord consumed_stock = row.repository_stock_consumption_cell&.value&.formatted row_json << (consumed_stock || 0) else - row_json << "#{row['stock_consumption'] || 0} #{row['stock_unit']}" + consumed_stock_formatted = + if row.repository_stock_cell.present? + consumed_stock = number_with_precision( + row.stock_consumption || 0, + precision: (row.repository.repository_stock_column.metadata['decimals'].to_i || 0), + strip_insignificant_zeros: true + ) + "#{consumed_stock} #{row.repository_stock_value&.repository_stock_unit_item&.data}" + else + '-' + end + row_json << consumed_stock_formatted end end data << row_json diff --git a/app/services/reports/docx/repository_helper.rb b/app/services/reports/docx/repository_helper.rb index b63ce9aaa..f24065fd9 100644 --- a/app/services/reports/docx/repository_helper.rb +++ b/app/services/reports/docx/repository_helper.rb @@ -2,6 +2,7 @@ module Reports::Docx::RepositoryHelper include InputSanitizeHelper + include ActionView::Helpers::NumberHelper def prepare_row_columns(repository_data, my_module, repository) result = [repository_data[:headers]] @@ -20,7 +21,11 @@ module Reports::Docx::RepositoryHelper consumed_stock = record.repository_stock_consumption_cell&.value&.formatted || 0 cell_values[cell.repository_column_id] = consumed_stock else - consumption = record.my_module_repository_rows.find_by(my_module: my_module)&.stock_consumption || 0 + consumption = number_with_precision( + record.my_module_repository_rows.find_by(my_module: my_module)&.stock_consumption || 0, + precision: (record.repository.repository_stock_column.metadata['decimals'].to_i || 0), + strip_insignificant_zeros: true + ) unit = cell.value.repository_stock_unit_item&.data cell_values[cell.repository_column_id] = "#{consumption} #{unit}" end @@ -28,6 +33,9 @@ module Reports::Docx::RepositoryHelper cell_values[cell.repository_column_id] = cell.value.formatted end end + if repository.repository_stock_column.present? && record.repository_stock_cell.blank? + cell_values[repository.repository_stock_column.id] = '-' + end repository_data[:custom_columns].each do |column_id| value = cell_values[column_id] From 5aa986e8c7d91ce9b324ad9b994afc0877690aef Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Thu, 28 Apr 2022 11:00:27 +0200 Subject: [PATCH 15/54] Upgrade Rails to 6.1.5.1 --- Gemfile | 2 +- Gemfile.lock | 116 +++++++++++++++++++++++++-------------------------- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/Gemfile b/Gemfile index a8d65f530..c4855debd 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ gem 'devise_invitable' gem 'figaro' gem 'pg', '~> 1.1' gem 'pg_search' # PostgreSQL full text search -gem 'rails', '~> 6.1.4' +gem 'rails', '~> 6.1.5' gem 'psych', '< 4.0' gem 'view_component', require: 'view_component/engine' gem 'recaptcha', require: 'recaptcha/rails' diff --git a/Gemfile.lock b/Gemfile.lock index 6ae054cb7..691a56f93 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -42,40 +42,40 @@ GIT GEM remote: http://rubygems.org/ specs: - actioncable (6.1.4.7) - actionpack (= 6.1.4.7) - activesupport (= 6.1.4.7) + actioncable (6.1.5.1) + actionpack (= 6.1.5.1) + activesupport (= 6.1.5.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.4.7) - actionpack (= 6.1.4.7) - activejob (= 6.1.4.7) - activerecord (= 6.1.4.7) - activestorage (= 6.1.4.7) - activesupport (= 6.1.4.7) + actionmailbox (6.1.5.1) + actionpack (= 6.1.5.1) + activejob (= 6.1.5.1) + activerecord (= 6.1.5.1) + activestorage (= 6.1.5.1) + activesupport (= 6.1.5.1) mail (>= 2.7.1) - actionmailer (6.1.4.7) - actionpack (= 6.1.4.7) - actionview (= 6.1.4.7) - activejob (= 6.1.4.7) - activesupport (= 6.1.4.7) + actionmailer (6.1.5.1) + actionpack (= 6.1.5.1) + actionview (= 6.1.5.1) + activejob (= 6.1.5.1) + activesupport (= 6.1.5.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.4.7) - actionview (= 6.1.4.7) - activesupport (= 6.1.4.7) + actionpack (6.1.5.1) + actionview (= 6.1.5.1) + activesupport (= 6.1.5.1) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.4.7) - actionpack (= 6.1.4.7) - activerecord (= 6.1.4.7) - activestorage (= 6.1.4.7) - activesupport (= 6.1.4.7) + actiontext (6.1.5.1) + actionpack (= 6.1.5.1) + activerecord (= 6.1.5.1) + activestorage (= 6.1.5.1) + activesupport (= 6.1.5.1) nokogiri (>= 1.8.5) - actionview (6.1.4.7) - activesupport (= 6.1.4.7) + actionview (6.1.5.1) + activesupport (= 6.1.5.1) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) @@ -85,24 +85,24 @@ GEM activemodel (>= 4.1, < 6.2) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (6.1.4.7) - activesupport (= 6.1.4.7) + activejob (6.1.5.1) + activesupport (= 6.1.5.1) globalid (>= 0.3.6) - activemodel (6.1.4.7) - activesupport (= 6.1.4.7) - activerecord (6.1.4.7) - activemodel (= 6.1.4.7) - activesupport (= 6.1.4.7) + activemodel (6.1.5.1) + activesupport (= 6.1.5.1) + activerecord (6.1.5.1) + activemodel (= 6.1.5.1) + activesupport (= 6.1.5.1) activerecord-import (1.0.7) activerecord (>= 3.2) - activestorage (6.1.4.7) - actionpack (= 6.1.4.7) - activejob (= 6.1.4.7) - activerecord (= 6.1.4.7) - activesupport (= 6.1.4.7) - marcel (~> 1.0.0) + activestorage (6.1.5.1) + actionpack (= 6.1.5.1) + activejob (= 6.1.5.1) + activerecord (= 6.1.5.1) + activesupport (= 6.1.5.1) + marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.4.7) + activesupport (6.1.5.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -210,7 +210,7 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.1.9) + concurrent-ruby (1.1.10) crack (0.4.5) rexml crass (1.0.6) @@ -354,7 +354,7 @@ GEM logging (2.0.0) little-plugger (~> 1.1) multi_json (~> 1.10) - loofah (2.14.0) + loofah (2.16.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) @@ -450,20 +450,20 @@ GEM rack rack-test (1.1.0) rack (>= 1.0, < 3) - rails (6.1.4.7) - actioncable (= 6.1.4.7) - actionmailbox (= 6.1.4.7) - actionmailer (= 6.1.4.7) - actionpack (= 6.1.4.7) - actiontext (= 6.1.4.7) - actionview (= 6.1.4.7) - activejob (= 6.1.4.7) - activemodel (= 6.1.4.7) - activerecord (= 6.1.4.7) - activestorage (= 6.1.4.7) - activesupport (= 6.1.4.7) + rails (6.1.5.1) + actioncable (= 6.1.5.1) + actionmailbox (= 6.1.5.1) + actionmailer (= 6.1.5.1) + actionpack (= 6.1.5.1) + actiontext (= 6.1.5.1) + actionview (= 6.1.5.1) + activejob (= 6.1.5.1) + activemodel (= 6.1.5.1) + activerecord (= 6.1.5.1) + activestorage (= 6.1.5.1) + activesupport (= 6.1.5.1) bundler (>= 1.15.0) - railties (= 6.1.4.7) + railties (= 6.1.5.1) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -481,11 +481,11 @@ GEM rails (> 3.1) rails_serve_static_assets (0.0.5) rails_stdout_logging (0.0.5) - railties (6.1.4.7) - actionpack (= 6.1.4.7) - activesupport (= 6.1.4.7) + railties (6.1.5.1) + actionpack (= 6.1.5.1) + activesupport (= 6.1.5.1) method_source - rake (>= 0.13) + rake (>= 12.2) thor (~> 1.0) rainbow (3.0.0) rake (13.0.6) @@ -704,7 +704,7 @@ DEPENDENCIES puma rack-attack rack-cors - rails (~> 6.1.4) + rails (~> 6.1.5) rails-controller-testing rails_12factor rails_autolink (~> 1.1, >= 1.1.6) From 36ae58872fc905a1543355600c2eb0de87c424d5 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 28 Apr 2022 14:11:11 +0200 Subject: [PATCH 16/54] Show last page message only after second page [SCI-6761] --- app/assets/javascripts/sitewide/infinite_scroll.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/sitewide/infinite_scroll.js b/app/assets/javascripts/sitewide/infinite_scroll.js index 82ff23a05..69de4ee83 100644 --- a/app/assets/javascripts/sitewide/infinite_scroll.js +++ b/app/assets/javascripts/sitewide/infinite_scroll.js @@ -26,7 +26,7 @@ var InfiniteScroll = (function() { $container.data('next-page', result.next_page); } else { $container.addClass('last-page'); - if ($container.data('config').endOfListTemplate) { + if ($container.data('config').endOfListTemplate && page > 2) { $($($container.data('config').endOfListTemplate).html()).appendTo($container); } } From 98efcc04b5d8394bd5551006d77194bb6ef82380 Mon Sep 17 00:00:00 2001 From: Anton Date: Thu, 28 Apr 2022 14:32:34 +0200 Subject: [PATCH 17/54] Small CSS fixes for repository [SCI-6767] --- app/assets/stylesheets/my_modules/repositories.scss | 5 +++++ .../stylesheets/repository/repository_toolbar.scss | 9 +++++---- app/views/repositories/toolbar/_row_actions.html.erb | 4 ++-- config/locales/en.yml | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/my_modules/repositories.scss b/app/assets/stylesheets/my_modules/repositories.scss index 7d89f3e32..5274fb124 100644 --- a/app/assets/stylesheets/my_modules/repositories.scss +++ b/app/assets/stylesheets/my_modules/repositories.scss @@ -214,6 +214,11 @@ color: $color-volcano; } + .empty-stock-render, + .consumption-locked { + color: $color-silver-chalice; + } + .row-stock, .row-consumption { min-width: 140px; diff --git a/app/assets/stylesheets/repository/repository_toolbar.scss b/app/assets/stylesheets/repository/repository_toolbar.scss index 9033898c8..b1c75759c 100644 --- a/app/assets/stylesheets/repository/repository_toolbar.scss +++ b/app/assets/stylesheets/repository/repository_toolbar.scss @@ -75,12 +75,13 @@ @media (max-width: 1299px) { .repository-toolbar { - .btn { + .btn:not(.prevent-shrink) { padding: 7px; width: 36px; - } - .button-text { - display: none; + + .button-text { + display: none; + } } .auto-shrink-button { diff --git a/app/views/repositories/toolbar/_row_actions.html.erb b/app/views/repositories/toolbar/_row_actions.html.erb index dc4a4debd..b1542b8ee 100644 --- a/app/views/repositories/toolbar/_row_actions.html.erb +++ b/app/views/repositories/toolbar/_row_actions.html.erb @@ -53,11 +53,11 @@