From 4df2bea62cff54d51df10eca54a8719d461985f7 Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Wed, 22 Jul 2015 20:40:12 +0000 Subject: [PATCH 1/9] removing files that should have been ignored by .gitignore --- Gemfile.lock | 268 --- .../qrda_cat3__16_.xml | 2087 +++++++++++++++++ .../qrda_cat3__16_.xml | 2087 +++++++++++++++++ ...20130220151835_update_bundle_data_model.rb | 64 - ...20130311182518_move_files_to_filesystem.rb | 31 - db/seeds.rb | 7 - test/fixtures/bundles/installed.json | 24 - test/fixtures/bundles/installed_mpl.json | 8 - 8 files changed, 4174 insertions(+), 402 deletions(-) delete mode 100644 Gemfile.lock create mode 100644 data/upload/test_executions/55afdae8323937007400011b/qrda_cat3__16_.xml create mode 100644 data/upload/test_executions/55afdb203239370074000121/qrda_cat3__16_.xml delete mode 100644 db/migrate/20130220151835_update_bundle_data_model.rb delete mode 100644 db/migrate/20130311182518_move_files_to_filesystem.rb delete mode 100644 db/seeds.rb delete mode 100644 test/fixtures/bundles/installed.json delete mode 100644 test/fixtures/bundles/installed_mpl.json diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 0ceaf880d..000000000 --- a/Gemfile.lock +++ /dev/null @@ -1,268 +0,0 @@ -GEM - remote: http://rubygems.org/ - specs: - Ascii85 (1.0.2) - aasm (3.3.1) - actionmailer (4.1.8) - actionpack (= 4.1.8) - actionview (= 4.1.8) - mail (~> 2.5, >= 2.5.4) - actionpack (4.1.8) - actionview (= 4.1.8) - activesupport (= 4.1.8) - rack (~> 1.5.2) - rack-test (~> 0.6.2) - actionview (4.1.8) - activesupport (= 4.1.8) - builder (~> 3.1) - erubis (~> 2.7.0) - activemodel (4.1.8) - activesupport (= 4.1.8) - builder (~> 3.1) - activerecord (4.1.8) - activemodel (= 4.1.8) - activesupport (= 4.1.8) - arel (~> 5.0.0) - activesupport (4.1.8) - i18n (~> 0.6, >= 0.6.9) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.1) - tzinfo (~> 1.1) - addressable (2.3.6) - ansi (1.4.3) - arel (5.0.1.20140414130214) - bcrypt (3.1.7) - bson (2.3.0) - builder (3.2.2) - cache_digests (0.3.1) - actionpack (>= 3.2) - thread_safe - cancan (1.6.10) - cane (2.6.2) - parallel - carrierwave (0.10.0) - activemodel (>= 3.2.0) - activesupport (>= 3.2.0) - json (>= 1.7) - mime-types (>= 1.16) - carrierwave-mongoid (0.7.1) - carrierwave (>= 0.8.0, < 0.11.0) - mongoid (>= 3.0, < 5.0) - mongoid-grid_fs (>= 1.3, < 3.0) - coderay (1.1.0) - connection_pool (2.1.0) - crack (0.4.2) - safe_yaml (~> 1.0.0) - daemons (1.1.9) - delayed_job (4.0.2) - activesupport (>= 3.0, < 4.2) - delayed_job_mongoid (2.1.0) - delayed_job (>= 3.0, < 5) - mongoid (>= 3.0, < 5) - devise (3.2.4) - bcrypt (~> 3.0) - orm_adapter (~> 0.1) - railties (>= 3.2.6, < 5) - thread_safe (~> 0.1) - warden (~> 1.2.3) - docile (1.1.5) - erubis (2.7.0) - eventmachine (1.0.3) - execjs (2.2.1) - health-data-standards (3.5.3) - activesupport (~> 4.1.1) - builder (~> 3.1) - erubis (~> 2.7.0) - log4r (~> 1.1.10) - memoist (~> 0.9.1) - mongoid (~> 4.0.0) - mongoid-tree (~> 1.0.4) - nokogiri (= 1.6.0) - protected_attributes (~> 1.0.5) - rest-client (~> 1.6.7) - rubyzip (= 0.9.9) - uuid (~> 2.3.7) - highline (1.6.21) - hike (1.2.3) - i18n (0.7.0) - jquery-rails (3.1.1) - railties (>= 3.0, < 5.0) - thor (>= 0.14, < 2.0) - jquery-ui-rails (5.0.0) - railties (>= 3.2.16) - json (1.8.2) - libv8 (3.16.14.3) - log4r (1.1.10) - macaddr (1.7.1) - systemu (~> 2.6.2) - mail (2.6.3) - mime-types (>= 1.16, < 3) - memoist (0.9.3) - metaclass (0.0.4) - method_source (0.8.2) - mime-types (1.25.1) - mini_portile (0.5.3) - minitest (5.5.1) - mocha (1.1.0) - metaclass (~> 0.0.1) - mongoid (4.0.0) - activemodel (~> 4.0) - moped (~> 2.0.0) - origin (~> 2.1) - tzinfo (>= 0.3.37) - mongoid-grid_fs (2.1.0) - mime-types (>= 1.0, < 3.0) - mongoid (>= 3.0, < 5.0) - mongoid-tree (1.0.4) - mongoid (>= 3.0, <= 4.0) - mongoid_rails_migrations (1.0.1) - activesupport (>= 3.2.0) - bundler (>= 1.0.0) - rails (>= 3.2.0) - railties (>= 3.2.0) - moped (2.0.3) - bson (~> 2.2) - connection_pool (~> 2.0) - optionable (~> 0.2.0) - multi_json (1.10.1) - nokogiri (1.6.0) - mini_portile (~> 0.5.0) - optionable (0.2.0) - origin (2.1.1) - orm_adapter (0.5.0) - parallel (1.0.0) - pdf-core (0.2.5) - pdf-reader (0.9.0) - Ascii85 (>= 0.9) - prawn (1.1.0) - pdf-core (~> 0.2.5) - ttfunk (~> 1.2.0) - protected_attributes (1.0.8) - activemodel (>= 4.0.1, < 5.0) - pry (0.9.12.6) - coderay (~> 1.0) - method_source (~> 0.8) - slop (~> 3.4) - pry-nav (0.2.3) - pry (~> 0.9.10) - quality-measure-engine (3.1.2) - delayed_job_mongoid (~> 2.1.0) - mongoid (~> 4.0.0) - moped (~> 2.0.0) - rubyzip (~> 0.9.9) - rack (1.5.2) - rack-test (0.6.2) - rack (>= 1.0) - rails (4.1.8) - actionmailer (= 4.1.8) - actionpack (= 4.1.8) - actionview (= 4.1.8) - activemodel (= 4.1.8) - activerecord (= 4.1.8) - activesupport (= 4.1.8) - bundler (>= 1.3.0, < 2.0) - railties (= 4.1.8) - sprockets-rails (~> 2.0) - rails-perftest (0.0.4) - railties (4.1.8) - actionpack (= 4.1.8) - activesupport (= 4.1.8) - rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) - rake (10.3.2) - rdoc (4.2.0) - json (~> 1.4) - ref (1.0.5) - rest-client (1.6.8) - mime-types (~> 1.16) - rdoc (>= 2.4.2) - ruby-graphviz (1.2.1) - ruby-prof (0.15.1) - rubyzip (0.9.9) - safe_yaml (1.0.3) - sass (3.2.19) - simple_form (3.0.2) - actionpack (~> 4.0) - activemodel (~> 4.0) - simplecov (0.9.1) - docile (~> 1.1.0) - multi_json (~> 1.0) - simplecov-html (~> 0.8.0) - simplecov-html (0.8.0) - slop (3.5.0) - sprockets (2.12.3) - hike (~> 1.2) - multi_json (~> 1.0) - rack (~> 1.0) - tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.2.0) - actionpack (>= 3.0) - activesupport (>= 3.0) - sprockets (>= 2.8, < 4.0) - systemu (2.6.4) - therubyracer (0.12.1) - libv8 (~> 3.16.14.0) - ref - thin (1.6.2) - daemons (>= 1.0.9) - eventmachine (>= 1.0.0) - rack (>= 1.0.0) - thor (0.19.1) - thread_safe (0.3.4) - tilt (1.4.1) - ttfunk (1.2.0) - turn (0.9.6) - ansi - tzinfo (1.2.2) - thread_safe (~> 0.1) - uglifier (2.5.1) - execjs (>= 0.3.0) - json (>= 1.8.0) - uuid (2.3.7) - macaddr (~> 1.0) - warden (1.2.3) - rack (>= 1.0) - webmock (1.18.0) - addressable (>= 2.3.6) - crack (>= 0.3.2) - -PLATFORMS - ruby - -DEPENDENCIES - aasm - bson - cache_digests - cancan (~> 1.6.7) - cane - carrierwave - carrierwave-mongoid - delayed_job_mongoid - devise (~> 3.2) - health-data-standards (= 3.5.3) - highline - jquery-rails - jquery-ui-rails - mocha - mongoid-grid_fs (~> 2.1.0) - mongoid_rails_migrations (~> 1.0) - pdf-reader (= 0.9.0) - prawn - pry - pry-nav - quality-measure-engine (= 3.1.2) - rails (~> 4.1.8) - rails-perftest - rake - ruby-graphviz - ruby-prof - sass - simple_form - simplecov - therubyracer - therubyrhino - thin - turn - uglifier - webmock diff --git a/data/upload/test_executions/55afdae8323937007400011b/qrda_cat3__16_.xml b/data/upload/test_executions/55afdae8323937007400011b/qrda_cat3__16_.xml new file mode 100644 index 000000000..58287b4de --- /dev/null +++ b/data/upload/test_executions/55afdae8323937007400011b/qrda_cat3__16_.xml @@ -0,0 +1,2087 @@ + + + + + + + + + + + + + + + + + + + + QRDA Calculated Summary Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + Reporting Parameters + + + Reporting period: December 31st, 2012 00:00 - December 31st, 2013 00:00 + + + + + + + + + + + + + + + + + +
+
+ + +
+ + + + + + + Measure Section + + + + + + + + + + + + + + + + + + + + Weight Assessment and Counseling for Nutrition and Physical Activity for Children and Adolescents + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
diff --git a/data/upload/test_executions/55afdb203239370074000121/qrda_cat3__16_.xml b/data/upload/test_executions/55afdb203239370074000121/qrda_cat3__16_.xml new file mode 100644 index 000000000..58287b4de --- /dev/null +++ b/data/upload/test_executions/55afdb203239370074000121/qrda_cat3__16_.xml @@ -0,0 +1,2087 @@ + + + + + + + + + + + + + + + + + + + + QRDA Calculated Summary Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + Reporting Parameters + + + Reporting period: December 31st, 2012 00:00 - December 31st, 2013 00:00 + + + + + + + + + + + + + + + + + +
+
+ + +
+ + + + + + + Measure Section + + + + + + + + + + + + + + + + + + + + Weight Assessment and Counseling for Nutrition and Physical Activity for Children and Adolescents + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
diff --git a/db/migrate/20130220151835_update_bundle_data_model.rb b/db/migrate/20130220151835_update_bundle_data_model.rb deleted file mode 100644 index 49efa9d8a..000000000 --- a/db/migrate/20130220151835_update_bundle_data_model.rb +++ /dev/null @@ -1,64 +0,0 @@ -class UpdateBundleDataModel < Mongoid::Migration - def self.up - bundles = Bundle.where({version: "2.0.0"}) - if bundles.count > 1 - raise "Cannot contiue - Multiple versions of Bundle 2.0.0 are installed. This migration can only continue if there are 0 or 1 bundles of version 2.0.0 installed" - elsif bundles.count == 0 - else - bundle = bundles.first - bundle[:active] = true - bundle.save - bundle_id = bundle.id - - Measure.where({:bundle_id=>nil}).each do |m| - if m["bundle"] - m["bundle_id"] = m["bundle"] - m.remove_attribute("bundle") - m.save - end - end - puts "Updated Measures" - - Record.where({:test_id=>nil, :bundle_id=>nil}).each do |m| - if m["bundle"] - m["bundle_id"] = m["bundle"] - m.remove_attribute("bundle") - m.save - end - end - - puts "Updated Records" - Result.where({:test_id=> nil, :bundle_id=>nil}).update_all({"bundle_id" => bundle_id}) - # Result.where({:test_id=> nil, :bundle_id=>nil}).to_a.each do |m| - # m["bundle_id"] = bundle_id - # m.save - # end - - puts "Updated Patient cache" - ProductTest.where({}).update_all({"bundle_id" => bundle_id}) - - puts "updated product tests" - HealthDataStandards::SVS::ValueSet.where({:bundle_id => nil}).update_all({"bundle_id" => bundle_id}) - - puts "updated valuesets" - start_date = 1.year.ago(Time.at(bundle.effective_date)).to_i - bundle[:measure_period_start] = start_date - bundle.save - end - - puts "Indexing database" - ::Rails.application.eager_load! - - Mongoid.models.each do |model| - next if model.index_options.empty? - unless model.embedded? - model.create_indexes - end - end - puts "Finished" - end - # there is no going back from this - def self.down - - end -end \ No newline at end of file diff --git a/db/migrate/20130311182518_move_files_to_filesystem.rb b/db/migrate/20130311182518_move_files_to_filesystem.rb deleted file mode 100644 index b88f0a6cf..000000000 --- a/db/migrate/20130311182518_move_files_to_filesystem.rb +++ /dev/null @@ -1,31 +0,0 @@ -class MoveFilesToFilesystem < Mongoid::Migration - - def self.up - TestExecution.where({}).each do |te| - if te.files && !te.files.empty? - - file = te.files[0] - root = "tmp/migration/#{te.id}" - FileUtils.mkdir_p(root) - tmp = File.open("#{root}/results.xml", "w") do |f| - f.puts file.data.force_encoding("UTF-8") - end - - artifact = Artifact.new(file: File.new("#{root}/results.xml"), test_execution: te) - artifact.save - - te.execution_errors.each do |ee| - ee[:file_name] = "results.xml" - ee.save - end - - puts "File for test execution #{te.id} moved to #{artifact.file.path}" - end - end - end - - - def self.down - end - -end \ No newline at end of file diff --git a/db/seeds.rb b/db/seeds.rb deleted file mode 100644 index 664d8c74c..000000000 --- a/db/seeds.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). -# -# Examples: -# -# cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) -# Mayor.create(:name => 'Daley', :city => cities.first) diff --git a/test/fixtures/bundles/installed.json b/test/fixtures/bundles/installed.json deleted file mode 100644 index a2889f391..000000000 --- a/test/fixtures/bundles/installed.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "_id" : "4fdb62e01d41c820f6000001", - "name" : "Meaningful Use Stage 1 Clinical Quality Measures", - "version" : "1.4.2", - "license" : "

