aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Etienne2012-07-02 08:11:29 +0200
committerMichel Etienne2012-07-02 08:11:29 +0200
commit0412d82c225ddd47e3c0436ae5d421b1098d2fa0 (patch)
tree7ed33590d68d9066fdd416b41f949dd075d209da
parent8ccb51a3fd3907388ccaa02652a50af5e2ac08e0 (diff)
downloadchouette-core-0412d82c225ddd47e3c0436ae5d421b1098d2fa0.tar.bz2
add file validation
-rw-r--r--app/assets/images/severity-error.pngbin1857 -> 1223 bytes
-rw-r--r--app/assets/images/severity-warning.pngbin1445 -> 965 bytes
-rw-r--r--app/assets/stylesheets/file_validations.css.scss136
-rw-r--r--app/assets/stylesheets/multiple_selection.scss4
-rw-r--r--app/controllers/file_validations_controller.rb17
-rw-r--r--app/models/file_validation.rb211
-rw-r--r--app/models/file_validation_log_message.rb68
-rw-r--r--app/views/exports/new.html.erb9
-rw-r--r--app/views/file_validations/_file_validation.erb13
-rw-r--r--app/views/file_validations/index.html.erb20
-rw-r--r--app/views/file_validations/new.html.erb45
-rw-r--r--app/views/file_validations/show.html.erb149
-rw-r--r--app/views/help/faq.textile6
-rw-r--r--app/views/help/schema.textile6
-rw-r--r--app/views/help/toc.textile2
-rw-r--r--app/views/imports/new.html.erb9
-rw-r--r--app/views/layouts/application.html.erb4
-rw-r--r--app/views/routes/_route.html.erb1
-rw-r--r--app/views/stop_areas/add_routing_lines.html.erb9
-rw-r--r--app/views/stop_areas/add_routing_stops.html.erb9
-rw-r--r--app/views/time_table_dates/_form.html.erb2
-rw-r--r--app/views/time_table_periods/_form.html.erb4
-rw-r--r--app/views/time_tables/_form.erb3
-rw-r--r--config/environments/production.rb1
-rw-r--r--config/locales/exports.yml2
-rw-r--r--config/locales/file_validations.yml343
-rw-r--r--config/locales/formtastic.yml21
-rw-r--r--config/locales/referentials.yml8
-rw-r--r--db/migrate/20120620081726_create_file_validations.rb15
-rw-r--r--db/migrate/20120620081755_create_file_validation_log_messages.rb18
-rw-r--r--db/schema.rb50
31 files changed, 1143 insertions, 42 deletions
diff --git a/app/assets/images/severity-error.png b/app/assets/images/severity-error.png
index 516a4d61a..8dd9d2968 100644
--- a/app/assets/images/severity-error.png
+++ b/app/assets/images/severity-error.png
Binary files differ
diff --git a/app/assets/images/severity-warning.png b/app/assets/images/severity-warning.png
index 661327276..42da3a6f6 100644
--- a/app/assets/images/severity-warning.png
+++ b/app/assets/images/severity-warning.png
Binary files differ
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&eacute;daction ult&eacute;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&eacute;daction ult&eacute;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&eacute;n&eacute;ralit&eacute;s":introduction
## "Normalisation":normalisation
## "Documentation":documentation
+## "Vue d'ensemble":schema
# "Espaces de donn&eacute;es":dataspaces
# "R&eacute;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"