diff options
| author | Zog | 2017-12-27 13:42:39 +0100 | 
|---|---|---|
| committer | Zog | 2017-12-27 13:42:39 +0100 | 
| commit | 607fa5e03289a10b60a773bc40af38f1d721bbea (patch) | |
| tree | b27f8e9825e79675c606571ff7efb9953b8a4917 | |
| parent | 78e2d256f895c1014a3def5f2ef6509086755215 (diff) | |
| download | chouette-core-607fa5e03289a10b60a773bc40af38f1d721bbea.tar.bz2 | |
Refs #5407 @2h; Model implementation
- Link PurchaseWindows to VehicleJourneys in the model
- Add an autocompletion endpoint
16 files changed, 99 insertions, 25 deletions
| diff --git a/app/controllers/autocomplete_purchase_windows_controller.rb b/app/controllers/autocomplete_purchase_windows_controller.rb new file mode 100644 index 000000000..70dc5a346 --- /dev/null +++ b/app/controllers/autocomplete_purchase_windows_controller.rb @@ -0,0 +1,12 @@ +class AutocompletePurchaseWindowsController < ChouetteController +  respond_to :json, :only => [:index] + +  requires_feature :purchase_windows + +  include ReferentialSupport + +  protected +  def collection +    @purchase_windows = referential.purchase_windows.search(params[:q]).result.paginate(page: params[:page]) +  end +end diff --git a/app/javascript/vehicle_journeys/actions/index.js b/app/javascript/vehicle_journeys/actions/index.js index d5eda629c..9a5ca940b 100644 --- a/app/javascript/vehicle_journeys/actions/index.js +++ b/app/javascript/vehicle_journeys/actions/index.js @@ -107,7 +107,8 @@ const actions = {      type: 'SELECT_PURCHASE_WINDOW_MODAL',      selectedItem:{        id: selectedTT.id, -      comment: selectedTT.comment, +      name: selectedTT.name, +      color: selectedTT.color,        objectid: selectedTT.objectid      }    }), diff --git a/app/javascript/vehicle_journeys/components/Filters.js b/app/javascript/vehicle_journeys/components/Filters.js index db6707520..3bc4f7ff7 100644 --- a/app/javascript/vehicle_journeys/components/Filters.js +++ b/app/javascript/vehicle_journeys/components/Filters.js @@ -33,6 +33,7 @@ export default function Filters({filters, pagination, onFilter, onResetFilters,                  onSelect2Timetable={onSelect2Timetable}                  hasRoute={true}                  chunkURL={("/autocomplete_time_tables.json?route_id=" + String(window.route_id))} +                searchKey={"comment_or_objectid_cont_any"}                  filters={filters}                  isFilter={true}                  /> @@ -165,4 +166,4 @@ Filters.propTypes = {    onSelect2Timetable: PropTypes.func.isRequired,    onSelect2JourneyPattern: PropTypes.func.isRequired,    onSelect2VehicleJourney: PropTypes.func.isRequired -}
\ No newline at end of file +} diff --git a/app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js b/app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js index cf51e50f0..5465127e8 100644 --- a/app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js +++ b/app/javascript/vehicle_journeys/components/tools/PurchaseWindowsEditVehicleJourney.js @@ -95,6 +95,7 @@ export default class PurchaseWindowsEditVehicleJourney extends Component {                                        <TimetableSelect2                                          onSelect2Timetable={this.props.onSelect2Timetable}                                          chunkURL={'/autocomplete_purchase_windows.json'} +                                        searchKey={"name_or_objectid_cont_any"}                                          isFilter={false}                                        />                                      </div> diff --git a/app/javascript/vehicle_journeys/components/tools/TimetablesEditVehicleJourney.js b/app/javascript/vehicle_journeys/components/tools/TimetablesEditVehicleJourney.js index 6629135dd..26377c0d5 100644 --- a/app/javascript/vehicle_journeys/components/tools/TimetablesEditVehicleJourney.js +++ b/app/javascript/vehicle_journeys/components/tools/TimetablesEditVehicleJourney.js @@ -67,7 +67,7 @@ export default class TimetablesEditVehicleJourney extends Component {                                    <div className='wrapper'>                                      <div> <a href={this.timeTableURL(tt)} target="_blank">{tt.comment}</a> </div>                                      { -                                      this.props.editMode &&  +                                      this.props.editMode &&                                        <div>                                          <a                                            href='#' @@ -85,13 +85,14 @@ export default class TimetablesEditVehicleJourney extends Component {                                  </div>                                )}                                { -                                this.props.editMode &&  +                                this.props.editMode &&                                  <div className='nested-fields'>                                    <div className='wrapper'>                                      <div>                                        <TimetableSelect2                                          onSelect2Timetable={this.props.onSelect2Timetable}                                          chunkURL={'/autocomplete_time_tables.json'} +                                        searchKey={"comment_or_objectid_cont_any"}                                          isFilter={false}                                        />                                      </div> @@ -103,7 +104,7 @@ export default class TimetablesEditVehicleJourney extends Component {                          </div>                        </div>                        { -                        this.props.editMode &&  +                        this.props.editMode &&                          <div className='modal-footer'>                            <button                              className='btn btn-link' @@ -144,4 +145,4 @@ TimetablesEditVehicleJourney.propTypes = {    onDeleteCalendarModal: PropTypes.func.isRequired,    onSelect2Timetable: PropTypes.func.isRequired,    disabled: PropTypes.bool.isRequired -}
\ No newline at end of file +} diff --git a/app/javascript/vehicle_journeys/components/tools/select2s/TimetableSelect2.js b/app/javascript/vehicle_journeys/components/tools/select2s/TimetableSelect2.js index 19c183839..eb8651be2 100644 --- a/app/javascript/vehicle_journeys/components/tools/select2s/TimetableSelect2.js +++ b/app/javascript/vehicle_journeys/components/tools/select2s/TimetableSelect2.js @@ -31,12 +31,10 @@ export default class BSelect4 extends Component {              url: origin + path + this.props.chunkURL,              dataType: 'json',              delay: '500', -            data: function(params) { -              return { -                q: { -                  comment_or_objectid_cont_any: params.term -                } -              }; +            data: (params) => { +              let q = {} +              q[this.props.searchKey] = params.term +              return {q}              },              processResults: function(data, params) {                return { @@ -44,7 +42,7 @@ export default class BSelect4 extends Component {                    item => _.assign(                      {},                      item, -                    {text: '<strong>' + "<span class='fa fa-circle' style='color:" + (item.color ? item.color : '#4B4B4B') + "'></span> " + item.comment + ' - ' + item.short_id + '</strong><br/><small>' + (item.day_types ? item.day_types.match(/[A-Z]?[a-z]+/g).join(', ') : "") + '</small>'} +                    {text: '<strong>' + "<span class='fa fa-circle' style='color:" + (item.color ? item.color : '#4B4B4B') + "'></span> " + (item.comment || item.name) + ' - ' + item.short_id + '</strong><br/><small>' + (item.day_types ? item.day_types.match(/[A-Z]?[a-z]+/g).join(', ') : "") + '</small>'}                    )                  )                }; @@ -62,4 +60,4 @@ export default class BSelect4 extends Component {  const formatRepo = (props) => {    if(props.text) return props.text -}
\ No newline at end of file +} diff --git a/app/models/calendar/period.rb b/app/models/calendar/period.rb index 1c423dfcc..56ab722fe 100644 --- a/app/models/calendar/period.rb +++ b/app/models/calendar/period.rb @@ -1,5 +1,5 @@  class Calendar < ActiveRecord::Base -   +    class Period      include ActiveAttr::Model diff --git a/app/models/chouette/purchase_window.rb b/app/models/chouette/purchase_window.rb index 9f68d4408..742c18141 100644 --- a/app/models/chouette/purchase_window.rb +++ b/app/models/chouette/purchase_window.rb @@ -11,10 +11,12 @@ module Chouette      has_paper_trail      belongs_to :referential +    has_and_belongs_to_many :vehicle_journeys, :class_name => 'Chouette::VehicleJourney'      validates_presence_of :name, :referential      scope :contains_date, ->(date) { where('date ? <@ any (date_ranges)', date) } +    scope :text_search, ->(q) { where("unaccent(name) ILIKE unaccent(:q) OR objectid ILIKE :q", q: "%#{q}%")}      def self.ransackable_scopes(auth_object = nil)        [:contains_date] diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 8a2435fbc..61aa77d27 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -23,6 +23,7 @@ module Chouette      belongs_to :journey_pattern      has_and_belongs_to_many :footnotes, :class_name => 'Chouette::Footnote' +    has_and_belongs_to_many :purchase_windows, :class_name => 'Chouette::PurchaseWindow'      validates_presence_of :route      validates_presence_of :journey_pattern @@ -40,11 +41,6 @@ module Chouette      before_validation :set_default_values,        :calculate_vehicle_journey_at_stop_day_offset -    # XXX -    def purchase_windows -      Chouette::PurchaseWindow.limit(2) -    end -      # TODO: Remove this validator      # We've eliminated this validation because it prevented vehicle journeys      # from being saved with at-stops having a day offset greater than 0, diff --git a/app/models/concerns/period_support.rb b/app/models/concerns/period_support.rb index f512c4e89..e17451fe4 100644 --- a/app/models/concerns/period_support.rb +++ b/app/models/concerns/period_support.rb @@ -7,7 +7,7 @@ module PeriodSupport      def init_date_ranges        self.date_ranges ||= []      end -     +      ### Calendar::Period      # Required by coocon      def build_period @@ -77,4 +77,4 @@ module PeriodSupport      private :clear_periods    end -end
\ No newline at end of file +end diff --git a/app/views/autocomplete_purchase_windows/index.rabl b/app/views/autocomplete_purchase_windows/index.rabl new file mode 100644 index 000000000..1d0287602 --- /dev/null +++ b/app/views/autocomplete_purchase_windows/index.rabl @@ -0,0 +1,12 @@ +collection @purchase_windows, :object_root => false + +node do |window| +  { +    :id => window.id, +    :name => window.name, +    :objectid => window.objectid, +    :color => window.color, +    :short_id => window.get_objectid.short_id, +    :text => "<strong><span class='fa fa-circle' style='color:" + (window.color ? window.color : '#4b4b4b') + "'></span> " + window.name + " - " + window.get_objectid.short_id + "</strong>" +  } +end diff --git a/config/routes.rb b/config/routes.rb index e05f5d365..22ff58724 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -112,6 +112,7 @@ ChouetteIhm::Application.routes.draw do      resources :autocomplete_stop_areas, only: [:show, :index] do        get 'around', on: :member      end +    resources :autocomplete_purchase_windows, only: [:index]       get :select_compliance_control_set      post :validate, on: :member      resources :autocomplete_time_tables, only: [:index] diff --git a/db/migrate/20171227113809_create_join_table_purchase_windows_vehicle_journeys.rb b/db/migrate/20171227113809_create_join_table_purchase_windows_vehicle_journeys.rb new file mode 100644 index 000000000..822fcc33a --- /dev/null +++ b/db/migrate/20171227113809_create_join_table_purchase_windows_vehicle_journeys.rb @@ -0,0 +1,10 @@ +class CreateJoinTablePurchaseWindowsVehicleJourneys < ActiveRecord::Migration +  def change +    create_join_table :purchase_windows, :vehicle_journeys do |t| +      t.belongs_to :purchase_window +      t.belongs_to :vehicle_journey +      # t.index [:purchase_window_id, :vehicle_journey_id] +      # t.index [:vehicle_journey_id, :purchase_window_id] +    end +  end +end diff --git a/db/schema.rb b/db/schema.rb index 182df3159..3b0e4772c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,12 +11,12 @@  #  # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171220164059) do +ActiveRecord::Schema.define(version: 20171227113809) do    # These are extensions that must be enabled in order to support this database    enable_extension "plpgsql" -  enable_extension "postgis"    enable_extension "hstore" +  enable_extension "postgis"    enable_extension "unaccent"    create_table "access_links", id: :bigserial, force: :cascade do |t| @@ -403,9 +403,9 @@ ActiveRecord::Schema.define(version: 20171220164059) do      t.string   "type"      t.integer  "parent_id",             limit: 8      t.string   "parent_type" +    t.datetime "notified_parent_at"      t.integer  "current_step",                    default: 0      t.integer  "total_steps",                     default: 0 -    t.datetime "notified_parent_at"      t.string   "creator"    end @@ -586,6 +586,11 @@ ActiveRecord::Schema.define(version: 20171220164059) do    add_index "purchase_windows", ["referential_id"], name: "index_purchase_windows_on_referential_id", using: :btree +  create_table "purchase_windows_vehicle_journeys", id: false, force: :cascade do |t| +    t.integer "purchase_window_id" +    t.integer "vehicle_journey_id" +  end +    create_table "referential_clonings", id: :bigserial, force: :cascade do |t|      t.string   "status"      t.datetime "started_at" diff --git a/spec/controllers/autocomplete_purchase_windows_controller_spec.rb b/spec/controllers/autocomplete_purchase_windows_controller_spec.rb new file mode 100644 index 000000000..cea600ea8 --- /dev/null +++ b/spec/controllers/autocomplete_purchase_windows_controller_spec.rb @@ -0,0 +1,33 @@ +require 'rails_helper' + +RSpec.describe AutocompletePurchaseWindowsController, type: :controller do +  login_user + +  let(:referential) { Referential.first } +  let!(:window) { create :purchase_window, referential: referential, name: 'écolà militaire' } + +  describe 'GET #index' do +    it 'should be unauthorized' do +      expect { get(:index, referential_id: referential.id) }.to raise_error(FeatureChecker::NotAuthorizedError) +    end + +    with_feature "purchase_windows" do +      let(:request){ get(:index, referential_id: referential.id) } +      before do +        request +      end + +      it 'should be successful' do +        expect(response).to be_success +      end + +      context 'search by name' do +        let(:request){ get :index, referential_id: referential.id, q: {name_or_objectid_cont_any: 'écolà'}, :format => :json } +        it 'should be successful' do +          expect(response).to be_success +          expect(assigns(:purchase_windows)).to eq([window]) +        end +      end +    end +  end +end diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index ac9b21ceb..60ab2b818 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper'  describe Chouette::VehicleJourney, :type => :model do    it { is_expected.to be_versioned } +  it { should have_and_belong_to_many(:purchase_windows) }    it "must be valid with an at-stop day offset of 1" do      vehicle_journey = create( | 
