diff options
| author | Alban Peignier | 2017-12-18 10:46:28 +0100 |
|---|---|---|
| committer | Alban Peignier | 2018-01-05 10:23:29 +0100 |
| commit | 7d15657860db6d1836c863180ee84524a5bdeb61 (patch) | |
| tree | d23d7852310116dd01721ccf77c88830d2fc12f7 | |
| parent | f9b00154721731511b76b20d1d7211de963811bc (diff) | |
| download | chouette-core-7d15657860db6d1836c863180ee84524a5bdeb61.tar.bz2 | |
Create first merge interface. Refs #5299
| -rw-r--r-- | app/controllers/merges_controller.rb | 34 | ||||
| -rw-r--r-- | app/controllers/workbench_outputs_controller.rb | 1 | ||||
| -rw-r--r-- | app/models/merge.rb | 28 | ||||
| -rw-r--r-- | app/models/workbench.rb | 1 | ||||
| -rw-r--r-- | app/policies/merge_policy.rb | 15 | ||||
| -rw-r--r-- | app/views/merges/_form.html.slim | 7 | ||||
| -rw-r--r-- | app/views/merges/new.html.slim | 7 | ||||
| -rw-r--r-- | app/views/merges/show.html.slim | 13 | ||||
| -rw-r--r-- | app/views/workbench_outputs/show.html.slim | 29 | ||||
| -rw-r--r-- | app/views/workbenches/show.html.slim | 1 | ||||
| -rw-r--r-- | app/workers/merge_worker.rb | 7 | ||||
| -rw-r--r-- | config/breadcrumbs.rb | 10 | ||||
| -rw-r--r-- | config/locales/merges.yml | 17 | ||||
| -rw-r--r-- | config/locales/workbenches.fr.yml | 5 | ||||
| -rw-r--r-- | config/routes.rb | 1 | ||||
| -rw-r--r-- | lib/stif/permission_translator.rb | 1 |
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 |
