diff --git a/.rubocop.yml b/.rubocop.yml index 64f482db..a5c086c2 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -2,6 +2,8 @@ inherit_from: .rubocop_todo.yml require: - standard + +plugins: - rubocop-rails inherit_gem: diff --git a/Gemfile b/Gemfile index 3307222a..428834e5 100644 --- a/Gemfile +++ b/Gemfile @@ -27,7 +27,7 @@ gem "sprockets-rails" gem "active_skin" # WYSIWYG -gem "activeadmin_quill_editor" +gem "activeadmin_quill_editor", "~> 1.0" # Graphs gem "chartkick" diff --git a/Gemfile.lock b/Gemfile.lock index 27a8a619..2e32dd96 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -118,7 +118,7 @@ GEM sassc sassc-rails xdan-datetimepicker-rails (~> 2.5.1) - activeadmin_quill_editor (1.2.0) + activeadmin_quill_editor (1.3.0) activeadmin (>= 2.9, < 4) activejob (7.2.2.1) activesupport (= 7.2.2.1) @@ -165,7 +165,7 @@ GEM arbre (1.7.0) activesupport (>= 3.0.0) ruby2_keywords (>= 0.0.2) - ast (2.4.2) + ast (2.4.3) attr_extras (7.1.0) base64 (0.2.0) bcrypt (3.1.20) @@ -174,10 +174,10 @@ GEM bindex (0.8.1) bootsnap (1.18.4) msgpack (~> 1.2) - brakeman (7.0.0) + brakeman (7.0.2) racc builder (3.3.0) - bullet (8.0.1) + bullet (8.0.6) activesupport (>= 3.0.0) uniform_notifier (~> 1.11) bundler-audit (0.9.2) @@ -217,7 +217,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - carrierwave (3.1.1) + carrierwave (3.1.2) activemodel (>= 6.0.0) activesupport (>= 6.0.0) addressable (~> 2.6) @@ -228,20 +228,20 @@ GEM carrierwave (>= 2.2.1) marcel (~> 1.0.0) mime-types (~> 3.0) - chartkick (5.1.4) + chartkick (5.1.5) childprocess (5.1.0) logger (~> 1.5) choice (0.2.0) chronic (0.10.2) concurrent-ruby (1.3.5) - connection_pool (2.5.0) + connection_pool (2.5.3) countries (7.1.1) unaccent (~> 0.3) crack (1.0.0) bigdecimal rexml crass (1.0.6) - csv (3.3.2) + csv (3.3.4) cuprite (0.15.1) capybara (~> 3.0) ferrum (~> 0.15.0) @@ -261,7 +261,7 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - diff-lcs (1.6.0) + diff-lcs (1.6.1) docile (1.4.1) domain_name (0.6.20240107) dotenv (2.8.1) @@ -278,28 +278,28 @@ GEM railties (>= 5.0.0) faker (3.5.1) i18n (>= 1.8.11, < 2) - faraday (2.12.2) + faraday (2.13.1) faraday-net_http (>= 2.0, < 3.5) json logger faraday-net_http (3.4.0) net-http (>= 0.5.0) - faraday-retry (2.2.1) + faraday-retry (2.3.1) faraday (~> 2.0) ferrum (0.15) addressable (~> 2.5) concurrent-ruby (~> 1.1) webrick (~> 1.7) websocket-driver (~> 0.7) - ffi (1.17.1) - ffi (1.17.1-x86_64-linux-gnu) + ffi (1.17.2) + ffi (1.17.2-x86_64-linux-gnu) ffi-compiler (1.3.2) ffi (>= 1.15.5) rake formtastic (5.0.0) actionpack (>= 6.0.0) formtastic_i18n (0.7.0) - gapic-common (0.25.0) + gapic-common (1.0.0) faraday (>= 1.9, < 3.a) faraday-retry (>= 1.0, < 3.a) google-cloud-env (~> 2.2) @@ -320,14 +320,14 @@ GEM google-cloud-core (1.8.0) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) - google-cloud-env (2.2.2) + google-cloud-env (2.3.0) base64 (~> 0.2) faraday (>= 1.0, < 3.a) google-cloud-errors (1.5.0) - google-cloud-location (0.10.0) + google-cloud-location (1.0.0) gapic-common (>= 0.25.0, < 2.a) google-cloud-errors (~> 1.0) - google-cloud-translate (3.7.0) + google-cloud-translate (3.7.1) google-cloud-core (~> 1.6) google-cloud-translate-v2 (>= 0.0, < 2.a) google-cloud-translate-v3 (>= 0.11, < 2.a) @@ -337,27 +337,27 @@ GEM googleapis-common-protos (>= 1.3.10, < 2.a) googleapis-common-protos-types (>= 1.0.5, < 2.a) googleauth (>= 0.16.2, < 2.a) - google-cloud-translate-v3 (1.4.0) + google-cloud-translate-v3 (1.4.1) gapic-common (>= 0.25.0, < 2.a) google-cloud-errors (~> 1.0) google-cloud-location (>= 0.7, < 2.a) google-iam-v1 (>= 0.7, < 2.a) - google-iam-v1 (1.3.0) + google-iam-v1 (1.3.1) gapic-common (>= 0.25.0, < 2.a) google-cloud-errors (~> 1.0) grpc-google-iam-v1 (~> 1.1) - google-logging-utils (0.1.0) - google-protobuf (4.30.1) + google-logging-utils (0.2.0) + google-protobuf (4.30.2) bigdecimal rake (>= 13) - google-protobuf (4.30.1-x86_64-linux) + google-protobuf (4.30.2-x86_64-linux) bigdecimal rake (>= 13) - googleapis-common-protos (1.6.0) + googleapis-common-protos (1.8.0) google-protobuf (>= 3.18, < 5.a) - googleapis-common-protos-types (~> 1.7) + googleapis-common-protos-types (~> 1.20) grpc (~> 1.41) - googleapis-common-protos-types (1.18.0) + googleapis-common-protos-types (1.20.0) google-protobuf (>= 3.18, < 5.a) googleauth (1.14.0) faraday (>= 1.0, < 3.a) @@ -367,15 +367,15 @@ GEM multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - groupdate (6.5.1) - activesupport (>= 7) - grpc (1.71.0) + groupdate (6.6.0) + activesupport (>= 7.1) + grpc (1.72.0) google-protobuf (>= 3.25, < 5.0) googleapis-common-protos-types (~> 1.0) - grpc (1.71.0-x86_64-linux) + grpc (1.72.0-x86_64-linux) google-protobuf (>= 3.25, < 5.0) googleapis-common-protos-types (~> 1.0) - grpc-google-iam-v1 (1.9.0) + grpc-google-iam-v1 (1.10.0) google-protobuf (>= 3.18, < 5.a) googleapis-common-protos (~> 1.4) grpc (~> 1.41) @@ -406,7 +406,7 @@ GEM railties (>= 6.0) responders (>= 2) io-console (0.8.0) - irb (1.15.1) + irb (1.15.2) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) @@ -414,7 +414,7 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.10.2) + json (2.11.3) jsonapi-resources (0.9.12) activerecord (>= 4.1) concurrent-ruby @@ -449,7 +449,7 @@ GEM llhttp-ffi (0.5.1) ffi-compiler (~> 1.0) rake (~> 13.0) - logger (1.6.6) + logger (1.7.0) loofah (2.24.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) @@ -460,23 +460,23 @@ GEM net-smtp marcel (1.0.4) matrix (0.4.2) - mime-types (3.6.0) + mime-types (3.7.0) logger - mime-types-data (~> 3.2015) - mime-types-data (3.2025.0304) + mime-types-data (~> 3.2025, >= 3.2025.0507) + mime-types-data (3.2025.0507) mini_magick (5.2.0) benchmark logger mini_mime (1.1.5) mini_portile2 (2.8.8) minitest (5.25.5) - mjml-rails (4.14.1) + mjml-rails (4.15.1) msgpack (1.8.0) multi_json (1.15.0) mustache (1.1.1) net-http (0.6.0) uri - net-imap (0.5.6) + net-imap (0.5.8) date net-protocol net-pop (0.1.2) @@ -491,28 +491,28 @@ GEM net-protocol net-ssh (7.3.0) nio4r (2.7.4) - nokogiri (1.18.4) + nokogiri (1.18.8) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.18.4-x86_64-linux-gnu) + nokogiri (1.18.8-x86_64-linux-gnu) racc (~> 1.4) oj (3.16.10) bigdecimal (>= 3.0) ostruct (>= 0.2) oj_mimic_json (1.0.1) - optimist (3.2.0) + optimist (3.2.1) orm_adapter (0.5.0) os (1.1.4) ostruct (0.6.1) paper_trail (15.2.0) activerecord (>= 6.1) request_store (~> 1.4) - parallel (1.26.3) + parallel (1.27.0) parallel_tests (5.1.0) parallel paranoia (3.0.1) activerecord (>= 6, < 8.1) - parser (3.3.7.1) + parser (3.3.8.0) ast (~> 2.4.1) racc patience_diff (1.2.0) @@ -521,19 +521,20 @@ GEM pp (0.6.2) prettyprint prettyprint (0.2.0) - psych (5.2.3) + prism (1.4.0) + psych (5.2.4) date stringio - public_suffix (6.0.1) + public_suffix (6.0.2) puma (6.6.0) nio4r (~> 2.0) racc (1.8.1) - rack (3.0.14) + rack (3.0.16) rack-cors (2.0.2) rack (>= 2.0.0) rack-mini-profiler (2.3.4) rack (>= 1.2.0) - rack-session (2.1.0) + rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) rack-test (2.2.0) @@ -580,7 +581,7 @@ GEM activerecord (>= 6.1.5) activesupport (>= 6.1.5) i18n - rdoc (6.12.0) + rdoc (6.13.1) psych (>= 4.0.0) redcarpet (3.6.1) redis (5.4.0) @@ -604,7 +605,7 @@ GEM redis-store (1.11.0) redis (>= 4, < 6) regexp_parser (2.10.0) - reline (0.6.0) + reline (0.6.1) io-console (~> 0.5) request_store (1.7.0) rack (>= 1.4) @@ -628,28 +629,28 @@ GEM rspec-expectations (>= 2.99.0.beta1) rspec-core (3.13.3) rspec-support (~> 3.13.0) - rspec-expectations (3.13.3) + rspec-expectations (3.13.4) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.2) + rspec-mocks (3.13.4) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-rails (7.1.1) - actionpack (>= 7.0) - activesupport (>= 7.0) - railties (>= 7.0) + rspec-rails (8.0.0) + actionpack (>= 7.2) + activesupport (>= 7.2) + railties (>= 7.2) rspec-core (~> 3.13) rspec-expectations (~> 3.13) rspec-mocks (~> 3.13) rspec-support (~> 3.13) - rspec-support (3.13.2) + rspec-support (3.13.3) rswag-api (2.16.0) activesupport (>= 5.2, < 8.1) railties (>= 5.2, < 8.1) rswag-ui (2.16.0) actionpack (>= 5.2, < 8.1) railties (>= 5.2, < 8.1) - rubocop (1.73.2) + rubocop (1.75.5) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -657,20 +658,21 @@ GEM parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.38.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.39.0) - parser (>= 3.3.1.0) - rubocop-performance (1.24.0) + rubocop-ast (1.44.1) + parser (>= 3.3.7.2) + prism (~> 1.4) + rubocop-performance (1.25.0) lint_roller (~> 1.1) - rubocop (>= 1.72.1, < 2.0) + rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rails (2.30.3) + rubocop-rails (2.31.0) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.72.1, < 2.0) + rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) ruby-graphviz (1.2.5) rexml @@ -711,7 +713,7 @@ GEM logger rack (>= 2.2.4) redis-client (>= 0.22.2) - signet (0.19.0) + signet (0.20.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -722,8 +724,9 @@ GEM simplecov_json_formatter (~> 0.1) simplecov-html (0.13.1) simplecov_json_formatter (0.1.4) - sprockets (4.2.1) + sprockets (4.2.2) concurrent-ruby (~> 1.0) + logger rack (>= 2.2.4, < 4) sprockets-rails (3.5.2) actionpack (>= 6.1) @@ -737,19 +740,19 @@ GEM net-ssh (>= 2.8.0) ostruct ssrf_filter (1.2.0) - standard (1.47.0) + standard (1.49.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) - rubocop (~> 1.73.0) + rubocop (~> 1.75.2) standard-custom (~> 1.0.0) - standard-performance (~> 1.7) + standard-performance (~> 1.8) standard-custom (1.0.2) lint_roller (~> 1.0) rubocop (~> 1.50) - standard-performance (1.7.0) + standard-performance (1.8.0) lint_roller (~> 1.1) - rubocop-performance (~> 1.24.0) - stringio (3.1.5) + rubocop-performance (~> 1.25.0) + stringio (3.1.7) super_diff (0.15.0) attr_extras (>= 6.2.4) diff-lcs @@ -759,7 +762,7 @@ GEM timeout (0.4.3) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2025.1) + tzinfo-data (1.2025.2) tzinfo (>= 1.0.0) uglifier (4.2.1) execjs (>= 0.3.0, < 3) @@ -767,7 +770,7 @@ GEM unicode-display_width (3.1.4) unicode-emoji (~> 4.0, >= 4.0.4) unicode-emoji (4.0.4) - uniform_notifier (1.16.0) + uniform_notifier (1.17.0) uri (1.0.3) useragent (0.16.11) warden (1.2.9) @@ -807,7 +810,7 @@ DEPENDENCIES activeadmin activeadmin-globalize! activeadmin_addons - activeadmin_quill_editor + activeadmin_quill_editor (~> 1.0) activerecord-import activerecord-postgis-adapter acts_as_list diff --git a/lib/tasks/documents.rake b/lib/tasks/documents.rake new file mode 100644 index 00000000..d1ebd4a4 --- /dev/null +++ b/lib/tasks/documents.rake @@ -0,0 +1,81 @@ +namespace :documents do + desc "Removing documents completely" + task remove: :environment do + for_real = ENV["FOR_REAL"] == "true" + docs_to_remove = (ENV["DOCS"] || "").split(",") + files_to_remove = (ENV["FILES"] || "").split(",") + + abort "Please provide documents (DOCS) to remove or files (FILES)" if docs_to_remove.empty? && files_to_remove.empty? + abort "You should provide either DOCS or FILES" if docs_to_remove.any? && files_to_remove.any? + + puts "RUNNING FOR REAL" if for_real + puts "DRY RUN" unless for_real + + if docs_to_remove.any? + puts "This script will remove #{docs_to_remove.count} documents" + end + + if files_to_remove.any? + puts "This script will remove #{files_to_remove.count} files with associated operator documents and histories" + end + + ActiveRecord::Base.transaction do + docs = if docs_to_remove.any? + OperatorDocument.unscoped.where(id: docs_to_remove) + else + OperatorDocument.unscoped.where(document_file_id: files_to_remove) + end + histories = if docs_to_remove.any? + OperatorDocumentHistory.unscoped.where(operator_document_id: docs_to_remove) + else + OperatorDocumentHistory.unscoped.where(document_file_id: files_to_remove).or( + OperatorDocumentHistory.unscoped.where(operator_document_id: docs) + ) + end + operator_ids = (docs.pluck(:operator_id) + histories.pluck(:operator_id)).uniq + versions = PaperTrail::Version.where(item: docs) + if files_to_remove.any? + versions_with_document_id = files_to_remove.map { |id| "object LIKE '%document_file_id: #{id.to_i}%'" }.join(" OR ") + versions = versions.or(PaperTrail::Version.where(item_type: "OperatorDocument").where(versions_with_document_id)) + end + + files = DocumentFile.where(id: docs.pluck(:document_file_id) + histories.pluck(:document_file_id)) + if for_real + files.each do |file| + puts "Removing file #{file.id}" + file.destroy! + end + else + puts "Removing files... #{files.delete_all} affected" + end + + annexes = OperatorDocumentAnnex.where(id: AnnexDocument + .where(documentable: histories) + .or(AnnexDocument.where(documentable: docs)) + .select(:operator_document_annex_id)) + + if for_real + annexes.each do |annex| + puts "Removing annex #{annex.id}" + annex.really_destroy! + end + else + puts "Removing annexes... #{annexes.delete_all} affected" + end + + puts "Removing versions... #{versions.delete_all} affected" + puts "Removing histories... #{histories.delete_all} affected" + puts "Removing docs... #{docs.delete_all} affected" + + if operator_ids.any? + puts "Syncing scores..." + puts "Only for operators: #{operator_ids.join(", ")}" + SyncTasks.new(as_rake_task: false).sync_scores(operator_id: operator_ids) + puts "Refreshing ranking..." + RankingOperatorDocument.refresh + end + + raise ActiveRecord::Rollback unless for_real + end + end +end diff --git a/lib/tasks/fix_one_time.rake b/lib/tasks/fix_one_time.rake index 21e6c19d..6f219d38 100644 --- a/lib/tasks/fix_one_time.rake +++ b/lib/tasks/fix_one_time.rake @@ -56,60 +56,6 @@ namespace :fix_one_time do end end - desc "Removing documents completely" - task remove_docs: :environment do - for_real = ENV["FOR_REAL"] == "true" - docs_to_remove = (ENV["DOCS"] || "").split(",") - - puts "RUNNING FOR REAL" if for_real - puts "DRY RUN" unless for_real - - puts "This script will remove #{docs_to_remove.count} documents" - - ActiveRecord::Base.transaction do - docs = OperatorDocument.unscoped.where(id: docs_to_remove) - operator_ids = docs.pluck(:operator_id).uniq - histories = OperatorDocumentHistory.unscoped.where(operator_document_id: docs_to_remove) - versions = PaperTrail::Version.where(item: docs) - - files = DocumentFile.where(id: docs.pluck(:document_file_id) + histories.pluck(:document_file_id)) - if for_real - files.each do |file| - puts "Removing file #{file.id}" - file.destroy! - end - else - puts "Removing files... #{files.delete_all} affected" - end - - annexes = OperatorDocumentAnnex.where(id: AnnexDocument - .where(documentable: histories) - .or(AnnexDocument.where(documentable: docs)) - .select(:operator_document_annex_id)) - - if for_real - annexes.each do |annex| - puts "Removing annex #{annex.id}" - annex.really_destroy! - end - else - puts "Removing annexes... #{annexes.delete_all} affected" - end - - puts "Removing versions... #{versions.delete_all} affected" - puts "Removing histories... #{histories.delete_all} affected" - puts "Removing docs... #{docs.delete_all} affected" - - puts "Syncing scores..." - puts "Only for operators: #{operator_ids.join(", ")}" - SyncTasks.new(as_rake_task: false).sync_scores(operator_id: operator_ids) - puts "Refreshing ranking..." - RankingOperatorDocument.refresh - - raise ActiveRecord::Rollback unless for_real - end - end - desc "Re-assign uploaded attachment to observation reports" task observation_report_attachments: :environment do # context