aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2017-12-18 10:46:28 +0100
committerAlban Peignier2018-01-05 10:23:29 +0100
commit7d15657860db6d1836c863180ee84524a5bdeb61 (patch)
treed23d7852310116dd01721ccf77c88830d2fc12f7
parentf9b00154721731511b76b20d1d7211de963811bc (diff)
downloadchouette-core-7d15657860db6d1836c863180ee84524a5bdeb61.tar.bz2
Create first merge interface. Refs #5299
-rw-r--r--app/controllers/merges_controller.rb34
-rw-r--r--app/controllers/workbench_outputs_controller.rb1
-rw-r--r--app/models/merge.rb28
-rw-r--r--app/models/workbench.rb1
-rw-r--r--app/policies/merge_policy.rb15
-rw-r--r--app/views/merges/_form.html.slim7
-rw-r--r--app/views/merges/new.html.slim7
-rw-r--r--app/views/merges/show.html.slim13
-rw-r--r--app/views/workbench_outputs/show.html.slim29
-rw-r--r--app/views/workbenches/show.html.slim1
-rw-r--r--app/workers/merge_worker.rb7
-rw-r--r--config/breadcrumbs.rb10
-rw-r--r--config/locales/merges.yml17
-rw-r--r--config/locales/workbenches.fr.yml5
-rw-r--r--config/routes.rb1
-rw-r--r--lib/stif/permission_translator.rb1
16 files changed, 174 insertions, 3 deletions
diff --git a/app/controllers/merges_controller.rb b/app/controllers/merges_controller.rb
new file mode 100644
index 000000000..867bf1e6a
--- /dev/null
+++ b/app/controllers/merges_controller.rb
@@ -0,0 +1,34 @@
+class MergesController < ChouetteController
+ include PolicyChecker
+
+ defaults resource_class: Merge
+ belongs_to :workbench
+
+ respond_to :html
+
+ before_action :set_mergeable_controllers, only: [:new]
+
+ private
+
+ def set_mergeable_controllers
+ @mergeable_referentials ||= parent.referentials
+ Rails.logger.debug "Mergeables: #{@mergeable_referentials.inspect}"
+ end
+
+ # def build_resource
+ # @import ||= WorkbenchImport.new(*resource_params) do |import|
+ # import.workbench = parent
+ # import.creator = current_user.name
+ # end
+ # end
+
+ def merge_params
+ params.require(:merge).permit(
+ referentials: []
+ # :name,
+ # :file,
+ # :type,
+ # :referential_id
+ )
+ end
+end
diff --git a/app/controllers/workbench_outputs_controller.rb b/app/controllers/workbench_outputs_controller.rb
index b7f9f27cf..247f77d4f 100644
--- a/app/controllers/workbench_outputs_controller.rb
+++ b/app/controllers/workbench_outputs_controller.rb
@@ -4,5 +4,6 @@ class WorkbenchOutputsController < ChouetteController
def show
@workbench = current_organisation.workbenches.find params[:workbench_id]
+ @workbench_merges = @workbench.merges.paginate(page: params[:page], per_page: 10)
end
end
diff --git a/app/models/merge.rb b/app/models/merge.rb
index c965cc704..9a8862fb2 100644
--- a/app/models/merge.rb
+++ b/app/models/merge.rb
@@ -2,12 +2,24 @@ class Merge < ActiveRecord::Base
extend Enumerize
belongs_to :workbench
- enumerize :status, in: %w[new pending successful failed running]
+ validates :workbench, presence: true
+
+ enumerize :status, in: %w[new pending successful failed running], default: :new
has_array_of :referentials, class_name: 'Referential'
delegate :output, to: :workbench
+ after_commit :merge, :on => :create
+
+ def merge
+ MergeWorker.perform_async(id)
+ end
+
+ def name
+ "Dummy" # FIXME
+ end
+
attr_reader :new
def merge!
@@ -20,8 +32,13 @@ class Merge < ActiveRecord::Base
end
save_current
+ rescue => e
+ Rails.logger.error "Merge failed: #{e}"
+ update status: :failed
ensure
- update ended_at: Time.now, status: :successful
+ attributes = { ended_at: Time.now }
+ attributes[:status] = :successful if status == :running
+ update attributes
end
def prepare_new
@@ -43,6 +60,13 @@ class Merge < ActiveRecord::Base
workbench.output.referentials.new attributes
end
+ new.referential_suite = output
+ new.organisation = workbench.organisation
+
+ unless new.valid?
+ Rails.logger.error "New referential isn't valid : #{new.errors.inspect}"
+ end
+
new.save!
output.update new: new
diff --git a/app/models/workbench.rb b/app/models/workbench.rb
index e36589210..3c522ce82 100644
--- a/app/models/workbench.rb
+++ b/app/models/workbench.rb
@@ -14,6 +14,7 @@ class Workbench < ActiveRecord::Base
has_many :workbench_imports
has_many :compliance_check_sets
has_many :compliance_control_sets
+ has_many :merges
validates :name, presence: true
validates :organisation, presence: true
diff --git a/app/policies/merge_policy.rb b/app/policies/merge_policy.rb
new file mode 100644
index 000000000..82eb72e08
--- /dev/null
+++ b/app/policies/merge_policy.rb
@@ -0,0 +1,15 @@
+class MergePolicy < ApplicationPolicy
+ class Scope < Scope
+ def resolve
+ scope
+ end
+ end
+
+ def create?
+ user.has_permission?('merges.create')
+ end
+
+ def update?
+ user.has_permission?('merges.update')
+ end
+end
diff --git a/app/views/merges/_form.html.slim b/app/views/merges/_form.html.slim
new file mode 100644
index 000000000..ff85ad76b
--- /dev/null
+++ b/app/views/merges/_form.html.slim
@@ -0,0 +1,7 @@
+= simple_form_for merge, as: :merge, url: workbench_merges_path(workbench), html: {class: 'form-horizontal', id: 'wb_merge_form'}, wrapper: :horizontal_form do |form|
+
+ .row
+ .col-lg-12
+ = form.input :referentials, :collection => @mergeable_referentials, include_blank: false, input_html: { multiple: true, 'data-select2ed': true }
+
+ = form.button :submit, t('actions.submit'), class: 'btn btn-default formSubmitr', form: 'wb_merge_form'
diff --git a/app/views/merges/new.html.slim b/app/views/merges/new.html.slim
new file mode 100644
index 000000000..dab4bdf4e
--- /dev/null
+++ b/app/views/merges/new.html.slim
@@ -0,0 +1,7 @@
+- breadcrumb :merges, @workbench
+
+.page_content
+ .container-fluid
+ .row
+ .col-lg-8.col-lg-offset-2.col-md-8.col-md-offset-2.col-sm-10.col-sm-offset-1
+ = render 'form', merge: @merge, workbench: @workbench
diff --git a/app/views/merges/show.html.slim b/app/views/merges/show.html.slim
new file mode 100644
index 000000000..579995ebf
--- /dev/null
+++ b/app/views/merges/show.html.slim
@@ -0,0 +1,13 @@
+- breadcrumb :merge, @merge
+- page_header_content_for @merge
+
+.page_content
+ .container-fluid
+ .row
+ .col-lg-6.col-md-6.col-sm-12.col-xs-12
+ = definition_list t('metadatas'),
+ { @merge.class.human_attribute_name(:referentials) => @merge.referentials.map(&:name).join(', '),
+ @merge.class.human_attribute_name(:status) => @merge.status,
+ @merge.class.human_attribute_name(:created_at) => @merge.created_at,
+ @merge.class.human_attribute_name(:started_at) => @merge.started_at,
+ @merge.class.human_attribute_name(:ended_at) => @merge.ended_at }
diff --git a/app/views/workbench_outputs/show.html.slim b/app/views/workbench_outputs/show.html.slim
index ad42e476d..a4fd119f8 100644
--- a/app/views/workbench_outputs/show.html.slim
+++ b/app/views/workbench_outputs/show.html.slim
@@ -1,5 +1,32 @@
+/ PageHeader
+
- breadcrumb :workbench_output, @workbench
-- page_header_content_for @workbench
+- content_for :page_header_title, t('.title')
+- content_for :page_header_content do
+ .row.mb-sm
+ .col-lg-12.text-right
+ = link_to t('merges.actions.create'), new_workbench_merge_path(@workbench), class: 'btn btn-primary'
.page_content
.container-fluid
+ .row
+ .col-lg-12
+ = table_builder_2 @workbench_merges,
+ [ \
+ TableBuilderHelper::Column.new( \
+ key: :status, \
+ attribute: Proc.new { |n| import_status(n.status) }, \
+ ), \
+ TableBuilderHelper::Column.new( \
+ key: :started_at, \
+ attribute: Proc.new { |n| l(n.started_at, format: :long) if n.started_at }, \
+ ), \
+ TableBuilderHelper::Column.new( \
+ key: :creator, \
+ attribute: 'creator' \
+ ) \
+ ],
+ links: [],
+ cls: 'table has-search'
+
+ = new_pagination @workbench_merges, 'pull-right'
diff --git a/app/views/workbenches/show.html.slim b/app/views/workbenches/show.html.slim
index 1c82c34b7..fe0b05330 100644
--- a/app/views/workbenches/show.html.slim
+++ b/app/views/workbenches/show.html.slim
@@ -6,6 +6,7 @@
- if policy(Referential).create?
= link_to t('actions.import'), workbench_imports_path(@workbench), class: 'btn btn-primary'
= link_to t('actions.add'), new_referential_path(workbench_id: @workbench), class: 'btn btn-primary'
+ = link_to t('workbenches.actions.show_output'), workbench_output_path(@workbench), class: 'btn btn-primary'
.page_content
.container-fluid
diff --git a/app/workers/merge_worker.rb b/app/workers/merge_worker.rb
new file mode 100644
index 000000000..8a085a25a
--- /dev/null
+++ b/app/workers/merge_worker.rb
@@ -0,0 +1,7 @@
+class MergeWorker
+ include Sidekiq::Worker
+
+ def perform(id)
+ Merge.find(id).merge!
+ end
+end
diff --git a/config/breadcrumbs.rb b/config/breadcrumbs.rb
index e255cc91b..ce5cf5b0f 100644
--- a/config/breadcrumbs.rb
+++ b/config/breadcrumbs.rb
@@ -11,6 +11,16 @@ crumb :workbench_output do |workbench|
parent :workbench, current_offer_workbench
end
+crumb :merges do |workbench|
+ link I18n.t('merges.index.title'), workbench_output_path(workbench)
+ parent :workbench, workbench
+end
+
+crumb :merge do |merge|
+ link breadcrumb_name(merge), workbench_merge_path(merge.workbench, merge)
+ parent :merges, merge.workbench
+end
+
crumb :referential do |referential|
link breadcrumb_name(referential), referential_path(referential)
parent :workbench, current_offer_workbench
diff --git a/config/locales/merges.yml b/config/locales/merges.yml
new file mode 100644
index 000000000..1e2df2459
--- /dev/null
+++ b/config/locales/merges.yml
@@ -0,0 +1,17 @@
+fr:
+ merges:
+ index:
+ title: "Finalisations de l'offre"
+ new:
+ title: "Nouvelle finalisation de l'offre"
+ activerecord:
+ models:
+ merge: "Finalisation de l'offre"
+ attributes:
+ merge:
+ created_at: "Créé le"
+ started_at: Démarrage
+ ended_at: Achevé à
+ status: "Etat"
+ creator: "Opérateur"
+ referentials: "Jeux de données"
diff --git a/config/locales/workbenches.fr.yml b/config/locales/workbenches.fr.yml
index d76255e86..eff53c2d6 100644
--- a/config/locales/workbenches.fr.yml
+++ b/config/locales/workbenches.fr.yml
@@ -6,6 +6,11 @@ fr:
zero: "Aucun jeu de données dans cet espace de travail"
one: "1 jeu de données dans cet espace de travail"
other: "#{count} jeux de données dans cet espace de travail"
+ actions:
+ show_output: "Offre finalisée"
+ workbench_outputs:
+ show:
+ title: "Finalisations de l'offre"
activerecord:
models:
workbench:
diff --git a/config/routes.rb b/config/routes.rb
index bab1a0aac..8b5faff03 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -17,6 +17,7 @@ ChouetteIhm::Application.routes.draw do
end
resource :output, controller: :workbench_outputs
+ resources :merges
end
devise_for :users, :controllers => {
diff --git a/lib/stif/permission_translator.rb b/lib/stif/permission_translator.rb
index 4acf42884..9e0feb9b8 100644
--- a/lib/stif/permission_translator.rb
+++ b/lib/stif/permission_translator.rb
@@ -21,6 +21,7 @@ module Stif
calendars
footnotes
imports
+ merges
journey_patterns
referentials
routes