diff options
| author | Luc Donnet | 2016-11-18 16:53:43 +0100 |
|---|---|---|
| committer | Luc Donnet | 2016-11-18 16:53:43 +0100 |
| commit | 37a86f23f16f93897013e85e12efab85b1eebcd9 (patch) | |
| tree | c0505e2313b6e77e99a09d05f0bfd7fae6ee1c06 | |
| parent | 6827025a73a35788bbfb40d0ef20903cb62d27e3 (diff) | |
| parent | 9ed408bf89e9de1fdd17bfdcb40f0e2b5616de19 (diff) | |
| download | chouette-core-37a86f23f16f93897013e85e12efab85b1eebcd9.tar.bz2 | |
Merge branch 'master' of github.com:AF83/stif-boiv
| -rw-r--r-- | app/controllers/referentials_controller.rb | 9 | ||||
| -rw-r--r-- | app/controllers/workbenches_controller.rb | 2 | ||||
| -rw-r--r-- | app/helpers/breadcrumb_helper.rb | 4 | ||||
| -rw-r--r-- | app/views/referentials/_form.html.slim | 1 | ||||
| -rw-r--r-- | app/views/rule_parameter_sets/show.html.slim | 2 | ||||
| -rw-r--r-- | app/views/workbenches/show.html.slim | 13 | ||||
| -rw-r--r-- | config/locales/line_referential_syncs.en.yml | 4 | ||||
| -rw-r--r-- | config/locales/line_referential_syncs.fr.yml | 2 | ||||
| -rw-r--r-- | config/locales/stop_area_referential_syncs.en.yml | 2 | ||||
| -rw-r--r-- | config/locales/stop_area_referential_syncs.fr.yml | 2 | ||||
| -rw-r--r-- | lib/stif/codif_line_synchronization.rb | 40 | ||||
| -rw-r--r-- | lib/stif/reflex_synchronization.rb | 82 |
12 files changed, 113 insertions, 50 deletions
diff --git a/app/controllers/referentials_controller.rb b/app/controllers/referentials_controller.rb index 003c85d3a..ab494ac2e 100644 --- a/app/controllers/referentials_controller.rb +++ b/app/controllers/referentials_controller.rb @@ -8,11 +8,18 @@ class ReferentialsController < BreadcrumbController def new @referential = Referential.new_from(Referential.find(params[:from])) if params[:from] + new! do @referential.data_format = current_organisation.data_format + @referential.workbench_id = params[:workbench_id] if params[:workbench_id] end end + def create + + create! + end + def show resource.switch show! do |format| @@ -24,7 +31,6 @@ class ReferentialsController < BreadcrumbController :referential_id => resource.id} } format.html { build_breadcrumb :show} - end end @@ -76,6 +82,7 @@ class ReferentialsController < BreadcrumbController :data_format, :archived_at, :created_from_id, + :workbench_id, referential_metadata_attributes: [:referential_source_id, :line_ids => []] ) end diff --git a/app/controllers/workbenches_controller.rb b/app/controllers/workbenches_controller.rb index 1d67db3ab..b23e9202e 100644 --- a/app/controllers/workbenches_controller.rb +++ b/app/controllers/workbenches_controller.rb @@ -4,6 +4,8 @@ class WorkbenchesController < BreadcrumbController respond_to :html, :only => [:show] def show + @wbench_refs = Workbench.find(params[:id]).referentials.paginate(page: params[:page], per_page: 2) + show! do build_breadcrumb :show end diff --git a/app/helpers/breadcrumb_helper.rb b/app/helpers/breadcrumb_helper.rb index 683036032..9d503fe2e 100644 --- a/app/helpers/breadcrumb_helper.rb +++ b/app/helpers/breadcrumb_helper.rb @@ -237,6 +237,10 @@ module BreadcrumbHelper def referential_breadcrumb (action = :edit) organisation_breadcrumb if @referential + if workbench = @referential.workbench + add_breadcrumb breadcrumb_label(workbench), workbench_path(workbench), :title => breadcrumb_tooltip(workbench) + end + add_breadcrumb breadcrumb_label(@referential), referential_path(@referential),:title => breadcrumb_tooltip(@referential) if action == :edit || action == :show || action == :update end end diff --git a/app/views/referentials/_form.html.slim b/app/views/referentials/_form.html.slim index 1a0d5f105..4ac5d1121 100644 --- a/app/views/referentials/_form.html.slim +++ b/app/views/referentials/_form.html.slim @@ -23,6 +23,7 @@ = form.input :upper_corner, input_html: { title: t("formtastic.titles.referential.upper_corner") } = form.input :lower_corner, input_html: { title: t("formtastic.titles.referential.lower_corner") } = form.input :data_format, label: true, include_blank: false + = form.input :workbench_id, as: :hidden = form.actions do = form.action :submit, as: :button diff --git a/app/views/rule_parameter_sets/show.html.slim b/app/views/rule_parameter_sets/show.html.slim index 72a8fa99c..af7ecb0a4 100644 --- a/app/views/rule_parameter_sets/show.html.slim +++ b/app/views/rule_parameter_sets/show.html.slim @@ -28,7 +28,7 @@ .two_columns label = "#{t('.inter_connection_link_distance_max')} : " - span.value = @rule_parameter_set.inter_connecion_link_distance_max + span.value = @rule_parameter_set.inter_connection_link_distance_max .columns .two_columns diff --git a/app/views/workbenches/show.html.slim b/app/views/workbenches/show.html.slim index 801714bc7..cb83b028c 100644 --- a/app/views/workbenches/show.html.slim +++ b/app/views/workbenches/show.html.slim @@ -3,8 +3,6 @@ .referentials.paginated_content h4 Liste des jeux de données - / = paginated_content @workbench.referentials - table.table.table-bordered.table-hover thead tr @@ -18,7 +16,7 @@ th = "Actions" tbody - - @workbench.referentials.each do |referential| + - @wbench_refs.each do |referential| tr td = referential.name td = l referential.updated_at, format: :long @@ -62,3 +60,12 @@ = link_to referential_path(referential), method: :delete, :data => {:confirm => t('referentials.actions.destroy_confirm')}, class: 'btn btn-danger' do span.fa.fa-trash-o + + .text-center + = will_paginate @wbench_refs, container: false, renderer: RemoteBootstrapPaginationLinkRenderer + +- content_for :sidebar do + ul.actions + li = link_to t('referentials.actions.new'), new_referential_path(workbench_id: @workbench), class: 'add' + + diff --git a/config/locales/line_referential_syncs.en.yml b/config/locales/line_referential_syncs.en.yml index 82ef48170..e78288299 100644 --- a/config/locales/line_referential_syncs.en.yml +++ b/config/locales/line_referential_syncs.en.yml @@ -10,8 +10,8 @@ en: message: new: "New synchronisation added" pending: "Synchronisation en cours" - successful: "Synchronisation réussie après %{processing_time} secondes avec %{imported} éléments importés. %{deleted} éléments ont été supprimés." - failed: "Synchronisation interrompue après %{processing_time} secondes avec l'erreur : %{error}." + successful: "Synchronization successful after %{processing_time} with %{imported} objects created, %{updated} objects updated. %{deleted} objects were deleted.." + failed: "Synchronization failed after %{processing_time} with error: %{error}." notice: line_referential_sync: diff --git a/config/locales/line_referential_syncs.fr.yml b/config/locales/line_referential_syncs.fr.yml index 48b5df190..4a24fd937 100644 --- a/config/locales/line_referential_syncs.fr.yml +++ b/config/locales/line_referential_syncs.fr.yml @@ -10,7 +10,7 @@ fr: message: new: "Synchronisation en attente" pending: "Synchronisation en cours" - successful: "Synchronisation réussie après %{processing_time}, avec %{imported} éléments importés. %{deleted} éléments ont été supprimés." + successful: "Synchronisation réussie après %{processing_time}, avec %{imported} éléments importés, %{updated} éléments mise à jour. %{deleted} éléments ont été supprimés." failed: "Synchronisation interrompue après %{processing_time}, avec l'erreur : %{error}." notice: line_referential_sync: diff --git a/config/locales/stop_area_referential_syncs.en.yml b/config/locales/stop_area_referential_syncs.en.yml index 9dc3173bc..76197d5a6 100644 --- a/config/locales/stop_area_referential_syncs.en.yml +++ b/config/locales/stop_area_referential_syncs.en.yml @@ -11,7 +11,7 @@ en: message: new: "New synchronisation added" pending: "Synchronization pending" - successful: "Synchronization successful after %{processing_time} with %{imported} objects. %{deleted} objects were deleted.." + successful: "Synchronization successful after %{processing_time} with %{imported} objects created, %{updated} objects updated. %{deleted} objects were deleted.." failed: "Synchronization failed after %{processing_time} with error: %{error}." notice: stop_area_referential_sync: diff --git a/config/locales/stop_area_referential_syncs.fr.yml b/config/locales/stop_area_referential_syncs.fr.yml index d0b79a8db..bf8d32ac5 100644 --- a/config/locales/stop_area_referential_syncs.fr.yml +++ b/config/locales/stop_area_referential_syncs.fr.yml @@ -10,7 +10,7 @@ fr: message: new: "Synchronisation en attente" pending: "Synchronisation en cours" - successful: "Synchronisation réussie après %{processing_time}, avec %{imported} éléments importés. %{deleted} éléments ont été supprimés." + successful: "Synchronisation réussie après %{processing_time}, avec %{imported} éléments importés, %{updated} éléments mise à jour. %{deleted} éléments ont été supprimés." failed: "Synchronisation interrompue après %{processing_time}, avec l'erreur : %{error}." notice: stop_area_referential_sync: diff --git a/lib/stif/codif_line_synchronization.rb b/lib/stif/codif_line_synchronization.rb index deadad5ba..600415424 100644 --- a/lib/stif/codif_line_synchronization.rb +++ b/lib/stif/codif_line_synchronization.rb @@ -1,7 +1,28 @@ module Stif module CodifLineSynchronization class << self + attr_accessor :imported_count, :updated_count, :deleted_count + + def reset_counts + self.imported_count = 0 + self.updated_count = 0 + self.deleted_count = 0 + end + + def processed_counts + { + imported: self.imported_count, + updated: self.updated_count, + deleted: self.deleted_count + } + end + + def increment_counts prop_name, value + self.send("#{prop_name}=", self.send(prop_name) + value) + end + def synchronize + self.reset_counts start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :second) # Fetch Codifline data client = Codifligne::API.new @@ -47,10 +68,8 @@ module Stif # Delete deprecated Operators deleted_op = delete_deprecated(operators, Chouette::Company) log_deleted "Operators", deleted_op unless deleted_op == 0 - { - imported: operators.count + lines.count + networks.count, - deleted: deleted_op + deleted_li + deleted_ne - } + + self.processed_counts end def create_or_update_company(api_operator) @@ -118,13 +137,14 @@ module Stif def delete_deprecated(objects, klass) ids = objects.map{ |o| o.stif_id }.to_a deprecated = klass.where.not(objectid: ids) - deprecated.destroy_all.length + increment_counts :deleted_count, deprecated.destroy_all.length end def delete_deprecated_lines(lines) ids = lines.map{ |l| l.stif_id }.to_a deprecated = Chouette::Line.where.not(objectid: ids).where(deactivated: false) deprecated.update_all deactivated: true + increment_counts :deleted_count, deprecated.update_all(deactivated: true) end def save_or_update(params, klass) @@ -132,10 +152,16 @@ module Stif object = klass.where(objectid: params[:objectid]).first if object object.assign_attributes(params) - object.save if object.changed? + if object.changed? + object.save + increment_counts :updated_count, 1 + end else object = klass.new(params) - object.save if object.valid? + if object.valid? + object.save + increment_counts :imported_count, 1 + end end object end diff --git a/lib/stif/reflex_synchronization.rb b/lib/stif/reflex_synchronization.rb index 822a295c0..bc3b9dd2d 100644 --- a/lib/stif/reflex_synchronization.rb +++ b/lib/stif/reflex_synchronization.rb @@ -1,6 +1,31 @@ module Stif module ReflexSynchronization class << self + attr_accessor :imported_count, :updated_count, :deleted_count, :processed + + def reset_counts + self.imported_count = 0 + self.updated_count = 0 + self.deleted_count = 0 + self.processed = [] + end + + def processed_counts + { + imported: self.imported_count, + updated: self.updated_count, + deleted: self.deleted_count + } + end + + def log_processing_time message, time + Rails.logger.info "Reflex:sync - #{message} done in #{time} seconds" + end + + def increment_counts prop_name, value + self.send("#{prop_name}=", self.send(prop_name) + value) + end + def defaut_referential StopAreaReferential.find_by(name: "Reflex") end @@ -10,41 +35,32 @@ module Stif end def synchronize - tstart = Time.now - client = Reflex::API.new - processed = [] - initial_count = Chouette::StopArea.where(deleted_at: nil).count - + self.reset_counts ['getOR', 'getOP'].each do |method| start = Time.now - results = client.process method - Rails.logger.info "Reflex:sync - Process #{method} done in #{Time.now - start} seconds" - results.each do |type, entries| - Rails.logger.info "Reflex:sync - #{entries.count} #{type} retrieved" - end - - # Create or update stop_area for every quay, stop_place + results = Reflex::API.new().process(method) + log_processing_time("Process #{method}", Time.now - start) stop_areas = results[:Quay] | results[:StopPlace] - start = Time.now - stop_areas.each do |entry| - next unless is_valid_type_of_place_ref?(method, entry) - processed << entry['id'] - self.create_or_update_stop_area entry + time = Benchmark.measure do + stop_areas.each do |entry| + next unless is_valid_type_of_place_ref?(method, entry) + self.processed << entry['id'] + self.create_or_update_stop_area entry + end end - Rails.logger.info "Reflex:sync - Create or update StopArea done in #{Time.now - start} seconds" + log_processing_time("Create or update StopArea", time.real) - # Walk through every entry and set parent stop_area - start = Time.now - stop_areas.each do |entry| - self.stop_area_set_parent entry + time = Benchmark.measure do + stop_areas.map{|entry| self.stop_area_set_parent(entry)} end - Rails.logger.info "Reflex:sync - StopArea set parent done in #{Time.now - start} seconds" + log_processing_time("StopArea set parent", time.real) end - { - imported: Chouette::StopArea.where(deleted_at: nil).count - initial_count, - deleted: self.set_deleted_stop_area(processed.uniq).size - } + + # Set deleted_at for item not returned by api since last sync + time = Benchmark.measure { self.set_deleted_stop_area } + log_processing_time("StopArea #{self.deleted_count} deleted", time.real) + self.processed_counts end def is_valid_type_of_place_ref? method, entry @@ -53,14 +69,12 @@ module Stif return true if method == 'getOP' && ['ZDE'].include?(entry["TypeOfPlaceRef"]) end - def set_deleted_stop_area processed - start = Time.now - deleted = Chouette::StopArea.where(deleted_at: nil).pluck(:objectid).uniq - processed + def set_deleted_stop_area + deleted = Chouette::StopArea.where(deleted_at: nil).pluck(:objectid).uniq - self.processed.uniq deleted.each_slice(50) do |object_ids| Chouette::StopArea.where(objectid: object_ids).update_all(deleted_at: Time.now) end - Rails.logger.info "Reflex:sync - StopArea #{deleted.size} stop_area deleted since last sync in #{Time.now - start} seconds" - deleted + increment_counts :deleted_count, deleted.size end def stop_area_set_parent entry @@ -122,7 +136,9 @@ module Stif if stop.changed? stop.creation_time = entry[:created] - stop.import_xml = entry[:xml] + stop.import_xml = entry[:xml] + prop = stop.new_record? ? :imported_count : :updated_count + increment_counts prop, 1 stop.save! end # Create AccessPoint from StopPlaceEntrance |
