diff options
| author | Luc Donnet | 2017-09-19 15:47:38 +0200 | 
|---|---|---|
| committer | Luc Donnet | 2017-09-19 15:47:38 +0200 | 
| commit | 307e5a191509e08981d16084b57d5dcc71be6bcd (patch) | |
| tree | 71c10b52c1aee715e20d44a8115819f98da84bf9 | |
| parent | cf25969daf8a039e29f1a653c3a2ee7d23cd4103 (diff) | |
| parent | 5ffc337dfc86017840a5402058d490fd20d29bf4 (diff) | |
| download | chouette-core-307e5a191509e08981d16084b57d5dcc71be6bcd.tar.bz2 | |
Merge branch 'master' of github.com:AF83/stif-boiv
18 files changed, 373 insertions, 19 deletions
| diff --git a/app/controllers/compliance_controls_controller.rb b/app/controllers/compliance_controls_controller.rb index d198f2cdb..dad9b935a 100644 --- a/app/controllers/compliance_controls_controller.rb +++ b/app/controllers/compliance_controls_controller.rb @@ -1,7 +1,16 @@  class ComplianceControlsController < BreadcrumbController +  include PolicyChecker    defaults resource_class: ComplianceControl    belongs_to :compliance_control_set +  def index +    index! do |format| +      format.html { +        @compliance_controls = decorate_compliance_controls(@compliance_controls) +      } +    end +  end +    def create      create!(notice: t('notice.compliance_control.created'))    end @@ -16,6 +25,13 @@ class ComplianceControlsController < BreadcrumbController    end    private +  def decorate_compliance_controls(compliance_controls) +    ModelDecorator.decorate( +      compliance_controls, +      with: ComplianceControlDecorator, +    ) +  end +    def compliance_control_params      params.require(:compliance_control).permit(:name, :code, :criticity, :comment, :control_attributes)    end diff --git a/app/decorators/compliance_control_decorator.rb b/app/decorators/compliance_control_decorator.rb new file mode 100644 index 000000000..38b968ad1 --- /dev/null +++ b/app/decorators/compliance_control_decorator.rb @@ -0,0 +1,25 @@ +class ComplianceControlDecorator < 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_compliance_control_path(object.compliance_control_set.id, object.id), +        method: :delete, +        data: { confirm: h.t('compliance_controls.actions.destroy_confirm') } +      ) +    end + +    if h.policy(object).edit? +      links << Link.new( +        content: h.t('compliance_controls.actions.edit'), +        href:  h.edit_compliance_control_set_path(object.compliance_control_set.id, object.id) +      ) +    end +    links +  end + +end diff --git a/app/models/journey_pattern_control/duplicates.rb b/app/models/journey_pattern_control/duplicates.rb new file mode 100644 index 000000000..78ca07e90 --- /dev/null +++ b/app/models/journey_pattern_control/duplicates.rb @@ -0,0 +1,13 @@ +module JourneyPatternControl +  class Duplicates < ComplianceControl + +    @@default_criticity = :warning +    @@default_code = "3-JourneyPattern-1" + +    after_initialize do +      self.name = self.class.name +      self.code = @@default_code +      self.criticity = @@default_criticity +    end +  end +end diff --git a/app/models/route_control/duplicates.rb b/app/models/route_control/duplicates.rb index 803ac063e..379d7cf98 100644 --- a/app/models/route_control/duplicates.rb +++ b/app/models/route_control/duplicates.rb @@ -9,6 +9,5 @@ module RouteControl        self.code = @@default_code        self.criticity = @@default_criticity      end -    end  end diff --git a/app/models/route_control/speed.rb b/app/models/route_control/speed.rb new file mode 100644 index 000000000..fb07b5c87 --- /dev/null +++ b/app/models/route_control/speed.rb @@ -0,0 +1,15 @@ +module VehicleJourneyControl +  class Speed < ComplianceControl + +    hstore_accessor :control_attributes, minimum: :integer, maximum: :integer + +    @@default_criticity = :warning +    @@default_code = "3-VehicleJourney-2" + +    after_initialize do +      self.name = self.class.name +      self.code = @@default_code +      self.criticity = @@default_criticity +    end +  end +end diff --git a/app/models/route_control/time_table.rb b/app/models/route_control/time_table.rb new file mode 100644 index 000000000..911807ba9 --- /dev/null +++ b/app/models/route_control/time_table.rb @@ -0,0 +1,13 @@ +module VehicleJourneyControl +  class TimeTable < ComplianceControl + +    @@default_criticity = :error +    @@default_code = "3-VehicleJourney-4" + +    after_initialize do +      self.name = self.class.name +      self.code = @@default_code +      self.criticity = @@default_criticity +    end +  end +end diff --git a/app/models/route_control/vehicle_journey_at_stops.rb b/app/models/route_control/vehicle_journey_at_stops.rb new file mode 100644 index 000000000..02a43fb10 --- /dev/null +++ b/app/models/route_control/vehicle_journey_at_stops.rb @@ -0,0 +1,13 @@ +module VehicleJourneyControl +  class VehicleJourneyAtStops < ComplianceControl + +    @@default_criticity = :error +    @@default_code = "3-VehicleJourney-5" + +    after_initialize do +      self.name = self.class.name +      self.code = @@default_code +      self.criticity = @@default_criticity +    end +  end +end diff --git a/app/models/routing_constaint_zone_control/unactivated_stop_point.rb b/app/models/routing_constaint_zone_control/unactivated_stop_point.rb new file mode 100644 index 000000000..92a1d1a58 --- /dev/null +++ b/app/models/routing_constaint_zone_control/unactivated_stop_point.rb @@ -0,0 +1,13 @@ +module RoutingConstaintZoneControl +  class UnactivatedStopPoint < ComplianceControl + +    @@default_criticity = :warning +    @@default_code = "3-ITL-1" + +    after_initialize do +      self.name = self.class.name +      self.code = @@default_code +      self.criticity = @@default_criticity +    end +  end +end diff --git a/app/models/vechicle_journey_control/delta.rb b/app/models/vechicle_journey_control/delta.rb new file mode 100644 index 000000000..d4e1e6eca --- /dev/null +++ b/app/models/vechicle_journey_control/delta.rb @@ -0,0 +1,15 @@ +module VehicleJourneyControl +  class Delta < ComplianceControl + +    hstore_accessor :control_attributes, delta: :integer + +    @@default_criticity = :warning +    @@default_code = "3-VehicleJourney-3" + +    after_initialize do +      self.name = self.class.name +      self.code = @@default_code +      self.criticity = @@default_criticity +    end +  end +end diff --git a/app/models/vechicle_journey_control/waiting_time.rb b/app/models/vechicle_journey_control/waiting_time.rb new file mode 100644 index 000000000..a7e90b6ac --- /dev/null +++ b/app/models/vechicle_journey_control/waiting_time.rb @@ -0,0 +1,13 @@ +module VehicleJourneyControl +  class WatingTime < ComplianceControl + +    @@default_criticity = :warning +    @@default_code = "3-VehicleJourney-1" + +    after_initialize do +      self.name = self.class.name +      self.code = @@default_code +      self.criticity = @@default_criticity +    end +  end +end diff --git a/app/policies/compliance_control_policy.rb b/app/policies/compliance_control_policy.rb new file mode 100644 index 000000000..aeb0ab0a9 --- /dev/null +++ b/app/policies/compliance_control_policy.rb @@ -0,0 +1,19 @@ +class ComplianceControlPolicy < ApplicationPolicy +  class Scope < Scope +    def resolve +      scope +    end +  end + +  def destroy? +    organisation_match? && user.has_permission?('compliance_controls.destroy') +  end + +  def create? +    user.has_permission?('compliance_controls.create') +  end + +  def update? +    organisation_match? && user.has_permission?('compliance_controls.update') +  end +end diff --git a/app/views/compliance_control_sets/index.html.slim b/app/views/compliance_control_sets/index.html.slim index 16879af5a..fa85c38f7 100644 --- a/app/views/compliance_control_sets/index.html.slim +++ b/app/views/compliance_control_sets/index.html.slim @@ -45,7 +45,6 @@                  ) \                ],                      sortable: true, -                    links: [:show],                      cls: 'table has-filter has-search' diff --git a/app/views/compliance_controls/_form.html.slim b/app/views/compliance_controls/_form.html.slim new file mode 100644 index 000000000..1377ed12b --- /dev/null +++ b/app/views/compliance_controls/_form.html.slim @@ -0,0 +1,12 @@ += simple_form_for [@compliance_control_set, @compliance_control], html: { class: 'form-horizontal', id: 'compliance_control_form' }, wrapper: :horizontal_form do |f| +  .row +    .col-lg-12 +      = f.input :name +      = f.input :type +      = f.input :code +      = f.input :criticity +      = f.input :comment + +  .separator + +  = f.button :submit, t('actions.submit'), class: 'btn btn-default formSubmitr', form: 'compliance_control_form' diff --git a/app/views/compliance_controls/index.html.slim b/app/views/compliance_controls/index.html.slim index e69de29bb..fd1293837 100644 --- a/app/views/compliance_controls/index.html.slim +++ b/app/views/compliance_controls/index.html.slim @@ -0,0 +1,44 @@ +/ PageHeader +- header_params = ['jeux-de-donnees', +        t('compliance_controls.index.title'), +        ''] +- header_params << link_to(t('compliance_controls.actions.new'), new_compliance_control_set_compliance_control_path(@compliance_control_set), class: 'btn btn-default')  if policy(ComplianceControl).create? += pageheader(*header_params) do + +  .row.mb-sm +    .col-lg-12.text-right + +.page_content +  .container-fluid +    .row +      .col-lg-12 +        /= render 'filters' +      .row +        .col-lg-12 +          .select_table +            = table_builder_2 @compliance_controls, +                    [ \ +                TableBuilderHelper::Column.new( \ +                  key: :code, \ +                  attribute: 'code' \ +                ), \ +                TableBuilderHelper::Column.new( \ +                  key: :name, \ +                  attribute: 'name', \ +                  link_to: lambda do |compliance_control| \ +                      compliance_control_set_compliance_control_path(@compliance_control_set, compliance_control) \ +                    end \ +                ), \ +                TableBuilderHelper::Column.new( \ +                  key: :criticity, \ +                  attribute: 'criticity' \ +                ), \ +                TableBuilderHelper::Column.new( \ +                  key: :comment, \ +                  attribute: 'comment' \ +                ), \ +              ], +              sortable: true, +              cls: 'table has-filter has-search' + + diff --git a/app/views/compliance_controls/new.html.slim b/app/views/compliance_controls/new.html.slim index e69de29bb..0651461cb 100644 --- a/app/views/compliance_controls/new.html.slim +++ b/app/views/compliance_controls/new.html.slim @@ -0,0 +1,9 @@ += pageheader 'compliance-control', +        t('compliance_control.index.new') + + +.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/config/locales/compliance_controls.en.yml b/config/locales/compliance_controls.en.yml index 78073f047..bad190b56 100644 --- a/config/locales/compliance_controls.en.yml +++ b/config/locales/compliance_controls.en.yml @@ -1,30 +1,83 @@ -fr: +en:    compliance_controls: -    route_control: +    actions: +      new: Add a new compliance control +      edit: Edit this compliance control +      destroy: Remove this compliance control +      destroy_confirm: Are you sure you want destroy this compliance control? +    show: +      title: Compliance control +    index: +      title: Compliance control +    new: +      title: Add a new compliance control +    edit: +      title: Update compliance control +  activerecord: +    models: +      compliance_control: compliance control +    attributes: +      compliance_control: +        name: Name +        code: Code +    route:        zdl_stop_area:          messages: -          3_route_1: L'itinéraire % dessert successivement les arrêts % % et % % de la même zone de lieu -        description: Deux arrêts d’une même ZDL ne peuvent pas se succéder dans un itinéraire +          3_route_1: The route with % objectid connect the stop points % % et % % which belong to the same ZDL +        description: Two stop points which belong to the same ZDL cannot follow one another in a route        opposite_route:          messages: -          3_route_2: L'itinéraire {objectId} référence un itinéraire retour % incohérent +          3_route_2: The route with % objectid references an incoherent oppposite route : %          description: | -          'Si l'itinéraire référence un itinéraire inverse, celui-ci doit : -            - référencer l'itinéraire inverse -            - avoir un sens opposé à l'itinéraire testé' +          'If the route has an opposite route, it must : +            - reference the opposite route +            - have an opposite route in relation with the tested route'        duplicates:          messages: -          3_route_4: L'itinéraire % est identique à l'itinéraire % -        description: 2 itinéraires ne doivent pas desservir strictement les mêmes arrêts dans le même ordre avec les mêmes critères de monté/descente +          3_route_4: The route with % objectid is identical with another route : % +        description: 2 routes cannot connect the same stop points with the same order and the same boarding and alighting characteristics        minimum_length:          messages: -          3_route_6: L'itinéraire % ne dessert pas assez d'arrêts (minimum 2 requis) -        description: Un itinéraire doit référencer au moins 2 arrêts +          3_route_6: The route with % objectid does not connect enough stop points (required 2 stop points) +        description: A route must have at least 2 stop points        omnibus_journey_pattern:          messages: -          3_route_9: L'itinéraire % n'a aucune mission desservant l'ensemble de ses arrêts -        description: Une mission de l'itinéraire devrait desservir l'ensemble des arrêts de celui-ci +          3_route_9: The route with % objectid does not have a journey pattern that connect all of its stop points +        description: A journey pattern of a route should connect all of a route's stop points        unactivated_stop_point:          messages:            3_route_10: L'itinéraire % référence un arrêt (ZDEp) désactivé % (%)          description: Les arrêts d'un itinéraire ne doivent pas être désactivés +      journey_pattern: +        duplicates: +          messages: +            3_journeypattern_1: The journey pattern with objectid % is identical with another one : % +          description: Two journey patterns belonging to the same line must not connect the same stop points in the same order +      vehicle_journey: +        waiting_time: +          messages: +            3_vehiclejourney_1: On the following vehicle journey : %, the waiting time % a this stop point : % (%) is greater than the threshold (%) +          description: The waiting time at a specific stop point cannot be too big +        speed: +          messages: +            3_vehiclejourney_2_1: On the following vehicle journey : %, the computed speed % between the stop points % (%) and % (%) is greater than the threshold (%) +            3_vehiclejourney_2_2: On the following vehicle journey : %, the computed speed % between the stop points % (%) and % (%) is smaller than the threshold (%) +          description: The speed between 2 stop points should be confined between two thresholds +        delta: +          messages: +            3_vehiclejourney_3: The travel time on the vehicle journey with % objectid between the stop points % (%) and % (% is too far off % the average waiting on the journey pattern +          description: The travel time between two following stop points must be close to all the vehicle journey of a journey pattern +        time_table: +          messages: +            3_vehiclejourney_4: The vehicle journey with % objectid does not have a timetable +          description: A vehicle journey must have at least one timetable +        vehicle_journey_at_stops: +          messages: +            3_vehiclejourney_5_1: The vehicle journey with % objectid has an arrival time % greater than the departure time % at the stop point % (%) +            3_vehiclejourney_5_2: The vehicle journey with % objectid has an departure time % at stop point % (%) greater than the arrival % at the next stop point +          description: The arrival time of a stop point must be smaller than the departure time of this stop point AND the departure time of the stop points must be in chronological order +      routing_constraint_zone: +        vehicle_journey_at_stops: +          messages: +            3_itl_1: The Routing Constraint Zone % references an unactivated stop point (ZDEp) : % (%) +          description: The stop points of a Routing Constraint Zone must be activated diff --git a/config/locales/compliance_controls.fr.yml b/config/locales/compliance_controls.fr.yml index d4f2c608e..0c96265ac 100644 --- a/config/locales/compliance_controls.fr.yml +++ b/config/locales/compliance_controls.fr.yml @@ -1,13 +1,35 @@  fr:    compliance_controls: -    route_control: +    actions: +      new: Ajouter un jeu de controle +      edit: Editer un jeu de controle +      destroy: Supprimer un jeu de controle +      destroy_confirm: Etes vous sûr de vouloir détruire le jeu de controle ? +    show: +      title: Jeu de controle +    index: +      title: Jeux de controles +    new: +      title: Ajouter un jeu de controle +    edit: +      title: Editer le jeu de controle +  activerecord: +    models: +      compliance_control: Jeu de controle +    attributes: +      compliance_control: +        name: Nom +        criticity: Criticité +        comment: Commentaire +        code: Code +    route:        zdl_stop_area:          messages:            3_route_1: L'itinéraire % dessert successivement les arrêts % % et % % de la même zone de lieu          description: Deux arrêts d’une même ZDL ne peuvent pas se succéder dans un itinéraire        opposite_route:          messages: -          3_route_2: L'itinéraire {objectId} référence un itinéraire retour % incohérent +          3_route_2: L'itinéraire % référence un itinéraire retour % incohérent          description: |            'Si l'itinéraire référence un itinéraire inverse, celui-ci doit :              - référencer l'itinéraire inverse @@ -26,5 +48,38 @@ fr:          description: Une mission de l'itinéraire devrait desservir l'ensemble des arrêts de celui-ci        unactivated_stop_point:          messages: -          3_route_10: L'itinéraire % référence un arrêt (ZDEp) désactivé % (%)  +          3_route_10: L'itinéraire % référence un arrêt (ZDEp) désactivé % (%)          description: Les arrêts d'un itinéraire ne doivent pas être désactivés +      journey_pattern: +        duplicates: +          messages: +            3_journeypattern_1: La mission % est identique à la mission % +          description: Deux missions de la même ligne ne doivent pas desservir les mêmes arrêts dans le même ordre +      vehicle_journey: +        waiting_time: +          messages: +            3_vehiclejourney_1: Sur la course %, le temps d'attente % à l'arrêt % (%) est supérieur au seuil toléré (%) +          description: La durée d’attente à un arrêt ne doit pas être trop grande +        speed: +          messages: +            3_vehiclejourney_2_1: Sur la course %, la vitesse calculée % entre les arrêts % (%) et % (%) est supérieur au seuil toléré (%) +            3_vehiclejourney_2_2: Sur la course %, la vitesse calculée % entre les arrêts % (%) et % (%) est inférieur au seuil toléré (%) +          description: La vitesse entre deux arrêts doit être dans une fourchette paramétrable +        delta: +          messages: +            3_vehiclejourney_3: Le temps de parcours sur la course % entre les arrêts % (%) et % (% s'écarte de % du temps moyen constaté sur la mission +          description: Les temps de parcours entre 2 arrêts successifs doivent être similaires pour toutes les courses d’une même mission +        time_table: +          messages: +            3_vehiclejourney_4: La course % n'a pas de calendrier d'application +          description: Une course doit avoir au moins un calendrier d’application +        vehicle_journey_at_stops: +          messages: +            3_vehiclejourney_5_1: La course % a un horaire d'arrivé % supérieur à l'horaire de départ % à l'arrêt {nomArrêt} (%) +            3_vehiclejourney_5_2: La course % a un horaire de départ % à l'arrêt {nomArrêt} (%) supérieur à l'horaire d'arrivé % à l'arrêt suivant +          description: L'horaire d'arrivée à un arrêt doit être antérieur à l'horaire de départ de cet arrêt ET les horaires de départ aux arrêts doivent être dans l'ordre chronologique croissant. +      routing_constraint_zone: +        vehicle_journey_at_stops: +          messages: +            3_itl_1: L'ITL % référence un arrêt (ZDEp) désactivé % (%) +          description: Les arrêts d'une ITL ne doivent pas être désactivés diff --git a/spec/policies/compliance_control_policy_spec.rb b/spec/policies/compliance_control_policy_spec.rb new file mode 100644 index 000000000..d7c80143d --- /dev/null +++ b/spec/policies/compliance_control_policy_spec.rb @@ -0,0 +1,28 @@ +require 'rails_helper' + +RSpec.describe ComplianceControlPolicy do + +  let(:user) { User.new } + +  subject { described_class } + +  permissions ".scope" do +    pending "add some examples to (or delete) #{__FILE__}" +  end + +  permissions :show? do +    pending "add some examples to (or delete) #{__FILE__}" +  end + +  permissions :create? do +    pending "add some examples to (or delete) #{__FILE__}" +  end + +  permissions :update? do +    pending "add some examples to (or delete) #{__FILE__}" +  end + +  permissions :destroy? do +    pending "add some examples to (or delete) #{__FILE__}" +  end +end | 