Performance measures and related data specifications (the \"Measures\") are copyrighted by\nthe noted quality measure providers as indicated in the applicable Measure. Coding\nvocabularies are owned by their copyright owners. By using the Measures, a user\n(\"User\") agrees to these Terms of Use. Measures are not clinical guidelines and do not\nestablish a standard of medical care and quality measure providers are not responsible\nfor any use of or reliance on the Measures.

\n\n

THE MEASURES AND SPECIFICATIONS ARE PROVIDED \"AS IS\" WITHOUT ANY WARRANTY OF\nANY KIND, AND ANY AND ALL IMPLIED WARRANTIES ARE HEREBY DISCLAIMED, INCLUDING ANY\nWARRANTY OF NON-INFRINGEMENT, ACCURACY, MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. NO QUALITY MEASURE PROVIDER, NOR ANY OF THEIR TRUSTEES, DIRECTORS, MEMBERS,\nAFFILIATES, OFFICERS, EMPLOYEES, SUCCESSORS AND/OR ASSIGNS WILL BE LIABLE TO YOU FOR\nANY DIRECT, INDIRECT, SPECIAL, EXEMPLARY, INCIDENTAL, PUNITIVE, AND/OR CONSEQUENTIAL\nDAMAGE OF ANY KIND, IN CONTRACT, TORT OR OTHERWISE, IN CONNECTION WITH THE USE OF THE\nPOPHEALTH TOOL OR THE MEASURES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE.\n

\n\n

The Measures are licensed to a User for the limited purpose of using, reproducing and\ndistributing the Measures with the popHealth Tool as delivered to User, without any\nmodification, for commercial and noncommercial uses, but such uses are only permitted\nif the copies of the Measures contain this complete Copyright, Disclaimer and Terms\nof Use. Users of the Measures may not alter, enhance, or otherwise modify the Measures.

\n\n

NOT A CONTRIBUTION - The Measures, including specifications and coding,\nas used in the popHealth Tool, are not a contribution under the Apache license. Coding\nin the Measures is provided for convenience only and necessary licenses for use should\nbe obtained from the copyright owners. Current Procedural Terminology \n(CPT®) © 2004-2010 American Medical Association. \nLOINC® © 2004 Regenstrief Institute,\nInc. SNOMED Clinical Terms® \n(SNOMED CT®) © 2004-2010 International Health\nTerminology Standards Development Organization.

", - "extensions" : [ - "map_reduce_utils", - "underscore_min", - "childhood_immunization", - "chlamydia_common", - "asthma_common", - "aod_treatment", - "weight_management_utils", - "misc_utils", - "diabetes_utils", - "cardiac_utils" - ], - "smoking_gun_capable" : true, - "active" : true, - "effective_date" : 1293840000, - "measure_period_start" : 1293840000, - "measures" : [ - ] -} diff --git a/test/fixtures/bundles/installed_mpl.json b/test/fixtures/bundles/installed_mpl.json deleted file mode 100644 index 8b89f729e..000000000 --- a/test/fixtures/bundles/installed_mpl.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "_id" : "4ffb43a61d41c803df000001", - "name" : "Meaningful Use Stage 1 Test Deck", - "version" : "1.0.3", - "effective_date" : 1293840000, - "measure_period_start": 1293840000 -} - From 5a11d6f036207c36b09bf096cd53d80d96ce7c57 Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Thu, 23 Jul 2015 00:08:38 +0000 Subject: [PATCH 2/9] added Upload Test button which submits a hard-coded product test to the db --- app/views/products/show.html.erb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 8255f5f47..91cee5715 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -6,6 +6,19 @@
+ <%= button_to "Upload Test", product_tests_path( + :product_test=> { + :product_id => "55afb6c932393704b7000002", + :name => "asdf_test", + :effective_date => "1388534399", + :description => "", + :measure_ids => ["40280381-4555-E1C1-0145-8EB06E66277A"] + }, + :bundle_id => "55afb5ad32393704ab000000", + :type => "CalculatedProductTest" + ), + { :class => "cmd" } + %> <%= link_to "Add Test", new_product_test_path(:product_id => @product), { :class => "cmd" } %> <%= link_to "Edit Product", edit_product_path, { :class => "cmd" } %>
From 3ed3cfb879ef604057a833023750a0b1cf465f42 Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Thu, 23 Jul 2015 15:47:32 +0000 Subject: [PATCH 3/9] first draft of code to upload a zip file: dialog shows up, zip file is uploaded, but it doesn't yet submit to the right route --- app/views/products/show.html.erb | 67 +++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 91cee5715..5fa5c3df3 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,5 +1,45 @@ <%= javascript 'products' %> + + +
<%= render :partial=>"shared/header" %> @@ -17,7 +57,7 @@ :bundle_id => "55afb5ad32393704ab000000", :type => "CalculatedProductTest" ), - { :class => "cmd" } + { :class => "cmd", :id => "upload_test_button_asdf" } %> <%= link_to "Add Test", new_product_test_path(:product_id => @product), { :class => "cmd" } %> <%= link_to "Edit Product", edit_product_path, { :class => "cmd" } %> @@ -123,4 +163,29 @@ <%= render :partial => "shared/legend" %>
+ +
+ <%-# ROGTODO: change ProductTest.new to ProductTest.upload ? -%> + <%= form_for(ProductTest.new, :html => {:method => :post, :multipart => true}) do |f| %> + + + + + + + + + + + + + + + +
 
