diff options
| author | Zog | 2018-04-18 13:19:18 +0200 |
|---|---|---|
| committer | Johan Van Ryseghem | 2018-04-27 11:17:19 +0200 |
| commit | f7fe4c24e29ceb517abdda66899952a5d6aa73bf (patch) | |
| tree | 7fdd8323e8e5a0189771976878310167b6cdac49 | |
| parent | 0046e5a01cb08c10118b01c50f3c52d159854ef0 (diff) | |
| download | chouette-core-f7fe4c24e29ceb517abdda66899952a5d6aa73bf.tar.bz2 | |
Refs #6572; New Referential#Show for noredy referentials
| -rw-r--r-- | app/controllers/clean_ups_controller.rb | 2 | ||||
| -rw-r--r-- | app/controllers/concerns/referential_support.rb | 1 | ||||
| -rw-r--r-- | app/helpers/referentials_helper.rb | 10 | ||||
| -rw-r--r-- | app/models/clean_up.rb | 4 | ||||
| -rw-r--r-- | app/models/concerns/iev_interfaces/task.rb | 4 | ||||
| -rw-r--r-- | app/models/referential.rb | 30 | ||||
| -rw-r--r-- | app/policies/referential_policy.rb | 4 | ||||
| -rw-r--r-- | app/views/layouts/navigation/_page_header.html.slim | 1 | ||||
| -rw-r--r-- | app/views/referentials/show.html.slim | 154 | ||||
| -rw-r--r-- | config/locales/clean_ups.en.yml | 4 | ||||
| -rw-r--r-- | config/locales/clean_ups.fr.yml | 4 | ||||
| -rw-r--r-- | config/locales/merges.fr.yml | 11 | ||||
| -rw-r--r-- | config/locales/referentials.en.yml | 7 | ||||
| -rw-r--r-- | config/locales/referentials.fr.yml | 7 | ||||
| -rw-r--r-- | spec/factories/imports/gtfs_imports.rb | 7 | ||||
| -rw-r--r-- | spec/models/referential_spec.rb | 77 |
16 files changed, 242 insertions, 85 deletions
diff --git a/app/controllers/clean_ups_controller.rb b/app/controllers/clean_ups_controller.rb index c25df1a00..350f9ae87 100644 --- a/app/controllers/clean_ups_controller.rb +++ b/app/controllers/clean_ups_controller.rb @@ -3,6 +3,8 @@ class CleanUpsController < ChouetteController respond_to :html, :only => [:create] belongs_to :referential + defaults :resource_class => CleanUp + def create @clean_up = CleanUp.new(clean_up_params) @clean_up.referential = @referential diff --git a/app/controllers/concerns/referential_support.rb b/app/controllers/concerns/referential_support.rb index fe75e3579..f606e0e63 100644 --- a/app/controllers/concerns/referential_support.rb +++ b/app/controllers/concerns/referential_support.rb @@ -8,6 +8,7 @@ module ReferentialSupport end def switch_referential + authorize referential, :browse? Apartment::Tenant.switch!(referential.slug) end diff --git a/app/helpers/referentials_helper.rb b/app/helpers/referentials_helper.rb index 9b5b13ace..ef8831cdc 100644 --- a/app/helpers/referentials_helper.rb +++ b/app/helpers/referentials_helper.rb @@ -12,6 +12,16 @@ module ReferentialsHelper end end + def referential_state referential + out = if referential.archived? + "<div class='td-block'><span class='fa fa-archive'></span><span>#{t('activerecord.attributes.referential.archived_at')}</span></div>" + else + "<div class='td-block'>#{"referentials.states.#{referential.state}".t}</div>" + end + + out.html_safe + end + def referential_overview referential service = ReferentialOverview.new referential, self render partial: "referentials/overview", locals: {referential: referential, overview: service} diff --git a/app/models/clean_up.rb b/app/models/clean_up.rb index ca4f6312b..0f73e07b2 100644 --- a/app/models/clean_up.rb +++ b/app/models/clean_up.rb @@ -12,6 +12,10 @@ class CleanUp < ApplicationModel validate :end_date_must_be_greater_that_begin_date after_commit :perform_cleanup, :on => :create + scope :for_referential, ->(referential) do + where(referential_id: referential.id) + end + def end_date_must_be_greater_that_begin_date if self.end_date && self.date_type == 'between' && self.begin_date >= self.end_date errors.add(:base, I18n.t('activerecord.errors.models.clean_up.invalid_period')) diff --git a/app/models/concerns/iev_interfaces/task.rb b/app/models/concerns/iev_interfaces/task.rb index f052b3a8f..6be33734b 100644 --- a/app/models/concerns/iev_interfaces/task.rb +++ b/app/models/concerns/iev_interfaces/task.rb @@ -23,6 +23,10 @@ module IevInterfaces::Task where('started_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) end + scope :for_referential, ->(referential) do + where(referential_id: referential.id) + end + scope :blocked, -> { where('created_at < ? AND status = ?', 4.hours.ago, 'running') } before_save :initialize_fields, on: :create diff --git a/app/models/referential.rb b/app/models/referential.rb index c7c22604d..2449d767d 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -59,12 +59,12 @@ class Referential < ApplicationModel scope :pending, -> { where(ready: false, failed_at: nil, archived_at: nil) } - scope :ready, -> { where(ready: true, failed_at: nil, archived_at: nil) } + scope :active, -> { where(ready: true, failed_at: nil, archived_at: nil) } scope :failed, -> { where.not(failed_at: nil) } scope :archived, -> { where.not(archived_at: nil) } - scope :ready, -> { where(ready: true, failed_at: nil, archived_at: nil) } - scope :ready, -> { where(ready: true, failed_at: nil, archived_at: nil) } + scope :ready, -> { where(ready: true) } + scope :in_periode, ->(periode) { where(id: referential_ids_in_periode(periode)) } scope :include_metadatas_lines, ->(line_ids) { where('referential_metadata.line_ids && ARRAY[?]::bigint[]', line_ids) } scope :order_by_validity_period, ->(dir) { joins(:metadatas).order("unnest(periodes) #{dir}") } @@ -122,6 +122,20 @@ class Referential < ApplicationModel @_models_with_checksum || [] end + OPERATIONS = [Import::Netex, Import::Gtfs, CleanUp] + + def last_operation + operations = [] + Referential::OPERATIONS.each do |klass| + operations << klass.for_referential(self).limit(1).select("'#{klass.name}' as kind, id, created_at").order('created_at DESC').to_sql + end + sql = "SELECT * FROM ((#{operations.join(') UNION (')})) AS subquery ORDER BY subquery.created_at DESC" + res = ActiveRecord::Base.connection.execute(sql).first + if res + res["kind"].constantize.find(res["id"]) + end + end + def lines if metadatas.blank? workbench ? workbench.lines : associated_lines @@ -538,7 +552,7 @@ class Referential < ApplicationModel def state return :failed if failed_at.present? return :archived if archived_at.present? - ready ? :ready : :pending + ready? ? :active : :pending end def pending! @@ -549,7 +563,7 @@ class Referential < ApplicationModel update ready: false, failed_at: Time.now, archived_at: nil end - def ready! + def active! update ready: true, failed_at: nil, archived_at: nil end @@ -557,6 +571,12 @@ class Referential < ApplicationModel update failed_at: nil, archived_at: Time.now end + %i(pending active failed archived).each do |s| + define_method "#{s}?" do + state == s + end + end + def pending_while vals = attributes.slice(*%w(ready archived_at failed_at)) pending! diff --git a/app/policies/referential_policy.rb b/app/policies/referential_policy.rb index f5c2d7c08..e86da7c35 100644 --- a/app/policies/referential_policy.rb +++ b/app/policies/referential_policy.rb @@ -5,6 +5,10 @@ class ReferentialPolicy < ApplicationPolicy end end + def browse? + record.ready? || record.archived? + end + def create? user.has_permission?('referentials.create') end diff --git a/app/views/layouts/navigation/_page_header.html.slim b/app/views/layouts/navigation/_page_header.html.slim index bdc4bdfed..1cac86c4a 100644 --- a/app/views/layouts/navigation/_page_header.html.slim +++ b/app/views/layouts/navigation/_page_header.html.slim @@ -1,5 +1,6 @@ - action_links = resource.action_links(params[:action]) rescue nil - action_links ||= decorated_collection.action_links(params[:action]) rescue nil +- action_links = nil if response.status != 200 .page_header .container-fluid .row diff --git a/app/views/referentials/show.html.slim b/app/views/referentials/show.html.slim index 3cdcff63b..5849bc582 100644 --- a/app/views/referentials/show.html.slim +++ b/app/views/referentials/show.html.slim @@ -6,88 +6,100 @@ .row .col-lg-6.col-md-6.col-sm-12.col-xs-12 - attributes = {} - - attributes[@referential.human_attribute_name(:status)] = @referential.referential_read_only? ? "<div class='td-block'><span class='fa fa-archive'></span><span>#{t('activerecord.attributes.referential.archived_at')}</span></div>".html_safe : "<div class='td-block'><span class='sb sb-lg sb-preparing'></span><span>#{t('activerecord.attributes.referential.archived_at_null')}</span></div>".html_safe unless @referential.in_referential_suite? + - attributes[@referential.human_attribute_name(:state)] = referential_state(@referential) unless @referential.in_referential_suite? - attributes[@referential.human_attribute_name(:validity_period)] = (@referential.validity_period.present? ? t('validity_range', debut: l(@referential.try(:validity_period).try(:begin), format: :short), end: l(@referential.try(:validity_period).try(:end), format: :short)) : '-') - attributes[@referential.human_attribute_name(:organisation)] = @referential.organisation.name - attributes[@referential.human_attribute_name(:merged_at)] = @referential.merged_at ? l(@referential.merged_at, format: :short) : '-' unless @referential.in_referential_suite? = definition_list t('metadatas'), attributes - - if params[:q].present? or @reflines.any? - .row - .col-lg-12 - = render 'filters' + - unless @referential.ready? + - operation = @referential.last_operation + .jumbotron + = import_status(operation.status) + - url = operation.is_a?(Import::Base) ? [operation.workbench, operation.parent || operation] : [@referential, operation] + = link_to url do + | + span + strong= operation.try(:name) || operation.created_at.l(format: :short) + | + span= "(#{operation.class.ts})" - - if @reflines.any? - .row - .col-lg-12 - / ID Codif, nom court, nom de la ligne, réseau, mode, transporteur principal, actions = [show, edit_notes] - = table_builder_2 @reflines, - [ \ - TableBuilderHelper::Column.new( \ - name: t('id_codif'), \ - attribute: Proc.new { |n| n.get_objectid.short_id }, \ - sortable: false \ - ), \ - TableBuilderHelper::Column.new( \ - key: :number, \ - attribute: 'number' \ - ), \ - TableBuilderHelper::Column.new( \ - key: :name, \ - attribute: 'name', \ - link_to: lambda do |line| \ - referential_line_path(@referential, line) \ - end \ - ), \ - TableBuilderHelper::Column.new( \ - key: :status, \ - attribute: Proc.new { |n| line_status(n.status) } \ - ), \ - TableBuilderHelper::Column.new( \ - key: :transport_mode, \ - attribute: Proc.new { |n| n.transport_mode ? t("enumerize.transport_mode.#{n.transport_mode}") : '' }, \ - ), \ - TableBuilderHelper::Column.new( \ - key: 'networks.name', \ - attribute: Proc.new { |n| n.try(:network).try(:name) } \ - ), \ - TableBuilderHelper::Column.new( \ - key: 'companies.name', \ - attribute: Proc.new { |n| n&.company&.name || "-" } \ - ) \ - ], - cls: 'table has-filter has-search', - action: :index + - else + - if params[:q].present? or @reflines.any? + .row + .col-lg-12 + = render 'filters' + - if @reflines.any? + .row + .col-lg-12 + / ID Codif, nom court, nom de la ligne, réseau, mode, transporteur principal, actions = [show, edit_notes] + = table_builder_2 @reflines, + [ \ + TableBuilderHelper::Column.new( \ + name: t('id_codif'), \ + attribute: Proc.new { |n| n.get_objectid.short_id }, \ + sortable: false \ + ), \ + TableBuilderHelper::Column.new( \ + key: :number, \ + attribute: 'number' \ + ), \ + TableBuilderHelper::Column.new( \ + key: :name, \ + attribute: 'name', \ + link_to: lambda do |line| \ + referential_line_path(@referential, line) \ + end \ + ), \ + TableBuilderHelper::Column.new( \ + key: :status, \ + attribute: Proc.new { |n| line_status(n.status) } \ + ), \ + TableBuilderHelper::Column.new( \ + key: :transport_mode, \ + attribute: Proc.new { |n| n.transport_mode ? t("enumerize.transport_mode.#{n.transport_mode}") : '' }, \ + ), \ + TableBuilderHelper::Column.new( \ + key: 'networks.name', \ + attribute: Proc.new { |n| n.try(:network).try(:name) } \ + ), \ + TableBuilderHelper::Column.new( \ + key: 'companies.name', \ + attribute: Proc.new { |n| n&.company&.name || "-" } \ + ) \ + ], + cls: 'table has-filter has-search', + action: :index - = new_pagination @reflines, 'pull-right' + = new_pagination @reflines, 'pull-right' - - unless @reflines.any? - .row.mt-xs - .col-lg-12 - = replacement_msg t('referential_lines.search_no_results') + - unless @reflines.any? + .row.mt-xs + .col-lg-12 + = replacement_msg t('referential_lines.search_no_results') - = referential_overview resource + = referential_overview resource -/ Modal(s) -= modalbox 'purgeModal' do - = simple_form_for [@referential, CleanUp.new] do |f| - .modal-header - h4.modal-title #{t('simple_form.labels.clean_up.title')} - .modal-body - .container-fluid - .row - .col-lg-8.col-ld-offset-2.col-md-8.col-md-offset-2.col-sm-8.col-sm-offset-2.col-xs-12 - = f.input :date_type, as: :radio_buttons, label: false + / Modal(s) + = modalbox 'purgeModal' do + = simple_form_for [@referential, CleanUp.new] do |f| + .modal-header + h4.modal-title #{t('simple_form.labels.clean_up.title')} + .modal-body + .container-fluid + .row + .col-lg-8.col-ld-offset-2.col-md-8.col-md-offset-2.col-sm-8.col-sm-offset-2.col-xs-12 + = f.input :date_type, as: :radio_buttons, label: false - .col-lg-8.col-ld-offset-2.col-md-8.col-md-offset-2.col-sm-8.col-sm-offset-2.col-xs-12 - label.control-label.begin_date = t('titles.clean_up.begin_date') - label.control-label.end_date.hidden = t('titles.clean_up.end_date') - = f.input :begin_date, as: :date, label: false, wrapper_html: { class: 'date smart_date' } + .col-lg-8.col-ld-offset-2.col-md-8.col-md-offset-2.col-sm-8.col-sm-offset-2.col-xs-12 + label.control-label.begin_date = t('titles.clean_up.begin_date') + label.control-label.end_date.hidden = t('titles.clean_up.end_date') + = f.input :begin_date, as: :date, label: false, wrapper_html: { class: 'date smart_date' } - = f.input :end_date, as: :date, label: t('titles.clean_up.end_date'), wrapper_html: { class: 'date cleanup_end_date_wrapper smart_date', id: "end_date" } + = f.input :end_date, as: :date, label: t('titles.clean_up.end_date'), wrapper_html: { class: 'date cleanup_end_date_wrapper smart_date', id: "end_date" } - .modal-footer - button.btn.btn-link type='button' data-dismiss='modal' #{t('cancel')} - - unless policy(@referential).referential_read_only? - = f.button :submit, t('actions.clean_up') , class: 'btn btn-primary' + .modal-footer + button.btn.btn-link type='button' data-dismiss='modal' #{t('cancel')} + - unless policy(@referential).referential_read_only? + = f.button :submit, t('actions.clean_up') , class: 'btn btn-primary' diff --git a/config/locales/clean_ups.en.yml b/config/locales/clean_ups.en.yml index 6cbb2c453..b80551cc0 100644 --- a/config/locales/clean_ups.en.yml +++ b/config/locales/clean_ups.en.yml @@ -23,6 +23,10 @@ en: begin_date: "Begin date of clean up" end_date: "End date of clean up" activerecord: + models: + clean_up: + one: Cleanup + other: Cleanups errors: models: clean_up: diff --git a/config/locales/clean_ups.fr.yml b/config/locales/clean_ups.fr.yml index 59d7c5dbc..0c8445875 100644 --- a/config/locales/clean_ups.fr.yml +++ b/config/locales/clean_ups.fr.yml @@ -22,6 +22,10 @@ fr: begin_date: "Date de début de la purge" end_date: "Date de fin de la purge" activerecord: + models: + clean_up: + one: Purge + other: Purges errors: models: clean_up: diff --git a/config/locales/merges.fr.yml b/config/locales/merges.fr.yml index 345727b74..1bb03200c 100644 --- a/config/locales/merges.fr.yml +++ b/config/locales/merges.fr.yml @@ -9,9 +9,18 @@ fr: title: "Finalisation de l'offre %{name}" actions: create: Finaliser des Jeux de Données + statuses: + new: Nouveau + pending: En attente + successful: Succès + failed: Erreur + running: En cours activerecord: models: - merge: "Finalisation de l'offre" + merge: + zero: "Finalisations d'offre" + one: "Finalisation de l'offre" + other: "Finalisations d'offre" attributes: merge: created_at: "Créé le" diff --git a/config/locales/referentials.en.yml b/config/locales/referentials.en.yml index f52eaa1cb..46b8e5680 100644 --- a/config/locales/referentials.en.yml +++ b/config/locales/referentials.en.yml @@ -55,6 +55,11 @@ en: today: Today prev_page: Prev. page next_page: Next page + states: + pending: Pending + failed: Failed + ready: Ready + archived: Archived activerecord: models: @@ -65,7 +70,7 @@ en: attributes: referential: name: "Name" - status: "Status" + state: "Status" slug: "Code" prefix: "Neptune Object Id prefix" projection_type: "Optional spatial reference system code (SRID)" diff --git a/config/locales/referentials.fr.yml b/config/locales/referentials.fr.yml index c4633014b..2c1e55445 100644 --- a/config/locales/referentials.fr.yml +++ b/config/locales/referentials.fr.yml @@ -55,6 +55,11 @@ fr: today: Aujourd'hui prev_page: ← next_page: → + states: + pending: En cours de traitement + failed: En erreur + ready: En édition + archived: Archivé activerecord: models: @@ -65,7 +70,7 @@ fr: attributes: referential: name: "Nom" - status: "Etat" + state: "Etat" slug: "Code" prefix: "Préfixe des identifiants Neptune" projection_type: "Système de référence spatiale (SRID) optionnel" diff --git a/spec/factories/imports/gtfs_imports.rb b/spec/factories/imports/gtfs_imports.rb new file mode 100644 index 000000000..b91e1ee5f --- /dev/null +++ b/spec/factories/imports/gtfs_imports.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :gtfs_import, class: Import::Gtfs, parent: :import do + file { File.open(Rails.root.join('spec', 'fixtures', 'OFFRE_TRANSDEV_2017030112251.zip')) } + association :parent, factory: :workbench_import + + end +end diff --git a/spec/models/referential_spec.rb b/spec/models/referential_spec.rb index 220201d37..8b8cf4359 100644 --- a/spec/models/referential_spec.rb +++ b/spec/models/referential_spec.rb @@ -29,6 +29,71 @@ describe Referential, :type => :model do end end + context ".last_operation" do + subject(:operation){ referential.last_operation } + it "should return nothing" do + expect(operation).to be_nil + end + + context "with a netex import" do + let!(:import) do + import = create :netex_import + import.referential = referential + import.save + import + end + + it "should return the import" do + expect(operation).to eq import + end + end + + context "with 2 netex imports" do + let!(:other_import) do + import = create :netex_import + import.referential = referential + import.save + import + end + let!(:import) do + import = create :netex_import + import.referential = referential + import.save + import + end + + it "should return the last import" do + expect(operation).to eq import + end + end + + context "with a gtfs import" do + let!(:import) do + import = create :gtfs_import + import.referential = referential + import.save + import + end + + it "should return the import" do + expect(operation).to eq import + end + end + + context "with a cleanup" do + let!(:cleanup) do + cleanup = create :clean_up + cleanup.referential = referential + cleanup.save + cleanup + end + + it "should return the cleanup" do + expect(operation).to eq cleanup + end + end + end + context ".state" do it "should return the expected values" do referential = build :referential @@ -38,7 +103,7 @@ describe Referential, :type => :model do expect(referential.state).to eq :failed referential.ready = true referential.failed_at = nil - expect(referential.state).to eq :ready + expect(referential.state).to eq :active referential.archived_at = Time.now expect(referential.state).to eq :archived end @@ -48,28 +113,28 @@ describe Referential, :type => :model do referential = create :referential, ready: false expect(Referential.pending).to include referential expect(Referential.failed).to_not include referential - expect(Referential.ready).to_not include referential + expect(Referential.active).to_not include referential expect(Referential.archived).to_not include referential referential = create :referential referential.failed! expect(Referential.pending).to_not include referential expect(Referential.failed).to include referential - expect(Referential.ready).to_not include referential + expect(Referential.active).to_not include referential expect(Referential.archived).to_not include referential referential = create :referential - referential.ready! + referential.active! expect(Referential.pending).to_not include referential expect(Referential.failed).to_not include referential - expect(Referential.ready).to include referential + expect(Referential.active).to include referential expect(Referential.archived).to_not include referential referential = create :referential referential.archived! expect(Referential.pending).to_not include referential expect(Referential.failed).to_not include referential - expect(Referential.ready).to_not include referential + expect(Referential.active).to_not include referential expect(Referential.archived).to include referential end end |
