diff options
31 files changed, 1143 insertions, 42 deletions
diff --git a/app/assets/images/severity-error.png b/app/assets/images/severity-error.png Binary files differindex 516a4d61a..8dd9d2968 100644 --- a/app/assets/images/severity-error.png +++ b/app/assets/images/severity-error.png diff --git a/app/assets/images/severity-warning.png b/app/assets/images/severity-warning.png Binary files differindex 661327276..42da3a6f6 100644 --- a/app/assets/images/severity-warning.png +++ b/app/assets/images/severity-warning.png diff --git a/app/assets/stylesheets/file_validations.css.scss b/app/assets/stylesheets/file_validations.css.scss new file mode 100644 index 000000000..c2723a4f6 --- /dev/null +++ b/app/assets/stylesheets/file_validations.css.scss @@ -0,0 +1,136 @@ +@import "common"; + +#workspace.file_validations.index +{ + .file_validation:after { + @include after_div_for_object; + } + + .file_validations { + margin-top: 20px; + } + + .file_validations:after { + @include content_to_clear; + } + + .file_validation { + @include div_for_object; + + /* to create multi-column index */ + width: 300px; + float: left; + padding-right: 10px; + } +} + +#workspace.file_validations.show { + .file_validation_show { + width: 95% + } + .panelDataSection + { + font-size: 14px; + padding: 3px 0px 3px 20px; + BACKGROUND-COLOR: #FaFaFa; + margin: 10px 0px 0px 0px; + BORDER-LEFT: 1px solid #B0BCD6; + BORDER-RIGHT: 1px solid #B0BCD6; + BORDER-TOP: 1px solid #B0BCD6; + FONT-WEIGHT: bold; + } + .neptune-panel{ + font-family: Arial, Verdana, Helvetica, sans-serif; + font-size: 13px; + background-color: #FFFFFF; + margin: 0px 0px 2px 0px; + padding: 10px 10px 10px 10px; + border: 1px solid #B0BCD6; + table { + border: 0px; + td { + padding: 20px; + } + } + } + .category{ + font-weight: bold; + } + + +.ok{ + background: url(image-path('severity-ok.png')) no-repeat 98% 0%; + } + +.uncheck { + background: url(image-path('severity-uncheck.png')) no-repeat 98% 0%; + } + +.warning{ + background: url(image-path('severity-warning.png')) no-repeat 98% 0%; + } + +.error{ + background: url(image-path('severity-error.png')) no-repeat 98% 0%; + color: red; + } +.fatal{ + background: url(image-path('severity-fatal.png')) no-repeat 98% 0%; + color: red; + } + +.step { + width: 80%; + padding-left:100px; + margin-top:-15px; +} +.detail { + margin: 0 0 0 660px; + padding: 5px 0 0 0; + } +.neptune-panel-inSide +{ + background-color: #FFFFFF; + padding: 5px 5px; + margin:0 0 5px 100px; + width: 80%; + font-size: 12px; + border: 1px solid #B0BCD6; +} +} + +#workspace.file_validations.new { + padding: 0; + margin-top: -0.3em; + margin-bottom: 1em; + + + + .inputs ol { + margin-top: -0.3em; + margin-bottom: 1em; + padding: 0; + width: 100%; + } + .inputs ol li { padding : 0.3em 0; } + + .inputs ol li textarea { + width: 54%; + } + .inputs ol li label { + width: 40%; + margin-top: -0.3em; + } + + .inputs ol li.fl label { width: 40%; margin-top: -0.3em; } + .inputs ol li.fl input { width: 21%; padding: 0; } + + .inputs ol li.fl1 {float: left; width: 70% ;} + .inputs ol li.fl1 label {width: 57%; margin-top: -0.3em; } + .inputs ol li.fl1 input { width: 30%; } + + .inputs ol li.fl2 {float: left; width: 25% ;} + .inputs ol li.fl2 label {width: 10%; margin-top: -0.3em;} + .inputs ol li.fl2 input { width: 85%; } + +} diff --git a/app/assets/stylesheets/multiple_selection.scss b/app/assets/stylesheets/multiple_selection.scss index f3792d902..02f0dc513 100644 --- a/app/assets/stylesheets/multiple_selection.scss +++ b/app/assets/stylesheets/multiple_selection.scss @@ -1,7 +1,7 @@ input[type=checkbox].multiple_selection { - margin-left: 25px; + margin-left: 0px; position: absolute; - top: 50px; + top: 0px; } #multiple_selection_menu { diff --git a/app/controllers/file_validations_controller.rb b/app/controllers/file_validations_controller.rb new file mode 100644 index 000000000..0f0dcf71b --- /dev/null +++ b/app/controllers/file_validations_controller.rb @@ -0,0 +1,17 @@ +class FileValidationsController < InheritedResources::Base + respond_to :html, :xml, :json + + + def create + create! do |success, failure| + success.html { redirect_to file_validations_path } + end + end + + protected + + def collection + @file_validations ||= end_of_association_chain.paginate(:page => params[:page]) + end + +end diff --git a/app/models/file_validation.rb b/app/models/file_validation.rb new file mode 100644 index 000000000..26f2b2e90 --- /dev/null +++ b/app/models/file_validation.rb @@ -0,0 +1,211 @@ +class FileValidation < ActiveRecord::Base + validates_presence_of :resources + + validates_inclusion_of :status, :in => %w{ pending completed failed } + + attr_accessor :resources,:uncheck_count,:ok_count,:warning_count,:error_count,:fatal_count,:log_message_tree + attr_accessor :validator + + has_many :log_messages, :class_name => "FileValidationLogMessage", :order => :position, :dependent => :destroy + + serialize :options + + def self.option(name) + name = name.to_s + + define_method(name) do + self.options[name] + end + + define_method("#{name}=") do |prefix| + self.options[name] = prefix + end + end + + def options + read_attribute(:options) || write_attribute(:options, {}) + end + + option :test3_1_minimal_distance + option :test3_2_minimal_distance + option :test3_2_polygon_points + option :test3_7_minimal_distance + option :test3_7_maximal_distance + option :test3_8a_minimal_speed + option :test3_8a_maximal_speed + option :test3_8b_minimal_speed + option :test3_8b_maximal_speed + option :test3_8c_minimal_speed + option :test3_8c_maximal_speed + option :test3_8d_minimal_speed + option :test3_8d_maximal_speed + option :test3_9_minimal_speed + option :test3_9_maximal_speed + option :test3_10_minimal_distance + option :test3_15_minimal_time + option :test3_16_1_maximal_time + option :test3_16_3a_maximal_time + option :test3_16_3b_maximal_time + option :test3_21a_minimal_speed + option :test3_21a_maximal_speed + option :test3_21b_minimal_speed + option :test3_21b_maximal_speed + option :test3_21c_minimal_speed + option :test3_21c_maximal_speed + option :test3_21d_minimal_speed + option :test3_21d_maximal_speed + option :projection_reference + + def validator + @validator ||= ::Chouette::FileValidator.new("public") + end + + def with_original_filename + Dir.mktmpdir do |tmp_dir| + tmp_link = File.join(tmp_dir, resources.original_filename) + FileUtils.ln_s resources.path, tmp_link + yield tmp_link + end + end + + before_validation :define_default_attributes, :on => :create + def define_default_attributes + self.status ||= "pending" + end + + after_validation :extract_file_type, :on => :create + def extract_file_type + if !resources.original_filename.nil? + self.file_type = resources.original_filename.rpartition(".").last + self.file_name = resources.original_filename + end + end + + after_create :delayed_validate + def delayed_validate + save_resources + delay.validate + end + + @@root = "#{Rails.root}/tmp/validations" + cattr_accessor :root + + def save_resources + FileUtils.mkdir_p root + FileUtils.cp resources.path, saved_resources + end + + after_destroy :destroy_resources + def destroy_resources + FileUtils.rm saved_resources if File.exists? saved_resources + end + + def saved_resources + "#{root}/#{id}.#{file_type}" + end + + def name + "#{FileValidation.model_name.humanize} #{id}" + end + + def validation_options + { :validation_id => self.id , + :file_format => self.file_type , + :test3_1_minimal_distance => self.test3_1_minimal_distance , + :test3_2_minimal_distance => self.test3_2_minimal_distance , + :test3_2_polygon_points => self.test3_2_polygon_points , + :test3_7_minimal_distance => self.test3_7_minimal_distance , + :test3_7_maximal_distance => self.test3_7_maximal_distance , + :test3_8a_minimal_speed => self.test3_8a_minimal_speed , + :test3_8a_maximal_speed => self.test3_8a_maximal_speed , + :test3_8b_minimal_speed => self.test3_8b_minimal_speed , + :test3_8b_maximal_speed => self.test3_8b_maximal_speed , + :test3_8c_minimal_speed => self.test3_8c_minimal_speed , + :test3_8c_maximal_speed => self.test3_8c_maximal_speed , + :test3_8d_minimal_speed => self.test3_8d_minimal_speed , + :test3_8d_maximal_speed => self.test3_8d_maximal_speed , + :test3_9_minimal_speed => self.test3_9_minimal_speed , + :test3_9_maximal_speed => self.test3_9_maximal_speed , + :test3_10_minimal_distance => self.test3_10_minimal_distance , + :test3_15_minimal_time => self.test3_15_minimal_time , + :test3_16_1_maximal_time => self.test3_16_1_maximal_time , + :test3_16_3a_maximal_time => self.test3_16_3a_maximal_time , + :test3_16_3b_maximal_time => self.test3_16_3b_maximal_time , + :test3_21a_minimal_speed => self.test3_21a_minimal_speed , + :test3_21a_maximal_speed => self.test3_21a_maximal_speed , + :test3_21b_minimal_speed => self.test3_21b_minimal_speed , + :test3_21b_maximal_speed => self.test3_21b_maximal_speed , + :test3_21c_minimal_speed => self.test3_21c_minimal_speed , + :test3_21c_maximal_speed => self.test3_21c_maximal_speed , + :test3_21d_minimal_speed => self.test3_21d_minimal_speed , + :test3_21d_maximal_speed => self.test3_21d_maximal_speed , + :projection_reference => self.projection_reference + } + end + + def validate + begin + # log_messages.create :key => :started + if resources + with_original_filename do |file| + # chouette-command checks the file extension (and requires .zip) :( + validator.validate file, validation_options + end + else + validator.validate saved_resources, validation_options + end + update_attribute :status, "completed" + rescue => e + Rails.logger.error "Validation #{id} failed : #{e}, #{e.backtrace}" + update_attribute :status, "failed" + end + # log_messages.create :key => status + end + + after_find :compute_tests + def compute_tests + if status == 'completed' + self.uncheck_count = 0 + self.ok_count = 0 + self.warning_count = 0 + self.error_count = 0 + self.fatal_count = 0 + self.log_message_tree = Array.new + father1=nil + father2=nil + father3=nil + log_messages.each do |message| + if message.level == 1 + self.log_message_tree << message + father1=message + elsif message.level == 2 + father1.add_child message + father2=message + elsif message.level == 3 + father2.add_child message + father3=message + if message.severity == 'uncheck' + self.uncheck_count += 1 + end + if message.severity == 'ok' + self.ok_count += 1 + end + if message.severity == 'warning' + self.warning_count += 1 + end + if message.severity == 'error' + self.error_count += 1 + end + if message.severity == 'fatal' + self.fatal_count += 1 + end + elsif message.level == 4 + father3.add_child message + end + end + end + + end + + +end diff --git a/app/models/file_validation_log_message.rb b/app/models/file_validation_log_message.rb new file mode 100644 index 000000000..4159bb7d0 --- /dev/null +++ b/app/models/file_validation_log_message.rb @@ -0,0 +1,68 @@ +class FileValidationLogMessage < ActiveRecord::Base + belongs_to :file_validation + acts_as_list :scope => :file_validation + + attr_accessor :children + + validates_presence_of :key + validates_inclusion_of :severity, :in => %w{info warning error ok uncheck fatal} + + def arguments=(arguments) + write_attribute :arguments, (arguments.to_json if arguments.present?) + end + + def arguments + @decoded_arguments ||= + begin + if (stored_arguments = raw_attributes).present? + ActiveSupport::JSON.decode stored_arguments + else + {} + end + end + end + + def raw_attributes + read_attribute(:arguments) + end + + before_validation :define_default_attributes, :on => :create + def define_default_attributes + self.severity ||= "info" + end + + def level + last_key=key.rpartition("|").last + if last_key == 'TooMuchDetails' + 4 + else + last_key.count("_") + 1 + end + end + + def full_message + last_key=key.rpartition("|").last + I18n.translate last_key, arguments.symbolize_keys.merge(:scope => "file_validation_log_messages.messages").merge(:default => :undefined).merge(:key => last_key) + end + + def label + last_key=key.rpartition("|").last + label = "" + last_key.split("_").each do |tag| + if (tag.start_with?("Test")) + label = tag.delete("Test") + else + label += "."+tag.delete("Sheet").delete("Step") + end + end + label + end + + def add_child(child) + if self.children.nil? + self.children = Array.new + end + self.children << child + end + +end diff --git a/app/views/exports/new.html.erb b/app/views/exports/new.html.erb index 16c6e9720..82409955b 100644 --- a/app/views/exports/new.html.erb +++ b/app/views/exports/new.html.erb @@ -9,11 +9,10 @@ <% end %> <% end %> - <%= form.buttons do %> - <%= form.commit_button true %> - <li><%= t('or') %></li> - <li><%= link_to t('cancel'), :back %></li> - <% end %> + <%= form.actions do %> + <%= form.action :submit, :as => :button , :label => t( 'formtastic.export' ) %> + <%= form.action :cancel, :as => :link %> + <% end %> <% end %> <%= javascript_include_tag new_referential_export_path(@referential, :format => :js) %> diff --git a/app/views/file_validations/_file_validation.erb b/app/views/file_validations/_file_validation.erb new file mode 100644 index 000000000..3e895f445 --- /dev/null +++ b/app/views/file_validations/_file_validation.erb @@ -0,0 +1,13 @@ +<%= div_for(file_validation, :class => :file_validation) do %> + <%= link_to(file_validation_path(file_validation), :class => "preview") do %> + <%= image_tag "file-validation-#{file_validation.status}.png" %> + <% end %> + <%= link_to(file_validation.name, file_validation_path(file_validation)) %> + <div class="info"> + <%= l file_validation.created_at %><br/> + <%= file_validation.file_name %> + <div class="actions"> + <%= link_to t("actions.destroy"), file_validation_path(file_validation), :method => :delete, :confirm => t('file_validations.actions.destroy_confirm'), :class => "remove" %> + </div> + </div> +<% end %> diff --git a/app/views/file_validations/index.html.erb b/app/views/file_validations/index.html.erb new file mode 100644 index 000000000..e1416fa96 --- /dev/null +++ b/app/views/file_validations/index.html.erb @@ -0,0 +1,20 @@ +<%= title_tag t('.title') %> + +<div class="pagination"> + <div class="page_info"> + <%= page_entries_info @file_validations %> + </div> + <%= will_paginate @file_validations, :container => false %> +</div> +<div class="file_validations paginated_content"> + <%= render :partial => "file_validation", :collection => @file_validations %> +</div> +<div class="pagination"> + <%= will_paginate @file_validations, :container => false %> +</div> + +<% content_for :sidebar do %> +<ul class="actions"> + <li><%= link_to t('file_validations.actions.new'), new_file_validation_path(), :class => "add" %></li> +</ul> +<% end %> diff --git a/app/views/file_validations/new.html.erb b/app/views/file_validations/new.html.erb new file mode 100644 index 000000000..d02584e52 --- /dev/null +++ b/app/views/file_validations/new.html.erb @@ -0,0 +1,45 @@ +<%= title_tag t(".title") %> + +<%= semantic_form_for [@file_validation], :as => :file_validation, :url => file_validations_path() do |form| %> + <%= form.inputs do %> + <%= form.input :resources, :as => :file %> + <%= form.input :test3_1_minimal_distance, :as => :number,:input_html => { :value => '10.0' }, :wrapper_html => { :class => 'fl' } %> + <%= form.input :test3_2_minimal_distance, :as => :number,:input_html => { :value => '10.0' }, :wrapper_html => { :class => 'fl' } %> + <%= form.input :test3_2_polygon_points , :as => :text ,:input_html => { :rows => '4', :value => '2.303466,51.399206 8.411865,49.05227 7.950439,43.34116 3.138427,41.869561 -2.376709,43.2932 -5.848389,48.705463' }%> + <%= form.input :test3_7_minimal_distance, :as => :number ,:input_html => { :value => '50.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_7_maximal_distance, :as => :number ,:input_html => { :value => '15000.0' },:wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_8a_minimal_speed, :as => :number ,:input_html => { :value => '3.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_8a_maximal_speed, :as => :number ,:input_html => { :value => '6.0' }, :wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_8b_minimal_speed, :as => :number ,:input_html => { :value => '4.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_8b_maximal_speed, :as => :number ,:input_html => { :value => '7.0' }, :wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_8c_minimal_speed, :as => :number ,:input_html => { :value => '2.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_8c_maximal_speed, :as => :number ,:input_html => { :value => '5.0' }, :wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_8d_minimal_speed, :as => :number ,:input_html => { :value => '1.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_8d_maximal_speed, :as => :number ,:input_html => { :value => '4.0' }, :wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_9_minimal_speed, :as => :number ,:input_html => { :value => '5.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_9_maximal_speed, :as => :number ,:input_html => { :value => '45.0' }, :wrapper_html => { :class => 'fl2' } %> + <% end %> + <%= form.inputs do %> + <%= form.input :test3_10_minimal_distance, :as => :number ,:input_html => { :value => '50.0' }, :wrapper_html => { :class => 'fl' } %> + <%= form.input :test3_15_minimal_time, :as => :number,:input_html => { :value => '1' }, :wrapper_html => { :class => 'fl' } %> + <%= form.input :test3_16_1_maximal_time, :as => :number,:input_html => { :value => '120' }, :wrapper_html => { :class => 'fl' } %> + <%= form.input :test3_16_3a_maximal_time, :as => :number ,:input_html => { :value => '600' }, :wrapper_html => { :class => 'fl' } %> + <%= form.input :test3_16_3b_maximal_time, :as => :number ,:input_html => { :value => '300' }, :wrapper_html => { :class => 'fl' } %> + <%= form.input :test3_21a_minimal_speed, :as => :number ,:input_html => { :value => '3.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_21a_maximal_speed, :as => :number ,:input_html => { :value => '6.0' }, :wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_21b_minimal_speed, :as => :number ,:input_html => { :value => '4.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_21b_maximal_speed, :as => :number ,:input_html => { :value => '7.0' }, :wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_21c_minimal_speed, :as => :number ,:input_html => { :value => '2.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_21c_maximal_speed, :as => :number ,:input_html => { :value => '2.0' }, :wrapper_html => { :class => 'fl2' } %> + <%= form.input :test3_21d_minimal_speed, :as => :number ,:input_html => { :value => '1.0' }, :wrapper_html => { :class => 'fl1' } %> + <%= form.input :test3_21d_maximal_speed, :as => :number ,:input_html => { :value => '4.0' }, :wrapper_html => { :class => 'fl2' } %> + <% end %> + <%= form.inputs do %> + <%= form.input :projection_reference ,:input_html => { :value => 'WGS84' }, :wrapper_html => { :class => 'fl' } %> + <% end %> + + <%= form.actions do %> + <%= form.action :submit, :as => :button , :label => t( 'formtastic.validate' ) %> + <%= form.action :cancel, :as => :link %> + <% end %> +<% end %> diff --git a/app/views/file_validations/show.html.erb b/app/views/file_validations/show.html.erb new file mode 100644 index 000000000..5a63c9c81 --- /dev/null +++ b/app/views/file_validations/show.html.erb @@ -0,0 +1,149 @@ +<%= title_tag @file_validation.name %> + +<div class="file_validation_show"> + <div class="panelDataSection"><%= t(".summary") %></div> + + <div class="neptune-panel"> + <label><%= FileValidation.human_attribute_name(:created_at) %>: </label> + <%= l @file_validation.created_at %><br/> + <label><%= FileValidation.human_attribute_name(:status) %>: </label> + <%= t @file_validation.status, :scope => "file_validations.statuses" %><br/> + <label><%= FileValidation.human_attribute_name(:file_name) %>: </label> + <%= @file_validation.file_name %><br/> + <br/> + <br/> + <% if @file_validation.status == 'completed' %> + <table> + <tbody> + <tr> + <td><%= image_tag "severity-uncheck.png" , :alt => t("uncheck", :scope => "file_validation_log_messages.severities") %> + <%= t( "file_validations.uncheck_count" , :count => @file_validation.uncheck_count )%> + </td> + <td><%= image_tag "severity-ok.png" , :alt => t("ok", :scope => "file_validation_log_messages.severities") %> + <%= t( "file_validations.ok_count" , :count => @file_validation.ok_count )%> + </td> + <td><%= image_tag "severity-warning.png" , :alt => t("warning", :scope => "file_validation_log_messages.severities") %> + <%= t( "file_validations.warning_count" , :count => @file_validation.warning_count )%> + </td> + <td><%= image_tag "severity-error.png" , :alt => t("error", :scope => "file_validation_log_messages.severities") %> + <%= t( "file_validations.error_count" , :count => @file_validation.error_count )%> + </td> + <td><%= image_tag "severity-fatal.png" , :alt => t("fatal", :scope => "file_validation_log_messages.severities") %> + <%= t( "file_validations.fatal_count" , :count => @file_validation.fatal_count )%> + </td> + </tr> + </tbody> + </table> + <% end %> + </div> +<% if @file_validation.status == 'completed' %> + <h3><%= t(".details") %></h3> + <% @file_validation.log_message_tree.each do |message1| %> + <label class="category"><%= message1.full_message %></label> + <div id="<%= message1.key %>" style="margin-left: 40px;"> + <% message1.children.each do |message2| %> + <div class="panelDataSection"><%= message2.full_message %></div> + <div id="<%= message2.severity %>" class="neptune-panel"> + <% message2.children.each do |message3| %> + <div class="<%= message3.severity %>"> + <div> + <label id=""><%= message3.label %></label> + </div> + <div id="" class="step"> + <%= message3.full_message %> + </div> + </div> + <% if !message3.children.nil? %> + <div id="" class="detail"> </div> + <div id="detail_0_4_0" class="neptune-panel-inSide"> + <ol> + <% message3.children.each do |message4| %> + <li> <%= message4.full_message %> </li> + <br> + <% end %> + </ol> + </div> + <% end %> + <% end %> + </div> + <% end %> + </div> + <% end %> + <div class="panelDataSection"><%= t(".parameters") %></div> + <div class="neptune-panel"> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_1_minimal_distance") %> :</label> + <label><%= @file_validation.test3_1_minimal_distance %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_2_minimal_distance") %> :</label> + <label><%= @file_validation.test3_2_minimal_distance %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_2_polygon_points") %> :</label> + <label><%= @file_validation.test3_2_polygon_points %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_7_minimal_distance") %> :</label> + <label><%= @file_validation.test3_7_minimal_distance %></label> / + <label><%= @file_validation.test3_7_maximal_distance %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_8a_minimal_speed") %> :</label> + <label><%= @file_validation.test3_8a_minimal_speed %></label> / + <label><%= @file_validation.test3_8a_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_8b_minimal_speed") %> :</label> + <label><%= @file_validation.test3_8b_minimal_speed %></label> / + <label><%= @file_validation.test3_8b_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_8c_minimal_speed") %> :</label> + <label><%= @file_validation.test3_8c_minimal_speed %></label> / + <label><%= @file_validation.test3_8c_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_8d_minimal_speed") %> :</label> + <label><%= @file_validation.test3_8d_minimal_speed %></label> / + <label><%= @file_validation.test3_8d_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_9_minimal_speed") %> :</label> + <label><%= @file_validation.test3_9_minimal_speed %></label> / + <label><%= @file_validation.test3_9_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_10_minimal_distance") %> :</label> + <label><%= @file_validation.test3_10_minimal_distance %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_15_minimal_time") %> :</label> + <label><%= @file_validation.test3_15_minimal_time %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_16_1_maximal_time") %> :</label> + <label><%= @file_validation.test3_16_1_maximal_time %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_16_3a_maximal_time") %> :</label> + <label><%= @file_validation.test3_16_3a_maximal_time %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_16_3b_maximal_time") %> :</label> + <label><%= @file_validation.test3_16_3b_maximal_time %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_21a_minimal_speed") %> :</label> + <label><%= @file_validation.test3_21a_minimal_speed %></label> / + <label><%= @file_validation.test3_21a_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_21b_minimal_speed") %> :</label> + <label><%= @file_validation.test3_21b_minimal_speed %></label> / + <label><%= @file_validation.test3_21b_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_21c_minimal_speed") %> :</label> + <label><%= @file_validation.test3_21c_minimal_speed %></label> / + <label><%= @file_validation.test3_21c_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.test3_21d_minimal_speed") %> :</label> + <label><%= @file_validation.test3_21d_minimal_speed %></label> / + <label><%= @file_validation.test3_21d_maximal_speed %></label> + <br> + <label class="label"><%= t("activerecord.attributes.file_validation.projection_reference") %> :</label> + <label><%= @file_validation.projection_reference %></label> + + </div> + + <% end %> +</div> +<% content_for :sidebar do %> +<ul class="actions"> + <li><%= link_to t('file_validations.actions.destroy'), file_validation_path(@file_validation), :method => :delete, :confirm => t('file_validations.actions.destroy_confirm'), :class => "remove" %></li> +</ul> +<% end %> diff --git a/app/views/help/faq.textile b/app/views/help/faq.textile new file mode 100644 index 000000000..5fb8cfa9a --- /dev/null +++ b/app/views/help/faq.textile @@ -0,0 +1,6 @@ +--- +layout: default +title: Foire aux questions +--- + +Rédaction ultérieure
\ No newline at end of file diff --git a/app/views/help/schema.textile b/app/views/help/schema.textile new file mode 100644 index 000000000..ffefaa680 --- /dev/null +++ b/app/views/help/schema.textile @@ -0,0 +1,6 @@ +--- +layout: default +title: Vue d'ensemble +--- + +Rédaction ultérieure
\ No newline at end of file diff --git a/app/views/help/toc.textile b/app/views/help/toc.textile index 1ce35cac2..2c2bd096c 100644 --- a/app/views/help/toc.textile +++ b/app/views/help/toc.textile @@ -8,6 +8,7 @@ h3. Sommaire # "Généralités":introduction ## "Normalisation":normalisation ## "Documentation":documentation +## "Vue d'ensemble":schema # "Espaces de données":dataspaces # "Réseaux":networks # "Transporteurs":companies @@ -26,4 +27,5 @@ h3. Sommaire ## Validation # Divers ## "API Rest":restapis +## "FAQ":faq diff --git a/app/views/imports/new.html.erb b/app/views/imports/new.html.erb index 1b797b0d6..206967073 100644 --- a/app/views/imports/new.html.erb +++ b/app/views/imports/new.html.erb @@ -18,10 +18,9 @@ <%= form.input :resources, :as => :file %> <% end %> - <%= form.buttons do %> - <%= form.commit_button true %> - <li><%= t('or') %></li> - <li><%= link_to t('cancel'), :back %></li> - <% end %> + <%= form.actions do %> + <%= form.action :submit, :as => :button , :label => t( 'formtastic.import' ) %> + <%= form.action :cancel, :as => :link %> + <% end %> <% end %> <% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a40159079..83e4e14fa 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -34,8 +34,8 @@ <% if help_page? %> <li><%= link_to "Aide", help_path, :class => "current" %></li> <% elsif ! selected_referential? %> - <li><%= tab_link_to Referential, referentials_path, :class => "current" %></li> - <li><%= tab_link_to FileValidation, file_validations_path, :class => "current" %></li> + <li><%= tab_link_to Referential, referentials_path, :class => ("current" if current_page?(referentials_path)) %></li> + <li><%= tab_link_to FileValidation, file_validations_path %></li> <% else %> <li><%= link_to t("layouts.tabs.dashboard"), referential_path(@referential), :class => ("current" if current_page?(referential_path(@referential))) %></li> <li><%= tab_link_to Chouette::Network, referential_networks_path(@referential) %></li> diff --git a/app/views/routes/_route.html.erb b/app/views/routes/_route.html.erb index 4ec720e5d..e99f418b1 100644 --- a/app/views/routes/_route.html.erb +++ b/app/views/routes/_route.html.erb @@ -12,7 +12,6 @@ <% end %> <%= route.human_attribute_name('wayback_code') %> <%= (route.wayback=="A") ? t('route.wayback.positive') : t('wayback.negative') %> <div class="actions"> - <%= link_to t("routes.actions.edit"), edit_referential_line_route_path(@referential, @line, route), :class => "edit" %> | <%= link_to t("vehicle_journeys.actions.index"), referential_line_route_vehicle_journeys_path(@referential, @line, route), :class => "link" %> </div> </div> diff --git a/app/views/stop_areas/add_routing_lines.html.erb b/app/views/stop_areas/add_routing_lines.html.erb index 967d502d8..e0750a758 100644 --- a/app/views/stop_areas/add_routing_lines.html.erb +++ b/app/views/stop_areas/add_routing_lines.html.erb @@ -6,11 +6,10 @@ <%= form.input :routing_line_ids, :as => :text, :input_html => { :"data-pre" => ( @lines.map { |line| { :id => line.id.to_s, :name => "#{line.number} - #{line.name}" } } ).to_json } %> <% end %> - <%= form.buttons do %> - <%= form.commit_button %> - <%= t('or') %> - <%= link_to t('cancel'), [@referential, @stop_area] %> - <% end %> + <%= form.actions do %> + <%= form.action :submit, :as => :button %> + <%= form.action :cancel, :as => :link %> + <% end %> </div> <% end %> diff --git a/app/views/stop_areas/add_routing_stops.html.erb b/app/views/stop_areas/add_routing_stops.html.erb index 49c0cad7a..5fc2326f0 100644 --- a/app/views/stop_areas/add_routing_stops.html.erb +++ b/app/views/stop_areas/add_routing_stops.html.erb @@ -6,11 +6,10 @@ <%= form.input :routing_stop_ids, :as => :text, :input_html => { :"data-pre" => ( @stops.map { |stop| { :id => stop.id.to_s, :name => "#{stop.name} #{stop.country_code}" } } ).to_json } %> <% end %> - <%= form.buttons do %> - <%= form.commit_button %> - <%= t('or') %> - <%= link_to t('cancel'), [@referential, @stop_area] %> - <% end %> + <%= form.actions do %> + <%= form.action :submit, :as => :button %> + <%= form.action :cancel, :as => :link %> + <% end %> </div> <% end %> diff --git a/app/views/time_table_dates/_form.html.erb b/app/views/time_table_dates/_form.html.erb index decc0b3cc..e3d07e128 100644 --- a/app/views/time_table_dates/_form.html.erb +++ b/app/views/time_table_dates/_form.html.erb @@ -1,6 +1,6 @@ <%= semantic_form_for [@referential, @time_table, @time_table_date] do |form| %> <%= form.inputs do %> - <%= form.input :date, :as => :date, :label => @time_table_date.human_attribute_name("date") %> + <%= form.input :date, :as => :date_picker, :label => @time_table_date.human_attribute_name("date") %> <% end %> <%= form.actions do %> diff --git a/app/views/time_table_periods/_form.html.erb b/app/views/time_table_periods/_form.html.erb index 71f8f3fd1..cd7681df6 100644 --- a/app/views/time_table_periods/_form.html.erb +++ b/app/views/time_table_periods/_form.html.erb @@ -1,7 +1,7 @@ <%= semantic_form_for [@referential, @time_table, @time_table_period] do |form| %> <%= form.inputs do %> - <%= form.input :period_start, :as => :date, :label => @time_table_period.human_attribute_name("period_start") %> - <%= form.input :period_end, :as => :date, :label => @time_table_period.human_attribute_name("period_end") %> + <%= form.input :period_start, :as => :date_picker, :label => @time_table_period.human_attribute_name("period_start") %> + <%= form.input :period_end, :as => :date_picker, :label => @time_table_period.human_attribute_name("period_end") %> <% end %> <%= form.actions do %> <%= form.action :submit, :as => :button %> diff --git a/app/views/time_tables/_form.erb b/app/views/time_tables/_form.erb index f72e081da..87f6f890a 100644 --- a/app/views/time_tables/_form.erb +++ b/app/views/time_tables/_form.erb @@ -29,7 +29,6 @@ <%= form.action :cancel, :as => :link %> <% end %> <% end %> -<h3 class="dates"><%= t('.dates') %></h3> -<%= render "dates" %> + diff --git a/config/environments/production.rb b/config/environments/production.rb index d9e41624c..19568bcb7 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -68,6 +68,7 @@ ChouetteIhm::Application.configure do Chouette::Command.command = "/usr/local/opt/chouette-command/chouette-gui-2.0.0/chouette" Import.root = "/var/lib/chouette/imports" Export.root = "/var/lib/chouette/exports" + FileValidation.root = "/var/lib/chouette/validations" end end diff --git a/config/locales/exports.yml b/config/locales/exports.yml index bf943c8af..8274ad70a 100644 --- a/config/locales/exports.yml +++ b/config/locales/exports.yml @@ -24,6 +24,7 @@ en: undefined: %{key} undefined NEPTUNE_EXPORT: Neptune Export NEPTUNE_EXPORTED_LINE: "Line %{0} (%{1}) exported" + NEPTUNE_EMPTY_LINE: "Line %{0} (%{1}) without valid vehicle journey : not exported" severities: info: Information ok: Ok @@ -71,6 +72,7 @@ fr: undefined: %{key} non défini NEPTUNE_EXPORT: Export Neptune NEPTUNE_EXPORTED_LINE: "Ligne %{0} (%{1}) exportée" + NEPTUNE_EMPTY_LINE: "Ligne %{0} (%{1}) sans course valide : non exportée" severities: info: Information ok: Ok diff --git a/config/locales/file_validations.yml b/config/locales/file_validations.yml new file mode 100644 index 000000000..0e0dc1fd2 --- /dev/null +++ b/config/locales/file_validations.yml @@ -0,0 +1,343 @@ +en: + file_validations: + edit: + title: "Edit the Validation" + show: + title: Neptune Validation + summary: Rapport de conformité à la norme NEPTUNE + new: + title: Create a new validation + submit: "Create a validation" + actions: + new: Add a validation + destroy_confirm: "Do you confirm to destroy this validation ?" + destroy: Destroy this validation + edit: Edit this validation + statuses: + pending: Pending + completed: Completed + failed: Failed + file_validation_log_messages: + messages: + undefined: %{key} undefined + severities: + uncheck: Unchecked + ok: Ok + warning: Warning + error: Error + fatal: Fatal + activerecord: + models: + file_validation: + zero: Neptune Validation + one: Neptune Validation + other: Neptune Validations + attributes: + file_validation: + resources: File to validate + status: Status + file_name: Tested data + file_validation_log_message: + created_at: Date + position: N. + full_message: Message + +fr: + file_validations: + edit: + title: "Editer la validation" + show: + title: Validation Neptune + summary: Rapport de conformité à la norme NEPTUNE + details: Détails + parameters: Paramètres des tests + new: + title: Démarrer une nouvelle validation + submit: "Lancer la validation" + actions: + new: Ajouter une validation + destroy_confirm: "Voulez-vous supprimer ce résultat de validation ?" + destroy: Supprimer cette validation + edit: Editer cette validation + statuses: + pending: En cours + completed: Achevé + failed: Echoué + uncheck_count: + zero: aucun inapplicable + one: un inapplicable + other: "%{count} inapplicables" + ok_count: + zero: aucun test réussi + one: un test réussi + other: %{count} tests réussis + warning_count: + zero: aucun warning + one: un warning + other: %{count} warnings + error_count: + zero: aucune erreur + one: une erreur + other: %{count} erreurs + fatal_count: + zero: aucune erreur fatale + one: une erreur fatale + other: %{count} erreurs fatales + file_validation_log_messages: + messages: + undefined: %{key} non défini + TooMuchDetails: ( %{0} erreurs / warnings supplémentaires ) + ONE: "Catégorie 1 : Syntaxe" + Test1_Sheet1: 'Fiche n° 1.1 : Conformité à la syntaxe XML suivant les recommandations du W3C' + Test1_Sheet1_Step1: Conformité à la syntaxe XML + Test1_Sheet1_Step2: Conformité au schéma XML du profil CHOUETTE + Test1_Sheet1_Step0_fatal: "Erreur fatale : Impossible d'ouvrir le fichier %{0}" + Test1_Sheet1_Step0_error: "Impossible d'importer cette entrée %{0} du zip" + Test1_Sheet1_Step0_warning: "Cette entrée %{0} du zip n'est pas un fichier xml et a été ignoré" + Test1_Sheet1_Step1_error: "le fichier %{0} n'est pas correctement formé selon les recommandations du W3C" + Test1_Sheet1_Step2_error: "le fichier %{0} ne respecte pas le modèle CHOUETTE" + Test1_Sheet1_Step2_fatal: "Erreur fatale : Aucune entrée valide trouvée dans le fichier" + TWO: "Catégorie 2 : Complétude, cohérence et intégrité des données" + Test2_Sheet1: "Fiche n° 2.1 : Cohérence entre le réseau et ses composants" + Test2_Sheet1_fatal: "La ligne %{0} n'a pas de réseau" + Test2_Sheet1_Step1: "Correcte réference à des LIGNEs/Chouette(<Line>)" + Test2_Sheet1_Step1_error: "La ligne %{1} n'est pas dans la liste des identifiants de ligne de %{0}" + Test2_Sheet1_Step2: "Correcte référence à la VERSION DU RÉSEAU(< PTNetwork >) dans LIGNEs/Chouette (< Line >)" + Test2_Sheet1_Step2a_error: "Le réseau %{0} n'est pas celui lié à la ligne %{1} dont le raccourci est %{2}." + Test2_Sheet1_Step2b_error: "Le raccourci du réseau %{0} dans la ligne %{1} ne correspond à aucun réseau de la ligne" + Test2_Sheet2: "Fiche n° 2.2 : Cohérence entre le regroupement de lignes et ses composants" + Test2_Sheet2_Step1: "Correcte référence à des LIGNEs/Chouette ( < Line >) dans GROUPE DE LIGNES ( < GroupOfLine >)" + Test2_Sheet2_Step1_error: "la valeur de l'élément < lineId > : %{0} de la classe d'objets < GroupOfLine > n'a pas été repérée dans l'élément < objectId > de la classe d'objets < Line >" + Test2_Sheet3: "Fiche n° 2.3 : Cohérence entre les arrêts et leurs composants" + Test2_Sheet3_Step1: "Correcte référence à des ARRÊTs/Chouette ( < StopArea >) et/ou à des POINTs D''ARRÊT SUR PARCOURS ( < StopPoint >) dans les ARRÊTs/Chouette ( < StopArea >) " + Test2_Sheet3_Step1_unchecked: "non implémenté" + Test2_Sheet3_Step1_error: "une ou plusieurs valeurs de l'élément < contains > de l'objet < StopArea > %{0} n'est pas repérée dans la classe d'objets correspondant < StopPoint > ou < StopArea >. >" + Test2_Sheet4: "Fiche n° 2.4 : Définition des correspondances" + Test2_Sheet4_Step1: "Correcte référence aux ARRÊTs/Chouette ( < StopArea >) définissant des TronçonsDeCorrespondance/Chouette ( < ConnectionLink >)" + Test2_Sheet4_Step1_unchecked: "non implémenté" + Test2_Sheet4_Step1_error: "L'objet < ConnectionLink > %{0} a des < StartOfLink > %{1} et < EndOfLink > %{2} qui pointent vers le même < StopArea >" + Test2_Sheet4_Step1_error_a: "a : il manque au moins un identifiant d'arrêt < StartOfLink > et < EndOfLink > dans l'objet < ConnectionLink > %{0}" + Test2_Sheet4_Step1_error_b: "b : un identifiant d'arrêt < StartOfLink > ou < EndOfLink > de l'objet < ConnectionLink> %{0} n'est pas repéré dans un objet < StopArea >" + Test2_Sheet5: "Fiche n° 2.5 : Cohérence entre les courses et les horaires" + Test2_Sheet5_Step1: "Correcte référence aux COURSES COMMERCIALES ( < VehicleJourney > ) dans les VERSIONs DES HORAIRES/Chouette ( < Timetable >)" + Test2_Sheet5_Step1_error: "un identifiant de course, situé dans l'objet < Timetable >, n'est pas référencé dans un objet < VehicleJourney >" + Test2_Sheet5_Step2: "Chaque COURSE COMMERCIALE ( < VehicleJourney > ) est référencée dans une VERSION DES HORAIRES/Chouette ( < Timetable >)" + Test2_Sheet5_Step2_error: "une course n'est pas référencée dans aucun < TimeTable >" + Test2_Sheet6: "Fiche n° 2.6 : Définition des terminus" + Test2_Sheet6_Step1: "Correcte définition du terminus de LIGNE/Chouette < Line >" + Test2_Sheet6_Step1_unchecked: "non implémenté" + Test2_Sheet6_Step1_error: "un identifiant de point d'arrêt de fin de trajet n'est pas repéré dans un objet < StopPoint>" + Test2_Sheet6_Step2: "Caractère terminus des points de fin de trajet des LIGNEs/Chouette < Line >" + Test2_Sheet6_Step2_error: "un identifiant de point d'arrêt de fin de trajet n'est pas repéré comme début ou comme fin d'un trajet" + Test2_Sheet7: "Fiche n° 2.7 : Cohérence entre les Itinéraires/Chouette et les LIGNEs/Chouette" + Test2_Sheet7_Step1: "Correcte référence aux Itinéraires/Chouette ( < ChouetteRoute >) pour chaque LIGNE/Chouette ( < Line >)" + Test2_Sheet7_Step1_unchecked: "non implémenté" + Test2_Sheet7_Step1_error: "un identifiant d'Itinéraire < RouteId > situé dans l'objet < Line > n'est pas identifié dans l'objet < ChouetteRoute >" + Test2_Sheet8: "Fiche n° 2.8 : Cohérence entre les missions commerciales et les itinéraires" + Test2_Sheet8_Step1: "Correcte référence des MISSIONs COMMERCIALEs ( < JourneyPattern >) par les Itinéraires/Chouette ( < ChouetteRoute >)" + Test2_Sheet8_Step1_error: "un élément < journeyPatternId > dans un objet d'Itinéraire < ChouetteRoute > n'a pas d'identifiant < ObjectId > dans un objet < JourneyPattern>" + Test2_Sheet8_Step2: "Correcte référence des Itinéraires/Chouette ( < ChouetteRoute >) que référencent les MISSIONs COMMERCIALEs ( < JourneyPattern >)" + Test2_Sheet8_Step2_error: "l'élément d'Itinéraire < routeId >, référencé dans un objet < JourneyPattern >, n'a pas d'identifiant < objectId > dans l'objet d'Itinéraire < ChouetteRoute >" + Test2_Sheet8_Step3: "Cohérence de la séquence des POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >) d'une mission commerciale et celle de l'Itinéraire/Chouette ( < ChouetteRoute >) correspondant" + Test2_Sheet8_Step3_a_error: "a : l'identifiant du < %{0} > détecté dans l'objet < StopPoint > ne figure pas dans la liste des points d'arrêt de l'objet < JourneyPattern >" + Test2_Sheet8_Step3_b_error: "b : l'identifiant du %{0} < StopPoint > ne figure pas dans l'un des éléments < startOfLink > ou < endOfLink > du tronçon < PtLink >" + Test2_Sheet8_Step3_c_error: "c : l'identifiant du tronçon < PtLink > : %{0} , détecté dans le test b, n'est pas intégré dans un Itinéraire < ChouetteRoute >" + Test2_Sheet8_Step3_d_error: "d : les <PTLinks> de l'Itinéraire < ChouetteRoute > : %{0} ne sont pas cohérents avec les <StopPoints> du < JourneyPattern > %{1}" + Test2_Sheet9: "Fiche n° 2.9 : Définition de l'itinéraire retour" + Test2_Sheet9_Step1: "Correcte référence à un Itinéraire/Chouette ( < ChouetteRoute >) dans le cas d'un Itinéraire de retour" + Test2_Sheet9_Step1_error: "un élément d'Itinéraire de retour < wayBackRouteId > dans un objet d'Itinéraire < ChouetteRoute > n'a pas d'identifiant < ObjectId > dans un autre objet d'Itinéraire < ChouetteRoute >" + Test2_Sheet10: "Fiche n° 2.10 : Référence à une ligne pour un point d'arrêt" + Test2_Sheet10_Step1: "Correcte référence à une LIGNE/Chouette ( < Line >) pour les POINTs D'ARRÊT SUR PARCOURS ( < StopPoint > )" + Test2_Sheet10_Step1_error: "Le point d'arrêt (< StopPoint >) fait référence à une ligne inexistante>" + Test2_Sheet11: "Fiche n° 2.11 : Référence à un réseau au point d'arrêt" + Test2_Sheet11_Step1: "Correcte référence à la VERSION DU RÉSEAU ( < PTNetwork >) pour chaque POINT D'ARRÊT SUR PARCOURS \n( < StopPoint >)" + Test2_Sheet11_Step1_error: "Le point d'arrêt (< StopPoint >) fait référence à un réseau inexistant>" + Test2_Sheet12: "Fiche n° 2.12 : Définition de l''Interdiction de Trafic Local" + Test2_Sheet12_Step1: "Cohérence entre les objets < ITL > et les ARRÊTs/Chouette ( < StopArea >)" + Test2_Sheet12_Step1_error: "Un objet d'interdiction de trafic local < ITL > %{0} fait référence à un arrêt du réseau < StopArea > %{1} inexistant" + Test2_Sheet13: "Fiche n° 2.13 : Référence à une ligne des arrêts ITL" + Test2_Sheet13_Step1: "Correcte référence à la LIGNE/Chouette ( < Line >) pour chaque < ITL >" + Test2_Sheet13_Step1_error: "Un objet d'interdiction de trafic local < ITL > fait référence à une ligne inexistante" + Test2_Sheet14: "Fiche n° 2.14 : Association points d'arrêt, tronçons, itinéraire" + Test2_Sheet14_Step1: "Tout POINT D'ARRÊT SUR PARCOURS ( < StopPoint >) est associé à un Itinéraire/Chouette (ChouetteRoute >)" + Test2_Sheet14_Step1a_error: "a : le point d'arrêt (< StopPoint >) %{0} n'appartient à aucune extrémité de tronçon" + Test2_Sheet14_Step1b_error: "b : le tronçon %{0} fait référence à un itinéraire inexistant" + Test2_Sheet14_Step2: "Continuité des tronçons COMMERCIAUX/Chouette ( < PtLink >) au sein d'un Itinéraire/Chouette ( < ChouetteRoute >)" + Test2_Sheet14_Step2_error: "l'analyse des tronçons d'un itinéraire fait apparaître que la valeur de l'attribut de l'élément < endOfLink > d'un premier tronçon < PtLink > n'est pas identique à la valeur de l'attribut de l'élément < startOfLink > du deuxième tronçon < PtLink >" + Test2_Sheet15: "Fiche n° 2.15 : Cohérence entre points d'arrêt et missions commerciales" + Test2_Sheet15_Step1: "Existence de définition des POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >) d'une mission commerciale ( < JourneyPattern >)" + Test2_Sheet15_Step1_error: "La liste de l'objet < JourneyPattern > %{0} fait référence à des points d'arrêt inexistants" + Test2_Sheet15_Step2: "Tout POINT D'ARRÊT SUR PARCOURS ( < StopPoint >) appartient à une mission commerciale ( < JourneyPattern >)" + Test2_Sheet15_Step2_error: "un point d'arrêt (< StopPoint >) n'est pas rattaché à une mission commerciale" + Test2_Sheet16: "Fiche n° 2.16 : Référence à une ligne des missions commerciales" + Test2_Sheet16_Step1: "Correcte référence à une une LIGNE/Chouette ( < Ligne >) pour une MISSION COMMERCIALE ( < JourneyPattern >)" + Test2_Sheet16_Step1_error: "Un objet < JourneyPattern > fait référence à une ligne inexistante" + Test2_Sheet17: "Fiche n° 2.17 : Cohérence entre itinéraires et courses" + Test2_Sheet17_Step1: "Correcte référence à l'Itinéraire/Chouette ( < ChouetteRoute) pour chaque COURSE COMMERCIALE ( < VehicleJourney > )" + Test2_Sheet17_Step1_error: "la course %{0} fait référence à un itinéraire inexistant %{1}" + Test2_Sheet18: "Fiche n° 2.18 : Cohérence entre les missions commerciales et les courses" + Test2_Sheet18_Step1: "Existence d'une MISSION COMMERCIALE ( < JourneyPattern < ) pour chaque COURSE COMMERCIALE ( < VehicleJourney >)" + Test2_Sheet18_Step1_error: "la course %{0} fait référence à une mission commerciale inexistante" + Test2_Sheet18_Step2: "Cohérence de points entre MISSION COMMERCIALE ( < JourneyPattern < ) et COURSE COMMERCIALE ( < VehicleJourney >)" + Test2_Sheet18_Step2_error_a: "a : l'identifiant (< StopPoint >) détecté dans un objet < StopPoint > ne figure pas dans la liste des points d'arrêts < stopPointList > de < JourneyPattern >" + Test2_Sheet18_Step2_error_b: "b : l'identifiant (< StopPoint >) ne figure pas dans l'élément < stopPointId > d'un objet < vehicleJourneyAtStop >" + Test2_Sheet19: "Fiche n° 2.19 : Référence à une ligne pour chaque course" + Test2_Sheet19_Step1: "Référence à une LIGNE/Chouette ( < Line >) pour une COURSE COMMERCIALE ( < VehicleJourney >)" + Test2_Sheet19_Step1_error: "le raccourci de ligne d'une course %{0} fait référence à une ligne inexistante" + Test2_Sheet20: "Fiche n° 2.20 : Vérification des identifiants d''exploitants que référencent les courses" + Test2_Sheet20_Step1: "Correcte référence à l'EXPLOITANT/Chouette ( < Company >) dans une COURSE COMMERCIALE ( < VehicleJourney > )" + Test2_Sheet20_Step1_error: "la course %{0} fait référence à un exploitant inexistant" + Test2_Sheet21: "Fiche n° 2.21 : Référence à une tranche horaire pour les courses" + Test2_Sheet21_Step1: "Correcte référence des COURSEs COMMERCIALEs ( < VehicleJourney > ) à des TRANCHEs HORAIREs ( < TimeSlot >)" + Test2_Sheet21_Step1_error: "la course %{0} fait référence à une tranche horaire inexistante" + Test2_Sheet22: "Fiche n° 2.22 : Cohérence entre les points d'arrêts et les heures de passage" + Test2_Sheet22_Step1: "Correcte référence à un POINT D'ARRÊT SUR PARCOURS ( < StopPoint >) pour les HEUREs DE PASSAGE GRAPHIQUées/Chouette ( < VehicleJourneyAtStop >)" + Test2_Sheet22_Step1_error: "une heure de passage %{0} fait référence à un point d'arrêt (< StopPoint >) inexistant" + Test2_Sheet23: "Fiche n° 2.23 : Cohérence entre les courses et des heures de passage" + Test2_Sheet23_Step1: "Correcte référence à une COURSE COMMERCIALE \n( < VehicleJourney >) dans HEURE DE PASSAGE GRAPHIQUEE/Chouette ( < VehicleJourneyAtStop >)" + Test2_Sheet23_Step1_error: "une heure de passage %{0} fait référence à une course inexistante" + Test2_Sheet24: "Fiche n° 2.24 : Cohérence entre la mission commerciale de la course et l''itinéraire de la course" + Test2_Sheet24_Step1: "Cohérence de la référence un Itinéraire/Chouette pour une COURSE COMMERCIALE ( < VehicleJourney >) et la MISSION COMMERCIALE ( < JourneyPattern >) correspondante" + Test2_Sheet24_Step1_error: "un objet < vehicleJourney > possède une valeur de l'attribut de l'élément < RouteId >. Cette valeur ne se retrouve dans un élément < RouteId > d'un objet < JourneyPattern > " + Test2_Sheet25: "Fiche n° 2.25 : Définition des liens d'accès" + Test2_Sheet25_Step1: "Correcte référence aux ARRÊTs/Chouette ( < StopArea >) et ACCES/NEPTUNE ( <AccessPoint >) définissant des LiensAccèsZoneArrêt/NEPTUNE ( < AccessLink >)" + Test2_Sheet25_Step1_error_a: "a : les objets < StartOfLink > et < EndOfLink > de l'objet < AccessLink > sont identiques" + Test2_Sheet25_Step1_error_b: "b : un identifiant d'arrêt ou d'accès < StartOfLink > ou < EndOfLink > de l'objet < AccessLink> n'est pas repéré dans un objet < StopArea > ou < AccessPoint >" + Test2_Sheet26: "Fiche n° 2.26 : Cohérence entre les accès et leurs composants" + Test2_Sheet26_Step1: "Correcte référence à des ARRÊTs/Chouette ( < StopArea >) et/ou à des LiensAccèsZoneArrêt/NEPTUNE ( < AccessLink >) dans les ACCES/NEPTUNE ( < AccessPoint >) " + Test2_Sheet26_Step1_error: "une ou plusieurs valeurs de l'élément < containedIn> de la classe d'objets < AccessPoint> n'est pas repérée dans la classe d'objets correspondante < StopArea > ou < AccessLink >" + Test2_Sheet27: "Fiche n° 2.27 : Référence aux arrêts dans les équipements" + Test2_Sheet27_Step1: "Correcte référence à des ARRÊTs/Chouette ( < StopArea >) dans les EQUIPEMENTs /NEPTUNE ( <Facility>)" + Test2_Sheet27_Step1_error: "une valeur de l'élément < containedIn> de la classe d'objets < Facility> n'est pas repérée dans la classe d'objets correspondante < StopArea >" + Test2_Sheet28: "Fiche n° 2.28 : Référencement correct des composants dans les équipements" + Test2_Sheet28_Step1: "Correcte référence à un ARRÊT/Chouette ( < StopArea >) ou à une LIGNE/Chouette ( < Line >) ou à un POINT D'ARRÊT SUR PARCOURS ( < StopPoint >) ou à un TronçonsDeCorrespondance/Chouette ( < ConnectionLink >) dans les FACILITYs /NEPTUNE ( <Facility>)" + Test2_Sheet28_Step1_error: "une valeur de l'élément < stopAreaId> de la classe d'objets < Facility> n'est pas repérée dans la classe d'objets correspondant < StopArea >" + Test2_Sheet28_Step2_error: "une valeur de l'élément < lineId> de la classe d'objets < Facility> n'est pas repérée dans la classe d'objets correspondant < Line>" + Test2_Sheet28_Step3_error: "une valeur de l'élément < connectionLinkId> de la classe d'objets < Facility> n'est pas repérée dans la classe d'objets correspondant < ConnectionLink >" + Test2_Sheet28_Step4_error: "une valeur de l'élément < stopPointId> de la classe d'objets < Facility> n'est pas repérée dans la classe d'objets correspondant < StopPoint >" + THREE: "Catégorie 3 : Contenu" + Test3_Sheet1: "Fiche n° 3.1 : Points d'arrêt de dénomination différente et très proches" + Test3_Sheet1_Step1: "2 POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >) très proches porte le même nom/même adresse" + Test3_Sheet1_Step1_warning: "deux points d'arrêt séparés par une distance %{3} inférieure à une valeur paramétrable %{0} ne portent pas le même nom , premier : %{1} , deuxième : %{2} " + Test3_Sheet2: "Fiche n° 3.2 : Points d'arrêt très proches regroupés au sein d'une zone d'arrêt" + Test3_Sheet2_Step1: "2 POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >) très proches appartiennent à un même ARRÊT1/Chouette ( < StopArea >)" + Test3_Sheet2_Step1_warning: "la distance calculée %{0} entre un point d'arrêt et les autres points d'arrêt est inférieure à une valeur paramétrable %{1} mais la valeur de l'attribut de l'élément < containedIn > de ces deux points d'arrêt < StopPoint > n'est pas identique, premier : %{2} , deuxième : %{3}" + Test3_Sheet3: "Fiche n° 3.3 : Unicité des noms de points d'arrêt " + Test3_Sheet3_Step1: "Différentiation de nom pour les POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >)" + Test3_Sheet3_Step1_warning: "deux points d'arrêt < StopPoint > : %{0} et %{1} de même nom ne sont pas suffisamment renseignés pour avoir des propriétés uniques" + Test3_Sheet4: "Fiche n° 3.4 : Unicité des noms de ligne" + Test3_Sheet4_Step1: "Chaque LINE/Chouette ( < Line >) possède des valeurs d'attributs uniques" + Test3_Sheet4_Step1_error: "les éléments < name > et < number > d'une ligne ne constituent pas un identifiant unique pour la ligne < Line > référencée par l'élément < %{0} >" + Test3_Sheet5: "Fiche n° 3.5 : Modèle de représentation des coordonnées des points d'arrêt" + Test3_Sheet5_Step1: "Coordonnées géographiques de chaque POINT D'ARRÊT SUR PARCOURS ( < StopPoint >) par rapport à un modèle de projection de référence" + Test3_Sheet5_Step1_warning: "le point d'arrêt d'identifiant < %{0} > n'est pas dans le bon système de projection ou ses coordonnées géographiques sont nulle ou il est situé hors d'une zone dont le périmètre ou le contour est à définir" + Test3_Sheet6: "Fiche n° 3.6 : Localisation des points d'arrêt à l'intérieur d'un périmètre défini" + Test3_Sheet6_Step1: "Les coordonnées de chaque POINT D'ARRÊT SUR PARCOURS ( < StopPoint >) sont inscrites dans une zone déterminée et qu'elles sont dans le bon système de projection" + Test3_Sheet6_Step1_warning_a: "a : le point d'arrêt d'identifiant < %{0} > n'est pas dans le bon système de projection " + Test3_Sheet6_Step1_error_b: "b : le point d'arrêt d'identifiant < %{0} > a des coordonnées qui sont hors du polygone de la zone couverte" + Test3_Sheet7: "Fiche n° 3.7 : Caractérisation des distances entre les points d'arrêt" + Test3_Sheet7_Step1: "La distance entre 2 POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >) consécutifs" + Test3_Sheet7_Step1_warning: "la distance spatiale entre deux points d'arrêt consécutifs ne se situe pas dans une fourchette autorisée (entre %{0} pour sa valeur minimale et %{1} pour sa valeur supérieure" + Test3_Sheet8: "Fiche n° 3.8 : Cohérence entre le temps et la distance pour chaque correspondance" + Test3_Sheet8_Step1: " Les vitesses calculées à partir des attributs du TronçonDeCorrespondance/Chouette ( < ConnectionLink >) suivant les paramètres fixés" + Test3_Sheet8_Step1_error_a: "a : la vitesse fixée par l'élément < DefaultDuration > n'est pas conforme à la valeur paramétrable : Vitesse minimale %{0} et Vitesse maximale %{1} fixée pour la correspondance dont l'identifiant est < %{2} >" + Test3_Sheet8_Step1_error_b: "b : la vitesse fixée par l'élément < FrequentTravellerDuration > n'est pas conforme à la valeur paramétrable Vitesse minimale %{0} (+/- delta) et Vitesse maximale %{1} fixée pour la correspondance dont l'identifiant est < %{2} >" + Test3_Sheet8_Step1_error_c: "c : la vitesse fixée par l'élément < OccasionalTravellerDuration > n'est pas conforme à la valeur paramétrable Vitesse minimale %{0} (+/- delta) et Vitesse maximale %{1} fixée pour la correspondance dont l'identifiant est < %{2} >" + Test3_Sheet8_Step1_error_d: "d : la vitesse fixée par l'élément < MobilityRestrictedTravellerDuration > n'est pas conforme à la valeur paramétrable Vitesse minimale %{0} (+/- delta) et Vitesse maximale %{1} fixée pour la correspondance dont l'identifiant est < %{2} >" + Test3_Sheet9: "Fiche n° 3.9 : Cohérence entre le temps et la distance pour chaque tronçon" + Test3_Sheet9_Step1: "La vitesse entre 2 POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >) consécutifs se situe dans une fourchette autorisée" + Test3_Sheet9_Step1_warning: "la vitesse déterminée par la distance et le temps entre 2 points d'arrêt consécutifs (entre deux objets < %{0} > et < %{1} > ) ne se situe pas une fourchette autorisée entre %{2} et %{3}" + Test3_Sheet10: "Fiche n° 3.10 : Détection des boucles" + Test3_Sheet10_Step1: "Utilisation unique dans un Itinéraire/Chouette ( < ChouetteRoute >) d'un POINT D'ARRÊT SUR PARCOURS ( < StopPoint >)" + Test3_Sheet10_Step1_error_a: "a : le point d'arrêt d'identifiant < %{0} > est défini de manière unique et ne retrouve pas dans au moins deux tronçons" + Test3_Sheet10_Step1_error_b: "b : les identifiants de tronçon identifiés dans le 3.10.1 a ne sont pas présents dans un même itinéraire" + Test3_Sheet10_Step2: "Boucle dans un itinéraire/Chouette" + Test3_Sheet10_Step2_warning: "des tronçons < PtLink > utilisent des points d'arrêt < StopPoint > ayant la même valeur d'attribut que l'élément < containedIn > pour la route %{0} " + Test3_Sheet10_Step3: "La distance entre points d'arrêt d'un même itinéraire/Chouette" + Test3_Sheet10_Step3_warning: "des points d'arrêt < StopPoint > utilisés par des tronçons d'itinéraire, sont proches les uns des autres d'une distance %{0} inférieure à une valeur paramétrable %{1} " + Test3_Sheet11: "Fiche n° 3.11 : Détection des retours en arrière" + Test3_Sheet11_Step1: "Utilisation répétitive de POINTs D'ARRÊT SUR PARCOURS d'un Itinéraire/Chouette ( < ChouetteRoute >)" + Test3_Sheet11_Step1_warning: "les tronçons < PtLink > d'un itinéraire utilisent des points d'arrêt < StopPoint > identiques plus de deux fois" + Test3_Sheet12: "Fiche n° 3.12 : Connexité du graphe des lignes et des points d'arrêt" + Test3_Sheet12_Step1: "Construction d'un graphe à partir de chaque POINTs D'ARRÊT SUR PARCOURS" + Test3_Sheet15: "Fiche n° 3.15 : Cohérence des horaires" + Test3_Sheet15_Step1: "Cohérence des HEUREs DE PASSAGE GRAPHIQUEEs/Chouette ( < VehicleJourneyAtStop >) d'une COURSE ( < VehicleJourney >) pour chaque POINT D'ARRÊT SUR PARCOURS ( < StopPoint >)" + Test3_Sheet15_Step1_error: "la différence absolue entre la valeur de l'attribut de l'élément < arrivalTime > et la valeur de l'attribut de l'élément < departureTime > est supérieure à une valeur paramétrable %{0}" + Test3_Sheet16: "Fiche n° 3.16 : Cohérence des courses" + Test3_Sheet16_Step1: "Cohérence horaire pour 2 COURSEs ( < VehicleJourney >) utilisant le même couple de POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >)" + Test3_Sheet16_Step1_error: "pour deux courses qui utilisent le même couple de points A -> B, les temps de parcours : %{2} entre le point A : %{0} et le point B : %{1} ne sont pas cohérents" + Test3_Sheet16_Step2: "La VERSION DES HORAIREs/Chouette ( < Timetable >) contient des COURSEs ( < VehicleJourney >)" + Test3_Sheet16_Step2_warning: "La course < vehicleJourney > dont l'identifiant est < %{0} > n'est pas référencée dans l'objet < TimeTable >" + Test3_Sheet16_Step3: "Cohérence des HEUREs DE PASSAGE GRAPHIQUEEs/Chouette ( < VehicleJourneyAtStop >) entre 2 POINTs D'ARRÊT SUR PARCOURS ( < StopPoint >) consécutifs dans une COURSE ( < VehicleJourney >)" + Test3_Sheet16_Step3_error_a: "a : entre deux éléments < vehicleJourneyAtStop > successifs, la différence absolue entre la valeur de l'attribut de l'élément < departureTime > du premier point d'arrêt et la valeur de l'attribut de l'élément < arrivalTime > du second point d'arrêt : %{0} est supérieure à une valeur paramétrable %{1} " + Test3_Sheet16_Step3_error_b: "b : entre deux éléments < vehicleJourneyAtStop > successifs, la valeur de l'attribut de l'élément < departureTime > du premier point d'arrêt est inférieure à la valeur de l'attribut de l'élément < arrivalTime > du second point d'arrêt ou la valeur de l'attribut de l'élément < arrivalTime > du second point d'arrêt est supérieure à une valeur paramétrable %{0}" + Test3_Sheet17: "Fiche n° 3.17 : Modèle de représentation des coordonnées des points d'accès" + Test3_Sheet17_Step1: " Les coordonnées géographiques de chaque POINT D'ACCES ( < AccessPoint >) par rapport à un modèle de projection de référence" + Test3_Sheet17_Step1_warning: "le point d'accès d'identifiant < %{0} > n'est pas dans le bon système de projection ou ses coordonnées géographiques sont nulles ou il est situé hors d'une zone dont le périmètre ou le contour est à définir" + Test3_Sheet18: "Fiche n° 3.18 : Localisation des points d'accès à l'intérieur d'un périmètre défini" + Test3_Sheet18_Step1: " Les coordonnées de chaque POINT D'ACCES ( < AccessPoint >) sont inscrites dans une zone déterminée et qu'elles sont dans le bon système de projection" + Test3_Sheet18_Step1_warning_a: "a : le point d'accès d'identifiant < %{0} > n'est pas dans le bon système de projection" + Test3_Sheet18_Step1_error_b: "b : le point d'accès d'identifiant < %{0} > a des coordonnées qui sont hors du polygone de la zone couverte" + Test3_Sheet19: "Fiche n° 3.19 : Modèle de représentation des coordonnées des équipements" + Test3_Sheet19_Step1: " Test des coordonnées géographiques de chaque EQUIPEMENT ( < Facility >) par rapport à un modèle de projection de référence" + Test3_Sheet19_Step1_warning: "l'equipement < %{0} > n'est pas dans le bon système de projection ou ses coordonnées géographiques sont nulle ou il est situé hors d'une zone dont le périmètre ou le contour est à définir" + Test3_Sheet20: "Fiche n° 3.20 : Localisation des équipements à l'intérieur d'un périmètre défini" + Test3_Sheet20_Step1: " Les coordonnées de chaque EQUIPEMENT ( < Facility>) sont inscrites dans une zone déterminée et qu'elles sont dans le bon système de projection" + Test3_Sheet20_Step1_warning_a: "a : l'equipement d'identifiant < %{0} > n'est pas dans le bon système de projection " + Test3_Sheet20_Step1_error_b: "b : l'equipement d'identifiant < %{0} > a des coordonnées qui sont hors du polygone de la zone couverte " + Test3_Sheet21: "Fiche n° 3.21 : Cohérence entre le temps et la distance pour chaque lien accès-zone d'arrêt" + Test3_Sheet21_Step1: " Les vitesses calculées à partir des attributs du LiensAccèsZoneArrêt /NEPTUNE ( < AccessLink >) suivant les paramètres fixés" + Test3_Sheet21_Step1_error_a: "a : la vitesse fixée par l'élément < DefaultDuration > n'est pas conforme à la valeur paramétrable Vitesse minimale %{0} et Vitesse maximale %{1} fixée pour le lien d'accès dont l'identifiant est < %{2} >" + Test3_Sheet21_Step1_error_b: "b : la vitesse fixée par l'élément < FrequentTravellerDuration > n'est pas conforme à la valeur paramétrable Vitesse minimale %{0} et Vitesse maximale %{1} fixée pour le lien d'accès dont l'identifiant est < %{2} >" + Test3_Sheet21_Step1_error_c: "c : la vitesse fixée par l'élément < OccasionalTravellerDuration > n'est pas conforme à la valeur paramétrable %{Vitesse minimale %{0} et Vitesse maximale %{1} fixée pour le lien d'accès dont l'identifiant est < %{2} >" + Test3_Sheet21_Step1_error_d: "d : la vitesse fixée par l'élément < MobilityRestrictedTravellerDuration > n'est pas conforme à la valeur paramétrable Vitesse minimale %{0} et Vitesse maximale %{1} fixée pour le lien d'accès dont l'identifiant est < %{2} >" + severities: + uncheck: Non testé + ok: Ok + warning: Alerte + error: Erreur + fatal: Fatal + activerecord: + models: + file_validation: + zero: Validation Neptune + one: Validation Neptune + other: Validations Neptune + attributes: + file_validation: + resources: Fichier à valider + status: Status + file_name: Jeu de données + test3_1_minimal_distance: "Distance minimale (test 3.1)" + test3_2_minimal_distance: "Distance minimale (test 3.2)" + test3_2_polygon_points: "Polygone (long lat) (test 3.6)" + test3_7_minimal_distance: "Distance minimale / maximale (test 3.7)" + test3_7_maximal_distance: " / " + test3_8a_minimal_speed: "Vitesse minimale / maximale (test 3.8a)" + test3_8a_maximal_speed: " / " + test3_8b_minimal_speed: "Vitesse minimale / maximale (test 3.8b)" + test3_8b_maximal_speed: " / " + test3_8c_minimal_speed: "Vitesse minimale / maximale (test 3.8c)" + test3_8c_maximal_speed: " / " + test3_8d_minimal_speed: "Vitesse minimale / maximale (test 3.8d)" + test3_8d_maximal_speed: " / " + test3_9_minimal_speed: "Vitesse minimale / maximale (test 3.9)" + test3_9_maximal_speed: " / " + test3_10_minimal_distance: "Distance minimale (test 3.10)" + test3_15_minimal_time: "Temps minimal (test 3.15)" + test3_16_1_maximal_time: "Ecart maximal de durée entre deux desserte d'un même tronçon (test 3.16.1)" + test3_16_3a_maximal_time: "Temps maximal d'attente à un arrêt (test 3.16.3a)" + test3_16_3b_maximal_time: "Heure maximale de départ au premier arrêt après minuit sur une course franchissant minuit (test 3.16.3b)" + test3_21a_minimal_speed: "Vitesse minimale / maximale (test 3.21a)" + test3_21a_maximal_speed: " / " + test3_21b_minimal_speed: "Vitesse minimale / maximale (test 3.21b)" + test3_21b_maximal_speed: " / " + test3_21c_minimal_speed: "Vitesse minimale / maximale (test 3.21c)" + test3_21c_maximal_speed: " / " + test3_21d_minimal_speed: "Vitesse minimale / maximale (test 3.21d)" + test3_21d_maximal_speed: " / " + projection_reference: "Système de projection de référence" + file_validation_log_message: + created_at: Date + position: N. + full_message: Message diff --git a/config/locales/formtastic.yml b/config/locales/formtastic.yml index 539645241..52c413da8 100644 --- a/config/locales/formtastic.yml +++ b/config/locales/formtastic.yml @@ -5,6 +5,23 @@ fr: create: "Créer %{model}" update: "Modifier %{model}" submit: 'Valider %{model}' - cancel: 'Annuler %{model}' + cancel: 'Annuler' reset: 'Réinitialiser %{model}' - required: 'required'
\ No newline at end of file + required: 'requis' + import: "Lancer l'import" + export: "Lancer l'export" + validate: "Lancer la validation" + +en: + formtastic: + yes: 'Yes' + no: 'No' + create: "Create %{model}" + update: "Update %{model}" + submit: 'Apply %{model}' + cancel: 'Cancel' + reset: 'Reset %{model}' + required: 'required' + import: "Launch import" + export: "Launch export" + validate: "Launch validation" diff --git a/config/locales/referentials.yml b/config/locales/referentials.yml index 7aa60fc1d..3b78f495c 100644 --- a/config/locales/referentials.yml +++ b/config/locales/referentials.yml @@ -20,13 +20,14 @@ en: name: Name slug: Code prefix: Neptune Object Id prefix - projection_type: Alternate projection code (SRID) + projection_type: Optional spatial reference system code (SRID) time_zone: time zone formtastic: hints: referential: slug: only lowercase alphanumerical or underscore characters prefix: only alphanumerical or underscore characters + projection_type: "see SRID codes on http://spatialreference.org" fr: referentials: @@ -50,10 +51,11 @@ fr: name: Nom slug: Code prefix: Préfixe des identifiants Neptune - projection_type: Code (SRID) de la seconde projection + projection_type: Système de référence spatiale optionnel (SRID) time_zone: Fuseau horaire formtastic: hints: referential: slug: "caractères autorisés : alphanumériques minuscules et 'souligné'" - prefix: "caractères autorisés : alphanumériques et 'souligné'" + prefix: "caractères autorisés : alphanumériques et 'souligné'" + projection_type: "voir http://spatialreference.org pour les codes SRID" diff --git a/db/migrate/20120620081726_create_file_validations.rb b/db/migrate/20120620081726_create_file_validations.rb new file mode 100644 index 000000000..d6544bb79 --- /dev/null +++ b/db/migrate/20120620081726_create_file_validations.rb @@ -0,0 +1,15 @@ +class CreateFileValidations < ActiveRecord::Migration + def up + create_table :file_validations do |t| + t.string :status + t.string :options, :limit => 2000 + t.string :file_name + t.string :file_type + t.timestamps + end + end + + def down + drop_table :file_validations + end +end diff --git a/db/migrate/20120620081755_create_file_validation_log_messages.rb b/db/migrate/20120620081755_create_file_validation_log_messages.rb new file mode 100644 index 000000000..b7a8c1e22 --- /dev/null +++ b/db/migrate/20120620081755_create_file_validation_log_messages.rb @@ -0,0 +1,18 @@ +class CreateFileValidationLogMessages < ActiveRecord::Migration + def up + create_table :file_validation_log_messages do |t| + t.belongs_to :file_validation + t.string :key + t.string :arguments, :limit => 1000 + t.integer :position + t.string :severity + + t.timestamps + end + add_index :file_validation_log_messages, :file_validation_id + end + + def down + drop_table :file_validation_log_messages + end +end diff --git a/db/schema.rb b/db/schema.rb index fe3bcd594..c9fbc3ec1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120620064014) do +ActiveRecord::Schema.define(:version => 20120620081755) do create_table "access_links", :force => true do |t| t.integer "access_point_id", :limit => 8 @@ -176,6 +176,29 @@ ActiveRecord::Schema.define(:version => 20120620064014) do t.integer "choice_code" end + add_index "facilities_features", ["facility_id"], :name => "idx_facility_id" + + create_table "file_validation_log_messages", :force => true do |t| + t.integer "file_validation_id" + t.string "key" + t.string "arguments", :limit => 1000 + t.integer "position" + t.string "severity" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "file_validation_log_messages", ["file_validation_id"], :name => "index_file_validation_log_messages_on_file_validation_id" + + create_table "file_validations", :force => true do |t| + t.string "status" + t.string "options" + t.string "file_name" + t.string "file_type" + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "group_of_lines", :force => true do |t| t.string "objectid", :null => false t.integer "object_version" @@ -188,10 +211,13 @@ ActiveRecord::Schema.define(:version => 20120620064014) do add_index "group_of_lines", ["objectid"], :name => "group_of_lines_objectid_key", :unique => true create_table "group_of_lines_lines", :id => false, :force => true do |t| - t.integer "group_of_line_id", :limit => 8 - t.integer "line_id", :limit => 8 + t.integer "group_of_line_id", :limit => 8, :null => false + t.integer "line_id", :limit => 8, :null => false end + add_index "group_of_lines_lines", ["group_of_line_id"], :name => "idx_grli_gr" + add_index "group_of_lines_lines", ["line_id"], :name => "idx_grli_li" + create_table "import_log_messages", :force => true do |t| t.integer "import_id" t.string "key" @@ -233,10 +259,11 @@ ActiveRecord::Schema.define(:version => 20120620064014) do add_index "journey_patterns", ["objectid"], :name => "journey_patterns_objectid_key", :unique => true create_table "journey_patterns_stop_points", :id => false, :force => true do |t| - t.integer "journey_pattern_id", :limit => 8 - t.integer "stop_point_id", :limit => 8 + t.integer "journey_pattern_id", :limit => 8, :null => false + t.integer "stop_point_id", :limit => 8, :null => false end + add_index "journey_patterns_stop_points", ["journey_pattern_id"], :name => "idx_jpsp_jpid" add_index "journey_patterns_stop_points", ["journey_pattern_id"], :name => "index_journey_pattern_id_on_journey_patterns_stop_points" create_table "lines", :force => true do |t| @@ -254,6 +281,7 @@ ActiveRecord::Schema.define(:version => 20120620064014) do t.string "comment" t.boolean "mobility_restricted_suitability" t.integer "int_user_needs" + t.integer "ptnetwork_id", :limit => 8 end add_index "lines", ["objectid"], :name => "lines_objectid_key", :unique => true @@ -299,6 +327,7 @@ ActiveRecord::Schema.define(:version => 20120620064014) do t.datetime "updated_at" t.string "prefix" t.string "projection_type" + t.string "bounding_box", :limit => nil t.string "time_zone" end @@ -324,6 +353,9 @@ ActiveRecord::Schema.define(:version => 20120620064014) do t.integer "line_id", :limit => 8 end + add_index "routing_constraints_lines", ["line_id"], :name => "idx_rcli_li" + add_index "routing_constraints_lines", ["stop_area_id"], :name => "idx_rcli_st" + create_table "stop_areas", :force => true do |t| t.integer "parent_id", :limit => 8 t.string "objectid", :null => false @@ -410,8 +442,8 @@ ActiveRecord::Schema.define(:version => 20120620064014) do add_index "time_tables", ["objectid"], :name => "time_tables_objectid_key", :unique => true create_table "time_tables_vehicle_journeys", :id => false, :force => true do |t| - t.integer "time_table_id", :limit => 8 - t.integer "vehicle_journey_id", :limit => 8 + t.integer "time_table_id", :limit => 8, :null => false + t.integer "vehicle_journey_id", :limit => 8, :null => false end add_index "time_tables_vehicle_journeys", ["time_table_id"], :name => "index_time_tables_vehicle_journeys_on_time_table_id" @@ -445,8 +477,12 @@ ActiveRecord::Schema.define(:version => 20120620064014) do t.time "waiting_time" t.time "elapse_duration" t.time "headway_frequency" + t.integer "position", :limit => 8 + t.boolean "is_departure", :default => false + t.boolean "is_arrival", :default => false end + add_index "vehicle_journey_at_stops", ["stop_point_id"], :name => "index_vehicle_journey_at_stops_on_stop_point_id" add_index "vehicle_journey_at_stops", ["stop_point_id"], :name => "index_vehicle_journey_at_stops_on_stop_pointid" add_index "vehicle_journey_at_stops", ["vehicle_journey_id"], :name => "index_vehicle_journey_at_stops_on_vehicle_journey_id" |