+ <% end %> +
From 21dd882bdf1cd1c634695eab414486c5a7c56377 Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Sun, 26 Jul 2015 21:22:22 +0000 Subject: [PATCH 4/9] added support for uploading patients (although measures are not yet calculated correctly for the new patients) --- Gemfile | 7 +-- app/models/calculated_product_test.rb | 72 +++++++++++++++++++++------ app/views/products/show.html.erb | 31 +++--------- 3 files changed, 67 insertions(+), 43 deletions(-) diff --git a/Gemfile b/Gemfile index a77ade1a8..e18069fa8 100644 --- a/Gemfile +++ b/Gemfile @@ -5,14 +5,15 @@ gem 'rails', '~> 4.1.8' gem 'jquery-rails' gem 'jquery-ui-rails' gem 'rake' - +gem 'zip' # gem 'quality-measure-engine', :git => 'https://github.com/pophealth/quality-measure-engine.git', :branch => 'master' # gem 'quality-measure-engine', :path => '../quality-measure-engine' gem 'quality-measure-engine', '3.1.2' -gem 'health-data-standards', "3.5.3" +#gem 'health-data-standards', "3.5.3" +#gem 'health-data-standards',:git => 'https://github.com/ESRogs/health-data-standards.git', :branch => 'master' # gem 'health-data-standards',:git => 'https://github.com/projectcypress/health-data-standards.git', :branch => 'master' @@ -20,7 +21,7 @@ gem 'health-data-standards', "3.5.3" #gem 'quality-measure-engine', '~> 2.5.0' # gem 'health-data-standards',:git => 'https://github.com/ssayer/health-data-standards.git', :branch => 'qrda_errata' -# gem 'health-data-standards', :path => '../health-data-standards' +gem 'health-data-standards', :path => '../health-data-standards' # gem 'health-data-standards', '~> 3.5.2' diff --git a/app/models/calculated_product_test.rb b/app/models/calculated_product_test.rb index 9f56773c8..42b7d4e1e 100644 --- a/app/models/calculated_product_test.rb +++ b/app/models/calculated_product_test.rb @@ -1,4 +1,4 @@ - +require 'zip/zip' class CalculatedProductTest < ProductTest aasm :column => :state do @@ -20,6 +20,31 @@ class CalculatedProductTest < ProductTest #after the test is created generate the population after_create :gen_pop + def initialize(args = nil) + if args != nil + if args.has_key?("test_zip") + test_zip = args["test_zip"] + @uploaded_patient_xml_strings = get_file_contents_from_zip(test_zip) + # ROGTODO: can the patient strings be passed as part of agrs to super? + # ROGTODO: don't hard-code the measure_ids + return super({"name"=>"uploaded_test", "product_id"=>args["product_id"], "effective_date"=>"1388534399", "measure_ids"=>["40280381-4555-E1C1-0145-8EB06E66277A"]}) + end + end + super(args) + end + + def get_file_contents_from_zip(test_zip) + data = test_zip.open.read + content_strings = [] + Zip::ZipFile.open(test_zip.path()) do |zipfile| + zipfile.each do |entry| + cs = entry.get_input_stream.read + content_strings.push(cs) + end + end + content_strings + end + def gen_pop self.generate_population end @@ -31,25 +56,40 @@ def calculate_expected_results end def generate_records - min_set = PatientPopulation.min_coverage(self.measure_ids, self.bundle) - p_ids = min_set[:minimal_set] - overflow = min_set[:overflow] - all = p_ids + overflow - randomization_ids = all - while p_ids.length < 5 && overflow.length != 0 + if @uploaded_patient_xml_strings != nil + @uploaded_patient_xml_strings.each do |ps| + pr = HealthDataStandards::Import::BulkRecordImporter.import_and_return_unsaved_record(ps) + pr["test_id"] = self.id + pr.save + end + # ROGTODO: need to do the medical_record_assigner part? + else + min_set = PatientPopulation.min_coverage(self.measure_ids, self.bundle) + p_ids = min_set[:minimal_set] + print "minimal ids:\n" + print p_ids.length.to_s() + "\n" + p_ids.each { |pid| print pid + "\n" } + print "\n" + overflow = min_set[:overflow] + print "overflow length: " + overflow.length.to_s() + "\n" + all = p_ids + overflow + randomization_ids = all + while p_ids.length < 5 && overflow.length != 0 p_ids << overflow.sample - end - #randomly pick a number of other patients to give to the vendor + end + #randomly pick a number of other patients to give to the vendor - # do this synchronously because it does not take long - # p_ids = Record.where(:test_id=>nil, :type=>"ep").collect{|p| p.medical_record_number} - pcj = Cypress::PopulationCloneJob.new({'patient_ids' =>p_ids, 'test_id' => self.id, "randomize_names"=> true, "randomization_ids" => randomization_ids}) - pcj.perform + # do this synchronously because it does not take long + # p_ids = Record.where(:test_id=>nil, :type=>"ep").collect{|p| p.medical_record_number} + pcj = Cypress::PopulationCloneJob.new({'patient_ids' =>p_ids, 'test_id' => self.id, "randomize_names"=> true, "randomization_ids" => randomization_ids}) + pcj.perform - self.records.each do |r| - r.medical_record_assigner = "Cypress" if r.medical_record_assigner.nil? - r.save! + self.records.each do |r| + r.medical_record_assigner = "Cypress" if r.medical_record_assigner.nil? + r.save! + end end + #now calculate the expected results self.calculate end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 5fa5c3df3..b269cdaf1 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -16,7 +16,6 @@ $(document).ready(function() { resizable: false, buttons: { Upload: function() { - alert("You uploaded something!") var ext = $("#product_test_test_zip").val().split('.').pop().toLowerCase(); if( $.inArray(ext, ['zip']) != -1){ $('#new_product_test').submit(); @@ -31,7 +30,7 @@ $(document).ready(function() { } }); - $('#upload_test_button_asdf').click(function(event) { + $('#upload_test_button').click(function(event) { $('#upload_test').dialog('open'); event.preventDefault(); }); @@ -46,18 +45,7 @@ $(document).ready(function() {
- <%= button_to "Upload Test", product_tests_path( - :product_test=> { - :product_id => "55afb6c932393704b7000002", - :name => "asdf_test", - :effective_date => "1388534399", - :description => "", - :measure_ids => ["40280381-4555-E1C1-0145-8EB06E66277A"] - }, - :bundle_id => "55afb5ad32393704ab000000", - :type => "CalculatedProductTest" - ), - { :class => "cmd", :id => "upload_test_button_asdf" } + <%= link_to "Upload Test", "", { :class => "cmd", :id => "upload_test_button" } %> <%= link_to "Add Test", new_product_test_path(:product_id => @product), { :class => "cmd" } %> <%= link_to "Edit Product", edit_product_path, { :class => "cmd" } %> @@ -165,8 +153,7 @@ $(document).ready(function() {
- <%-# ROGTODO: change ProductTest.new to ProductTest.upload ? -%> - <%= form_for(ProductTest.new, :html => {:method => :post, :multipart => true}) do |f| %> + <%= form_for(CalculatedProductTest.new, :html => {:method => :post, :multipart => true}) do |f| %> @@ -175,14 +162,10 @@ $(document).ready(function() { - - - - - - -
<%= f.label '', "Test File", :for => :tests_zip %>   <%= f.file_field :test_zip, accept: "application/zip" %>
 
From af1f0146d932a03263bf82a31d2029e978dfc67b Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Mon, 27 Jul 2015 15:44:19 +0000 Subject: [PATCH 5/9] parsing measure ids from uploaded patients and adding them to the product test --- app/models/calculated_product_test.rb | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/app/models/calculated_product_test.rb b/app/models/calculated_product_test.rb index 42b7d4e1e..8d5d76409 100644 --- a/app/models/calculated_product_test.rb +++ b/app/models/calculated_product_test.rb @@ -25,9 +25,14 @@ def initialize(args = nil) if args.has_key?("test_zip") test_zip = args["test_zip"] @uploaded_patient_xml_strings = get_file_contents_from_zip(test_zip) - # ROGTODO: can the patient strings be passed as part of agrs to super? - # ROGTODO: don't hard-code the measure_ids - return super({"name"=>"uploaded_test", "product_id"=>args["product_id"], "effective_date"=>"1388534399", "measure_ids"=>["40280381-4555-E1C1-0145-8EB06E66277A"]}) + # ROGTODO: should the patient strings be passed as part of agrs to super? + measure_ids = get_measure_ids_from_patient_xml_string(@uploaded_patient_xml_strings[0]) + @uploaded_patient_xml_strings.each do |ps| + patient_measure_ids = get_measure_ids_from_patient_xml_string(ps) + patient_measure_ids.each { |pmi| raise "Patients have different measure ids!" unless measure_ids.include?(pmi) } + end + # ROGTODO: don't hardcode name or effective_date + return super({"name"=>"uploaded_test", "product_id"=>args["product_id"], "effective_date"=>"1388534399", "measure_ids"=>measure_ids}) end end super(args) @@ -45,6 +50,16 @@ def get_file_contents_from_zip(test_zip) content_strings end + def get_measure_ids_from_patient_xml_string(patient_xml_string) + doc = Nokogiri::XML(patient_xml_string) + # ROGTODO: handle other formats? + doc.root.add_namespace_definition('cda', 'urn:hl7-org:v3') + nodes = doc.xpath("/cda:ClinicalDocument/cda:component/cda:structuredBody/cda:component/cda:section/cda:entry/cda:organizer/cda:templateId[@root='2.16.840.1.113883.10.20.24.3.97']") + measure_ids = [] + nodes.each { |node| measure_ids << node.next_element["extension"] } + measure_ids + end + def gen_pop self.generate_population end From 09e1e1a36e13c3729a969c2417345a585f3751b6 Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Mon, 27 Jul 2015 17:24:53 +0000 Subject: [PATCH 6/9] allow uploaded test to be named --- app/models/calculated_product_test.rb | 4 ++-- app/views/products/show.html.erb | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/calculated_product_test.rb b/app/models/calculated_product_test.rb index 8d5d76409..5ae90efe6 100644 --- a/app/models/calculated_product_test.rb +++ b/app/models/calculated_product_test.rb @@ -31,8 +31,8 @@ def initialize(args = nil) patient_measure_ids = get_measure_ids_from_patient_xml_string(ps) patient_measure_ids.each { |pmi| raise "Patients have different measure ids!" unless measure_ids.include?(pmi) } end - # ROGTODO: don't hardcode name or effective_date - return super({"name"=>"uploaded_test", "product_id"=>args["product_id"], "effective_date"=>"1388534399", "measure_ids"=>measure_ids}) + # ROGTODO: don't hardcode effective_date + return super({"name"=>args["name"], "product_id"=>args["product_id"], "effective_date"=>"1388534399", "measure_ids"=>measure_ids}) end end super(args) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index b269cdaf1..5a4c0e7f3 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -158,15 +158,15 @@ $(document).ready(function() { - 1. - <%= f.label '', "Test File", :for => :tests_zip %> -   <%= f.file_field :test_zip, accept: "application/zip" %> /> <%= hidden_field_tag(:type, "CalculatedProductTest") %> <%-# ROGTODO: don't hard-code bundle id -%> <%= hidden_field_tag(:bundle_id, "55afb5ad32393704ab000000") %> + + Give the test a name: + <% end %> From 088c92f41ba0a9935dc128f1c8514269aa22818c Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Tue, 28 Jul 2015 01:01:58 +0000 Subject: [PATCH 7/9] fixing spurious addition of zip gem file --- Gemfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Gemfile b/Gemfile index e18069fa8..d442ad00d 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,6 @@ gem 'rails', '~> 4.1.8' gem 'jquery-rails' gem 'jquery-ui-rails' gem 'rake' -gem 'zip' # gem 'quality-measure-engine', :git => 'https://github.com/pophealth/quality-measure-engine.git', :branch => 'master' From 70d17ed404fcbe54aabce4aeb11375ee98741f73 Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Tue, 28 Jul 2015 01:08:18 +0000 Subject: [PATCH 8/9] fixing Gemfile to use https://github.com/ESRogs/health-data-standards.git rather than local directory --- Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index d442ad00d..f5d2c0348 100644 --- a/Gemfile +++ b/Gemfile @@ -12,7 +12,7 @@ gem 'rake' gem 'quality-measure-engine', '3.1.2' #gem 'health-data-standards', "3.5.3" -#gem 'health-data-standards',:git => 'https://github.com/ESRogs/health-data-standards.git', :branch => 'master' +gem 'health-data-standards',:git => 'https://github.com/ESRogs/health-data-standards.git', :branch => 'master' # gem 'health-data-standards',:git => 'https://github.com/projectcypress/health-data-standards.git', :branch => 'master' @@ -20,7 +20,7 @@ gem 'quality-measure-engine', '3.1.2' #gem 'quality-measure-engine', '~> 2.5.0' # gem 'health-data-standards',:git => 'https://github.com/ssayer/health-data-standards.git', :branch => 'qrda_errata' -gem 'health-data-standards', :path => '../health-data-standards' +# gem 'health-data-standards', :path => '../health-data-standards' # gem 'health-data-standards', '~> 3.5.2' From e0ea54390e082e89b3d644df088d2a6db6164299 Mon Sep 17 00:00:00 2001 From: Eric Rogstad Date: Tue, 28 Jul 2015 15:46:18 +0000 Subject: [PATCH 9/9] first draft of a unit test for uploading product test zips --- .../test_with_all_eye_measures.zip | Bin 0 -> 29633 bytes test/unit/tests/calculated_product_test_test.rb | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 test/fixtures/product_tests/test_with_all_eye_measures.zip diff --git a/test/fixtures/product_tests/test_with_all_eye_measures.zip b/test/fixtures/product_tests/test_with_all_eye_measures.zip new file mode 100644 index 0000000000000000000000000000000000000000..f98ab3b153b341b0276d65d0dce08795c913e937 GIT binary patch literal 29633 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