diff options
72 files changed, 740 insertions, 218 deletions
diff --git a/.gitignore b/.gitignore index 29cc18f2e..41d838ee0 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ public/assets/ chouette2.war vendor/bundle .ruby-version +.byebug_history start.sh coverage @@ -120,6 +120,7 @@ gem 'acts-as-taggable-on', '~> 4.0.0' gem 'acts_as_list', '~> 0.6.0' gem 'acts_as_tree', '~> 2.1.0', require: 'acts_as_tree' +gem "hstore_accessor", "~> 1.1" gem 'rabl' gem 'carrierwave', '~> 1.0' diff --git a/Gemfile.lock b/Gemfile.lock index 1e2ac3cf8..fef3270a3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -255,6 +255,8 @@ GEM hashdiff (0.3.4) highline (1.7.8) hike (1.2.3) + hstore_accessor (1.1.0) + activerecord (>= 4.0.0) htmlbeautifier (1.3.1) httparty (0.14.0) multi_xml (>= 0.5.2) @@ -602,6 +604,7 @@ DEPENDENCIES georuby-ext (= 0.0.5) google-analytics-rails has_array_of! + hstore_accessor (~> 1.1) htmlbeautifier i18n-tasks inherited_resources diff --git a/app/assets/javascripts/routes.coffee b/app/assets/javascripts/routes.coffee index 2e36061b8..4492b381d 100644 --- a/app/assets/javascripts/routes.coffee +++ b/app/assets/javascripts/routes.coffee @@ -1,5 +1,5 @@ $(document).on("change", '#route_wayback', (e) -> - way = if $(this).is(':checked') then "backward" else "straight_forward" + way = if $(this).is(':checked') then "inbound" else "outbound" $('.opposite_route').hide().find('select').prop('disabled', true) field = $(".opposite_route.#{way}") diff --git a/app/controllers/api_keys_controller.rb b/app/controllers/api_keys_controller.rb index 03e5ef237..f8b96afdc 100644 --- a/app/controllers/api_keys_controller.rb +++ b/app/controllers/api_keys_controller.rb @@ -1,5 +1,6 @@ class ApiKeysController < BreadcrumbController defaults resource_class: Api::V1::ApiKey + include PolicyChecker def create @api_key = Api::V1::ApiKey.new(api_key_params.merge(organisation: current_organisation)) diff --git a/app/controllers/compliance_control_sets_controller.rb b/app/controllers/compliance_control_sets_controller.rb new file mode 100644 index 000000000..1b23becaa --- /dev/null +++ b/app/controllers/compliance_control_sets_controller.rb @@ -0,0 +1,33 @@ +class ComplianceControlSetsController < BreadcrumbController + defaults resource_class: ComplianceControlSet + respond_to :html + + def index + index! do |format| + format.html { + @compliance_control_sets = decorate_compliance_control_sets(@compliance_control_sets) + } + end + end + + def show + show! do + @compliance_control_set = @compliance_control_set.decorate + end + end + + def decorate_compliance_control_sets(compliance_control_sets) + ModelDecorator.decorate( + compliance_control_sets, + with: ComplianceControlSetDecorator + ) + end + + protected + + private + + def compliance_control_set_params + params.require(:compliance_control_set).permit(:name) + end +end diff --git a/app/controllers/compliance_controls_controller.rb b/app/controllers/compliance_controls_controller.rb new file mode 100644 index 000000000..d198f2cdb --- /dev/null +++ b/app/controllers/compliance_controls_controller.rb @@ -0,0 +1,22 @@ +class ComplianceControlsController < BreadcrumbController + defaults resource_class: ComplianceControl + belongs_to :compliance_control_set + + def create + create!(notice: t('notice.compliance_control.created')) + end + + def update + path = compliance_control_set_compliance_control_path(parent, resource) + update!(notice: t('notice.compliance_control.updated')) { path } + end + + def destroy + destroy!(notice: t('notice.compliance_control.destroyed')) + end + + private + def compliance_control_params + params.require(:compliance_control).permit(:name, :code, :criticity, :comment, :control_attributes) + end +end diff --git a/app/controllers/routes_controller.rb b/app/controllers/routes_controller.rb index 04f63c112..78daffb30 100644 --- a/app/controllers/routes_controller.rb +++ b/app/controllers/routes_controller.rb @@ -94,8 +94,8 @@ class RoutesController < ChouetteController else parent.routes.where(opposite_route: nil) end - @forward = scope.where(wayback: :straight_forward) - @backward = scope.where(wayback: :backward) + @forward = scope.where(wayback: :outbound) + @backward = scope.where(wayback: :inbound) end private diff --git a/app/decorators/compliance_control_set_decorator.rb b/app/decorators/compliance_control_set_decorator.rb new file mode 100644 index 000000000..876a54d09 --- /dev/null +++ b/app/decorators/compliance_control_set_decorator.rb @@ -0,0 +1,26 @@ +class ComplianceControlSetDecorator < Draper::Decorator + delegate_all + + def action_links + links = [] + + # if h.policy(object).destroy? + links << Link.new( + content: h.destroy_link_content, + href: h.compliance_control_set_path(object.id), + method: :delete, + data: { confirm: h.t('compliance_control_sets.actions.destroy_confirm') } + ) + # end + + # if h.policy(object).edit? + links << Link.new( + content: h.t('compliance_control_sets.actions.edit'), + href: h.edit_compliance_control_set_path(object.id) + ) + # end + links + end + +end + diff --git a/app/helpers/breadcrumb_helper.rb b/app/helpers/breadcrumb_helper.rb index 55031d4f3..a3ee9de72 100644 --- a/app/helpers/breadcrumb_helper.rb +++ b/app/helpers/breadcrumb_helper.rb @@ -50,6 +50,8 @@ module BreadcrumbHelper compliance_check_breadcrumb action when "ComplianceCheckTask" compliance_check_task_breadcrumb action + when "ComplianceControlSets" + compliance_control_sets_breadcrumb action when "RuleParameterSet" rule_parameter_breadcrumb action when "User" @@ -239,6 +241,11 @@ module BreadcrumbHelper add_breadcrumb breadcrumb_label(@compliance_check_task), referential_compliance_check_task_path(@referential, @compliance_check_task),:title => breadcrumb_tooltip(@compliance_check_task) if action == :edit end + def compliance_control_sets_breadcrumb (action) + add_breadcrumb I18n.t("breadcrumbs.referentials"), workbenches_path + #add_breadcrumb breadcrumb_label(@workbench), workbench_path(@workbench), :title => breadcrumb_tooltip(@workbench) + end + def rule_parameter_breadcrumb (action) organisation_breadcrumb add_breadcrumb Referential.human_attribute_name("rule_parameter_sets"), organisation_path unless action == :index diff --git a/app/helpers/compliance_control_sets_helper.rb b/app/helpers/compliance_control_sets_helper.rb new file mode 100644 index 000000000..3e02e0ef7 --- /dev/null +++ b/app/helpers/compliance_control_sets_helper.rb @@ -0,0 +1,2 @@ +module ComplianceControlSetsHelper +end diff --git a/app/helpers/routes_helper.rb b/app/helpers/routes_helper.rb index a8c9a1f0c..4bffa99d4 100644 --- a/app/helpers/routes_helper.rb +++ b/app/helpers/routes_helper.rb @@ -6,7 +6,7 @@ module RoutesHelper end def fonticon_wayback(wayback) - if wayback == 'straight_forward' + if wayback == 'outbound' return '<i class="fa fa-arrow-right"></i>'.html_safe else return '<i class="fa fa-arrow-left"></i>'.html_safe diff --git a/app/helpers/table_builder_helper.rb b/app/helpers/table_builder_helper.rb index ec4d487c1..95f53a90d 100644 --- a/app/helpers/table_builder_helper.rb +++ b/app/helpers/table_builder_helper.rb @@ -344,7 +344,6 @@ module TableBuilderHelper ) end end - def gear_menu_link(link) content_tag( :li, diff --git a/app/helpers/table_builder_helper/url.rb b/app/helpers/table_builder_helper/url.rb index f7ba703ae..a53ac5620 100644 --- a/app/helpers/table_builder_helper/url.rb +++ b/app/helpers/table_builder_helper/url.rb @@ -3,7 +3,7 @@ module TableBuilderHelper def self.polymorphic_url_parts(item, referential) polymorph_url = [] - unless item.is_a?(Calendar) || item.is_a?(Referential) + unless item.is_a?(Calendar) || item.is_a?(Referential) || item.is_a?(ComplianceControlSet) if referential polymorph_url << referential polymorph_url << item.line if item.respond_to? :line diff --git a/app/models/chouette/route.rb b/app/models/chouette/route.rb index 49493d5b5..0bdccb36a 100644 --- a/app/models/chouette/route.rb +++ b/app/models/chouette/route.rb @@ -6,7 +6,7 @@ class Chouette::Route < Chouette::TridentActiveRecord extend ActiveModel::Naming enumerize :direction, in: %i(straight_forward backward clockwise counter_clockwise north north_west west south_west south south_east east north_east) - enumerize :wayback, in: %i(straight_forward backward), default: :straight_forward + enumerize :wayback, in: %i(outbound inbound), default: :outbound # FIXME http://jira.codehaus.org/browse/JRUBY-6358 self.primary_key = "id" @@ -106,7 +106,7 @@ class Chouette::Route < Chouette::TridentActiveRecord Chouette::Geometry::RoutePresenter.new self end - @@opposite_waybacks = { straight_forward: :backward, backward: :straight_forward} + @@opposite_waybacks = { outbound: :inbound, inbound: :outbound} def opposite_wayback @@opposite_waybacks[wayback.to_sym] end diff --git a/app/models/chouette/wayback.rb b/app/models/chouette/wayback.rb deleted file mode 100644 index b2950449d..000000000 --- a/app/models/chouette/wayback.rb +++ /dev/null @@ -1,50 +0,0 @@ -class Chouette::Wayback < ActiveSupport::StringInquirer - - def initialize(text_code, numerical_code) - super text_code.to_s - @numerical_code = numerical_code - end - - def self.new(text_code, numerical_code = nil) - if text_code and numerical_code - super - elsif self === text_code - text_code - else - if Fixnum === text_code - text_code, numerical_code = definitions.rassoc(text_code) - else - text_code, numerical_code = definitions.assoc(text_code.to_s) - end - - super text_code, numerical_code - end - end - - def to_i - @numerical_code - end - - def inspect - "#{to_s}/#{to_i}" - end - - def name - to_s - end - - @@definitions = [ - ["straight_forward", 0], - ["backward", 1] - ] - cattr_reader :definitions - - @@all = nil - def self.all - @@all ||= definitions.collect do |text_code, numerical_code| - new(text_code, numerical_code) - end - end - -end - diff --git a/app/models/compliance_check_result.rb b/app/models/compliance_check_message.rb index 161e45189..86899eb15 100644 --- a/app/models/compliance_check_result.rb +++ b/app/models/compliance_check_message.rb @@ -1,4 +1,4 @@ -class ComplianceCheckResult < ActiveRecord::Base +class ComplianceCheckMessage < ActiveRecord::Base belongs_to :compliance_check belongs_to :compliance_check_resource end diff --git a/app/models/compliance_control.rb b/app/models/compliance_control.rb index 64556b524..12ff4737a 100644 --- a/app/models/compliance_control.rb +++ b/app/models/compliance_control.rb @@ -2,8 +2,11 @@ class ComplianceControl < ActiveRecord::Base belongs_to :compliance_control_set belongs_to :compliance_control_block - enum criticity: [:info, :warning, :error] + extend Enumerize + enumerize :criticity, in: %i(info warning error), scope: true, default: :info + validates :criticity, presence: true validates :name, presence: true validates :code, presence: true + validates :compliance_control_set, presence: true end diff --git a/app/models/compliance_control_set.rb b/app/models/compliance_control_set.rb index 7801eb612..cefdfbf1f 100644 --- a/app/models/compliance_control_set.rb +++ b/app/models/compliance_control_set.rb @@ -1,3 +1,7 @@ class ComplianceControlSet < ActiveRecord::Base belongs_to :organisation + has_many :compliance_controls + + validates :name, presence: true + end diff --git a/app/models/generic_attribute_min_max.rb b/app/models/generic_attribute_min_max.rb new file mode 100644 index 000000000..e9a127c56 --- /dev/null +++ b/app/models/generic_attribute_min_max.rb @@ -0,0 +1,27 @@ +#module ComplianceControls + + class GenericAttributeMinMax < ComplianceControl + + + hstore_accessor :control_attributes, minimum: :integer, maximum: :integer + #attribute :minimum, type: :integer, optionnal: true + #attribute :maximum, type: :integer, optionnal: true + # #attribute :target, type: ModelAttribute + + @@default_criticity = :warning + @@default_code = "3-Generic-2" + + validate :min_max_values + def min_max_values + true + end + + after_initialize do + self.name = 'GenericAttributeMinMax' + self.code = @@default_code + self.criticity = @@default_criticity + end + + end + +#end diff --git a/app/models/organisation.rb b/app/models/organisation.rb index 895ca03d9..ba65ad375 100644 --- a/app/models/organisation.rb +++ b/app/models/organisation.rb @@ -4,6 +4,7 @@ class Organisation < ActiveRecord::Base has_many :users, :dependent => :destroy has_many :referentials, :dependent => :destroy has_many :rule_parameter_sets, :dependent => :destroy + has_many :compliance_control_sets, :dependent => :destroy has_many :stop_area_referential_memberships has_many :stop_area_referentials, through: :stop_area_referential_memberships diff --git a/app/policies/api_key_policy.rb b/app/policies/api_key_policy.rb index 7b4c22e33..eb7b84457 100644 --- a/app/policies/api_key_policy.rb +++ b/app/policies/api_key_policy.rb @@ -10,10 +10,11 @@ class ApiKeyPolicy < ApplicationPolicy end def create? - organisation_match? && user.has_permission?('api_keys.create') + user.has_permission?('api_keys.create') end def update? - organisation_match? && user.has_permission?('api_keys.update') + record.try(:organisation_id) == user.organisation_id && + user.has_permission?('api_keys.update') end end diff --git a/app/policies/compliance_control_set_policy.rb b/app/policies/compliance_control_set_policy.rb new file mode 100644 index 000000000..12b829aa4 --- /dev/null +++ b/app/policies/compliance_control_set_policy.rb @@ -0,0 +1,7 @@ +class ComplianceControlSetPolicy < ApplicationPolicy + class Scope < Scope + def resolve + scope + end + end +end diff --git a/app/views/api_keys/edit.html.slim b/app/views/api_keys/edit.html.slim index b1bd1858d..9d7d1fdb7 100644 --- a/app/views/api_keys/edit.html.slim +++ b/app/views/api_keys/edit.html.slim @@ -5,7 +5,7 @@ t('last_update', time: l(@api_key.updated_at, format: :short)), '' - / Below is secundary actions & optional contents (filters, ...) + / Below are secondary actions & optional content (filters, ...) .row.mb-sm .col-lg-12.text-right = ( policy(@api_key).destroy? ? link_to(t('actions.destroy'), api_key_path(@api_key), :method => :delete, class: 'btn btn-default') : '' ) diff --git a/app/views/compliance_control_sets/_filters.html.slim b/app/views/compliance_control_sets/_filters.html.slim new file mode 100644 index 000000000..8da629e9c --- /dev/null +++ b/app/views/compliance_control_sets/_filters.html.slim @@ -0,0 +1,33 @@ += search_form_for @q_for_form, url: workbench_path(@workbench.id), builder: SimpleForm::FormBuilder, class: 'form form-filter' do |f| + .ffg-row + .input-group.search_bar + = f.search_field :name_cont, class: 'form-control', placeholder: t('referentials.filters.name') + span.input-group-btn + button.btn.btn-default type='submit' + span.fa.fa-search + + .ffg-row + .form-group + = f.label t('activerecord.models.line.one').upcase, required: false, class: 'control-label' + = f.input :associated_lines_id_eq, as: :select, collection: @workbench.lines.includes(:company).order(:name), input_html: { 'data-select2ed': 'true', 'data-select2ed-placeholder': t('referentials.filters.line') }, label: false, label_method: :display_name, wrapper_html: { class: 'select2ed'} + + .form-group.togglable + = f.label Referential.human_attribute_name(:status), required: false, class: 'control-label' + .form-group.checkbox_list + = f.input :archived_at_not_null, label: ("<span>#{t('activerecord.attributes.referential.archived_at')}<span class='fa fa-archive'></span></span>").html_safe, as: :boolean, wrapper_html: { class: 'checkbox-wrapper' } + = f.input :archived_at_null, label: ("<span>#{t('activerecord.attributes.referential.archived_at_null')}<span class='sb sb-lg sb-preparing'></span></span>").html_safe, as: :boolean, wrapper_html: { class: 'checkbox-wrapper' } + + .form-group.togglable + = f.label t('activerecord.models.organisation.one'), required: false, class: 'control-label' + = f.input :organisation_name_eq_any, collection: Organisation.order('name').pluck(:name), as: :check_boxes, label: false, label_method: lambda{|w| ("<span>#{w}</span>").html_safe}, required: false, wrapper_html: { class: 'checkbox_list' } + + .form-group.togglable + = f.label Referential.human_attribute_name(:validity_period), required: false, class: 'control-label' + .filter_menu + = f.simple_fields_for :validity_period do |p| + = p.input :begin_gteq, as: :date, label: t('simple_form.from'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @begin_range, include_blank: @begin_range ? false : true + = p.input :end_lteq, as: :date, label: t('simple_form.to'), wrapper_html: { class: 'date smart_date filter_menu-item' }, default: @end_range, include_blank: @end_range ? false : true + + .actions + = link_to t('actions.erase'), @workbench, class: 'btn btn-link' + = f.submit t('actions.filter'), class: 'btn btn-default', id: 'referential_filter_btn' diff --git a/app/views/compliance_control_sets/_form.html.slim b/app/views/compliance_control_sets/_form.html.slim new file mode 100644 index 000000000..cf144bbd9 --- /dev/null +++ b/app/views/compliance_control_sets/_form.html.slim @@ -0,0 +1,8 @@ += simple_form_for @compliance_control_set, html: { class: 'form-horizontal', id: 'compliance_control_set_form' }, wrapper: :horizontal_form do |f| + .row + .col-lg-12 + = f.input :name + + .separator + + = f.button :submit, t('actions.submit'), class: 'btn btn-default formSubmitr', form: 'compliance_control_set_form' diff --git a/app/views/compliance_control_sets/edit.html.slim b/app/views/compliance_control_sets/edit.html.slim new file mode 100644 index 000000000..a9b8d7253 --- /dev/null +++ b/app/views/compliance_control_sets/edit.html.slim @@ -0,0 +1,10 @@ +/ PageHeader += pageheader 'modele-calendrier', + t('compliance_control_sets.index.edit') + +/ PageContent +.page_content + .container-fluid + .row + .col-lg-8.col-lg-offset-2.col-md-8.col-md-offset-2.col-sm-10.col-sm-offset-1 + = render 'form' diff --git a/app/views/compliance_control_sets/index.html.slim b/app/views/compliance_control_sets/index.html.slim new file mode 100644 index 000000000..16879af5a --- /dev/null +++ b/app/views/compliance_control_sets/index.html.slim @@ -0,0 +1,51 @@ +/ PageHeader +- header_params = ['jeux-de-donnees', + t('compliance_control_sets.index.title'), + ''] +- header_params << link_to(t('compliance_control_sets.actions.new'), new_compliance_control_set_path, class: 'btn btn-default') if policy(Calendar).create? += pageheader(*header_params) do + + / Below is secundary actions & optional contents (filters, ...) + .row.mb-sm + .col-lg-12.text-right + +/ PageContent +.page_content + .container-fluid + .row + .col-lg-12 + /= render 'filters' + .row + .col-lg-12 + .select_table + = table_builder_2 @compliance_control_sets, + [ \ + TableBuilderHelper::Column.new( \ + key: :name, \ + attribute: 'name', \ + link_to: lambda do |compliance_control_set| \ + compliance_control_set_path(@compliance_control_sets, compliance_control_set) \ + end \ + ), \ + TableBuilderHelper::Column.new( \ + key: :assignment, \ + attribute: 'assignment' \ + ), \ + TableBuilderHelper::Column.new( \ + key: :owner_jdc, \ + attribute: 'owner_jdc' \ + ), \ + TableBuilderHelper::Column.new( \ + key: :control_numbers, \ + attribute: 'control_numbers' \ + ), \ + TableBuilderHelper::Column.new( \ + key: :update, \ + attribute: '' \ + ) \ + ], + sortable: true, + links: [:show], + cls: 'table has-filter has-search' + + diff --git a/app/views/compliance_control_sets/new.html.slim b/app/views/compliance_control_sets/new.html.slim new file mode 100644 index 000000000..d6be41ee8 --- /dev/null +++ b/app/views/compliance_control_sets/new.html.slim @@ -0,0 +1,11 @@ +/ PageHeader += pageheader 'modele-calendrier', + t('compliance_control_sets.index.new') + + +/ PageContent +.page_content + .container-fluid + .row + .col-lg-8.col-lg-offset-2.col-md-8.col-md-offset-2.col-sm-10.col-sm-offset-1 + = render 'form' diff --git a/app/views/compliance_control_sets/show.html.slim b/app/views/compliance_control_sets/show.html.slim new file mode 100644 index 000000000..b4a5b2260 --- /dev/null +++ b/app/views/compliance_control_sets/show.html.slim @@ -0,0 +1,25 @@ +/ PageHeader += pageheader 'jeux-de-donnees', + @compliance_control_set.name, + 'Lorem ipsum dolor sit amet' + + / Below is secondary actions & optional contents (filters, ...) + .row.mb-sm + .col-lg-12.text-right + - @compliance_control_set.action_links.each do |link| + - if link.is_a?(HTMLElement) + = link.to_html(class: 'btn btn-primary') + - else + = link_to link.href, + method: link.method, + data: link.data, + class: 'btn btn-primary' do + = link.content + +/ PageContent +.page_content + .container-fluid + .row + .col-lg-6.col-md-6.col-sm-12.col-xs-12 + = definition_list t('metadatas'), + ComplianceControlSet.human_attribute_name(:name) => @compliance_control_set.name
\ No newline at end of file diff --git a/app/views/compliance_controls/edit.html.slim b/app/views/compliance_controls/edit.html.slim new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/views/compliance_controls/edit.html.slim diff --git a/app/views/compliance_controls/index.html.slim b/app/views/compliance_controls/index.html.slim new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/views/compliance_controls/index.html.slim diff --git a/app/views/compliance_controls/new.html.slim b/app/views/compliance_controls/new.html.slim new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/views/compliance_controls/new.html.slim diff --git a/app/views/compliance_controls/show.html.slim b/app/views/compliance_controls/show.html.slim new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/app/views/compliance_controls/show.html.slim diff --git a/app/views/imports/index.html.slim b/app/views/imports/index.html.slim index 2203d3584..a6da730f1 100644 --- a/app/views/imports/index.html.slim +++ b/app/views/imports/index.html.slim @@ -24,7 +24,7 @@ ), \ TableBuilderHelper::Column.new( \ key: :started_at, \ - attribute: Proc.new { |n| l(n.started_at, format: :long) }, \ + attribute: Proc.new { |n| l(n.started_at, format: :long) if n.started_at }, \ ), \ TableBuilderHelper::Column.new( \ key: :name, \ diff --git a/app/views/layouts/navigation/_main_nav_left.html.slim b/app/views/layouts/navigation/_main_nav_left.html.slim index 4560f5fa0..12139c93b 100644 --- a/app/views/layouts/navigation/_main_nav_left.html.slim +++ b/app/views/layouts/navigation/_main_nav_left.html.slim @@ -11,7 +11,7 @@ .menu-item.panel .panel-heading h4.panel-title - = link_to '#miOne', data: { toggle: 'collapse', parent: '#menu-items' }, 'aria-expanded' => 'false' do + = link_to '#miOne', data: {toggle: 'collapse', parent: '#menu-items'}, 'aria-expanded' => 'false' do |Offres courantes #miOne.panel-collapse.collapse @@ -26,7 +26,7 @@ .menu-item.panel .panel-heading h4.panel-title - = link_to '#miTwo', data: { toggle: 'collapse', parent: '#menu-items' }, 'aria-expanded' => 'false' do + = link_to '#miTwo', data: {toggle: 'collapse', parent: '#menu-items'}, 'aria-expanded' => 'false' do |Espace de travail #miTwo.panel-collapse.collapse @@ -34,18 +34,18 @@ = link_to workbench_path(current_offer_workbench), class: "list-group-item #{params[:controller] == 'workbenches' ? 'active' : ''}" do span Jeux de données = link_to workbench_imports_path(current_offer_workbench), class: "list-group-item #{(params[:controller] == 'imports') ? 'active' : ''}" do - span Import + span Import = link_to calendars_path, class: 'list-group-item' do span Modèles de calendrier = link_to '#', class: 'list-group-item' do span Rapport de contrôle - = link_to '#', class: 'list-group-item' do + = link_to compliance_control_sets_path, class: 'list-group-item' do span Jeux de contrôle .menu-item.panel .panel-heading h4.panel-title - = link_to '#miThree', data: { toggle: 'collapse', parent: '#menu-items' }, 'aria-expanded' => 'false' do + = link_to '#miThree', data: {toggle: 'collapse', parent: '#menu-items'}, 'aria-expanded' => 'false' do |Données #miThree.panel-collapse.collapse @@ -74,7 +74,7 @@ .menu-item.panel .panel-heading h4.panel-title - = link_to '#miFour', data: { toggle: 'collapse', parent: '#menu-items' }, 'aria-expanded' => 'false' do + = link_to '#miFour', data: {toggle: 'collapse', parent: '#menu-items'}, 'aria-expanded' => 'false' do |Synchronisation #miFour.panel-collapse.collapse @@ -87,7 +87,7 @@ .menu-item.panel .panel-heading h4.panel-title - = link_to '#miFive', data: { toggle: 'collapse', parent: '#menu-items' }, 'aria-expanded' => 'false' do + = link_to '#miFive', data: {toggle: 'collapse', parent: '#menu-items'}, 'aria-expanded' => 'false' do |Outils #miFive.panel-collapse.collapse diff --git a/app/views/routes/_form.html.slim b/app/views/routes/_form.html.slim index bee86f91e..244b427dc 100644 --- a/app/views/routes/_form.html.slim +++ b/app/views/routes/_form.html.slim @@ -7,11 +7,11 @@ .form-group.has_switch = f.label :wayback, class: 'col-sm-4 col-xs-5 control-label' - = f.input :wayback, as: :boolean, checked_value: :straight_forward, unchecked_value: :backward, label: content_tag(:span, @route.wayback_text, class: 'switch-label', data: {checkedValue: t('enumerize.route.direction.straight_forward'), uncheckedValue: t('enumerize.route.direction.backward')}), wrapper_html: { class: 'col-sm-8 col-xs-7'} + = f.input :wayback, as: :boolean, checked_value: :outbound, unchecked_value: :inbound, label: content_tag(:span, @route.wayback_text, class: 'switch-label', data: {checkedValue: t('enumerize.route.wayback.outbound'), uncheckedValue: t('enumerize.route.wayback.inbound')}), wrapper_html: { class: 'col-sm-8 col-xs-7'} - = f.input :opposite_route_id, collection: @forward, disabled: @route.wayback.straight_forward?, wrapper_html: {class: input_opposite_route_id_css(@route, 'straight_forward')} + = f.input :opposite_route_id, collection: @forward, disabled: @route.wayback.outbound?, wrapper_html: {class: input_opposite_route_id_css(@route, 'outbound')} - = f.input :opposite_route_id, collection: @backward, disabled: @route.wayback.backward?, wrapper_html: {class: input_opposite_route_id_css(@route, 'backward')} + = f.input :opposite_route_id, collection: @backward, disabled: @route.wayback.inbound?, wrapper_html: {class: input_opposite_route_id_css(@route, 'inbound')} diff --git a/config/locales/compliance_check_results.en.yml b/config/locales/compliance_check_results.en.yml index e0541ab36..cd22aefb1 100644 --- a/config/locales/compliance_check_results.en.yml +++ b/config/locales/compliance_check_results.en.yml @@ -1,3 +1,2 @@ en: - compliance_check_results: - + compliance_check_messages: diff --git a/config/locales/compliance_check_results.fr.yml b/config/locales/compliance_check_results.fr.yml index b3ddc53f2..d3fbf0900 100644 --- a/config/locales/compliance_check_results.fr.yml +++ b/config/locales/compliance_check_results.fr.yml @@ -1,3 +1,2 @@ fr: - compliance_check_results: - + compliance_check_messages: diff --git a/config/locales/compliance_control_sets.fr.yml b/config/locales/compliance_control_sets.fr.yml new file mode 100644 index 000000000..c230d593c --- /dev/null +++ b/config/locales/compliance_control_sets.fr.yml @@ -0,0 +1,21 @@ +fr: + compliance_control_sets: + index: + title: Jeux de contrôle + new: Création d'un jeux de contrôle + edit: Édition d'un jeux de contrôle + actions: + new: Ajouter + edit: Editer + destroy: Supprimer + destroy_confirm: Etes vous sûr de supprimer ce jeux de contrôle ? + activerecord: + models: + compliance_control_set: Calendrier + attributes: + compliance_control_set: + name: Nom + assignment: Affectation + owner_jdc: Propriétaire du jeu de contrôle + control_numbers: Nb contrôle + update: Mis a jour
\ No newline at end of file diff --git a/config/locales/enumerize.en.yml b/config/locales/enumerize.en.yml index 0bc3e5edc..addf64dbd 100644 --- a/config/locales/enumerize.en.yml +++ b/config/locales/enumerize.en.yml @@ -61,8 +61,8 @@ en: east: 'East' north_east: 'North East' wayback: - straight_forward: 'Straight Forward' - backward: 'Backward' + outbound: 'Straight Forward' + inbound: 'Backward' vehicle_journey: transport_mode: interchange: Interchange diff --git a/config/locales/enumerize.fr.yml b/config/locales/enumerize.fr.yml index 14aedd155..b183d80e0 100644 --- a/config/locales/enumerize.fr.yml +++ b/config/locales/enumerize.fr.yml @@ -14,10 +14,10 @@ fr: canceled: Annulé import_resource: status: - new: Nouveau - pending: En file d'attente - successful: Réussi - failed: Echoué + OK: ok + ERROR: error + WARNING: warning + IGNORED: "n/a" for_boarding: normal: "Montée autorisée" forbidden: "Montée interdite" @@ -61,8 +61,8 @@ fr: east: 'Est' north_east: 'Nord Est' wayback: - straight_forward: 'Aller' - backward: 'Retour' + outbound: 'Aller' + inbound: 'Retour' vehicle_journey: transport_mode: interchange: Interconnection diff --git a/config/locales/import_messages.en.yml b/config/locales/import_messages.en.yml index 7f8fc622d..e1ef8a078 100644 --- a/config/locales/import_messages.en.yml +++ b/config/locales/import_messages.en.yml @@ -1,25 +1,25 @@ en: - compliance_check_messages: - import_messages: - referential_creation: "The referential can't be created because another one has same periods and lines" + import_messages: + compliance_check_messages: + referential_creation: "Le référentiel n'a pas pu être créé car un référentiel existe déjà sur les même périodes et lignes" 1_netexstif_2: "Le fichier %{source_filename} ne respecte pas la syntaxe XML ou la XSD NeTEx : erreur '%{error_value}' rencontré" 1_netexstif_5: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} a une date de mise à jour dans le futur" 2_netexstif_1_1: "Le fichier commun.xml ne contient pas de frame nommée NETEX_COMMUN" - 2_netexstif_1_2: "Le fichier commun.xml contient une frame nommée %{source_label} non acceptée" + 2_netexstif_1_2: "Le fichier commun.xml contient une frame nommée %{error_value} non acceptée" 2_netexstif_2_1: "Le fichier calendriers.xml ne contient pas de frame nommée NETEX_CALENDRIER" - 2_netexstif_2_2: "Le fichier calendriers.xml contient une frame nommée %{source_label} non acceptée" + 2_netexstif_2_2: "Le fichier calendriers.xml contient une frame nommée %{error_value} non acceptée" 2_netexstif_3_1: "Le fichier %{source_filename} ne contient pas de frame nommée NETEX_OFFRE_LIGNE" - 2_netexstif_3_2: "Le fichier %{source_filename} contient une frame nommée %{source_label} non acceptée" - 2_netexstif_3_3: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} ne contient pas la frame %{NETEX_STRUCTURE|NETEX_HORAIRE} obligatoire" - 2_netexstif_3_4: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} contient une frame %{source_label} non acceptée" + 2_netexstif_3_2: "Le fichier %{source_filename} contient une frame nommée %{error_value} non acceptée" + 2_netexstif_3_3: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} ne contient pas la frame %{error_value} obligatoire" + 2_netexstif_3_4: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} contient une frame %{error_value} non acceptée" 2_netexstif_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'identifiant %{source_objectid} de l'objet %{source_label} ne respecte pas la syntaxe [CODESPACE]:%{source_label}:[identifiant Technique]:LOC" 2_netexstif_6: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} a un état de modification interdit : 'delete'" - 2_netexstif_7: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de syntaxe invalide : %{reference_value}" - 2_netexstif_8_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type externe : référence interne attendue" - 2_netexstif_8_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type interne mais disposant d'un contenu (version externe possible)" - 2_netexstif_9_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type interne : référence externe attendue" - 2_netexstif_9_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type externe sans information de version" - 2_netexstif_10: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type externe inconnue" + 2_netexstif_7: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de syntaxe invalide : %{error_value}" + 2_netexstif_8_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type externe : référence interne attendue" + 2_netexstif_8_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type interne mais disposant d'un contenu (version externe possible)" + 2_netexstif_9_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type interne : référence externe attendue" + 2_netexstif_9_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type externe sans information de version" + 2_netexstif_10: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type externe inconnue" 2_netexstif_daytype_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet DayType d'identifiant %{source_objectid} ne définit aucun calendrier, il est ignoré" 2_netexstif_daytype_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet DayType d'identifiant %{source_objectid} est reliée à des périodes mais ne définit pas de types de jours" 2_netexstif_daytypeassignment_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet DayTypeAssignment d'identifiant %{source_objectid} ne peut référencer un OperatingDay" @@ -27,24 +27,25 @@ en: 2_netexstif_direction_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Direction d'identifiant %{source_objectid} n'a pas de valeur pour l'attribut Name" 2_netexstif_direction_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Direction d'identifiant %{source_objectid} définit un attribut %{error_value} non autorisé" 2_netexstif_notice_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Notice d'identifiant %{source_objectid} doit définir un texte" - 2_netexstif_notice_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Notice d'identifiant %{source_objectid} de type %{reference_value} est ignoré" - 2_netexstif_operatingperiod_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet OperatingPeriod d'identifiant %{source_objectid} a une date de fin %{start_date} inférieure ou égale à la date de début %{end_date}" + 2_netexstif_notice_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Notice d'identifiant %{source_objectid} de type %{error_value} est ignoré" + 2_netexstif_operatingperiod_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet OperatingPeriod d'identifiant %{source_objectid} a une date de fin %{error_value} inférieure ou égale à la date de début %{reference_value}" 2_netexstif_passengerstopassignment_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, l'attribut %{source_label} de l'objet PassengerStopAssignment %{source_objectid} doit être renseigné" 2_netexstif_passengerstopassignment_2: "L'arrêt %{source_objectid} ne fait pas partie des arrêts disponibles pour votre organisation." 2_netexstif_passingtime_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{error_value} ne dispose pas de DepartureTime" 2_netexstif_passingtime_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{error_value} fournit un ArrivalTime supérieur à son DepartureTime" 2_netexstif_route_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} a une valeur de l'attribut DirectionType interdite : %{error_value}" - 2_netexstif_route_2_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{reference_value} qui ne le référence pas" - 2_netexstif_route_2_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{reference_value} de même DirectionType" + 2_netexstif_route_2_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{error_value} qui ne le référence pas" + 2_netexstif_route_2_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{error_value} de même DirectionType" 2_netexstif_route_3: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : Les ServiceJourneyPattern de l'objet Route d'identifiant %{source_objectid} ne permettent pas de reconstituer la séquence des arrêts de celui-ci" - 2_netexstif_route_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, Les informations de montée/Descente à l'arrêt %{source_label} de la Route %{source_objectid} diffèrent sur plusieurs ServiceJourneyPattern, ces informations ne sont pas importées" + 2_netexstif_route_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, Les informations de montée/Descente à l'arrêt %{error_value} de la Route %{source_objectid} diffèrent sur plusieurs ServiceJourneyPattern, ces informations ne sont pas importées" 2_netexstif_routingconstraintzone_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, l'objet RoutingConstraintZone %{source_objectid} doit référencer au moins deux ScheduledStopPoint" 2_netexstif_routingconstraintzone_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, l'objet RoutingConstraintZone %{source_objectid} a une valeur interdite pour l'attribut ZoneUse : %{error_value}" 2_netexstif_servicejourney_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourney d'identifiant %{source_objectid} ne référence pas de ServiceJourneyPattern" 2_netexstif_servicejourney_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourney d'identifiant %{source_objectid} fournit plus d'un trainNumber" 2_netexstif_servicejourney_3: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : Le nombre d'horaires (passing_times) de l'objet ServiceJourney d'identifiant %{source_objectid} n'est pas cohérent avec le ServiceJourneyPattern associé." - 2_netexstif_servicejourney_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{rank} fournit des horaires antérieurs au passingTime précédent." + 2_netexstif_servicejourney_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{error_value} fournit des horaires antérieurs au passingTime précédent." 2_netexstif_servicejourneypattern_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} ne référence pas de Route" 2_netexstif_servicejourneypattern_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} doit contenir au moins 2 StopPointInJourneyPattern" - 2_netexstif_servicejourneypattern_3: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} n'a pas de valeur pour l'attribut ServiceJourneyPatternType" + 2_netexstif_servicejourneypattern_3_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} n'a pas de valeur pour l'attribut ServiceJourneyPatternType" + 2_netexstif_servicejourneypattern_3_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} a une valeur interdite %{error_value} pour l'attribut ServiceJourneyPatternType différente de 'passenger'" 2_netexstif_servicejourneypattern_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, objet ServiceJourneyPattern d'identifiant %{source_objectid} : les attributs 'order' des StopPointInJourneyPattern ne sont pas croissants." diff --git a/config/locales/import_messages.fr.yml b/config/locales/import_messages.fr.yml index 09951c561..8d6a4ee91 100644 --- a/config/locales/import_messages.fr.yml +++ b/config/locales/import_messages.fr.yml @@ -5,21 +5,21 @@ fr: 1_netexstif_2: "Le fichier %{source_filename} ne respecte pas la syntaxe XML ou la XSD NeTEx : erreur '%{error_value}' rencontré" 1_netexstif_5: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} a une date de mise à jour dans le futur" 2_netexstif_1_1: "Le fichier commun.xml ne contient pas de frame nommée NETEX_COMMUN" - 2_netexstif_1_2: "Le fichier commun.xml contient une frame nommée %{source_label} non acceptée" + 2_netexstif_1_2: "Le fichier commun.xml contient une frame nommée %{error_value} non acceptée" 2_netexstif_2_1: "Le fichier calendriers.xml ne contient pas de frame nommée NETEX_CALENDRIER" - 2_netexstif_2_2: "Le fichier calendriers.xml contient une frame nommée %{source_label} non acceptée" + 2_netexstif_2_2: "Le fichier calendriers.xml contient une frame nommée %{error_value} non acceptée" 2_netexstif_3_1: "Le fichier %{source_filename} ne contient pas de frame nommée NETEX_OFFRE_LIGNE" - 2_netexstif_3_2: "Le fichier %{source_filename} contient une frame nommée %{source_label} non acceptée" - 2_netexstif_3_3: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} ne contient pas la frame %{NETEX_STRUCTURE|NETEX_HORAIRE} obligatoire" - 2_netexstif_3_4: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} contient une frame %{source_label} non acceptée" + 2_netexstif_3_2: "Le fichier %{source_filename} contient une frame nommée %{error_value} non acceptée" + 2_netexstif_3_3: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} ne contient pas la frame %{error_value} obligatoire" + 2_netexstif_3_4: "la frame NETEX_OFFRE_LIGNE du fichier %{source_filename} contient une frame %{error_value} non acceptée" 2_netexstif_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'identifiant %{source_objectid} de l'objet %{source_label} ne respecte pas la syntaxe [CODESPACE]:%{source_label}:[identifiant Technique]:LOC" 2_netexstif_6: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} a un état de modification interdit : 'delete'" - 2_netexstif_7: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de syntaxe invalide : %{reference_value}" - 2_netexstif_8_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type externe : référence interne attendue" - 2_netexstif_8_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type interne mais disposant d'un contenu (version externe possible)" - 2_netexstif_9_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type interne : référence externe attendue" - 2_netexstif_9_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type externe sans information de version" - 2_netexstif_10: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de type externe inconnue" + 2_netexstif_7: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{reference_value} de syntaxe invalide : %{error_value}" + 2_netexstif_8_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type externe : référence interne attendue" + 2_netexstif_8_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type interne mais disposant d'un contenu (version externe possible)" + 2_netexstif_9_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type interne : référence externe attendue" + 2_netexstif_9_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type externe sans information de version" + 2_netexstif_10: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet %{source_label} d'identifiant %{source_objectid} définit une référence %{error_value} de type externe inconnue" 2_netexstif_daytype_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet DayType d'identifiant %{source_objectid} ne définit aucun calendrier, il est ignoré" 2_netexstif_daytype_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet DayType d'identifiant %{source_objectid} est reliée à des périodes mais ne définit pas de types de jours" 2_netexstif_daytypeassignment_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet DayTypeAssignment d'identifiant %{source_objectid} ne peut référencer un OperatingDay" @@ -27,24 +27,25 @@ fr: 2_netexstif_direction_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Direction d'identifiant %{source_objectid} n'a pas de valeur pour l'attribut Name" 2_netexstif_direction_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Direction d'identifiant %{source_objectid} définit un attribut %{error_value} non autorisé" 2_netexstif_notice_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Notice d'identifiant %{source_objectid} doit définir un texte" - 2_netexstif_notice_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Notice d'identifiant %{source_objectid} de type %{reference_value} est ignoré" + 2_netexstif_notice_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Notice d'identifiant %{source_objectid} de type %{error_value} est ignoré" 2_netexstif_operatingperiod_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet OperatingPeriod d'identifiant %{source_objectid} a une date de fin %{error_value} inférieure ou égale à la date de début %{reference_value}" 2_netexstif_passengerstopassignment_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, l'attribut %{source_label} de l'objet PassengerStopAssignment %{source_objectid} doit être renseigné" 2_netexstif_passengerstopassignment_2: "L'arrêt %{source_objectid} ne fait pas partie des arrêts disponibles pour votre organisation." 2_netexstif_passingtime_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{error_value} ne dispose pas de DepartureTime" 2_netexstif_passingtime_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{error_value} fournit un ArrivalTime supérieur à son DepartureTime" 2_netexstif_route_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} a une valeur de l'attribut DirectionType interdite : %{error_value}" - 2_netexstif_route_2_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{reference_value} qui ne le référence pas" - 2_netexstif_route_2_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{reference_value} de même DirectionType" + 2_netexstif_route_2_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{error_value} qui ne le référence pas" + 2_netexstif_route_2_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet Route d'identifiant %{source_objectid} référence un objet Route inverse %{error_value} de même DirectionType" 2_netexstif_route_3: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : Les ServiceJourneyPattern de l'objet Route d'identifiant %{source_objectid} ne permettent pas de reconstituer la séquence des arrêts de celui-ci" - 2_netexstif_route_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, Les informations de montée/Descente à l'arrêt %{source_label} de la Route %{source_objectid} diffèrent sur plusieurs ServiceJourneyPattern, ces informations ne sont pas importées" + 2_netexstif_route_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, Les informations de montée/Descente à l'arrêt %{error_value} de la Route %{source_objectid} diffèrent sur plusieurs ServiceJourneyPattern, ces informations ne sont pas importées" 2_netexstif_routingconstraintzone_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, l'objet RoutingConstraintZone %{source_objectid} doit référencer au moins deux ScheduledStopPoint" 2_netexstif_routingconstraintzone_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, l'objet RoutingConstraintZone %{source_objectid} a une valeur interdite pour l'attribut ZoneUse : %{error_value}" 2_netexstif_servicejourney_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourney d'identifiant %{source_objectid} ne référence pas de ServiceJourneyPattern" 2_netexstif_servicejourney_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourney d'identifiant %{source_objectid} fournit plus d'un trainNumber" 2_netexstif_servicejourney_3: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : Le nombre d'horaires (passing_times) de l'objet ServiceJourney d'identifiant %{source_objectid} n'est pas cohérent avec le ServiceJourneyPattern associé." - 2_netexstif_servicejourney_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{rank} fournit des horaires antérieurs au passingTime précédent." + 2_netexstif_servicejourney_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} , objet ServiceJourney d'identifiant %{source_objectid} : le passingTime de rang %{error_value} fournit des horaires antérieurs au passingTime précédent." 2_netexstif_servicejourneypattern_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} ne référence pas de Route" 2_netexstif_servicejourneypattern_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} doit contenir au moins 2 StopPointInJourneyPattern" - 2_netexstif_servicejourneypattern_3: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} n'a pas de valeur pour l'attribut ServiceJourneyPatternType" + 2_netexstif_servicejourneypattern_3_1: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} n'a pas de valeur pour l'attribut ServiceJourneyPatternType" + 2_netexstif_servicejourneypattern_3_2: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number} : l'objet ServiceJourneyPattern d'identifiant %{source_objectid} a une valeur interdite %{error_value} pour l'attribut ServiceJourneyPatternType différente de 'passenger'" 2_netexstif_servicejourneypattern_4: "%{source_filename}-Ligne %{source_line_number}-Colonne %{source_column_number}, objet ServiceJourneyPattern d'identifiant %{source_objectid} : les attributs 'order' des StopPointInJourneyPattern ne sont pas croissants." diff --git a/config/locales/routes.en.yml b/config/locales/routes.en.yml index e94adf490..63d7b198c 100644 --- a/config/locales/routes.en.yml +++ b/config/locales/routes.en.yml @@ -36,9 +36,6 @@ en: title: "Duplicate route" route: no_journey_pattern: "No Journey pattern" - wayback: - positive: "forward" - negative: "backward" opposite: "Opposite route" no_opposite: "No opposite route" activerecord: diff --git a/config/locales/waybacks.en.yml b/config/locales/waybacks.en.yml index e6d3234e1..58bcf06ba 100644 --- a/config/locales/waybacks.en.yml +++ b/config/locales/waybacks.en.yml @@ -1,5 +1,5 @@ en: waybacks: label: - straight_forward: "straight forward" - backward: "backward" + outbound: "straight forward" + inbound: "backward" diff --git a/config/locales/waybacks.fr.yml b/config/locales/waybacks.fr.yml index 4c6ed0036..c16e42e20 100644 --- a/config/locales/waybacks.fr.yml +++ b/config/locales/waybacks.fr.yml @@ -1,5 +1,5 @@ fr: waybacks: label: - straight_forward: "aller" - backward: "retour" + outbound: "aller" + inbound: "retour" diff --git a/config/routes.rb b/config/routes.rb index 0f1b22e44..97e0257c2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,8 @@ ChouetteIhm::Application.routes.draw do end end + resources :compliance_control_sets + devise_for :users, :controllers => { :registrations => 'users/registrations', :invitations => 'users/invitations' } @@ -69,6 +71,10 @@ ChouetteIhm::Application.routes.draw do resources :api_keys, :only => [:edit, :update, :new, :create, :destroy] + resources :compliance_control_sets do + resources :compliance_controls + end + resources :stop_area_referentials, :only => [:show] do post :sync, on: :member resources :stop_areas diff --git a/db/migrate/20170913074922_change_wayback_route_values.rb b/db/migrate/20170913074922_change_wayback_route_values.rb new file mode 100644 index 000000000..a547cbd55 --- /dev/null +++ b/db/migrate/20170913074922_change_wayback_route_values.rb @@ -0,0 +1,12 @@ +class ChangeWaybackRouteValues < ActiveRecord::Migration + def up + execute "UPDATE routes SET wayback = 'outbound' WHERE routes.wayback = 'straight_forward';" + execute "UPDATE routes SET wayback = 'inbound' WHERE routes.wayback = 'backward';" + end + + def down + execute "UPDATE routes SET wayback = 'straight_forward' WHERE routes.wayback = 'outbound';" + execute "UPDATE routes SET wayback = 'backward' WHERE routes.wayback = 'inbound';" + end + +end diff --git a/db/migrate/20170915100935_change_crticity_type_for_compliance_control.rb b/db/migrate/20170915100935_change_crticity_type_for_compliance_control.rb new file mode 100644 index 000000000..f3e7e7339 --- /dev/null +++ b/db/migrate/20170915100935_change_crticity_type_for_compliance_control.rb @@ -0,0 +1,5 @@ +class ChangeCrticityTypeForComplianceControl < ActiveRecord::Migration + def change + change_column :compliance_controls, :criticity, :string + end +end diff --git a/db/migrate/20170918103913_alter_table_compliance_check_result_to_compliance_check_message.rb b/db/migrate/20170918103913_alter_table_compliance_check_result_to_compliance_check_message.rb new file mode 100644 index 000000000..c0dc6225a --- /dev/null +++ b/db/migrate/20170918103913_alter_table_compliance_check_result_to_compliance_check_message.rb @@ -0,0 +1,5 @@ +class AlterTableComplianceCheckResultToComplianceCheckMessage < ActiveRecord::Migration + def change + rename_table :compliance_check_results, :compliance_check_messages + end +end diff --git a/db/schema.rb b/db/schema.rb index 6f4629371..2b62fa7f1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170907082913) do +ActiveRecord::Schema.define(version: 20170918103913) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -155,17 +155,7 @@ ActiveRecord::Schema.define(version: 20170907082913) do add_index "compliance_check_blocks", ["compliance_check_set_id"], name: "index_compliance_check_blocks_on_compliance_check_set_id", using: :btree - create_table "compliance_check_resources", id: :bigserial, force: :cascade do |t| - t.string "status" - t.string "name" - t.string "type" - t.string "reference" - t.hstore "metrics" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - - create_table "compliance_check_results", id: :bigserial, force: :cascade do |t| + create_table "compliance_check_messages", id: :bigserial, force: :cascade do |t| t.integer "compliance_check_id" t.integer "compliance_check_resource_id" t.string "message_key" @@ -175,8 +165,18 @@ ActiveRecord::Schema.define(version: 20170907082913) do t.datetime "updated_at", null: false end - add_index "compliance_check_results", ["compliance_check_id"], name: "index_compliance_check_results_on_compliance_check_id", using: :btree - add_index "compliance_check_results", ["compliance_check_resource_id"], name: "index_compliance_check_results_on_compliance_check_resource_id", using: :btree + add_index "compliance_check_messages", ["compliance_check_id"], name: "index_compliance_check_messages_on_compliance_check_id", using: :btree + add_index "compliance_check_messages", ["compliance_check_resource_id"], name: "index_compliance_check_messages_on_compliance_check_resource_id", using: :btree + + create_table "compliance_check_resources", id: :bigserial, force: :cascade do |t| + t.string "status" + t.string "name" + t.string "type" + t.string "reference" + t.hstore "metrics" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end create_table "compliance_check_sets", id: :bigserial, force: :cascade do |t| t.integer "referential_id" @@ -237,7 +237,7 @@ ActiveRecord::Schema.define(version: 20170907082913) do t.json "control_attributes" t.string "name" t.string "code" - t.integer "criticity" + t.string "criticity" t.text "comment" t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -270,22 +270,6 @@ ActiveRecord::Schema.define(version: 20170907082913) do add_index "connection_links", ["objectid"], name: "connection_links_objectid_key", unique: true, using: :btree - create_table "delayed_jobs", id: :bigserial, force: :cascade do |t| - t.integer "priority", default: 0 - t.integer "attempts", default: 0 - t.text "handler" - t.text "last_error" - t.datetime "run_at" - t.datetime "locked_at" - t.datetime "failed_at" - t.string "locked_by", limit: 255 - t.string "queue", limit: 255 - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree - create_table "exports", id: :bigserial, force: :cascade do |t| t.integer "referential_id", limit: 8 t.string "status" @@ -407,12 +391,12 @@ ActiveRecord::Schema.define(version: 20170907082913) do t.datetime "started_at" t.datetime "ended_at" t.string "token_download" - t.string "type", limit: 255 + t.string "type" t.integer "parent_id", limit: 8 t.string "parent_type" - t.integer "current_step", default: 0 - t.integer "total_steps", default: 0 t.datetime "notified_parent_at" + t.integer "current_step", default: 0 + t.integer "total_steps", default: 0 t.string "creator" end @@ -564,11 +548,6 @@ ActiveRecord::Schema.define(version: 20170907082913) do add_index "networks", ["objectid"], name: "networks_objectid_key", unique: true, using: :btree add_index "networks", ["registration_number"], name: "networks_registration_number_key", using: :btree - create_table "object_id_factories", id: :bigserial, force: :cascade do |t| - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - create_table "organisations", id: :bigserial, force: :cascade do |t| t.string "name" t.datetime "created_at" @@ -745,7 +724,7 @@ ActiveRecord::Schema.define(version: 20170907082913) do create_table "stop_areas", id: :bigserial, force: :cascade do |t| t.integer "parent_id", limit: 8 - t.string "objectid", null: false + t.string "objectid", null: false t.integer "object_version", limit: 8 t.string "creator_id" t.string "name" @@ -754,8 +733,8 @@ ActiveRecord::Schema.define(version: 20170907082913) do t.string "registration_number" t.string "nearest_topic_name" t.integer "fare_code" - t.decimal "longitude", precision: 19, scale: 16 - t.decimal "latitude", precision: 19, scale: 16 + t.decimal "longitude", precision: 19, scale: 16 + t.decimal "latitude", precision: 19, scale: 16 t.string "long_lat_type" t.string "country_code" t.string "street_name" @@ -773,7 +752,7 @@ ActiveRecord::Schema.define(version: 20170907082913) do t.datetime "deleted_at" t.datetime "created_at" t.datetime "updated_at" - t.string "stif_type", limit: 255 + t.string "stif_type" end add_index "stop_areas", ["name"], name: "index_stop_areas_on_name", using: :btree @@ -844,18 +823,18 @@ ActiveRecord::Schema.define(version: 20170907082913) do add_index "time_table_periods", ["time_table_id"], name: "index_time_table_periods_on_time_table_id", using: :btree create_table "time_tables", id: :bigserial, force: :cascade do |t| - t.string "objectid", null: false - t.integer "object_version", limit: 8, default: 1 + t.string "objectid", null: false + t.integer "object_version", limit: 8, default: 1 t.string "creator_id" t.string "version" t.string "comment" - t.integer "int_day_types", default: 0 + t.integer "int_day_types", default: 0 t.date "start_date" t.date "end_date" t.integer "calendar_id", limit: 8 t.datetime "created_at" t.datetime "updated_at" - t.string "color", limit: 255 + t.string "color" t.integer "created_from_id" t.string "checksum" t.text "checksum_source" @@ -987,8 +966,8 @@ ActiveRecord::Schema.define(version: 20170907082913) do add_foreign_key "access_links", "access_points", name: "aclk_acpt_fkey" add_foreign_key "api_keys", "organisations" add_foreign_key "compliance_check_blocks", "compliance_check_sets" - add_foreign_key "compliance_check_results", "compliance_check_resources" - add_foreign_key "compliance_check_results", "compliance_checks" + add_foreign_key "compliance_check_messages", "compliance_check_resources" + add_foreign_key "compliance_check_messages", "compliance_checks" add_foreign_key "compliance_check_sets", "compliance_control_sets" add_foreign_key "compliance_check_sets", "referentials" add_foreign_key "compliance_check_sets", "workbenches" @@ -999,13 +978,9 @@ ActiveRecord::Schema.define(version: 20170907082913) do add_foreign_key "compliance_controls", "compliance_control_blocks" add_foreign_key "compliance_controls", "compliance_control_sets" add_foreign_key "group_of_lines_lines", "group_of_lines", name: "groupofline_group_fkey", on_delete: :cascade - add_foreign_key "journey_frequencies", "timebands", name: "journey_frequencies_timeband_id_fk", on_delete: :nullify add_foreign_key "journey_frequencies", "timebands", on_delete: :nullify - add_foreign_key "journey_frequencies", "vehicle_journeys", name: "journey_frequencies_vehicle_journey_id_fk", on_delete: :nullify add_foreign_key "journey_frequencies", "vehicle_journeys", on_delete: :nullify - add_foreign_key "journey_pattern_sections", "journey_patterns", name: "journey_pattern_sections_journey_pattern_id_fk", on_delete: :cascade add_foreign_key "journey_pattern_sections", "journey_patterns", on_delete: :cascade - add_foreign_key "journey_pattern_sections", "route_sections", name: "journey_pattern_sections_route_section_id_fk", on_delete: :cascade add_foreign_key "journey_pattern_sections", "route_sections", on_delete: :cascade add_foreign_key "journey_patterns", "routes", name: "jp_route_fkey", on_delete: :cascade add_foreign_key "journey_patterns", "stop_points", column: "arrival_stop_point_id", name: "arrival_point_fkey", on_delete: :nullify diff --git a/lib/stif/permission_translator.rb b/lib/stif/permission_translator.rb index 065a8eb4d..d836dd037 100644 --- a/lib/stif/permission_translator.rb +++ b/lib/stif/permission_translator.rb @@ -17,13 +17,13 @@ module Stif def all_resources %w[ access_points - connection_links calendars - footnotes - journey_patterns - referentials routes routing_constraint_zones - time_tables - vehicle_journeys - api_keys + connection_links calendars + footnotes + journey_patterns + referentials routes routing_constraint_zones + time_tables + vehicle_journeys + api_keys ] end diff --git a/lib/tasks/erd.rake b/lib/tasks/erd.rake index a9b1a3454..6b79967de 100644 --- a/lib/tasks/erd.rake +++ b/lib/tasks/erd.rake @@ -3,10 +3,10 @@ namespace :generate do desc "Create model diagrams for Chouette" task :model_diagram => :environment do sh "bundle exec rake erd only='Organisation,Referential,User,Workbench' filename='organisation' title='Organisation'" - sh "bundle exec rake erd only='Calendar,Referential,Chouette::Line,Chouette::Route,Chouette::JourneyPattern,Chouette::VehicleJourney,Chouette::VehicleJourneyAtStop,Chouette::TimeTable,Chouette::TimeTableDate,Chouette::TimeTablePeriod,Chouette::Footnote,Chouette::Network,Chouette::Company,Chouette::StopPoint,Chouette::StopArea' filename='offer_datas' title='Offer Datas'" + sh "bundle exec rake erd only='Calendar,Referential,ReferentialMetadata,Chouette::Line,Chouette::Route,Chouette::JourneyPattern,Chouette::VehicleJourney,Chouette::VehicleJourneyAtStop,Chouette::TimeTable,Chouette::TimeTableDate,Chouette::TimeTablePeriod,Chouette::Footnote,Chouette::Network,Chouette::Company,Chouette::StopPoint,Chouette::StopArea' filename='offer_datas' title='Offer Datas'" sh "bundle exec rake erd only='Organisation,StopAreaReferential,StopAreaReferentialSync,StopAreaReferentialSyncMessage,StopAreaReferentialMembership,LineReferential,LineReferentialSync,LineReferentialSyncMessage,LineReferentialMembership' filename='referentiels_externes' title='Référentiels externes'" sh "bundle exec rake erd only='NetexImport,Import,WorkbenchImport,ImportResource,ImportMessage' filename='import' title='Import'" - #sh "bundle exec rake erd only='' filename='validation' title='Validation'" + sh "bundle exec rake erd only='ComplianceControlSet,ComplianceControlBlock,ComplianceControl,ComplianceCheckSet,ComplianceCheckBlock,ComplianceCheck,ComplianceCheckResource,ComplianceCheckMessage' filename='validation' title='Validation'" #sh "bundle exec rake erd only='VehicleJourney,VehicleJourneyExport' filename='export' title='Export'" #sh "bundle exec rake erd only='' filename='intégration' title='Integration'" #sh "bundle exec rake erd only='' filename='fusion' title='Fusion'" diff --git a/spec/controllers/compliance_control_sets_controller_spec.rb b/spec/controllers/compliance_control_sets_controller_spec.rb new file mode 100644 index 000000000..25d0becfe --- /dev/null +++ b/spec/controllers/compliance_control_sets_controller_spec.rb @@ -0,0 +1,60 @@ +require 'rails_helper' + +RSpec.describe ComplianceControlSetsController, type: :controller do + login_user + + let(:compliance_control_set) { create :compliance_control_set } + + describe "GET show" do + it 'should be successful' do + get :show, id: compliance_control_set.id + expect(response).to be_success + end + end + + describe "GET index" do + it 'should be successful' do + get :index, id: compliance_control_set.id + expect(response).to be_success + end + end + + describe "GET #edit" do + it 'should be successful' do + get :edit, id: compliance_control_set.id + expect(response).to be_success + end + end + + describe 'GET #new' do + it 'should be successful' do + get :new, id: compliance_control_set.id + expect(response).to be_success + end + end + + describe 'POST #create' do + it 'should be successful' do + post :create, compliance_control_set: build(:compliance_control_set).as_json + expect(response).to have_http_status(302) + # expect(flash[:notice]).to eq(I18n.t('notice.compliance_control.created')) + end + end + + describe 'POST #update' do + it 'should be successful' do + post :update, id: compliance_control_set.id, compliance_control_set: compliance_control_set.as_json + expect(response).to redirect_to compliance_control_set_path(compliance_control_set) + # expect(flash[:notice]).to eq(I18n.t('notice.compliance_control.updated')) + end + end + + describe 'DELETE #destroy' do + it 'should be successful' do + delete :destroy, id: compliance_control_set.id + # expect(flash[:notice]).to eq I18n.t('notice.compliance_control.destroyed') + end + end + + +end diff --git a/spec/controllers/compliance_controls_controller_spec.rb b/spec/controllers/compliance_controls_controller_spec.rb new file mode 100644 index 000000000..165c00329 --- /dev/null +++ b/spec/controllers/compliance_controls_controller_spec.rb @@ -0,0 +1,59 @@ +require 'rails_helper' + +RSpec.describe ComplianceControlsController, type: :controller do + login_user + + let(:compliance_control) { create :compliance_control } + let(:compliance_control_set) { compliance_control.compliance_control_set } + + describe "GET show" do + it 'should be successful' do + get :show, compliance_control_set_id: compliance_control_set.id, id: compliance_control.id + expect(response).to be_success + end + end + + describe "GET index" do + it 'should be successful' do + get :index, compliance_control_set_id: compliance_control_set.id + expect(response).to be_success + end + end + + describe 'GET #edit' do + it 'should be successful' do + get :edit, compliance_control_set_id: compliance_control_set.id, id: compliance_control.id + expect(response).to be_success + end + end + + describe 'GET #new' do + it 'should be successful' do + get :new, compliance_control_set_id: compliance_control_set.id + expect(response).to be_success + end + end + + describe 'POST #create' do + it 'should be successful' do + post :create, compliance_control_set_id: compliance_control_set.id, compliance_control: build(:compliance_control).as_json + expect(response).to have_http_status(302) + expect(flash[:notice]).to eq(I18n.t('notice.compliance_control.created')) + end + end + + describe 'POST #update' do + it 'should be successful' do + post :update, compliance_control_set_id: compliance_control_set.id, id: compliance_control.id, compliance_control: compliance_control.as_json + expect(response).to redirect_to compliance_control_set_compliance_control_path(compliance_control_set, compliance_control) + expect(flash[:notice]).to eq(I18n.t('notice.compliance_control.updated')) + end + end + + describe 'DELETE #destroy' do + it 'should be successful' do + delete :destroy, compliance_control_set_id: compliance_control_set.id, id: compliance_control.id + expect(flash[:notice]).to eq I18n.t('notice.compliance_control.destroyed') + end + end +end diff --git a/spec/decorators/compliance_control_set_decorator_spec.rb b/spec/decorators/compliance_control_set_decorator_spec.rb new file mode 100644 index 000000000..64e9ff9e7 --- /dev/null +++ b/spec/decorators/compliance_control_set_decorator_spec.rb @@ -0,0 +1,4 @@ +require 'spec_helper' + +describe ComplianceControlSetDecorator do +end diff --git a/spec/factories/compliance_check_results.rb b/spec/factories/compliance_check_messages.rb index a56d77ce4..1a047a242 100644 --- a/spec/factories/compliance_check_results.rb +++ b/spec/factories/compliance_check_messages.rb @@ -1,5 +1,5 @@ FactoryGirl.define do - factory :compliance_check_result do + factory :compliance_check_message do association :compliance_check association :compliance_check_resource message_key "message_key" diff --git a/spec/factories/compliance_controls.rb b/spec/factories/compliance_controls.rb index 28b760383..8aa16b674 100644 --- a/spec/factories/compliance_controls.rb +++ b/spec/factories/compliance_controls.rb @@ -1,8 +1,8 @@ FactoryGirl.define do factory :compliance_control do sequence(:name) { |n| "Compliance control #{n}" } - type "Type" - criticity :info + type "ComplianceControl" + criticity :warning code "code" comment "Text" association :compliance_control_set diff --git a/spec/features/api_keys/delete_api_key_feature_spec.rb b/spec/features/api_keys/delete_api_key_feature_spec.rb new file mode 100644 index 000000000..b58e819a6 --- /dev/null +++ b/spec/features/api_keys/delete_api_key_feature_spec.rb @@ -0,0 +1,34 @@ +RSpec.describe 'New API Key', type: :feature do + login_user + + describe "api_keys#destroy" do + + let!( :api_key ){ create :api_key, name: SecureRandom.uuid, organisation: @user.organisation } + + let( :edit_label ){ "#{api_key.name} : #{api_key.token}" } + let( :destroy_label ){ "Supprimer" } + + xit 'complete workflow' do + # /workbenches + visit workbenches_path + # the api_key is visible + click_link edit_label + + # brings us to correct page + expect(page.current_path).to eq(edit_api_key_path(api_key)) + expect(page).to have_content("Supprimer") + # click_link(destroy_label) + + # # check impact on DB + # expect(Api::V1::ApiKey.where(id: api_key.id)).to be_empty + + # # check redirect and changed display + # expect(page.current_path).to eq(workbenches_path) + # # deleted api_key's not shown anymore + # expect( page ).not_to have_content(edit_label) + end + + end + +end + diff --git a/spec/features/api_keys/edit_api_key_feature_spec.rb b/spec/features/api_keys/edit_api_key_feature_spec.rb new file mode 100644 index 000000000..411c11aaf --- /dev/null +++ b/spec/features/api_keys/edit_api_key_feature_spec.rb @@ -0,0 +1,39 @@ +RSpec.describe 'New API Key', type: :feature do + login_user + + describe "api_keys#edit" do + + let!( :api_key ){ create :api_key, name: SecureRandom.uuid, organisation: @user.organisation } + + let( :edit_label ){ "#{api_key.name} : #{api_key.token}" } + let( :name_label ){ "Nom" } + let( :validate_label ){ "Valider" } + + let( :unique_name ){ SecureRandom.uuid } + + it 'complete workflow' do + # /workbenches + visit workbenches_path + # api_key's new name does not exist yet + expect( page ).not_to have_content(unique_name) + # the api_key is visible + click_link edit_label + + # brings us to correct page + expect(page.current_path).to eq(edit_api_key_path(api_key)) + fill_in(name_label, with: unique_name) + click_button(validate_label) + + # check impact on DB + expect(api_key.reload.name).to eq(unique_name) + + # check redirect and changed display + expect(page.current_path).to eq(workbenches_path) + # changed api_key's name exists now + expect( page ).to have_content(unique_name) + end + + end + +end + diff --git a/spec/features/api_keys/new_api_key_feature_spec.rb b/spec/features/api_keys/new_api_key_feature_spec.rb new file mode 100644 index 000000000..eba873691 --- /dev/null +++ b/spec/features/api_keys/new_api_key_feature_spec.rb @@ -0,0 +1,38 @@ +RSpec.describe 'New API Key', type: :feature do + login_user + + describe "api_keys#create" do + + let( :create_label ){ "Créer une clé d'API" } + let( :name_label ){ "Nom" } + let( :validate_label ){ "Valider" } + + let( :unique_name ){ SecureRandom.uuid } + let( :last_api_key ){ Api::V1::ApiKey.last } + + + it 'complete workflow' do + # /workbenches + visit workbenches_path + expect(page).to have_link(create_label, href: new_api_key_path) + # to be created api_key does not exist yet + expect( page ).not_to have_content(unique_name) + + # /api_keys/new + click_link create_label + fill_in(name_label, with: unique_name) + click_button validate_label + + # check impact on DB + expect(last_api_key.name).to eq(unique_name) + + # check redirect and changed display + expect(page.current_path).to eq(workbenches_path) + # to be created api_key exists now + expect( page ).to have_content(unique_name) + end + + end + +end + diff --git a/spec/features/line_footnotes_permissions_spec.rb b/spec/features/line_footnotes_permissions_spec.rb index 4de2a6137..62adbfcd5 100644 --- a/spec/features/line_footnotes_permissions_spec.rb +++ b/spec/features/line_footnotes_permissions_spec.rb @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - describe 'Line Footnotes', type: :feature do login_user diff --git a/spec/features/referential_lines_spec.rb b/spec/features/referential_lines_spec.rb index 95fc596fd..e8cc8e0e1 100644 --- a/spec/features/referential_lines_spec.rb +++ b/spec/features/referential_lines_spec.rb @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- -require 'spec_helper' - describe 'ReferentialLines', type: :feature do login_user let!(:referential_metadata) { create :referential_metadata, referential: referential } diff --git a/spec/features/referentials_spec.rb b/spec/features/referentials_spec.rb index a38577aba..9af0ed32e 100644 --- a/spec/features/referentials_spec.rb +++ b/spec/features/referentials_spec.rb @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- describe "Referentials", :type => :feature do login_user diff --git a/spec/helpers/compliance_control_sets_helper_spec.rb b/spec/helpers/compliance_control_sets_helper_spec.rb new file mode 100644 index 000000000..981368561 --- /dev/null +++ b/spec/helpers/compliance_control_sets_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the ComplianceControlSetsHelper. For example: +# +# describe ComplianceControlSetsHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe ComplianceControlSetsHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/lib/stif/netex_file_spec.rb b/spec/lib/stif/netex_file_spec.rb index d84807fe5..ef69b994c 100644 --- a/spec/lib/stif/netex_file_spec.rb +++ b/spec/lib/stif/netex_file_spec.rb @@ -1,5 +1,3 @@ -require "rails_helper" - RSpec.describe STIF::NetexFile do let( :zip_file ){ fixtures_path 'OFFRE_TRANSDEV_2017030112251.zip' } diff --git a/spec/lib/stif/permission_translator_spec.rb b/spec/lib/stif/permission_translator_spec.rb index 7404a9862..ae1a2d1d5 100644 --- a/spec/lib/stif/permission_translator_spec.rb +++ b/spec/lib/stif/permission_translator_spec.rb @@ -1,4 +1,3 @@ -# coding: utf-8 RSpec.describe Stif::PermissionTranslator do context "No SSO Permissions" do diff --git a/spec/models/chouette/route/route_base_spec.rb b/spec/models/chouette/route/route_base_spec.rb index 794da4f1b..cac2880e8 100644 --- a/spec/models/chouette/route/route_base_spec.rb +++ b/spec/models/chouette/route/route_base_spec.rb @@ -11,7 +11,7 @@ RSpec.describe Chouette::Route, :type => :model do end it { is_expected.to enumerize(:direction).in(:straight_forward, :backward, :clockwise, :counter_clockwise, :north, :north_west, :west, :south_west, :south, :south_east, :east, :north_east) } - it { is_expected.to enumerize(:wayback).in(:straight_forward, :backward) } + it { is_expected.to enumerize(:wayback).in(:outbound, :inbound) } #it { is_expected.to validate_presence_of :name } it { is_expected.to validate_presence_of :line } @@ -19,7 +19,7 @@ RSpec.describe Chouette::Route, :type => :model do #it { is_expected.to validate_presence_of :wayback_code } #it { is_expected.to validate_presence_of :direction_code } it { is_expected.to validate_inclusion_of(:direction).in_array(%i(straight_forward backward clockwise counter_clockwise north north_west west south_west south south_east east north_east)) } - it { is_expected.to validate_inclusion_of(:wayback).in_array(%i(straight_forward backward)) } + it { is_expected.to validate_inclusion_of(:wayback).in_array(%i(outbound inbound)) } context "reordering methods" do let(:bad_stop_point_ids){subject.stop_points.map { |sp| sp.id + 1}} diff --git a/spec/models/compliance_check_result_spec.rb b/spec/models/compliance_check_message_spec.rb index 95586862f..8b424595e 100644 --- a/spec/models/compliance_check_result_spec.rb +++ b/spec/models/compliance_check_message_spec.rb @@ -1,8 +1,8 @@ require 'rails_helper' -RSpec.describe ComplianceCheckResult, type: :model do +RSpec.describe ComplianceCheckMessage, type: :model do it 'should have a valid factory' do - expect(FactoryGirl.build(:compliance_check_result)).to be_valid + expect(FactoryGirl.build(:compliance_check_message)).to be_valid end it { should belong_to :compliance_check } diff --git a/spec/models/compliance_control_set_spec.rb b/spec/models/compliance_control_set_spec.rb index fb46bc65a..ededec5e0 100644 --- a/spec/models/compliance_control_set_spec.rb +++ b/spec/models/compliance_control_set_spec.rb @@ -6,4 +6,7 @@ RSpec.describe ComplianceControlSet, type: :model do end it { should belong_to :organisation } + it { should have_many :compliance_controls } + + it { should validate_presence_of :name } end diff --git a/spec/policies/api_key_policy_spec.rb b/spec/policies/api_key_policy_spec.rb index 5b9d59fa3..f0242978e 100644 --- a/spec/policies/api_key_policy_spec.rb +++ b/spec/policies/api_key_policy_spec.rb @@ -1,28 +1,60 @@ -require 'rails_helper' - RSpec.describe ApiKeyPolicy do - let(:user) { User.new } + let( :record ){ build_stubbed :api_key } + before { stub_policy_scope(record) } subject { described_class } - permissions ".scope" do - pending "add some examples to (or delete) #{__FILE__}" + permissions :index? do + it_behaves_like 'always allowed' end permissions :show? do - pending "add some examples to (or delete) #{__FILE__}" + it_behaves_like 'always allowed' end permissions :create? do - pending "add some examples to (or delete) #{__FILE__}" + context 'permission absent → ' do + it "denies a user without organisation" do + expect_it.not_to permit(user_context, record) + end + end + context 'permission present → ' do + it 'allows a user with a different organisation' do + add_permissions('api_keys.create', for_user: user) + expect_it.to permit(user_context, record) + end + end end permissions :update? do - pending "add some examples to (or delete) #{__FILE__}" + context 'permission absent → ' do + it "denies a user with a different organisation" do + expect_it.not_to permit(user_context, record) + end + it 'and also a user with the same organisation' do + user.organisation_id = record.organisation_id + expect_it.not_to permit(user_context, record) + end + end + + context 'permission present → ' do + before do + add_permissions('api_keys.update', for_user: user) + end + + it 'denies a user with a different organisation' do + expect_it.not_to permit(user_context, record) + end + + it 'but allows it for a user with the same organisation' do + user.organisation_id = record.organisation_id + expect_it.to permit(user_context, record) + end + end end permissions :destroy? do - pending "add some examples to (or delete) #{__FILE__}" + it_behaves_like 'permitted policy and same organisation', 'api_keys.destroy' end end |
