diff options
31 files changed, 252 insertions, 90 deletions
diff --git a/app/helpers/compliance_controls_helper.rb b/app/helpers/compliance_controls_helper.rb index 297ae3afa..abf909929 100644 --- a/app/helpers/compliance_controls_helper.rb +++ b/app/helpers/compliance_controls_helper.rb @@ -11,7 +11,7 @@ module ComplianceControlsHelper def compliance_control_metadatas(compliance_control) attributes = resource.class.dynamic_attributes - attributes.push(*resource.control_attributes.keys) if resource.respond_to? :control_attributes + attributes.push(*resource.control_attributes.keys) if resource&.control_attributes&.keys {}.tap do |hash| attributes.each do |attribute| @@ -19,4 +19,4 @@ module ComplianceControlsHelper end end end -end +end diff --git a/app/javascript/journey_patterns/actions/index.js b/app/javascript/journey_patterns/actions/index.js index 666157ea4..ea54f4e05 100644 --- a/app/javascript/journey_patterns/actions/index.js +++ b/app/javascript/journey_patterns/actions/index.js @@ -43,7 +43,7 @@ const actions = { }), updateCheckboxValue : (e, index) => ({ type : 'UPDATE_CHECKBOX_VALUE', - id : e.currentTarget.id, + position : e.currentTarget.id, index }), checkConfirmModal : (event, callback, stateChanged,dispatch) => { diff --git a/app/javascript/journey_patterns/components/CreateModal.js b/app/javascript/journey_patterns/components/CreateModal.js index 36b5740dc..946c13d9c 100644 --- a/app/javascript/journey_patterns/components/CreateModal.js +++ b/app/javascript/journey_patterns/components/CreateModal.js @@ -57,7 +57,7 @@ export default class CreateModal extends Component { <div className='row'> <div className='col-lg-6 col-md-6 col-sm-6 col-xs-6'> <div className='form-group'> - <label className='control-label is-required'>{I18n.attribute_name('journey_pattern', 'published_name')}c</label> + <label className='control-label is-required'>{I18n.attribute_name('journey_pattern', 'published_name')}</label> <input type='text' ref='published_name' @@ -120,4 +120,4 @@ CreateModal.propTypes = { onOpenCreateModal: PropTypes.func.isRequired, onModalClose: PropTypes.func.isRequired, onAddJourneyPattern: PropTypes.func.isRequired -}
\ No newline at end of file +} diff --git a/app/javascript/journey_patterns/components/JourneyPattern.js b/app/javascript/journey_patterns/components/JourneyPattern.js index d381b0d50..4eba80030 100644 --- a/app/javascript/journey_patterns/components/JourneyPattern.js +++ b/app/javascript/journey_patterns/components/JourneyPattern.js @@ -45,7 +45,7 @@ export default class JourneyPattern extends Component{ <input onChange = {(e) => this.props.onCheckboxChange(e)} type='checkbox' - id={sp.id} + id={sp.position} checked={sp.checked} disabled={(this.props.value.deletable || this.props.status.policy['journey_patterns.update'] == false || this.props.editMode == false) ? 'disabled' : ''} > diff --git a/app/javascript/journey_patterns/reducers/journeyPatterns.js b/app/javascript/journey_patterns/reducers/journeyPatterns.js index 6c38e9288..b046f2b38 100644 --- a/app/javascript/journey_patterns/reducers/journeyPatterns.js +++ b/app/javascript/journey_patterns/reducers/journeyPatterns.js @@ -22,7 +22,7 @@ const journeyPattern = (state = {}, action) =>{ } case 'UPDATE_CHECKBOX_VALUE': var updatedStopPoints = state.stop_points.map((s) => { - if (String(s.id) == action.id) { + if (String(s.position) == action.position) { return _.assign({}, s, {checked : !s.checked}) }else { return s diff --git a/app/javascript/time_tables/components/ConfirmModal.js b/app/javascript/time_tables/components/ConfirmModal.js index 4e8583bc0..e4219348d 100644 --- a/app/javascript/time_tables/components/ConfirmModal.js +++ b/app/javascript/time_tables/components/ConfirmModal.js @@ -2,7 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' -export default function ConfirmModal({dispatch, modal, onModalAccept, onModalCancel, timetable, metas}, {I18n}) { +export default function ConfirmModal({dispatch, modal, onModalAccept, onModalCancel, timetable, metas}) { return ( <div className={'modal fade ' + ((modal.type == 'confirm') ? 'in' : '')} id='ConfirmModal'> <div className='modal-container'> @@ -45,8 +45,4 @@ ConfirmModal.propTypes = { modal: PropTypes.object.isRequired, onModalAccept: PropTypes.func.isRequired, onModalCancel: PropTypes.func.isRequired -} - -ConfirmModal.contextTypes = { - I18n: PropTypes.object -} +}
\ No newline at end of file diff --git a/app/javascript/time_tables/components/ErrorModal.js b/app/javascript/time_tables/components/ErrorModal.js index 8af12f1d1..a512d28fd 100644 --- a/app/javascript/time_tables/components/ErrorModal.js +++ b/app/javascript/time_tables/components/ErrorModal.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import actions from '../actions' -export default function ErrorModal({dispatch, modal, onModalClose}, {I18n}) { +export default function ErrorModal({dispatch, modal, onModalClose}) { return ( <div className={'modal fade ' + ((modal.type == 'error') ? 'in' : '')} id='ErrorModal'> <div className='modal-container'> @@ -37,8 +37,4 @@ export default function ErrorModal({dispatch, modal, onModalClose}, {I18n}) { ErrorModal.propTypes = { modal: PropTypes.object.isRequired, onModalClose: PropTypes.func.isRequired -} - -ErrorModal.contextTypes = { - I18n: PropTypes.object -} +}
\ No newline at end of file diff --git a/app/javascript/time_tables/components/Metas.js b/app/javascript/time_tables/components/Metas.js index 08a6e26fe..d9746a379 100644 --- a/app/javascript/time_tables/components/Metas.js +++ b/app/javascript/time_tables/components/Metas.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types' import actions from '../actions' import TagsSelect2 from './TagsSelect2' -export default function Metas({metas, onUpdateDayTypes, onUpdateComment, onUpdateColor, onSelect2Tags, onUnselect2Tags}, {I18n}) { +export default function Metas({metas, onUpdateDayTypes, onUpdateComment, onUpdateColor, onSelect2Tags, onUnselect2Tags}) { let colorList = ["", "#9B9B9B", "#FFA070", "#C67300", "#7F551B", "#41CCE3", "#09B09C", "#3655D7", "#6321A0", "#E796C6", "#DD2DAA"] return ( <div className='form-horizontal'> @@ -134,8 +134,4 @@ Metas.propTypes = { onUpdateColor: PropTypes.func.isRequired, onSelect2Tags: PropTypes.func.isRequired, onUnselect2Tags: PropTypes.func.isRequired -} - -Metas.contextTypes = { - I18n: PropTypes.object -} +}
\ No newline at end of file diff --git a/app/javascript/time_tables/components/PeriodForm.js b/app/javascript/time_tables/components/PeriodForm.js index d17a246f7..36ed6cfdf 100644 --- a/app/javascript/time_tables/components/PeriodForm.js +++ b/app/javascript/time_tables/components/PeriodForm.js @@ -33,7 +33,7 @@ const makeYearsOptions = (yearSelected) => { return arr } -export default function PeriodForm({modal, timetable, metas, onOpenAddPeriodForm, onClosePeriodForm, onUpdatePeriodForm, onValidatePeriodForm}, {I18n}) { +export default function PeriodForm({modal, timetable, metas, onOpenAddPeriodForm, onClosePeriodForm, onUpdatePeriodForm, onValidatePeriodForm}) { return ( <div className="container-fluid"> <div className="row"> @@ -143,8 +143,4 @@ PeriodForm.propTypes = { onUpdatePeriodForm: PropTypes.func.isRequired, onValidatePeriodForm: PropTypes.func.isRequired, timetable: PropTypes.object.isRequired -} - -PeriodForm.contextTypes = { - I18n: PropTypes.object -} +}
\ No newline at end of file diff --git a/app/javascript/time_tables/components/PeriodManager.js b/app/javascript/time_tables/components/PeriodManager.js index 6b817fe73..6871d0b9b 100644 --- a/app/javascript/time_tables/components/PeriodManager.js +++ b/app/javascript/time_tables/components/PeriodManager.js @@ -55,7 +55,7 @@ export default class PeriodManager extends Component { type='button' onClick={() => this.props.onOpenEditPeriodForm(this.props.value, this.props.index)} > - Modifier + {I18n.t('actions.edit')} </button> </li> <li className='delete-action'> @@ -64,7 +64,7 @@ export default class PeriodManager extends Component { onClick={() => this.props.onDeletePeriod(this.props.index, this.props.metas.day_types)} > <span className='fa fa-trash'></span> - Supprimer + {I18n.t('actions.destroy')} </button> </li> </ul> @@ -79,8 +79,4 @@ PeriodManager.propTypes = { currentDate: PropTypes.object.isRequired, onDeletePeriod: PropTypes.func.isRequired, onOpenEditPeriodForm: PropTypes.func.isRequired -} - -PeriodManager.contextTypes = { - I18n: PropTypes.object }
\ No newline at end of file diff --git a/app/javascript/time_tables/components/TagsSelect2.js b/app/javascript/time_tables/components/TagsSelect2.js index 43cf59fdf..dd8d6e9c0 100644 --- a/app/javascript/time_tables/components/TagsSelect2.js +++ b/app/javascript/time_tables/components/TagsSelect2.js @@ -40,7 +40,7 @@ export default class TagsSelect2 extends Component { allowClear: true, theme: 'bootstrap', width: '100%', - placeholder: this.context.I18n.t('time_tables.edit.select2.tag.placeholder'), + placeholder: I18n.t('time_tables.edit.select2.tag.placeholder'), ajax: { url: origin + path + '/tags.json', dataType: 'json', @@ -74,8 +74,4 @@ export default class TagsSelect2 extends Component { const formatRepo = (props) => { if(props.name) return props.name -} - -TagsSelect2.contextTypes = { - I18n: PropTypes.object }
\ No newline at end of file diff --git a/app/javascript/time_tables/components/Timetable.js b/app/javascript/time_tables/components/Timetable.js index 991f31435..3779fa2d0 100644 --- a/app/javascript/time_tables/components/Timetable.js +++ b/app/javascript/time_tables/components/Timetable.js @@ -31,11 +31,11 @@ export default class Timetable extends Component { <div className="table table-2entries mb-sm"> <div className="t2e-head w20"> <div className="th"> - <div className="strong">{this.context.I18n.t('time_tables.edit.synthesis')}</div> + <div className="strong">{I18n.t('time_tables.edit.synthesis')}</div> </div> - <div className="td"><span>{this.context.I18n.t('time_tables.edit.day_types')}</span></div> - <div className="td"><span>{this.context.I18n.t('time_tables.edit.periods')}</span></div> - <div className="td"><span>{this.context.I18n.t('time_tables.edit.exceptions')}</span></div> + <div className="td"><span>{I18n.t('time_tables.edit.day_types')}</span></div> + <div className="td"><span>{I18n.t('time_tables.edit.periods')}</span></div> + <div className="td"><span>{I18n.t('time_tables.edit.exceptions')}</span></div> </div> <div className="t2e-item-list w80"> <div> @@ -109,8 +109,4 @@ Timetable.propTypes = { onDeletePeriod: PropTypes.func.isRequired, onExcludeDateFromPeriod: PropTypes.func.isRequired, onIncludeDateInPeriod: PropTypes.func.isRequired -} - -Timetable.contextTypes = { - I18n: PropTypes.object -} +}
\ No newline at end of file diff --git a/app/javascript/vehicle_journeys/actions/index.js b/app/javascript/vehicle_journeys/actions/index.js index e00e9b1b0..537dcfc06 100644 --- a/app/javascript/vehicle_journeys/actions/index.js +++ b/app/javascript/vehicle_journeys/actions/index.js @@ -113,14 +113,9 @@ const actions = { type : 'EDIT_PURCHASE_WINDOWS_VEHICLEJOURNEY_MODAL', vehicleJourneys }), - selectPurchaseWindowsModal: (selectedWindow) =>({ + selectPurchaseWindowsModal: (selectedItem) =>({ type: 'SELECT_PURCHASE_WINDOW_MODAL', - selectedItem:{ - id: selectedWindow.id, - name: selectedWindow.name, - color: selectedWindow.color, - objectid: selectedWindow.objectid - } + selectedItem }), addSelectedPurchaseWindow: () => ({ type: 'ADD_SELECTED_PURCHASE_WINDOW' diff --git a/app/models/chouette/vehicle_journey.rb b/app/models/chouette/vehicle_journey.rb index 525036077..be05d4053 100644 --- a/app/models/chouette/vehicle_journey.rb +++ b/app/models/chouette/vehicle_journey.rb @@ -346,6 +346,33 @@ module Chouette end end + def fill_passing_time_at_borders + encountered_borders = [] + previous_stop = nil + vehicle_journey_at_stops.each do |vjas| + sp = vjas.stop_point + if sp.stop_area.area_type == "border" + encountered_borders << vjas + else + if encountered_borders.any? + before_cost = journey_pattern.costs_between previous_stop.stop_point, encountered_borders.first.stop_point + after_cost = journey_pattern.costs_between encountered_borders.last.stop_point, sp + if before_cost && before_cost[:distance] && after_cost && after_cost[:distance] + before_distance = before_cost[:distance].to_f + after_distance = after_cost[:distance].to_f + time = previous_stop.departure_time + before_distance / (before_distance+after_distance) * (vjas.arrival_time - previous_stop.departure_time) + encountered_borders.each do |b| + b.update_attribute :arrival_time, time + b.update_attribute :departure_time, time + end + end + encountered_borders = [] + end + previous_stop = vjas + end + end + end + def self.matrix(vehicle_journeys) Hash[*VehicleJourneyAtStop.where(vehicle_journey_id: vehicle_journeys.pluck(:id)).map do |vjas| [ "#{vjas.vehicle_journey_id}-#{vjas.stop_point_id}", vjas] diff --git a/app/models/concerns/custom_fields_support.rb b/app/models/concerns/custom_fields_support.rb index ef6b4f4af..017f496a8 100644 --- a/app/models/concerns/custom_fields_support.rb +++ b/app/models/concerns/custom_fields_support.rb @@ -12,7 +12,7 @@ module CustomFieldsSupport end def method_missing method_name, *args - if method_name =~ /custom_field_*/ && !@custom_fields_initialized + if method_name =~ /custom_field_*/ && method_name.to_sym != :custom_field_values && !@custom_fields_initialized initialize_custom_fields send method_name, *args else diff --git a/app/views/autocomplete_purchase_windows/index.rabl b/app/views/autocomplete_purchase_windows/index.rabl index 1d0287602..bdc513c31 100644 --- a/app/views/autocomplete_purchase_windows/index.rabl +++ b/app/views/autocomplete_purchase_windows/index.rabl @@ -2,11 +2,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>" + id: window.id, + name: window.name, + objectid: window.objectid, + color: window.color, + short_id: window.get_objectid.short_id, + bounding_dates: window.bounding_dates, + 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/app/views/referentials/select_compliance_control_set.html.slim b/app/views/referentials/select_compliance_control_set.html.slim index 3550bb202..7be82364d 100644 --- a/app/views/referentials/select_compliance_control_set.html.slim +++ b/app/views/referentials/select_compliance_control_set.html.slim @@ -8,7 +8,7 @@ .row .col-lg-12 .form-group - = label_tag 'name', nil, class: 'string required col-sm-4 col-xs-5 control-label' + = label_tag ComplianceControlSet.ts, nil, class: 'string required col-sm-4 col-xs-5 control-label' .col-sm-8.col-xs-7 = select_tag :compliance_control_set, options_from_collection_for_select(@compliance_control_sets, "id", "name"), class: 'select optional form-control' .separator diff --git a/app/views/workbench_outputs/show.html.slim b/app/views/workbench_outputs/show.html.slim index a9e106dbb..b310119e6 100644 --- a/app/views/workbench_outputs/show.html.slim +++ b/app/views/workbench_outputs/show.html.slim @@ -6,7 +6,8 @@ .row.mb-sm .col-lg-12.text-right = link_to t('.see_current_output'), referential_path(@workbench.output.current), class: 'btn btn-primary' if @workbench.output&.current - = link_to t('merges.actions.create'), new_workbench_merge_path(@workbench), class: 'btn btn-primary' + - if policy(Merge).create? + = link_to t('merges.actions.create'), new_workbench_merge_path(@workbench), class: 'btn btn-primary' .page_content .container-fluid diff --git a/config/locales/compliance_check_sets.en.yml b/config/locales/compliance_check_sets.en.yml index 63708328b..73ecf8996 100644 --- a/config/locales/compliance_check_sets.en.yml +++ b/config/locales/compliance_check_sets.en.yml @@ -23,7 +23,7 @@ en: table_state: "%{lines_status} lines imported out of %{lines_in_compliance_check_set} in the archive" table_explanation: "These controls apply to all imported data and condition the construction of your organization's offer." table_title: Analysed lines state - metrics: "%{ok_count} ok, %{error_count} errors, %{warning_count} warnings, %{uncheck_count} n/a" + metrics: "%{error_count} errors, %{warning_count} warnings" metadatas: referential: "Object analysed" referential_type: "Apply to" diff --git a/config/locales/compliance_check_sets.fr.yml b/config/locales/compliance_check_sets.fr.yml index 20bf11d85..045fed4ce 100644 --- a/config/locales/compliance_check_sets.fr.yml +++ b/config/locales/compliance_check_sets.fr.yml @@ -19,7 +19,7 @@ fr: table_state: "%{lines_status} lignes valides sur %{lines_in_compliance_check_set} présentes dans l'offre de transport" table_explanation: Ces contrôles s’appliquent pour toutes les données importées et conditionnent la construction de l’offre de votre organisation table_title: État des lignes analysées - metrics: "%{ok_count} ok, %{error_count} errors, %{warning_count} warnings, %{uncheck_count} n/a" + metrics: "%{error_count} errors, %{warning_count} warnings" metadatas: referential: "Objet analysé" referential_type: "Appliqué à" diff --git a/config/locales/import_resources.en.yml b/config/locales/import_resources.en.yml index 386039319..4b1f9c394 100644 --- a/config/locales/import_resources.en.yml +++ b/config/locales/import_resources.en.yml @@ -6,7 +6,7 @@ en: table_state: "%{lines_imported} line(s) imported on %{lines_in_zipfile} presents in zipfile" table_title: "Satus of anlyzed files" table_explanation: "When calendriers.xml and/or commun.xml are not imported, then all lines file are not processed." - metrics: "%{ok_count} ok, %{error_count} errors, %{warning_count} warnings, %{uncheck_count} n/a" + metrics: "%{error_count} errors, %{warning_count} warnings" import_resources: <<: *resources activerecord: diff --git a/config/locales/import_resources.fr.yml b/config/locales/import_resources.fr.yml index 50fb7f1ca..93a576f01 100644 --- a/config/locales/import_resources.fr.yml +++ b/config/locales/import_resources.fr.yml @@ -6,7 +6,7 @@ fr: table_state: "%{lines_imported} ligne(s) importée(s) sur %{lines_in_zipfile} présente(s) dans l'archive" table_title: "Etat des fichiers analysés" table_explanation: "Dans le cas ou le(s) fichiers calendriers.xml et/ou commun.xml sont dans un état non importé, alors tous les fichiers lignes sont automatiquement dans un état non traité." - metrics: "%{ok_count} ok, %{error_count} errors, %{warning_count} warnings, %{uncheck_count} n/a" + metrics: "%{error_count} errors, %{warning_count} warnings" import_resources: <<: *resources activerecord: diff --git a/config/locales/referentials.fr.yml b/config/locales/referentials.fr.yml index ec6c7c643..cf012ef8e 100644 --- a/config/locales/referentials.fr.yml +++ b/config/locales/referentials.fr.yml @@ -32,7 +32,7 @@ fr: title: 'Dupliquer un jeu de données' submit: "Valider" select_compliance_control_set: - title: "Sélection du jeu de contôles" + title: "Sélection du jeu de contrôles" actions: new: "Créer un jeu de données" destroy_confirm: "Etes vous sûr de vouloir supprimer ce jeu de données ?" diff --git a/db/migrate/20180405133659_change_companies_custom_fields_values_type.rb b/db/migrate/20180405133659_change_companies_custom_fields_values_type.rb new file mode 100644 index 000000000..7248c29f6 --- /dev/null +++ b/db/migrate/20180405133659_change_companies_custom_fields_values_type.rb @@ -0,0 +1,8 @@ +class ChangeCompaniesCustomFieldsValuesType < ActiveRecord::Migration + def change + reversible do |dir| + dir.up { change_column :companies, :custom_field_values, 'jsonb USING CAST(custom_field_values AS jsonb)', :default => {} } + dir.down { change_column :companies, :custom_field_values, 'json USING CAST(custom_field_values AS json)', :default => {} } + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 0f6f21b83..023cdc7eb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,14 +11,13 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180319043333) do +ActiveRecord::Schema.define(version: 20180405133659) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - enable_extension "hstore" enable_extension "postgis" + enable_extension "hstore" enable_extension "unaccent" - enable_extension "objectid" create_table "access_links", id: :bigserial, force: :cascade do |t| t.integer "access_point_id", limit: 8 @@ -118,13 +117,12 @@ ActiveRecord::Schema.define(version: 20180319043333) do t.datetime "updated_at" t.date "end_date" t.string "date_type" - t.string "mode" end add_index "clean_ups", ["referential_id"], name: "index_clean_ups_on_referential_id", using: :btree create_table "companies", id: :bigserial, force: :cascade do |t| - t.string "objectid", null: false + t.string "objectid", null: false t.integer "object_version", limit: 8 t.string "name" t.string "short_name" @@ -141,7 +139,7 @@ ActiveRecord::Schema.define(version: 20180319043333) do t.text "import_xml" t.datetime "created_at" t.datetime "updated_at" - t.json "custom_field_values" + t.jsonb "custom_field_values", default: {} end add_index "companies", ["line_referential_id"], name: "index_companies_on_line_referential_id", using: :btree @@ -462,9 +460,9 @@ ActiveRecord::Schema.define(version: 20180319043333) 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 @@ -1074,8 +1072,10 @@ ActiveRecord::Schema.define(version: 20180319043333) do t.string "name" t.integer "line_referential_id", limit: 8 t.integer "stop_area_referential_id", limit: 8 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "import_types", default: [], array: true + t.string "export_types", default: [], array: true end add_foreign_key "access_links", "access_points", name: "aclk_acpt_fkey" diff --git a/db/seeds/dev/custom_fields.seeds.rb b/db/seeds/dev/custom_fields.seeds.rb new file mode 100644 index 000000000..eb3afc394 --- /dev/null +++ b/db/seeds/dev/custom_fields.seeds.rb @@ -0,0 +1,52 @@ +# coding: utf-8 + +require_relative '../seed_helpers' + +Workgroup.find_each do |workgroup| + puts workgroup.inspect + + workgroup.custom_fields.seed_by(code: "capacity") do |field| + field.resource_type = "VehicleJourney" + field.name = "Bus Capacity" + field.field_type = "list" + field.options = { list_values: { "0": "", "1": "48 places", "2": "54 places" }} + end + + workgroup.custom_fields.seed_by(code: "company_commercial_name") do |field| + field.resource_type = "Company" + field.name = "Nom commercial" + field.field_type = "list" + field.options = { list_values: { "0": "", "1": "OuiBus", "2": "Alsa" }} + end + + workgroup.custom_fields.seed_by(code: "company_contact_name") do |field| + field.resource_type = "Company" + field.name = "Nom du référent" + field.field_type = "string" + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_list") do |field| + field.resource_type = "StopArea" + field.name = "Test de Liste" + field.field_type = "list" + field.options = { list_values: { "0": "", "1": "Valeur 1", "2": "Valeur 2" }} + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_string") do |field| + field.resource_type = "StopArea" + field.name = "Test de Texte" + field.field_type = "string" + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_integer") do |field| + field.resource_type = "StopArea" + field.name = "Test de Nomber" + field.field_type = "integer" + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_attachment") do |field| + field.resource_type = "StopArea" + field.name = "Test de Piece Jointe" + field.field_type = "attachment" + end +end diff --git a/db/seeds/development/custom_fields.seeds.rb b/db/seeds/development/custom_fields.seeds.rb new file mode 100644 index 000000000..eb3afc394 --- /dev/null +++ b/db/seeds/development/custom_fields.seeds.rb @@ -0,0 +1,52 @@ +# coding: utf-8 + +require_relative '../seed_helpers' + +Workgroup.find_each do |workgroup| + puts workgroup.inspect + + workgroup.custom_fields.seed_by(code: "capacity") do |field| + field.resource_type = "VehicleJourney" + field.name = "Bus Capacity" + field.field_type = "list" + field.options = { list_values: { "0": "", "1": "48 places", "2": "54 places" }} + end + + workgroup.custom_fields.seed_by(code: "company_commercial_name") do |field| + field.resource_type = "Company" + field.name = "Nom commercial" + field.field_type = "list" + field.options = { list_values: { "0": "", "1": "OuiBus", "2": "Alsa" }} + end + + workgroup.custom_fields.seed_by(code: "company_contact_name") do |field| + field.resource_type = "Company" + field.name = "Nom du référent" + field.field_type = "string" + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_list") do |field| + field.resource_type = "StopArea" + field.name = "Test de Liste" + field.field_type = "list" + field.options = { list_values: { "0": "", "1": "Valeur 1", "2": "Valeur 2" }} + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_string") do |field| + field.resource_type = "StopArea" + field.name = "Test de Texte" + field.field_type = "string" + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_integer") do |field| + field.resource_type = "StopArea" + field.name = "Test de Nomber" + field.field_type = "integer" + end + + workgroup.custom_fields.seed_by(code: "stop_area_test_attachment") do |field| + field.resource_type = "StopArea" + field.name = "Test de Piece Jointe" + field.field_type = "attachment" + end +end diff --git a/db/seeds/seed_helpers.rb b/db/seeds/seed_helpers.rb index 8e47e10bd..708362a6c 100644 --- a/db/seeds/seed_helpers.rb +++ b/db/seeds/seed_helpers.rb @@ -1,6 +1,6 @@ class ActiveRecord::Base def self.seed_by(key_attribute, &block) - model = find_or_create_by! key_attribute + model = find_or_initialize_by key_attribute print "Seed #{name} #{key_attribute.inspect} " yield model diff --git a/db/seeds/stif.seeds.rb b/db/seeds/stif.seeds.rb index bb73b0b9c..98192385f 100644 --- a/db/seeds/stif.seeds.rb +++ b/db/seeds/stif.seeds.rb @@ -12,7 +12,7 @@ stop_area_referential = StopAreaReferential.seed_by(name: "Reflex") do |r| end line_referential = LineReferential.seed_by(name: "CodifLigne") do |r| - r.objectid_format = "stif_netex" + r.objectid_format = "stif_codifligne" r.add_member stif, owner: true end diff --git a/lib/tasks/ci.rake b/lib/tasks/ci.rake index 5b2c8ae3c..d025a9bf1 100644 --- a/lib/tasks/ci.rake +++ b/lib/tasks/ci.rake @@ -10,6 +10,7 @@ namespace :ci do desc "Prepare CI build" task :setup do + cp "config/database.yml", "config/database.yml.orig" cp "config/database/ci.yml", "config/database.yml" puts "Use #{database_name} database" sh "RAILS_ENV=test rake db:drop db:create db:migrate" @@ -28,6 +29,7 @@ namespace :ci do end def deploy_env + return ENV["DEPLOY_ENV"] if ENV["DEPLOY_ENV"] if git_branch == "master" "dev" elsif git_branch.in?(deploy_envs) @@ -54,12 +56,12 @@ namespace :ci do desc "Deploy after CI" task :deploy do - return if ENV["CHOUETTE_DEPLOY_DISABLED"] - - if deploy_env - sh "cap #{deploy_env} deploy:migrations" - else - puts "No deploy for branch #{git_branch}" + unless ENV["CHOUETTE_DEPLOY_DISABLED"] + if deploy_env + sh "cap #{deploy_env} deploy:migrations deploy:seed" + else + puts "No deploy for branch #{git_branch}" + end end end @@ -75,6 +77,9 @@ namespace :ci do task :clean do puts "Drop #{database_name} database" sh "RAILS_ENV=test rake db:drop" + + # Restore projet config/database.yml + cp "config/database.yml.orig", "config/database.yml" if File.exists?("config/database.yml.orig") end end diff --git a/spec/models/chouette/vehicle_journey_spec.rb b/spec/models/chouette/vehicle_journey_spec.rb index 7292f09f9..41ac5d7d0 100644 --- a/spec/models/chouette/vehicle_journey_spec.rb +++ b/spec/models/chouette/vehicle_journey_spec.rb @@ -868,7 +868,6 @@ describe Chouette::VehicleJourney, :type => :model do let!( :footnote_first) {create( :footnote, :code => "1", :label => "dummy 1", :line => route.line)} let!( :footnote_second) {create( :footnote, :code => "2", :label => "dummy 2", :line => route.line)} - it "should update vehicle's footnotes" do expect(Chouette::VehicleJourney.find(subject.id).footnotes).to be_empty subject.footnote_ids = [ footnote_first.id ] @@ -877,4 +876,54 @@ describe Chouette::VehicleJourney, :type => :model do end end end + + describe "#fill_passing_time_at_borders" do + before do + start = create :stop_area + border = create :stop_area, kind: :non_commercial, area_type: :border + border_2 = create :stop_area, kind: :non_commercial, area_type: :border + middle = create :stop_area + border_3 = create :stop_area, kind: :non_commercial, area_type: :border + border_4 = create :stop_area, kind: :non_commercial, area_type: :border + _end = create :stop_area + journey_pattern = create :journey_pattern + journey_pattern.stop_points.destroy_all + journey_pattern.stop_points << start_point = create(:stop_point, stop_area: start, position: 0) + journey_pattern.stop_points << border_point = create(:stop_point, stop_area: border, position: 1) + journey_pattern.stop_points << border_point_2 = create(:stop_point, stop_area: border_2, position: 2) + journey_pattern.stop_points << middle_point = create(:stop_point, stop_area: middle, position: 3) + journey_pattern.stop_points << border_point_3 = create(:stop_point, stop_area: border_3, position: 4) + journey_pattern.stop_points << border_point_4 = create(:stop_point, stop_area: border_4, position: 5) + journey_pattern.stop_points << end_point = create(:stop_point, stop_area: _end, position: 6) + journey_pattern.update_attribute :costs, { + "#{start_point.stop_area_id}-#{border_point.stop_area_id}" => {distance: 50}, + "#{border_point.stop_area_id}-#{border_point_2.stop_area_id}" => {distance: 0}, + "#{border_point_2.stop_area_id}-#{middle_point.stop_area_id}" => {distance: 100}, + "#{middle_point.stop_area_id}-#{border_point_3.stop_area_id}" => {distance: 100}, + "#{border_point_3.stop_area_id}-#{border_point_4.stop_area_id}" => {distance: 0}, + "#{border_point_4.stop_area_id}-#{end_point.stop_area_id}" => {distance: 100} + } + @journey = create :vehicle_journey, journey_pattern: journey_pattern + @journey.vehicle_journey_at_stops.destroy_all + @start = create :vehicle_journey_at_stop, stop_point: start_point, vehicle_journey: @journey + @target = create :vehicle_journey_at_stop, stop_point: border_point, vehicle_journey: @journey, arrival_time: nil, departure_time: nil + @target_2 = create :vehicle_journey_at_stop, stop_point: border_point_2, vehicle_journey: @journey, arrival_time: nil, departure_time: nil + @middle = create :vehicle_journey_at_stop, stop_point: middle_point, vehicle_journey: @journey, arrival_time: @start.arrival_time + 4.hours, departure_time: @start.departure_time + 4.hours + @target_3 = create :vehicle_journey_at_stop, stop_point: border_point_3, vehicle_journey: @journey, arrival_time: nil, departure_time: nil + @target_4 = create :vehicle_journey_at_stop, stop_point: border_point_4, vehicle_journey: @journey, arrival_time: nil, departure_time: nil + @end = create :vehicle_journey_at_stop, stop_point: end_point, vehicle_journey: @journey, arrival_time: @middle.arrival_time + 4.hours, departure_time: @middle.departure_time + 4.hours + end + + it "should compute passing time" do + @journey.reload.fill_passing_time_at_borders + expect(@target.reload.arrival_time.to_i).to eq (@start.reload.departure_time + 1.0/3 * (@middle.reload.arrival_time - @start.departure_time)).to_i + expect(@target_2.reload.arrival_time).to eq @target.arrival_time + expect(@target.departure_time).to eq @target.arrival_time + expect(@target_2.departure_time).to eq @target.arrival_time + expect(@target_3.reload.arrival_time.to_i).to eq (@middle.reload.departure_time + 0.5 * (@end.reload.arrival_time - @middle.departure_time)).to_i + expect(@target_4.reload.arrival_time).to eq @target_3.arrival_time + expect(@target_3.departure_time).to eq @target_3.arrival_time + expect(@target_4.departure_time).to eq @target_3.arrival_time + end + end end |
