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 | 
