diff options
| author | Zakaria BOUZIANE | 2014-12-08 10:35:01 +0100 |
|---|---|---|
| committer | Zakaria BOUZIANE | 2014-12-08 10:35:01 +0100 |
| commit | 51dcdcf56f98618b6b1113e003f07ccf76c27b12 (patch) | |
| tree | a294c6f0e85710e783fc96c50d91047b966f418e | |
| parent | ea4ce777eb198c374951bc23a2950d3cf3babbdc (diff) | |
| download | chouette-core-51dcdcf56f98618b6b1113e003f07ccf76c27b12.tar.bz2 | |
Compliance check report in ZIP file
| -rw-r--r-- | app/controllers/compliance_check_results_controller.rb | 10 | ||||
| -rw-r--r-- | app/controllers/compliance_check_tasks_controller.rb | 7 | ||||
| -rw-r--r-- | app/models/compliance_check_task.rb | 26 | ||||
| -rw-r--r-- | app/models/compliance_check_task_export.rb | 51 | ||||
| -rw-r--r-- | app/views/compliance_check_results/index.csv.erb | 3 | ||||
| -rw-r--r-- | app/views/compliance_check_tasks/detailed_errors_index.csv.erb | 2 | ||||
| -rw-r--r-- | app/views/compliance_check_tasks/show.html.erb | 2 | ||||
| -rw-r--r-- | app/views/compliance_check_tasks/summary_errors_index.csv.erb | 3 | ||||
| -rw-r--r-- | config/locales/compliance_check_results.yml | 26 | ||||
| -rw-r--r-- | config/routes.rb | 3 |
10 files changed, 78 insertions, 55 deletions
diff --git a/app/controllers/compliance_check_results_controller.rb b/app/controllers/compliance_check_results_controller.rb index 85ba23e38..45136938a 100644 --- a/app/controllers/compliance_check_results_controller.rb +++ b/app/controllers/compliance_check_results_controller.rb @@ -2,24 +2,24 @@ class ComplianceCheckResultsController < ChouetteController respond_to :json respond_to :js, :only => :index - respond_to :csv, :only => :index + #respond_to :csv, :only => :index belongs_to :compliance_check_task def index index! do |format| format.html { render :layout => false } - format.csv { send_file collection[0].compliance_check_task.file, :type => "text/html; charset=utf-8" } + #format.csv { send_file collection[0].compliance_check_task.file, :type => "text/html; charset=utf-8" } end end - + def collection wheres = [:status, :severity].map{|key| params.has_key?(key) ? {key => params[key]} : {} }\ .inject({}){|hash, injected| hash.merge!(injected)} @compliance_check_results ||= end_of_association_chain.where(wheres).order(:rule_code) end - + def rule_parameter_set @rule_parameter_set = RuleParameterSet.new.tap { |rps| rps.parameters = resource.parameter_set } end - + end diff --git a/app/controllers/compliance_check_tasks_controller.rb b/app/controllers/compliance_check_tasks_controller.rb index d28ca34ae..9964407ce 100644 --- a/app/controllers/compliance_check_tasks_controller.rb +++ b/app/controllers/compliance_check_tasks_controller.rb @@ -2,6 +2,7 @@ class ComplianceCheckTasksController < ChouetteController defaults :resource_class => ComplianceCheckTask respond_to :html, :js + respond_to :zip, :only => :export belongs_to :referential @@ -25,6 +26,12 @@ class ComplianceCheckTasksController < ChouetteController success.html { flash[:notice] = I18n.t('compliance_check_tasks.new.flash'); redirect_to referential_compliance_check_tasks_path(@referential) } end end + + def export + respond_to do |format| + format.zip { send_file ComplianceCheckTaskExport.new(compliance_check_task).export, :type => :zip } + end + end protected diff --git a/app/models/compliance_check_task.rb b/app/models/compliance_check_task.rb index 9240639a5..1808a792c 100644 --- a/app/models/compliance_check_task.rb +++ b/app/models/compliance_check_task.rb @@ -1,9 +1,6 @@ -require 'tempfile' - class ComplianceCheckTask < ActiveRecord::Base - include ERB::Util - attr_accessor :rule_parameter_set_id, :template + attr_accessor :rule_parameter_set_id belongs_to :referential belongs_to :import_task @@ -13,7 +10,7 @@ class ComplianceCheckTask < ActiveRecord::Base validates_presence_of :user_name validates_inclusion_of :status, :in => %w{ pending processing completed failed } - has_many :compliance_check_results, :order => :status + has_many :compliance_check_results, :order => [ :severity , :status ] serialize :parameter_set, JSON @@ -104,23 +101,4 @@ class ComplianceCheckTask < ActiveRecord::Base update_attribute :status, "failed" end end - - after_destroy :destroy_file - def destroy_file - file.close if File.exists? file - file.unlink if File.exists? file - FileUtils.rm file if File.exists? file - end - - def file - @template = File.open('app/views/compliance_check_results/index.csv.erb' ){ |f| f.read } - file = Tempfile.new('compliance_check_results.csv') - file.write(render) - file.flush - return file - end - - def render() - ERB.new(@template).result(binding) - end end diff --git a/app/models/compliance_check_task_export.rb b/app/models/compliance_check_task_export.rb new file mode 100644 index 000000000..cce26c5e8 --- /dev/null +++ b/app/models/compliance_check_task_export.rb @@ -0,0 +1,51 @@ +require 'tempfile' + +class ComplianceCheckTaskExport + include ERB::Util + + require 'zip' + + attr_accessor :template, :detailed_errors_template + attr_reader :compliance_check_task + + def initialize(compliance_check_task) + @compliance_check_task = compliance_check_task + @template = File.open('app/views/compliance_check_tasks/summary_errors_index.csv.erb' ) { |f| f.read } + @detailed_errors_template = File.open('app/views/compliance_check_tasks/detailed_errors_index.csv.erb' ) { |f| f.read } + end + + def export + begin + Dir.mktmpdir("ComplianceCheckResults_#{@compliance_check_task.referential_id}_#{@compliance_check_task.id}_", Dir.tmpdir) { |temp_dir| + + File.open(temp_dir + "/summary_errors_index.csv" , "a") do |f| + f.write(render) + f.flush + end + + File.open(temp_dir + "/detailed_errors_report.csv" , "a") do |f| + f.write(detailed_errors_render) + f.flush + end + + zip_file = Tempfile.new(["ComplianceCheckResults_#{@compliance_check_task.referential_id}_#{@compliance_check_task.id}_", ".zip"]) + + ::Zip::File.open(zip_file.path, ::Zip::File::CREATE) do |zipfile| + Dir[File.join(temp_dir, '*.csv')].each do |f| + zipfile.add(File.basename(f), f) + end + end + return zip_file + } + end + end + + def render() + ERB.new(@template).result(binding) + end + + def detailed_errors_render() + ERB.new(@detailed_errors_template).result(binding) + end + +end diff --git a/app/views/compliance_check_results/index.csv.erb b/app/views/compliance_check_results/index.csv.erb deleted file mode 100644 index e042d8007..000000000 --- a/app/views/compliance_check_results/index.csv.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%= ComplianceCheckResult.human_attribute_name(:severity) %>;<%= ComplianceCheckResult.human_attribute_name(:status) %>;<%= ComplianceCheckResult.human_attribute_name(:rule_code) %>;<%= ComplianceCheckResult.human_attribute_name(:detail) %>;<%= ComplianceCheckResult.human_attribute_name(:url) %>;<%= ComplianceCheckResult.human_attribute_name(:violation_count) %>;<%= ComplianceCheckResult.human_attribute_name(:one) %>;<%= ComplianceCheckResult.human_attribute_name(:two) %>;<%= ComplianceCheckResult.human_attribute_name(:three) %>;<%= ComplianceCheckResult.human_attribute_name(:four) %>;<%= ComplianceCheckResult.human_attribute_name(:five) %>;<%= ComplianceCheckResult.human_attribute_name(:six) %>;<%= ComplianceCheckResult.human_attribute_name(:seven) %>;<%= ComplianceCheckResult.human_attribute_name(:eight) %>;<%= ComplianceCheckResult.human_attribute_name(:nine) %>;<%= ComplianceCheckResult.human_attribute_name(:ten) %> -<% compliance_check_results.each do |r| %><%= r.severity %>;<%= r.status %>;<%= r.rule_code %>;<%= ComplianceCheckResult.human_attribute_name(r.rule_code) %>;<%= Rails.application.config.validation_spec + I18n.locale.to_s + "/" + r.rule_code + ".html" %>;<%= r.violation_count %><% if r.violation_count > 0 %><% for i in 0..10 %><% if (i < r.violation_count) %>;<%= r.detail["detail"][i]["location"]["url"] %><% else %><% break %><% end %><% end %><% end %> -<% end %>
\ No newline at end of file diff --git a/app/views/compliance_check_tasks/detailed_errors_index.csv.erb b/app/views/compliance_check_tasks/detailed_errors_index.csv.erb new file mode 100644 index 000000000..527e35532 --- /dev/null +++ b/app/views/compliance_check_tasks/detailed_errors_index.csv.erb @@ -0,0 +1,2 @@ +<%= ComplianceCheckResult.human_attribute_name(:severity) %>;<%= ComplianceCheckResult.human_attribute_name(:status) %>;<%= ComplianceCheckResult.human_attribute_name(:rule_code) %>;<%= ComplianceCheckResult.human_attribute_name(:detail) %>;<%= ComplianceCheckResult.human_attribute_name(:url) %>;<%= ComplianceCheckResult.human_attribute_name(:violation_count) %>;<%= ComplianceCheckResult.human_attribute_name(:first_violations) %> +<% @compliance_check_task.compliance_check_results.each do |r| %><% if r.detail.present? %><% r.detail["detail"].first(10).each do |error| %><% case r.severity %><% when "warning" %><%= I18n.t "compliance_check_result.severities.warning" %><% when "error" %><%= I18n.t "compliance_check_result.severities.error" %><% end %>;<%= r.status %>;<%= r.rule_code %>;<%= ComplianceCheckResult.human_attribute_name(r.rule_code) %>;<%= Rails.application.config.validation_spec + I18n.locale.to_s + "/" + r.rule_code + ".html" %>;<%= r.violation_count %>;<% if error["messageArgs"] %><%= ComplianceCheckResult.human_attribute_name(r.rule_code) + I18n.t("compliance_check_result.details." + error["messageKey"], error["messageArgs"].symbolize_keys ) %><% else %><%= ComplianceCheckResult.human_attribute_name(r.rule_code) + I18n.t("compliance_check_result.details." + error["messageKey"] ) %><% end %><%= "\n" %><% end %><% end %><% end %>
\ No newline at end of file diff --git a/app/views/compliance_check_tasks/show.html.erb b/app/views/compliance_check_tasks/show.html.erb index 5bb270ffb..2fa39ff6f 100644 --- a/app/views/compliance_check_tasks/show.html.erb +++ b/app/views/compliance_check_tasks/show.html.erb @@ -31,7 +31,7 @@ </div> <% content_for :sidebar do %> <ul class="actions"> - <li><%= link_to t('compliance_check_tasks.actions.download'), referential_compliance_check_task_compliance_check_results_path(@referential, @compliance_check_task)+".csv" %></il> + <li><%= link_to t('compliance_check_tasks.actions.download'), export_referential_compliance_check_task_path(@referential, @compliance_check_task) %></il> <li><%= link_to t('compliance_check_tasks.actions.destroy'), referential_compliance_check_task_path(@referential, @compliance_check_task), :method => :delete, :data => {:confirm => t('compliance_check_tasks.actions.destroy_confirm')}, :class => "remove" %></li> </ul> diff --git a/app/views/compliance_check_tasks/summary_errors_index.csv.erb b/app/views/compliance_check_tasks/summary_errors_index.csv.erb new file mode 100644 index 000000000..516cb1b93 --- /dev/null +++ b/app/views/compliance_check_tasks/summary_errors_index.csv.erb @@ -0,0 +1,3 @@ +<%= ComplianceCheckResult.human_attribute_name(:severity) %>;<%= ComplianceCheckResult.human_attribute_name(:status) %>;<%= ComplianceCheckResult.human_attribute_name(:rule_code) %>;<%= ComplianceCheckResult.human_attribute_name(:detail) %>;<%= ComplianceCheckResult.human_attribute_name(:url) %>;<%= ComplianceCheckResult.human_attribute_name(:violation_count) %> +<% @compliance_check_task.compliance_check_results.each do |r| %><% case r.severity %><% when "warning" %><%= I18n.t "compliance_check_result.severities.warning" %><% when "error" %><%= I18n.t "compliance_check_result.severities.error" %><% end %>;<%= r.status %>;<%= r.rule_code %>;<%= ComplianceCheckResult.human_attribute_name(r.rule_code) %>;<%= Rails.application.config.validation_spec + I18n.locale.to_s + "/" + r.rule_code + ".html" %>;<%= r.violation_count %> +<% end %>
\ No newline at end of file diff --git a/config/locales/compliance_check_results.yml b/config/locales/compliance_check_results.yml index 808db4efa..5308b5ac4 100644 --- a/config/locales/compliance_check_results.yml +++ b/config/locales/compliance_check_results.yml @@ -260,19 +260,10 @@ en: rule_target: "Object" rule_number: "Step" rule_code: "Code" - violation_count: "Violation(s)" + violation_count: "Number of violations" detail: "Detail" url: "URL" - one: "Violation n° 1" - two: "Violation n° 2" - three: "Violation n° 3" - four: "Violation n° 4" - five: "Violation n° 5" - six: "Violation n° 6" - seven: "Violation n° 7" - eight: "Violation n° 8" - nine: "Violation n° 9" - ten: "Violation n° 10" + first_violations: "First violations" fr: compliance_check_results: index: @@ -533,17 +524,8 @@ fr: rule_target: "Objet" rule_number: "Etape" rule_code: "Code" - violation_count: "Violation(s)" + violation_count: "Nombre de violations" detail: "Détail" url: "URL" - one: "Violation n° 1" - two: "Violation n° 2" - three: "Violation n° 3" - four: "Violation n° 4" - five: "Violation n° 5" - six: "Violation n° 6" - seven: "Violation n° 7" - eight: "Violation n° 8" - nine: "Violation n° 9" - ten: "Violation n° 10" + first_violations: "Premières violations" diff --git a/config/routes.rb b/config/routes.rb index f629a963f..057a9bb90 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -134,6 +134,9 @@ ChouetteIhm::Application.routes.draw do end resources :compliance_check_tasks do member do + get 'export', defaults: { format: 'zip' } + end + member do get 'rule_parameter_set' end collection do |
