diff options
| -rw-r--r-- | app/controllers/referentials_controller.rb | 11 | ||||
| -rw-r--r-- | app/models/referential.rb | 37 | ||||
| -rw-r--r-- | app/models/referential_metadata.rb | 11 | ||||
| -rw-r--r-- | app/models/workbench.rb | 2 | ||||
| -rw-r--r-- | app/views/referential_lines/show.html.slim | 2 | ||||
| -rw-r--r-- | app/views/referentials/_form.html.slim | 6 | ||||
| -rw-r--r-- | app/views/workbenches/show.html.slim | 7 | ||||
| -rw-r--r-- | config/locales/referentials.fr.yml | 2 | ||||
| -rw-r--r-- | spec/features/vehicle_journey_imports_spec.rb | 24 | ||||
| -rw-r--r-- | spec/models/referential_spec.rb | 2 | 
10 files changed, 73 insertions, 31 deletions
| diff --git a/app/controllers/referentials_controller.rb b/app/controllers/referentials_controller.rb index ae3411dab..b7e6d8031 100644 --- a/app/controllers/referentials_controller.rb +++ b/app/controllers/referentials_controller.rb @@ -11,7 +11,7 @@ class ReferentialsController < BreadcrumbController      new! do        @referential.data_format = current_organisation.data_format -      @referential.workbench_id = params[:workbench_id] +      @referential.workbench_id ||= params[:workbench_id]        if @referential.in_workbench?          @referential.init_metadatas first_period_begin: Date.today, first_period_end: Date.today.advance(months: 1) @@ -53,8 +53,13 @@ class ReferentialsController < BreadcrumbController      redirect_to workbench_path(referential.workbench_id), notice: t('notice.referential.archived')    end    def unarchive -    referential.unarchive! -    redirect_to workbench_path(referential.workbench_id), notice: t('notice.referential.unarchived') +    if referential.unarchive! +      flash[:notice] = t('notice.referential.unarchived') +    else +      flash[:alert] = t('notice.referential.unarchived_failed') +    end + +    redirect_to workbench_path(referential.workbench_id)    end    protected diff --git a/app/models/referential.rb b/app/models/referential.rb index 604181c0a..be7c15535 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -133,6 +133,7 @@ class Referential < ActiveRecord::Base        stop_area_referential: from.stop_area_referential,        workbench: from.workbench,        created_from: from, +      metadatas: from.metadatas.map { |m| ReferentialMetadata.new_from(m) }      })    end @@ -176,7 +177,6 @@ class Referential < ActiveRecord::Base    before_validation :clone_associations, :on => :create, if: :created_from    before_create :create_schema -  before_validation :clone_metadatas, on: :create, if: :created_from    after_create :clone_schema, if: :created_from    before_destroy :destroy_schema @@ -216,6 +216,36 @@ class Referential < ActiveRecord::Base      metadatas.present? ? metadatas.first.lines : []    end +  def overlapped_referential_ids +    return [] unless metadatas.present? + +    line_ids = metadatas.first.line_ids +    period = metadatas.first.periodes.first + +    not_myself = "and referential_id != #{id}" if persisted? + +    query = "SELECT distinct(referential_id) FROM +    (SELECT unnest(public.referential_metadata.line_ids) as line, unnest(public.referential_metadata.periodes) as period, public.referential_metadata.referential_id +     FROM public.referential_metadata +     INNER JOIN public.referentials ON public.referential_metadata.referential_id = public.referentials.id +     WHERE public.referentials.workbench_id = 1 and public.referentials.archived_at is null) as metadatas +    WHERE line in (#{line_ids.join(',')}) and period && '#{ActiveRecord::ConnectionAdapters::PostgreSQLColumn.range_to_string(period)}' #{not_myself};" + +    self.class.connection.select_values(query).map(&:to_i) +  end + +  def metadatas_overlap? +    overlapped_referential_ids.present? +  end + +  validate :detect_overlapped_referentials + +  def detect_overlapped_referentials +    self.class.where(id: overlapped_referential_ids).each do |referential| +      errors.add :metadatas, I18n.t("referentials.errors.overlapped_referential", :referential => referential.name) +    end +  end +    def clone_schema      ReferentialCloning.create(source_referential: self.created_from, target_referential: self)    end @@ -287,8 +317,13 @@ class Referential < ActiveRecord::Base      touch :archived_at    end    def unarchive! +    return false unless can_unarchive?      # self.archived = false      update_column :archived_at, nil    end +  def can_unarchive? +    not metadatas_overlap? +  end +  end diff --git a/app/models/referential_metadata.rb b/app/models/referential_metadata.rb index 3f5ed4db8..d1300b690 100644 --- a/app/models/referential_metadata.rb +++ b/app/models/referential_metadata.rb @@ -63,17 +63,6 @@ class ReferentialMetadata < ActiveRecord::Base      end    end -  # def lines_with_ids_support=(values) -  #   if String === values.first -  #     self.line_values = values -  #   else -  #     self.lines_without_values_support = values -  #   end -  # end -  # alias_method_chain :lines, :ids_support - -  #delegate :begin, :begin=, :end, :end=, to: :first_period, prefix: :first_period -    def self.new_from from      from.dup.tap do |metadata|        metadata.referential_id = nil diff --git a/app/models/workbench.rb b/app/models/workbench.rb index b5ab37222..419790edb 100644 --- a/app/models/workbench.rb +++ b/app/models/workbench.rb @@ -13,5 +13,5 @@ class Workbench < ActiveRecord::Base    validates :organisation, presence: true    has_many :referentials -  has_many :referential_metadatas, through: :referentials +  has_many :referential_metadatas, through: :referentials, source: :metadatas  end diff --git a/app/views/referential_lines/show.html.slim b/app/views/referential_lines/show.html.slim index afb5903e0..e32978b20 100644 --- a/app/views/referential_lines/show.html.slim +++ b/app/views/referential_lines/show.html.slim @@ -51,7 +51,7 @@ h2          = " " + t("enumerize.line.transport_mode.#{@line.transport_mode}")        - else          = " -" -         +      p        label = "#{@line.human_attribute_name('transport_submode')} : "        - if @line.transport_submode diff --git a/app/views/referentials/_form.html.slim b/app/views/referentials/_form.html.slim index 2061d02ff..a4342bc8e 100644 --- a/app/views/referentials/_form.html.slim +++ b/app/views/referentials/_form.html.slim @@ -23,6 +23,12 @@      = form.input :lower_corner, input_html: { title: t("formtastic.titles.referential.lower_corner") }      / = form.input :data_format, label: true, include_blank: false + +    - if @referential.errors.has_key? :metadatas +      ul.errors +        - @referential.errors[:metadatas].each do |message| +          li = message +      = form.semantic_fields_for :metadatas do |subform|        = subform.input :first_period_begin, as: :date_select        = subform.input :first_period_end, as: :date_select diff --git a/app/views/workbenches/show.html.slim b/app/views/workbenches/show.html.slim index 045214022..06f64d3c4 100644 --- a/app/views/workbenches/show.html.slim +++ b/app/views/workbenches/show.html.slim @@ -52,9 +52,14 @@                  li = link_to "Editer", edit_referential_path(referential) +                li = link_to "Cloner", new_referential_path(from: referential) +                  li                    - if referential.archived? -                    = link_to "Désarchiver", unarchive_referential_path(referential), method: :put +                    - if referential.can_unarchive? +                      = link_to "Désarchiver", unarchive_referential_path(referential), method: :put +                    - else +                      = link_to "Désarchiver", "#"                    - else                      = link_to "Archiver", archive_referential_path(referential), method: :put diff --git a/config/locales/referentials.fr.yml b/config/locales/referentials.fr.yml index d9a9fc4ce..dc3d796b8 100644 --- a/config/locales/referentials.fr.yml +++ b/config/locales/referentials.fr.yml @@ -29,6 +29,7 @@ fr:        pg_excluded: "ne peut pas commencer par pg_ (valeurs réservées)"        public_excluded: "public est une valeur réservée"        user_excluded: "%{user} est une valeur réservée" +      overlapped_referential: "%{referential} couvre le même périmètre d'offre"    activerecord:      models:        referential: @@ -83,4 +84,5 @@ fr:      referential:        archived: "L'espace de données a été correctement archivé"        unarchived: "L'espace de données a été correctement désarchivé" +      unarchived_failed: "L'espace de données ne peut être désarchivé"        deleted: "L'espace de données a été correctement supprimé" diff --git a/spec/features/vehicle_journey_imports_spec.rb b/spec/features/vehicle_journey_imports_spec.rb index f18d9baf0..262d585f2 100644 --- a/spec/features/vehicle_journey_imports_spec.rb +++ b/spec/features/vehicle_journey_imports_spec.rb @@ -4,7 +4,7 @@ require 'csv'  describe "VehicleJourneyImports", :type => :feature do    login_user -   +    let!(:route) { create :route }    let(:valid_file_path) { @@ -24,16 +24,16 @@ describe "VehicleJourneyImports", :type => :feature do          if counter == 0            row2 = []            row.each do |cell| -            cell = "" if cell == "import:VehicleJourney:1"  -            cell = "" if cell == "import:VehicleJourney:2"  -            cell = "" if cell == "import:VehicleJourney:3"  +            cell = "" if cell == "import:VehicleJourney:1" +            cell = "" if cell == "import:VehicleJourney:2" +            cell = "" if cell == "import:VehicleJourney:3"              row2 << cell            end            csv << row2          elsif  counter < 8            csv << row          else -          csv << ( row[0] = route.stop_points[counter - 8].id; row)           +          csv << ( row[0] = route.stop_points[counter - 8].id; row)          end          counter += 1        end @@ -42,14 +42,14 @@ describe "VehicleJourneyImports", :type => :feature do      File.open("/tmp/#{filename}")    end -   -  describe "new" do       + +  describe "new" do      it "should create vehicle journey file and return to route show page" do        visit new_referential_line_route_vehicle_journey_import_path(referential, route.line, route)        attach_file('Fichier', valid_file_path)        click_button "Lancer l'import"        expect(page).to have_content(I18n.t("vehicle_journey_imports.new.success")) -      expect(page).to have_content("Séquence d'arrêts #{route.name}") +      expect(page).to have_content("Itinéraire #{route.name}")      end      it "should return error messages when file is invalid" do @@ -58,12 +58,12 @@ describe "VehicleJourneyImports", :type => :feature do        click_button "Lancer l'import"        expect(page).to have_content(I18n.t("vehicle_journey_imports.errors.import_aborted"))      end -     +      it "should return error message when file missing on upload" do        visit new_referential_line_route_vehicle_journey_import_path(referential, route.line, route)        click_button "Lancer l'import" -      expect(page).to have_content(I18n.t("vehicle_journey_imports.errors.import_aborted"))      -    end     +      expect(page).to have_content(I18n.t("vehicle_journey_imports.errors.import_aborted")) +    end    end -   +  end diff --git a/spec/models/referential_spec.rb b/spec/models/referential_spec.rb index c1205c9f0..4c9338aa6 100644 --- a/spec/models/referential_spec.rb +++ b/spec/models/referential_spec.rb @@ -12,7 +12,7 @@ describe Referential, :type => :model do    it { should belong_to(:workbench) }    context "Cloning referential" do -    let(:cloned) { create(:referential, created_from: ref) } +    let(:cloned) { Referential.new_from(ref).tap(&:save!) }      it 'should create a ReferentialCloning' do        expect { cloned }.to change{ReferentialCloning.count}.by(1) | 
